aboutsummaryrefslogtreecommitdiff
path: root/lib/dokuwiki/inc/lang/uk/lang.php
diff options
context:
space:
mode:
authorsembrestels <sembrestels@riseup.net>2011-10-13 05:04:13 +0200
committersembrestels <sembrestels@riseup.net>2011-10-13 05:04:13 +0200
commita1d02e6f366423ccd1914182807a60b92d240c5b (patch)
treec575620760302e9f5cb8b70e9819a99d8b43a4a4 /lib/dokuwiki/inc/lang/uk/lang.php
parentb022f5df563d9b0f09618d0f70cad09ac3f1143d (diff)
downloadelgg-a1d02e6f366423ccd1914182807a60b92d240c5b.tar.gz
elgg-a1d02e6f366423ccd1914182807a60b92d240c5b.tar.bz2
Init function reordered.
Diffstat (limited to 'lib/dokuwiki/inc/lang/uk/lang.php')
0 files changed, 0 insertions, 0 deletions
h: 0.0%;'/> -rw-r--r--ChangeLog39510
-rw-r--r--INSTALL.txt113
-rw-r--r--LICENSE.txt280
-rw-r--r--README.md28
-rw-r--r--UPGRADE.txt71
-rw-r--r--_graphics/SPRITES_LICENSE.TXT9
-rw-r--r--_graphics/admin_sprites.pngbin0 -> 2255 bytes-rw-r--r--_graphics/ajax_loader.gifbin0 -> 2608 bytes-rw-r--r--_graphics/ajax_loader_bw.gifbin0 -> 2608 bytes-rw-r--r--_graphics/button_background.gifbin0 -> 786 bytes-rw-r--r--_graphics/button_graduation.pngbin0 -> 384 bytes-rw-r--r--_graphics/elgg_logo.pngbin0 -> 11481 bytes-rw-r--r--_graphics/elgg_sprites.pngbin0 -> 19302 bytes-rw-r--r--_graphics/elgg_toolbar_logo.gifbin0 -> 1525 bytes-rw-r--r--_graphics/favicon.icobin0 -> 1150 bytes-rw-r--r--_graphics/friendspicker.pngbin0 -> 4853 bytes-rw-r--r--_graphics/header_shadow.pngbin0 -> 154 bytes-rw-r--r--_graphics/icons/default/large.pngbin0 -> 2706 bytes-rw-r--r--_graphics/icons/default/medium.pngbin0 -> 1676 bytes-rw-r--r--_graphics/icons/default/small.pngbin0 -> 752 bytes-rw-r--r--_graphics/icons/default/tiny.pngbin0 -> 554 bytes-rw-r--r--_graphics/icons/default/topbar.pngbin0 -> 313 bytes-rw-r--r--_graphics/icons/user/defaultlarge.gifbin0 -> 2924 bytes-rw-r--r--_graphics/icons/user/defaultmaster.gifbin0 -> 43 bytes-rw-r--r--_graphics/icons/user/defaultmedium.gifbin0 -> 2855 bytes-rw-r--r--_graphics/icons/user/defaultsmall.gifbin0 -> 1027 bytes-rw-r--r--_graphics/icons/user/defaulttiny.gifbin0 -> 745 bytes-rw-r--r--_graphics/icons/user/defaulttopbar.gifbin0 -> 599 bytes-rw-r--r--_graphics/powered_by_elgg_badge_drk_bckgnd.gifbin0 -> 947 bytes-rw-r--r--_graphics/powered_by_elgg_badge_light_bckgnd.gifbin0 -> 740 bytes-rw-r--r--_graphics/sidebar_background.gifbin0 -> 1354 bytes-rw-r--r--_graphics/spacer.gifbin0 -> 43 bytes-rw-r--r--_graphics/toptoolbar_background.gifbin0 -> 2028 bytes-rw-r--r--_graphics/two_sidebar_background.gifbin0 -> 85 bytes-rw-r--r--_graphics/walled_garden/one_column_bottom.pngbin0 -> 1336 bytes-rw-r--r--_graphics/walled_garden/one_column_middle.pngbin0 -> 226 bytes-rw-r--r--_graphics/walled_garden/one_column_top.pngbin0 -> 1345 bytes-rw-r--r--_graphics/walled_garden/two_column_bottom.pngbin0 -> 1353 bytes-rw-r--r--_graphics/walled_garden/two_column_middle.pngbin0 -> 231 bytes-rw-r--r--_graphics/walled_garden/two_column_top.pngbin0 -> 1366 bytes-rw-r--r--actions/admin/delete_admin_notice.php13
-rw-r--r--actions/admin/menu/save.php34
-rw-r--r--actions/admin/plugins/activate.php59
-rw-r--r--actions/admin/plugins/activate_all.php33
-rw-r--r--actions/admin/plugins/deactivate.php53
-rw-r--r--actions/admin/plugins/deactivate_all.php33
-rw-r--r--actions/admin/plugins/set_priority.php39
-rw-r--r--actions/admin/site/flush_cache.php10
-rw-r--r--actions/admin/site/regenerate_secret.php11
-rw-r--r--actions/admin/site/unlock_upgrade.php10
-rw-r--r--actions/admin/site/update_advanced.php98
-rw-r--r--actions/admin/site/update_basic.php27
-rw-r--r--actions/admin/user/ban.php30
-rw-r--r--actions/admin/user/delete.php40
-rw-r--r--actions/admin/user/makeadmin.php27
-rw-r--r--actions/admin/user/removeadmin.php27
-rw-r--r--actions/admin/user/resetpassword.php43
-rw-r--r--actions/admin/user/unban.php27
-rw-r--r--actions/avatar/crop.php72
-rw-r--r--actions/avatar/remove.php36
-rw-r--r--actions/avatar/upload.php62
-rw-r--r--actions/comments/add.php62
-rw-r--r--actions/comments/delete.php18
-rw-r--r--actions/entities/delete.php22
-rw-r--r--actions/friends/add.php35
-rw-r--r--actions/friends/collections/add.php31
-rw-r--r--actions/friends/collections/delete.php23
-rw-r--r--actions/friends/collections/edit.php23
-rw-r--r--actions/friends/remove.php32
-rw-r--r--actions/import/opendd.php22
-rw-r--r--actions/login.php69
-rw-r--r--actions/logout.php18
-rw-r--r--actions/notifications/settings/usersettings/save.php29
-rw-r--r--actions/plugins/settings/save.php43
-rw-r--r--actions/plugins/usersettings/save.php58
-rw-r--r--actions/profile/edit.php116
-rw-r--r--actions/profile/fields/add.php40
-rw-r--r--actions/profile/fields/delete.php28
-rw-r--r--actions/profile/fields/edit.php20
-rw-r--r--actions/profile/fields/reorder.php12
-rw-r--r--actions/profile/fields/reset.php20
-rw-r--r--actions/register.php80
-rw-r--r--actions/river/delete.php21
-rw-r--r--actions/security/refreshtoken.php5
-rw-r--r--actions/user/passwordreset.php19
-rw-r--r--actions/user/requestnewpassword.php27
-rw-r--r--actions/user/spotlight.php19
-rw-r--r--actions/useradd.php69
-rw-r--r--actions/usersettings/save.php11
-rw-r--r--actions/widgets/add.php42
-rw-r--r--actions/widgets/delete.php20
-rw-r--r--actions/widgets/move.php24
-rw-r--r--actions/widgets/reorder.php24
-rw-r--r--actions/widgets/save.php44
-rw-r--r--actions/widgets/upgrade.php65
-rw-r--r--documentation/coding_standards/best_practices.txt60
-rw-r--r--documentation/coding_standards/css_coding_standards.txt67
-rw-r--r--documentation/coding_standards/deprecation.txt36
-rw-r--r--documentation/coding_standards/html_best_practices.txt1
-rw-r--r--documentation/coding_standards/javascript_best_practices.txt1
-rw-r--r--documentation/coding_standards/javascript_coding_standards.txt13
-rw-r--r--documentation/coding_standards/php_best_practices.txt1
-rw-r--r--documentation/coding_standards/php_coding_standards.txt55
-rw-r--r--documentation/examples/actions/basic.php22
-rw-r--r--documentation/examples/crontab.example28
-rw-r--r--documentation/examples/events/advanced.php13
-rw-r--r--documentation/examples/events/all.php30
-rw-r--r--documentation/examples/events/basic.php17
-rw-r--r--documentation/examples/events/trigger.php11
-rw-r--r--documentation/examples/hooks/advanced.php28
-rw-r--r--documentation/examples/hooks/all.php12
-rw-r--r--documentation/examples/hooks/basic.php17
-rw-r--r--documentation/examples/hooks/trigger.php14
-rw-r--r--documentation/examples/plugins/README.txt5
-rw-r--r--documentation/examples/plugins/actions/.gitignore0
-rw-r--r--documentation/examples/plugins/languages/en.php24
-rw-r--r--documentation/examples/plugins/manifest.xml18
-rw-r--r--documentation/examples/plugins/start.php22
-rw-r--r--documentation/examples/plugins/views/default/.gitignore0
-rw-r--r--documentation/info/config.php430
-rw-r--r--documentation/info/manifest.xml98
-rw-r--r--engine/classes/APIException.php11
-rw-r--r--engine/classes/CallException.php10
-rw-r--r--engine/classes/ClassException.php10
-rw-r--r--engine/classes/ClassNotFoundException.php10
-rw-r--r--engine/classes/ConfigurationException.php10
-rw-r--r--engine/classes/CronException.php10
-rw-r--r--engine/classes/DataFormatException.php9
-rw-r--r--engine/classes/DatabaseException.php10
-rw-r--r--engine/classes/ElggAccess.php70
-rw-r--r--engine/classes/ElggAnnotation.php133
-rw-r--r--engine/classes/ElggAttributeLoader.php248
-rw-r--r--engine/classes/ElggAutoP.php336
-rw-r--r--engine/classes/ElggBatch.php433
-rw-r--r--engine/classes/ElggCache.php247
-rw-r--r--engine/classes/ElggCrypto.php208
-rw-r--r--engine/classes/ElggData.php309
-rw-r--r--engine/classes/ElggDiskFilestore.php417
-rw-r--r--engine/classes/ElggEntity.php1770
-rw-r--r--engine/classes/ElggExtender.php214
-rw-r--r--engine/classes/ElggFile.php440
-rw-r--r--engine/classes/ElggFileCache.php230
-rw-r--r--engine/classes/ElggFilestore.php139
-rw-r--r--engine/classes/ElggGroup.php393
-rw-r--r--engine/classes/ElggGroupItemVisibility.php93
-rw-r--r--engine/classes/ElggHMACCache.php99
-rw-r--r--engine/classes/ElggLRUCache.php181
-rw-r--r--engine/classes/ElggMemcache.php203
-rw-r--r--engine/classes/ElggMenuBuilder.php291
-rw-r--r--engine/classes/ElggMenuItem.php590
-rw-r--r--engine/classes/ElggMetadata.php158
-rw-r--r--engine/classes/ElggObject.php216
-rw-r--r--engine/classes/ElggPAM.php105
-rw-r--r--engine/classes/ElggPlugin.php1006
-rw-r--r--engine/classes/ElggPluginManifest.php656
-rw-r--r--engine/classes/ElggPluginManifestParser.php102
-rw-r--r--engine/classes/ElggPluginManifestParser17.php82
-rw-r--r--engine/classes/ElggPluginManifestParser18.php97
-rw-r--r--engine/classes/ElggPluginPackage.php640
-rw-r--r--engine/classes/ElggPriorityList.php366
-rw-r--r--engine/classes/ElggRelationship.php231
-rw-r--r--engine/classes/ElggRiverItem.php115
-rw-r--r--engine/classes/ElggSession.php153
-rw-r--r--engine/classes/ElggSharedMemoryCache.php40
-rw-r--r--engine/classes/ElggSite.php455
-rw-r--r--engine/classes/ElggStaticVariableCache.php96
-rw-r--r--engine/classes/ElggTranslit.php269
-rw-r--r--engine/classes/ElggUser.php588
-rw-r--r--engine/classes/ElggVolatileMetadataCache.php355
-rw-r--r--engine/classes/ElggWidget.php245
-rw-r--r--engine/classes/ElggXMLElement.php131
-rw-r--r--engine/classes/ErrorResult.php54
-rw-r--r--engine/classes/ExportException.php9
-rw-r--r--engine/classes/Exportable.php23
-rw-r--r--engine/classes/Friendable.php104
-rw-r--r--engine/classes/GenericResult.php125
-rw-r--r--engine/classes/IOException.php9
-rw-r--r--engine/classes/ImportException.php8
-rw-r--r--engine/classes/Importable.php19
-rw-r--r--engine/classes/IncompleteEntityException.php10
-rw-r--r--engine/classes/InstallationException.php9
-rw-r--r--engine/classes/InvalidClassException.php9
-rw-r--r--engine/classes/InvalidParameterException.php9
-rw-r--r--engine/classes/Locatable.php49
-rw-r--r--engine/classes/Loggable.php65
-rw-r--r--engine/classes/LoginException.php10
-rw-r--r--engine/classes/NotImplementedException.php10
-rw-r--r--engine/classes/Notable.php41
-rw-r--r--engine/classes/NotificationException.php8
-rw-r--r--engine/classes/ODD.php131
-rw-r--r--engine/classes/ODDDocument.php202
-rw-r--r--engine/classes/ODDEntity.php34
-rw-r--r--engine/classes/ODDMetaData.php39
-rw-r--r--engine/classes/ODDRelationship.php33
-rw-r--r--engine/classes/PluginException.php11
-rw-r--r--engine/classes/RegistrationException.php9
-rw-r--r--engine/classes/SecurityException.php10
-rw-r--r--engine/classes/SuccessResult.php34
-rw-r--r--engine/classes/XMLRPCArrayParameter.php56
-rw-r--r--engine/classes/XMLRPCBase64Parameter.php28
-rw-r--r--engine/classes/XMLRPCBoolParameter.php30
-rw-r--r--engine/classes/XMLRPCCall.php62
-rw-r--r--engine/classes/XMLRPCDateParameter.php33
-rw-r--r--engine/classes/XMLRPCDoubleParameter.php29
-rw-r--r--engine/classes/XMLRPCErrorResponse.php36
-rw-r--r--engine/classes/XMLRPCIntParameter.php29
-rw-r--r--engine/classes/XMLRPCParameter.php16
-rw-r--r--engine/classes/XMLRPCResponse.php71
-rw-r--r--engine/classes/XMLRPCStringParameter.php30
-rw-r--r--engine/classes/XMLRPCStructParameter.php55
-rw-r--r--engine/classes/XMLRPCSuccessResponse.php22
-rw-r--r--engine/classes/XmlElement.php20
-rw-r--r--engine/handlers/action_handler.php20
-rw-r--r--engine/handlers/cache_handler.php105
-rw-r--r--engine/handlers/export_handler.php118
-rw-r--r--engine/handlers/page_handler.php48
-rw-r--r--engine/handlers/service_handler.php27
-rw-r--r--engine/handlers/xml-rpc_handler.php44
-rw-r--r--engine/lib/access.php1078
-rw-r--r--engine/lib/actions.php549
-rw-r--r--engine/lib/admin.php663
-rw-r--r--engine/lib/annotations.php618
-rw-r--r--engine/lib/cache.php453
-rw-r--r--engine/lib/calendar.php573
-rw-r--r--engine/lib/configuration.php632
-rw-r--r--engine/lib/cron.php89
-rw-r--r--engine/lib/database.php764
-rw-r--r--engine/lib/deprecated-1.7.php1164
-rw-r--r--engine/lib/deprecated-1.8.php4820
-rw-r--r--engine/lib/deprecated-1.9.php582
-rw-r--r--engine/lib/elgglib.php2304
-rw-r--r--engine/lib/entities.php2590
-rw-r--r--engine/lib/export.php223
-rw-r--r--engine/lib/extender.php249
-rw-r--r--engine/lib/filestore.php520
-rw-r--r--engine/lib/group.php341
-rw-r--r--engine/lib/input.php520
-rw-r--r--engine/lib/languages.php354
-rw-r--r--engine/lib/location.php157
-rw-r--r--engine/lib/mb_wrapper.php233
-rw-r--r--engine/lib/memcache.php57
-rw-r--r--engine/lib/metadata.php978
-rw-r--r--engine/lib/metastrings.php903
-rw-r--r--engine/lib/navigation.php527
-rw-r--r--engine/lib/notification.php536
-rw-r--r--engine/lib/objects.php120
-rw-r--r--engine/lib/opendd.php109
-rw-r--r--engine/lib/output.php469
-rw-r--r--engine/lib/pagehandler.php150
-rw-r--r--engine/lib/pageowner.php297
-rw-r--r--engine/lib/pam.php76
-rw-r--r--engine/lib/plugins.php1179
-rw-r--r--engine/lib/private_settings.php414
-rw-r--r--engine/lib/relationships.php643
-rw-r--r--engine/lib/river.php703
-rw-r--r--engine/lib/sessions.php656
-rw-r--r--engine/lib/sites.php256
-rw-r--r--engine/lib/statistics.php126
-rw-r--r--engine/lib/system_log.php311
-rw-r--r--engine/lib/tags.php354
-rw-r--r--engine/lib/upgrade.php365
-rw-r--r--engine/lib/upgrades/2008100701.php7
-rw-r--r--engine/lib/upgrades/2008101303.php9
-rw-r--r--engine/lib/upgrades/2009022701.php7
-rw-r--r--engine/lib/upgrades/2009041701.php8
-rw-r--r--engine/lib/upgrades/2009070101.php9
-rw-r--r--engine/lib/upgrades/2009102801.php222
-rw-r--r--engine/lib/upgrades/2010010501.php8
-rw-r--r--engine/lib/upgrades/2010033101.php70
-rw-r--r--engine/lib/upgrades/2010040201.php41
-rw-r--r--engine/lib/upgrades/2010052601.php27
-rw-r--r--engine/lib/upgrades/2010060101.php16
-rw-r--r--engine/lib/upgrades/2010060401.php59
-rw-r--r--engine/lib/upgrades/2010061501.php75
-rw-r--r--engine/lib/upgrades/2010062301.php33
-rw-r--r--engine/lib/upgrades/2010062302.php33
-rw-r--r--engine/lib/upgrades/2010070301.php9
-rw-r--r--engine/lib/upgrades/2010071001.php58
-rw-r--r--engine/lib/upgrades/2010071002.php50
-rw-r--r--engine/lib/upgrades/2010111501.php33
-rw-r--r--engine/lib/upgrades/2010121601.php9
-rw-r--r--engine/lib/upgrades/2010121602.php10
-rw-r--r--engine/lib/upgrades/2010121701.php10
-rw-r--r--engine/lib/upgrades/2010123101.php9
-rw-r--r--engine/lib/upgrades/2011010101.php98
-rw-r--r--engine/lib/upgrades/2011021800-1.8_svn-goodbye_walled_garden-083121a656d06894.php34
-rw-r--r--engine/lib/upgrades/2011022000-1.8_svn-custom_profile_fields-390ac967b0bb5665.php59
-rw-r--r--engine/lib/upgrades/2011030700-1.8_svn-blog_status_metadata-4645225d7b440876.php24
-rw-r--r--engine/lib/upgrades/2011031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php54
-rw-r--r--engine/lib/upgrades/2011031600-1.8_svn-datalist_grows_up-0b8aec5a55cc1e1c.php18
-rw-r--r--engine/lib/upgrades/2011032000-1.8_svn-widgets_arent_plugins-61836261fa280a5c.php10
-rw-r--r--engine/lib/upgrades/2011032200-1.8_svn-admins_like_widgets-7f19d2783c1680d3.php13
-rw-r--r--engine/lib/upgrades/2011052801.php46
-rw-r--r--engine/lib/upgrades/2011061200-1.8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php31
-rw-r--r--engine/lib/upgrades/2011092500-1.8.0.1-forum_reply_river_view-5758ce8d86ac56ce.php12
-rw-r--r--engine/lib/upgrades/2011123100-1.8.2-fix_friend_river-b17e7ff8345c2269.php12
-rw-r--r--engine/lib/upgrades/2011123101-1.8.2-fix_blog_status-b14c2a0e7b9e7d55.php25
-rw-r--r--engine/lib/upgrades/2012012000-1.8.3-ip_in_syslog-87fe0f068cf62428.php12
-rw-r--r--engine/lib/upgrades/2012012100-1.8.3-system_cache-93100e7d55a24a11.php13
-rw-r--r--engine/lib/upgrades/2012041800-1.8.3-dont_filter_passwords-c0ca4a18b38ae2bc.php11
-rw-r--r--engine/lib/upgrades/2012041801-1.8.3-multiple_user_tokens-852225f7fd89f6c5.php13
-rw-r--r--engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php24
-rw-r--r--engine/lib/upgrades/2013051700-1.8.15-add_missing_group_index-52a63a3a3ffaced2.php28
-rw-r--r--engine/lib/upgrades/2013052900-1.8.15-ipv6_in_syslog-f5c2cc0196e9e731.php12
-rw-r--r--engine/lib/upgrades/2013060900-1.8.15-site_secret-404fc165cf9e0ac9.php16
-rw-r--r--engine/lib/upgrades/create_upgrade.php152
-rw-r--r--engine/lib/user_settings.php360
-rw-r--r--engine/lib/users.php1611
-rw-r--r--engine/lib/views.php1665
-rw-r--r--engine/lib/web_services.php1454
-rw-r--r--engine/lib/widgets.php420
-rw-r--r--engine/lib/xml-rpc.php203
-rw-r--r--engine/lib/xml.php111
-rw-r--r--engine/schema/mysql.sql454
-rw-r--r--engine/schema/upgrades/2008092301.sql100
-rw-r--r--engine/schema/upgrades/2008100601.sql14
-rw-r--r--engine/schema/upgrades/2008101601.sql11
-rw-r--r--engine/schema/upgrades/2008101701.sql7
-rw-r--r--engine/schema/upgrades/2008102101.sql9
-rw-r--r--engine/schema/upgrades/2008110301.sql17
-rw-r--r--engine/schema/upgrades/2008110601.sql3
-rw-r--r--engine/schema/upgrades/2008111901.sql8
-rw-r--r--engine/schema/upgrades/2008112001.sql24
-rw-r--r--engine/schema/upgrades/2008112002.sql29
-rw-r--r--engine/schema/upgrades/2008112501.sql10
-rw-r--r--engine/schema/upgrades/2008112601.sql27
-rw-r--r--engine/schema/upgrades/2008120501.sql9
-rw-r--r--engine/schema/upgrades/2009010801.sql5
-rw-r--r--engine/schema/upgrades/2009010901.sql3
-rw-r--r--engine/schema/upgrades/2009021201.sql19
-rw-r--r--engine/schema/upgrades/2009021301.sql2
-rw-r--r--engine/schema/upgrades/2009051401.sql5
-rw-r--r--engine/schema/upgrades/2009052201.sql5
-rw-r--r--engine/schema/upgrades/2009091901.sql3
-rw-r--r--engine/schema/upgrades/2009100701.sql2
-rw-r--r--engine/schema/upgrades/2010012901.sql1
-rw-r--r--engine/schema/upgrades/2010030101.sql1
-rw-r--r--engine/schema/upgrades/2010062401.sql1
-rw-r--r--engine/settings.example.php123
-rw-r--r--engine/start.php121
-rw-r--r--engine/tests/api/access_collections.php290
-rw-r--r--engine/tests/api/annotations.php150
-rw-r--r--engine/tests/api/entity_getter_functions.php2884
-rw-r--r--engine/tests/api/helpers.php705
-rw-r--r--engine/tests/api/metadata.php230
-rw-r--r--engine/tests/api/metadata_cache.php176
-rw-r--r--engine/tests/api/metastrings.php217
-rw-r--r--engine/tests/api/output.php74
-rw-r--r--engine/tests/api/plugins.php299
-rw-r--r--engine/tests/api/river.php21
-rw-r--r--engine/tests/elgg_unit_test.php29
-rw-r--r--engine/tests/objects/entities.php423
-rw-r--r--engine/tests/objects/filestore.php100
-rw-r--r--engine/tests/objects/objects.php306
-rw-r--r--engine/tests/objects/sites.php77
-rw-r--r--engine/tests/objects/users.php250
-rw-r--r--engine/tests/regression/trac_bugs.php405
-rw-r--r--engine/tests/services/api.php324
-rw-r--r--engine/tests/suite.php53
-rw-r--r--engine/tests/test_files/output/autop/block-a.exp.norun.html6
-rw-r--r--engine/tests/test_files/output/autop/block-a.in.norun.html9
-rw-r--r--engine/tests/test_files/output/autop/domdoc_exp.html46
-rw-r--r--engine/tests/test_files/output/autop/domdoc_in.html80
-rw-r--r--engine/tests/test_files/output/autop/typical-post.exp.html84
-rw-r--r--engine/tests/test_files/output/autop/typical-post.in.html89
-rw-r--r--engine/tests/test_files/output/autop/wp-welcome.exp.html22
-rw-r--r--engine/tests/test_files/output/autop/wp-welcome.in.html25
-rw-r--r--engine/tests/test_files/output/autop/wpautop-fails.exp.html31
-rw-r--r--engine/tests/test_files/output/autop/wpautop-fails.in.html41
-rw-r--r--engine/tests/test_files/output/autop/wysiwyg-test.exp.html51
-rw-r--r--engine/tests/test_files/output/autop/wysiwyg-test.in.html79
-rw-r--r--engine/tests/test_files/plugin_17/manifest.xml10
-rw-r--r--engine/tests/test_files/plugin_17/start.php0
-rw-r--r--engine/tests/test_files/plugin_18/manifest.xml108
-rw-r--r--engine/tests/test_files/plugin_18/start.php0
-rw-r--r--engine/tests/test_files/xxe/external_entity.txt1
-rw-r--r--engine/tests/test_files/xxe/request.xml8
-rw-r--r--engine/tests/test_skeleton.php55
-rw-r--r--gpl-plugins20
-rw-r--r--htaccess_dist155
-rw-r--r--index.php36
-rw-r--r--install.php20
-rw-r--r--install/ElggInstaller.php1575
-rw-r--r--install/ElggRewriteTester.php199
-rw-r--r--install/cli/sample_installer.php67
-rw-r--r--install/css/install.css295
-rw-r--r--install/js/install.js42
-rw-r--r--install/languages/en.php161
-rw-r--r--js/classes/ElggEntity.js20
-rw-r--r--js/classes/ElggPriorityList.js92
-rw-r--r--js/classes/ElggUser.js28
-rw-r--r--js/lib/ajax.js242
-rw-r--r--js/lib/configuration.js10
-rw-r--r--js/lib/elgglib.js563
-rw-r--r--js/lib/hooks.js173
-rw-r--r--js/lib/languages.js96
-rw-r--r--js/lib/pageowner.js18
-rw-r--r--js/lib/prototypes.js66
-rw-r--r--js/lib/security.js107
-rw-r--r--js/lib/session.js123
-rw-r--r--js/lib/ui.autocomplete.js14
-rw-r--r--js/lib/ui.avatar_cropper.js76
-rw-r--r--js/lib/ui.friends_picker.js91
-rw-r--r--js/lib/ui.js293
-rw-r--r--js/lib/ui.river.js14
-rw-r--r--js/lib/ui.userpicker.js117
-rw-r--r--js/lib/ui.widgets.js209
-rw-r--r--js/tests/ElggAjaxOptionsTest.js61
-rw-r--r--js/tests/ElggAjaxTest.js59
-rw-r--r--js/tests/ElggHooksTest.js28
-rw-r--r--js/tests/ElggLanguagesTest.js45
-rw-r--r--js/tests/ElggLibTest.js140
-rw-r--r--js/tests/ElggPriorityListTest.js47
-rw-r--r--js/tests/ElggSecurityTest.js75
-rw-r--r--js/tests/ElggSessionTest.js36
-rw-r--r--js/tests/README25
-rw-r--r--js/tests/jsTestDriver.conf10
-rw-r--r--languages/en.php1567
-rw-r--r--mod/autosubscribegroup/LICENCE.txt280
-rw-r--r--mod/autosubscribegroup/Readme.txt40
-rw-r--r--mod/autosubscribegroup/languages/en.php23
-rw-r--r--mod/autosubscribegroup/manifest.xml15
-rw-r--r--mod/autosubscribegroup/start.php57
-rw-r--r--mod/autosubscribegroup/views/default/plugins/autosubscribegroup/settings.php24
-rw-r--r--mod/basic_theme/graphics/elgg_sprites.pngbin0 -> 19372 bytes-rw-r--r--mod/basic_theme/manifest.xml54
-rw-r--r--mod/basic_theme/start.php14
-rw-r--r--mod/basic_theme/views/default/css/admin.php1443
-rw-r--r--mod/basic_theme/views/default/css/elements/OOCSS_LICENSE30
-rw-r--r--mod/basic_theme/views/default/css/elements/buttons.php156
-rw-r--r--mod/basic_theme/views/default/css/elements/components.php286
-rw-r--r--mod/basic_theme/views/default/css/elements/core.php117
-rw-r--r--mod/basic_theme/views/default/css/elements/forms.php370
-rw-r--r--mod/basic_theme/views/default/css/elements/grid.php54
-rw-r--r--mod/basic_theme/views/default/css/elements/helpers.php144
-rw-r--r--mod/basic_theme/views/default/css/elements/icons.php348
-rw-r--r--mod/basic_theme/views/default/css/elements/layout.php121
-rw-r--r--mod/basic_theme/views/default/css/elements/misc.php62
-rw-r--r--mod/basic_theme/views/default/css/elements/modules.php194
-rw-r--r--mod/basic_theme/views/default/css/elements/navigation.php559
-rw-r--r--mod/basic_theme/views/default/css/elements/reset.php79
-rw-r--r--mod/basic_theme/views/default/css/elements/typography.php161
-rw-r--r--mod/basic_theme/views/default/css/elgg.php68
-rw-r--r--mod/basic_theme/views/default/css/ie.php8
-rw-r--r--mod/basic_theme/views/default/css/ie6.php12
-rw-r--r--mod/basic_theme/views/default/css/ie7.php65
-rw-r--r--mod/basic_theme/views/default/css/lightbox.php371
-rw-r--r--mod/basic_theme/views/default/css/walled_garden.php81
-rw-r--r--mod/beechat/README23
-rw-r--r--mod/beechat/actions/get_connection.php21
-rw-r--r--mod/beechat/actions/get_details.php21
-rw-r--r--mod/beechat/actions/get_icons.php52
-rw-r--r--mod/beechat/actions/get_state.php21
-rw-r--r--mod/beechat/actions/get_statuses.php41
-rw-r--r--mod/beechat/actions/join_groupchat.php15
-rw-r--r--mod/beechat/actions/leave_groupchat.php12
-rw-r--r--mod/beechat/actions/save_state.php29
-rw-r--r--mod/beechat/classes/BeechatSync.php37
-rw-r--r--mod/beechat/disablechat.php8
-rw-r--r--mod/beechat/enablechat.php8
-rw-r--r--mod/beechat/graphics/icons/bullet_arrow_down.pngbin0 -> 201 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_arrow_up.pngbin0 -> 201 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_black.pngbin0 -> 211 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_blue.pngbin0 -> 289 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_delete.pngbin0 -> 308 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_error.pngbin0 -> 454 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_green.pngbin0 -> 295 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_orange.pngbin0 -> 283 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_pink.pngbin0 -> 286 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_purple.pngbin0 -> 294 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_red.pngbin0 -> 287 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_star.pngbin0 -> 331 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_white.pngbin0 -> 201 bytes-rw-r--r--mod/beechat/graphics/icons/bullet_yellow.pngbin0 -> 287 bytes-rw-r--r--mod/beechat/graphics/icons/chat_icon.pngbin0 -> 456 bytes-rw-r--r--mod/beechat/graphics/icons/cog_edit.pngbin0 -> 865 bytes-rw-r--r--mod/beechat/graphics/icons/comment_edit.pngbin0 -> 644 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_evilgrin.pngbin0 -> 727 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_grin.pngbin0 -> 714 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_happy.pngbin0 -> 731 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_smile.pngbin0 -> 725 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_surprised.pngbin0 -> 741 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_tongue.pngbin0 -> 727 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_unhappy.pngbin0 -> 723 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_waii.pngbin0 -> 737 bytes-rw-r--r--mod/beechat/graphics/icons/emoticon_wink.pngbin0 -> 712 bytes-rw-r--r--mod/beechat/graphics/icons/heart.pngbin0 -> 749 bytes-rw-r--r--mod/beechat/graphics/icons/house.pngbin0 -> 806 bytes-rw-r--r--mod/beechat/graphics/icons/muc_icon.pngbin0 -> 592 bytes-rw-r--r--mod/beechat/graphics/icons/notification_pink.pngbin0 -> 3140 bytes-rw-r--r--mod/beechat/graphics/icons/pointer.pngbin0 -> 2833 bytes-rw-r--r--mod/beechat/graphics/icons/resultset_next.pngbin0 -> 395 bytes-rw-r--r--mod/beechat/graphics/icons/resultset_previous.pngbin0 -> 389 bytes-rw-r--r--mod/beechat/graphics/icons/statuses.pngbin0 -> 5857 bytes-rw-r--r--mod/beechat/graphics/icons/vcard.pngbin0 -> 533 bytes-rw-r--r--mod/beechat/languages/en.php45
-rw-r--r--mod/beechat/languages/es.php43
-rw-r--r--mod/beechat/languages/fr.php32
-rw-r--r--mod/beechat/lib/beechat.php250
-rw-r--r--mod/beechat/manifest.xml15
-rw-r--r--mod/beechat/migrate.php88
-rw-r--r--mod/beechat/migrategroups.php18
-rw-r--r--mod/beechat/sounds/newmessage.wavbin0 -> 39440 bytes-rw-r--r--mod/beechat/start.php184
-rw-r--r--mod/beechat/views/default/beechat/beechat.js.php2498
-rw-r--r--mod/beechat/views/default/beechat/beechat.php84
-rw-r--r--mod/beechat/views/default/beechat/beechat.userjs.php54
-rw-r--r--mod/beechat/views/default/beechat/screen.css.php672
-rw-r--r--mod/beechat/views/default/js/b64.js.php74
-rw-r--r--mod/beechat/views/default/js/jquery.cookie.min.js.php10
-rw-r--r--mod/beechat/views/default/js/jquery.localscroll-1.2.7-min.js.php9
-rwxr-xr-xmod/beechat/views/default/js/jquery.scrollTo-min.js.php11
-rwxr-xr-xmod/beechat/views/default/js/jquery.serialScroll-min.js.php10
-rw-r--r--mod/beechat/views/default/js/jquery.tools.min.js.php49
-rw-r--r--mod/beechat/views/default/js/json2.js.php476
-rw-r--r--mod/beechat/views/default/js/md5.js.php261
-rw-r--r--mod/beechat/views/default/js/sha1.js.php207
-rw-r--r--mod/beechat/views/default/js/strophe.min.js.php1
-rw-r--r--mod/beechat/views/default/js/strophe.muc.js300
-rw-r--r--mod/beechat/views/default/js/strophe.muc.js.php300
-rwxr-xr-xmod/beechat/views/default/settings/beechat/edit.php31
-rw-r--r--mod/blog/actions/blog/auto_save_revision.php89
-rw-r--r--mod/blog/actions/blog/delete.php27
-rw-r--r--mod/blog/actions/blog/save.php182
-rw-r--r--mod/blog/activate.php10
-rw-r--r--mod/blog/classes/ElggBlog.php42
-rw-r--r--mod/blog/deactivate.php6
-rw-r--r--mod/blog/languages/en.php78
-rw-r--r--mod/blog/lib/blog.php478
-rw-r--r--mod/blog/manifest.xml19
-rw-r--r--mod/blog/start.php302
-rw-r--r--mod/blog/views/default/blog/css.php14
-rw-r--r--mod/blog/views/default/blog/group_module.php46
-rw-r--r--mod/blog/views/default/blog/sidebar.php30
-rw-r--r--mod/blog/views/default/blog/sidebar/archives.php37
-rw-r--r--mod/blog/views/default/blog/sidebar/revisions.php79
-rw-r--r--mod/blog/views/default/forms/blog/save.php166
-rw-r--r--mod/blog/views/default/js/blog/save_draft.php67
-rw-r--r--mod/blog/views/default/object/blog.php99
-rw-r--r--mod/blog/views/default/river/object/blog/create.php15
-rw-r--r--mod/blog/views/default/widgets/blog/content.php30
-rw-r--r--mod/blog/views/default/widgets/blog/edit.php22
-rw-r--r--mod/bookmarks/actions/bookmarks/delete.php24
-rw-r--r--mod/bookmarks/actions/bookmarks/save.php90
-rw-r--r--mod/bookmarks/graphics/bookmark.gifbin0 -> 576 bytes-rw-r--r--mod/bookmarks/graphics/bookmarklet.gifbin0 -> 790 bytes-rw-r--r--mod/bookmarks/languages/en.php91
-rw-r--r--mod/bookmarks/lib/bookmarks.php46
-rw-r--r--mod/bookmarks/manifest.xml19
-rw-r--r--mod/bookmarks/pages/bookmarks/add.php22
-rw-r--r--mod/bookmarks/pages/bookmarks/all.php33
-rw-r--r--mod/bookmarks/pages/bookmarks/bookmarklet.php36
-rw-r--r--mod/bookmarks/pages/bookmarks/edit.php30
-rw-r--r--mod/bookmarks/pages/bookmarks/friends.php33
-rw-r--r--mod/bookmarks/pages/bookmarks/owner.php50
-rw-r--r--mod/bookmarks/pages/bookmarks/view.php38
-rw-r--r--mod/bookmarks/start.php316
-rw-r--r--mod/bookmarks/views/default/bookmarks/bookmarklet.php35
-rw-r--r--mod/bookmarks/views/default/bookmarks/css.php3
-rw-r--r--mod/bookmarks/views/default/bookmarks/group_module.php47
-rw-r--r--mod/bookmarks/views/default/bookmarks/js.php12
-rw-r--r--mod/bookmarks/views/default/bookmarks/sidebar.php14
-rw-r--r--mod/bookmarks/views/default/forms/bookmarks/save.php59
-rw-r--r--mod/bookmarks/views/default/object/bookmarks.php127
-rw-r--r--mod/bookmarks/views/default/river/object/bookmarks/create.php15
-rw-r--r--mod/bookmarks/views/default/widgets/bookmarks/content.php32
-rw-r--r--mod/bookmarks/views/default/widgets/bookmarks/edit.php24
-rw-r--r--mod/bookmarks/views/rss/object/bookmarks.php37
-rw-r--r--mod/bulk_user_admin/actions/bulk_user_admin/delete.php30
-rw-r--r--mod/bulk_user_admin/actions/bulk_user_admin/delete_by_domain.php36
-rw-r--r--mod/bulk_user_admin/languages/en.php9
-rw-r--r--mod/bulk_user_admin/manifest.xml18
-rw-r--r--mod/bulk_user_admin/readme.md11
-rw-r--r--mod/bulk_user_admin/start.php69
-rw-r--r--mod/bulk_user_admin/views/default/admin/user.php98
-rw-r--r--mod/bulk_user_admin/views/default/admin/users/email_domain_stats.php12
-rw-r--r--mod/bulk_user_admin/views/default/bulk_user_admin/css.php26
-rw-r--r--mod/bulk_user_admin/views/default/bulk_user_admin/email_domain_stats.php49
-rw-r--r--mod/bulk_user_admin/views/default/bulk_user_admin/search_by_domain.php16
-rw-r--r--mod/bulk_user_admin/views/default/bulk_user_admin/user.php49
-rw-r--r--mod/captcha/backgrounds/bg1.jpgbin0 -> 2542 bytes-rw-r--r--mod/captcha/backgrounds/bg2.jpgbin0 -> 2561 bytes-rw-r--r--mod/captcha/backgrounds/bg3.jpgbin0 -> 2494 bytes-rw-r--r--mod/captcha/backgrounds/bg4.jpgbin0 -> 2277 bytes-rw-r--r--mod/captcha/backgrounds/bg5.jpgbin0 -> 2338 bytes-rw-r--r--mod/captcha/captcha.php34
-rw-r--r--mod/captcha/fonts/1.ttfbin0 -> 100392 bytes-rw-r--r--mod/captcha/fonts/Liberation_serif_License.txt77
-rw-r--r--mod/captcha/languages/ca.php13
-rw-r--r--mod/captcha/languages/en.php13
-rw-r--r--mod/captcha/languages/es.php13
-rw-r--r--mod/captcha/manifest.xml19
-rw-r--r--mod/captcha/start.php101
-rw-r--r--mod/captcha/views/default/captcha/css.php4
-rw-r--r--mod/captcha/views/default/input/captcha.php19
-rw-r--r--mod/categories/activate.php11
-rw-r--r--mod/categories/deactivate.php6
-rw-r--r--mod/categories/languages/en.php15
-rw-r--r--mod/categories/manifest.xml17
-rw-r--r--mod/categories/pages/categories/listing.php39
-rw-r--r--mod/categories/readme.txt25
-rw-r--r--mod/categories/start.php83
-rw-r--r--mod/categories/views/default/categories.php12
-rw-r--r--mod/categories/views/default/categories/css.php12
-rw-r--r--mod/categories/views/default/categories/view.php8
-rw-r--r--mod/categories/views/default/input/categories.php56
-rw-r--r--mod/categories/views/default/output/categories.php29
-rw-r--r--mod/categories/views/default/plugins/categories/settings.php22
-rw-r--r--mod/ckeditor/README.md21
-rw-r--r--mod/ckeditor/languages/en.php14
-rw-r--r--mod/ckeditor/manifest.xml21
-rw-r--r--mod/ckeditor/start.php40
-rw-r--r--mod/ckeditor/vendors/ckeditor/CHANGES.md60
-rw-r--r--mod/ckeditor/vendors/ckeditor/LICENSE.md1264
-rw-r--r--mod/ckeditor/vendors/ckeditor/README.md39
-rw-r--r--mod/ckeditor/vendors/ckeditor/build-config.js138
-rw-r--r--mod/ckeditor/vendors/ckeditor/ckeditor.js810
-rw-r--r--mod/ckeditor/vendors/ckeditor/config.js32
-rw-r--r--mod/ckeditor/vendors/ckeditor/contents.css99
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/af.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ar.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/bg.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/bn.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/bs.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ca.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/cs.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/cy.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/da.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/de.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/el.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/en-au.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/en-ca.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/en-gb.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/en.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/eo.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/es.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/et.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/eu.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/fa.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/fi.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/fo.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/fr-ca.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/fr.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/gl.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/gu.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/he.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/hi.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/hr.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/hu.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/is.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/it.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ja.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ka.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/km.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ko.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ku.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/lt.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/lv.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/mk.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/mn.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ms.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/nb.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/nl.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/no.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/pl.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/pt-br.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/pt.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ro.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ru.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/sk.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/sl.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/sr-latn.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/sr.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/sv.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/th.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/tr.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/ug.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/uk.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/vi.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/zh-cn.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/lang/zh.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt25
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/da.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/de.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/el.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/en.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/es.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/et.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/he.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/it.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/no.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js10
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js7
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/about.js6
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/logo_ckeditor.pngbin0 -> 2759 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/autogrow/plugin.js178
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/autogrow/samples/autogrow.html99
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/clipboard/dialogs/paste.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/dialog/dialogDefinition.js4
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/fakeobjects/images/spacer.gifbin0 -> 43 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/icons.pngbin0 -> 10452 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/image/dialogs/image.js41
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/image/images/noimage.pngbin0 -> 2115 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/anchor.js8
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/link.js36
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/link/images/anchor.pngbin0 -> 566 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/magicline/images/icon.pngbin0 -> 172 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/pastefromword/filter/default.js31
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/scayt/LICENSE.md28
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/scayt/README.md25
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/options.js19
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/toolbar.css71
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt20
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ca.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cs.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cy.js14
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/de.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/el.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/en.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/eo.js12
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/et.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fa.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fi.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fr.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/he.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/hr.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/it.js14
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ku.js14
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/lv.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nb.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nl.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/no.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sk.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sv.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/tr.js12
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ug.js13
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js9
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/specialchar.js14
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/table/dialogs/table.js20
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/tabletools/dialogs/tableCell.js16
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/LICENSE.md28
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/README.md25
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/ciframe.html49
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/tmpFrameset.html52
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.css82
-rw-r--r--mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.js11
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/ajax.html82
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/api.html207
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/appendto.html57
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/inlineall/logo.pngbin0 -> 4411 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/outputxhtml/outputxhtml.css204
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/posteddata.php59
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/sample.css3
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/sample.jpgbin0 -> 17932 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/assets/uilanguages/languages.js7
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/divreplace.html141
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/index.html119
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/inlineall.html311
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/inlinebycode.html122
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/assets/my_dialog.js48
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/dialog.html187
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/enterkey/enterkey.html103
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.flabin0 -> 85504 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swfbin0 -> 15571 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js18
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputforflash.html280
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputhtml.html237
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/magicline/magicline.html203
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/toolbar/toolbar.html200
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/plugins/wysiwygarea/fullpage.html71
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/readonly.html73
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/replacebyclass.html57
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/replacebycode.html56
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/sample.css333
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/sample.js5
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/sample_posteddata.php16
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/tabindex.html75
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/uicolor.html69
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/uilanguages.html119
-rw-r--r--mod/ckeditor/vendors/ckeditor/samples/xhtmlstyle.html219
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie7.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie8.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog_iequirks.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/dialog_opera.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor_gecko.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie7.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie8.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/editor_iequirks.css5
-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/icons.pngbin0 -> 10452 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/images/arrow.pngbin0 -> 261 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/images/close.pngbin0 -> 389 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/images/mini.pngbin0 -> 818 bytes-rw-r--r--mod/ckeditor/vendors/ckeditor/skins/moono/readme.md51
-rw-r--r--mod/ckeditor/vendors/ckeditor/styles.js112
-rw-r--r--mod/ckeditor/views/default/ckeditor/css.php30
-rw-r--r--mod/ckeditor/views/default/ckeditor/embed_custom_insert_js.php8
-rw-r--r--mod/ckeditor/views/default/ckeditor/init.php8
-rw-r--r--mod/ckeditor/views/default/css/wysiwyg.php36
-rw-r--r--mod/ckeditor/views/default/js/ckeditor.php77
-rw-r--r--mod/colorbox/COPYING661
-rw-r--r--mod/colorbox/languages/ca.php29
-rw-r--r--mod/colorbox/languages/en.php29
-rw-r--r--mod/colorbox/languages/es.php29
-rw-r--r--mod/colorbox/manifest.xml29
-rw-r--r--mod/colorbox/start.php36
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/README.md318
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/colorbox.ai1811
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox-min.js4
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox.js926
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/ajax.html11
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/flash.html8
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/homer.jpgbin0 -> 8917 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/marylou.jpgbin0 -> 55125 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/ohoopee1.jpgbin0 -> 74827 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/ohoopee2.jpgbin0 -> 117411 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/content/ohoopee3.jpgbin0 -> 71514 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/colorbox.css86
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/border.pngbin0 -> 112 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/controls.pngbin0 -> 2893 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomCenter.pngbin0 -> 111 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomLeft.pngbin0 -> 215 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomRight.pngbin0 -> 217 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleLeft.pngbin0 -> 108 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleRight.pngbin0 -> 108 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopCenter.pngbin0 -> 111 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopLeft.pngbin0 -> 216 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopRight.pngbin0 -> 214 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/loading.gifbin0 -> 9427 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/loading_background.pngbin0 -> 157 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/images/overlay.pngbin0 -> 182 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example1/index.html87
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example2/colorbox.css43
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example2/images/controls.pngbin0 -> 570 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example2/images/loading.gifbin0 -> 9427 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example2/index.html87
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example3/colorbox.css38
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example3/images/controls.pngbin0 -> 1633 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example3/images/loading.gifbin0 -> 9427 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example3/index.html87
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/colorbox.css82
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/border1.pngbin0 -> 1057 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/border2.pngbin0 -> 170 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomCenter.pngbin0 -> 153 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomLeft.pngbin0 -> 473 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomRight.pngbin0 -> 470 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleLeft.pngbin0 -> 148 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleRight.pngbin0 -> 139 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopCenter.pngbin0 -> 153 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopLeft.pngbin0 -> 359 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopRight.pngbin0 -> 465 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/images/loading.gifbin0 -> 9427 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example4/index.html87
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/colorbox.css52
-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/images/border.pngbin0 -> 163 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/images/controls.pngbin0 -> 2033 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/images/loading.gifbin0 -> 9427 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/images/loading_background.pngbin0 -> 166 bytes-rw-r--r--mod/colorbox/vendors/jquery/colorbox/example5/index.html87
-rw-r--r--mod/colorbox/views/default/css/lightbox.php73
-rw-r--r--mod/colorbox/views/default/js/embed/embed.php171
-rw-r--r--mod/colorbox/views/default/js/lightbox.php81
-rw-r--r--mod/cool_theme/_graphics/ajax_loader.gifbin0 -> 1928 bytes-rw-r--r--mod/cool_theme/_graphics/ajax_loader_bw.gifbin0 -> 1928 bytes-rw-r--r--mod/cool_theme/_graphics/elgg_sprites.pngbin0 -> 37873 bytes-rw-r--r--mod/cool_theme/_graphics/favicon.icobin0 -> 182449 bytes-rw-r--r--mod/cool_theme/documentation/documention.html12
-rw-r--r--mod/cool_theme/languages/en.php50
-rw-r--r--mod/cool_theme/languages/es.php47
-rw-r--r--mod/cool_theme/languages/fr.php36
-rw-r--r--mod/cool_theme/manifest.xml54
-rw-r--r--mod/cool_theme/pages/credits.php15
-rw-r--r--mod/cool_theme/pages/dashboard.php29
-rw-r--r--mod/cool_theme/pages/groups/info.php27
-rw-r--r--mod/cool_theme/pages/groups/wall.php35
-rw-r--r--mod/cool_theme/pages/profile/info.php9
-rw-r--r--mod/cool_theme/pages/profile/wall.php32
-rw-r--r--mod/cool_theme/readme.md8
-rw-r--r--mod/cool_theme/screenshot.pngbin0 -> 121345 bytes-rw-r--r--mod/cool_theme/start.php676
-rw-r--r--mod/cool_theme/views/default/annotation/generic_comment.php72
-rw-r--r--mod/cool_theme/views/default/blog/composer.php10
-rw-r--r--mod/cool_theme/views/default/bookmarks/composer.php3
-rw-r--r--mod/cool_theme/views/default/cool_theme/css.php11
-rw-r--r--mod/cool_theme/views/default/core/account/login_box.php21
-rw-r--r--mod/cool_theme/views/default/core/account/login_dropdown.php27
-rw-r--r--mod/cool_theme/views/default/core/settings/account.php9
-rw-r--r--mod/cool_theme/views/default/core/settings/account/default_access.php25
-rw-r--r--mod/cool_theme/views/default/core/settings/account/email.php19
-rw-r--r--mod/cool_theme/views/default/core/settings/account/language.php20
-rw-r--r--mod/cool_theme/views/default/core/settings/account/name.php21
-rw-r--r--mod/cool_theme/views/default/core/settings/account/notifications.php44
-rw-r--r--mod/cool_theme/views/default/core/settings/account/password.php33
-rw-r--r--mod/cool_theme/views/default/core/settings/statistics.php6
-rw-r--r--mod/cool_theme/views/default/core/settings/statistics/numentities.php44
-rw-r--r--mod/cool_theme/views/default/core/settings/statistics/online.php49
-rw-r--r--mod/cool_theme/views/default/core/settings/tools.php34
-rw-r--r--mod/cool_theme/views/default/core/walled_garden/login.php38
-rw-r--r--mod/cool_theme/views/default/css/elements/buttons.php13
-rw-r--r--mod/cool_theme/views/default/css/elements/chrome.php15
-rw-r--r--mod/cool_theme/views/default/css/elements/components.php58
-rw-r--r--mod/cool_theme/views/default/css/elements/forms.php21
-rw-r--r--mod/cool_theme/views/default/css/elements/icons.php18
-rw-r--r--mod/cool_theme/views/default/css/elements/layout.php26
-rw-r--r--mod/cool_theme/views/default/css/elements/modules.php12
-rw-r--r--mod/cool_theme/views/default/css/elements/navigation.php85
-rw-r--r--mod/cool_theme/views/default/css/elements/typography.php17
-rw-r--r--mod/cool_theme/views/default/css/walled_garden.php74
-rw-r--r--mod/cool_theme/views/default/discussion/river_footer.php51
-rw-r--r--mod/cool_theme/views/default/file/composer.php8
-rw-r--r--mod/cool_theme/views/default/forms/comments/add.php39
-rw-r--r--mod/cool_theme/views/default/forms/discussion/reply/save.php28
-rw-r--r--mod/cool_theme/views/default/forms/profile/edit.php67
-rw-r--r--mod/cool_theme/views/default/forms/profile/fields/add.php29
-rw-r--r--mod/cool_theme/views/default/forms/profile/fields/reset.php12
-rw-r--r--mod/cool_theme/views/default/group/default/river.php23
-rw-r--r--mod/cool_theme/views/default/groups/profile/fields.php36
-rw-r--r--mod/cool_theme/views/default/groups/profile/profile_block.php69
-rw-r--r--mod/cool_theme/views/default/groups/profile/stats.php19
-rw-r--r--mod/cool_theme/views/default/groups/profile/summary.php17
-rw-r--r--mod/cool_theme/views/default/input/access.php38
-rw-r--r--mod/cool_theme/views/default/input/autocomplete.php49
-rw-r--r--mod/cool_theme/views/default/input/button.php40
-rw-r--r--mod/cool_theme/views/default/input/calendar.php6
-rw-r--r--mod/cool_theme/views/default/input/captcha.php8
-rw-r--r--mod/cool_theme/views/default/input/checkbox.php39
-rw-r--r--mod/cool_theme/views/default/input/checkboxes.php90
-rw-r--r--mod/cool_theme/views/default/input/date.php56
-rw-r--r--mod/cool_theme/views/default/input/datepicker.php6
-rw-r--r--mod/cool_theme/views/default/input/dropdown.php71
-rw-r--r--mod/cool_theme/views/default/input/email.php26
-rw-r--r--mod/cool_theme/views/default/input/file.php31
-rw-r--r--mod/cool_theme/views/default/input/form.php44
-rw-r--r--mod/cool_theme/views/default/input/friendspicker.php319
-rw-r--r--mod/cool_theme/views/default/input/hidden.php12
-rw-r--r--mod/cool_theme/views/default/input/location.php27
-rw-r--r--mod/cool_theme/views/default/input/longtext.php40
-rw-r--r--mod/cool_theme/views/default/input/password.php28
-rw-r--r--mod/cool_theme/views/default/input/plaintext.php35
-rw-r--r--mod/cool_theme/views/default/input/pulldown.php9
-rw-r--r--mod/cool_theme/views/default/input/radio.php76
-rw-r--r--mod/cool_theme/views/default/input/reset.php14
-rw-r--r--mod/cool_theme/views/default/input/securitytoken.php15
-rw-r--r--mod/cool_theme/views/default/input/submit.php14
-rw-r--r--mod/cool_theme/views/default/input/tag.php25
-rw-r--r--mod/cool_theme/views/default/input/tags.php45
-rw-r--r--mod/cool_theme/views/default/input/text.php27
-rw-r--r--mod/cool_theme/views/default/input/url.php27
-rw-r--r--mod/cool_theme/views/default/input/urlshortener.php8
-rw-r--r--mod/cool_theme/views/default/input/userpicker.php73
-rw-r--r--mod/cool_theme/views/default/js/tobar2.php100
-rw-r--r--mod/cool_theme/views/default/js/topbar.php3
-rw-r--r--mod/cool_theme/views/default/likes/river_footer.php71
-rw-r--r--mod/cool_theme/views/default/messageboard/composer.php6
-rw-r--r--mod/cool_theme/views/default/object/blog/river.php17
-rw-r--r--mod/cool_theme/views/default/object/bookmarks/river.php19
-rw-r--r--mod/cool_theme/views/default/object/file/river.php17
-rw-r--r--mod/cool_theme/views/default/object/groupforumtopic/river.php17
-rw-r--r--mod/cool_theme/views/default/object/page/river.php15
-rw-r--r--mod/cool_theme/views/default/page/components/gallery.php77
-rw-r--r--mod/cool_theme/views/default/page/components/image_block.php52
-rw-r--r--mod/cool_theme/views/default/page/components/list.php75
-rw-r--r--mod/cool_theme/views/default/page/components/module.php48
-rw-r--r--mod/cool_theme/views/default/page/components/summary.php4
-rw-r--r--mod/cool_theme/views/default/page/default.php73
-rw-r--r--mod/cool_theme/views/default/page/elements/composer.php7
-rw-r--r--mod/cool_theme/views/default/page/elements/footer.php36
-rw-r--r--mod/cool_theme/views/default/page/elements/head.php68
-rw-r--r--mod/cool_theme/views/default/page/elements/header.php12
-rw-r--r--mod/cool_theme/views/default/page/elements/owner_block.php30
-rw-r--r--mod/cool_theme/views/default/page/elements/shortcut_icon.php6
-rw-r--r--mod/cool_theme/views/default/page/elements/sidebar.php31
-rw-r--r--mod/cool_theme/views/default/page/elements/sidebar_alt.php12
-rw-r--r--mod/cool_theme/views/default/page/elements/title.php21
-rw-r--r--mod/cool_theme/views/default/page/layouts/content.php45
-rw-r--r--mod/cool_theme/views/default/page/layouts/content/sidebar_alt.php0
-rw-r--r--mod/cool_theme/views/default/page/layouts/two_sidebar.php46
-rw-r--r--mod/cool_theme/views/default/profile/details.php41
-rw-r--r--mod/cool_theme/views/default/river/elements/attachment.php25
-rw-r--r--mod/cool_theme/views/default/river/elements/body.php68
-rw-r--r--mod/cool_theme/views/default/river/elements/responses.php49
-rw-r--r--mod/cool_theme/views/default/river/group/create.php25
-rw-r--r--mod/cool_theme/views/default/river/object/blog/create.php11
-rw-r--r--mod/cool_theme/views/default/river/object/bookmarks/create.php14
-rw-r--r--mod/cool_theme/views/default/river/object/file/create.php13
-rw-r--r--mod/cool_theme/views/default/river/object/groupforumtopic/create.php11
-rw-r--r--mod/cool_theme/views/default/river/object/messageboard/create.php11
-rw-r--r--mod/cool_theme/views/default/river/object/page/create.php11
-rw-r--r--mod/cool_theme/views/default/river/user/default/profileiconupdate.php24
-rw-r--r--mod/cool_theme/views/default/river/user/default/profileupdate.php20
-rw-r--r--mod/cool_theme/views/default/search/css.php11
-rw-r--r--mod/cool_theme/views/default/search/entity.php57
-rw-r--r--mod/cool_theme/views/default/search/search_box.php27
-rw-r--r--mod/cool_theme/views/default/thewire/composer.php2
-rw-r--r--mod/curatedgroups/languages/ca.php33
-rwxr-xr-xmod/curatedgroups/languages/en.php33
-rwxr-xr-xmod/curatedgroups/languages/es.php33
-rwxr-xr-xmod/curatedgroups/manifest.xml18
-rw-r--r--mod/curatedgroups/start.php38
-rw-r--r--mod/curatedgroups/views/default/forms/groups/edit.php77
-rw-r--r--mod/curatedgroups/views/default/settings/curatedgroups/edit.php39
-rw-r--r--mod/custom_index/index.php73
-rw-r--r--mod/custom_index/languages/en.php14
-rw-r--r--mod/custom_index/manifest.xml15
-rw-r--r--mod/custom_index/start.php30
-rw-r--r--mod/custom_index/views/default/custom_index/css.php23
-rw-r--r--mod/custom_index/views/default/page/layouts/custom_index.php73
-rw-r--r--mod/custom_index_widgets/index.php66
-rw-r--r--mod/custom_index_widgets/languages/de.php78
-rw-r--r--mod/custom_index_widgets/languages/en.php82
-rw-r--r--mod/custom_index_widgets/languages/es.php78
-rw-r--r--mod/custom_index_widgets/languages/fr.php80
-rw-r--r--mod/custom_index_widgets/manifest.xml21
-rw-r--r--mod/custom_index_widgets/start.php159
-rw-r--r--mod/custom_index_widgets/views/default/admin/appearance/custom_index_widgets.php56
-rw-r--r--mod/custom_index_widgets/views/default/custom_index_widgets/css.php347
-rw-r--r--mod/custom_index_widgets/views/default/custom_index_widgets/footerlinks.php3
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/edit_widgets.php61
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index.php30
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_1rsss.php29
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rbhh.php30
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rbms.php30
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rbsm.php28
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rhhb.php30
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rmsb.php30
-rw-r--r--mod/custom_index_widgets/views/default/page/layouts/index_2rsmb.php30
-rw-r--r--mod/custom_index_widgets/views/default/plugins/custom_index_widgets/settings.php61
-rw-r--r--mod/custom_index_widgets/views/default/widgets/cloud_generic_index/content.php59
-rw-r--r--mod/custom_index_widgets/views/default/widgets/cloud_generic_index/edit.php120
-rw-r--r--mod/custom_index_widgets/views/default/widgets/feed_reader_index/content.php8
-rw-r--r--mod/custom_index_widgets/views/default/widgets/feed_reader_index/edit.php5
-rw-r--r--mod/custom_index_widgets/views/default/widgets/inline_content_index/content.php7
-rw-r--r--mod/custom_index_widgets/views/default/widgets/inline_content_index/edit.php46
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_activity_index/content.php20
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_activity_index/edit.php64
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_album_index/content.php64
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_album_index/edit.php64
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_blogs_index/content.php43
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_blogs_index/edit.php85
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/content.php43
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/edit.php85
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_events_index/content.php95
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_events_index/edit.php96
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_files_index/content.php44
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_files_index/edit.php86
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_generic_index/content.php47
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_generic_index/edit.php103
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_groups_index/content.php21
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_groups_index/edit.php63
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/content.php50
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/edit.php86
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_members_index/content.php20
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_members_index/edit.php79
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_news_index/content.php47
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_news_index/edit.php85
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_pages_index/content.php45
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_pages_index/edit.php86
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_photos_index/content.php25
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_photos_index/edit.php64
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_tasks_index/content.php45
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_tasks_index/edit.php85
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_wire_index/content.php17
-rw-r--r--mod/custom_index_widgets/views/default/widgets/latest_wire_index/edit.php62
-rw-r--r--mod/custom_index_widgets/views/default/widgets/login_index/content.php15
-rw-r--r--mod/custom_index_widgets/views/default/widgets/login_index/edit.php27
-rw-r--r--mod/custom_index_widgets/views/default/widgets/rich_media_index/content.php27
-rw-r--r--mod/custom_index_widgets/views/default/widgets/rich_media_index/edit.php78
-rw-r--r--mod/dashboard/languages/en.php14
-rw-r--r--mod/dashboard/manifest.xml15
-rw-r--r--mod/dashboard/start.php83
-rw-r--r--mod/dashboard/views/default/dashboard/blurb.php17
-rw-r--r--mod/dashboard/views/default/dashboard/css.php10
-rw-r--r--mod/dashboard/views/default/widgets/group_activity/content.php36
-rw-r--r--mod/dashboard/views/default/widgets/group_activity/edit.php45
-rw-r--r--mod/developers/actions/developers/inspect.php16
-rw-r--r--mod/developers/actions/developers/settings.php35
-rw-r--r--mod/developers/classes/ElggInspector.php201
-rw-r--r--mod/developers/classes/ElggLogCache.php44
-rw-r--r--mod/developers/languages/en.php69
-rw-r--r--mod/developers/manifest.xml19
-rw-r--r--mod/developers/start.php209
-rw-r--r--mod/developers/vendors/jsTree/jquery.jstree.js4544
-rw-r--r--mod/developers/vendors/jsTree/themes/apple/bg.jpgbin0 -> 331 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/apple/d.pngbin0 -> 7765 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/apple/dot_for_ie.gifbin0 -> 43 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/apple/style.css61
-rw-r--r--mod/developers/vendors/jsTree/themes/apple/throbber.gifbin0 -> 1849 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/classic/d.gifbin0 -> 3003 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/classic/d.pngbin0 -> 7535 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/classic/dot_for_ie.gifbin0 -> 43 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/classic/style.css77
-rw-r--r--mod/developers/vendors/jsTree/themes/classic/throbber.gifbin0 -> 1849 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default-rtl/d.gifbin0 -> 2872 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default-rtl/d.pngbin0 -> 7459 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default-rtl/dots.gifbin0 -> 132 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default-rtl/style.css84
-rw-r--r--mod/developers/vendors/jsTree/themes/default-rtl/throbber.gifbin0 -> 1849 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default/d.gifbin0 -> 2944 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default/d.pngbin0 -> 7635 bytes-rw-r--r--mod/developers/vendors/jsTree/themes/default/style.css74
-rw-r--r--mod/developers/vendors/jsTree/themes/default/throbber.gifbin0 -> 1849 bytes-rw-r--r--mod/developers/views/default/admin/develop_tools/inspect.php14
-rw-r--r--mod/developers/views/default/admin/develop_tools/preview.php8
-rw-r--r--mod/developers/views/default/admin/develop_tools/unit_tests.php17
-rw-r--r--mod/developers/views/default/admin/developers/settings.php63
-rw-r--r--mod/developers/views/default/developers/css.php27
-rw-r--r--mod/developers/views/default/developers/ipsum.php7
-rw-r--r--mod/developers/views/default/developers/log.php18
-rw-r--r--mod/developers/views/default/developers/tree.php18
-rw-r--r--mod/developers/views/default/forms/developers/inspect.php23
-rw-r--r--mod/developers/views/default/forms/developers/settings.php36
-rw-r--r--mod/developers/views/default/js/developers/developers.php44
-rw-r--r--mod/developers/views/default/page/theme_preview.php43
-rw-r--r--mod/developers/views/default/theme_preview/buttons.php41
-rw-r--r--mod/developers/views/default/theme_preview/components.php25
-rw-r--r--mod/developers/views/default/theme_preview/components/image_block.php6
-rw-r--r--mod/developers/views/default/theme_preview/components/list.php19
-rw-r--r--mod/developers/views/default/theme_preview/components/messages.php5
-rw-r--r--mod/developers/views/default/theme_preview/components/table.php12
-rw-r--r--mod/developers/views/default/theme_preview/components/tagcloud.php17
-rw-r--r--mod/developers/views/default/theme_preview/components/tags.php5
-rw-r--r--mod/developers/views/default/theme_preview/forms.php138
-rw-r--r--mod/developers/views/default/theme_preview/general.php46
-rw-r--r--mod/developers/views/default/theme_preview/grid.php114
-rw-r--r--mod/developers/views/default/theme_preview/icons.php10
-rw-r--r--mod/developers/views/default/theme_preview/icons/avatars.php36
-rw-r--r--mod/developers/views/default/theme_preview/icons/loader.php1
-rw-r--r--mod/developers/views/default/theme_preview/icons/sprites.php61
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous.php22
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/lightbox.php19
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/popup.php15
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/site_menu.php15
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/system_messages.php35
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/toggle.php15
-rw-r--r--mod/developers/views/default/theme_preview/miscellaneous/user_hover_menu.php16
-rw-r--r--mod/developers/views/default/theme_preview/modules.php6
-rw-r--r--mod/developers/views/default/theme_preview/modules/modules.php23
-rw-r--r--mod/developers/views/default/theme_preview/modules/widgets.php64
-rw-r--r--mod/developers/views/default/theme_preview/navigation.php23
-rw-r--r--mod/developers/views/default/theme_preview/navigation/breadcrumbs.php10
-rw-r--r--mod/developers/views/default/theme_preview/navigation/default.php11
-rw-r--r--mod/developers/views/default/theme_preview/navigation/entity.php12
-rw-r--r--mod/developers/views/default/theme_preview/navigation/extras.php18
-rw-r--r--mod/developers/views/default/theme_preview/navigation/filter.php13
-rw-r--r--mod/developers/views/default/theme_preview/navigation/footer.php10
-rw-r--r--mod/developers/views/default/theme_preview/navigation/horizontal.php12
-rw-r--r--mod/developers/views/default/theme_preview/navigation/owner_block.php13
-rw-r--r--mod/developers/views/default/theme_preview/navigation/page.php20
-rw-r--r--mod/developers/views/default/theme_preview/navigation/pagination.php8
-rw-r--r--mod/developers/views/default/theme_preview/navigation/site.php18
-rw-r--r--mod/developers/views/default/theme_preview/navigation/tabs.php10
-rw-r--r--mod/developers/views/default/theme_preview/typography.php12
-rw-r--r--mod/developers/views/default/theme_preview/typography/fonts.php7
-rw-r--r--mod/developers/views/default/theme_preview/typography/headings.php6
-rw-r--r--mod/developers/views/default/theme_preview/typography/misc.php16
-rw-r--r--mod/developers/views/default/theme_preview/typography/paragraph.php19
-rw-r--r--mod/diagnostics/actions/download.php18
-rw-r--r--mod/diagnostics/languages/en.php45
-rw-r--r--mod/diagnostics/manifest.xml17
-rw-r--r--mod/diagnostics/start.php140
-rw-r--r--mod/diagnostics/views/default/admin/administer_utilities/diagnostics.php17
-rw-r--r--mod/dokuwiki/AUTHORS2
-rwxr-xr-xmod/dokuwiki/COPYING340
-rw-r--r--mod/dokuwiki/README31
-rw-r--r--mod/dokuwiki/index.php17
-rw-r--r--mod/dokuwiki/languages/ca.php18
-rwxr-xr-xmod/dokuwiki/languages/de.php21
-rwxr-xr-xmod/dokuwiki/languages/en.php32
-rw-r--r--mod/dokuwiki/languages/es.php18
-rw-r--r--mod/dokuwiki/languages/fr.php12
-rw-r--r--mod/dokuwiki/languages/gl.php23
-rwxr-xr-xmod/dokuwiki/languages/pl.php21
-rw-r--r--mod/dokuwiki/languages/pt.php23
-rw-r--r--mod/dokuwiki/lib/dokuwiki.php60
-rw-r--r--mod/dokuwiki/manifest.xml21
-rw-r--r--mod/dokuwiki/start.php168
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/COPYING340
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/README9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/VERSION1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/bin/dwpage.php378
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/bin/indexer.php172
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/bin/wantedpages.php134
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php.dist21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/acronyms.conf143
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/dokuwiki.php156
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/entities.conf22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/interwiki.conf125
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/license.php40
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/local.php43
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/local.php.dist26
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/mediameta.php57
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/mime.conf52
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/msg8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/mysql.conf.php.example253
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/scheme.conf11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/smileys.conf27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php.dist10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/wordblock.conf8004
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/conf/words.aspell.dist5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/_dummy1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/attic/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/cache/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/index/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/locks/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/media/wiki/dokuwiki-128.pngbin0 -> 33615 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/meta/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/pages/playground/playground.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/pages/sidebar.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/dokuwiki.txt66
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/syntax.txt488
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/data/tmp/_dummy0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/doku.php109
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/feed.php353
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/DifferenceEngine.php1066
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/EmailAddressValidator.php146
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/FeedParser.php76
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/HTTPClient.php573
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/IXR_Library.php817
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/JSON.php624
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/JpegMeta.php3116
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/SimplePie.php10849
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/TarLib.class.php918
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/ZipLib.class.php475
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/actions.php639
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/adLDAP.php2347
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth.php1099
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/ad.class.php205
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/basic.class.php403
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/elgg.class.php352
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/ldap.class.php357
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/mysql.class.php942
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/pgsql.class.php411
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/auth/plain.class.php324
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/blowfish.php521
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/cache.php292
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/changelog.php474
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/cliopts.php361
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/common.php1549
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/confutils.php320
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/events.php202
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/feedcreator.class.php1572
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/form.php918
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/fulltext.php722
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi.php4644
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/abap.php1409
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/actionscript-french.php957
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/actionscript.php197
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/actionscript3.php473
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/ada.php133
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/apache.php480
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/applescript.php157
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/apt_sources.php144
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/asm.php225
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/asp.php164
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/autoit.php1171
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/avisynth.php194
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/bash.php282
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/basic4gl.php341
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/bf.php114
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/blitzbasic.php185
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/bnf.php110
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/boo.php217
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/c.php188
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/c_mac.php212
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/caddcl.php126
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cadlisp.php186
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cfdg.php124
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cfm.php299
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cil.php196
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cobol.php244
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cpp-qt.php315
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/cpp.php226
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/csharp.php250
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/css.php212
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/d.php272
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/dcs.php185
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/delphi.php289
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/diff.php196
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/div.php126
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/dos.php198
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/dot.php164
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/eiffel.php395
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/email.php209
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/fortran.php160
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/freebasic.php141
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/genero.php463
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/gettext.php97
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/glsl.php205
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/gml.php506
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/gnuplot.php296
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/groovy.php1011
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/haskell.php198
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/hq9plus.php104
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/html4strict.php203
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/idl.php123
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/ini.php128
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/inno.php212
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/intercal.php122
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/io.php138
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/java.php983
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/java5.php1031
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/javascript.php150
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/kixtart.php329
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/klonec.php282
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/klonecpp.php310
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/latex.php218
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lisp.php144
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/locobasic.php130
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lolcode.php152
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lotusformulas.php318
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lotusscript.php191
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lscript.php387
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lsl2.php898
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/lua.php137
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/m68k.php143
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/make.php151
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/matlab.php227
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/mirc.php171
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/modula3.php135
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/mpasm.php164
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/mxml.php145
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/mysql.php475
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/nsis.php351
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/oberon2.php135
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/objc.php358
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/ocaml-brief.php111
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/ocaml.php174
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/oobas.php135
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/oracle11.php614
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/oracle8.php496
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/pascal.php152
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/per.php302
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/perl.php213
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/php-brief.php222
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/php.php1114
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/pic16.php141
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/pixelbender.php176
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/plsql.php256
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/povray.php199
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/powershell.php277
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/progress.php485
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/prolog.php143
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/providex.php299
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/python.php237
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/qbasic.php151
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/rails.php406
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/rebol.php196
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/reg.php233
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/robots.php98
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/ruby.php226
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/sas.php290
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/scala.php122
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/scheme.php170
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/scilab.php295
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/sdlbasic.php165
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/smalltalk.php160
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/smarty.php192
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/sql.php140
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/tcl.php194
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/teraterm.php317
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/text.php84
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/thinbasic.php868
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/tsql.php375
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/typoscript.php300
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/vb.php133
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/vbnet.php201
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/verilog.php173
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/vhdl.php144
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/vim.php185
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/visualfoxpro.php456
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/visualprolog.php129
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/whitespace.php121
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/winbatch.php369
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/xml.php157
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/xorg_conf.php124
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/xpp.php436
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/geshi/z80.php144
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/html.php1608
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/httputils.php199
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/indexer.php705
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/infoutils.php385
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/init.php598
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/io.php593
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/af/lang.php75
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/lang.php223
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/pwconfirm.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/revisions.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ar/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/install.html25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/lang.php247
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/recent.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/bg/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/install.html11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/lang.php250
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/register.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/stopwords.txt76
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca-valencia/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/install.html8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/lang.php247
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/norev.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/stopwords.txt106
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/subscribermail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ca/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/install.html23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/lang.php247
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/showrev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/stopwords.txt944
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/cs/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/install.html24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/lang.php253
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/stopwords.txt87
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/da/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/diff.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/edit.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/install.html27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/lang.php249
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/newpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/pwconfirm.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/searchpage.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/stopwords.txt125
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de-informal/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/diff.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/edit.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/install.html27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/lang.php257
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/newpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/pwconfirm.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/searchpage.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/stopwords.txt125
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/de/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/denied.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/draft.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/install.html25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/lang.php243
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/subscribermail.txt24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/uploadmail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/el/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/adminplugins.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/install.html24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/lang.php280
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/stopwords.txt39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/en/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/install.html9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/lang.php254
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/stopwords.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eo/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/install.html14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/lang.php262
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/pwconfirm.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/stopwords.txt171
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/es/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/editrev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/lang.php214
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/pwconfirm.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/stopwords.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/et/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/install.html9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/lang.php223
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/pwconfirm.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/stopwords.txt26
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/subscribermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/eu/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/editrev.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/install.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/lang.php253
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/showrev.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/stopwords.txt445
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/subscribermail.txt21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fa/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/install.html21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/lang.php248
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/recent.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/stopwords.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fi/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/lang.php173
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/stopwords.txt87
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fo/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/install.html19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/lang.php258
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/mailtext.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/stopwords.txt112
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/fr/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/install.html25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/lang.php243
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/stopwords.txt246
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/subscribermail.txt19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/gl/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/install.html13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/lang.php224
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/he/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hi/lang.php126
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/denied.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/index.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/lang.php200
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/searchpage.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hr/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/conflict.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/install.html26
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/lang.php249
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/login.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/norev.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/stopwords.txt39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/subscribermail.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/hu/wordblock.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id-ni/lang.php79
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/install.html25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/lang.php210
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/stopwords.txt37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/id/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/lang.php196
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/is/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/denied.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/install.html24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/lang.php240
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/recent.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/stopwords.txt119
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/subscribermail.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/it/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/edit.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/install.html14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/lang.php249
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ja/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/conflict.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/edit.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/index.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/lang.php230
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/login.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/norev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/register.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/km/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/diff.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/install.html17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/lang.php229
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/pwconfirm.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/subscribermail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/uploadmail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ko/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/lang.php163
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ku/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/lang.php207
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/login.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/mailtext.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/norev.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/read.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/updateprofile.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lt/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/admin.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/conflict.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/denied.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/diff.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/editrev.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/install.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/lang.php244
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/locked.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/mailtext.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/newpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/norev.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/read.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/recent.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/revisions.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/searchpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/stopwords.txt48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/subscribermail.txt23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/updateprofile.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/lv/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/lang.php135
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/preview.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/read.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/register.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/revisions.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/searchpage.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mg/wordblock.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/install.html10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/lang.php229
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/mailtext.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/pwconfirm.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/stopwords.txt39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/subscribermail.txt21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/mr/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/admin.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/backlinks.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/lang.php220
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/norev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/pwconfirm.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/recent.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/searchpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/subscribermail.txt19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ne/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/install.html14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/lang.php253
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/stopwords.txt37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/nl/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/install.html24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/lang.php260
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/stopwords.txt130
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/no/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/edit.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/install.html23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/lang.php248
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/mailtext.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/registermail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/stopwords.txt89
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/uploadmail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pl/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/editrev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/install.html7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/lang.php247
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/recent.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/stopwords.txt55
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/subscribermail.txt24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt-br/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/admin.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/conflict.txt9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/denied.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/diff.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/draft.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/edit.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/editrev.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/index.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/install.html8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/lang.php237
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/locked.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/login.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/mailtext.txt20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/newpage.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/norev.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/preview.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/read.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/register.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/revisions.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/searchpage.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/showrev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/stopwords.txt141
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/subscribermail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/pt/wordblock.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/install.html10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/lang.php251
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ro/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/install.html7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/lang.php258
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/stopwords.txt93
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/ru/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/admin.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/editrev.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/install.html23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/lang.php227
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/showrev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/stopwords.txt28
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/subscribermail.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/updateprofile.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sk/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/lang.php162
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sl/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/draft.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/install.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/lang.php224
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/registermail.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/stopwords.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/subscribermail.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sr/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/adminplugins.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/install.html25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/lang.php261
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/pwconfirm.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/resendpwd.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/stopwords.txt129
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/subscribermail.txt24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/sv/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/index.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/lang.php249
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/searchpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/subscribermail.txt22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/th/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/backlinks.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/conflict.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/install.html8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/lang.php226
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/locked.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/subscribermail.txt18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/updateprofile.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/tr/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/conflict.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/draft.txt6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/index.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/install.html21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/lang.php244
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/login.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/newpage.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/pwconfirm.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/recent.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/registermail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/revisions.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/stopwords.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/subscribermail.txt22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/uploadmail.txt14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/uk/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/lang.php106
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/read.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/recent.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/vi/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/admin.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/adminplugins.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/backlinks.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/conflict.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/denied.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/diff.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/draft.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/install.html8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/lang.php252
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/login.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/mailtext.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/norev.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/preview.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/pwconfirm.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/read.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/register.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/registermail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/resendpwd.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/stopwords.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/subscribermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/uploadmail.txt13
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh-tw/wordblock.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/admin.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/backlinks.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/conflict.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/denied.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/diff.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/draft.txt7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/editrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/index.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/install.html8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/lang.php230
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/locked.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/login.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/mailtext.txt17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/newpage.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/norev.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/preview.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/pwconfirm.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/read.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/recent.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/register.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/registermail.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/resendpwd.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/revisions.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/searchpage.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/showrev.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/stopwords.txt29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/subscribermail.txt19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/updateprofile.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/uploadmail.txt20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/lang/zh/wordblock.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/mail.php266
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/media.php1102
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/pageutils.php537
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/code.php58
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/handler.php1697
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/lexer.php600
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/metadata.php483
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/parser.php956
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/renderer.php322
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/xhtml.php1142
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parser/xhtmlsummary.php90
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/parserutils.php672
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/plugin.php248
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/plugincontroller.class.php172
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/pluginutils.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/search.php630
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/template.php1413
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/toolbar.php241
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/inc/utf8.php1657
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/index.php8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/install.php516
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/_fla/MultipleUpload.as329
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/_fla/README4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/_fla/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/_fla/multipleUpload.flabin0 -> 1812480 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/ajax.php370
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/css.php330
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/detail.php58
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/fetch.php173
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/indexer.php375
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/js.php397
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/mediamanager.php105
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/multipleUpload.swfbin0 -> 64561 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/opensearch.php38
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/exe/xmlrpc.php921
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/README2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/acl.pngbin0 -> 1336 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/config.pngbin0 -> 1761 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/plugin.pngbin0 -> 1415 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/popularity.pngbin0 -> 1420 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/revert.pngbin0 -> 1598 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/admin/usermanager.pngbin0 -> 1850 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/arrow_down.gifbin0 -> 273 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/arrow_up.gifbin0 -> 274 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/at.gifbin0 -> 57 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/blank.gifbin0 -> 42 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/close.pngbin0 -> 1345 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/del.pngbin0 -> 433 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/diff.pngbin0 -> 219 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/edit.gifbin0 -> 142 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/error.pngbin0 -> 706 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/bz2.pngbin0 -> 720 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/c.pngbin0 -> 774 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/conf.pngbin0 -> 717 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/cpp.pngbin0 -> 859 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/cs.pngbin0 -> 808 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/css.pngbin0 -> 843 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/deb.pngbin0 -> 716 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/doc.pngbin0 -> 659 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/file.pngbin0 -> 720 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/gif.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/gz.pngbin0 -> 716 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/htm.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/html.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/index.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/java.pngbin0 -> 739 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/jpeg.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/jpg.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/js.pngbin0 -> 809 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/lua.pngbin0 -> 465 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odc.pngbin0 -> 749 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odf.pngbin0 -> 807 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odg.pngbin0 -> 788 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odi.pngbin0 -> 788 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odp.pngbin0 -> 744 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/ods.pngbin0 -> 749 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/odt.pngbin0 -> 577 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/pdf.pngbin0 -> 663 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/php.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/pl.pngbin0 -> 698 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/png.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/ppt.pngbin0 -> 762 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/ps.pngbin0 -> 534 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/py.pngbin0 -> 714 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/rar.pngbin0 -> 631 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/rb.pngbin0 -> 828 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/rpm.pngbin0 -> 638 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/rtf.pngbin0 -> 474 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/swf.pngbin0 -> 843 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/sxc.pngbin0 -> 749 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/sxd.pngbin0 -> 788 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/sxi.pngbin0 -> 744 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/sxw.pngbin0 -> 577 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/tar.pngbin0 -> 747 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/tgz.pngbin0 -> 716 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/txt.pngbin0 -> 542 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/xls.pngbin0 -> 731 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/xml.pngbin0 -> 475 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/fileicons/zip.pngbin0 -> 874 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/history.pngbin0 -> 202 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/info.pngbin0 -> 783 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki.pngbin0 -> 1089 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/amazon.de.gifbin0 -> 882 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/amazon.gifbin0 -> 882 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/amazon.uk.gifbin0 -> 882 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/coral.gifbin0 -> 85 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/doku.gifbin0 -> 257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/dokubug.gifbin0 -> 166 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/google.gifbin0 -> 980 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/meatball.gifbin0 -> 1100 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/phpfn.gifbin0 -> 330 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/sb.gifbin0 -> 886 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wiki.gifbin0 -> 909 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wp.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wpde.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wpes.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wpfr.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wpjp.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wpmeta.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/interwiki/wppl.gifbin0 -> 680 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/larger.gifbin0 -> 87 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by-nc-nd.pngbin0 -> 5281 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by-nc-sa.pngbin0 -> 5460 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by-nc.pngbin0 -> 5145 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by-nd.pngbin0 -> 4880 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by-sa.pngbin0 -> 5083 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc-by.pngbin0 -> 4739 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/cc.pngbin0 -> 958 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/gnufdl.pngbin0 -> 1748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/badge/publicdomain.pngbin0 -> 4962 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by-nc-nd.pngbin0 -> 678 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by-nc-sa.pngbin0 -> 686 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by-nc.pngbin0 -> 663 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by-nd.pngbin0 -> 658 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by-sa.pngbin0 -> 661 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc-by.pngbin0 -> 629 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/cc.pngbin0 -> 728 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/gnufdl.pngbin0 -> 839 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/license/button/publicdomain.pngbin0 -> 621 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/list-minus.gifbin0 -> 64 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/list-plus.gifbin0 -> 67 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/loading.gifbin0 -> 1876 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/magnifier.pngbin0 -> 615 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/minus.gifbin0 -> 858 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/multiupload.pngbin0 -> 698 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/notify.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/ns.pngbin0 -> 853 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/page.pngbin0 -> 635 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/pencil.pngbin0 -> 450 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/plus.gifbin0 -> 860 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smaller.gifbin0 -> 86 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/delete.gifbin0 -> 1421 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/fixme.gifbin0 -> 1435 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_arrow.gifbin0 -> 170 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_biggrin.gifbin0 -> 172 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_confused.gifbin0 -> 171 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_cool.gifbin0 -> 172 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_cry.gifbin0 -> 498 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_doubt.gifbin0 -> 990 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_doubt2.gifbin0 -> 992 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_eek.gifbin0 -> 170 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_evil.gifbin0 -> 236 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_exclaim.gifbin0 -> 236 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_frown.gifbin0 -> 171 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_fun.gifbin0 -> 590 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_idea.gifbin0 -> 176 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_kaddi.gifbin0 -> 991 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_lol.gifbin0 -> 336 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_mrgreen.gifbin0 -> 349 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_neutral.gifbin0 -> 171 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_question.gifbin0 -> 248 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_razz.gifbin0 -> 176 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_redface.gifbin0 -> 650 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_rolleyes.gifbin0 -> 485 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_sad.gifbin0 -> 171 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_silenced.gifbin0 -> 231 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_smile.gifbin0 -> 174 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_smile2.gifbin0 -> 174 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_surprised.gifbin0 -> 174 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_twisted.gifbin0 -> 238 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/smileys/icon_wink.gifbin0 -> 170 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/success.pngbin0 -> 816 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/throbber.gifbin0 -> 875 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/bold.pngbin0 -> 433 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/chars.pngbin0 -> 619 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h.pngbin0 -> 360 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h1.pngbin0 -> 420 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h2.pngbin0 -> 442 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h3.pngbin0 -> 452 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h4.pngbin0 -> 432 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/h5.pngbin0 -> 440 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/hequal.pngbin0 -> 426 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/hminus.pngbin0 -> 538 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/hplus.pngbin0 -> 520 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/hr.pngbin0 -> 329 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/image.pngbin0 -> 625 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/italic.pngbin0 -> 322 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/link.pngbin0 -> 579 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/linkextern.pngbin0 -> 962 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/mono.pngbin0 -> 385 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/ol.pngbin0 -> 403 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/sig.pngbin0 -> 569 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/smiley.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/strike.pngbin0 -> 415 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/ul.pngbin0 -> 383 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/toolbar/underline.pngbin0 -> 375 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/trash.pngbin0 -> 476 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/up.pngbin0 -> 376 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/images/wrap.gifbin0 -> 86 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/admin.php809
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/ajax.php62
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/af/lang.php10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ar/lang.php24
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/bg/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/bg/lang.php36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ca-valencia/help.txt15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ca-valencia/lang.php37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ca/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ca/lang.php38
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/cs/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/cs/lang.php37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/da/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/da/lang.php42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/de-informal/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/de-informal/lang.php35
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/de/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/de/lang.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/el/help.txt10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/el/lang.php43
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/en/help.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/en/lang.php46
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/eo/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/eo/lang.php40
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/es/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/es/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/et/lang.php23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/eu/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/eu/lang.php34
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fa/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fa/lang.php38
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fi/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fi/lang.php36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fr/help.txt9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/fr/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/gl/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/gl/lang.php36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/he/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/he/lang.php35
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/hi/lang.php6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/hr/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/hu/help.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/hu/lang.php36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/id-ni/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/id/lang.php21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/is/lang.php15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/it/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/it/lang.php42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ja/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ja/lang.php39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ko/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ko/lang.php41
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/lt/lang.php22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/lv/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/lv/lang.php35
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/mr/help.txt12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/mr/lang.php37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ne/lang.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/nl/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/nl/lang.php45
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/no/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/no/lang.php46
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pl/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pl/lang.php38
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pt-br/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pt-br/lang.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pt/help.txt9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/pt/lang.php39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ro/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ro/lang.php39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ru/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/ru/lang.php42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sk/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sk/lang.php38
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sl/lang.php21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sr/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sr/lang.php37
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sv/help.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/sv/lang.php46
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/th/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/th/lang.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/tr/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/tr/lang.php40
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/uk/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/uk/lang.php39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/vi/lang.php21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/zh-tw/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/zh-tw/lang.php40
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/zh/help.txt11
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/lang/zh/lang.php39
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/pix/group.pngbin0 -> 753 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/pix/ns.pngbin0 -> 853 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/pix/page.pngbin0 -> 635 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/pix/user.pngbin0 -> 706 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/script.js163
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/acl/style.css96
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/action.php26
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/admin.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/box/print.css274
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/box/style.css272
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/box/syntax.php287
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/COPYING340
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/CREDITS58
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/VERSION.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/action.php169
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/admin.php453
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/ajax.php196
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/changelog207
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/conf/default.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/conf/metadata.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/edit-full.js152
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/edit.js1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/close.gifbin0 -> 64 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/base.gifbin0 -> 578 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/empty.gifbin0 -> 62 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/folder.gifbin0 -> 352 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/folderh.gifbin0 -> 572 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/folderhopen.gifbin0 -> 577 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/folderopen.gifbin0 -> 354 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/info.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/join.gifbin0 -> 69 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/joinbottom.gifbin0 -> 66 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/line.gifbin0 -> 66 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/minus.gifbin0 -> 86 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/minusbottom.gifbin0 -> 85 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/nolines_minus.gifbin0 -> 861 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/nolines_plus.gifbin0 -> 870 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/page.gifbin0 -> 565 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/plus.gifbin0 -> 89 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/default/plusbottom.gifbin0 -> 88 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/empty.gifbin0 -> 275 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/indexmenu_toolbar.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/larrow.gifbin0 -> 1829 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/msort.gifbin0 -> 420 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/rarrow.gifbin0 -> 81 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/images/toc_bullet.gifbin0 -> 74 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/inc/pclzip.lib.php5748
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/inc/repo.class.php51
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/indexmenu-full.js640
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/indexmenu.js18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/jsmenu/admmenu.js71
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/jsmenu/menu.js56
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/jsmenu/usrmenu.js69
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/lang/de/lang.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/lang/en/lang.php28
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/lang/es/lang.php28
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/lang/it/lang.php29
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/nojsindex-full.js101
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/nojsindex.js1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/script.js152
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/style.css190
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/syntax/indexmenu.php720
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/indexmenu/syntax/tag.php70
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/info/syntax.php259
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/important.pngbin0 -> 2250 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/note.pngbin0 -> 2520 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/tb_important.pngbin0 -> 1366 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/tb_note.pngbin0 -> 1461 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/tb_tip.pngbin0 -> 1441 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/tb_warning.pngbin0 -> 1870 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/tip.pngbin0 -> 2909 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/images/warning.pngbin0 -> 3249 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/info.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/script.js36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/style.css41
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/note/syntax.php191
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/ChangeLog.txt255
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/README.txt16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/ZipLib.class.php391
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/action.php41
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/conf/default.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/conf/metadata.php8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/info.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/de/lang.php9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/en/lang.php12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/es/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/fr/lang.php12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/it/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/ja/lang.php12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/ru/lang.php12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/lang/zh/lang.php12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/odt.pngbin0 -> 3320 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/renderer.php1232
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/styles.xml158
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/odt/syntax.php96
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/admin.php202
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/af/lang.php5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ar/lang.php6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/bg/intro.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/bg/lang.php15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ca-valencia/intro.txt4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ca-valencia/lang.php15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ca/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ca/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/cs/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/cs/lang.php22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/da/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/da/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/de-informal/lang.php14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/de/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/de/lang.php23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/el/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/el/lang.php20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/en/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/en/lang.php23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/eo/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/eo/lang.php22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/es/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/es/lang.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/eu/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/eu/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fa/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fa/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fi/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fi/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fr/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/fr/lang.php22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/gl/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/gl/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/he/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/he/lang.php16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/hi/lang.php6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/hr/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/hu/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/hu/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/id-ni/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/id/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/is/lang.php10
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/it/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/it/lang.php20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ja/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ja/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ko/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ko/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/lt/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/lv/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/lv/lang.php15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/mr/intro.txt5
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/mr/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ne/lang.php16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/nl/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/nl/lang.php21
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/no/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/no/lang.php26
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pl/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pl/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pt-br/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pt-br/lang.php25
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pt/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/pt/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ro/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ro/lang.php20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ru/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/ru/lang.php22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sk/intro.txt0
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sk/lang.php17
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sl/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sr/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sr/lang.php16
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sv/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/sv/lang.php28
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/th/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/th/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/tr/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/tr/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/uk/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/uk/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/zh-tw/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/zh-tw/lang.php19
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/zh/intro.txt3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/revert/lang/zh/lang.php20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/README20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/conf/default.php4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/conf/metadata.php4
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/lang/en/lang.php3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/lang/ru/lang.php3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/lang/sp/lang.php3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/plugin.info.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/renderer.php338
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/screen.gifbin0 -> 1574 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/syntax.php72
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/audio_support/license.txt29
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/audio_support/null.mp3bin0 -> 2508 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/audio_support/soundmanager2.js658
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/audio_support/soundmanager2.swfbin0 -> 2198 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/bluebg.gifbin0 -> 2295 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/bluebottom.gifbin0 -> 3428 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/bluefooter.gifbin0 -> 591 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/pretty.css173
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/blue/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/bodybg.gifbin0 -> 10119 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/footer.jpgbin0 -> 4451 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/notes_over.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/opera.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/pretty.css156
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/prev_over.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/print.css1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/s5-core.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/default/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/footer.jpgbin0 -> 4451 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/logo.pngbin0 -> 16746 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/notes_over.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/opera.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/pretty.css163
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/prev_over.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/print.css1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/s5-core.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/dokuwiki/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/MIT-LICENSE20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/builder.js136
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/controls.js965
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/dragdrop.js974
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/effects.js1123
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/presentacular.js153
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/prototype.js4874
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/scriptaculous.js68
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/slider.js275
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/sound.js59
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/effects_support/unittest.js568
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/LEEME.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/back-handout-print.pngbin0 -> 5999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/back-slide-print.pngbin0 -> 6487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/back_console.pngbin0 -> 14135 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/background-foot.pngbin0 -> 451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/background-head.pngbin0 -> 450 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/background-head.xcfbin0 -> 6114 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/background-main.pngbin0 -> 92480 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/favicon.icobin0 -> 1406 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/logo.pngbin0 -> 9760 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pics/table-header.pngbin0 -> 344 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/pretty.css545
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/executive/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/across.pngbin0 -> 178955 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/auto_over.pngbin0 -> 1117 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/blank.gifbin0 -> 49 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/bottom.pngbin0 -> 41109 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/delay_link.pngbin0 -> 1943 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/druplicon.pngbin0 -> 9215 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/fade_over.pngbin0 -> 1093 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/framing.css65
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/next_over.pngbin0 -> 734 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/notes.css122
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/pretty.css354
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/toggle_over.pngbin0 -> 1071 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/top.pngbin0 -> 74839 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/faucet/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/blume.jpgbin0 -> 6779 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/blumerechts.jpgbin0 -> 2215 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/pretty.css168
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/flower/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/auto_over.pngbin0 -> 1117 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/bg-slide.jpgbin0 -> 48642 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/framing.css23
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/pretty.css130
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/print.css1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/s5-core.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/garlandica/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/LEEME.txt32
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/back-handout-print.pngbin0 -> 5999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/back-slide-print.pngbin0 -> 6487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/back_console.pngbin0 -> 14135 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/background-foot.pngbin0 -> 501 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/background-head.pngbin0 -> 2999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/background-main.pngbin0 -> 1824 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/background-main2.pngbin0 -> 3735 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/favicon.icobin0 -> 1406 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/logo.pngbin0 -> 16331 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pics/table-header.pngbin0 -> 247 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/pretty.css583
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/gorilla/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/finish.gifbin0 -> 1364 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/fixed.js1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/help.jpgbin0 -> 30942 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/numeric.pngbin0 -> 7144 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/graphic_support/progress.gifbin0 -> 4237 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/00_head.txt8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/bg-shade.pngbin0 -> 594 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/bg-slide.jpgbin0 -> 31239 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/pretty.css139
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/i18n/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/LEEME.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/back-handout-print.pngbin0 -> 5958 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/back-slide-print.pngbin0 -> 5648 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/back_console.pngbin0 -> 11708 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/background-foot.pngbin0 -> 397 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/background-head.pngbin0 -> 401 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/background-head.xcf.7zbin0 -> 2889 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/background-main.pngbin0 -> 27159 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/background-main2.pngbin0 -> 27171 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/favicon.icobin0 -> 1406 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/logo.pngbin0 -> 11222 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pics/table-header.pngbin0 -> 654 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/pretty.css584
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/mandarina/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pixelbg.gifbin0 -> 1716 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pixelheader.jpgbin0 -> 3571 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pixelslide0bg.gifbin0 -> 3180 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/pretty.css166
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/pixel/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/LEEME.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/back-handout-print.pngbin0 -> 5999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/back-index.pngbin0 -> 15049 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/back-slide-print.pngbin0 -> 6487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/back_console.pngbin0 -> 14135 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/background-foot.pngbin0 -> 389 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/background-head.pngbin0 -> 373 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/background-main.pngbin0 -> 9066 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/favicon.icobin0 -> 318 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/logo.pngbin0 -> 1312 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pics/table-header.pngbin0 -> 384 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/pretty.css585
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/quality/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/s5-notes.html157
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/backgrnd.jpgbin0 -> 3648 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/chalks.pngbin0 -> 30926 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/footer.jpgbin0 -> 4451 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/footer.pngbin0 -> 34238 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/framing.css22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/header.pngbin0 -> 49918 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/notes_over.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/opera.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/outline.css14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/pretty.css162
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/prev_over.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/print.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/s5-core.css8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/triangle.pngbin0 -> 81350 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/school/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/backgrnd.pngbin0 -> 12943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/bank.pngbin0 -> 41837 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/footer.jpgbin0 -> 4451 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/footer.pngbin0 -> 62136 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/framing.css22
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/notes_over.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/opera.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/outline.css14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/pattern.pngbin0 -> 226 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/pretty.css163
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/prev_over.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/print.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/s5-core.css8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/sun.pngbin0 -> 32851 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/sunny/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/LEEME.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/back-handout-print.pngbin0 -> 5999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/back-slide-print.pngbin0 -> 6487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/back_console.pngbin0 -> 14135 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/background-foot.pngbin0 -> 604 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/background-head.pngbin0 -> 605 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/background-main.pngbin0 -> 51209 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/favicon.icobin0 -> 1406 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/logo.pngbin0 -> 14675 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pics/table-header.pngbin0 -> 309 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/pretty.css583
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tango/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/LEEME.txt36
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/background-foot.pngbin0 -> 1705 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/background-head.pngbin0 -> 1700 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/background-main.pngbin0 -> 358052 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/favicon.icobin0 -> 1150 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/logo.pngbin0 -> 13015 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pics/table-header.pngbin0 -> 309 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/pretty.css583
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/tangodevweb/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/LEEME.txt31
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/index.php102
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/back-handout-print.pngbin0 -> 5999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/back-slide-print.pngbin0 -> 6487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/back_console.pngbin0 -> 14135 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/background-foot.pngbin0 -> 451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/background-head.pngbin0 -> 450 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/background-head.xcfbin0 -> 6114 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/background-main.pngbin0 -> 92480 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/favicon.icobin0 -> 1406 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/logo.jpgbin0 -> 7126 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/table-background.pngbin0 -> 460 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pics/table-header.pngbin0 -> 344 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/pretty.css525
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/slides.js2846
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/thesis/zero_over.pngbin0 -> 1004 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/LEEME.txt32
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/backgrnd.pngbin0 -> 10257 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/header.pngbin0 -> 27487 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/iepngfix.htc42
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/images/favicon.icobin0 -> 3638 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/index.html100
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pause_over.pngbin0 -> 757 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/background-foot.pngbin0 -> 269 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/background-head.pngbin0 -> 273 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/background-main.pngbin0 -> 14732 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/dot.pngbin0 -> 670 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/dot2.pngbin0 -> 422 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/h1icon.pngbin0 -> 2999 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/link.pngbin0 -> 447 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/logo.pngbin0 -> 15020 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pics/mail.pngbin0 -> 993 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/pretty.css543
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/s5-core.css9
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/ultraviolet/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/bkgr.jpgbin0 -> 9069 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/blank.gifbin0 -> 49 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/bodybg.gifbin0 -> 10119 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/buzzsaw.gifbin0 -> 5087 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/buzzsaw.pngbin0 -> 4494 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/iepngfix.htc42
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/notes_over.pngbin0 -> 789 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/opera.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/pretty.css1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/prev_over.pngbin0 -> 748 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/print.css1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/s5-core.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/vmc/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/audio_link.pngbin0 -> 1183 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/audio_on.pngbin0 -> 1227 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/audio_over.pngbin0 -> 1245 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/auto_link.pngbin0 -> 1076 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/auto_on.pngbin0 -> 1106 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/auto_over.pngbin0 -> 1117 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/backgrnd.pngbin0 -> 10257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/bodybg.gifbin0 -> 1373 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/button.gifbin0 -> 920 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/delay_link.pngbin0 -> 1943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/exit_link.pngbin0 -> 867 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/exit_over.pngbin0 -> 877 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/fade_link.pngbin0 -> 1079 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/fade_on.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/fade_over.pngbin0 -> 1093 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/footer.jpgbin0 -> 4451 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/framing.css23
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/head.gifbin0 -> 1373 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/header.pngbin0 -> 27487 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/last_link.pngbin0 -> 975 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/last_over.pngbin0 -> 1001 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/list_link.pngbin0 -> 908 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/loop_link.pngbin0 -> 1622 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/loop_on.pngbin0 -> 1665 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/loop_over.pngbin0 -> 1711 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/next_link.pngbin0 -> 713 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/next_over.pngbin0 -> 734 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/notes_link.pngbin0 -> 755 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/notes_over.pngbin0 -> 789 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/opera.css7
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/outline.css15
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/pause_link.pngbin0 -> 732 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/pause_on.pngbin0 -> 726 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/pause_over.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/pretty.css221
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/prev_link.pngbin0 -> 757 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/prev_over.pngbin0 -> 748 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/print.css1
-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/s5-core.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/slide0h1.gifbin0 -> 3143 bytes-rwxr-xr-xmod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/slides.css3
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/slides.js2812
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/toggle.gifbin0 -> 1128 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/toggle_link.pngbin0 -> 1039 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/toggle_over.pngbin0 -> 1071 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/volume_link.pngbin0 -> 943 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/wrap.css410
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/zero_link.pngbin0 -> 968 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/s5reloaded/ui/yatil/zero_over.pngbin0 -> 1004 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/syntax.php281
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/tbt/script.js207
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/tbt/style.css7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/tbt/syntax.php79
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/admin.php627
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/images/search.pngbin0 -> 733 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/af/lang.php14
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ar/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ar/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ar/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ar/lang.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/bg/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/lang.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca-valencia/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ca/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/cs/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/lang.php52
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/da/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de-informal/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/lang.php56
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/de/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/lang.php53
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/el/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/lang.php58
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/en/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/lang.php54
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eo/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/lang.php60
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/es/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/lang.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/eu/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/lang.php51
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fa/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/lang.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fi/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/lang.php55
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/fr/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/lang.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/gl/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/he/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hi/lang.php6
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hr/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/add.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/delete.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/intro.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/lang.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/hu/list.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id-ni/lang.php7
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/lang.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/id/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/is/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/is/lang.php18
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/lang.php54
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/it/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ja/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ko/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/add.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/delete.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/intro.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lt/list.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/lv/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/mr/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/lang.php49
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ne/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/lang.php53
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/nl/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/lang.php56
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/no/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pl/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/lang.php57
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt-br/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/pt/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/lang.php52
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ro/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/lang.php56
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/ru/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/add.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/delete.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/edit.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/intro.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/lang.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sk/list.txt2
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sl/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sl/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sl/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sl/lang.php20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sl/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/lang.php48
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sr/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/lang.php58
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/sv/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/lang.php47
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/th/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/lang.php51
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/tr/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/lang.php52
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/uk/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/lang.php52
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh-tw/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/add.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/delete.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/edit.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/intro.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/lang.php51
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/lang/zh/list.txt1
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/script.js9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/plugins/usermanager/style.css20
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/ajax.js68
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/cookie.js112
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/drag.js99
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/edit.js442
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/events.js176
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/helpers.js146
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/index.js116
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/linkwiz.js282
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/media.js351
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/pngbehavior.htc53
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/script.js561
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/textselection.js226
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/toolbar.js252
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/scripts/tw-sack.js136
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/styles/feed.css63
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/styles/index.html12
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/styles/style.css113
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/conf/default.php8
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/conf/metadata.php9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/design.css796
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/detail.php89
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/footer.html41
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/bullet.gifbin0 -> 50 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-cc.gifbin0 -> 1231 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-css.pngbin0 -> 299 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-donate.gifbin0 -> 187 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-dw.pngbin0 -> 427 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-php.gifbin0 -> 269 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-rss.pngbin0 -> 280 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/button-xhtml.pngbin0 -> 321 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/buttonshadow.pngbin0 -> 257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/closed.gifbin0 -> 54 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/favicon.icobin0 -> 7406 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/inputshadow.pngbin0 -> 155 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/link_icon.gifbin0 -> 942 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/mail_icon.gifbin0 -> 918 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/open.gifbin0 -> 54 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/sidebar-border.gifbin0 -> 34 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/tocdot2.gifbin0 -> 810 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/images/windows.gifbin0 -> 223 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/layout.css79
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/main.php69
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/main_index.php135
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/media.css205
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/media.php54
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/mediaedit.php88
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/mediamanager.php44
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/mediaref.php50
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/print.css238
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/rtl.css119
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/sidebar.css189
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/sidebar.php9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/sidebar_print.css9
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/style.ini67
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default/tplfn_sidebar.php98
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/_admin.css43
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/_linkwiz.css68
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/design.css835
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/detail.php89
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/footer.html41
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/UWEB.pngbin0 -> 1138 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/UWEBshadow.pngbin0 -> 1123 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/bullet.gifbin0 -> 50 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-cc.gifbin0 -> 1231 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-css.pngbin0 -> 299 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-donate.gifbin0 -> 187 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-dw.pngbin0 -> 427 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-php.gifbin0 -> 207 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-rss.pngbin0 -> 280 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/button-xhtml.pngbin0 -> 321 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/buttonshadow.pngbin0 -> 257 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/closed.gifbin0 -> 54 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/favicon.icobin0 -> 7406 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/inputshadow.pngbin0 -> 155 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/link_icon.gifbin0 -> 942 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/mail_icon.gifbin0 -> 918 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/open.gifbin0 -> 54 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/tocdot2.gifbin0 -> 810 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/images/windows.gifbin0 -> 223 bytes-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/layout.css79
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/main.php27
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/main_index.php121
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/media.css205
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/mediamanager.php44
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/print.css238
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/rtl.css119
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/default2/style.ini67
-rw-r--r--mod/dokuwiki/vendors/dokuwiki/lib/tpl/index.php68
-rw-r--r--mod/dokuwiki/views/default/dokuwiki/css.php12
-rw-r--r--mod/dokuwiki/views/default/dokuwiki/grouppage.php9
-rw-r--r--mod/dokuwiki/views/default/dokuwiki/index.php13
-rw-r--r--mod/dokuwiki/views/default/dokuwiki/metatags.php5
-rw-r--r--mod/dokuwiki/views/default/dokuwiki/sidebar.php10
-rw-r--r--mod/dokuwiki/views/default/object/dokuwiki.php19
-rw-r--r--mod/dokuwiki/views/default/river/dokuwiki.php17
-rw-r--r--mod/editablecomments/COPYING661
-rw-r--r--mod/editablecomments/actions/comments/edit.php61
-rw-r--r--mod/editablecomments/languages/ca.php34
-rw-r--r--mod/editablecomments/languages/en.php36
-rw-r--r--mod/editablecomments/languages/es.php34
-rw-r--r--mod/editablecomments/languages/gl.php34
-rw-r--r--mod/editablecomments/manifest.xml18
-rw-r--r--mod/editablecomments/start.php47
-rw-r--r--mod/editablecomments/views/default/annotation/generic_comment.php95
-rw-r--r--mod/editablecomments/views/default/forms/comments/edit.php60
-rw-r--r--mod/elgg-favorites/README8
-rw-r--r--mod/elgg-favorites/actions/favorites/add.php17
-rw-r--r--mod/elgg-favorites/actions/favorites/remove.php17
-rw-r--r--mod/elgg-favorites/languages/de.php21
-rw-r--r--mod/elgg-favorites/languages/en.php22
-rw-r--r--mod/elgg-favorites/languages/es.php22
-rw-r--r--mod/elgg-favorites/manifest.xml18
-rw-r--r--mod/elgg-favorites/start.php83
-rw-r--r--mod/elgg-favorites/views/default/favorites/button.php46
-rw-r--r--mod/elgg-favorites/views/default/favorites/sidebar.php13
-rw-r--r--mod/elgg-favorites/views/default/favorites/sidebar/groups.php24
-rw-r--r--mod/elgg-favorites/views/default/favorites/sidebar/users.php13
-rw-r--r--mod/elgg-favorites/views/default/favorites/view.php15
-rw-r--r--mod/elgg-favorites/views/default/js/favorites.php55
-rwxr-xr-xmod/elgg-favorites/views/default/widgets/favorites/content.php36
-rwxr-xr-xmod/elgg-favorites/views/default/widgets/favorites/edit.php17
-rw-r--r--mod/embed/README.txt76
-rw-r--r--mod/embed/languages/en.php21
-rw-r--r--mod/embed/manifest.xml22
-rw-r--r--mod/embed/start.php165
-rw-r--r--mod/embed/views/default/embed/addcontentjs.php7
-rw-r--r--mod/embed/views/default/embed/css.php37
-rw-r--r--mod/embed/views/default/embed/item.php39
-rw-r--r--mod/embed/views/default/embed/layout.php40
-rw-r--r--mod/embed/views/default/embed/list.php58
-rw-r--r--mod/embed/views/default/js/embed/embed.php147
-rw-r--r--mod/embed/views/default/navigation/menu/embed.php18
-rw-r--r--mod/event_calendar/CHANGES.txt154
-rw-r--r--mod/event_calendar/CONTRIBUTIONS.txt7
-rw-r--r--mod/event_calendar/README.txt89
-rw-r--r--mod/event_calendar/actions/event_calendar/add_personal.php17
-rw-r--r--mod/event_calendar/actions/event_calendar/add_to_group.php10
-rw-r--r--mod/event_calendar/actions/event_calendar/add_to_group_members.php15
-rw-r--r--mod/event_calendar/actions/event_calendar/addtocalendar.php33
-rw-r--r--mod/event_calendar/actions/event_calendar/delete.php21
-rw-r--r--mod/event_calendar/actions/event_calendar/edit.php55
-rw-r--r--mod/event_calendar/actions/event_calendar/join_conference.php20
-rw-r--r--mod/event_calendar/actions/event_calendar/killrequest.php23
-rw-r--r--mod/event_calendar/actions/event_calendar/manage_subscribers.php26
-rw-r--r--mod/event_calendar/actions/event_calendar/modify_full_calendar.php24
-rw-r--r--mod/event_calendar/actions/event_calendar/remove_from_group.php8
-rw-r--r--mod/event_calendar/actions/event_calendar/remove_from_group_members.php15
-rw-r--r--mod/event_calendar/actions/event_calendar/remove_personal.php12
-rw-r--r--mod/event_calendar/actions/event_calendar/request_personal_calendar.php16
-rw-r--r--mod/event_calendar/actions/event_calendar/toggle_personal_calendar.php40
-rw-r--r--mod/event_calendar/activate.php4
-rw-r--r--mod/event_calendar/images/calendar.gifbin0 -> 269 bytes-rw-r--r--mod/event_calendar/images/event_icon.gifbin0 -> 1254 bytes-rw-r--r--mod/event_calendar/images/event_icon_old.gifbin0 -> 1531 bytes-rw-r--r--mod/event_calendar/images/ics.pngbin0 -> 344 bytes-rw-r--r--mod/event_calendar/images/river_icon_event.gifbin0 -> 586 bytes-rw-r--r--mod/event_calendar/languages/ca.php143
-rw-r--r--mod/event_calendar/languages/en.php360
-rw-r--r--mod/event_calendar/languages/es.php215
-rw-r--r--mod/event_calendar/languages/fr.php124
-rw-r--r--mod/event_calendar/languages/ru.php365
-rw-r--r--mod/event_calendar/manifest.xml16
-rw-r--r--mod/event_calendar/models/model.php2518
-rw-r--r--mod/event_calendar/start.php414
-rw-r--r--mod/event_calendar/views/default/css/elements/forms/datepicker_multi.php39
-rw-r--r--mod/event_calendar/views/default/event_calendar/agenda_footer.php5
-rw-r--r--mod/event_calendar/views/default/event_calendar/agenda_header.php12
-rw-r--r--mod/event_calendar/views/default/event_calendar/agenda_item_view.php26
-rw-r--r--mod/event_calendar/views/default/event_calendar/agenda_view.php34
-rw-r--r--mod/event_calendar/views/default/event_calendar/calendar.php70
-rw-r--r--mod/event_calendar/views/default/event_calendar/calendar_toggle.php18
-rw-r--r--mod/event_calendar/views/default/event_calendar/conference_button.php33
-rw-r--r--mod/event_calendar/views/default/event_calendar/container.php28
-rw-r--r--mod/event_calendar/views/default/event_calendar/css.php264
-rw-r--r--mod/event_calendar/views/default/event_calendar/datetime_edit.php46
-rw-r--r--mod/event_calendar/views/default/event_calendar/entities/entity_list.php66
-rw-r--r--mod/event_calendar/views/default/event_calendar/entities/gallery.php44
-rw-r--r--mod/event_calendar/views/default/event_calendar/entities/gallery_item.php63
-rw-r--r--mod/event_calendar/views/default/event_calendar/filter_menu.php78
-rw-r--r--mod/event_calendar/views/default/event_calendar/forms/add_to_group.php74
-rw-r--r--mod/event_calendar/views/default/event_calendar/full_calendar_view.php200
-rw-r--r--mod/event_calendar/views/default/event_calendar/group_module.php37
-rw-r--r--mod/event_calendar/views/default/event_calendar/groupprofile_calendar.php33
-rw-r--r--mod/event_calendar/views/default/event_calendar/groupprofile_calendar_deprecated.php44
-rw-r--r--mod/event_calendar/views/default/event_calendar/input/date_local.php55
-rw-r--r--mod/event_calendar/views/default/event_calendar/metatags.php2
-rw-r--r--mod/event_calendar/views/default/event_calendar/nav.php38
-rw-r--r--mod/event_calendar/views/default/event_calendar/paged_footer.php4
-rw-r--r--mod/event_calendar/views/default/event_calendar/paged_header.php15
-rw-r--r--mod/event_calendar/views/default/event_calendar/paged_item_view.php27
-rw-r--r--mod/event_calendar/views/default/event_calendar/paged_view.php36
-rw-r--r--mod/event_calendar/views/default/event_calendar/personal_manage_section.php20
-rw-r--r--mod/event_calendar/views/default/event_calendar/personal_toggle_js.php20
-rw-r--r--mod/event_calendar/views/default/event_calendar/region_select.php21
-rw-r--r--mod/event_calendar/views/default/event_calendar/reminder_section.php28
-rw-r--r--mod/event_calendar/views/default/event_calendar/repeat_form_element.php32
-rw-r--r--mod/event_calendar/views/default/event_calendar/review_requests.php30
-rw-r--r--mod/event_calendar/views/default/event_calendar/schedule_section.php22
-rw-r--r--mod/event_calendar/views/default/event_calendar/share_section.php26
-rw-r--r--mod/event_calendar/views/default/event_calendar/show_events.php64
-rw-r--r--mod/event_calendar/views/default/event_calendar/strapline.php18
-rw-r--r--mod/event_calendar/views/default/forms/event_calendar/edit.php233
-rw-r--r--mod/event_calendar/views/default/forms/event_calendar/manage_subscribers.php14
-rw-r--r--mod/event_calendar/views/default/fullcalendar/css.php618
-rw-r--r--mod/event_calendar/views/default/fullcalendar/fullcalendar.print.css61
-rw-r--r--mod/event_calendar/views/default/icon/object/event_calendar/small.php3
-rw-r--r--mod/event_calendar/views/default/input/datepicker_inline.php83
-rw-r--r--mod/event_calendar/views/default/input/timepicker.php51
-rw-r--r--mod/event_calendar/views/default/input/timepicker_old.php38
-rw-r--r--mod/event_calendar/views/default/js/event_calendar/event_calendar.php171
-rw-r--r--mod/event_calendar/views/default/js/event_calendar/fullcalendar.min.js114
-rw-r--r--mod/event_calendar/views/default/js/event_calendar/fullcalendar.php5227
-rw-r--r--mod/event_calendar/views/default/js/event_calendar/gcal.js112
-rw-r--r--mod/event_calendar/views/default/object/event_calendar.php115
-rw-r--r--mod/event_calendar/views/default/plugins/event_calendar/settings.php474
-rw-r--r--mod/event_calendar/views/default/river/object/event_calendar/create.php13
-rw-r--r--mod/event_calendar/views/default/river/object/event_calendar/update.php13
-rw-r--r--mod/event_calendar/views/default/widgets/event_calendar/content.php43
-rw-r--r--mod/event_calendar/views/default/widgets/event_calendar/edit.php35
-rw-r--r--mod/event_calendar/views/ical/event_calendar/show_events.php7
-rw-r--r--mod/event_calendar/views/ical/object/event_calendar.php44
-rw-r--r--mod/event_calendar/views/ical/page/default.php17
-rw-r--r--mod/event_calendar/views/ical/page/layouts/default.php2
-rw-r--r--mod/event_calendar/views/rss/event_calendar/show_events.php24
-rw-r--r--mod/event_calendar/views/rss/object/event_calendar.php61
-rw-r--r--mod/event_connect/LICENSE.txt340
-rw-r--r--mod/event_connect/actions/event_connector/import.php141
-rw-r--r--mod/event_connect/export_event.php82
-rw-r--r--mod/event_connect/export_events.php156
-rw-r--r--mod/event_connect/languages/en.php31
-rw-r--r--mod/event_connect/languages/fr.php31
-rw-r--r--mod/event_connect/manifest.xml28
-rw-r--r--mod/event_connect/pages/event_connector/import.php36
-rw-r--r--mod/event_connect/start.php89
-rw-r--r--mod/event_connect/vendors/iCalcreator.class.php10181
-rw-r--r--mod/event_connect/views/default/forms/event_connector/import.php25
-rw-r--r--mod/event_connect/views/default/plugin/event_connector/settings.php26
-rw-r--r--mod/externalpages/actions/edit.php35
-rw-r--r--mod/externalpages/languages/en.php27
-rw-r--r--mod/externalpages/manifest.xml15
-rw-r--r--mod/externalpages/start.php102
-rw-r--r--mod/externalpages/views/default/admin/appearance/expages.php10
-rw-r--r--mod/externalpages/views/default/expages/menu.php23
-rw-r--r--mod/externalpages/views/default/expages/wrapper.php16
-rw-r--r--mod/externalpages/views/default/forms/expages/edit.php58
-rw-r--r--mod/faq/faqs-sample44
-rw-r--r--mod/faq/languages/en.php15
-rw-r--r--mod/faq/languages/es.php15
-rw-r--r--mod/faq/manifest.xml27
-rw-r--r--mod/faq/start.php32
-rw-r--r--mod/faq/vendors/jquery-stoc/jquery.stoc.js80
-rw-r--r--mod/faq/views/default/expages/menu.php23
-rw-r--r--mod/faq/views/default/js/simple_faq/toc.php24
-rw-r--r--mod/file/actions/file/delete.php33
-rw-r--r--mod/file/actions/file/download.php11
-rw-r--r--mod/file/actions/file/upload.php222
-rw-r--r--mod/file/classes/FilePluginFile.php31
-rw-r--r--mod/file/download.php12
-rw-r--r--mod/file/graphics/icons/application.gifbin0 -> 2465 bytes-rw-r--r--mod/file/graphics/icons/application_lrg.gifbin0 -> 7781 bytes-rw-r--r--mod/file/graphics/icons/archive.gifbin0 -> 2419 bytes-rw-r--r--mod/file/graphics/icons/archive_lrg.gifbin0 -> 7918 bytes-rw-r--r--mod/file/graphics/icons/excel.gifbin0 -> 2509 bytes-rw-r--r--mod/file/graphics/icons/excel_lrg.gifbin0 -> 7571 bytes-rw-r--r--mod/file/graphics/icons/general.gifbin0 -> 1528 bytes-rw-r--r--mod/file/graphics/icons/general_lrg.gifbin0 -> 4594 bytes-rw-r--r--mod/file/graphics/icons/music.gifbin0 -> 2297 bytes-rw-r--r--mod/file/graphics/icons/music_lrg.gifbin0 -> 6748 bytes-rw-r--r--mod/file/graphics/icons/openoffice.gifbin0 -> 2313 bytes-rw-r--r--mod/file/graphics/icons/openoffice_lrg.gifbin0 -> 6617 bytes-rw-r--r--mod/file/graphics/icons/pages.gifbin0 -> 2766 bytes-rw-r--r--mod/file/graphics/icons/pages_lrg.gifbin0 -> 10234 bytes-rw-r--r--mod/file/graphics/icons/pdf.gifbin0 -> 2197 bytes-rw-r--r--mod/file/graphics/icons/pdf_lrg.gifbin0 -> 6014 bytes-rw-r--r--mod/file/graphics/icons/ppt.gifbin0 -> 2495 bytes-rw-r--r--mod/file/graphics/icons/ppt_lrg.gifbin0 -> 7423 bytes-rw-r--r--mod/file/graphics/icons/text.gifbin0 -> 2881 bytes-rw-r--r--mod/file/graphics/icons/text_lrg.gifbin0 -> 9855 bytes-rw-r--r--mod/file/graphics/icons/vcard.gifbin0 -> 2385 bytes-rw-r--r--mod/file/graphics/icons/vcard_lrg.gifbin0 -> 6798 bytes-rw-r--r--mod/file/graphics/icons/video.gifbin0 -> 2603 bytes-rw-r--r--mod/file/graphics/icons/video_lrg.gifbin0 -> 7319 bytes-rw-r--r--mod/file/graphics/icons/word.gifbin0 -> 2479 bytes-rw-r--r--mod/file/graphics/icons/word_lrg.gifbin0 -> 7350 bytes-rw-r--r--mod/file/languages/en.php118
-rw-r--r--mod/file/lib/file.php45
-rw-r--r--mod/file/manifest.xml18
-rw-r--r--mod/file/pages/file/download.php38
-rw-r--r--mod/file/pages/file/edit.php40
-rw-r--r--mod/file/pages/file/friends.php36
-rw-r--r--mod/file/pages/file/owner.php57
-rw-r--r--mod/file/pages/file/search.php99
-rw-r--r--mod/file/pages/file/upload.php37
-rw-r--r--mod/file/pages/file/view.php46
-rw-r--r--mod/file/pages/file/world.php33
-rw-r--r--mod/file/start.php416
-rw-r--r--mod/file/thumbnail.php57
-rw-r--r--mod/file/views/default/embed/file_upload/content.php17
-rw-r--r--mod/file/views/default/file/css.php15
-rw-r--r--mod/file/views/default/file/group_module.php45
-rw-r--r--mod/file/views/default/file/sidebar.php14
-rw-r--r--mod/file/views/default/file/specialcontent/image/default.php20
-rw-r--r--mod/file/views/default/file/typecloud.php50
-rw-r--r--mod/file/views/default/forms/file/upload.php68
-rw-r--r--mod/file/views/default/icon/object/file.php54
-rw-r--r--mod/file/views/default/object/file.php107
-rw-r--r--mod/file/views/default/river/object/file/create.php13
-rw-r--r--mod/file/views/default/widgets/filerepo/content.php33
-rw-r--r--mod/file/views/default/widgets/filerepo/edit.php25
-rw-r--r--mod/file/views/rss/file/enclosure.php16
-rw-r--r--mod/foafssl/AUTHORS3
-rwxr-xr-xmod/foafssl/COPYING340
-rw-r--r--mod/foafssl/README.txt53
-rw-r--r--mod/foafssl/actions/add.php43
-rw-r--r--mod/foafssl/actions/generate.php53
-rwxr-xr-xmod/foafssl/actions/register.php81
-rw-r--r--mod/foafssl/actions/suck.php56
-rw-r--r--mod/foafssl/add.php24
-rw-r--r--mod/foafssl/authenticationlogin.php71
-rw-r--r--mod/foafssl/cert_proxy.php64
-rw-r--r--mod/foafssl/foafssl.pngbin0 -> 1355 bytes-rw-r--r--mod/foafssl/generate.php22
-rwxr-xr-xmod/foafssl/languages/en.php25
-rwxr-xr-xmod/foafssl/languages/es.php26
-rw-r--r--mod/foafssl/manage.php27
-rw-r--r--mod/foafssl/manifest.xml9
-rw-r--r--mod/foafssl/start.php83
-rw-r--r--mod/foafssl/views/default/foafssl/loginbox.php4
-rwxr-xr-xmod/foafssl/views/default/foafssl/register.php54
-rw-r--r--mod/foafssl/views/foaf/canvas/layouts/widgets.php2
-rw-r--r--mod/foafssl/views/foaf/foafssl/profile.php16
-rwxr-xr-xmod/foafssl/views/foaf/pageshells/pageshell.php54
-rw-r--r--mod/friendrequest/actions/friendrequest/decline.php12
-rw-r--r--mod/friendrequest/actions/friends/add.php53
-rw-r--r--mod/friendrequest/actions/friends/remove.php36
-rw-r--r--mod/friendrequest/languages/ca.php20
-rw-r--r--mod/friendrequest/languages/en.php31
-rw-r--r--mod/friendrequest/languages/es.php22
-rw-r--r--mod/friendrequest/languages/gl.php31
-rw-r--r--mod/friendrequest/languages/pt.php31
-rw-r--r--mod/friendrequest/languages/sr.php31
-rw-r--r--mod/friendrequest/manifest.xml16
-rw-r--r--mod/friendrequest/start.php151
-rw-r--r--mod/friendrequest/views/default/friendrequest/requests.php47
-rw-r--r--mod/garbagecollector/languages/en.php25
-rw-r--r--mod/garbagecollector/manifest.xml17
-rw-r--r--mod/garbagecollector/start.php63
-rw-r--r--mod/garbagecollector/views/default/plugins/garbagecollector/settings.php28
-rw-r--r--mod/graphstats/languages/ca.php17
-rw-r--r--mod/graphstats/languages/en.php17
-rw-r--r--mod/graphstats/languages/es.php17
-rw-r--r--mod/graphstats/languages/pt.php14
-rw-r--r--mod/graphstats/lib/timestats.php83
-rw-r--r--mod/graphstats/manifest.xml17
-rw-r--r--mod/graphstats/pages/graphstats/group.php42
-rw-r--r--mod/graphstats/pages/graphstats/timestats.php37
-rw-r--r--mod/graphstats/start.php72
-rw-r--r--mod/graphstats/vendors/raphaeljs/analytics.js141
-rw-r--r--mod/graphstats/vendors/raphaeljs/demo-print.css20
-rw-r--r--mod/graphstats/vendors/raphaeljs/demo.css23
-rw-r--r--mod/graphstats/vendors/raphaeljs/popup.js121
-rw-r--r--mod/graphstats/vendors/raphaeljs/raphael.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/CHANGES.txt72
-rw-r--r--mod/graphstats/vendors/simile-timeline/LICENSE.txt29
-rw-r--r--mod/graphstats/vendors/simile-timeline/README.txt88
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-bottom-arrow.pngbin0 -> 1087 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-bottom-left.pngbin0 -> 754 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-bottom-right.pngbin0 -> 803 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-bottom.pngbin0 -> 1141 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-left-arrow.pngbin0 -> 880 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-left.pngbin0 -> 5670 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-right-arrow.pngbin0 -> 941 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-right.pngbin0 -> 5686 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-top-arrow.pngbin0 -> 793 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-top-left.pngbin0 -> 560 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-top-right.pngbin0 -> 676 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/bubble-top.pngbin0 -> 905 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/close-button.pngbin0 -> 624 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/copy.pngbin0 -> 196 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-bottom-left.pngbin0 -> 1339 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-bottom-right.pngbin0 -> 2074 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-left.pngbin0 -> 717 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-right.pngbin0 -> 1892 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-top-left.pngbin0 -> 918 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/images/message-top-right.pngbin0 -> 1604 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/scripts/signal.js44
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/simile-ajax-api.js211
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_ajax/simile-ajax-bundle.js2628
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/blue-circle.pngbin0 -> 534 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-bottom-arrow.pngbin0 -> 1087 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-bottom-left.pngbin0 -> 754 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-bottom-right.pngbin0 -> 803 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-bottom.pngbin0 -> 1141 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-left-arrow.pngbin0 -> 880 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-left.pngbin0 -> 5670 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-right-arrow.pngbin0 -> 941 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-right.pngbin0 -> 5686 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-top-arrow.pngbin0 -> 793 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-top-left.pngbin0 -> 560 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-top-right.pngbin0 -> 676 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/bubble-top.pngbin0 -> 905 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/close-button.pngbin0 -> 624 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/copyright-vertical.pngbin0 -> 1695 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/copyright.pngbin0 -> 1400 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dark-blue-circle.pngbin0 -> 551 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dark-green-circle.pngbin0 -> 513 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dark-red-circle.pngbin0 -> 497 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dull-blue-circle.pngbin0 -> 539 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dull-green-circle.pngbin0 -> 539 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/dull-red-circle.pngbin0 -> 532 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/gray-circle.pngbin0 -> 513 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/green-circle.pngbin0 -> 544 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-bottom-left.pngbin0 -> 1339 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-bottom-right.pngbin0 -> 2074 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-left.pngbin0 -> 717 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-right.pngbin0 -> 1892 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-top-left.pngbin0 -> 918 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/message-top-right.pngbin0 -> 1604 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/progress-running.gifbin0 -> 1002 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/red-circle.pngbin0 -> 538 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/images/top-bubble.pngbin0 -> 6092 bytes-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/cs/labellers.js30
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/cs/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/de/labellers.js27
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/de/timeline.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/en/labellers.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/en/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/es/labellers.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/es/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/fr/labellers.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/fr/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/it/labellers.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/it/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/nl/labellers.js11
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/nl/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/ru/labellers.js10
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/ru/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/se/labellers.js12
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/se/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/tr/labellers.js8
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/tr/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/vi/labellers.js26
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/vi/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/zh/labellers.js27
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/scripts/l10n/zh/timeline.js9
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/timeline-api.js277
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/timeline-bundle.css232
-rw-r--r--mod/graphstats/vendors/simile-timeline/timeline_js/timeline-bundle.js2142
-rw-r--r--mod/graphstats/views/default/graphs/data/timestats.php33
-rw-r--r--mod/graphstats/views/default/graphs/timeline.php44
-rw-r--r--mod/graphstats/views/default/graphs/timestats.php8
-rw-r--r--mod/graphstats/views/default/graphstats/timestats_filter_menu.php31
-rw-r--r--mod/graphstats/views/default/groups/profile/activity_module.php49
-rw-r--r--mod/graphstats/views/default/js/raphael/analytics.php5
-rw-r--r--mod/graphstats/views/default/js/raphael/raphael.php3
-rw-r--r--mod/graphstats/views/default/js/timeline.php8
-rw-r--r--mod/graphstats/views/json/timeline/group.php35
-rw-r--r--mod/group_alias/COPYING661
-rw-r--r--mod/group_alias/actions/groups/edit.php247
-rw-r--r--mod/group_alias/activate.php30
-rw-r--r--mod/group_alias/languages/ca.php39
-rw-r--r--mod/group_alias/languages/en.php42
-rw-r--r--mod/group_alias/languages/es.php37
-rw-r--r--mod/group_alias/languages/fr.php39
-rw-r--r--mod/group_alias/lib/group_alias.php84
-rw-r--r--mod/group_alias/manifest.xml38
-rw-r--r--mod/group_alias/start.php188
-rw-r--r--mod/group_alias/tests/group_alias_test.php99
-rw-r--r--mod/group_alias/upgrade.php37
-rw-r--r--mod/group_alias/upgrades/2012100501.php117
-rw-r--r--mod/group_alias/views/default/group_alias/js.php36
-rw-r--r--mod/group_alias/views/default/input/group_alias.php31
-rw-r--r--mod/group_alias/views/default/output/group_alias.php46
-rw-r--r--mod/group_alias/views/default/plugins/group_alias/settings.php46
-rw-r--r--mod/groups/actions/discussion/delete.php29
-rw-r--r--mod/groups/actions/discussion/reply/delete.php26
-rw-r--r--mod/groups/actions/discussion/reply/save.php58
-rw-r--r--mod/groups/actions/discussion/save.php75
-rw-r--r--mod/groups/actions/groups/delete.php42
-rw-r--r--mod/groups/actions/groups/edit.php235
-rw-r--r--mod/groups/actions/groups/featured.php27
-rw-r--r--mod/groups/actions/groups/membership/add.php42
-rw-r--r--mod/groups/actions/groups/membership/delete_invite.php24
-rw-r--r--mod/groups/actions/groups/membership/delete_request.php20
-rw-r--r--mod/groups/actions/groups/membership/invite.php56
-rw-r--r--mod/groups/actions/groups/membership/join.php72
-rw-r--r--mod/groups/actions/groups/membership/leave.php36
-rw-r--r--mod/groups/actions/groups/membership/remove.php31
-rw-r--r--mod/groups/graphics/defaultlarge.gifbin0 -> 4939 bytes-rw-r--r--mod/groups/graphics/defaultmedium.gifbin0 -> 2336 bytes-rw-r--r--mod/groups/graphics/defaultsmall.gifbin0 -> 1127 bytes-rw-r--r--mod/groups/graphics/defaulttiny.gifbin0 -> 782 bytes-rw-r--r--mod/groups/icon.php54
-rw-r--r--mod/groups/languages/en.php299
-rw-r--r--mod/groups/lib/discussion.php235
-rw-r--r--mod/groups/lib/groups.php590
-rw-r--r--mod/groups/manifest.xml18
-rw-r--r--mod/groups/start.php1073
-rw-r--r--mod/groups/topicposts.php19
-rw-r--r--mod/groups/upgrades/2011030101.php66
-rw-r--r--mod/groups/views/default/annotation/group_topic_post.php19
-rw-r--r--mod/groups/views/default/discussion/closed.php6
-rw-r--r--mod/groups/views/default/discussion/group_module.php48
-rw-r--r--mod/groups/views/default/discussion/replies.php28
-rw-r--r--mod/groups/views/default/forms/discussion/reply/save.php57
-rw-r--r--mod/groups/views/default/forms/discussion/save.php57
-rw-r--r--mod/groups/views/default/forms/groups/edit.php178
-rw-r--r--mod/groups/views/default/forms/groups/find.php16
-rw-r--r--mod/groups/views/default/forms/groups/invite.php22
-rw-r--r--mod/groups/views/default/forms/groups/search.php20
-rw-r--r--mod/groups/views/default/group/default.php37
-rw-r--r--mod/groups/views/default/groups/css.php76
-rw-r--r--mod/groups/views/default/groups/edit.php15
-rw-r--r--mod/groups/views/default/groups/group_sort_menu.php36
-rw-r--r--mod/groups/views/default/groups/invitationrequests.php51
-rw-r--r--mod/groups/views/default/groups/js.php13
-rw-r--r--mod/groups/views/default/groups/membershiprequests.php47
-rw-r--r--mod/groups/views/default/groups/profile/activity_module.php44
-rw-r--r--mod/groups/views/default/groups/profile/closed_membership.php16
-rw-r--r--mod/groups/views/default/groups/profile/fields.php38
-rw-r--r--mod/groups/views/default/groups/profile/layout.php13
-rw-r--r--mod/groups/views/default/groups/profile/module.php25
-rw-r--r--mod/groups/views/default/groups/profile/summary.php64
-rw-r--r--mod/groups/views/default/groups/profile/widgets.php24
-rw-r--r--mod/groups/views/default/groups/sidebar/featured.php25
-rw-r--r--mod/groups/views/default/groups/sidebar/find.php14
-rw-r--r--mod/groups/views/default/groups/sidebar/members.php32
-rw-r--r--mod/groups/views/default/groups/sidebar/my_status.php62
-rw-r--r--mod/groups/views/default/groups/sidebar/search.php15
-rw-r--r--mod/groups/views/default/object/groupforumtopic.php101
-rw-r--r--mod/groups/views/default/plugins/groups/settings.php40
-rw-r--r--mod/groups/views/default/river/annotation/group_topic_post/reply.php12
-rw-r--r--mod/groups/views/default/river/group/create.php13
-rw-r--r--mod/groups/views/default/river/object/groupforumtopic/create.php22
-rw-r--r--mod/groups/views/default/river/relationship/member/create.php8
-rw-r--r--mod/groups/views/default/widgets/a_users_groups/content.php33
-rw-r--r--mod/groups/views/default/widgets/a_users_groups/edit.php25
-rw-r--r--mod/groups/views/rss/annotation/group_topic_post.php32
-rw-r--r--mod/groups/views/rss/discussion/replies.php12
-rw-r--r--mod/groups/views/rss/groups/profile/layout.php18
-rw-r--r--mod/groups/views/rss/object/groupforumtopic.php35
-rw-r--r--mod/habitorio_theme/graphics/button.pngbin0 -> 1092 bytes-rw-r--r--mod/habitorio_theme/graphics/elgg_sprites.pngbin0 -> 19372 bytes-rw-r--r--mod/habitorio_theme/graphics/login.pngbin0 -> 537 bytes-rw-r--r--mod/habitorio_theme/graphics/logo.pngbin0 -> 3067 bytes-rw-r--r--mod/habitorio_theme/graphics/menu.gifbin0 -> 3008 bytes-rw-r--r--mod/habitorio_theme/graphics/menu.pngbin0 -> 2682 bytes-rw-r--r--mod/habitorio_theme/graphics/people.pngbin0 -> 143134 bytes-rw-r--r--mod/habitorio_theme/graphics/preset1.pngbin0 -> 131 bytes-rw-r--r--mod/habitorio_theme/graphics/preset2.pngbin0 -> 131 bytes-rw-r--r--mod/habitorio_theme/graphics/preset3.pngbin0 -> 131 bytes-rw-r--r--mod/habitorio_theme/graphics/preset4.pngbin0 -> 125 bytes-rw-r--r--mod/habitorio_theme/graphics/preset5.pngbin0 -> 131 bytes-rw-r--r--mod/habitorio_theme/graphics/preset6.pngbin0 -> 131 bytes-rw-r--r--mod/habitorio_theme/graphics/preset7.pngbin0 -> 125 bytes-rw-r--r--mod/habitorio_theme/graphics/purity_01.pngbin0 -> 5204 bytes-rw-r--r--mod/habitorio_theme/graphics/purity_02.pngbin0 -> 550 bytes-rw-r--r--mod/habitorio_theme/graphics/purity_03.pngbin0 -> 2480 bytes-rw-r--r--mod/habitorio_theme/graphics/search.gifbin0 -> 819 bytes-rw-r--r--mod/habitorio_theme/graphics/search.pngbin0 -> 1589 bytes-rw-r--r--mod/habitorio_theme/graphics/sidebar_background.gifbin0 -> 1355 bytes-rw-r--r--mod/habitorio_theme/graphics/spacer.gifbin0 -> 175 bytes-rw-r--r--mod/habitorio_theme/graphics/topbar.gifbin0 -> 2756 bytes-rw-r--r--mod/habitorio_theme/manifest.xml18
-rw-r--r--mod/habitorio_theme/start.php84
-rw-r--r--mod/habitorio_theme/views/default/css/admin.php1443
-rw-r--r--mod/habitorio_theme/views/default/css/elements/OOCSS_LICENSE30
-rw-r--r--mod/habitorio_theme/views/default/css/elements/buttons.php132
-rw-r--r--mod/habitorio_theme/views/default/css/elements/components.php286
-rw-r--r--mod/habitorio_theme/views/default/css/elements/core.php117
-rw-r--r--mod/habitorio_theme/views/default/css/elements/forms.php298
-rw-r--r--mod/habitorio_theme/views/default/css/elements/grid.php54
-rw-r--r--mod/habitorio_theme/views/default/css/elements/helpers.php160
-rw-r--r--mod/habitorio_theme/views/default/css/elements/icons.php348
-rw-r--r--mod/habitorio_theme/views/default/css/elements/layout.php142
-rw-r--r--mod/habitorio_theme/views/default/css/elements/misc.php62
-rw-r--r--mod/habitorio_theme/views/default/css/elements/modules.php194
-rw-r--r--mod/habitorio_theme/views/default/css/elements/navigation.php559
-rw-r--r--mod/habitorio_theme/views/default/css/elements/reset.php79
-rw-r--r--mod/habitorio_theme/views/default/css/elements/typography.php155
-rw-r--r--mod/habitorio_theme/views/default/css/elgg.php68
-rw-r--r--mod/habitorio_theme/views/default/css/ie.php8
-rw-r--r--mod/habitorio_theme/views/default/css/ie6.php12
-rw-r--r--mod/habitorio_theme/views/default/css/ie7.php65
-rw-r--r--mod/habitorio_theme/views/default/css/lightbox.php371
-rw-r--r--mod/habitorio_theme/views/default/css/walled_garden.php81
-rw-r--r--mod/habitorio_theme/views/default/custom_index/css.php17
-rw-r--r--mod/habitorio_theme/views/default/habitorio_theme/css.php178
-rw-r--r--mod/habitorio_theme/views/default/habitorio_theme/leftside.php5
-rw-r--r--mod/habitorio_theme/views/default/habitorio_theme/rightside.php5
-rw-r--r--mod/habitorio_theme/views/default/page/default.php58
-rw-r--r--mod/habitorio_theme/views/default/page/elements/footer.php12
-rw-r--r--mod/habitorio_theme/views/default/page/elements/header.php22
-rw-r--r--mod/habitorio_theme/views/default/page/elements/header_logo.php21
-rw-r--r--mod/habitorio_theme/views/default/page/elements/messages.php27
-rw-r--r--mod/habitorio_theme/views/default/page/elements/topbar.php25
-rw-r--r--mod/habitorio_theme/views/default/page/layouts/custom_index.php48
-rw-r--r--mod/habitorio_theme/views/default/plugins/purity_theme/settings.php24
-rw-r--r--mod/html5/.gitignore3
-rw-r--r--mod/html5/README7
-rw-r--r--mod/html5/manifest.xml15
-rw-r--r--mod/html5/start.php11
-rw-r--r--mod/html5/vendors/Modernizr-1.5.min.js28
-rw-r--r--mod/html5/vendors/jquery/jquery.placeholder-1.0.1.js58
-rw-r--r--mod/html5/views/default/html/img.php11
-rw-r--r--mod/html5/views/default/html5/css.php2
-rw-r--r--mod/html5/views/default/html5/theme_preview/forms/inputs.php101
-rw-r--r--mod/html5/views/default/input/color.php12
-rw-r--r--mod/html5/views/default/input/datetime-local.php14
-rw-r--r--mod/html5/views/default/input/datetime.php15
-rw-r--r--mod/html5/views/default/input/image.php11
-rw-r--r--mod/html5/views/default/input/month.php16
-rw-r--r--mod/html5/views/default/input/number.php11
-rw-r--r--mod/html5/views/default/input/option.php13
-rw-r--r--mod/html5/views/default/input/range.php13
-rw-r--r--mod/html5/views/default/input/search.php13
-rw-r--r--mod/html5/views/default/input/tel.php12
-rw-r--r--mod/html5/views/default/input/time.php13
-rw-r--r--mod/html5/views/default/input/week.php13
-rw-r--r--mod/html5/views/default/output/friendlytime.php14
-rw-r--r--mod/html5/views/default/page/admin.php68
-rw-r--r--mod/html5/views/default/page/default.php78
-rw-r--r--mod/html5/views/default/page/elements/footer.php23
-rw-r--r--mod/html5/views/default/page/elements/head.php78
-rw-r--r--mod/html5/views/default/page/layouts/admin.php42
-rw-r--r--mod/html5/views/default/page/layouts/one_sidebar.php50
-rw-r--r--mod/html5/views/default/page/layouts/two_sidebar.php45
-rw-r--r--mod/html5/views/default/page/walled_garden.php42
-rw-r--r--mod/html5/views/default/search/search_box.php43
-rw-r--r--mod/htmlawed/manifest.xml17
-rw-r--r--mod/htmlawed/start.php163
-rw-r--r--mod/htmlawed/tests/tags.php47
-rwxr-xr-xmod/htmlawed/vendors/htmLawed/htmLawed.php723
-rwxr-xr-xmod/htmlawed/vendors/htmLawed/htmLawedTest.php650
-rwxr-xr-xmod/htmlawed/vendors/htmLawed/htmLawed_README.htm2178
-rwxr-xr-xmod/htmlawed/vendors/htmLawed/htmLawed_README.txt1734
-rwxr-xr-xmod/htmlawed/vendors/htmLawed/htmLawed_TESTCASE.txt450
-rw-r--r--mod/identica/graphics/identica.pngbin0 -> 488 bytes-rw-r--r--mod/identica/graphics/thewire_speech_bubble.gifbin0 -> 560 bytes-rw-r--r--mod/identica/languages/ca.php10
-rw-r--r--mod/identica/languages/en.php16
-rw-r--r--mod/identica/languages/es.php12
-rw-r--r--mod/identica/manifest.xml17
-rw-r--r--mod/identica/start.php16
-rw-r--r--mod/identica/views/default/identica/css.php63
-rw-r--r--mod/identica/views/default/identica/js.php40
-rw-r--r--mod/identica/views/default/js/friendly_time.php50
-rw-r--r--mod/identica/views/default/widgets/identica/content.php30
-rw-r--r--mod/identica/views/default/widgets/identica/edit.php16
-rw-r--r--mod/infinite_scroll/languages/en.php18
-rw-r--r--mod/infinite_scroll/languages/es.php18
-rw-r--r--mod/infinite_scroll/manifest.xml16
-rw-r--r--mod/infinite_scroll/start.php44
m---------mod/infinite_scroll/vendors/jquery-waypoints0
-rw-r--r--mod/infinite_scroll/views/default/infinite_scroll/css.php18
-rw-r--r--mod/infinite_scroll/views/default/infinite_scroll/initialize_js.php5
-rw-r--r--mod/infinite_scroll/views/default/infinite_scroll/list.php83
-rw-r--r--mod/infinite_scroll/views/default/js/infinite_scroll/automatic_pagination.php34
-rw-r--r--mod/infinite_scroll/views/default/js/infinite_scroll/infinite_scroll.php88
-rw-r--r--mod/infinite_scroll/views/default/js/infinite_scroll/new_items.php62
-rw-r--r--mod/infinite_scroll/views/default/plugins/infinite_scroll/usersettings.php25
-rw-r--r--mod/invitefriends/actions/invite.php88
-rw-r--r--mod/invitefriends/languages/en.php43
-rw-r--r--mod/invitefriends/manifest.xml17
-rw-r--r--mod/invitefriends/start.php50
-rw-r--r--mod/invitefriends/views/default/forms/invitefriends/invite.php35
-rw-r--r--mod/invitefriends/views/default/invitefriends/form.php8
-rw-r--r--mod/invitefriends/views/default/invitefriends/formitems.php4
-rw-r--r--mod/landing/languages/en.php18
-rw-r--r--mod/landing/manifest.xml29
-rw-r--r--mod/landing/start.php78
-rw-r--r--mod/landing/test/landing_test.php117
-rw-r--r--mod/landing/views/default/landing/css.php1
-rw-r--r--mod/landing/views/default/usersettings/landing/edit.php27
-rw-r--r--mod/languages/README.txt9
-rw-r--r--mod/languages/languages/ca/ca.blog.php54
-rw-r--r--mod/languages/languages/ca/ca.bookmarks.php51
-rw-r--r--mod/languages/languages/ca/ca.categories.php12
-rw-r--r--mod/languages/languages/ca/ca.core.php994
-rw-r--r--mod/languages/languages/ca/ca.custom_index.php11
-rw-r--r--mod/languages/languages/ca/ca.dashboard.php11
-rw-r--r--mod/languages/languages/ca/ca.developers.php47
-rw-r--r--mod/languages/languages/ca/ca.diagnostics.php30
-rw-r--r--mod/languages/languages/ca/ca.embed.php14
-rw-r--r--mod/languages/languages/ca/ca.externalpages.php15
-rw-r--r--mod/languages/languages/ca/ca.file.php74
-rw-r--r--mod/languages/languages/ca/ca.garbagecollector.php17
-rw-r--r--mod/languages/languages/ca/ca.groups.php219
-rw-r--r--mod/languages/languages/ca/ca.invitefriends.php26
-rw-r--r--mod/languages/languages/ca/ca.likes.php34
-rw-r--r--mod/languages/languages/ca/ca.logbrowser20
-rw-r--r--mod/languages/languages/ca/ca.logrotate.php20
-rw-r--r--mod/languages/languages/ca/ca.members.php13
-rw-r--r--mod/languages/languages/ca/ca.messageboard.php43
-rw-r--r--mod/languages/languages/ca/ca.messages.php64
-rw-r--r--mod/languages/languages/ca/ca.notifications.php16
-rw-r--r--mod/languages/languages/ca/ca.pages.php62
-rw-r--r--mod/languages/languages/ca/ca.profile.php8
-rw-r--r--mod/languages/languages/ca/ca.relatedgroups.php11
-rw-r--r--mod/languages/languages/ca/ca.reportedcontent.php34
-rw-r--r--mod/languages/languages/ca/ca.search.php18
-rw-r--r--mod/languages/languages/ca/ca.subgroups.php22
-rw-r--r--mod/languages/languages/ca/ca.tagcloud.php7
-rw-r--r--mod/languages/languages/ca/ca.thewire.php34
-rw-r--r--mod/languages/languages/ca/ca.tinymce.php8
-rw-r--r--mod/languages/languages/ca/ca.twitter.php10
-rw-r--r--mod/languages/languages/ca/ca.uservalidationbyemail.php48
-rw-r--r--mod/languages/languages/da/da.blog.php70
-rw-r--r--mod/languages/languages/da/da.bookmarks.php82
-rw-r--r--mod/languages/languages/da/da.categories.php15
-rw-r--r--mod/languages/languages/da/da.custom_index.php14
-rw-r--r--mod/languages/languages/da/da.developers.php60
-rw-r--r--mod/languages/languages/da/da.diagnostics.php70
-rw-r--r--mod/languages/languages/da/da.embed.php21
-rw-r--r--mod/languages/languages/da/da.event_manager.php302
-rw-r--r--mod/languages/languages/da/da.externalpages.php30
-rw-r--r--mod/languages/languages/da/da.file.php106
-rw-r--r--mod/languages/languages/da/da.garbagecollector.php26
-rw-r--r--mod/languages/languages/da/da.groups.php265
-rw-r--r--mod/languages/languages/da/da.image_captcha.php31
-rw-r--r--mod/languages/languages/da/da.invitefriends.php42
-rw-r--r--mod/languages/languages/da/da.likes.php25
-rw-r--r--mod/languages/languages/da/da.logbrowser.php27
-rw-r--r--mod/languages/languages/da/da.logrotate.php29
-rw-r--r--mod/languages/languages/da/da.market.php148
-rw-r--r--mod/languages/languages/da/da.members.php16
-rw-r--r--mod/languages/languages/da/da.menu_builder.php49
-rw-r--r--mod/languages/languages/da/da.messageboard.php73
-rw-r--r--mod/languages/languages/da/da.messages.php95
-rw-r--r--mod/languages/languages/da/da.notifications.php31
-rw-r--r--mod/languages/languages/da/da.pages.php104
-rw-r--r--mod/languages/languages/da/da.php1343
-rw-r--r--mod/languages/languages/da/da.profile.php13
-rw-r--r--mod/languages/languages/da/da.reportedcontent.php44
-rw-r--r--mod/languages/languages/da/da.river_activity_3C.php142
-rw-r--r--mod/languages/languages/da/da.roles_group_admins.php20
-rw-r--r--mod/languages/languages/da/da.search.php25
-rw-r--r--mod/languages/languages/da/da.tagcloud.php12
-rw-r--r--mod/languages/languages/da/da.tasks.php144
-rw-r--r--mod/languages/languages/da/da.thewire.php60
-rw-r--r--mod/languages/languages/da/da.tidypics.php190
-rw-r--r--mod/languages/languages/da/da.tinymce.php13
-rw-r--r--mod/languages/languages/da/da.twitter.php17
-rw-r--r--mod/languages/languages/da/da.twitter_api.php35
-rw-r--r--mod/languages/languages/da/da.uservalidationbyemail.php63
-rw-r--r--mod/languages/languages/de/de.blog.php50
-rw-r--r--mod/languages/languages/de/de.bookmarks.php46
-rw-r--r--mod/languages/languages/de/de.categories.php12
-rw-r--r--mod/languages/languages/de/de.core.php969
-rw-r--r--mod/languages/languages/de/de.custom_index.php11
-rw-r--r--mod/languages/languages/de/de.dashboard.php11
-rw-r--r--mod/languages/languages/de/de.developers.php43
-rw-r--r--mod/languages/languages/de/de.diagnostics.php39
-rw-r--r--mod/languages/languages/de/de.embed.php14
-rw-r--r--mod/languages/languages/de/de.externalpages.php15
-rw-r--r--mod/languages/languages/de/de.file.php69
-rw-r--r--mod/languages/languages/de/de.garbagecollector.php18
-rw-r--r--mod/languages/languages/de/de.groups.php204
-rw-r--r--mod/languages/languages/de/de.install.php156
-rw-r--r--mod/languages/languages/de/de.invitefriends.php30
-rw-r--r--mod/languages/languages/de/de.likes.php36
-rw-r--r--mod/languages/languages/de/de.logbrowser.php20
-rw-r--r--mod/languages/languages/de/de.logrotate.php22
-rw-r--r--mod/languages/languages/de/de.members.php13
-rw-r--r--mod/languages/languages/de/de.messageboard.php43
-rw-r--r--mod/languages/languages/de/de.messages.php60
-rw-r--r--mod/languages/languages/de/de.notifications.php18
-rw-r--r--mod/languages/languages/de/de.pages.php54
-rw-r--r--mod/languages/languages/de/de.profile.php8
-rw-r--r--mod/languages/languages/de/de.reportedcontent.php44
-rw-r--r--mod/languages/languages/de/de.search.php18
-rw-r--r--mod/languages/languages/de/de.tagcloud.php9
-rw-r--r--mod/languages/languages/de/de.thewire.php36
-rw-r--r--mod/languages/languages/de/de.tinymce.php9
-rw-r--r--mod/languages/languages/de/de.twitter.php12
-rw-r--r--mod/languages/languages/de/de.twitter_api.php60
-rw-r--r--mod/languages/languages/de/de.uservalidationbyemail.php51
-rw-r--r--mod/languages/languages/en/en.core.php39
-rw-r--r--mod/languages/languages/es/es.blog.php57
-rw-r--r--mod/languages/languages/es/es.bookmarks.php55
-rw-r--r--mod/languages/languages/es/es.categories.php12
-rw-r--r--mod/languages/languages/es/es.core.php1001
-rw-r--r--mod/languages/languages/es/es.custom_index.php11
-rw-r--r--mod/languages/languages/es/es.custom_keys.php5
-rw-r--r--mod/languages/languages/es/es.dashboard.php11
-rw-r--r--mod/languages/languages/es/es.developers.php49
-rw-r--r--mod/languages/languages/es/es.diagnostics.php40
-rw-r--r--mod/languages/languages/es/es.embed.php14
-rw-r--r--mod/languages/languages/es/es.externalpages.php15
-rw-r--r--mod/languages/languages/es/es.file.php76
-rw-r--r--mod/languages/languages/es/es.garbagecollector.php18
-rw-r--r--mod/languages/languages/es/es.groups.php213
-rw-r--r--mod/languages/languages/es/es.install.php156
-rw-r--r--mod/languages/languages/es/es.invitefriends.php29
-rw-r--r--mod/languages/languages/es/es.likes.php36
-rw-r--r--mod/languages/languages/es/es.logbrowser.php21
-rw-r--r--mod/languages/languages/es/es.logrotate.php22
-rw-r--r--mod/languages/languages/es/es.members.php13
-rw-r--r--mod/languages/languages/es/es.messageboard.php43
-rw-r--r--mod/languages/languages/es/es.messages.php66
-rw-r--r--mod/languages/languages/es/es.notifications.php18
-rw-r--r--mod/languages/languages/es/es.pages.php62
-rw-r--r--mod/languages/languages/es/es.profile.php8
-rw-r--r--mod/languages/languages/es/es.reportedcontent.php36
-rw-r--r--mod/languages/languages/es/es.search.php18
-rw-r--r--mod/languages/languages/es/es.tagcloud.php9
-rw-r--r--mod/languages/languages/es/es.thewire.php36
-rw-r--r--mod/languages/languages/es/es.tinymce.php9
-rw-r--r--mod/languages/languages/es/es.twitter.php12
-rw-r--r--mod/languages/languages/es/es.twitter_api.php58
-rw-r--r--mod/languages/languages/es/es.uservalidationbyemail.php64
-rw-r--r--mod/languages/languages/eu/eu.blog.php57
-rw-r--r--mod/languages/languages/eu/eu.bookmarks.php53
-rw-r--r--mod/languages/languages/eu/eu.categories.php11
-rw-r--r--mod/languages/languages/eu/eu.core.php996
-rw-r--r--mod/languages/languages/eu/eu.custom_index.php10
-rw-r--r--mod/languages/languages/eu/eu.dashboard.php10
-rw-r--r--mod/languages/languages/eu/eu.developers.php48
-rw-r--r--mod/languages/languages/eu/eu.diagnostics.php39
-rw-r--r--mod/languages/languages/eu/eu.embed.php13
-rw-r--r--mod/languages/languages/eu/eu.externalpages.php14
-rw-r--r--mod/languages/languages/eu/eu.file.php76
-rw-r--r--mod/languages/languages/eu/eu.garbagecollector.php17
-rw-r--r--mod/languages/languages/eu/eu.groups.php213
-rw-r--r--mod/languages/languages/eu/eu.install.php134
-rw-r--r--mod/languages/languages/eu/eu.invitefriends.php29
-rw-r--r--mod/languages/languages/eu/eu.likes.php35
-rw-r--r--mod/languages/languages/eu/eu.logbrowser.php21
-rw-r--r--mod/languages/languages/eu/eu.logrotate.php21
-rw-r--r--mod/languages/languages/eu/eu.members.php12
-rw-r--r--mod/languages/languages/eu/eu.messageboard.php42
-rw-r--r--mod/languages/languages/eu/eu.messages.php65
-rw-r--r--mod/languages/languages/eu/eu.notifications.php17
-rw-r--r--mod/languages/languages/eu/eu.pages.php62
-rw-r--r--mod/languages/languages/eu/eu.profile.php7
-rw-r--r--mod/languages/languages/eu/eu.reportedcontent.php35
-rw-r--r--mod/languages/languages/eu/eu.search.php17
-rw-r--r--mod/languages/languages/eu/eu.tagcloud.php8
-rw-r--r--mod/languages/languages/eu/eu.thewire.php35
-rw-r--r--mod/languages/languages/eu/eu.tinymce.php8
-rw-r--r--mod/languages/languages/eu/eu.twitter.php11
-rw-r--r--mod/languages/languages/eu/eu.twitter_api.php40
-rw-r--r--mod/languages/languages/eu/eu.uservalidationbyemail.php50
-rw-r--r--mod/languages/languages/fr/fr.blog.php69
-rw-r--r--mod/languages/languages/fr/fr.bookmarks.php82
-rw-r--r--mod/languages/languages/fr/fr.categories.php15
-rw-r--r--mod/languages/languages/fr/fr.custom_index.php14
-rw-r--r--mod/languages/languages/fr/fr.dashboard.php14
-rw-r--r--mod/languages/languages/fr/fr.developers.php61
-rw-r--r--mod/languages/languages/fr/fr.diagnostics.php70
-rw-r--r--mod/languages/languages/fr/fr.embed.php21
-rw-r--r--mod/languages/languages/fr/fr.externalpages.php27
-rw-r--r--mod/languages/languages/fr/fr.file.php110
-rw-r--r--mod/languages/languages/fr/fr.garbagecollector.php25
-rw-r--r--mod/languages/languages/fr/fr.groups.php265
-rw-r--r--mod/languages/languages/fr/fr.install.php156
-rw-r--r--mod/languages/languages/fr/fr.invitefriends.php43
-rw-r--r--mod/languages/languages/fr/fr.likes.php44
-rw-r--r--mod/languages/languages/fr/fr.logbrowser.php27
-rw-r--r--mod/languages/languages/fr/fr.logrotate.php28
-rw-r--r--mod/languages/languages/fr/fr.members.php16
-rw-r--r--mod/languages/languages/fr/fr.messageboard.php72
-rw-r--r--mod/languages/languages/fr/fr.messages.php96
-rw-r--r--mod/languages/languages/fr/fr.notifications.php26
-rw-r--r--mod/languages/languages/fr/fr.pages.php104
-rw-r--r--mod/languages/languages/fr/fr.php1310
-rw-r--r--mod/languages/languages/fr/fr.profile.php12
-rw-r--r--mod/languages/languages/fr/fr.reportedcontent.php44
-rw-r--r--mod/languages/languages/fr/fr.search.php21
-rw-r--r--mod/languages/languages/fr/fr.tagcloud.php12
-rw-r--r--mod/languages/languages/fr/fr.thewire.php61
-rw-r--r--mod/languages/languages/fr/fr.tinymce.php14
-rw-r--r--mod/languages/languages/fr/fr.twitter.php7
-rw-r--r--mod/languages/languages/fr/fr.twitter_api.php59
-rw-r--r--mod/languages/languages/fr/fr.uservalidationbyemail.php64
-rw-r--r--mod/languages/languages/gl/gl.blog.php16
-rw-r--r--mod/languages/languages/gl/gl.bookmarks.php40
-rw-r--r--mod/languages/languages/gl/gl.core.php664
-rw-r--r--mod/languages/languages/gl/gl.custom_index.php11
-rw-r--r--mod/languages/languages/gl/gl.embed.php8
-rw-r--r--mod/languages/languages/gl/gl.externalpages.php14
-rw-r--r--mod/languages/languages/gl/gl.file.php61
-rw-r--r--mod/languages/languages/gl/gl.groups.php143
-rw-r--r--mod/languages/languages/gl/gl.messageboard.php36
-rw-r--r--mod/languages/languages/gl/gl.messages.php52
-rw-r--r--mod/languages/languages/gl/gl.pages.php42
-rw-r--r--mod/languages/languages/gl/gl.profile.php8
-rw-r--r--mod/languages/languages/gl/gl.reportedcontent.php7
-rw-r--r--mod/languages/languages/gl/gl.uservalidationbyemail.php8
-rw-r--r--mod/languages/languages/it/it.blog.php12
-rw-r--r--mod/languages/languages/it/it.bookmarks.php31
-rw-r--r--mod/languages/languages/it/it.categories.php10
-rw-r--r--mod/languages/languages/it/it.core.php707
-rw-r--r--mod/languages/languages/it/it.custom_index.php11
-rw-r--r--mod/languages/languages/it/it.file.php53
-rw-r--r--mod/languages/languages/it/it.groups.php141
-rw-r--r--mod/languages/languages/it/it.messageboard.php39
-rw-r--r--mod/languages/languages/it/it.messages.php56
-rw-r--r--mod/languages/languages/it/it.pages.php41
-rw-r--r--mod/languages/languages/it/it.profile.php8
-rw-r--r--mod/languages/languages/it/it.reportedcontent.php7
-rw-r--r--mod/languages/languages/ja/ja.blog.php12
-rw-r--r--mod/languages/languages/ja/ja.bookmarks.php37
-rw-r--r--mod/languages/languages/ja/ja.categories.php11
-rw-r--r--mod/languages/languages/ja/ja.core.php661
-rw-r--r--mod/languages/languages/ja/ja.custom_index.php11
-rw-r--r--mod/languages/languages/ja/ja.embed.php8
-rw-r--r--mod/languages/languages/ja/ja.externalpages.php14
-rw-r--r--mod/languages/languages/ja/ja.file.php61
-rw-r--r--mod/languages/languages/ja/ja.groups.php155
-rw-r--r--mod/languages/languages/ja/ja.messageboard.php41
-rw-r--r--mod/languages/languages/ja/ja.messages.php55
-rw-r--r--mod/languages/languages/ja/ja.pages.php43
-rw-r--r--mod/languages/languages/ja/ja.reportedcontent.php30
-rw-r--r--mod/languages/languages/nl/nl.blog.php50
-rw-r--r--mod/languages/languages/nl/nl.bookmarks.php46
-rw-r--r--mod/languages/languages/nl/nl.categories.php12
-rw-r--r--mod/languages/languages/nl/nl.core.php947
-rw-r--r--mod/languages/languages/nl/nl.custom_index.php11
-rw-r--r--mod/languages/languages/nl/nl.dashboard.php11
-rw-r--r--mod/languages/languages/nl/nl.developers.php43
-rw-r--r--mod/languages/languages/nl/nl.diagnostics.php32
-rw-r--r--mod/languages/languages/nl/nl.embed.php14
-rw-r--r--mod/languages/languages/nl/nl.externalpages.php15
-rw-r--r--mod/languages/languages/nl/nl.file.php69
-rw-r--r--mod/languages/languages/nl/nl.garbagecollector.php18
-rw-r--r--mod/languages/languages/nl/nl.groups.php205
-rw-r--r--mod/languages/languages/nl/nl.invitefriends.php28
-rw-r--r--mod/languages/languages/nl/nl.likes.php31
-rw-r--r--mod/languages/languages/nl/nl.logbrowser.php20
-rw-r--r--mod/languages/languages/nl/nl.logrotate.php18
-rw-r--r--mod/languages/languages/nl/nl.members.php13
-rw-r--r--mod/languages/languages/nl/nl.messageboard.php41
-rw-r--r--mod/languages/languages/nl/nl.messages.php63
-rw-r--r--mod/languages/languages/nl/nl.notifications.php18
-rw-r--r--mod/languages/languages/nl/nl.pages.php54
-rw-r--r--mod/languages/languages/nl/nl.profile.php8
-rw-r--r--mod/languages/languages/nl/nl.reportedcontent.php36
-rw-r--r--mod/languages/languages/nl/nl.search.php18
-rw-r--r--mod/languages/languages/nl/nl.tagcloud.php9
-rw-r--r--mod/languages/languages/nl/nl.thewire.php36
-rw-r--r--mod/languages/languages/nl/nl.tinymce.php9
-rw-r--r--mod/languages/languages/nl/nl.twitter.php12
-rw-r--r--mod/languages/languages/nl/nl.twitter_api.php41
-rw-r--r--mod/languages/languages/nl/nl.uservalidationbyemail.php49
-rw-r--r--mod/languages/languages/pt/pt.blog.php50
-rw-r--r--mod/languages/languages/pt/pt.bookmarks.php46
-rw-r--r--mod/languages/languages/pt/pt.brainstorm.php63
-rw-r--r--mod/languages/languages/pt/pt.categories.php12
-rw-r--r--mod/languages/languages/pt/pt.core.php966
-rw-r--r--mod/languages/languages/pt/pt.custom_index.php11
-rw-r--r--mod/languages/languages/pt/pt.dashboard.php11
-rw-r--r--mod/languages/languages/pt/pt.developers.php43
-rw-r--r--mod/languages/languages/pt/pt.diagnostics.php34
-rw-r--r--mod/languages/languages/pt/pt.embed.php14
-rw-r--r--mod/languages/languages/pt/pt.externalpages.php15
-rw-r--r--mod/languages/languages/pt/pt.file.php69
-rw-r--r--mod/languages/languages/pt/pt.garbagecollector.php17
-rw-r--r--mod/languages/languages/pt/pt.groups.php204
-rw-r--r--mod/languages/languages/pt/pt.install.php132
-rw-r--r--mod/languages/languages/pt/pt.invitefriends.php36
-rw-r--r--mod/languages/languages/pt/pt.likes.php35
-rw-r--r--mod/languages/languages/pt/pt.logbrowser.php20
-rw-r--r--mod/languages/languages/pt/pt.logrotate.php20
-rw-r--r--mod/languages/languages/pt/pt.members.php13
-rw-r--r--mod/languages/languages/pt/pt.messageboard.php43
-rw-r--r--mod/languages/languages/pt/pt.messages.php66
-rw-r--r--mod/languages/languages/pt/pt.moderated_comments.php48
-rw-r--r--mod/languages/languages/pt/pt.notifications.php20
-rw-r--r--mod/languages/languages/pt/pt.pages.php55
-rw-r--r--mod/languages/languages/pt/pt.profile.php8
-rw-r--r--mod/languages/languages/pt/pt.reportedcontent.php36
-rw-r--r--mod/languages/languages/pt/pt.search.php18
-rw-r--r--mod/languages/languages/pt/pt.spam_login_filter.php80
-rw-r--r--mod/languages/languages/pt/pt.speak_freely.php55
-rw-r--r--mod/languages/languages/pt/pt.tagcloud.php9
-rw-r--r--mod/languages/languages/pt/pt.thewire.php37
-rw-r--r--mod/languages/languages/pt/pt.tinymce.php9
-rw-r--r--mod/languages/languages/pt/pt.twitter.php12
-rw-r--r--mod/languages/languages/pt/pt.twitter_api.php43
-rw-r--r--mod/languages/languages/pt/pt.uservalidationbyemail.php51
-rw-r--r--mod/languages/languages/sr/sr.blog.php12
-rw-r--r--mod/languages/languages/sr/sr.core.php389
-rw-r--r--mod/languages/languages/sr/sr.custom_index.php10
-rw-r--r--mod/languages/languages/sr/sr.externalpages.php10
-rw-r--r--mod/languages/languages/sr/sr.file.php7
-rw-r--r--mod/languages/languages/sr/sr.friendrequest.php20
-rw-r--r--mod/languages/languages/sr/sr.groups.php148
-rw-r--r--mod/languages/languages/sr/sr.messageboard.php38
-rw-r--r--mod/languages/languages/sr/sr.messages.php55
-rw-r--r--mod/languages/languages/sr/sr.pages.php7
-rw-r--r--mod/languages/languages/sr/sr.profile.php8
-rw-r--r--mod/languages/languages/sr/sr.reportedcontent.php30
-rw-r--r--mod/languages/languages/th/th.core.php651
-rw-r--r--mod/languages/languages/zh/zh.blog.php69
-rw-r--r--mod/languages/languages/zh/zh.core.php662
-rw-r--r--mod/languages/languages/zh/zh.profile.php8
-rw-r--r--mod/languages/manifest.xml16
-rw-r--r--mod/languages/start.php55
-rw-r--r--mod/languages/views/default/js/languages/ca.php2
-rw-r--r--mod/languages/views/default/js/languages/da.php2
-rw-r--r--mod/languages/views/default/js/languages/de.php2
-rw-r--r--mod/languages/views/default/js/languages/en.php2
-rw-r--r--mod/languages/views/default/js/languages/es.php2
-rw-r--r--mod/languages/views/default/js/languages/eu.php2
-rw-r--r--mod/languages/views/default/js/languages/fr.php2
-rw-r--r--mod/languages/views/default/js/languages/gl.php2
-rw-r--r--mod/languages/views/default/js/languages/it.php2
-rw-r--r--mod/languages/views/default/js/languages/ja.php2
-rw-r--r--mod/languages/views/default/js/languages/nl.php2
-rw-r--r--mod/languages/views/default/js/languages/pt.php2
-rw-r--r--mod/languages/views/default/js/languages/sr.php2
-rw-r--r--mod/languages/views/default/js/languages/th.php2
-rw-r--r--mod/languages/views/default/js/languages/zh.php2
-rw-r--r--mod/less/manifest.xml16
-rw-r--r--mod/less/start.php104
-rw-r--r--mod/less/vendors/lessphp/.gitignore8
-rw-r--r--mod/less/vendors/lessphp/LICENSE660
-rw-r--r--mod/less/vendors/lessphp/README.md69
-rw-r--r--mod/less/vendors/lessphp/composer.json20
-rw-r--r--mod/less/vendors/lessphp/docs/docs.md1168
-rw-r--r--mod/less/vendors/lessphp/lessc.inc.php2910
-rwxr-xr-xmod/less/vendors/lessphp/lessify23
-rw-r--r--mod/less/vendors/lessphp/lessify.inc.php447
-rwxr-xr-xmod/less/vendors/lessphp/package.sh22
-rwxr-xr-xmod/less/vendors/lessphp/plessc217
-rw-r--r--mod/less/vendors/lessphp/tests/README.md24
-rwxr-xr-xmod/less/vendors/lessphp/tests/bootstrap.sh49
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/accessors.less.disable36
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/arity.less77
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/attributes.less41
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/builtins.less36
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/colors.less122
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/compile_on_mixin.less39
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/escape.less20
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/font_family.less28
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/guards.less88
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/hacks.less6
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/import.less21
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/keyframes.less52
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/math.less116
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/media.less38
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/misc.less84
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/mixin_functions.less40
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/mixin_merging.less.disable100
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/mixins.less126
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/nested.less60
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/pattern_matching.less167
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/scopes.less40
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/selector_expressions.less29
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/site_demos.less120
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/test-imports/file1.less16
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/test-imports/file2.less6
-rw-r--r--mod/less/vendors/lessphp/tests/inputs/variables.less45
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/accessors.css14
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/arity.css25
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/attributes.css35
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/builtins.css20
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/colors.css69
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/compile_on_mixin.css11
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/escape.css14
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/font_family.css17
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/guards.css23
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/hacks.css1
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/import.css14
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/keyframes.css47
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/math.css61
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/media.css28
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/misc.css40
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/mixin_functions.css14
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/mixin_merging.css42
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/mixins.css50
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/nested.css16
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/nesting.css6
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/pattern_matching.css56
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/scopes.css7
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/selector_expressions.css8
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/site_demos.css54
-rw-r--r--mod/less/vendors/lessphp/tests/outputs/variables.css20
-rw-r--r--mod/less/vendors/lessphp/tests/sort.php57
-rw-r--r--mod/less/vendors/lessphp/tests/test.php190
-rw-r--r--mod/lightbox/actions/lightbox/edit.php91
-rw-r--r--mod/lightbox/classes/LightboxPluginAlbum.php31
-rw-r--r--mod/lightbox/classes/LightboxPluginImage.php31
-rw-r--r--mod/lightbox/graphics/defaultmedium.jpgbin0 -> 7036 bytes-rw-r--r--mod/lightbox/graphics/defaultsmall.jpgbin0 -> 2393 bytes-rw-r--r--mod/lightbox/graphics/defaulttiny.jpgbin0 -> 1733 bytes-rw-r--r--mod/lightbox/languages/en.php76
-rw-r--r--mod/lightbox/lib/lightbox.php107
-rw-r--r--mod/lightbox/manifest.xml18
-rw-r--r--mod/lightbox/pages/lightbox/friends.php34
-rw-r--r--mod/lightbox/pages/lightbox/new.php37
-rw-r--r--mod/lightbox/pages/lightbox/owner.php55
-rw-r--r--mod/lightbox/pages/lightbox/view.php39
-rw-r--r--mod/lightbox/pages/lightbox/world.php33
-rw-r--r--mod/lightbox/start.php190
-rw-r--r--mod/lightbox/thumbnail.php55
-rw-r--r--mod/lightbox/vendors/lightbox/images/lightbox-blank.gifbin0 -> 43 bytes-rw-r--r--mod/lightbox/vendors/lightbox/images/lightbox-btn-close.gifbin0 -> 700 bytes-rw-r--r--mod/lightbox/vendors/lightbox/images/lightbox-btn-next.gifbin0 -> 812 bytes-rw-r--r--mod/lightbox/vendors/lightbox/images/lightbox-btn-prev.gifbin0 -> 832 bytes-rw-r--r--mod/lightbox/vendors/lightbox/images/lightbox-ico-loading.gifbin0 -> 3990 bytes-rw-r--r--mod/lightbox/vendors/lightbox/jquery.lightbox-0.5.css101
-rw-r--r--mod/lightbox/vendors/lightbox/jquery.lightbox-0.5.min.js42
-rw-r--r--mod/lightbox/views/default/forms/lightbox/edit.php74
-rw-r--r--mod/lightbox/views/default/forms/lightbox/images/edit.php0
-rw-r--r--mod/lightbox/views/default/js/lightbox/album.php8
-rw-r--r--mod/lightbox/views/default/lightbox/image.php16
-rw-r--r--mod/lightbox/views/default/object/album.php117
-rw-r--r--mod/lightbox/views/default/object/image.php100
-rw-r--r--mod/lightpics/CONFIG.txt73
-rw-r--r--mod/lightpics/FAQ.txt31
-rw-r--r--mod/lightpics/actions/photos/admin/create_thumbnails.php70
-rw-r--r--mod/lightpics/actions/photos/admin/imtest.php18
-rw-r--r--mod/lightpics/actions/photos/admin/settings.php29
-rw-r--r--mod/lightpics/actions/photos/admin/upgrade.php52
-rw-r--r--mod/lightpics/actions/photos/album/save.php48
-rw-r--r--mod/lightpics/actions/photos/album/set_cover.php23
-rw-r--r--mod/lightpics/actions/photos/album/sort.php21
-rw-r--r--mod/lightpics/actions/photos/batch/edit.php42
-rw-r--r--mod/lightpics/actions/photos/delete.php48
-rw-r--r--mod/lightpics/actions/photos/image/save.php40
-rw-r--r--mod/lightpics/actions/photos/image/upload.php147
-rw-r--r--mod/lightpics/activate.php51
-rw-r--r--mod/lightpics/classes/TidypicsAlbum.php375
-rw-r--r--mod/lightpics/classes/TidypicsImage.php406
-rw-r--r--mod/lightpics/contributions.txt442
-rw-r--r--mod/lightpics/deactivate.php10
-rw-r--r--mod/lightpics/fonts/LiberationSerif-Regular.ttfbin0 -> 172964 bytes-rw-r--r--mod/lightpics/fonts/License.txt13
-rw-r--r--mod/lightpics/graphics/empty_album.pngbin0 -> 1389 bytes-rw-r--r--mod/lightpics/graphics/icons/album.gifbin0 -> 1411 bytes-rw-r--r--mod/lightpics/graphics/icons/general.jpgbin0 -> 7036 bytes-rw-r--r--mod/lightpics/graphics/icons/river_icon_album.gifbin0 -> 398 bytes-rw-r--r--mod/lightpics/graphics/icons/river_icon_image.gifbin0 -> 945 bytes-rw-r--r--mod/lightpics/graphics/icons/river_icon_tag.gifbin0 -> 184 bytes-rw-r--r--mod/lightpics/graphics/image_error_large.pngbin0 -> 2208 bytes-rw-r--r--mod/lightpics/graphics/image_error_small.pngbin0 -> 2351 bytes-rw-r--r--mod/lightpics/graphics/image_error_thumb.pngbin0 -> 759 bytes-rw-r--r--mod/lightpics/graphics/loader.gifbin0 -> 2545 bytes-rw-r--r--mod/lightpics/graphics/spacer.gifbin0 -> 43 bytes-rw-r--r--mod/lightpics/languages/ca.php210
-rw-r--r--mod/lightpics/languages/da.php169
-rw-r--r--mod/lightpics/languages/de.php248
-rw-r--r--mod/lightpics/languages/en.php262
-rw-r--r--mod/lightpics/languages/es.php210
-rw-r--r--mod/lightpics/languages/fr.php140
-rw-r--r--mod/lightpics/languages/he.php135
-rw-r--r--mod/lightpics/languages/it.php113
-rw-r--r--mod/lightpics/languages/pl.php96
-rw-r--r--mod/lightpics/languages/ru.php101
-rw-r--r--mod/lightpics/languages/tr.php86
-rw-r--r--mod/lightpics/lib/exif.php110
-rw-r--r--mod/lightpics/lib/migrate.php301
-rw-r--r--mod/lightpics/lib/resize.php522
-rw-r--r--mod/lightpics/lib/tidypics.php365
-rw-r--r--mod/lightpics/lib/upload.php119
-rw-r--r--mod/lightpics/manifest.xml30
-rw-r--r--mod/lightpics/pages/lists/highestrated.php65
-rw-r--r--mod/lightpics/pages/lists/highestvotecount.php50
-rw-r--r--mod/lightpics/pages/lists/mostcommentedimages.php42
-rw-r--r--mod/lightpics/pages/lists/mostcommentedimagesthismonth.php50
-rw-r--r--mod/lightpics/pages/lists/mostcommentedimagestoday.php50
-rw-r--r--mod/lightpics/pages/lists/mostrecentimages.php56
-rw-r--r--mod/lightpics/pages/lists/mostviewedimages.php79
-rw-r--r--mod/lightpics/pages/lists/mostviewedimageslastmonth.php50
-rw-r--r--mod/lightpics/pages/lists/mostviewedimagesthismonth.php50
-rw-r--r--mod/lightpics/pages/lists/mostviewedimagesthisyear.php50
-rw-r--r--mod/lightpics/pages/lists/mostviewedimagestoday.php50
-rw-r--r--mod/lightpics/pages/lists/recentlycommented.php61
-rw-r--r--mod/lightpics/pages/lists/recentlyviewed.php60
-rw-r--r--mod/lightpics/pages/lists/recentvotes.php52
-rw-r--r--mod/lightpics/pages/photos/album/add.php34
-rw-r--r--mod/lightpics/pages/photos/album/edit.php48
-rw-r--r--mod/lightpics/pages/photos/album/sort.php56
-rw-r--r--mod/lightpics/pages/photos/album/view.php63
-rw-r--r--mod/lightpics/pages/photos/all.php38
-rw-r--r--mod/lightpics/pages/photos/batch/edit.php44
-rw-r--r--mod/lightpics/pages/photos/friends.php34
-rw-r--r--mod/lightpics/pages/photos/image/download.php41
-rw-r--r--mod/lightpics/pages/photos/image/edit.php54
-rw-r--r--mod/lightpics/pages/photos/image/thumbnail.php38
-rw-r--r--mod/lightpics/pages/photos/image/upload.php64
-rw-r--r--mod/lightpics/pages/photos/image/view.php61
-rw-r--r--mod/lightpics/pages/photos/owner.php56
-rw-r--r--mod/lightpics/start.php421
-rw-r--r--mod/lightpics/upgrades/2009082901.php29
-rw-r--r--mod/lightpics/upgrades/2010073101.php27
-rw-r--r--mod/lightpics/upgrades/2010102801.php26
-rw-r--r--mod/lightpics/upgrades/2012020901.php26
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/README.md73
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/cors/postmessage.html75
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/cors/result.html20
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/css/jquery.fileupload-ui.css107
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/css/style.css92
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/img/loading.gifbin0 -> 3897 bytes-rw-r--r--mod/lightpics/vendors/jquery-file-upload/img/progressbar.gifbin0 -> 3323 bytes-rw-r--r--mod/lightpics/vendors/jquery-file-upload/index.html234
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/cors/jquery.postmessage-transport.js117
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/cors/jquery.xdr-transport.js85
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/jquery.fileupload-fp.js219
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/jquery.fileupload-jui.js141
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/jquery.fileupload-ui.js736
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/jquery.fileupload.js972
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/jquery.iframe-transport.js171
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/locale.js29
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/main.js93
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/vendor/canvas-to-blob.min.js1
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/vendor/jquery.ui.widget.js282
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/vendor/load-image.min.js1
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/js/vendor/tmpl.min.js1
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/package.json56
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-go/app.yaml12
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-go/app/main.go361
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-go/resize/resize.go247
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-go/static/favicon.icobin0 -> 1150 bytes-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-go/static/robots.txt2
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-python/app.yaml16
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-python/main.py149
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-python/static/favicon.icobin0 -> 1150 bytes-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/gae-python/static/robots.txt2
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/node/.gitignore2
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/node/package.json41
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/node/public/files/thumbnail/.gitignore0
-rwxr-xr-xmod/lightpics/vendors/jquery-file-upload/server/node/server.js285
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/node/tmp/.gitignore0
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/php/files/.htaccess4
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/php/index.php46
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/php/thumbnails/.htaccess0
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/server/php/upload.class.php436
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/test/index.html146
-rw-r--r--mod/lightpics/vendors/jquery-file-upload/test/test.js1279
-rw-r--r--mod/lightpics/version.php7
-rw-r--r--mod/lightpics/views/default/admin/settings/photos.php71
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/help.php14
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/image_lib.php38
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/server_config.php14
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/server_info.php120
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/settings.php18
-rw-r--r--mod/lightpics/views/default/admin/settings/photos/thumbnail.php54
-rw-r--r--mod/lightpics/views/default/forms/photos/admin/settings.php26
-rw-r--r--mod/lightpics/views/default/forms/photos/admin/settings/activity.php31
-rw-r--r--mod/lightpics/views/default/forms/photos/admin/settings/image_lib.php20
-rw-r--r--mod/lightpics/views/default/forms/photos/admin/settings/main.php39
-rw-r--r--mod/lightpics/views/default/forms/photos/admin/settings/thumbnails.php33
-rw-r--r--mod/lightpics/views/default/forms/photos/album/save.php48
-rw-r--r--mod/lightpics/views/default/forms/photos/album/sort.php28
-rw-r--r--mod/lightpics/views/default/forms/photos/basic_upload.php63
-rw-r--r--mod/lightpics/views/default/forms/photos/batch/edit.php33
-rw-r--r--mod/lightpics/views/default/forms/photos/batch/edit/image.php35
-rw-r--r--mod/lightpics/views/default/forms/photos/image/save.php48
-rw-r--r--mod/lightpics/views/default/icon/object/album.php41
-rw-r--r--mod/lightpics/views/default/icon/object/image.php62
-rw-r--r--mod/lightpics/views/default/js/photos/tidypics.php43
-rw-r--r--mod/lightpics/views/default/js/photos/upload.php63
-rw-r--r--mod/lightpics/views/default/object/album.php22
-rw-r--r--mod/lightpics/views/default/object/album/full.php59
-rw-r--r--mod/lightpics/views/default/object/album/gallery.php36
-rw-r--r--mod/lightpics/views/default/object/album/list.php42
-rw-r--r--mod/lightpics/views/default/object/image.php211
-rw-r--r--mod/lightpics/views/default/object/image/full.php62
-rw-r--r--mod/lightpics/views/default/object/image/navigation.php34
-rw-r--r--mod/lightpics/views/default/object/image/summary.php41
-rw-r--r--mod/lightpics/views/default/photos/css.php470
-rw-r--r--mod/lightpics/views/default/photos/group_module.php45
-rw-r--r--mod/lightpics/views/default/photos/sidebar.php18
-rw-r--r--mod/lightpics/views/default/photos/sidebar/exif.php20
-rw-r--r--mod/lightpics/views/default/photos/sidebar/quota.php27
-rw-r--r--mod/lightpics/views/default/river/object/album/create.php40
-rw-r--r--mod/lightpics/views/default/river/object/image/create.php41
-rw-r--r--mod/lightpics/views/default/river/object/tidypics_batch/create.php66
-rw-r--r--mod/lightpics/views/default/widgets/album_view/content.php17
-rw-r--r--mod/lightpics/views/default/widgets/album_view/edit.php25
-rw-r--r--mod/lightpics/views/default/widgets/latest_photos/content.php18
-rw-r--r--mod/lightpics/views/default/widgets/latest_photos/edit.php25
-rw-r--r--mod/lightpics/views/rss/extensions/photos/xmlns.php9
-rw-r--r--mod/lightpics/views/rss/object/album.php17
-rw-r--r--mod/lightpics/views/rss/object/album/full.php19
-rw-r--r--mod/lightpics/views/rss/object/album/summary.php33
-rw-r--r--mod/lightpics/views/rss/object/image.php42
-rw-r--r--mod/likes/actions/likes/add.php50
-rw-r--r--mod/likes/actions/likes/delete.php31
-rw-r--r--mod/likes/languages/en.php45
-rw-r--r--mod/likes/manifest.xml17
-rw-r--r--mod/likes/start.php171
-rw-r--r--mod/likes/views/default/annotation/likes.php49
-rw-r--r--mod/likes/views/default/likes/button.php39
-rw-r--r--mod/likes/views/default/likes/count.php36
-rw-r--r--mod/likes/views/default/likes/css.php17
-rw-r--r--mod/likes/views/default/likes/js.php26
-rw-r--r--mod/linkup/COPYING661
-rw-r--r--mod/linkup/README.txt90
-rw-r--r--mod/linkup/languages/en.php39
-rw-r--r--mod/linkup/manifest.xml36
-rw-r--r--mod/linkup/start.php413
-rw-r--r--mod/linkup/views/default/linkup/css.php31
-rwxr-xr-xmod/livestream/README0
-rwxr-xr-xmod/livestream/actions/delete.php15
-rwxr-xr-xmod/livestream/actions/new.php23
-rwxr-xr-xmod/livestream/languages/en.php32
-rwxr-xr-xmod/livestream/languages/es.php28
-rwxr-xr-xmod/livestream/languages/it.php26
-rwxr-xr-xmod/livestream/libraries.php133
-rwxr-xr-xmod/livestream/manifest.xml16
-rwxr-xr-xmod/livestream/pages/livestream/delete.php17
-rwxr-xr-xmod/livestream/pages/livestream/list.php21
-rwxr-xr-xmod/livestream/pages/livestream/new.php14
-rwxr-xr-xmod/livestream/pages/livestream/view.php23
-rwxr-xr-xmod/livestream/start.php95
-rwxr-xr-xmod/livestream/views/default/delete.php37
-rwxr-xr-xmod/livestream/views/default/list.php15
-rwxr-xr-xmod/livestream/views/default/livestream/groupprofile_livestream.php32
-rwxr-xr-xmod/livestream/views/default/new.php27
-rwxr-xr-xmod/livestream/views/default/object/list.php14
-rwxr-xr-xmod/livestream/views/default/object/livestream.php38
-rwxr-xr-xmod/livestream/views/default/view.php50
-rw-r--r--mod/logbrowser/languages/en.php30
-rw-r--r--mod/logbrowser/manifest.xml17
-rw-r--r--mod/logbrowser/start.php32
-rw-r--r--mod/logbrowser/views/default/admin/administer_utilities/logbrowser.php81
-rw-r--r--mod/logbrowser/views/default/forms/logbrowser/refine.php54
-rw-r--r--mod/logbrowser/views/default/logbrowser/refine.php40
-rw-r--r--mod/logbrowser/views/default/logbrowser/table.php90
-rw-r--r--mod/logrotate/languages/en.php29
-rw-r--r--mod/logrotate/manifest.xml17
-rw-r--r--mod/logrotate/start.php122
-rw-r--r--mod/logrotate/views/default/plugins/logrotate/settings.php48
-rw-r--r--mod/lorea-status/README38
-rwxr-xr-xmod/lorea-status/bin/lorea_refresh_status43
-rw-r--r--mod/lorea-status/etc/crontab1
-rw-r--r--mod/lorea-status/etc/lorea-status20
-rw-r--r--mod/lorea-status/etc/status.lorea.org14
-rwxr-xr-xmod/lorea-status/install.sh74
-rw-r--r--mod/lorea-status/www/index.html33
-rw-r--r--mod/lorea-status/www/jquery-1.7.1.min.js4
l---------mod/lorea-status/www/jquery.js1
-rw-r--r--mod/lorea-status/www/pub/status.json1
-rw-r--r--mod/lorea-status/www/status.css30
-rw-r--r--mod/lorea-status/www/status.js33
-rw-r--r--mod/magic_topbar/manifest.xml16
-rw-r--r--mod/magic_topbar/start.php16
-rw-r--r--mod/magic_topbar/views/default/magic_topbar/css.php18
-rw-r--r--mod/magic_topbar/views/default/magic_topbar/js.php40
-rw-r--r--mod/members/languages/en.php16
-rw-r--r--mod/members/manifest.xml16
-rw-r--r--mod/members/pages/members/index.php36
-rw-r--r--mod/members/pages/members/search.php55
-rw-r--r--mod/members/start.php41
-rw-r--r--mod/members/views/default/members/nav.php24
-rw-r--r--mod/members/views/default/members/sidebar.php25
-rw-r--r--mod/messageboard/actions/add.php38
-rw-r--r--mod/messageboard/actions/delete.php17
-rw-r--r--mod/messageboard/languages/en.php72
-rw-r--r--mod/messageboard/manifest.xml17
-rw-r--r--mod/messageboard/pages/messageboard/owner.php57
-rw-r--r--mod/messageboard/start.php163
-rw-r--r--mod/messageboard/views/default/forms/messageboard/add.php20
-rw-r--r--mod/messageboard/views/default/messageboard/css.php10
-rw-r--r--mod/messageboard/views/default/messageboard/js.php56
-rw-r--r--mod/messageboard/views/default/river/object/messageboard/create.php12
-rw-r--r--mod/messageboard/views/default/widgets/messageboard/content.php35
-rw-r--r--mod/messageboard/views/default/widgets/messageboard/edit.php22
-rw-r--r--mod/messages/actions/messages/delete.php20
-rw-r--r--mod/messages/actions/messages/process.php35
-rw-r--r--mod/messages/actions/messages/send.php46
-rw-r--r--mod/messages/graphics/icon_notifications_site.gifbin0 -> 456 bytes-rw-r--r--mod/messages/graphics/toolbar_messages_icon.gifbin0 -> 502 bytes-rw-r--r--mod/messages/languages/en.php97
-rw-r--r--mod/messages/lib/messages.php32
-rw-r--r--mod/messages/manifest.xml17
-rw-r--r--mod/messages/pages/messages/inbox.php48
-rw-r--r--mod/messages/pages/messages/read.php60
-rw-r--r--mod/messages/pages/messages/send.php27
-rw-r--r--mod/messages/pages/messages/sent.php48
-rw-r--r--mod/messages/start.php480
-rw-r--r--mod/messages/views/default/forms/messages/process.php43
-rw-r--r--mod/messages/views/default/forms/messages/reply.php43
-rw-r--r--mod/messages/views/default/forms/messages/send.php54
-rw-r--r--mod/messages/views/default/messages/css.php63
-rw-r--r--mod/messages/views/default/messages/js.php7
-rw-r--r--mod/messages/views/default/object/messages.php86
-rw-r--r--mod/minify/.gitignore3
-rw-r--r--mod/minify/manifest.xml13
-rw-r--r--mod/minify/start.php22
-rw-r--r--mod/minify/vendors/min/.htaccess4
-rw-r--r--mod/minify/vendors/min/README.txt132
-rw-r--r--mod/minify/vendors/min/builder/_index.js242
-rw-r--r--mod/minify/vendors/min/builder/bm.js36
-rw-r--r--mod/minify/vendors/min/builder/index.php182
-rw-r--r--mod/minify/vendors/min/builder/ocCheck.php36
-rw-r--r--mod/minify/vendors/min/builder/rewriteTest.js1
-rw-r--r--mod/minify/vendors/min/config.php155
-rw-r--r--mod/minify/vendors/min/groupsConfig.php34
-rw-r--r--mod/minify/vendors/min/index.php66
-rw-r--r--mod/minify/vendors/min/lib/CSS.php83
-rw-r--r--mod/minify/vendors/min/lib/FirePHP.php1370
-rw-r--r--mod/minify/vendors/min/lib/HTTP/ConditionalGet.php348
-rw-r--r--mod/minify/vendors/min/lib/HTTP/Encoder.php326
-rw-r--r--mod/minify/vendors/min/lib/JSMin.php314
-rw-r--r--mod/minify/vendors/min/lib/JSMinPlus.php1872
-rw-r--r--mod/minify/vendors/min/lib/Minify.php532
-rw-r--r--mod/minify/vendors/min/lib/Minify/Build.php103
-rw-r--r--mod/minify/vendors/min/lib/Minify/CSS/Compressor.php250
-rw-r--r--mod/minify/vendors/min/lib/Minify/CSS/UriRewriter.php270
-rw-r--r--mod/minify/vendors/min/lib/Minify/Cache/APC.php130
-rw-r--r--mod/minify/vendors/min/lib/Minify/Cache/File.php125
-rw-r--r--mod/minify/vendors/min/lib/Minify/Cache/Memcache.php137
-rw-r--r--mod/minify/vendors/min/lib/Minify/CommentPreserver.php90
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/Base.php202
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/Files.php78
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/Groups.php94
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/MinApp.php132
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/Page.php82
-rw-r--r--mod/minify/vendors/min/lib/Minify/Controller/Version1.php118
-rw-r--r--mod/minify/vendors/min/lib/Minify/HTML.php245
-rw-r--r--mod/minify/vendors/min/lib/Minify/ImportProcessor.php157
-rw-r--r--mod/minify/vendors/min/lib/Minify/Lines.php131
-rw-r--r--mod/minify/vendors/min/lib/Minify/Logger.php45
-rw-r--r--mod/minify/vendors/min/lib/Minify/Packer.php37
-rw-r--r--mod/minify/vendors/min/lib/Minify/Source.php187
-rw-r--r--mod/minify/vendors/min/lib/Minify/YUICompressor.php139
-rw-r--r--mod/minify/vendors/min/lib/Solar/Dir.php199
-rw-r--r--mod/minify/vendors/min/utils.php90
-rw-r--r--mod/notifications/actions/groupsave.php49
-rw-r--r--mod/notifications/actions/save.php43
-rw-r--r--mod/notifications/graphics/icon_notifications_email.gifbin0 -> 1416 bytes-rw-r--r--mod/notifications/graphics/icon_notifications_site.gifbin0 -> 456 bytes-rw-r--r--mod/notifications/groups.php46
-rw-r--r--mod/notifications/index.php50
-rw-r--r--mod/notifications/languages/en.php26
-rw-r--r--mod/notifications/manifest.xml16
-rw-r--r--mod/notifications/start.php206
-rw-r--r--mod/notifications/views/default/forms/notificationsettings/groupsave.php111
-rw-r--r--mod/notifications/views/default/forms/notificationsettings/save.php21
-rw-r--r--mod/notifications/views/default/notifications/css.php87
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/collections.php164
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/form.php12
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/forminternals.php337
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/groupsform.php4
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/jsfuncs.php54
-rw-r--r--mod/notifications/views/default/notifications/subscriptions/personal.php73
-rw-r--r--mod/openid_api/classes/OpenID_ElggStore.php420
-rw-r--r--mod/openid_api/lib/openid_consumer.php15
-rw-r--r--mod/openid_api/lib/openid_server.php13
-rw-r--r--mod/openid_api/manifest.xml19
-rw-r--r--mod/openid_api/start.php22
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID.php563
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/AX.php1022
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Association.php610
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/BigMath.php451
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Consumer.php2234
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/CryptUtil.php122
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/DatabaseConnection.php130
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/DiffieHellman.php113
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Discover.php606
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/DumbStore.php99
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Extension.php61
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/FileStore.php618
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/HMAC.php105
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Interface.php196
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/KVForm.php111
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/MDB2Store.php413
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/MemcachedStore.php207
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Message.php920
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/MySQLStore.php77
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Nonce.php108
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/PAPE.php300
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Parse.php377
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/PostgreSQLStore.php112
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/SQLStore.php557
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/SQLiteStore.php70
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/SReg.php521
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/Server.php1765
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/ServerRequest.php36
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/TrustRoot.php461
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/OpenID/URINorm.php249
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/HTTPFetcher.php174
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/Manager.php521
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/Misc.php58
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/ParanoidHTTPFetcher.php245
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/ParseHTML.php258
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/PlainHTTPFetcher.php248
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/XML.php352
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/XRDS.php478
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/XRI.php234
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/XRIRes.php72
-rw-r--r--mod/openid_api/vendors/php-openid/Auth/Yadis/Yadis.php382
-rw-r--r--mod/openid_api/vendors/php-openid/COPYING202
-rw-r--r--mod/openid_api/vendors/php-openid/README136
-rw-r--r--mod/openid_client/actions/openid_client/login.php32
-rw-r--r--mod/openid_client/actions/openid_client/register.php35
-rw-r--r--mod/openid_client/classes/ElggOpenIDConsumer.php238
-rw-r--r--mod/openid_client/graphics/openid_icon.pngbin0 -> 733 bytes-rw-r--r--mod/openid_client/languages/en.php28
-rw-r--r--mod/openid_client/lib/helpers.php114
-rw-r--r--mod/openid_client/manifest.xml19
-rw-r--r--mod/openid_client/return.php69
-rw-r--r--mod/openid_client/start.php78
-rw-r--r--mod/openid_client/upgrade.php12
-rw-r--r--mod/openid_client/upgrades/2012100501.php53
-rw-r--r--mod/openid_client/views/default/core/account/login_box.php24
-rw-r--r--mod/openid_client/views/default/core/account/login_dropdown.php31
-rw-r--r--mod/openid_client/views/default/forms/openid_client/login.php43
-rw-r--r--mod/openid_client/views/default/forms/openid_client/register.php71
-rw-r--r--mod/openid_client/views/default/openid_client/css.php13
-rw-r--r--mod/openid_client/views/default/openid_client/icon.php8
-rw-r--r--mod/openid_client/views/default/openid_client/js.php26
-rw-r--r--mod/openid_client/views/default/openid_client/register.php11
-rw-r--r--mod/openid_server/Crypt/RSA.php524
-rw-r--r--mod/openid_server/Crypt/RSA/ErrorHandler.php234
-rw-r--r--mod/openid_server/Crypt/RSA/Key.php314
-rw-r--r--mod/openid_server/Crypt/RSA/KeyPair.php804
-rw-r--r--mod/openid_server/Crypt/RSA/Math/BCMath.php482
-rw-r--r--mod/openid_server/Crypt/RSA/Math/BigInt.php313
-rw-r--r--mod/openid_server/Crypt/RSA/Math/GMP.php361
-rw-r--r--mod/openid_server/Crypt/RSA/MathLoader.php135
-rwxr-xr-xmod/openid_server/actions/admin.php90
-rwxr-xr-xmod/openid_server/actions/autologin.php52
-rwxr-xr-xmod/openid_server/actions/autologout.php48
-rwxr-xr-xmod/openid_server/actions/trust.php93
-rw-r--r--mod/openid_server/languages/ca.php40
-rwxr-xr-xmod/openid_server/languages/en.php47
-rwxr-xr-xmod/openid_server/languages/es.php40
-rw-r--r--mod/openid_server/languages/gl.php40
-rw-r--r--mod/openid_server/languages/pt.php27
-rwxr-xr-xmod/openid_server/lib/actions.php173
-rwxr-xr-xmod/openid_server/lib/common.php164
-rwxr-xr-xmod/openid_server/lib/session.php140
-rwxr-xr-xmod/openid_server/manifest.xml20
-rwxr-xr-xmod/openid_server/openid_server_include.php340
-rwxr-xr-xmod/openid_server/server.php32
-rwxr-xr-xmod/openid_server/start.php65
-rwxr-xr-xmod/openid_server/views/default/forms/openid_server/trust.php34
-rwxr-xr-xmod/openid_server/views/default/openid_server/forms/admin.php154
-rwxr-xr-xmod/openid_server/views/default/openid_server/forms/autologin.php22
-rwxr-xr-xmod/openid_server/views/default/openid_server/forms/autologout.php24
-rwxr-xr-xmod/openid_server/views/default/openid_server/forms/trust.php35
-rwxr-xr-xmod/openid_server/views/default/openid_server/metatags.php6
-rw-r--r--mod/openid_server/views/xrds/openid_server/profile.php11
-rw-r--r--mod/openid_server/views/xrds/openid_server/service.php15
-rw-r--r--mod/opensearch/README21
-rw-r--r--mod/opensearch/languages/ca.php26
-rw-r--r--mod/opensearch/languages/en.php28
-rw-r--r--mod/opensearch/languages/es.php23
-rw-r--r--mod/opensearch/languages/eu.php11
-rwxr-xr-xmod/opensearch/languages/pl.php11
-rw-r--r--mod/opensearch/manifest.xml16
-rw-r--r--mod/opensearch/start.php33
-rw-r--r--mod/opensearch/views/default/opensearch/includes.php10
-rw-r--r--mod/opensearch/views/default/plugins/opensearch/settings.php97
-rw-r--r--mod/opensearch/views/opensearch_rss/page/default.php42
-rw-r--r--mod/opensearch/views/opensearch_rss/page/layouts/default.php5
-rw-r--r--mod/opensearch/views/opensearch_rss/search/layout.php5
-rw-r--r--mod/opensearch/views/opensearch_rss/search/list.php27
-rw-r--r--mod/opensearch/views/xml/opensearch/description.php75
-rw-r--r--mod/pages/actions/annotations/page/delete.php20
-rw-r--r--mod/pages/actions/pages/delete.php68
-rw-r--r--mod/pages/actions/pages/edit.php115
-rw-r--r--mod/pages/images/pages.gifbin0 -> 2766 bytes-rw-r--r--mod/pages/images/pages_lrg.gifbin0 -> 10234 bytes-rw-r--r--mod/pages/languages/en.php119
-rw-r--r--mod/pages/lib/pages.php152
-rw-r--r--mod/pages/manifest.xml18
-rw-r--r--mod/pages/pages/pages/edit.php54
-rw-r--r--mod/pages/pages/pages/friends.php33
-rw-r--r--mod/pages/pages/pages/history.php47
-rw-r--r--mod/pages/pages/pages/new.php37
-rw-r--r--mod/pages/pages/pages/owner.php53
-rw-r--r--mod/pages/pages/pages/revision.php53
-rw-r--r--mod/pages/pages/pages/view.php55
-rw-r--r--mod/pages/pages/pages/world.php31
-rw-r--r--mod/pages/start.php370
-rw-r--r--mod/pages/upgrades/2012061800.php49
-rw-r--r--mod/pages/vendors/jquery-treeview/.gitignore7
-rw-r--r--mod/pages/vendors/jquery-treeview/README.md8
-rw-r--r--mod/pages/vendors/jquery-treeview/changelog.txt36
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/async.html91
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/bg.gifbin0 -> 1175 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/demo/demo.js31
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/edit.html82
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/images.html56
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/index.html338
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/large.html561
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/prerendered.html620
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/screen.css24
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/simple.html82
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/sortable.html222
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/source.php88
-rw-r--r--mod/pages/vendors/jquery-treeview/demo/source.phps88
-rw-r--r--mod/pages/vendors/jquery-treeview/images/ajax-loader.gifbin0 -> 847 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/file.gifbin0 -> 110 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/folder-closed.gifbin0 -> 105 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/folder.gifbin0 -> 106 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/minus.gifbin0 -> 837 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/plus.gifbin0 -> 841 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-black-line.gifbin0 -> 1877 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-black.gifbin0 -> 1216 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-default-line.gifbin0 -> 1993 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-default.gifbin0 -> 1222 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-famfamfam-line.gifbin0 -> 807 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-famfamfam.gifbin0 -> 1280 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-gray-line.gifbin0 -> 1877 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-gray.gifbin0 -> 1230 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-red-line.gifbin0 -> 1877 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/images/treeview-red.gifbin0 -> 1230 bytes-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.async.js110
-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.css74
-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.edit.js37
-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.js256
-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.min.js17
-rw-r--r--mod/pages/vendors/jquery-treeview/jquery.treeview.sortable.js378
-rw-r--r--mod/pages/vendors/jquery-treeview/lib/jquery.cookie.js92
-rw-r--r--mod/pages/vendors/jquery-treeview/lib/jquery.js6883
-rw-r--r--mod/pages/vendors/jquery-treeview/todo8
-rw-r--r--mod/pages/views/default/annotation/page.php60
-rw-r--r--mod/pages/views/default/forms/pages/edit.php77
-rw-r--r--mod/pages/views/default/input/write_access.php35
-rw-r--r--mod/pages/views/default/object/page.php8
-rw-r--r--mod/pages/views/default/object/page_top.php119
-rw-r--r--mod/pages/views/default/pages/css.php19
-rw-r--r--mod/pages/views/default/pages/group_module.php49
-rw-r--r--mod/pages/views/default/pages/icon.php25
-rw-r--r--mod/pages/views/default/pages/input/parent.php37
-rw-r--r--mod/pages/views/default/pages/sidebar.php14
-rw-r--r--mod/pages/views/default/pages/sidebar/history.php21
-rw-r--r--mod/pages/views/default/pages/sidebar/navigation.php58
-rw-r--r--mod/pages/views/default/river/object/page/create.php (renamed from views/default/river/object/task/create.php)0
-rw-r--r--mod/pages/views/default/river/object/page_top/create.php8
-rw-r--r--mod/pages/views/default/widgets/pages/content.php32
-rw-r--r--mod/pages/views/default/widgets/pages/edit.php24
-rw-r--r--mod/profile/icondirect.php77
-rw-r--r--mod/profile/languages/en.php12
-rw-r--r--mod/profile/manifest.xml17
-rw-r--r--mod/profile/start.php188
-rw-r--r--mod/profile/views/default/profile/css.php126
-rw-r--r--mod/profile/views/default/profile/details.php68
-rw-r--r--mod/profile/views/default/profile/js.php9
-rw-r--r--mod/profile/views/default/profile/metatags.php16
-rw-r--r--mod/profile/views/default/profile/owner_block.php66
-rw-r--r--mod/profile/views/default/profile/wrapper.php12
-rw-r--r--mod/profile_friendlyurl/.DS_Storebin0 -> 6148 bytes-rw-r--r--mod/profile_friendlyurl/LICENCE.txt339
-rw-r--r--mod/profile_friendlyurl/README.markdown27
-rw-r--r--mod/profile_friendlyurl/htaccess-dist145
-rw-r--r--mod/profile_friendlyurl/languages/en.php22
-rwxr-xr-xmod/profile_friendlyurl/start.php20
-rw-r--r--mod/profile_friendlyurl/views/.DS_Storebin0 -> 6148 bytes-rw-r--r--mod/profile_friendlyurl/views/default/.DS_Storebin0 -> 6148 bytes-rw-r--r--mod/profile_friendlyurl/views/default/settings/.DS_Storebin0 -> 6148 bytes-rw-r--r--mod/profile_friendlyurl/views/default/settings/profile_friendlyurl/edit.php7
-rw-r--r--mod/profile_widgets/languages/en.php7
-rw-r--r--mod/profile_widgets/languages/es.php7
-rwxr-xr-xmod/profile_widgets/manifest.xml16
-rw-r--r--mod/profile_widgets/start.php13
-rw-r--r--mod/profile_widgets/views/default/widgets/thewirewrite/view.php11
-rw-r--r--mod/purity_theme/graphics/button.pngbin0 -> 1092 bytes-rw-r--r--mod/purity_theme/graphics/elgg_sprites.pngbin0 -> 19846 bytes-rw-r--r--mod/purity_theme/graphics/login.pngbin0 -> 537 bytes-rw-r--r--mod/purity_theme/graphics/logo.pngbin0 -> 3067 bytes-rw-r--r--mod/purity_theme/graphics/menu.gifbin0 -> 3008 bytes-rw-r--r--mod/purity_theme/graphics/menu.pngbin0 -> 2682 bytes-rw-r--r--mod/purity_theme/graphics/people.pngbin0 -> 143134 bytes-rw-r--r--mod/purity_theme/graphics/preset1.pngbin0 -> 131 bytes-rw-r--r--mod/purity_theme/graphics/preset2.pngbin0 -> 131 bytes-rw-r--r--mod/purity_theme/graphics/preset3.pngbin0 -> 131 bytes-rw-r--r--mod/purity_theme/graphics/preset4.pngbin0 -> 125 bytes-rw-r--r--mod/purity_theme/graphics/preset5.pngbin0 -> 131 bytes-rw-r--r--mod/purity_theme/graphics/preset6.pngbin0 -> 131 bytes-rw-r--r--mod/purity_theme/graphics/preset7.pngbin0 -> 125 bytes-rw-r--r--mod/purity_theme/graphics/purity_01.pngbin0 -> 5204 bytes-rw-r--r--mod/purity_theme/graphics/purity_02.pngbin0 -> 550 bytes-rw-r--r--mod/purity_theme/graphics/purity_03.pngbin0 -> 2480 bytes-rw-r--r--mod/purity_theme/graphics/search.gifbin0 -> 819 bytes-rw-r--r--mod/purity_theme/graphics/search.pngbin0 -> 1589 bytes-rw-r--r--mod/purity_theme/graphics/sidebar_background.gifbin0 -> 1355 bytes-rw-r--r--mod/purity_theme/graphics/spacer.gifbin0 -> 175 bytes-rw-r--r--mod/purity_theme/graphics/topbar.gifbin0 -> 2756 bytes-rw-r--r--mod/purity_theme/manifest.xml18
-rw-r--r--mod/purity_theme/start.php84
-rw-r--r--mod/purity_theme/views/default/css/elements/buttons.php132
-rw-r--r--mod/purity_theme/views/default/css/elements/forms.php298
-rw-r--r--mod/purity_theme/views/default/css/elements/helpers.php161
-rw-r--r--mod/purity_theme/views/default/css/elements/layout.php142
-rw-r--r--mod/purity_theme/views/default/css/elements/typography.php155
-rw-r--r--mod/purity_theme/views/default/custom_index/css.php17
-rw-r--r--mod/purity_theme/views/default/page/default.php58
-rw-r--r--mod/purity_theme/views/default/page/elements/footer.php12
-rw-r--r--mod/purity_theme/views/default/page/elements/header.php22
-rw-r--r--mod/purity_theme/views/default/page/elements/header_logo.php21
-rw-r--r--mod/purity_theme/views/default/page/elements/messages.php27
-rw-r--r--mod/purity_theme/views/default/page/elements/topbar.php25
-rw-r--r--mod/purity_theme/views/default/page/layouts/custom_index.php48
-rw-r--r--mod/purity_theme/views/default/plugins/purity_theme/settings.php24
-rw-r--r--mod/purity_theme/views/default/purity_theme/css.php178
-rw-r--r--mod/purity_theme/views/default/purity_theme/leftside.php5
-rw-r--r--mod/purity_theme/views/default/purity_theme/rightside.php5
-rw-r--r--mod/registrationterms/.gitignore3
-rw-r--r--mod/registrationterms/README.md9
-rw-r--r--mod/registrationterms/languages/ca.php6
-rw-r--r--mod/registrationterms/languages/en.php6
-rw-r--r--mod/registrationterms/manifest.xml25
-rw-r--r--mod/registrationterms/screenshots/register-form.pngbin0 -> 8653 bytes-rw-r--r--mod/registrationterms/start.php18
-rw-r--r--mod/registrationterms/views/default/registrationterms/register.php17
-rw-r--r--mod/reportedcontent/actions/reportedcontent/add.php39
-rw-r--r--mod/reportedcontent/actions/reportedcontent/archive.php27
-rw-r--r--mod/reportedcontent/actions/reportedcontent/delete.php28
-rw-r--r--mod/reportedcontent/graphics/icon_reportthis.gifbin0 -> 570 bytes-rw-r--r--mod/reportedcontent/languages/en.php44
-rw-r--r--mod/reportedcontent/manifest.xml16
-rw-r--r--mod/reportedcontent/start.php103
-rw-r--r--mod/reportedcontent/views/default/admin/administer_utilities/reportedcontent.php13
-rw-r--r--mod/reportedcontent/views/default/forms/reportedcontent/add.php57
-rw-r--r--mod/reportedcontent/views/default/object/reported_content.php84
-rw-r--r--mod/reportedcontent/views/default/reportedcontent/admin_css.php46
-rw-r--r--mod/reportedcontent/views/default/reportedcontent/css.php14
-rw-r--r--mod/reportedcontent/views/default/widgets/reportedcontent/content.php16
-rw-r--r--mod/reportedcontent/views/default/widgets/reportedcontent/edit.php22
-rw-r--r--mod/river_privacy/CHANGES.txt7
-rw-r--r--mod/river_privacy/README.md4
-rw-r--r--mod/river_privacy/languages/ca.php7
-rw-r--r--mod/river_privacy/languages/en.php13
-rw-r--r--mod/river_privacy/manifest.xml17
-rw-r--r--mod/river_privacy/start.php30
-rw-r--r--mod/river_privacy/views/default/plugins/river_privacy/settings.php17
-rw-r--r--mod/river_privacy/views_override/default/page/components/list.php89
-rw-r--r--mod/saravea_theme/.gitignore1
-rw-r--r--mod/saravea_theme/_graphics/ajax-loader.gifbin0 -> 3720 bytes-rwxr-xr-xmod/saravea_theme/_graphics/elgg_sprites.pngbin0 -> 27750 bytes-rwxr-xr-xmod/saravea_theme/_graphics/favicon.icobin0 -> 1218 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pad_lrg.gifbin0 -> 2060 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pad_small.gifbin0 -> 1246 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pad_tiny.gifbin0 -> 1033 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pages_lrg.gifbin0 -> 1162 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pages_small.gifbin0 -> 708 bytes-rw-r--r--mod/saravea_theme/_graphics/icons/pages_tiny.gifbin0 -> 581 bytes-rw-r--r--mod/saravea_theme/_graphics/n1.pngbin0 -> 15662 bytes-rw-r--r--mod/saravea_theme/_graphics/n1_small.pngbin0 -> 3977 bytes-rw-r--r--mod/saravea_theme/_graphics/privacy.pngbin0 -> 2311 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_amar.pngbin0 -> 71000 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_azul.pngbin0 -> 72619 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_bege.pngbin0 -> 72529 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_lar.pngbin0 -> 70979 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_verd.pngbin0 -> 72541 bytes-rwxr-xr-xmod/saravea_theme/_graphics/saravea_verm.pngbin0 -> 71396 bytes-rw-r--r--mod/saravea_theme/_graphics/saravea_verm_small.pngbin0 -> 5996 bytes-rw-r--r--mod/saravea_theme/_graphics/sidebar_background.gifbin0 -> 1222 bytes-rw-r--r--mod/saravea_theme/_graphics/two_sidebar_background.gifbin0 -> 91 bytes-rw-r--r--mod/saravea_theme/languages/ca.php10
-rw-r--r--mod/saravea_theme/languages/en.php10
-rw-r--r--mod/saravea_theme/languages/es.php10
-rw-r--r--mod/saravea_theme/manifest.xml54
-rw-r--r--mod/saravea_theme/start.php132
-rw-r--r--mod/saravea_theme/vendors/opensans/LICENSE.txt202
-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-Bold.ttfbin0 -> 224592 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-BoldItalic.ttfbin0 -> 213292 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-ExtraBold.ttfbin0 -> 222584 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-ExtraBoldItalic.ttfbin0 -> 213420 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-Italic.ttfbin0 -> 212896 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-Light.ttfbin0 -> 222412 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-LightItalic.ttfbin0 -> 213128 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-Regular.ttfbin0 -> 217360 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-Semibold.ttfbin0 -> 221328 bytes-rw-r--r--mod/saravea_theme/vendors/opensans/OpenSans-SemiboldItalic.ttfbin0 -> 212820 bytes-rw-r--r--mod/saravea_theme/views/default/css/admin.php1648
-rw-r--r--mod/saravea_theme/views/default/css/elements/OOCSS_LICENSE30
-rw-r--r--mod/saravea_theme/views/default/css/elements/buttons.php240
-rw-r--r--mod/saravea_theme/views/default/css/elements/components.php354
-rw-r--r--mod/saravea_theme/views/default/css/elements/core.php117
-rw-r--r--mod/saravea_theme/views/default/css/elements/forms.php416
-rw-r--r--mod/saravea_theme/views/default/css/elements/grid.php54
-rw-r--r--mod/saravea_theme/views/default/css/elements/helpers.php144
-rw-r--r--mod/saravea_theme/views/default/css/elements/icons.php407
-rw-r--r--mod/saravea_theme/views/default/css/elements/layout.php145
-rw-r--r--mod/saravea_theme/views/default/css/elements/misc.php62
-rw-r--r--mod/saravea_theme/views/default/css/elements/modules.php205
-rw-r--r--mod/saravea_theme/views/default/css/elements/navigation.php596
-rw-r--r--mod/saravea_theme/views/default/css/elements/reset.php79
-rw-r--r--mod/saravea_theme/views/default/css/elements/typography.php192
-rw-r--r--mod/saravea_theme/views/default/css/elgg.php68
-rw-r--r--mod/saravea_theme/views/default/css/ie.php8
-rw-r--r--mod/saravea_theme/views/default/css/ie6.php12
-rw-r--r--mod/saravea_theme/views/default/css/ie7.php65
-rw-r--r--mod/saravea_theme/views/default/css/saravea_theme/landing.php40
-rw-r--r--mod/saravea_theme/views/default/css/walled_garden.php81
-rw-r--r--mod/saravea_theme/views/default/output/access.php53
-rw-r--r--mod/saravea_theme/views/default/page/elements/shortcut_icon.php6
-rw-r--r--mod/saravea_theme/views/default/page/layouts/one_sidebar.php48
-rw-r--r--mod/saravea_theme/views/default/river/elements/body.php67
-rw-r--r--mod/saravea_theme/views/default/saravea_theme/css.php140
-rw-r--r--mod/saravea_theme/views/default/saravea_theme/header.php11
-rw-r--r--mod/saravea_theme/views/default/saravea_theme/landing.php15
-rw-r--r--mod/saravea_theme/views/default/search/css.php60
-rw-r--r--mod/search/README.txt276
-rw-r--r--mod/search/languages/en.php21
-rw-r--r--mod/search/manifest.xml16
-rw-r--r--mod/search/pages/search/index.php275
-rw-r--r--mod/search/search_hooks.php490
-rw-r--r--mod/search/start.php502
-rw-r--r--mod/search/views/default/search/comments/entity.php55
-rw-r--r--mod/search/views/default/search/css.php67
-rw-r--r--mod/search/views/default/search/entity.php57
-rw-r--r--mod/search/views/default/search/header.php6
-rw-r--r--mod/search/views/default/search/layout.php8
-rw-r--r--mod/search/views/default/search/list.php115
-rw-r--r--mod/search/views/default/search/no_results.php6
-rw-r--r--mod/search/views/default/search/search_box.php43
-rw-r--r--mod/search/views/default/search/startblurb.php6
-rw-r--r--mod/search/views/rss/search/comments/entity.php54
-rw-r--r--mod/search/views/rss/search/entity.php24
-rw-r--r--mod/search/views/rss/search/layout.php6
-rw-r--r--mod/search/views/rss/search/list.php25
-rw-r--r--mod/simple_faq/faqs-sample44
-rw-r--r--mod/simple_faq/languages/ca.php6
-rw-r--r--mod/simple_faq/languages/en.php15
-rw-r--r--mod/simple_faq/languages/es.php15
-rw-r--r--mod/simple_faq/manifest.xml27
-rw-r--r--mod/simple_faq/start.php32
-rw-r--r--mod/simple_faq/vendors/jquery-stoc/jquery.stoc.js80
-rw-r--r--mod/simple_faq/views/default/expages/menu.php23
-rw-r--r--mod/simple_faq/views/default/js/simple_faq/toc.php24
-rw-r--r--mod/simplepie/README19
-rw-r--r--mod/simplepie/actions/simplepie/save_group_feed.php14
-rw-r--r--mod/simplepie/languages/en.php14
-rw-r--r--mod/simplepie/languages/es.php14
-rw-r--r--mod/simplepie/manifest.xml36
-rw-r--r--mod/simplepie/start.php33
-rw-r--r--mod/simplepie/vendors/simplepie.inc15299
-rw-r--r--mod/simplepie/views/default/forms/simplepie/save_group_feed.php39
-rw-r--r--mod/simplepie/views/default/simplepie/css.php17
-rw-r--r--mod/simplepie/views/default/simplepie/group_module.php109
-rw-r--r--mod/simplepie/views/default/widgets/feed_reader/content.php81
-rw-r--r--mod/simplepie/views/default/widgets/feed_reader/edit.php62
-rw-r--r--mod/subgroups/actions/subgroups/add.php33
-rw-r--r--mod/subgroups/actions/subgroups/remove.php13
-rw-r--r--mod/subgroups/activate.php16
-rw-r--r--mod/subgroups/deactivate.php18
-rw-r--r--mod/subgroups/languages/ca.php22
-rwxr-xr-xmod/subgroups/languages/en.php30
-rw-r--r--mod/subgroups/languages/es.php22
-rw-r--r--mod/subgroups/languages/gl.php27
-rw-r--r--mod/subgroups/languages/pt.php7
-rw-r--r--mod/subgroups/lib/groups.php564
-rw-r--r--mod/subgroups/lib/subgroups.php84
-rw-r--r--mod/subgroups/manifest.xml24
-rw-r--r--mod/subgroups/pages/subgroups/edit.php46
-rw-r--r--mod/subgroups/pages/subgroups/owner.php38
-rw-r--r--mod/subgroups/start.php211
-rw-r--r--mod/subgroups/views/default/forms/groups/edit.php142
-rw-r--r--mod/subgroups/views/default/forms/subgroups/add.php37
-rw-r--r--mod/subgroups/views/default/group/default.php39
-rw-r--r--mod/subgroups/views/default/group/elements/summary.php67
-rw-r--r--mod/subgroups/views/default/groups/css/elements/components.php6
-rw-r--r--mod/subgroups/views/default/groups/group_sort_menu.php46
-rw-r--r--mod/subgroups/views/default/groups/profile/fields.php41
-rw-r--r--mod/subgroups/views/default/groups/sidebar/subgroups.php44
-rw-r--r--mod/subgroups/views/default/icon/default.php58
-rw-r--r--mod/subgroups/views/default/input/autocomplete.php57
-rw-r--r--mod/subgroups/views/default/navigation/breadcrumbs.php83
-rw-r--r--mod/subgroups/views/default/subgroups/group_module.php51
-rw-r--r--mod/subgroups/views/default/subgroups/groups_i_can_edit.php71
-rw-r--r--mod/subgroups/views/default/subgroups/subgroups_icons.php11
-rw-r--r--mod/tagcloud/languages/en.php12
-rw-r--r--mod/tagcloud/manifest.xml16
-rw-r--r--mod/tagcloud/start.php10
-rw-r--r--mod/tagcloud/views/default/widgets/tagcloud/content.php16
-rw-r--r--mod/tagcloud/views/default/widgets/tagcloud/edit.php23
-rw-r--r--mod/tasks/actions/tasks/comments/add.php (renamed from actions/tasks/comments/add.php)0
-rw-r--r--mod/tasks/actions/tasks/delete.php (renamed from actions/tasks/delete.php)0
-rw-r--r--mod/tasks/actions/tasks/edit.php (renamed from actions/tasks/edit.php)0
-rw-r--r--mod/tasks/doc/sources/states.dia (renamed from doc/sources/states.dia)bin3492 -> 3492 bytes-rw-r--r--mod/tasks/doc/states.png (renamed from doc/states.png)bin26173 -> 26173 bytes-rw-r--r--mod/tasks/graphics/task-icons/active-large.png (renamed from graphics/task-icons/active-large.png)bin2220 -> 2220 bytes-rw-r--r--mod/tasks/graphics/task-icons/active-medium.png (renamed from graphics/task-icons/active-medium.png)bin1502 -> 1502 bytes-rw-r--r--mod/tasks/graphics/task-icons/active-small.png (renamed from graphics/task-icons/active-small.png)bin1014 -> 1014 bytes-rw-r--r--mod/tasks/graphics/task-icons/active-tiny.png (renamed from graphics/task-icons/active-tiny.png)bin578 -> 578 bytes-rw-r--r--mod/tasks/graphics/task-icons/assigned-large.png (renamed from graphics/task-icons/assigned-large.png)bin2258 -> 2258 bytes-rw-r--r--mod/tasks/graphics/task-icons/assigned-medium.png (renamed from graphics/task-icons/assigned-medium.png)bin1615 -> 1615 bytes-rw-r--r--mod/tasks/graphics/task-icons/assigned-small.png (renamed from graphics/task-icons/assigned-small.png)bin1011 -> 1011 bytes-rw-r--r--mod/tasks/graphics/task-icons/assigned-tiny.png (renamed from graphics/task-icons/assigned-tiny.png)bin596 -> 596 bytes-rw-r--r--mod/tasks/graphics/task-icons/closed-large.png (renamed from graphics/task-icons/closed-large.png)bin2345 -> 2345 bytes-rw-r--r--mod/tasks/graphics/task-icons/closed-medium.png (renamed from graphics/task-icons/closed-medium.png)bin1776 -> 1776 bytes-rw-r--r--mod/tasks/graphics/task-icons/closed-small.png (renamed from graphics/task-icons/closed-small.png)bin1294 -> 1294 bytes-rw-r--r--mod/tasks/graphics/task-icons/closed-tiny.png (renamed from graphics/task-icons/closed-tiny.png)bin685 -> 685 bytes-rw-r--r--mod/tasks/graphics/task-icons/done-large.png (renamed from graphics/task-icons/done-large.png)bin3267 -> 3267 bytes-rw-r--r--mod/tasks/graphics/task-icons/done-medium.png (renamed from graphics/task-icons/done-medium.png)bin2714 -> 2714 bytes-rw-r--r--mod/tasks/graphics/task-icons/done-small.png (renamed from graphics/task-icons/done-small.png)bin1718 -> 1718 bytes-rw-r--r--mod/tasks/graphics/task-icons/done-tiny.png (renamed from graphics/task-icons/done-tiny.png)bin933 -> 933 bytes-rw-r--r--mod/tasks/graphics/task-icons/new-large.png (renamed from graphics/task-icons/new-large.png)bin1282 -> 1282 bytes-rw-r--r--mod/tasks/graphics/task-icons/new-medium.png (renamed from graphics/task-icons/new-medium.png)bin956 -> 956 bytes-rw-r--r--mod/tasks/graphics/task-icons/new-small.png (renamed from graphics/task-icons/new-small.png)bin611 -> 611 bytes-rw-r--r--mod/tasks/graphics/task-icons/new-tiny.png (renamed from graphics/task-icons/new-tiny.png)bin397 -> 397 bytes-rw-r--r--mod/tasks/graphics/tasklist-icons/tasklist-large.png (renamed from graphics/tasklist-icons/tasklist-large.png)bin21418 -> 21418 bytes-rw-r--r--mod/tasks/graphics/tasklist-icons/tasklist-medium.png (renamed from graphics/tasklist-icons/tasklist-medium.png)bin10364 -> 10364 bytes-rw-r--r--mod/tasks/graphics/tasklist-icons/tasklist-small.png (renamed from graphics/tasklist-icons/tasklist-small.png)bin3437 -> 3437 bytes-rw-r--r--mod/tasks/graphics/tasklist-icons/tasklist-tiny.png (renamed from graphics/tasklist-icons/tasklist-tiny.png)bin1579 -> 1579 bytes-rw-r--r--mod/tasks/languages/ca.php (renamed from languages/ca.php)0
-rw-r--r--mod/tasks/languages/en.php235
-rw-r--r--mod/tasks/languages/es.php (renamed from languages/es.php)0
-rw-r--r--mod/tasks/lib/tasks.php (renamed from lib/tasks.php)0
-rw-r--r--mod/tasks/manifest.xml (renamed from manifest.xml)0
-rw-r--r--mod/tasks/pages/tasks/edit_task.php (renamed from pages/tasks/edit_task.php)0
-rw-r--r--mod/tasks/pages/tasks/friends.php (renamed from pages/tasks/friends.php)0
-rw-r--r--mod/tasks/pages/tasks/new_task.php (renamed from pages/tasks/new_task.php)0
-rw-r--r--mod/tasks/pages/tasks/owner.php (renamed from pages/tasks/owner.php)0
-rw-r--r--mod/tasks/pages/tasks/view.php (renamed from pages/tasks/view.php)0
-rw-r--r--mod/tasks/pages/tasks/world.php (renamed from pages/tasks/world.php)0
-rw-r--r--mod/tasks/start.php (renamed from start.php)0
-rw-r--r--mod/tasks/upgrades/2012100501.php (renamed from upgrades/2012100501.php)0
-rw-r--r--mod/tasks/views/default/annotation/task_state_changed.php (renamed from views/default/annotation/task_state_changed.php)0
-rw-r--r--mod/tasks/views/default/forms/tasks/comments/add.php (renamed from views/default/forms/tasks/comments/add.php)0
-rw-r--r--mod/tasks/views/default/forms/tasks/edit.php (renamed from views/default/forms/tasks/edit.php)0
-rw-r--r--mod/tasks/views/default/forms/tasks/inline.php (renamed from views/default/forms/tasks/inline.php)0
-rw-r--r--mod/tasks/views/default/icon/object/task.php (renamed from views/default/icon/object/task.php)0
-rw-r--r--mod/tasks/views/default/input/tasks/list.php (renamed from views/default/input/tasks/list.php)0
-rw-r--r--mod/tasks/views/default/input/tasks/priority.php (renamed from views/default/input/tasks/priority.php)0
-rw-r--r--mod/tasks/views/default/js/tasks/tasklists.php (renamed from views/default/js/tasks/tasklists.php)0
-rw-r--r--mod/tasks/views/default/object/task.php (renamed from views/default/object/task.php)0
-rw-r--r--mod/tasks/views/default/object/tasklist_top.php (renamed from views/default/object/tasklist_top.php)0
-rw-r--r--mod/tasks/views/default/river/object/task/create.php13
-rw-r--r--mod/tasks/views/default/tasks/css.php (renamed from views/default/tasks/css.php)0
-rw-r--r--mod/tasks/views/default/tasks/group_module.php (renamed from views/default/tasks/group_module.php)0
-rw-r--r--mod/tasks/views/default/tasks/js.php (renamed from views/default/tasks/js.php)0
-rw-r--r--mod/tasks/views/default/tasks/page/elements/comments.php (renamed from views/default/tasks/page/elements/comments.php)0
-rw-r--r--mod/tasks/views/default/tasks/participant_count.php (renamed from views/default/tasks/participant_count.php)0
-rw-r--r--mod/tasks/views/default/tasks/sidebar.php (renamed from views/default/tasks/sidebar.php)0
-rw-r--r--mod/tasks/views/default/tasks/sidebar/navigation.php (renamed from views/default/tasks/sidebar/navigation.php)0
-rw-r--r--mod/tasks/views/default/tasks/tasklist_graph.php (renamed from views/default/tasks/tasklist_graph.php)0
-rw-r--r--mod/tasks/views/default/widgets/tasks/content.php (renamed from views/default/widgets/tasks/content.php)0
-rw-r--r--mod/tasks/views/default/widgets/tasks/edit.php (renamed from views/default/widgets/tasks/edit.php)0
-rw-r--r--mod/thewire/actions/add.php34
-rw-r--r--mod/thewire/actions/delete.php39
-rw-r--r--mod/thewire/activate.php10
-rw-r--r--mod/thewire/classes/ElggWire.php40
-rw-r--r--mod/thewire/deactivate.php6
-rw-r--r--mod/thewire/graphics/river_icon_thewire.gifbin0 -> 365 bytes-rw-r--r--mod/thewire/graphics/thewire_speech_bubble.gifbin0 -> 278 bytes-rw-r--r--mod/thewire/languages/en.php61
-rw-r--r--mod/thewire/manifest.xml17
-rw-r--r--mod/thewire/pages/thewire/everyone.php31
-rw-r--r--mod/thewire/pages/thewire/friends.php31
-rw-r--r--mod/thewire/pages/thewire/owner.php39
-rw-r--r--mod/thewire/pages/thewire/previous.php20
-rw-r--r--mod/thewire/pages/thewire/reply.php28
-rw-r--r--mod/thewire/pages/thewire/tag.php35
-rw-r--r--mod/thewire/pages/thewire/thread.php27
-rw-r--r--mod/thewire/pages/thewire/view.php31
-rw-r--r--mod/thewire/start.php475
-rw-r--r--mod/thewire/tests/regex.php303
-rw-r--r--mod/thewire/upgrades/2012122701-fix_entity_class.php8
-rw-r--r--mod/thewire/views/default/forms/thewire/add.php41
-rw-r--r--mod/thewire/views/default/js/thewire.php86
-rw-r--r--mod/thewire/views/default/object/thewire.php63
-rw-r--r--mod/thewire/views/default/river/object/thewire/create.php31
-rw-r--r--mod/thewire/views/default/thewire/css.php35
-rw-r--r--mod/thewire/views/default/thewire/previous.php11
-rw-r--r--mod/thewire/views/default/thewire/profile_status.php44
-rw-r--r--mod/thewire/views/default/thewire/reply.php14
-rw-r--r--mod/thewire/views/default/thewire/scripts/counter.js25
-rw-r--r--mod/thewire/views/default/thewire/sidebar.php9
-rw-r--r--mod/thewire/views/default/widgets/thewire/content.php30
-rw-r--r--mod/thewire/views/default/widgets/thewire/edit.php22
-rw-r--r--mod/thewire/views/rss/object/thewire.php36
-rw-r--r--mod/thewire/views/rss/search/object/thewire/entity.php27
-rw-r--r--mod/tinymce/README.txt10
-rw-r--r--mod/tinymce/activate.php14
-rw-r--r--mod/tinymce/css/elgg_tinymce.css5
-rw-r--r--mod/tinymce/languages/en.php15
-rw-r--r--mod/tinymce/manifest.xml17
-rw-r--r--mod/tinymce/start.php47
-rw-r--r--mod/tinymce/vendor/tinymce/changelog.txt477
-rw-r--r--mod/tinymce/vendor/tinymce/examples/accessibility.html101
-rw-r--r--mod/tinymce/vendor/tinymce/examples/css/content.css105
-rw-r--r--mod/tinymce/vendor/tinymce/examples/css/word.css53
-rw-r--r--mod/tinymce/vendor/tinymce/examples/custom_formats.html111
-rw-r--r--mod/tinymce/vendor/tinymce/examples/full.html101
-rw-r--r--mod/tinymce/vendor/tinymce/examples/index.html10
-rw-r--r--mod/tinymce/vendor/tinymce/examples/lists/image_list.js9
-rw-r--r--mod/tinymce/vendor/tinymce/examples/lists/link_list.js10
-rw-r--r--mod/tinymce/vendor/tinymce/examples/lists/media_list.js14
-rw-r--r--mod/tinymce/vendor/tinymce/examples/lists/template_list.js9
-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/logo.jpgbin0 -> 2729 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/logo_over.jpgbin0 -> 6473 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.avibin0 -> 82944 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.dcrbin0 -> 6774 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.flvbin0 -> 88722 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.movbin0 -> 55622 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.ram1
-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.rmbin0 -> 17846 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/media/sample.swfbin0 -> 6118 bytes-rw-r--r--mod/tinymce/vendor/tinymce/examples/menu.html18
-rw-r--r--mod/tinymce/vendor/tinymce/examples/simple.html47
-rw-r--r--mod/tinymce/vendor/tinymce/examples/skins.html216
-rw-r--r--mod/tinymce/vendor/tinymce/examples/templates/layout1.htm15
-rw-r--r--mod/tinymce/vendor/tinymce/examples/templates/snippet1.htm1
-rw-r--r--mod/tinymce/vendor/tinymce/examples/word.html72
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/langs/zu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/license.txt504
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css5
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js57
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js43
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm58
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css13
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js50
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm235
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gifbin0 -> 1624 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js464
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css8
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js61
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js543
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm338
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js176
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js184
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js119
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js433
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js120
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js163
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js85
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js43
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm42
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gifbin0 -> 354 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gifbin0 -> 329 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gifbin0 -> 331 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gifbin0 -> 342 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gifbin0 -> 340 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gifbin0 -> 336 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gifbin0 -> 338 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gifbin0 -> 343 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gifbin0 -> 321 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gifbin0 -> 323 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gifbin0 -> 344 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gifbin0 -> 338 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gifbin0 -> 328 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gifbin0 -> 337 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gifbin0 -> 350 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gifbin0 -> 336 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js43
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm22
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js84
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/img/example.gifbin0 -> 87 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js19
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js3
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js3
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js50
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css143
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js405
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm259
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js232
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js159
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm110
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js54
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js699
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gifbin0 -> 810 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gifbin0 -> 272 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gifbin0 -> 1195 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gifbin0 -> 907 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gifbin0 -> 909 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gifbin0 -> 769 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gifbin0 -> 84 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css90
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm387
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js83
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js262
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js139
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js955
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/css/media.css17
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js898
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js73
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/js/media.js513
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/media.htm922
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swfbin0 -> 19980 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js54
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js537
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js74
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js885
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js36
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js51
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm27
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm21
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js53
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/preview/example.html28
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js73
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/preview/preview.html17
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js34
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js101
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css6
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js61
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js142
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm100
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js436
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gifbin0 -> 46 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/css/props.css14
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js71
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/js/props.js709
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/props.htm845
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/style/readme.txt19
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js122
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/cell.htm180
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css17
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/css/row.css25
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/css/table.css13
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js1456
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js319
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js27
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/row.js254
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/table.js501
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm32
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/row.htm158
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/table/table.htm188
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/blank.htm12
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/css/template.css23
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js159
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/js/template.js106
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/template/template.htm31
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css21
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js63
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js83
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js122
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm142
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm142
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm149
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm142
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css11
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css9
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm162
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js132
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm162
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js28
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js28
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js111
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js28
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js53
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js229
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js53
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/about.htm52
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm26
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm55
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm70
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js1490
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/image.htm80
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpgbin0 -> 2584 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gifbin0 -> 239 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gifbin0 -> 11982 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gifbin0 -> 600 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gifbin0 -> 325 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gifbin0 -> 301 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gifbin0 -> 439 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gifbin0 -> 384 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gifbin0 -> 43 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gifbin0 -> 597 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gifbin0 -> 415 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js73
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js56
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js363
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js345
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js253
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js159
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js78
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/link.htm57
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm47
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css50
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css118
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.pngbin0 -> 3133 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gifbin0 -> 64 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gifbin0 -> 68 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gifbin0 -> 70 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gifbin0 -> 1787 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gifbin0 -> 1322 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css219
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css24
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css106
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css106
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css48
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css118
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.pngbin0 -> 2766 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.pngbin0 -> 651 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.pngbin0 -> 2084 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css222
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css8
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css5
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm25
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js84
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gifbin0 -> 806 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/langs/zu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css25
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css32
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css17
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.pngbin0 -> 5102 bytes-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css35
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/tiny_mce.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/tiny_mce_popup.js5
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/tiny_mce_src.js19030
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/utils/editable_selects.js70
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/utils/form_utils.js210
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/utils/mctabs.js162
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tiny_mce/utils/validate.js252
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/langs/zu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advhr/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advimage/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/advlink/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/emotions/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/fullpage/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/media/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/paste/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/searchreplace/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/style/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/table/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/template/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/plugins/xhtmlxtras/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ar_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/az_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/be_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bg_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/br_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/bs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ca_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ch_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cs_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/cy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/da_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/de_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/dv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/el_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/en_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/eo_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/es_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/et_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/eu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fa_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/fr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/gl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/gu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/he_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/hy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ia_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/id_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/is_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/it_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ja_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ka_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/kl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/km_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ko_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/kz_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/lv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/mk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ml_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/mn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ms_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/my_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nb_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/nn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/no_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/pl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ps_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/pt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ro_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ru_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sc_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/se_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/si_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sl_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sq_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sv_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/sy_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ta_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/te_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/th_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tr_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tt_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/uk_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/ur_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/vi_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh-cn_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh-tw_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zh_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/advanced/langs/zu_dlg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ar.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/az.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/be.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/bg.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/bn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/br.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/bs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ca.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ch.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/cs.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/cy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/da.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/de.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/dv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/el.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/en.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/eo.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/es.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/et.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/eu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/fa.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/fi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/fr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/gl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/gu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/he.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/hi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/hr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/hu.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/hy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ia.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/id.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/is.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/it.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ja.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ka.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/kl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/km.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ko.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/kz.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/lb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/lt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/lv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/mk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ml.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/mn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ms.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/my.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/nb.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/nl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/nn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/no.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/pl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ps.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/pt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ro.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ru.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sc.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/se.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/si.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sl.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sq.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sv.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/sy.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ta.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/te.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/th.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/tn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/tr.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/tt.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/uk.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/ur.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/vi.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/zh-cn.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/zh-tw.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/zh.js1
-rw-r--r--mod/tinymce/vendor/tinymce/jscripts/tinymce_language_pack/themes/simple/langs/zu.js1
-rw-r--r--mod/tinymce/views/default/js/tinymce.php102
-rw-r--r--mod/tinymce/views/default/tinymce/css.php31
-rw-r--r--mod/tinymce/views/default/tinymce/embed_custom_insert_js.php14
-rw-r--r--mod/tinymce/views/default/tinymce/init.php7
-rw-r--r--mod/translation_editor/CHANGES.txt102
-rw-r--r--mod/translation_editor/README.txt21
-rw-r--r--mod/translation_editor/_graphics/flags/ar.pngbin0 -> 938 bytes-rw-r--r--mod/translation_editor/_graphics/flags/bg.pngbin0 -> 118 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ca.pngbin0 -> 134 bytes-rw-r--r--mod/translation_editor/_graphics/flags/cs.pngbin0 -> 191 bytes-rw-r--r--mod/translation_editor/_graphics/flags/da.pngbin0 -> 130 bytes-rw-r--r--mod/translation_editor/_graphics/flags/de.pngbin0 -> 111 bytes-rw-r--r--mod/translation_editor/_graphics/flags/el.pngbin0 -> 189 bytes-rw-r--r--mod/translation_editor/_graphics/flags/en.pngbin0 -> 210 bytes-rw-r--r--mod/translation_editor/_graphics/flags/eo.pngbin0 -> 153 bytes-rw-r--r--mod/translation_editor/_graphics/flags/es.pngbin0 -> 241 bytes-rw-r--r--mod/translation_editor/_graphics/flags/et.pngbin0 -> 144 bytes-rw-r--r--mod/translation_editor/_graphics/flags/eu.pngbin0 -> 407 bytes-rw-r--r--mod/translation_editor/_graphics/flags/fa.pngbin0 -> 324 bytes-rw-r--r--mod/translation_editor/_graphics/flags/fi.pngbin0 -> 145 bytes-rw-r--r--mod/translation_editor/_graphics/flags/fo.pngbin0 -> 182 bytes-rw-r--r--mod/translation_editor/_graphics/flags/fr.pngbin0 -> 116 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ga.pngbin0 -> 117 bytes-rw-r--r--mod/translation_editor/_graphics/flags/gl.pngbin0 -> 396 bytes-rw-r--r--mod/translation_editor/_graphics/flags/he.pngbin0 -> 165 bytes-rw-r--r--mod/translation_editor/_graphics/flags/hi.pngbin0 -> 171 bytes-rw-r--r--mod/translation_editor/_graphics/flags/hr.pngbin0 -> 304 bytes-rw-r--r--mod/translation_editor/_graphics/flags/hu.pngbin0 -> 119 bytes-rw-r--r--mod/translation_editor/_graphics/flags/id.pngbin0 -> 107 bytes-rw-r--r--mod/translation_editor/_graphics/flags/is.pngbin0 -> 157 bytes-rw-r--r--mod/translation_editor/_graphics/flags/it.pngbin0 -> 116 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ja.pngbin0 -> 154 bytes-rw-r--r--mod/translation_editor/_graphics/flags/km.pngbin0 -> 273 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ko.pngbin0 -> 567 bytes-rw-r--r--mod/translation_editor/_graphics/flags/lb.pngbin0 -> 119 bytes-rw-r--r--mod/translation_editor/_graphics/flags/lt.pngbin0 -> 147 bytes-rw-r--r--mod/translation_editor/_graphics/flags/lv.pngbin0 -> 144 bytes-rw-r--r--mod/translation_editor/_graphics/flags/mn.pngbin0 -> 238 bytes-rw-r--r--mod/translation_editor/_graphics/flags/nb.pngbin0 -> 128 bytes-rw-r--r--mod/translation_editor/_graphics/flags/nl.pngbin0 -> 121 bytes-rw-r--r--mod/translation_editor/_graphics/flags/nn.pngbin0 -> 128 bytes-rw-r--r--mod/translation_editor/_graphics/flags/pl.pngbin0 -> 113 bytes-rw-r--r--mod/translation_editor/_graphics/flags/pt-br.pngbin0 -> 313 bytes-rw-r--r--mod/translation_editor/_graphics/flags/pt-pt.pngbin0 -> 271 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ro.pngbin0 -> 111 bytes-rw-r--r--mod/translation_editor/_graphics/flags/ru.pngbin0 -> 121 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sco.pngbin0 -> 188 bytes-rw-r--r--mod/translation_editor/_graphics/flags/se.pngbin0 -> 219 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sk.pngbin0 -> 259 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sl.pngbin0 -> 197 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sq.pngbin0 -> 266 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sr.pngbin0 -> 475 bytes-rw-r--r--mod/translation_editor/_graphics/flags/sv.pngbin0 -> 144 bytes-rw-r--r--mod/translation_editor/_graphics/flags/tg.pngbin0 -> 211 bytes-rw-r--r--mod/translation_editor/_graphics/flags/th.pngbin0 -> 132 bytes-rw-r--r--mod/translation_editor/_graphics/flags/tl.pngbin0 -> 347 bytes-rw-r--r--mod/translation_editor/_graphics/flags/tr.pngbin0 -> 198 bytes-rw-r--r--mod/translation_editor/_graphics/flags/uk.pngbin0 -> 108 bytes-rw-r--r--mod/translation_editor/_graphics/flags/vi.pngbin0 -> 223 bytes-rw-r--r--mod/translation_editor/_graphics/flags/zh-hans.pngbin0 -> 262 bytes-rw-r--r--mod/translation_editor/_graphics/flags/zh-hant.pngbin0 -> 174 bytes-rw-r--r--mod/translation_editor/_graphics/key.gifbin0 -> 917 bytes-rw-r--r--mod/translation_editor/actions/add_custom_key.php64
-rw-r--r--mod/translation_editor/actions/add_language.php19
-rw-r--r--mod/translation_editor/actions/delete.php20
-rw-r--r--mod/translation_editor/actions/delete_language.php26
-rw-r--r--mod/translation_editor/actions/disable_languages.php23
-rw-r--r--mod/translation_editor/actions/make_translation_editor.php23
-rw-r--r--mod/translation_editor/actions/merge.php29
-rw-r--r--mod/translation_editor/actions/translate.php76
-rw-r--r--mod/translation_editor/actions/translate_search.php84
-rw-r--r--mod/translation_editor/actions/unmake_translation_editor.php20
-rw-r--r--mod/translation_editor/languages/ca.php57
-rw-r--r--mod/translation_editor/languages/de.php56
-rw-r--r--mod/translation_editor/languages/en.php83
-rw-r--r--mod/translation_editor/languages/es.php59
-rw-r--r--mod/translation_editor/languages/fr.php80
-rw-r--r--mod/translation_editor/languages/nl.php56
-rw-r--r--mod/translation_editor/lib/events.php9
-rw-r--r--mod/translation_editor/lib/functions.php581
-rw-r--r--mod/translation_editor/lib/hooks.php45
-rw-r--r--mod/translation_editor/manifest.xml17
-rw-r--r--mod/translation_editor/pages/index.php64
-rw-r--r--mod/translation_editor/pages/search.php32
-rw-r--r--mod/translation_editor/start.php139
-rw-r--r--mod/translation_editor/views/default/core/settings/account/language.php42
-rw-r--r--mod/translation_editor/views/default/plugins/translation_editor/settings.php20
-rw-r--r--mod/translation_editor/views/default/translation_editor/add_custom_key.php21
-rw-r--r--mod/translation_editor/views/default/translation_editor/add_language.php167
-rw-r--r--mod/translation_editor/views/default/translation_editor/css/site.php99
-rw-r--r--mod/translation_editor/views/default/translation_editor/js/site.php41
-rw-r--r--mod/translation_editor/views/default/translation_editor/language_selector.php88
-rw-r--r--mod/translation_editor/views/default/translation_editor/plugin_edit.php147
-rw-r--r--mod/translation_editor/views/default/translation_editor/plugin_list.php84
-rw-r--r--mod/translation_editor/views/default/translation_editor/search.php43
-rw-r--r--mod/translation_editor/views/default/translation_editor/search_results.php78
-rw-r--r--mod/twitter_api/actions/twitter_api/interstitial_settings.php53
-rw-r--r--mod/twitter_api/graphics/sign-in-with-twitter-d.pngbin0 -> 3306 bytes-rw-r--r--mod/twitter_api/graphics/sign-in-with-twitter-l.pngbin0 -> 3062 bytes-rw-r--r--mod/twitter_api/graphics/sign_in_with_twitter.gifbin0 -> 3028 bytes-rw-r--r--mod/twitter_api/languages/en.php62
-rw-r--r--mod/twitter_api/lib/twitter_api.php383
-rw-r--r--mod/twitter_api/manifest.xml29
-rw-r--r--mod/twitter_api/pages/twitter_api/interstitial.php19
-rw-r--r--mod/twitter_api/start.php174
-rw-r--r--mod/twitter_api/vendors/twitteroauth/LICENSE22
-rw-r--r--mod/twitter_api/vendors/twitteroauth/OAuth.php872
-rw-r--r--mod/twitter_api/vendors/twitteroauth/README114
-rw-r--r--mod/twitter_api/vendors/twitteroauth/twitterOAuth.php241
-rw-r--r--mod/twitter_api/views/default/forms/twitter_api/interstitial_settings.php67
-rw-r--r--mod/twitter_api/views/default/plugins/twitter_api/settings.php65
-rw-r--r--mod/twitter_api/views/default/plugins/twitter_api/usersettings.php37
-rw-r--r--mod/twitter_api/views/default/twitter_api/css.php13
-rw-r--r--mod/twitter_api/views/default/twitter_api/js.php16
-rw-r--r--mod/twitter_api/views/default/twitter_api/login.php17
-rw-r--r--mod/twitter_api/views/default/twitter_api/metatags.php19
-rw-r--r--mod/upgrade-tools/fixicons.php83
-rw-r--r--mod/upgrade-tools/lib/upgrade_tools.php25
-rw-r--r--mod/upgrade-tools/manifest.xml17
-rw-r--r--mod/upgrade-tools/start.php1
-rw-r--r--mod/uservalidationbyemail/actions/bulk_action.php18
-rw-r--r--mod/uservalidationbyemail/actions/delete.php51
-rw-r--r--mod/uservalidationbyemail/actions/resend_validation.php51
-rw-r--r--mod/uservalidationbyemail/actions/validate.php53
-rw-r--r--mod/uservalidationbyemail/languages/en.php64
-rw-r--r--mod/uservalidationbyemail/lib/functions.php108
-rw-r--r--mod/uservalidationbyemail/manifest.xml17
-rw-r--r--mod/uservalidationbyemail/start.php255
-rw-r--r--mod/uservalidationbyemail/views/default/admin/users/unvalidated.php9
-rw-r--r--mod/uservalidationbyemail/views/default/forms/uservalidationbyemail/bulk_action.php112
-rw-r--r--mod/uservalidationbyemail/views/default/uservalidationbyemail/css.php12
-rw-r--r--mod/uservalidationbyemail/views/default/uservalidationbyemail/js.php28
-rw-r--r--mod/uservalidationbyemail/views/default/uservalidationbyemail/unvalidated_user.php50
-rw-r--r--mod/vegan/COPYING661
-rw-r--r--mod/vegan/README.org72
-rw-r--r--mod/vegan/activate.php9
-rw-r--r--mod/vegan/manifest.xml21
-rw-r--r--mod/vegan/start.php449
-rw-r--r--mod/vegan/views/default/plugins/vegan/settings.php16
-rw-r--r--mod/videolist/.gitignore15
-rw-r--r--mod/videolist/CHANGES.txt14
-rw-r--r--mod/videolist/actions/videolist/delete.php39
-rw-r--r--mod/videolist/actions/videolist/edit.php107
-rw-r--r--mod/videolist/graphics/_videolist_icon_medium.pngbin0 -> 4391 bytes-rw-r--r--mod/videolist/graphics/videolist_icon_medium.pngbin0 -> 3840 bytes-rw-r--r--mod/videolist/graphics/videolist_icon_small.pngbin0 -> 1960 bytes-rw-r--r--mod/videolist/graphics/videolist_icon_tiny.pngbin0 -> 1295 bytes-rw-r--r--mod/videolist/languages/ca.php40
-rw-r--r--mod/videolist/languages/en.php78
-rw-r--r--mod/videolist/languages/es.php40
-rw-r--r--mod/videolist/languages/fr.php28
-rw-r--r--mod/videolist/languages/gl.php29
-rw-r--r--mod/videolist/languages/pt.php50
-rw-r--r--mod/videolist/lib/Videolist/Platform/Bliptv.php38
-rw-r--r--mod/videolist/lib/Videolist/Platform/Gisstv.php50
-rw-r--r--mod/videolist/lib/Videolist/Platform/Metacafe.php38
-rw-r--r--mod/videolist/lib/Videolist/Platform/Vimeo.php40
-rw-r--r--mod/videolist/lib/Videolist/Platform/Youtube.php49
-rw-r--r--mod/videolist/lib/Videolist/PlatformInterface.php23
-rw-r--r--mod/videolist/lib/videolist.php46
-rw-r--r--mod/videolist/manifest.xml18
-rw-r--r--mod/videolist/pages/videolist/add.php39
-rw-r--r--mod/videolist/pages/videolist/all.php34
-rw-r--r--mod/videolist/pages/videolist/edit.php49
-rw-r--r--mod/videolist/pages/videolist/friends.php33
-rw-r--r--mod/videolist/pages/videolist/owner.php54
-rw-r--r--mod/videolist/pages/videolist/watch.php42
-rw-r--r--mod/videolist/start.php328
-rw-r--r--mod/videolist/thumbnail.php64
-rw-r--r--mod/videolist/upgrades/2012022501.php82
-rw-r--r--mod/videolist/views/default/forms/videolist/edit.php55
-rw-r--r--mod/videolist/views/default/icon/object/videolist_item.php47
-rw-r--r--mod/videolist/views/default/object/videolist_item.php108
-rw-r--r--mod/videolist/views/default/page/elements/videolist_block.php36
-rw-r--r--mod/videolist/views/default/river/object/videolist_item/create.php15
-rw-r--r--mod/videolist/views/default/videolist/css.php23
-rw-r--r--mod/videolist/views/default/videolist/group_module.php43
-rw-r--r--mod/videolist/views/default/videolist/sidebar.php28
-rw-r--r--mod/videolist/views/default/videolist/watch.php8
-rw-r--r--mod/videolist/views/default/videolist/watch/bliptv.php6
-rw-r--r--mod/videolist/views/default/videolist/watch/gisstv.php7
-rw-r--r--mod/videolist/views/default/videolist/watch/metacafe.php6
-rw-r--r--mod/videolist/views/default/videolist/watch/vimeo.php5
-rw-r--r--mod/videolist/views/default/videolist/watch/youtube.php5
-rw-r--r--mod/videolist/views/default/widgets/videolist/content.php32
-rw-r--r--mod/videolist/views/default/widgets/videolist/edit.php24
-rw-r--r--mod/videolist/views/rss/object/videolist_item.php47
-rw-r--r--mod/zaudio/audioplayer/audio-player.js5
-rw-r--r--mod/zaudio/audioplayer/license.txt19
-rw-r--r--mod/zaudio/audioplayer/player.swfbin0 -> 10816 bytes-rw-r--r--mod/zaudio/manifest.xml18
-rw-r--r--mod/zaudio/readme.txt9
-rw-r--r--mod/zaudio/start.php18
-rw-r--r--mod/zaudio/views/default/file/specialcontent/audio/mp3.php7
-rw-r--r--mod/zaudio/views/default/file/specialcontent/audio/mpeg.php7
-rw-r--r--mod/zaudio/views/default/file/specialcontent/audio/mpg.php7
-rw-r--r--mod/zaudio/views/default/zaudio/audioplayer.php23
-rw-r--r--mod/zaudio/views/default/zaudio/css.php10
-rw-r--r--pages/account/forgotten_password.php27
-rw-r--r--pages/account/login.php28
-rw-r--r--pages/account/register.php58
-rw-r--r--pages/account/reset_password.php40
-rw-r--r--pages/avatar/edit.php32
-rw-r--r--pages/avatar/view.php54
-rw-r--r--pages/entities/index.php56
-rw-r--r--pages/friends/collections/add.php22
-rw-r--r--pages/friends/collections/pickercallback.php59
-rw-r--r--pages/friends/collections/view.php21
-rw-r--r--pages/friends/index.php35
-rw-r--r--pages/friends/of.php35
-rw-r--r--pages/profile/edit.php32
-rw-r--r--pages/river.php61
-rw-r--r--pages/settings/account.php28
-rw-r--r--pages/settings/statistics.php28
-rw-r--r--pages/settings/tools.php29
-rwxr-xr-xsubtree.sh20
-rw-r--r--upgrade.php67
-rw-r--r--vendors/calendarpopup/CalendarPopup.js1462
-rw-r--r--vendors/jquery/fancybox/blank.gifbin0 -> 43 bytes-rw-r--r--vendors/jquery/fancybox/fancy_close.pngbin0 -> 1517 bytes-rw-r--r--vendors/jquery/fancybox/fancy_loading.pngbin0 -> 10195 bytes-rw-r--r--vendors/jquery/fancybox/fancy_nav_left.pngbin0 -> 1446 bytes-rw-r--r--vendors/jquery/fancybox/fancy_nav_right.pngbin0 -> 1454 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_e.pngbin0 -> 107 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_n.pngbin0 -> 106 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_ne.pngbin0 -> 347 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_nw.pngbin0 -> 324 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_s.pngbin0 -> 111 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_se.pngbin0 -> 352 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_sw.pngbin0 -> 340 bytes-rw-r--r--vendors/jquery/fancybox/fancy_shadow_w.pngbin0 -> 103 bytes-rw-r--r--vendors/jquery/fancybox/fancy_title_left.pngbin0 -> 503 bytes-rw-r--r--vendors/jquery/fancybox/fancy_title_main.pngbin0 -> 96 bytes-rw-r--r--vendors/jquery/fancybox/fancy_title_over.pngbin0 -> 70 bytes-rw-r--r--vendors/jquery/fancybox/fancy_title_right.pngbin0 -> 506 bytes-rw-r--r--vendors/jquery/fancybox/fancybox-x.pngbin0 -> 203 bytes-rw-r--r--vendors/jquery/fancybox/fancybox-y.pngbin0 -> 176 bytes-rw-r--r--vendors/jquery/fancybox/fancybox.pngbin0 -> 15287 bytes-rw-r--r--vendors/jquery/fancybox/jquery.easing-1.3.pack.js72
-rw-r--r--vendors/jquery/fancybox/jquery.fancybox-1.3.4.css359
-rw-r--r--vendors/jquery/fancybox/jquery.fancybox-1.3.4.js1156
-rw-r--r--vendors/jquery/fancybox/jquery.fancybox-1.3.4.pack.js46
-rw-r--r--vendors/jquery/fancybox/jquery.mousewheel-3.0.4.pack.js14
-rw-r--r--vendors/jquery/i18n/jquery-ui-i18n.js1646
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-af.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ar-DZ.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ar.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-az.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-bg.js24
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-bs.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ca.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-cs.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-cy-GB.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-da.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-de.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-el.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-en-AU.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-en-GB.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-en-NZ.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-eo.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-es.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-et.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-eu.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-fa.js59
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-fi.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-fo.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-fr-CH.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-fr.js25
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-gl.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-he.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-hi.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-hr.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-hu.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-hy.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-id.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-is.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-it.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ja.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ka.js21
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-kk.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-km.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ko.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-lb.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-lt.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-lv.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-mk.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ml.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ms.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-nl-BE.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-nl.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-no.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-pl.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-pt-BR.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-pt.js22
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-rm.js21
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ro.js26
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ru.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sk.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sl.js24
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sq.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sr-SR.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sr.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-sv.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-ta.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-th.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-tj.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-tr.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-uk.js24
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-vi.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-zh-CN.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-zh-HK.js23
-rw-r--r--vendors/jquery/i18n/jquery.ui.datepicker-zh-TW.js23
-rw-r--r--vendors/jquery/jquery-1.6.4.min.js4
-rw-r--r--vendors/jquery/jquery-ui-1.8.16.min.js414
-rw-r--r--vendors/jquery/jquery.autocomplete.min.js13
-rw-r--r--vendors/jquery/jquery.easing.1.3.packed.js1
-rw-r--r--vendors/jquery/jquery.form.js825
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/GPL-LICENSE.txt278
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/MIT-LICENSE.txt20
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/border-anim-h.gifbin0 -> 219 bytes-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/border-anim-v.gifbin0 -> 219 bytes-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/border-h.gifbin0 -> 72 bytes-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/border-v.gifbin0 -> 72 bytes-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/imgareaselect-animated.css41
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/imgareaselect-default.css41
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/css/imgareaselect-deprecated.css36
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.imgareaselect.js724
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.imgareaselect.min.js1
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.imgareaselect.pack.js1
-rw-r--r--vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.min.js18
-rw-r--r--vendors/jquery/jquery.jeditable.mini.js38
-rw-r--r--vendors/jquery/jquery.ui.autocomplete.html.js40
-rw-r--r--vendors/markdown/License.text36
-rw-r--r--vendors/markdown/PHP Markdown Extra Readme.text786
-rw-r--r--vendors/markdown/UPSTREAM_WARNING5
-rw-r--r--vendors/markdown/markdown.php2933
-rw-r--r--vendors/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE348
-rw-r--r--vendors/simpletest/LICENSE502
-rw-r--r--vendors/simpletest/README108
-rw-r--r--vendors/simpletest/VERSION1
-rw-r--r--vendors/simpletest/authentication.php238
-rw-r--r--vendors/simpletest/autorun.php87
-rw-r--r--vendors/simpletest/browser.php1098
-rw-r--r--vendors/simpletest/collector.php122
-rw-r--r--vendors/simpletest/compatibility.php166
-rw-r--r--vendors/simpletest/cookies.php380
-rw-r--r--vendors/simpletest/default_reporter.php133
-rw-r--r--vendors/simpletest/detached.php96
-rw-r--r--vendors/simpletest/docs/en/authentication_documentation.html355
-rw-r--r--vendors/simpletest/docs/en/browser_documentation.html447
-rw-r--r--vendors/simpletest/docs/en/docs.css121
-rw-r--r--vendors/simpletest/docs/en/expectation_documentation.html422
-rw-r--r--vendors/simpletest/docs/en/form_testing_documentation.html342
-rw-r--r--vendors/simpletest/docs/en/group_test_documentation.html386
-rw-r--r--vendors/simpletest/docs/en/index.html538
-rw-r--r--vendors/simpletest/docs/en/mock_objects_documentation.html757
-rw-r--r--vendors/simpletest/docs/en/overview.html486
-rw-r--r--vendors/simpletest/docs/en/partial_mocks_documentation.html445
-rw-r--r--vendors/simpletest/docs/en/reporter_documentation.html519
-rw-r--r--vendors/simpletest/docs/en/unit_test_documentation.html431
-rw-r--r--vendors/simpletest/docs/en/web_tester_documentation.html584
-rw-r--r--vendors/simpletest/docs/fr/authentication_documentation.html332
-rw-r--r--vendors/simpletest/docs/fr/browser_documentation.html446
-rw-r--r--vendors/simpletest/docs/fr/docs.css84
-rw-r--r--vendors/simpletest/docs/fr/expectation_documentation.html383
-rw-r--r--vendors/simpletest/docs/fr/form_testing_documentation.html349
-rw-r--r--vendors/simpletest/docs/fr/group_test_documentation.html398
-rw-r--r--vendors/simpletest/docs/fr/index.html572
-rw-r--r--vendors/simpletest/docs/fr/mock_objects_documentation.html778
-rw-r--r--vendors/simpletest/docs/fr/overview.html318
-rw-r--r--vendors/simpletest/docs/fr/partial_mocks_documentation.html460
-rw-r--r--vendors/simpletest/docs/fr/reporter_documentation.html534
-rw-r--r--vendors/simpletest/docs/fr/server_stubs_documentation.html0
-rw-r--r--vendors/simpletest/docs/fr/unit_test_documentation.html447
-rw-r--r--vendors/simpletest/docs/fr/web_tester_documentation.html566
-rw-r--r--vendors/simpletest/dumper.php360
-rw-r--r--vendors/simpletest/eclipse.php307
-rw-r--r--vendors/simpletest/encoding.php552
-rw-r--r--vendors/simpletest/errors.php288
-rw-r--r--vendors/simpletest/exceptions.php198
-rw-r--r--vendors/simpletest/expectation.php895
-rw-r--r--vendors/simpletest/extensions/pear_test_case.php198
-rw-r--r--vendors/simpletest/extensions/phpunit_test_case.php96
-rw-r--r--vendors/simpletest/extensions/testdox.php42
-rw-r--r--vendors/simpletest/extensions/testdox/test.php108
-rw-r--r--vendors/simpletest/form.php355
-rw-r--r--vendors/simpletest/frames.php596
-rw-r--r--vendors/simpletest/http.php624
-rw-r--r--vendors/simpletest/invoker.php139
-rw-r--r--vendors/simpletest/mock_objects.php1581
-rw-r--r--vendors/simpletest/page.php983
-rw-r--r--vendors/simpletest/parser.php764
-rw-r--r--vendors/simpletest/reflection_php4.php136
-rw-r--r--vendors/simpletest/reflection_php5.php380
-rw-r--r--vendors/simpletest/remote.php117
-rw-r--r--vendors/simpletest/reporter.php447
-rw-r--r--vendors/simpletest/scorer.php863
-rw-r--r--vendors/simpletest/selector.php137
-rw-r--r--vendors/simpletest/shell_tester.php333
-rw-r--r--vendors/simpletest/simpletest.php478
-rw-r--r--vendors/simpletest/socket.php216
-rw-r--r--vendors/simpletest/tag.php1418
-rw-r--r--vendors/simpletest/test/acceptance_test.php1633
-rw-r--r--vendors/simpletest/test/adapter_test.php77
-rw-r--r--vendors/simpletest/test/all_tests.php13
-rw-r--r--vendors/simpletest/test/authentication_test.php145
-rw-r--r--vendors/simpletest/test/autorun_test.php13
-rw-r--r--vendors/simpletest/test/bad_test_suite.php10
-rw-r--r--vendors/simpletest/test/browser_test.php779
-rw-r--r--vendors/simpletest/test/collector_test.php51
-rw-r--r--vendors/simpletest/test/command_line_test.php40
-rw-r--r--vendors/simpletest/test/compatibility_test.php97
-rw-r--r--vendors/simpletest/test/cookies_test.php227
-rw-r--r--vendors/simpletest/test/detached_test.php15
-rw-r--r--vendors/simpletest/test/dumper_test.php88
-rw-r--r--vendors/simpletest/test/eclipse_test.php32
-rw-r--r--vendors/simpletest/test/encoding_test.php213
-rw-r--r--vendors/simpletest/test/errors_test.php300
-rw-r--r--vendors/simpletest/test/exceptions_test.php153
-rw-r--r--vendors/simpletest/test/expectation_test.php245
-rw-r--r--vendors/simpletest/test/form_test.php323
-rw-r--r--vendors/simpletest/test/frames_test.php549
-rw-r--r--vendors/simpletest/test/http_test.php427
-rw-r--r--vendors/simpletest/test/interfaces_test.php137
-rw-r--r--vendors/simpletest/test/live_test.php47
-rw-r--r--vendors/simpletest/test/mock_objects_test.php994
-rw-r--r--vendors/simpletest/test/page_test.php903
-rw-r--r--vendors/simpletest/test/parse_error_test.php9
-rw-r--r--vendors/simpletest/test/parser_test.php551
-rw-r--r--vendors/simpletest/test/reflection_php4_test.php61
-rw-r--r--vendors/simpletest/test/reflection_php5_test.php271
-rw-r--r--vendors/simpletest/test/remote_test.php20
-rw-r--r--vendors/simpletest/test/shell_test.php38
-rw-r--r--vendors/simpletest/test/shell_tester_test.php42
-rw-r--r--vendors/simpletest/test/simpletest_test.php58
-rw-r--r--vendors/simpletest/test/socket_test.php25
-rw-r--r--vendors/simpletest/test/support/collector/collectable.10
-rw-r--r--vendors/simpletest/test/support/collector/collectable.20
-rw-r--r--vendors/simpletest/test/support/empty_test_file.php3
-rw-r--r--vendors/simpletest/test/support/latin1_sample1
-rw-r--r--vendors/simpletest/test/support/spl_examples.php15
-rw-r--r--vendors/simpletest/test/support/supplementary_upload_sample.txt1
-rw-r--r--vendors/simpletest/test/support/test1.php7
-rw-r--r--vendors/simpletest/test/support/upload_sample.txt1
-rw-r--r--vendors/simpletest/test/tag_test.php554
-rw-r--r--vendors/simpletest/test/test_with_parse_error.php8
-rw-r--r--vendors/simpletest/test/unit_tester_test.php55
-rw-r--r--vendors/simpletest/test/unit_tests.php55
-rw-r--r--vendors/simpletest/test/url_test.php443
-rw-r--r--vendors/simpletest/test/user_agent_test.php358
-rw-r--r--vendors/simpletest/test/visual_test.php495
-rw-r--r--vendors/simpletest/test/web_tester_test.php156
-rw-r--r--vendors/simpletest/test/xml_test.php187
-rw-r--r--vendors/simpletest/test_case.php708
-rw-r--r--vendors/simpletest/unit_tester.php420
-rw-r--r--vendors/simpletest/url.php528
-rw-r--r--vendors/simpletest/user_agent.php332
-rw-r--r--vendors/simpletest/web_tester.php1541
-rw-r--r--vendors/simpletest/xml.php647
-rw-r--r--vendors/sprintf.js183
-rw-r--r--version.php17
-rw-r--r--views/default/admin/appearance/default_widgets.php82
-rw-r--r--views/default/admin/appearance/menu_items.php10
-rw-r--r--views/default/admin/appearance/profile_fields.php24
-rw-r--r--views/default/admin/appearance/profile_fields/list.php55
-rw-r--r--views/default/admin/dashboard.php12
-rw-r--r--views/default/admin/footer.php9
-rw-r--r--views/default/admin/header.php27
-rw-r--r--views/default/admin/plugin_settings.php26
-rw-r--r--views/default/admin/plugins.php197
-rw-r--r--views/default/admin/settings/advanced.php9
-rw-r--r--views/default/admin/settings/advanced/site_secret.php11
-rw-r--r--views/default/admin/settings/basic.php9
-rw-r--r--views/default/admin/sidebar.php8
-rw-r--r--views/default/admin/statistics/overview.php13
-rw-r--r--views/default/admin/statistics/overview/basic.php19
-rw-r--r--views/default/admin/statistics/overview/numentities.php40
-rw-r--r--views/default/admin/statistics/server.php8
-rw-r--r--views/default/admin/statistics/server/php.php50
-rw-r--r--views/default/admin/statistics/server/web_server.php16
-rw-r--r--views/default/admin/users/add.php9
-rw-r--r--views/default/admin/users/admins.php12
-rw-r--r--views/default/admin/users/newest.php18
-rw-r--r--views/default/admin/users/online.php13
-rw-r--r--views/default/annotation/default.php40
-rw-r--r--views/default/annotation/generic_comment.php69
-rw-r--r--views/default/api/output.php42
-rw-r--r--views/default/core/account/login_box.php21
-rw-r--r--views/default/core/account/login_dropdown.php27
-rw-r--r--views/default/core/avatar/crop.php16
-rw-r--r--views/default/core/avatar/upload.php51
-rw-r--r--views/default/core/friends/collection.php64
-rw-r--r--views/default/core/friends/collections.php39
-rw-r--r--views/default/core/friends/collectiontabs.php62
-rw-r--r--views/default/core/friends/tablelist.php50
-rw-r--r--views/default/core/friends/tablelistcountupdate.php17
-rw-r--r--views/default/core/river/filter.php38
-rw-r--r--views/default/core/settings/account.php9
-rw-r--r--views/default/core/settings/account/default_access.php25
-rw-r--r--views/default/core/settings/account/email.php19
-rw-r--r--views/default/core/settings/account/language.php20
-rw-r--r--views/default/core/settings/account/name.php21
-rw-r--r--views/default/core/settings/account/notifications.php44
-rw-r--r--views/default/core/settings/account/password.php33
-rw-r--r--views/default/core/settings/statistics.php6
-rw-r--r--views/default/core/settings/statistics/numentities.php44
-rw-r--r--views/default/core/settings/statistics/online.php42
-rw-r--r--views/default/core/settings/tools.php34
-rw-r--r--views/default/core/walled_garden/login.php31
-rw-r--r--views/default/core/walled_garden/lost_password.php13
-rw-r--r--views/default/core/walled_garden/register.php17
-rw-r--r--views/default/css.php7
-rw-r--r--views/default/css/admin.php1677
-rw-r--r--views/default/css/elements/OOCSS_LICENSE30
-rw-r--r--views/default/css/elements/buttons.php156
-rw-r--r--views/default/css/elements/components.php286
-rw-r--r--views/default/css/elements/core.php117
-rw-r--r--views/default/css/elements/forms.php375
-rw-r--r--views/default/css/elements/grid.php54
-rw-r--r--views/default/css/elements/helpers.php144
-rw-r--r--views/default/css/elements/icons.php348
-rw-r--r--views/default/css/elements/layout.php121
-rw-r--r--views/default/css/elements/misc.php62
-rw-r--r--views/default/css/elements/modules.php194
-rw-r--r--views/default/css/elements/navigation.php560
-rw-r--r--views/default/css/elements/reset.php79
-rw-r--r--views/default/css/elements/typography.php162
-rw-r--r--views/default/css/elgg.php68
-rw-r--r--views/default/css/ie.php16
-rw-r--r--views/default/css/ie6.php12
-rw-r--r--views/default/css/ie7.php75
-rw-r--r--views/default/css/lightbox.php371
-rw-r--r--views/default/css/walled_garden.php81
-rw-r--r--views/default/errors/404.php8
-rw-r--r--views/default/errors/default.php8
-rw-r--r--views/default/export/entity.php79
-rw-r--r--views/default/export/metadata.php14
-rw-r--r--views/default/export/relationship.php21
-rw-r--r--views/default/forms/account/settings.php10
-rw-r--r--views/default/forms/admin/menu/save.php102
-rw-r--r--views/default/forms/admin/plugins/change_state.php22
-rw-r--r--views/default/forms/admin/plugins/filter.php26
-rw-r--r--views/default/forms/admin/plugins/sort.php26
-rw-r--r--views/default/forms/admin/site/regenerate_secret.php24
-rw-r--r--views/default/forms/admin/site/update_advanced.php101
-rw-r--r--views/default/forms/admin/site/update_basic.php31
-rw-r--r--views/default/forms/avatar/crop.php42
-rw-r--r--views/default/forms/avatar/upload.php16
-rw-r--r--views/default/forms/comments/add.php37
-rw-r--r--views/default/forms/friends/collections/add.php53
-rw-r--r--views/default/forms/login.php49
-rw-r--r--views/default/forms/members/name_search.php9
-rw-r--r--views/default/forms/members/tag_search.php12
-rw-r--r--views/default/forms/plugins/settings/save.php31
-rw-r--r--views/default/forms/plugins/usersettings/save.php14
-rw-r--r--views/default/forms/profile/edit.php81
-rw-r--r--views/default/forms/profile/fields/add.php29
-rw-r--r--views/default/forms/profile/fields/reset.php12
-rw-r--r--views/default/forms/register.php80
-rw-r--r--views/default/forms/user/passwordreset.php20
-rw-r--r--views/default/forms/user/requestnewpassword.php24
-rw-r--r--views/default/forms/useradd.php78
-rw-r--r--views/default/forms/usersettings/save.php14
-rw-r--r--views/default/forms/widgets/save.php41
-rw-r--r--views/default/graphics/ajax_loader.php32
-rw-r--r--views/default/group/default.php9
-rw-r--r--views/default/group/elements/summary.php13
-rw-r--r--views/default/group/search/finishblurb.php18
-rw-r--r--views/default/group/search/startblurb.php14
-rw-r--r--views/default/icon/default.php80
-rw-r--r--views/default/icon/user/default.php103
-rw-r--r--views/default/input/access.php38
-rw-r--r--views/default/input/autocomplete.php49
-rw-r--r--views/default/input/button.php40
-rw-r--r--views/default/input/calendar.php6
-rw-r--r--views/default/input/captcha.php8
-rw-r--r--views/default/input/checkbox.php39
-rw-r--r--views/default/input/checkboxes.php90
-rw-r--r--views/default/input/date.php56
-rw-r--r--views/default/input/datepicker.php6
-rw-r--r--views/default/input/dropdown.php71
-rw-r--r--views/default/input/email.php26
-rw-r--r--views/default/input/file.php31
-rw-r--r--views/default/input/form.php44
-rw-r--r--views/default/input/friendspicker.php319
-rw-r--r--views/default/input/hidden.php12
-rw-r--r--views/default/input/location.php27
-rw-r--r--views/default/input/longtext.php42
-rw-r--r--views/default/input/password.php28
-rw-r--r--views/default/input/plaintext.php37
-rw-r--r--views/default/input/pulldown.php9
-rw-r--r--views/default/input/radio.php76
-rw-r--r--views/default/input/reset.php14
-rw-r--r--views/default/input/securitytoken.php15
-rw-r--r--views/default/input/submit.php14
-rw-r--r--views/default/input/tag.php25
-rw-r--r--views/default/input/tags.php45
-rw-r--r--views/default/input/text.php26
-rw-r--r--views/default/input/url.php27
-rw-r--r--views/default/input/urlshortener.php8
-rw-r--r--views/default/input/userpicker.php75
-rw-r--r--views/default/js/admin.php126
-rw-r--r--views/default/js/elgg.php77
-rw-r--r--views/default/js/initialise_elgg.php4
-rw-r--r--views/default/js/initialize_elgg.php52
-rw-r--r--views/default/js/languages.php33
-rw-r--r--views/default/js/languages/en.php2
-rw-r--r--views/default/js/lightbox.php36
-rw-r--r--views/default/js/walled_garden.php67
-rw-r--r--views/default/navigation/breadcrumbs.php41
-rw-r--r--views/default/navigation/menu/default.php31
-rw-r--r--views/default/navigation/menu/elements/item.php43
-rw-r--r--views/default/navigation/menu/elements/section.php30
-rw-r--r--views/default/navigation/menu/page.php36
-rw-r--r--views/default/navigation/menu/site.php30
-rw-r--r--views/default/navigation/menu/user_hover.php60
-rw-r--r--views/default/navigation/pagination.php132
-rw-r--r--views/default/navigation/tabs.php81
-rw-r--r--views/default/navigation/topbar_tools.php9
-rw-r--r--views/default/navigation/viewtype.php11
-rw-r--r--views/default/object/admin_notice.php20
-rw-r--r--views/default/object/default.php48
-rw-r--r--views/default/object/elements/full.php37
-rw-r--r--views/default/object/elements/summary.php59
-rw-r--r--views/default/object/plugin.php20
-rw-r--r--views/default/object/plugin/elements/dependencies.php49
-rw-r--r--views/default/object/plugin/full.php308
-rw-r--r--views/default/object/plugin/invalid.php42
-rw-r--r--views/default/object/widget.php75
-rw-r--r--views/default/object/widget/elements/controls.php14
-rw-r--r--views/default/object/widget/elements/settings.php25
-rw-r--r--views/default/output/access.php42
-rw-r--r--views/default/output/calendar.php13
-rw-r--r--views/default/output/checkboxes.php13
-rw-r--r--views/default/output/confirmlink.php47
-rw-r--r--views/default/output/date.php17
-rw-r--r--views/default/output/dropdown.php13
-rw-r--r--views/default/output/email.php17
-rw-r--r--views/default/output/friendlytime.php12
-rw-r--r--views/default/output/friendlytitle.php19
-rw-r--r--views/default/output/iframe.php13
-rw-r--r--views/default/output/img.php12
-rw-r--r--views/default/output/location.php19
-rw-r--r--views/default/output/longtext.php38
-rw-r--r--views/default/output/pulldown.php14
-rw-r--r--views/default/output/radio.php13
-rw-r--r--views/default/output/tag.php35
-rw-r--r--views/default/output/tagcloud.php66
-rw-r--r--views/default/output/tags.php82
-rw-r--r--views/default/output/text.php12
-rw-r--r--views/default/output/url.php56
-rw-r--r--views/default/page/admin.php66
-rw-r--r--views/default/page/components/gallery.php77
-rw-r--r--views/default/page/components/image_block.php52
-rw-r--r--views/default/page/components/list.php75
-rw-r--r--views/default/page/components/module.php48
-rw-r--r--views/default/page/components/summary.php4
-rw-r--r--views/default/page/default.php76
-rw-r--r--views/default/page/elements/body.php8
-rw-r--r--views/default/page/elements/comments.php42
-rw-r--r--views/default/page/elements/comments_block.php45
-rw-r--r--views/default/page/elements/foot.php11
-rw-r--r--views/default/page/elements/footer.php22
-rw-r--r--views/default/page/elements/head.php81
-rw-r--r--views/default/page/elements/header.php14
-rw-r--r--views/default/page/elements/header_logo.php15
-rw-r--r--views/default/page/elements/messages.php27
-rw-r--r--views/default/page/elements/owner_block.php31
-rw-r--r--views/default/page/elements/shortcut_icon.php6
-rw-r--r--views/default/page/elements/sidebar.php32
-rw-r--r--views/default/page/elements/sidebar_alt.php12
-rw-r--r--views/default/page/elements/tagcloud_block.php58
-rw-r--r--views/default/page/elements/title.php14
-rw-r--r--views/default/page/elements/topbar.php16
-rw-r--r--views/default/page/elements/wrapper.php22
-rw-r--r--views/default/page/error.php14
-rw-r--r--views/default/page/layouts/admin.php40
-rw-r--r--views/default/page/layouts/content.php53
-rw-r--r--views/default/page/layouts/content/filter.php52
-rw-r--r--views/default/page/layouts/content/footer.php8
-rw-r--r--views/default/page/layouts/content/header.php43
-rw-r--r--views/default/page/layouts/content/sidebar.php8
-rw-r--r--views/default/page/layouts/default.php18
-rw-r--r--views/default/page/layouts/error.php12
-rw-r--r--views/default/page/layouts/one_column.php38
-rw-r--r--views/default/page/layouts/one_sidebar.php48
-rw-r--r--views/default/page/layouts/two_column_left_sidebar.php26
-rw-r--r--views/default/page/layouts/two_sidebar.php43
-rw-r--r--views/default/page/layouts/walled_garden.php16
-rw-r--r--views/default/page/layouts/widgets.php62
-rw-r--r--views/default/page/layouts/widgets/add_button.php16
-rw-r--r--views/default/page/layouts/widgets/add_panel.php62
-rw-r--r--views/default/page/upgrade.php18
-rw-r--r--views/default/page/walled_garden.php40
-rw-r--r--views/default/profile/icon.php17
-rw-r--r--views/default/river/annotation/generic_comment/create.php11
-rw-r--r--views/default/river/elements/body.php67
-rw-r--r--views/default/river/elements/image.php16
-rw-r--r--views/default/river/elements/layout.php14
-rw-r--r--views/default/river/elements/responses.php63
-rw-r--r--views/default/river/elements/summary.php54
-rw-r--r--views/default/river/item.php30
-rw-r--r--views/default/river/relationship/friend/create.php14
-rw-r--r--views/default/river/user/default/profileiconupdate.php24
-rw-r--r--views/default/river/user/default/profileupdate.php20
-rw-r--r--views/default/site/default.php17
-rw-r--r--views/default/user/default.php57
-rw-r--r--views/default/user/elements/summary.php13
-rw-r--r--views/default/user/search/finishblurb.php18
-rw-r--r--views/default/user/search/startblurb.php10
-rw-r--r--views/default/widgets/admin_welcome/content.php19
-rw-r--r--views/default/widgets/content_stats/content.php28
-rw-r--r--views/default/widgets/content_stats/edit.php23
-rw-r--r--views/default/widgets/control_panel/content.php38
-rw-r--r--views/default/widgets/friends/content.php25
-rw-r--r--views/default/widgets/friends/edit.php52
-rw-r--r--views/default/widgets/new_users/content.php11
-rw-r--r--views/default/widgets/new_users/edit.php23
-rw-r--r--views/default/widgets/online_users/content.php15
-rw-r--r--views/default/widgets/online_users/edit.php22
-rw-r--r--views/default/widgets/river_widget/content.php27
-rw-r--r--views/default/widgets/river_widget/edit.php58
-rw-r--r--views/failsafe/messages/exceptions/admin_exception.php30
-rw-r--r--views/failsafe/messages/exceptions/exception.php20
-rw-r--r--views/failsafe/page/default.php60
-rw-r--r--views/foaf/page/default.php47
-rw-r--r--views/foaf/user/default.php23
-rw-r--r--views/ical/export/entity.php33
-rw-r--r--views/ical/object/default.php10
-rw-r--r--views/ical/page/default.php19
-rw-r--r--views/installation/forms/install/template.php30
-rw-r--r--views/installation/input/access.php38
-rw-r--r--views/installation/input/button.php40
-rw-r--r--views/installation/input/checkbox.php24
-rw-r--r--views/installation/input/combo.php19
-rw-r--r--views/installation/input/dropdown.php36
-rw-r--r--views/installation/input/form.php30
-rw-r--r--views/installation/input/password.php17
-rw-r--r--views/installation/input/submit.php11
-rw-r--r--views/installation/input/text.php20
-rw-r--r--views/installation/install/js_rewrite_check.php12
-rw-r--r--views/installation/install/nav.php35
-rw-r--r--views/installation/install/pages/admin.php17
-rw-r--r--views/installation/install/pages/complete.php16
-rw-r--r--views/installation/install/pages/database.php26
-rw-r--r--views/installation/install/pages/requirements.php39
-rw-r--r--views/installation/install/pages/settings.php14
-rw-r--r--views/installation/install/pages/welcome.php8
-rw-r--r--views/installation/page/default.php57
-rw-r--r--views/installation/page/elements/footer.php10
-rw-r--r--views/installation/page/elements/header.php8
-rw-r--r--views/installation/page/elements/messages.php21
-rw-r--r--views/installation/page/elements/sidebar.php26
-rw-r--r--views/json/api/output.php17
-rw-r--r--views/json/export/entity.php25
-rw-r--r--views/json/export/metadata.php21
-rw-r--r--views/json/export/relationship.php21
-rw-r--r--views/json/group/default.php9
-rw-r--r--views/json/messages/exceptions/exception.php15
-rw-r--r--views/json/object/default.php9
-rw-r--r--views/json/page/components/list.php14
-rw-r--r--views/json/page/default.php13
-rw-r--r--views/json/river/item.php19
-rw-r--r--views/json/site/default.php9
-rw-r--r--views/json/user/default.php9
-rw-r--r--views/opendd/export/entity.php14
-rw-r--r--views/opendd/export/metadata.php18
-rw-r--r--views/opendd/export/relationship.php17
-rw-r--r--views/opendd/group/default.php12
-rw-r--r--views/opendd/messages/exceptions/exception.php21
-rw-r--r--views/opendd/object/default.php12
-rw-r--r--views/opendd/page/default.php16
-rw-r--r--views/opendd/search/entity_list.php11
-rw-r--r--views/opendd/site/default.php13
-rw-r--r--views/opendd/user/default.php12
-rw-r--r--views/php/api/output.php13
-rw-r--r--views/php/export/entity.php19
-rw-r--r--views/php/export/metadata.php19
-rw-r--r--views/php/export/relationship.php19
-rw-r--r--views/php/group/default.php9
-rw-r--r--views/php/messages/exceptions/exception.php12
-rw-r--r--views/php/object/default.php9
-rw-r--r--views/php/page/default.php9
-rw-r--r--views/php/site/default.php9
-rw-r--r--views/php/user/default.php9
-rw-r--r--views/rss/annotation/generic_comment.php33
-rw-r--r--views/rss/group/default.php37
-rw-r--r--views/rss/object/default.php36
-rw-r--r--views/rss/output/url.php6
-rw-r--r--views/rss/page/components/creator.php14
-rw-r--r--views/rss/page/components/gallery.php8
-rw-r--r--views/rss/page/components/georss.php15
-rw-r--r--views/rss/page/components/image_block.php7
-rw-r--r--views/rss/page/components/list.php14
-rw-r--r--views/rss/page/default.php46
-rw-r--r--views/rss/page/elements/comments.php13
-rw-r--r--views/rss/page/layouts/default.php5
-rw-r--r--views/rss/river/item.php35
-rw-r--r--views/rss/user/default.php34
-rw-r--r--views/xml/api/output.php14
-rw-r--r--views/xml/messages/exceptions/exception.php25
-rw-r--r--views/xml/page/default.php14
-rw-r--r--views/xml/xml-rpc/output.php11
10392 files changed, 720882 insertions, 208 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..2303faa0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,57 @@
+# ignore Elgg configuration
+/engine/settings.php
+/engine/handlers/views_simplecache/*
+/.htaccess
+/mod/*
+
+# don't ignore bundled plugins
+!/mod/blog/
+!/mod/bookmarks/
+!/mod/categories/
+!/mod/custom_index/
+!/mod/dashboard/
+!/mod/developers/
+!/mod/diagnostics/
+!/mod/embed/
+!/mod/externalpages/
+!/mod/file/
+!/mod/garbagecollector/
+!/mod/groups/
+!/mod/htmlawed/
+!/mod/invitefriends/
+!/mod/likes/
+!/mod/linkup/
+!/mod/logbrowser/
+!/mod/logrotate/
+!/mod/members/
+!/mod/messageboard/
+!/mod/messages/
+!/mod/notifications/
+!/mod/oauth_api/
+!/mod/pages/
+!/mod/profile/
+!/mod/reportedcontent/
+!/mod/search/
+!/mod/tagcloud/
+!/mod/thewire/
+!/mod/tinymce/
+!/mod/twitter/
+!/mod/twitter_api/
+!/mod/uservalidationbyemail/
+!/mod/zaudio/
+
+# ignore IDE/hidden/testing/OS cache files
+.*
+*~
+/nbproject
+/nb-configuration.xml
+Session.vim
+*.tmproj
+*.tmproject
+tmtags
+Thumbs.db
+Desktop.ini
+/JsTestDriver-*.jar
+
+# don't ignore travis config
+!/.travis.yml
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..5cc8f375a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: php
+phps:
+ - 5.2
+ - 5.3
+
+script: phpunit --help
+
+branches:
+ only:
+ - master \ No newline at end of file
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 000000000..b1600d70c
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,501 @@
+[main]
+host = https://www.transifex.com
+
+[lorea.engine]
+file_filter = languages/<lang>.php
+source_file = languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.blog]
+file_filter = mod/blog/languages/<lang>.php
+source_file = mod/blog/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.bookmarks]
+file_filter = mod/bookmarks/languages/<lang>.php
+source_file = mod/bookmarks/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.categories]
+file_filter = mod/categories/languages/<lang>.php
+source_file = mod/categories/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.ckeditor]
+file_filter = mod/ckeditor/languages/<lang>.php
+source_file = mod/ckeditor/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.custom_index]
+file_filter = mod/custom_index/languages/<lang>.php
+source_file = mod/custom_index/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.dashboard]
+file_filter = mod/dashboard/languages/<lang>.php
+source_file = mod/dashboard/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.developers]
+file_filter = mod/developers/languages/<lang>.php
+source_file = mod/developers/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.diagnostics]
+file_filter = mod/diagnostics/languages/<lang>.php
+source_file = mod/diagnostics/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.embed]
+file_filter = mod/embed/languages/<lang>.php
+source_file = mod/embed/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.externalpages]
+file_filter = mod/externalpages/languages/<lang>.php
+source_file = mod/externalpages/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.file]
+file_filter = mod/file/languages/<lang>.php
+source_file = mod/file/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.garbagecollector]
+file_filter = mod/garbagecollector/languages/<lang>.php
+source_file = mod/garbagecollector/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.groups]
+file_filter = mod/groups/languages/<lang>.php
+source_file = mod/groups/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.invitefriends]
+file_filter = mod/invitefriends/languages/<lang>.php
+source_file = mod/invitefriends/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.likes]
+file_filter = mod/likes/languages/<lang>.php
+source_file = mod/likes/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.logbrowser]
+file_filter = mod/logbrowser/languages/<lang>.php
+source_file = mod/logbrowser/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.logrotate]
+file_filter = mod/logrotate/languages/<lang>.php
+source_file = mod/logrotate/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.members]
+file_filter = mod/members/languages/<lang>.php
+source_file = mod/members/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.messageboard]
+file_filter = mod/messageboard/languages/<lang>.php
+source_file = mod/messageboard/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.messages]
+file_filter = mod/messages/languages/<lang>.php
+source_file = mod/messages/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.notifications]
+file_filter = mod/notifications/languages/<lang>.php
+source_file = mod/notifications/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.pages]
+file_filter = mod/pages/languages/<lang>.php
+source_file = mod/pages/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.profile]
+file_filter = mod/profile/languages/<lang>.php
+source_file = mod/profile/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.reportedcontent]
+file_filter = mod/reportedcontent/languages/<lang>.php
+source_file = mod/reportedcontent/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.search]
+file_filter = mod/search/languages/<lang>.php
+source_file = mod/search/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.tagcloud]
+file_filter = mod/tagcloud/languages/<lang>.php
+source_file = mod/tagcloud/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.thewire]
+file_filter = mod/thewire/languages/<lang>.php
+source_file = mod/thewire/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.twitter]
+file_filter = mod/twitter/languages/<lang>.php
+source_file = mod/twitter/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.twitter_api]
+file_filter = mod/twitter_api/languages/<lang>.php
+source_file = mod/twitter_api/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.uservalidationbyemail]
+file_filter = mod/uservalidationbyemail/languages/<lang>.php
+source_file = mod/uservalidationbyemail/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.install]
+file_filter = install/languages/<lang>.php
+source_file = install/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.admins]
+file_filter = mod/admins/languages/<lang>.php
+source_file = mod/admins/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.assemblies]
+file_filter = mod/assemblies/languages/<lang>.php
+source_file = mod/assemblies/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.elggman]
+file_filter = mod/elggman/languages/<lang>.php
+source_file = mod/elggman/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.autosubscribegroup]
+file_filter = mod/autosubscribegroup/languages/<lang>.php
+source_file = mod/autosubscribegroup/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.beechat]
+file_filter = mod/beechat/languages/<lang>.php
+source_file = mod/beechat/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.captcha]
+file_filter = mod/captcha/languages/<lang>.php
+source_file = mod/captcha/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.cic_theme]
+file_filter = mod/cic_theme/languages/<lang>.php
+source_file = mod/cic_theme/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.colorbox]
+file_filter = mod/colorbox/languages/<lang>.php
+source_file = mod/colorbox/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.crud]
+file_filter = mod/crud/languages/<lang>.php
+source_file = mod/crud/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.curatedgroups]
+file_filter = mod/curatedgroups/languages/<lang>.php
+source_file = mod/curatedgroups/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.custom_index_widgets]
+file_filter = mod/custom_index_widgets/languages/<lang>.php
+source_file = mod/custom_index_widgets/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.dokuwiki]
+file_filter = mod/dokuwiki/languages/<lang>.php
+source_file = mod/dokuwiki/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.elgg-activitystreams]
+file_filter = mod/elgg-activitystreams/languages/<lang>.php
+source_file = mod/elgg-activitystreams/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.elgg-ostatus]
+file_filter = mod/elgg-ostatus/languages/<lang>.php
+source_file = mod/elgg-ostatus/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.elggpg]
+file_filter = mod/elggpg/languages/<lang>.php
+source_file = mod/elggpg/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.elgg-push]
+file_filter = mod/elgg-push/languages/<lang>.php
+source_file = mod/elgg-push/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.email_revalidate]
+file_filter = mod/email_revalidate/languages/<lang>.php
+source_file = mod/email_revalidate/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.etherpad]
+file_filter = mod/etherpad/languages/<lang>.php
+source_file = mod/etherpad/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.favorites]
+file_filter = mod/favorites/languages/<lang>.php
+source_file = mod/favorites/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.federated-objects]
+file_filter = mod/federated-objects/languages/<lang>.php
+source_file = mod/federated-objects/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.friendrequest]
+file_filter = mod/friendrequest/languages/<lang>.php
+source_file = mod/friendrequest/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.gifts]
+file_filter = mod/gifts/languages/<lang>.php
+source_file = mod/gifts/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.group_alias]
+file_filter = mod/group_alias/languages/<lang>.php
+source_file = mod/group_alias/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.group_operators]
+file_filter = mod/group_operators/languages/<lang>.php
+source_file = mod/group_operators/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.identica]
+file_filter = mod/identica/languages/<lang>.php
+source_file = mod/identica/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.infinite_scroll]
+file_filter = mod/infinite_scroll/languages/<lang>.php
+source_file = mod/infinite_scroll/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.landing]
+file_filter = mod/landing/languages/<lang>.php
+source_file = mod/landing/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.lightpics]
+file_filter = mod/lightpics/languages/<lang>.php
+source_file = mod/lightpics/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.linkup]
+file_filter = mod/linkup/languages/<lang>.php
+source_file = mod/linkup/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.livestream]
+file_filter = mod/livestream/languages/<lang>.php
+source_file = mod/livestream/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.microthemes]
+file_filter = mod/microthemes/languages/<lang>.php
+source_file = mod/microthemes/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.n1_theme]
+file_filter = mod/n1_theme/languages/<lang>.php
+source_file = mod/n1_theme/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.openid_client]
+file_filter = mod/openid_client/languages/<lang>.php
+source_file = mod/openid_client/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.opensearch]
+file_filter = mod/opensearch/languages/<lang>.php
+source_file = mod/opensearch/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.profile_widgets]
+file_filter = mod/profile_widgets/languages/<lang>.php
+source_file = mod/profile_widgets/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.proposals]
+file_filter = mod/proposals/languages/<lang>.php
+source_file = mod/proposals/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.registrationterms]
+file_filter = mod/registrationterms/languages/<lang>.php
+source_file = mod/registrationterms/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.relatedgroups]
+file_filter = mod/relatedgroups/languages/<lang>.php
+source_file = mod/relatedgroups/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.river_privacy]
+file_filter = mod/river_privacy/languages/<lang>.php
+source_file = mod/river_privacy/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.simple_faq]
+file_filter = mod/simple_faq/languages/<lang>.php
+source_file = mod/simple_faq/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.simplepie]
+file_filter = mod/simplepie/languages/<lang>.php
+source_file = mod/simplepie/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.spotlight]
+file_filter = mod/spotlight/languages/<lang>.php
+source_file = mod/spotlight/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.subgroups]
+file_filter = mod/subgroups/languages/<lang>.php
+source_file = mod/subgroups/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.suicide]
+file_filter = mod/suicide/languages/<lang>.php
+source_file = mod/suicide/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.tasks]
+file_filter = mod/tasks/languages/<lang>.php
+source_file = mod/tasks/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.threads]
+file_filter = mod/threads/languages/<lang>.php
+source_file = mod/threads/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.tinymce]
+file_filter = mod/tinymce/languages/<lang>.php
+source_file = mod/tinymce/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.uservalidationbyadmin]
+file_filter = mod/uservalidationbyadmin/languages/<lang>.php
+source_file = mod/uservalidationbyadmin/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.videolist]
+file_filter = mod/videolist/languages/<lang>.php
+source_file = mod/videolist/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.openid_server]
+file_filter = mod/openid_server/languages/<lang>.php
+source_file = mod/openid_server/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
+[lorea.event_calendar]
+file_filter = mod/event_calendar/languages/<lang>.php
+source_file = mod/event_calendar/languages/en.php
+source_lang = en
+type = PHP_ARRAY
+
diff --git a/CHANGES.txt b/CHANGES.txt
new file mode 100644
index 000000000..f6974a3ae
--- /dev/null
+++ b/CHANGES.txt
@@ -0,0 +1,679 @@
+Version 1.8.18
+(January 11, 2014 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Juho Jaakkola
+ * Steve Clay
+
+ Bugfixes:
+ * Fixes notify_user() broken in 1.8.17
+
+
+Version 1.8.17
+(January 1, 2014 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Brett Profitt
+ * Cash Costello
+ * Ed Lyons
+ * Evan Winslow
+ * Jeroen Dalsem
+ * Jerome Bakker
+ * Juho Jaakkola
+ * Matt Beckett
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Security Fixes:
+ * Specially-crafted request could return the contents of sensitive files.
+ * Reflected XSS attack was possible against 1.8 systems.
+ * The cryptographic key used for various purposes may have been generated with weak entropy, particularly on Windows.
+
+ Bugfixes:
+ * URLs with non-ASCII usernames again work
+ * Floated images are now properly cleared in content areas
+ * The activity page title now matches the document title
+ * Search again supports multiple comments on the same entity
+ * Blog archive sidebar now reverse chronological
+ * URLs with matching parens can now be auto-linked
+ * Log browser links for users now work
+ * Disabling over 50 objects should no longer result in an infinite loop
+ * Radio/checkbox inputs no longer have border radius (for IE10)
+ * User picker: the Only Friends checkbox again works
+ * Group bookmarklet no longer shown to non-members
+ * Widget reordering fixed when moving across columns
+ * Refuse to deactivate plugins needed as dependencies
+
+ Enhancements:
+ * Group member listings are ordered by name
+ * The system_log table can now store IPv6 addresses
+ * Web services auth_gettoken() now accepts email address
+ * List functions: no need to specify pagination for unlimited queries
+ * Htmlawed was upgraded to 1.1.16
+
+
+Version 1.8.16
+(June 25, 2013 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Brett Profitt
+ * Cash Costello
+ * Jeff Tilson
+ * Jerome Bakker
+ * Paweł Sroka
+ * Steve Clay
+
+ Security Fixes:
+ * Fixed avatar removal bug (thanks to Jerome Bakker for the first report of this)
+
+ Bugfixes:
+ * Fixed infinite loop when deleting/disabling an entity with > 50 annotations
+ * Fixed deleting log tables in log rotate plugin
+ * Added full text index for groups if missing
+ * Added workaround for IE8 and jumping user avatar
+ * Fixed pagination for members pages
+ * Fixed several internal cache issues
+ * Plus many more bug fixes
+
+
+Version 1.8.15
+(April 23, 2013 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Cash Costello
+ * Ismayil Khayredinov
+ * Jeff Tilson
+ * Juho Jaakkola
+ * Matt Beckett
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+ * Tom Voorneveld
+
+ Bugfixes:
+ * Not displaying http:// on profiles when website isn't set
+ * Fixed pagination display issue for small screens
+ * Not hiding subpages of top level pages that have been deleted
+ * Stop corrupting JavaScript views with elgg deprecation messages
+ * Fixed out of memory error due to query cache
+ * Fixed bug preventing users authorizing Twitter account access
+ * Fixed friends access level for editing pages
+ * Fixed uploading files within the embed dialog
+
+ Enhancements:
+ * Added browser caching of language JS files
+ * Adding nofollow on user posted URLs for spam deterrence (thanks to Hellekin)
+ * Auto-registering views for simplecache when their URL is requested
+ * Display helpful message for those who have site URL configuration issues
+ * Can revert to a previous revision with pages plugin
+ * Site owners can turn off posting wire messages to Twitter
+ * Search results are sorted by relevance
+
+ Dropped Plugins:
+ * Twitter widget due to changes in Twitter API and terms of service
+ * OAuth API plugin due to conflicts with the Twitter API plugin
+
+
+Version 1.8.14
+(March 12, 2013 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Aday Talavera
+ * Brett Profitt
+ * Cash Costello
+ * Ed Lyons
+ * German Bortoli
+ * Hellekin Wolf
+ * iionly
+ * Jerome Bakker
+ * Luciano Lima
+ * Matt Beckett
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Security Fixes:
+ * Fixed a XSS vulnerability when accepting URLs on user profiles
+ * Fixed bug that exposed subject lines of messages in inbox
+ * Added requirement for CSRF token for login
+
+ Bugfixes:
+ * Strip html tags from tag input
+ * Fixed several display issues for IE7
+ * Fixed several issues with blog drafts
+ * Fixed repeated token timeout errors
+ * Fixed JavaScript localization for non-English languages
+
+ Enhancements:
+ * Web services fall back to json if the viewtype is invalid
+
+
+Version 1.8.13
+(January 29, 2013 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Cash Costello
+ * Juho Jaakkola
+ * Kevin Jardine
+ * Krzysztof Różalski
+ * Steve Clay
+
+ Security Fixes:
+ * Added validation of Twitter usernames in Twitter widget
+
+ Bugfixes:
+ * CLI usages with walled garden fixed
+ * Upgrading from < 1.8 to 1.8 fixed
+ * Default widgets fixed
+ * Quotes in object titles no longer result in "qout" in URLs
+ * List of my groups is ordered now
+ * Language string river:comment:object:default is defined now
+ * Added language string for comments: generic_comment:on
+
+ Enhancements:
+ * Added confirm dialog for resetting profile fields (adds language string profile:resetdefault:confirm)
+
+
+Version 1.8.12
+(January 4th, 2013 from https://github.com/Elgg/Elgg/tree/1.8)
+ Contributing Developers:
+ * Brett Profitt
+ * Cash Costello
+ * Jerome Bakker
+ * Matt Beckett
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Bugfixes:
+ * Added an AJAX workaround for the rewrite test.
+ * Code cleanup to prevent some notices and warnings.
+ * Removed "original_order" in menu item anchor tags.
+ * Site menu's selected item correctly persists through content pages.
+ * Static caches rewritten and improved to prevent stale data being returned.
+ * Installation: Invalid characters in admin username are handled correctly.
+ * Messages: Fixed inbox link in email notifications.
+ * The Wire: Fixed objects not displaying correctly when upgrading from 1.7.
+
+ Enhancements:
+ * Performance improvements and improved caching in entity loading.
+ * Added upgrade locking to prevent concurrent upgrade attempts.
+ * Replaced xml_to_object() and autop() with GPL / MIT-compatible code.
+ * Error messages (register_error()) only fade after being clicked.
+ * Groups: Added a sidebar entry to display membership status and a link to
+ group notification settings.
+ * Groups: Added pending membership and invitation requests to the sidebar.
+ * Groups: Better redirection for invisible and closed groups.
+ * Search: User profile fields are searched.
+ * Pages: Subpages can be reassigned to new parent pages.
+ * Twitter: Login with twitter supports persistent login and correctly forwards
+ after login.
+
+
+Version 1.8.11
+(December 5th, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Bugfix:
+ * Fixed fatal error in group creation form
+
+
+Version 1.8.10
+(December 4th, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Krzysztof Różalski
+ * Lars Hærvig
+ * Paweł Sroka
+ * RiverVanRain
+ * Sem
+ * Steve Clay
+
+ Security Enhancements:
+ * Cached metadata respects access restrictions to fix problems with profile
+ field display.
+ * Group RSS feeds are restricted to valid entities
+
+ Enhancements:
+ * UX: Added a list of Administrators in the admin area
+ * UX: Limiting message board activity stream entries to excerpts
+ * Performance: Prefetching river entries
+ * Performance: Plugin entities are cached
+
+ Bugfixes:
+ * Removed superfluous commas in JS files to fix IE compatibility.
+ * API: Fixed Twitter API.
+ * Performance: Outputting valid ETags and expires headers.
+
+
+Version 1.8.9
+(November 11, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Brett Profitt
+ * Cash Costello
+ * Evan Winslow
+ * Jeroen Dalsem
+ * Jerome Bakker
+ * Matt Beckett
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Security Enhancements:
+ * Sample CLI installer cannot break site
+ * Removed XSS vulnerabilities in titles and user profiles
+
+ Enhancements:
+ * UX: A group's owner can transfer ownership to another member
+ * UX: Search queries persist in the search box
+ * Several (X)HTML validation improvements
+ * Improved performance via more aggressive entity and metadata caching
+ * BC: 1.7 group profile URLs forward correctly
+
+ Bugfixes:
+ * UX: Titles containing HTML tokens are never mangled
+ * UX: Empty user profile values saved properly
+ * UX: Blog creator always mentioned in activity stream (not user who published it)
+ * UI: Fixed ordering of registered menu items in some cases
+ * UI: Embed dialog does not break file inputs
+ * UI: Datepicker now respects language
+ * UI: More reliable display of access input in widgets
+ * UI: Group edit form is sticky
+ * UI: Site categories are sticky in forms
+ * API: Language fallback works in Javascript
+ * API: Fallback to default viewtype if invalid one given
+ * API: Notices reported for missing language keys
+ * Memcache now safe to use; never bypasses access control
+ * BC: upgrade shows comments consistently in activity stream
+
+
+Version 1.8.8
+(July 11, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Cash Costello
+ * Miguel Rodriguez
+ * Sem
+
+ Enhancements:
+ * Added a delete button on river items for admins
+
+ Bugfixes:
+ * Fixed the significant bug with htmlawed plugin that caused duplicate tags
+
+
+Version 1.8.7
+(July 10, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Cash Costello
+ * Evan Winslow
+ * Ismayil Khayredinov
+ * Jeroen Dalsem
+ * Jerome Bakker
+ * Matt Beckett
+ * Miguel Rodriguez
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Enhancements:
+ * Better support for search engine friendly URLs
+ * Upgraded htmlawed (XSS filtering)
+ * Internationalization support for TinyMCE
+ * Public access not available for walled gardens
+ * Better forwarding and messages when they cannot view content because logged out
+
+ Bugfixes:
+ * Fatal errors due to type hints downgraded to warnings
+ * Group discussion reply notifications work again
+ * Sending user to inbox when deleting a message
+ * Fixed location profile information when it is an array
+ * Over 30 other bug fixes.
+
+
+Version 1.8.6
+(June 18, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Cash Costello
+ * Evan Winslow
+ * Ismayil Khayredinov
+ * Jeff Tilson
+ * Jerome Bakker
+ * Paweł Sroka
+ * Sem
+ * Steve Clay
+
+ Enhancements:
+ * New ajax spinner
+ * Detecting docx, xlsx, and pptx files in file plugin
+ * Showing ajax spinner when uploading file with embed plugin
+
+ Bugfixes:
+ * Fixed some language caching issues.
+ * Users can add sub-pages to another user's page in a group.
+ * Over 30 other bug fixes.
+
+
+Version 1.8.5
+(May 17, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Brett Profitt
+ * Evan Winslow
+ * Sem
+ * Steve Clay
+ * Jeroen Dalsem
+ * Jerome Bakker
+
+ Security Enhancements:
+ * Fixed possible XSS vulnerability if using a crafted URL.
+ * Fixed exploit to bypass new user validation if using a crafted form.
+ * Fixed incorrect caching of access lists that could allow plugins
+ to show private entities to non-admin and non-owning users. (Non-exploitable)
+
+ Bugfixes:
+ * Twitter API: New users are forwarded to the correct page after creating
+ an account with Twitter.
+ * Files: PDF files are downloaded as "inline" to display in the browser.
+ * Fixed possible duplication errors when writing metadata with multiple values.
+ * Fixed possible upgrade issue if using a plugin uses the system_log hooks.
+ * Fixed problems when enabling more than 50 metadata or annotations.
+
+ API:
+ * River entries' timestamps use elgg_view_friendly_time() and can be
+ overridden with the friendly time output view.
+
+
+Version 1.8.4
+(April 24, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Contributing Developers:
+ * Adayth Talavera
+ * Brett Profitt
+ * Cash Costello
+ * Evan Winslow
+ * Ismayil Khayredinov
+ * Janek Lasocki-Biczysko
+ * Jerome Baker
+ * Sem
+ * Steve Clay
+ * Webgalli
+
+ Security Enhancements:
+ * Fixed an issue in the web services auth.get_token endpoint that
+ would give valid auth tokens to invalid credentials. Thanks to
+ Christian for reporting this!
+ * Fixed an that could show which plugins are loaded on a site.
+
+ Enhancements:
+ * UI: All bundled plugins' list pages display a no content message if there is nothing to list.
+ * UI: Site default access is limited to core access levels.
+ * UI: Showing a system message to the admin if plugins are disabled with the "disabled"
+ magic file.
+ * UI: Added transparent backgrounds for files and pages icons.
+ * External (Site) Pages: If in Wall Garden mode, Site Pages use the Walled Garden
+ theme when logged out.
+ * UI: Database errors only show the query to admin users.
+ * UI: Cannot set the data path to a relative path in installation or site settings.
+ * UI: Cleaned up notifications for bundled plugins.
+ * UI: Hiding crop button if no avatar is uploaded.
+ * UI: Bundled plugins are displayed with a gold border in the plugin admin area.
+ * UI: Can see all the categories a plugin belongs to.
+ * Web Services: Multiple tokens allowed for users.
+ * API: More efficient entity loading.
+ * API: Added IP address to system log.
+ * API: Languages are cached.
+ * API: ElggBatch supports disabling offsets for callbacks that delete entities.
+ * API: Cleaned up the boot process.
+ * API: Fixed situation in which the cache isn't properly cleared if a file can't be unlinked.
+
+ Bugfixes:
+ * UI: Tags display in the case they were saved.
+ * UI: Friendly titles keep -s.
+ * UI: Removed pagination in friends widget.
+ * UI: Profile settings actions correctly displays error messages as errors.
+ * UI: Tag search works for tags with spaces.
+ * UI: Fixed river display for friending that happens during registration.
+ * Groups: Link for managing join requests is restored in the sidebar.
+ * Walled Garden: Cron and web services endpoints are exposed as public sites.
+ * The Wire: UTF usernames are correctly linked with @ syntax.
+ * The Wire: No longer selecting the "Mine" tab for users who aren't you.
+ * Blogs: Notifications restored.
+ * Message Board: Fixed delete.
+ * Groups: Forwarding to correct page if trying to access closed group.
+ * API: entities loaded via elgg_get_entities_from_relationship() have the correct time_created.
+ * API: Deleting entities recursively works when code is logged out.
+ * API: Fixed multiple uses of deprecated functions.
+
+
+Version 1.8.3
+(January 12, 2012 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Enhancements:
+ * Adds a white list for ajax views
+ * Improved navigation tab options
+ * Added group specific search
+ * Added button for reverting avatar
+ * Improved documentation for core class attributes
+ * Adds a server info page under administer -> statistics
+ * Improving caching of icons and js/css
+ * Deprecation notices not displayed to non-admin users
+
+ Bugfixes:
+ * Fixed upgrade scripts for blog posts and groups forum posts
+ * Can now delete invitations to invisible groups
+ * Fixed several widget bugs
+ * Fixed access level on add to group river item
+ * Fixed recursive entity enabling
+ * Fixed limit on pages in sidebar navigation
+ * Fixed deletion of large numbers of annotations
+
+
+Version 1.8.2
+(December 21, 2011 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Enhancements:
+ * Added a 404 page
+ * Widgets controls now using the menu system
+ * Admins can edit users' account information
+ * Embed uploader supports uploading into groups
+ * Add a control panel widget for easy access to cache flushing and upgrading
+ * Comments now have a unqiue URL with fragment identifier
+ * JavaScript language files are cacheable
+ * jQuery form script only loaded when required
+
+ Bugfixes:
+ * Fixed default widgets
+ * Fixed activity filtering
+ * Embedding an image now inserts a medium sized image
+ * Search plugin only uses mbstring extension if enabled
+ * Site pages links returned to footer
+ * Fixed URL creation for users with non-ASCII characters in username
+ * The wire username parsing supports periods in usernames
+ * Returned the posting area to the main wire page
+ * Fixed layout issue on pages with a fragment identifier in URL
+ * Added support for call elgg_load_js() in header and footer
+ * Fixed user picker
+ * Fixed uservalidationbyemail plugin ignoring the actions of other plugins
+ * Fixed bug preventing the creation of admin users
+ * Fixed deleting a widget with JavaScript disabled
+ * Fixed many bugs in the unit/integration tests
+
+
+Version 1.8.1
+(November 16, 2011 from https://github.com/Elgg/Elgg/tree/1.8)
+
+ Enhancements:
+ * Completed styling of user validation admin page
+ * Adding rel=nofollow for non-trusted links
+ * Added direct icon loading for profile avatars in profile plugin
+ * Improved the structure of content views to make styling easier
+ * Updated version of jQuery to 1.6.4
+ * Added basic support for icon size customization
+ * Added a toggle for gallery/list view in file plugin
+ * Added support for passing CSS classes to icon views
+ * Added support for non http URLs to Elgg's normalize functions
+ * Added better support for the 404 forward if a page handler does handle a request
+
+ Bugfixes:
+ * Fixed autocomplete and userpicker
+ * Fixed RSS and web service-related view types
+ * Fixed walled garden display issues
+ * Added work around for IE/TinyMCE/embed insert problem
+ * Implemented ElggUser.isAdmin() JavaScript method
+ * Fixed the date views and JavaScript datepicker
+ * Fixed horizontal radio buttons styling
+ * Modules only display header if there is content for it
+
+
+Version 1.8.1b
+(October 11, 2011 from git://github.com/Elgg/Elgg.git)
+
+ Enhancements:
+ * New group activity widget for user dashboard.
+ * Added more sprites.
+ * version.php information cached instead of loaded 100s of times.
+ * Added class elgg-autofocus to add focus on inputs when the page loads.
+ * Admins can edit user avatars again.
+ * Added a filter for non-bundled plugins in plugin admin.
+ * Improvements to admin area theme.
+
+ Bugfixes:
+ * Fixed site dropdown menu for IE.
+ * ElggEntity->deleteMetadata() no longer deletes all metadata ever if
+ called on an unsaved entity.
+ * Fixed Embed plugin.
+ * Fixed activate and deactivate all plugins.
+ * Fixed URL for group membership request in notification email.
+ * Fixed log browser plugin's admin area display.
+ * Fixed RSS icon not showing up on some pages.
+ * Fixed river entries for forum posts that were lost if upgrading from 1.7.
+ * Better displaying of errors when activating, deactivating, or
+ reordering plugins.
+ * Fixed Developer Plugin's inspection tool.
+ * Fixed avatar cropping on IE 7.
+ * Bookmarks plugin accepts URLs with dashes.
+ * "More" menu item on site menu hidden if items are manually specified.
+ * Fixed hover menu floating if unrestrained.
+ * JS init, system fired when DOM and languages are read.
+ * Fixed the date picker input view.
+ * Fixed stack overflow when calling elgg_view() from a pagesetup
+ event.
+ * Menu links no longer have empty titles and confirm attributes.
+ * Fixed crash when attempting to change password to an invalid value.
+ * Fixed "More groups" link for groups widget.
+ * Fixed output/confirmlink to use a default question if not specified.
+ * Added missing language strings. Also added "new", "add", and "create".
+ * Registered security token refresh page as external to avoid token refresh
+ problems on Walled Garden sites.
+ * Displaying more accurate message if uploading an avatar fails.
+ * "Leave group" button doesn't display for group owners.
+ * Request group membership button displays only when logged in.
+ * Fixed the number of displayed items for Bookmarks widget.
+ * Fixed fallback to deprecated views for widgets.
+
+ API changes:
+ * Menus names must be unique to the entire menu, not just section.
+ * Input views that encode text use the option 'encode_text'.
+ * Added ElggPlugin->getFriendlyName().
+ * elgg_view_icon() accepts a class.
+ * Added hook output:before, page.
+ * Added hook output:before, layout.
+ * elgg_get_entities() and related functions return false if passed
+ valid options with invalid values.
+ * Can disable the user hover menu by passing hover => false to
+ elgg_view_icon(). Previously it was override => true.
+ * Embed plugin uses menu system. See readme for embed plugin.
+ * Manifest attributes are no longer translated via elgg_echo().
+ * Fixed livesearch ajax endpoint.
+ * Fixed site unit test.
+ * Unit tests tidy up after themselves better.
+ * forward() throws an exception if headers are already sent.
+ * Better errors if adding a user through admin area fails.
+ * Localized profile fields.
+ * Added 'is_trusted' parameter output/url to avoid escaping and filtering.
+ Defaults to false.
+ * Added elgg_unregister_action()
+ * Fixed ElggPriorityList::rewind().
+ * Fixed forwarding after login for login-protected pages.
+ * get_site_by_url() respects class inheritance for subclassing ElggSite.
+
+ Internal changes:
+ * Updated deprecated uses of internalname/id.
+ * Using wwwroot instead of www_root because of inconsistencies.
+
+
+Version 1.8.0 (Jackie)
+(September 5th, 2011 from git://github.com/Elgg/Elgg.git)
+
+ Notes:
+ Elgg 1.8 contains the most changes in Elgg since the transition from Elgg
+ 0.9 to Elgg 1.0. The core team tried to make the transition as smooth as
+ possible, but in the interest of following standards and simplifying the
+ development process for core and third party developers, we have made
+ changes that will require updating plugins. We believe these changes
+ will help Elgg development be easier for everyone.
+
+ It is unreasonable and unhelpful to list the full details of all changes in
+ this file. Instead, we will list the high level, overarching changes to
+ systems. If you are interested in the specifics, Elgg 1.8's source code is
+ highly documented and serves as a good guide and the git commit log can
+ provide excruciating details of what has changed between 1.7 and 1.8.
+
+ Please post your feedback, questions, and comments to the community site
+ at http://community.elgg.org. As always, thank you for using Elgg!
+
+ --The Elgg Core Development Team
+
+ A tip about updating plugins:
+ It's not difficult to update 1.7 plugins for 1.8. There is a detailed
+ document outlining this process on the wiki:
+ http://docs.elgg.org/wiki/Updating_plugins_for_Elgg_1.8
+
+ The basic process is:
+ 1. Clean up the plugin to make sure it conforms to coding standards,
+ official structure, and best practices.
+ 2. Update any uses of deprecated functions. Functions deprecated in 1.7 will
+ produce visible notices in 1.8!
+ 3. Use the new manifest format.
+ 4. Use the new menu functions.
+ 5. Use the new JS features.
+ 6. Update the views to use core CSS helper functions and classes instead of
+ writing your own.
+
+ The documentation directory and the wiki has more information.
+
+ User-visible changes:
+ * New default theme.
+ * New installation.
+ * Separate and updated admin interface.
+ * Updated plugin themes.
+
+ Generic API changes:
+ * Improved the markup and CSS.
+ * Restructured and simplified the views layouts.
+ * Added a new menu system.
+ * Added new CSS and JS file registration functions.
+ * Added a JS engine.
+ * Added a breadcrumb system.
+ * Added a sticky forms system.
+
+ New plugins:
+ * Dashboard - The activity stream is now the default index page. A 1.7-style
+ dashboard is provided through the dashboard plugin.
+ * Developers Plugins - Developer tools.
+ * Likes - Allows users to "like" other users' content.
+ * oAuth API - A generic, reusable oAuth library.
+ * Tag Cloud - A widget-based tag cloud generator.
+ * Twitter API - A generic Twitter library that allows signin with Twitter
+ and pushing content to tweets. Replaces twitter_service.
+
+ Deprecated plugins:
+ * captcha - Captchas have long since stopped being useful as a deterrent
+ against spam.
+ * crontrigger - Real cron should be used.
+ * default_widgets - This functionality is now part of core.
+ * friends - This functionality is now part of core.
+ * riverdashboard - Displaying the river (activity stream) is default in
+ core. The original dashboard can be restored by the new Dashboard plugin.
+ * twitter_service - Replaced by Twitter API.
+
+ Elgg 1.8.0.1 was released immediately after 1.8.0 to correct a problem in
+ installation.
diff --git a/CODING.txt b/CODING.txt
new file mode 100644
index 000000000..1cfd58dba
--- /dev/null
+++ b/CODING.txt
@@ -0,0 +1 @@
+See documentation/coding_standards/
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
new file mode 100644
index 000000000..a8e74d3a4
--- /dev/null
+++ b/CONTRIBUTORS.txt
@@ -0,0 +1,30 @@
+The following have made notable contributions to the Elgg Project.
+(List in alphabetical order.)
+
+Steve Clay - http://www.mrclay.org/, https://twitter.com/mrclay_org
+
+Cash Costello - cash@elgg.org, http://cashcostello.com/
+
+Pete Harris - http://www.peteharris.co.uk/
+
+Kevin Jardine - http://radagast.biz/
+
+Jon Maul - MITRE http://www.mitre.org/
+
+Marcus Povey - http://marcuspovey.co.uk/
+
+Brett Profitt - brett@elgg.org, http://twitter.com/brettprofitt
+
+Nathan Rackliffe - MITRE http://mitre.org/
+
+Tom Read - MITRE http://mitre.org/
+
+Justin Richer - MITRE http://mitre.org/
+
+Dave Tosh - davidgtosh@gmail.com, http://twitter.com/davetosh
+
+Ben Werdmuller - http://benwerd.com/
+
+Nicholas Whitt - nick.whitt@gmail.com, http://twitter.com/nogoodnick
+
+Evan Winslow - evan@elgg.org, http://evanwinslow.com/
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
new file mode 100644
index 000000000..262515386
--- /dev/null
+++ b/COPYRIGHT.txt
@@ -0,0 +1,14 @@
+The follow individuals, companies, or entities have contributed significant
+code to the Elgg project and share the copyright. (In alphabetical order.)
+
+Organizations:
+The MITRE Corportation (jricher@mitre.org)
+Curverider Ltd (info@elgg.com)
+
+Individuals:
+Steve Clay (steve@mrclay.org)
+Cash Costello (cash.costello@gmail.com)
+Brett Profitt (brett.profitt@gmail.com)
+Dave Tosh (davidgtosh@gmail.com)
+Ben Werdmuller (ben@benwerd.com)
+Evan Winslow (evan.b.winslow@gmail.com)
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 000000000..6fae5746c
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,39510 @@
+2012-04-24 Brett Profitt <brett.profitt@gmail.com>
+
+ * CHANGES.txt, version.php: Version bump. Updated changes.
+
+ * mod/groups/views/default/group/default.php: Fixed group entity display in
+ full_view.
+
+ * views/default/river/elements/summary.php: Fixes #4339. Checking for
+ river:$action:$type in addition to river:$action:$type:$subtype.
+
+ * engine/lib/sessions.php, engine/lib/web_services.php: Fixed problem in web
+ services where users with incorrect passwords could gain an access token.
+
+ * actions/admin/site/update_advanced.php, languages/en.php: Fixes #4324. Not
+ allowing relative paths for dataroot in advance settings.
+
+ * engine/lib/relationships.php: Fixes #4409. Selecting distinct across
+ entities.* and entity_relationships.id instead of r.* so entities loaded via
+ elgg_get_entities_from_relationship() have the correct time_created.
+
+2012-04-22 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/thewire/pages/thewire/owner.php: Fixes #4452. Passing the correct
+ filter context in the wire's owner page.
+
+ * views/default/object/plugin.php: Fixes #4439. Redirecting if trying to
+ view a plugin object outside of admin.
+
+2012-04-18 Brett Profitt <brett.profitt@gmail.com>
+
+ * ...1.8.3-multiple_user_tokens-852225f7fd89f6c5.php, version.php: Fixes
+ #4291. Removing the unique index on user and site guids in the
+ users_apisessions table.
+
+ * actions/login.php, actions/register.php, actions/useradd.php,
+ ....8.3-dont_filter_passwords-c0ca4a18b38ae2bc.php,
+ engine/lib/user_settings.php,
+ .../actions/twitter_api/interstitial_settings.php, version.php: Fixes #1301.
+ Not filtering passwords.
+
+2012-04-16 Steve Clay <steve@mrclay.org>
+
+ * engine/lib/users.php: Fixes #4414: Corrected name of river friend create
+ view
+
+ * mod/thewire/start.php: Fixes #4413: Removes deprecated call to
+ get_loggedin_user
+
+2012-04-15 Evan Winslow <evan@elgg.org>
+
+ * mod/likes/views/default/likes/button.php: Removes superfluous array
+ declaration
+
+2012-03-25 Evan Winslow <evan@elgg.org>
+
+ * mod/pages/start.php: Fixes #4419: Pages icons now work with all sizes
+
+ * views/default/icon/default.php: Refs #1279: Specifying image dimensions in
+ icon/default view.
+
+2012-03-15 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/classes/ElggSite.php: Fixes #4394. Added cron and services URLs to
+ the default public pages list for walled garden.
+
+2012-03-02 Evan Winslow <evan@elgg.org>
+
+ * views/default/css/admin.php: Adds fixed-width font for pre + code in admin
+ area
+
+2012-02-22 Evan Winslow <evan@elgg.org>
+
+ * .travis.yml: The travis-ci build should only run against master now.
+
+2012-02-13 Evan Winslow <evan@elgg.org>
+
+ * .travis.yml: Adds trivial .travis.yml config so we can get started
+ building.
+
+2012-02-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/output.php, engine/tests/regression/trac_bugs.php: Fixes #3210.
+ Keeping -s in URL friendly titles.
+
+ * engine/classes/ElggPluginManifest.php, views/default/admin/plugins.php,
+ views/default/css/admin.php, views/default/object/plugin/full.php: Fixes
+ #3312, #3632. Added class elgg-plugin-category-<category> to the plugin div.
+ Exposed plugin categories under more. Changed border color and size for
+ bundled categories.
+
+ * mod/search/pages/search/index.php, mod/search/search_hooks.php,
+ mod/search/start.php: Fixes #3550. Merged slightly modified pull request 166
+ from sembrestels.
+
+2012-02-21 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/groups/languages/en.php, mod/groups/start.php: Refs #4335. Updated
+ discussion notifications.
+
+ * mod/blog/languages/en.php, mod/blog/start.php,
+ mod/bookmarks/languages/en.php, mod/bookmarks/start.php,
+ mod/file/languages/en.php, mod/file/start.php, mod/pages/languages/en.php,
+ mod/pages/start.php: Fixes #4335. Cleaned up the notifications for new
+ content.
+
+2012-02-11 Cash Costello <cash.costello@gmail.com>
+
+ * mod/externalpages/start.php, .../views/default/expages/wrapper.php,
+ views/default/css/walled_garden.php: external pages plugin uses walled garden
+ layout when appropriate
+
+2012-02-10 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * views/default/forms/login.php, views/default/forms/register.php: passing
+ to extending views
+
+2012-02-10 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/elgglib.php, views/default/js/walled_garden.php,
+ views/default/page/layouts/walled_garden.php: updated the walled garden js to
+ use new js lib
+
+ * engine/classes/ElggSite.php, engine/lib/elgglib.php,
+ views/default/core/walled_garden/body.php,
+ views/default/core/walled_garden/login.php,
+ views/default/core/walled_garden/lost_password.php,
+ views/default/core/walled_garden/register.php,
+ views/default/js/walled_garden.php,
+ views/default/page/layouts/walled_garden.php: new layout and ajax loading for
+ walled garden
+
+2012-02-09 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggWidget.php: Fixes #4283 moving widgets from inactive
+ plugins to the bottom of columns
+
+ * engine/lib/views.php: Fixes #2625 removed old hack from
+ elgg_view_annotation()
+
+ * engine/lib/group.php: Fixes #4361 corrects forwarding logic for closed
+ groups
+
+ * mod/groups/lib/groups.php: Fixes #4362 extra context was breaking group
+ sidebar menu logic
+
+ * languages/en.php, pages/friends/index.php, pages/friends/of.php,
+ pages/river.php: Fixes #2942 all list pages should have messages when no
+ content now
+
+2012-02-08 Cash Costello <cash.costello@gmail.com>
+
+ * mod/pages/manifest.xml: Fixes #3678 adds better description of pages
+ plugin
+
+ * actions/friends/add.php, languages/en.php: Fixes #4348 adds check for
+ missing user when friending
+
+ * .../views/default/theme_preview/components.php,
+ .../default/theme_preview/components/table.php,
+ views/default/css/elements/components.php: Fixes #4357, #4358 updates
+ .elgg-table-alt
+
+2012-02-03 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * actions/avatar/crop.php, pages/avatar/edit.php: Fixes #4350 (Edit Avatar -
+ Crop button is misleading, should be hidden if avatar hasn't been created
+ yet)
+
+2012-02-07 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/plugins.php, languages/en.php: Fixes #3613 added system message
+ for admins when plugins are disabled
+
+ * engine/lib/metadata.php: Fixes #1043 tags retain their case
+
+2012-02-04 cash <cash.costello@gmail.com>
+
+ * mod/messageboard/actions/delete.php,
+ mod/messageboard/views/default/messageboard/js.php: Fixes #4354 fixes
+ messageboard delete
+
+ * mod/thewire/start.php: removed some old code from thewire
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggObject.php, engine/classes/ElggSite.php,
+ engine/classes/ElggUser.php: Fixes #2112 not loading data from entities table
+ twice
+
+ * mod/thewire/start.php, mod/thewire/tests/regex.php: Fixes #1853 matching
+ UTF8 characters in usernames
+
+ * mod/blog/languages/en.php, mod/blog/start.php: Fixes #4310 adds missing
+ blog notification function
+
+2012-01-27 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * engine/lib/cache.php: lazy boolean expression evaluation leaves function
+ expressions unevaluated (!)
+
+ * engine/lib/configuration.php: response from insert_data needs to be
+ checked for !== FALSE
+
+2012-01-27 Team Webgalli <webgalli@gmail.com>
+
+ * views/default/widgets/friends/content.php: Removed pagination from friends
+ widget
+
+2012-02-03 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/users.php: improved documentation for get_user_by_email()
+
+2012-02-01 cash <cash.costello@gmail.com>
+
+ * engine/lib/languages.php, engine/lib/plugins.php: fixed logic that caused
+ plugin language files to not be loaded
+
+2012-01-30 cash <cash.costello@gmail.com>
+
+ * install/ElggInstaller.php, install/languages/en.php: Refs #4324 installer
+ checks for absolute path
+
+ * install/ElggInstaller.php: Fixes #4342 updated the installer based on boot
+ reorg - no longer need caching code in installer
+
+ * engine/lib/plugins.php: fixed typo in plugin code
+
+ * install/languages/en.php, views/installation/install/nav.php: added
+ language strings to installer for refresh and next
+
+2012-01-28 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/cache.php: Refs #4180 was caching extensions which was causing
+ double extensions
+
+ * mod/thewire/actions/add.php: replaced deprecated function call in the wire
+ plugin
+
+ * engine/lib/views.php: fixed typo in docs
+
+ * engine/lib/entities.php: Fixes #4329 removed old recursive delete
+ permissions override
+
+ * engine/lib/entities.php: Fixes #2646 mention ELGG_ENTITIES_NO_VALUE in
+ elgg_get_entities() documentation
+
+2012-01-27 Cash Costello <cash.costello@gmail.com>
+
+ * mod/pages/languages/en.php: Fixes #4309 added language string
+
+ * engine/settings.example.php: Fixes #3651 fixed documentation of disable db
+ cache setting and updated wiki
+
+ * engine/lib/navigation.php: Fixes #3509 added documentation to menu system
+ about confirm links
+
+ * actions/avatar/crop.php, actions/profile/fields/add.php,
+ actions/profile/fields/delete.php, actions/profile/fields/reorder.php: Fixes
+ #1808 using correct message function in profile actions
+
+2012-01-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/entities.php: Refs #4081. Correctly calling
+ setIncrementOffset(false) for deleting entities using ElggBatch.
+
+ * engine/lib/entities.php, engine/tests/api/helpers.php,
+ engine/tests/objects/objects.php: Fixes #4081. Using ElggBatch to delete
+ recursive.
+
+2012-01-25 cash <cash.costello@gmail.com>
+
+ * engine/lib/languages.php: not loading language files a second time when
+ session initialized
+
+ * engine/lib/cache.php, engine/lib/plugins.php: plugins use language cache
+ and cache is cleared properly
+
+ * engine/classes/ElggFileCache.php: implemented the clear method of the file
+ cache
+
+ * engine/lib/cache.php, engine/lib/configuration.php,
+ engine/lib/elgglib.php, engine/lib/languages.php: caching language data
+
+2012-01-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/metastrings.php: Refs #4269. Using ElggBatch to delete
+ annotations / metadata again.
+
+ * engine/classes/ElggBatch.php, engine/tests/api/helpers.php: Fixes #4288.
+ Added setIncrementOffset() to ElggBatch.
+
+2012-01-24 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/configuration.php, engine/lib/entities.php,
+ engine/lib/views.php: Fixes #4272 where an array of entity types can be used,
+ use array in config object
+
+2012-01-24 Brett Profitt <brett.profitt@gmail.com>
+
+ * upgrade.php: Fixes #4326. Disabling system log for upgrades.
+
+2012-01-23 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/configuration.php, install/ElggInstaller.php: Refs #4147.
+ Changed default site name to "My New Community."
+
+ * languages/en.php: Fixed typo in language string.
+
+ * engine/lib/entities.php, engine/tests/objects/objects.php: Fixes #1196.
+ Added elgg_set_ignore_access() calls to disable_entity() when called with
+ recursive = true.
+
+2012-01-22 Brett Profitt <brett.profitt@gmail.com>
+
+ * views/default/object/plugin/full.php,
+ views/default/object/plugin/invalid.php: Fixes #4311. Rewriting all invalid
+ CSS characters to - for plugin id in plugin admin area.
+
+ * engine/schema/mysql.sql: Refs #2222. Added schema update for system log ip
+ address column.
+
+2012-01-22 cash <cash.costello@gmail.com>
+
+ * engine/lib/access.php: Fixes #4295 using on duplicate key to not fail when
+ adding the same user more than once to an access collection
+
+2012-01-22 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/lib/metadata.php, engine/tests/api/metastrings.php: Fixes #4321. Limit
+ alone is no longer valid for batch delete operations for metadata or
+ annotations.
+
+ * engine/lib/metadata.php: Refs #4325. Restored the null vs bool return in
+ elgg_delete_metadata().
+
+2012-01-22 Cash Costello <cash.costello@gmail.com>
+
+ * mod/search/views/default/search/list.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ views/default/navigation/pagination.php,
+ views/default/page/components/list.php: Fixes #4320 updated documentation for
+ base_url in pagination and added backward compatible code
+
+ * engine/lib/metadata.php: Fixes #4318 added guid to the list of parameters
+ for elgg_delete_metadata()
+
+2012-01-22 Team Webgalli <webgalli@gmail.com>
+
+ * mod/bookmarks/actions/bookmarks/save.php: Removed unnecessary gatekeeper
+ from bookmark actions.
+
+2012-01-21 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * engine/classes/ElggUser.php: fix for deprecated use of elgg_get_objects
+
+2012-01-21 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/cache.php, engine/lib/elgglib.php, engine/lib/plugins.php:
+ moved cache loading out of plugin code
+
+ * engine/lib/cache.php, engine/lib/plugins.php: better location for system
+ cache in data directory
+
+ * documentation/info/config.php, engine/lib/cache.php,
+ engine/lib/configuration.php,
+ ...2012100-1.8.3-system_cache-93100e7d55a24a11.php,
+ install/ElggInstaller.php, .../views/default/admin/developers/settings.php,
+ version.php, views/default/forms/admin/site/update_advanced.php: Fixes #4180
+ finished conversion to system cache by converting datalist/CONFIG var name
+
+ * actions/admin/site/update_advanced.php, languages/en.php,
+ mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php,
+ .../views/default/admin/developers/settings.php,
+ views/default/forms/admin/site/update_advanced.php: updated the display to
+ show system cache language
+
+ * actions/admin/plugins/activate.php,
+ actions/admin/plugins/activate_all.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/deactivate_all.php,
+ actions/admin/plugins/set_priority.php, actions/admin/site/flush_cache.php,
+ actions/admin/site/update_advanced.php, engine/lib/cache.php,
+ engine/lib/deprecated-1.8.php, engine/lib/plugins.php,
+ engine/lib/upgrades/2011010101.php,
+ mod/developers/actions/developers/settings.php, upgrade.php: switched the
+ function names to system cache
+
+ * engine/lib/cache.php, engine/lib/configuration.php,
+ engine/lib/database.php, engine/lib/elgglib.php, engine/lib/languages.php,
+ engine/lib/sessions.php, engine/lib/sites.php, engine/lib/views.php,
+ engine/start.php: cleans up the boot process
+
+ * engine/lib/languages.php, engine/start.php: single for loop for loading
+ libraries
+
+ * engine/lib/configuration.php: updated documentation of configuration lib
+
+ * engine/start.php: improved documentation in bootstrap script
+
+2012-01-20 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/system_log.php,
+ ...2012000-1.8.3-ip_in_syslog-87fe0f068cf62428.php,
+ mod/logbrowser/languages/en.php,
+ .../admin/administer_utilities/logbrowser.php,
+ .../views/default/forms/logbrowser/refine.php,
+ mod/logbrowser/views/default/logbrowser/table.php, version.php: Fixes #2222.
+ Added IP address to system log table and log browser. Fixed problem in log
+ browser that would only show entries without an owner_guid.
+
+2012-01-20 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggUser.php, engine/lib/statistics.php,
+ mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/owner.php,
+ views/default/core/settings/tools.php: Refs #4293 removed unnecessary
+ get_input('offset') calls since elgg_list_entities() calls that
+
+ * engine/lib/entities.php, engine/lib/users.php,
+ mod/members/pages/members/search.php: Fixes #4303 passing arguments to
+ elgg_view_entity_list in options array
+
+2012-01-16 Sem <sembrestels@riseup.net>
+
+ * views/default/forms/admin/site/update_advanced.php: Fixed #3155. Limited
+ site default access to core access levels.
+
+2012-01-13 Sem <sembrestels@riseup.net>
+
+ * mod/file/graphics/icons/application.gif,
+ mod/file/graphics/icons/application_lrg.gif,
+ mod/file/graphics/icons/archive.gif, mod/file/graphics/icons/archive_lrg.gif,
+ mod/file/graphics/icons/excel.gif, mod/file/graphics/icons/excel_lrg.gif,
+ mod/file/graphics/icons/general.gif, mod/file/graphics/icons/general_lrg.gif,
+ mod/file/graphics/icons/music.gif, mod/file/graphics/icons/music_lrg.gif,
+ mod/file/graphics/icons/openoffice.gif,
+ mod/file/graphics/icons/openoffice_lrg.gif,
+ mod/file/graphics/icons/pages.gif, mod/file/graphics/icons/pages_lrg.gif,
+ mod/file/graphics/icons/pdf.gif, mod/file/graphics/icons/pdf_lrg.gif,
+ mod/file/graphics/icons/ppt.gif, mod/file/graphics/icons/ppt_lrg.gif,
+ mod/file/graphics/icons/text.gif, mod/file/graphics/icons/text_lrg.gif,
+ mod/file/graphics/icons/vcard.gif, mod/file/graphics/icons/vcard_lrg.gif,
+ mod/file/graphics/icons/video.gif, mod/file/graphics/icons/video_lrg.gif,
+ mod/file/graphics/icons/word.gif, mod/file/graphics/icons/word_lrg.gif,
+ mod/pages/images/pages.gif, mod/pages/images/pages_lrg.gif: Fixes #3911. File
+ and page icons with transparent backgrounds since now.
+
+2012-01-18 Jerome Bakker <jeabakker@coldtrick.com>
+
+ * actions/admin/site/update_advanced.php: solves part of #4307
+
+ * actions/admin/site/update_basic.php: solves part of #4307
+
+2012-01-17 adayth <aday.talavera@gmail.com>
+
+ * mod/file/start.php: Fixes #4305 added backward compatibility for file read
+ url
+
+2012-01-16 Brett Profitt <brett.profitt@gmail.com>
+
+ * .../messages/exceptions/admin_exception.php: Refs #4036. Forgot to add a
+ new view.
+
+2012-01-15 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/elgglib.php, languages/en.php,
+ views/failsafe/messages/exceptions/exception.php: Fixes #4036. Hiding
+ exceptions except for admin users.
+
+2012-01-12 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/object/widget.php: added clearfix to increase the size of
+ the area for the drag handle
+
+2012-01-11 cash <cash.costello@gmail.com>
+
+ * CHANGES.txt, version.php: updated version and changes.txt
+
+ * engine/lib/elgglib.php, engine/lib/views.php, mod/thewire/start.php: Fixes
+ #4292 added a white list for ajax views
+
+2012-01-11 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * views/default/css/elements/components.php, views/default/output/tags.php:
+ class namespacing
+
+2012-01-10 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, engine/tests/api/annotations.php,
+ engine/tests/api/metadata.php: Fixes #4269. Not using ElggBatch to delete
+ metadata / annotations. Added unit tests for deleting annotations/md. Fixed
+ an annoying inconsistency with "metastring/s" option in private functions.
+
+2012-01-09 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php: Fixes #4243. Added docs for metadata_calculation
+ option to elgg_get_metadata().
+
+2012-01-09 Jeroen Dalsem <jdalsem@coldtrick.com>
+
+ * engine/classes/ElggWidget.php: Fixes #4285 move only fetches 10 items
+
+2012-01-09 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggBatch.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggMemcache.php, engine/classes/ElggWidget.php,
+ engine/classes/XMLRPCCall.php, engine/handlers/export_handler.php,
+ engine/lib/actions.php, engine/lib/configuration.php,
+ engine/lib/filestore.php, engine/lib/metadata.php, engine/lib/navigation.php,
+ engine/lib/output.php, engine/lib/private_settings.php, engine/lib/users.php,
+ engine/lib/views.php: coding standard fixes to engine
+
+2012-01-09 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * views/default/css/elements/components.php: tags css
+
+ * views/default/output/tags.php: fixes tags html markup issues
+
+2012-01-08 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggExtender.php, engine/classes/ElggMenuBuilder.php,
+ engine/classes/ElggMenuItem.php, engine/classes/ElggMetadata.php,
+ engine/classes/ElggUser.php, engine/classes/SuccessResult.php,
+ engine/lib/annotations.php, engine/lib/cache.php, engine/lib/metadata.php,
+ engine/lib/output.php, engine/lib/pagehandler.php, engine/lib/pageowner.php,
+ engine/lib/plugins.php, engine/lib/users.php: most of the comments in the
+ engine now past the sniffer
+
+ * engine/classes/ElggCache.php, engine/classes/ElggMenuBuilder.php,
+ engine/classes/ElggMenuItem.php, engine/classes/ElggPlugin.php,
+ engine/classes/ElggPluginPackage.php, engine/classes/ElggSite.php,
+ engine/lib/access.php, engine/lib/admin.php, engine/lib/database.php,
+ engine/lib/extender.php, engine/lib/input.php, engine/lib/relationships.php,
+ engine/lib/river.php: coding standards fixes - comments
+
+ * mod/groups/actions/discussion/reply/save.php,
+ mod/groups/actions/discussion/save.php, mod/groups/lib/discussion.php: Fixes
+ #3216 passing type/subtype for group discussions
+
+ * mod/search/pages/search/index.php: Fixes #2199 can now pass entity
+ type/subtype to tag search
+
+ * mod/file/actions/file/upload.php, mod/file/start.php,
+ .../default/file/specialcontent/image/default.php: Fixes #2421 added icontime
+ to files with thumbnails
+
+ * mod/search/pages/search/index.php: Fixes #2404 not using full set of query
+ parameters for custom search types
+
+ * engine/lib/entities.php: Fixes #4234 forcing limit to be nonnegative
+
+ * mod/messages/views/default/messages/js.php: updated the messages plugin to
+ use 1.8's JS hook system
+
+ * mod/groups/views/default/groups/js.php: updated groups js to use new JS
+ hook system
+
+ * js/lib/ui.widgets.js, mod/profile/views/default/profile/js.php: Fixes
+ #4192 making the bottom of widget columns equal rather than height
+
+ * actions/login.php: Fixes #4171 login success message is now i18n friendly
+
+ * engine/handlers/cache_handler.php: Fixes #2002 adds ETag support to simple
+ cache handler
+
+ * engine/classes/ODDDocument.php: Refs #4271 integrates fix to 1.8 branch
+ for ODDDocument
+
+ * engine/lib/elgglib.php: Fixes #4278 deprecation notices ignore debug level
+ but do respect whether the admin is logged in
+
+ * engine/lib/elgglib.php: fixed some formatting
+
+2012-01-07 Cash Costello <cash.costello@gmail.com>
+
+ * mod/groups/icon.php, mod/profile/icondirect.php: added check for existance
+ of IF-NONE-MATCH header in request
+
+2012-01-03 Sem <sembrestels@riseup.net>
+
+ * mod/groups/icon.php: Refs #4142. Also added ETag in group icon.
+
+ * mod/profile/icondirect.php: Refs #4142. Added ETag header support for user
+ avatars.
+
+2012-01-07 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggRiverItem.php, mod/thewire/classes/ElggWire.php: Refs
+ #3209 fixed spacing and added options for wire method
+
+ * engine/classes/ODDEntity.php, engine/classes/ODDMetaData.php,
+ engine/classes/ODDRelationship.php: pulled ODD classes out of ODDEntity
+
+2012-01-05 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php: Fixes #4243. Added docs to explain the
+ difference between annotation_calculation and calculation.
+
+2012-01-04 cash <cash.costello@gmail.com>
+
+ * engine/lib/web_services.php: Fixes #4270 removed use of deprecated method
+
+ * mod/pages/lib/pages.php, mod/pages/pages/pages/owner.php: Fixes #4266
+ fixed limit bugs with pages plugin
+
+ * mod/embed/views/default/navigation/menu/embed.php,
+ views/default/navigation/tabs.php: updated options on navigation/tabs
+
+ * engine/lib/entities.php: fixed enabling bug, added flag for recursion,
+ removed unnecessary code in disable function
+
+ * engine/tests/objects/entities.php: added a unit test for recursive
+ enabling/disabling
+
+2012-01-03 Sem <sembrestels@riseup.net>
+
+ * engine/lib/entities.php: Refs #2051. Fixed: ElggEntity's enable does not
+ recurse.
+
+2012-01-04 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/objects.php: Fixes #3710. Returning false from update, <type>
+ event no longer deletes entity. Returning false from create, <type> still
+ deletes the entity because of the "return false to halt events" approach.
+ This will be reviewed for #3784.
+
+2012-01-02 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/admin.php, languages/en.php,
+ views/default/admin/statistics/basic.php,
+ views/default/admin/statistics/numentities.php,
+ views/default/admin/statistics/overview.php,
+ views/default/admin/statistics/overview/basic.php,
+ .../admin/statistics/overview/numentities.php,
+ views/default/admin/statistics/server.php,
+ views/default/admin/statistics/server/php.php,
+ .../default/admin/statistics/server/web_server.php: Fixes #4164 adds a server
+ statistics page to admin area
+
+2012-01-01 cash <cash.costello@gmail.com>
+
+ * mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ .../admin/administer_utilities/diagnostics.php,
+ .../admin/develop_utilities/diagnostics.php: moved diagnostics to administer
+ utilities menu area rather than developers
+
+ * mod/groups/languages/en.php, mod/groups/start.php: Fixes #2230 group acl
+ names are not i18n friendly
+
+ * engine/lib/access.php, languages/en.php, views/default/output/access.php:
+ Fixes #3939 if user does not have permissions to see the name of the access
+ collection, it is shown as "Limited"
+
+2012-01-01 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggExtender.php, engine/classes/ElggObject.php,
+ engine/classes/ElggRelationship.php, engine/classes/ElggRiverItem.php,
+ mod/blog/classes/ElggBlog.php, mod/thewire/classes/ElggWire.php: Fixes #3209
+ finished adding class properties documentation
+
+ * engine/classes/ElggCache.php: fixed copy and paste error in documentation
+ of ElggCache
+
+ * engine/classes/ElggDiskFilestore.php: Refs #2290 removes check for
+ username
+
+ * documentation/examples/plugins/start.php: Fixes #3225 added what was
+ missing from the basic init function example
+
+ * engine/lib/users.php: Fixes #690 admin editing a user no longer makes them
+ appear active
+
+ * engine/lib/admin.php: Fixes #4168 ignoring access when saving an admin
+ notice
+
+ * views/default/css/admin.php: Fixes #3981 adds a better pre and code style
+ to admin theme
+
+ * engine/lib/plugins.php: Fixes #3992 fixed notice when loading plugins for
+ first time
+
+ * mod/developers/languages/en.php, mod/developers/start.php,
+ .../default/admin/develop_tools/unit_tests.php,
+ mod/diagnostics/languages/en.php,
+ .../admin/develop_utilities/diagnostics.php: Fixes #4137 moves test UI to
+ developers plugin
+
+2011-12-31 cash <cash.costello@gmail.com>
+
+ * engine/lib/users.php: Fixes #4260 get_user_sites() now works
+
+ * engine/lib/notification.php: Fixes #4208 notifications do not use site
+ guid
+
+ * engine/classes/ElggSite.php: Fixes #4204 using only the relationship for
+ getting members of a site
+
+ * engine/classes/ElggWidget.php: Fixes #4255 new widget ordering code
+
+2011-12-31 Evan Winslow <evan@elgg.org>
+
+ * engine/classes/ElggGroup.php, engine/classes/ElggObject.php,
+ engine/classes/ElggSite.php, engine/classes/ElggUser.php: Refs #3209: Adds
+ property docs for the four main entity classes
+
+2011-12-31 cash <cash.costello@gmail.com>
+
+ * engine/classes/ElggWidget.php: Fixes #4259 using container guid for
+ widgets when moving
+
+2011-12-29 Jeroen Dalsem <jdalsem@coldtrick.com>
+
+ * engine/classes/ElggWidget.php: Small typo. Seems to work, but i prefer it
+ nice and tidy :)
+
+2011-12-31 cash <cash.costello@gmail.com>
+
+ * engine/lib/widgets.php: Fixes #4254 not registering the default widgets
+ callback more than once per event
+
+ * mod/groups/actions/groups/edit.php: Fixes #4152 setting access on group
+ creation river item
+
+ * engine/lib/river.php: Fixes #4258 fixes add_to_river escaping
+
+ * .../views/default/groups/group_sort_menu.php: Fixes #4228 group sort menu
+ view accepts selected menu item from page handler
+
+ * views/default/css/admin.php: Fixes #4257 updates admin theme for widget
+ menu changes
+
+ * mod/groups/upgrades/2011030101.php: Fixes #4256 reruns the forum topic
+ upgrade by checking the 5 oldest topics
+
+ * ...3101-1.8.2-fix_blog_status-b14c2a0e7b9e7d55.php, version.php: Fixes
+ #4239 rerun corrected blog status upgrade
+
+2011-12-31 Cash Costello <cash.costello@gmail.com>
+
+ * ...100-1.8.2-fix_friend_river-b17e7ff8345c2269.php, version.php: Fixes
+ #4248 fixed friend river text
+
+ * mod/blog/start.php: Fixes #4253 added backward compatibility for blog read
+ url
+
+2011-12-24 Cash Costello <cash.costello@gmail.com>
+
+ * actions/avatar/revert.php, engine/lib/users.php, languages/en.php,
+ views/default/core/avatar/upload.php: Fixes #3272 added button to revert
+ avatar
+
+ * engine/lib/elgglib.php: Refs #4009 registering the walled garden css and
+ js on every request
+
+2011-12-23 Cash Costello <cash.costello@gmail.com>
+
+ * mod/blog/lib/blog.php, mod/blog/start.php,
+ mod/blog/views/default/blog/sidebar.php,
+ mod/blog/views/default/blog/sidebar/archives.php: Fixes #3751 adds a group
+ blog archive page
+
+ * js/lib/ui.widgets.js, views/default/css/admin.php,
+ views/default/css/elements/modules.php, views/default/object/widget.php:
+ Fixes #4186 restricting the drag handle for widgets
+
+ * mod/groups/languages/en.php, mod/groups/lib/groups.php,
+ mod/groups/views/default/forms/groups/find.php,
+ mod/groups/views/default/forms/groups/search.php,
+ mod/groups/views/default/groups/sidebar/find.php,
+ mod/groups/views/default/groups/sidebar/search.php: Fixes #2074 adds group
+ search
+
+ * .../actions/groups/membership/delete_invite.php: Fixes #1922 can now
+ delete invites to invisible groups
+
+ * mod/externalpages/actions/edit.php,
+ mod/externalpages/views/default/expages/menu.php,
+ .../views/default/forms/expages/edit.php: Fixes #4069 reusing the previous
+ ElggObject for external pages
+
+ * engine/lib/annotations.php: Fixes #683 not deleting annotation when event
+ handlers return false on an update
+
+ * engine/lib/metadata.php: Fixes #682 not deleting metadata when update,
+ metadata event handlers return false
+
+ * engine/lib/users.php: Fixes #3716 setting the language when registering
+ new users
+
+2011-12-23 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * views/default/navigation/tabs.php: fixes spacing. add a note on text/title
+
+2011-12-23 cash <cash.costello@gmail.com>
+
+ * mod/groups/upgrades/2011030101.php: added access override to the forum
+ upgrade
+
+ * mod/blog/actions/blog/save.php, mod/blog/start.php,
+ mod/blog/views/default/object/blog.php: Fixes #4179 not setting excerpt if
+ none set
+
+ * ...8_svn-blog_status_metadata-4645225d7b440876.php,
+ ...8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php, mod/blog/start.php,
+ mod/groups/upgrades/2011030101.php: Refs #4239 fixed upgrade scripts with bad
+ limits
+
+ * engine/classes/ElggBatch.php: Refs #4239 improved the documentation on
+ ElggBatch for the limit option
+
+ * mod/blog/views/default/blog/group_module.php: Fixes #4240 not showing
+ draft blog posts in group module
+
+2011-12-23 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * views/default/navigation/tabs.php: fixes for tab rendering
+
+2011-12-19 Steve Clay <steve@mrclay.org>
+
+ * mod/tinymce/views/default/js/tinymce.php: Solves issue 4222: incorrectly
+ nested lists in Firefox
+
+2011-12-21 Cash Costello <cash.costello@gmail.com>
+
+ * CHANGES.txt, version.php: Set version to 1.8.2 and updated the changes
+ list
+
+2011-12-19 cash <cash.costello@gmail.com>
+
+ * engine/lib/widgets.php: Fixes #4184 dashboard default widgets should work
+ and widgets should be created regardless of access
+
+ * mod/oauth_api/manifest.xml: Refs #4221 added a conflict statement to
+ manifest for PECL extension
+
+ * engine/lib/pagehandler.php, views/default/css/elements/layout.php,
+ views/default/page/layouts/error.php: added more spacing to error layout
+
+2011-12-18 cash <cash.costello@gmail.com>
+
+ * js/lib/ui.widgets.js: Refs #4192 adds proper 'px' to minHeight but does
+ not solve the issue
+
+2011-12-15 Ismayil Khayredinov <ismayil.khayredinov@hypejunction.com>
+
+ * engine/lib/navigation.php, js/lib/ui.widgets.js,
+ views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php,
+ views/default/object/widget/elements/controls.php: Fix #4200: Converting
+ widgets controls into an elgg menu
+
+ * engine/lib/views.php, mod/developers/start.php, mod/embed/start.php: Fixes
+ 4209: jquery.form.js library loading
+
+2011-12-17 cash <cash.costello@gmail.com>
+
+ * engine/lib/user_settings.php, engine/lib/users.php: moved user settings
+ extensions to user_settings library
+
+2011-12-17 Cash Costello <cash.costello@gmail.com>
+
+ * mod/embed/start.php, mod/embed/views/default/embed/layout.php,
+ mod/embed/views/default/js/embed/embed.php,
+ .../views/default/embed/file_upload/content.php: Fixes #4086 handling
+ containers for embed uploading
+
+ * engine/lib/output.php: Fixes #4190 accepting full urls with non-ascii
+ characters
+
+ * mod/embed/views/default/js/embed/embed.php: Refs #3971 inserting medium
+ size thumbnails rather than small
+
+ * mod/embed/manifest.xml: embed can now be activated without the file plugin
+ as other plugins can provide content
+
+ * mod/uservalidationbyemail/start.php: Fixes #4217 user validation by email
+ now respects decisions by other plugins
+
+2011-12-15 Cash Costello <cash.costello@gmail.com>
+
+ * js/lib/ui.userpicker.js, views/default/input/userpicker.php: Fixes #4214
+ added missing dependency for userpicker
+
+2011-12-12 zcho <zcho05@gmail.com>
+
+ * engine/lib/users.php: fixes elgg_get_user_validation_status() always
+ returning null
+
+2011-12-15 Cash Costello <cash.costello@gmail.com>
+
+ * mod/uservalidationbyemail/lib/functions.php: Refs #4196 integrates fix
+ into 1.8 branch
+
+2011-12-12 hypeJunction <ismayil.khayredinov@hypejunction.com>
+
+ * mod/uservalidationbyemail/start.php: Fixed #4198 uservalidationbyemail
+ respects the return value of the register,user hook
+
+2011-12-08 cash <cash.costello@gmail.com>
+
+ * engine/lib/languages.php, js/lib/languages.js: Fixes #3181 caching
+ language js on server side with proper headers
+
+ * views/default/navigation/pagination.php: Fixes #4189 correctly getting the
+ base url in pagination view
+
+ * engine/lib/annotations.php: Fixes #4025 added a url handler for comments
+
+ * actions/admin/site/flush_cache.php, engine/lib/admin.php,
+ languages/en.php, views/default/widgets/control_panel/content.php: Fixes
+ #4185, #2111 adds control panel widget
+
+ * views/default/navigation/menu/default.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/navigation/menu/elements/section.php: added the ability to pass
+ a class to be applied to all menu item <li> elements
+
+ * engine/classes/ElggSite.php: Fixes #4182 if simplecache is empty, the
+ cache requests go through the engine and need to be white listed for the
+ walled garden
+
+2011-12-07 Cash Costello <cash.costello@gmail.com>
+
+ * mod/profile/start.php: fixed profile editing routing for profile plugin
+
+2011-12-06 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * engine/lib/entities.php: #4187 (get_entity optimization)
+
+2011-12-07 Cash Costello <cash.costello@gmail.com>
+
+ * js/lib/ui.widgets.js: simplified the JavaScript for deleteing a widget
+
+2011-12-06 Jeroen Dalsem <jdalsem@coldtrick.com>
+
+ * views/default/object/widget/elements/controls.php: delete action expects
+ widget_guid instead of guid
+
+2011-12-06 cash <cash.costello@gmail.com>
+
+ * engine/lib/output.php: Fixes #4173 removed use of \w since it is locale
+ sensitive
+
+2011-12-05 cash <cash.costello@gmail.com>
+
+ * engine/lib/pagehandler.php, languages/en.php,
+ views/default/errors/404.php, views/default/errors/default.php,
+ views/default/page/error.php, views/default/page/layouts/error.php: first
+ version of a 404 page
+
+2011-12-04 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/page/admin.php, views/default/page/default.php: Fixes #4032
+ rendering page elements before head/foot
+
+ * engine/tests/regression/trac_bugs.php,
+ mod/blog/actions/blog/auto_save_revision.php, mod/blog/actions/blog/save.php:
+ removed some usage of deprecated methods
+
+2011-12-03 cash <cash.costello@gmail.com>
+
+ * mod/search/start.php: Fixes #4046 checking offset compared to string
+ length
+
+ * engine/lib/entities.php: Refs #4176 added elgg_list_registered_entities()
+ fix to 1.8 branch
+
+2011-12-01 Ash Ward <ash@netality.com>
+
+ * mod/messages/languages/en.php, mod/messages/start.php: Fixes #4170:
+ Messages icon on top bar doesn't have a title attribute (tooltip)
+
+2011-12-01 cash <cash.costello@gmail.com>
+
+ * views/default/graphics/ajax_loader.php: added support for passing classes
+ to ajax loader
+
+2011-11-22 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * engine/classes/ElggMemcache.php: Fixes #1995 (memcache: incorrect check
+ for get() return value)
+
+2011-11-25 Jeff Tilson <jrtilson@gmail.com>
+
+ * engine/lib/views.php: Need to call
+ elgg_register_simplecache_view('css/lightbox') to register the lightbox CSS
+ with simplecache
+
+2011-11-28 cash <cash.costello@gmail.com>
+
+ * engine/lib/river.php, engine/tests/api/river.php: Fixes #3496 finished up
+ this ticket by updating unit test and using more parantheses to make it clear
+ how the OR/AND gets applied
+
+2011-11-28 Cash Costello <cash.costello@gmail.com>
+
+ * mod/search/pages/search/index.php,
+ mod/search/views/default/search/search_box.php: Fixes #4139 if no mbstring
+ extension we strip characters for display with search
+
+ * mod/likes/start.php: Fixes #4116 not liking users now since people think
+ they are liking the activity entry
+
+ * .../views/default/forms/messages/process.php: Fixes #3986 not showing
+ message buttons if no messages
+
+ * views/default/css/elements/forms.php: Fixes #4052 removed the :focus
+ styling on every input element
+
+2011-11-27 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/js/lightbox.php: Fixes #3773 added documentation hint for
+ using advanced features of fancybox
+
+ * actions/profile/edit.php, views/default/core/settings/account/name.php:
+ Fixes #3953 adds back the ability to change display name from settings page
+
+ * views/default/css/admin.php, views/default/css/elements/components.php,
+ views/default/css/elements/core.php: Fixes #3982 fixing scrolling issue with
+ elgg-body
+
+ * views/default/admin/plugins.php, views/default/js/admin.php,
+ views/default/object/plugin/full.php: Fixes #3954 using lightbox for plugin
+ screenshots
+
+ * engine/lib/entities.php: fixed some documentation related to subtypes
+
+ * views/rss/page/components/gallery.php: rss view type needed a gallery view
+
+2011-11-24 András Szepesházi <szepeshazi@gmail.com>
+
+ * actions/useradd.php: Fixed typo that prevented creating an admin user via
+ the Admin panel (user was created, but not elevated to admin).
+
+2011-11-25 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/elgglib.php, languages/en.php: added a better message for php
+ libraries that don't exist on disk
+
+ * views/default/page/components/gallery.php: returning from gallery view if
+ no items in the gallery
+
+ * .../views/default/groups/membershiprequests.php: Fixes #4151 removed
+ unnecessary $user definition
+
+2011-11-17 Danny Navarro <j@dannynavarro.net>
+
+ * engine/lib/river.php: Refs #3496 improving type/subtype handling for the
+ river
+
+2011-11-23 cash <cash.costello@gmail.com>
+
+ * engine/lib/river.php, pages/river.php: Refs #4143 adds a unit test for
+ type/subtype where sql generation
+
+ * views/default/css/elements/navigation.php: Fixes #4145 using margin rather
+ than padding for topbar menu items
+
+2011-11-22 cash <cash.costello@gmail.com>
+
+ * mod/logbrowser/start.php, .../admin/administer_utilities/logbrowser.php,
+ mod/logbrowser/views/default/logbrowser/refine.php: Fixes #3775 updates the
+ log browser link and keeps the refine area open if the page is loaded with a
+ user selected
+
+2011-11-20 Cash Costello <cash.costello@gmail.com>
+
+ * mod/groups/start.php: added check in case something goes wrong with the
+ container entity of a discussion
+
+2011-11-20 cash <cash.costello@gmail.com>
+
+ * install/languages/en.php: Fixes #4140 fixed spelling mistake
+
+ * views/default/css/elements/typography.php: fixed error in css for
+ .elgg-output ordered lists
+
+2011-11-19 cash <cash.costello@gmail.com>
+
+ * views/default/object/elements/summary.php: don't display <h3> if no title
+
+2011-11-19 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/navigation/menu/site.php: Fixes #4102 handling no menu items
+ for site menu
+
+ * actions/login.php, actions/user/requestnewpassword.php, languages/en.php,
+ views/default/forms/user/requestnewpassword.php: Fixes #641 users can submit
+ email address to reset password
+
+2011-11-18 cash <cash.costello@gmail.com>
+
+ * engine/lib/user_settings.php, engine/lib/users.php, languages/en.php:
+ Fixes #3792 admin can edit settings again
+
+ * languages/en.php: made status message a little more grammatical
+
+ * js/lib/pageowner.js: Fixes #4093 making sure elgg.page_owner is defined
+
+ * mod/profile/views/default/profile/owner_block.php: don't want hover menu
+ or link on owner block icon in profile
+
+ * views/default/forms/admin/site/update_advanced.php,
+ views/default/forms/admin/site/update_basic.php: line between settings and
+ save button not needed
+
+ * actions/admin/site/update_basic.php: Fixes #3996 displaying message when
+ basic site settings are saved
+
+ * views/default/css/elements/navigation.php: Fixes #3929 used a combination
+ of min-width/max-width and overflow hidden to provide better support for long
+ names
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggObject.php, engine/classes/ElggSite.php,
+ engine/classes/ElggUser.php: Fixes #4111 guid is now an int
+
+ * mod/thewire/start.php: Fixes #4085 accepting . in usernames for the wire
+
+ * engine/tests/api/helpers.php: Fixes #4128 better test of null passed to
+ registering external files
+
+ * engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_18/manifest.xml: Fixes #4134 improved plugin
+ manifest tests by using assertIdentical more
+
+ * engine/classes/ElggPluginManifest.php, engine/tests/api/plugins.php: Fixes
+ #4133 updated type in plugin manifest test
+
+ * engine/tests/api/metastrings.php: Fixes #4132 fixed metastring delete by
+ id test
+
+ * engine/lib/metastrings.php, engine/tests/api/metastrings.php: Fixes #4131
+ elgg_delete_metastring_based_object_by_id() should return a bool
+
+ * engine/tests/api/helpers.php: Fixes #4129 fixed priority list tests
+
+ * engine/tests/api/entity_getter_functions.php: Fixes #4126 fixed test for
+ checking relationship existence
+
+ * engine/classes/ElggGroup.php, engine/lib/relationships.php: Fixes #4118
+ returning bool from leave group functions
+
+ * engine/lib/access.php, engine/tests/api/access_collections.php: Fixes
+ #4115 returning bool from remove_user_from_access_collection()
+
+ * engine/lib/access.php: Fixes #4113 returning a bool from
+ delete_access_collection()
+
+ * engine/tests/api/entity_getter_functions.php: Fixes #4125 checking count
+ correctly
+
+ * engine/tests/api/entity_getter_functions.php: Fixes #4122, #4123, #4124
+ testing for empty arrays and added some documentation for the sanity of
+ future developers
+
+ * engine/lib/users.php: Fixes #4112 get_user_by_username() returns false if
+ no user
+
+2011-11-18 Cash Costello <cash.costello@gmail.com>
+
+ * engine/tests/api/metastrings.php, engine/tests/objects/sites.php,
+ engine/tests/objects/users.php, engine/tests/test_skeleton.php: Fixes #4109
+ remove inaccurate comment due to copy & paste
+
+ * engine/lib/entities.php, engine/tests/objects/entities.php,
+ engine/tests/objects/sites.php, engine/tests/objects/users.php: Fixes #4108
+ delete() returns bool now and updated unit tests
+
+ * engine/tests/objects/entities.php: Fixes #4104, #4105 fixed casting in
+ testElggEntityMetadata()
+
+ * engine/tests/api/access_collections.php: Fixes #4114 checking type for acl
+ test
+
+2011-11-17 Cash Costello <cash.costello@gmail.com>
+
+ * engine/tests/api/metadata.php: Fixes #4120 metadata tests now check for
+ the correct types
+
+ * engine/tests/objects/entities.php: Fixes #4094, #4095 fixes casting issues
+ in unit tests - thanks to andres.fortier
+
+ * mod/externalpages/start.php: Fixes #4101 added footer links back
+
+ * mod/thewire/pages/thewire/everyone.php: Fixes #4100 adds the wire post
+ form back to all page
+
+2011-11-16 cash <cash.costello@gmail.com>
+
+ * mod/thewire/pages/thewire/friends.php,
+ mod/thewire/pages/thewire/owner.php: removed two deprecated function calls
+ from thewire
+
+2011-11-15 Cash Costello <cash.costello@gmail.com>
+
+ * CHANGES.txt: updated release date
+
+ * documentation/examples/plugins/README.txt,
+ documentation/examples/plugins/start.php: updated the plugin skeleton with
+ some instructions
+
+ * actions/avatar/crop.php, actions/avatar/upload.php: fixed bugs in avatar
+ cropping with remembering old crop coordinates and resizing the master
+
+ * engine/lib/elgglib.php, js/lib/autocomplete.js, js/lib/avatar_cropper.js,
+ js/lib/friends_picker.js, js/lib/ui.autocomplete.js,
+ js/lib/ui.avatar_cropper.js, js/lib/ui.friends_picker.js,
+ js/lib/ui.userpicker.js, js/lib/userpicker.js: atleast renaming the ui js
+ libs
+
+ * engine/classes/ElggRelationship.php: Fixes #4089 corrects documentation of
+ ElggRelationship constructor
+
+ * engine/lib/relationships.php: Fixes #4090 removes double assignment -
+ thanks to andres.fortier
+
+2011-11-14 Cash Costello <cash.costello@gmail.com>
+
+ * mod/messages/pages/messages/send.php,
+ mod/messages/views/default/forms/messages/send.php: Refs #4083 increased
+ number of friends to 50
+
+2011-11-13 cash <cash.costello@gmail.com>
+
+ * engine/classes/ElggMenuItem.php: added the missing set/get priority
+ methods to ElggMenuItem
+
+2011-11-13 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/users.php, .../views/default/bookmarks/bookmarklet.php,
+ views/default/core/avatar/upload.php, views/default/forms/avatar/crop.php,
+ views/default/icon/default.php, views/default/icon/user/default.php,
+ views/default/output/img.php: Fixes #4082 adds output/img
+
+ * .../views/default/groups/profile/widgets.php: should be a ul rather than a
+ div
+
+ * views/default/output/confirmlink.php: need to unset the trusted link key
+
+2011-11-12 cash <cash.costello@gmail.com>
+
+ * documentation/examples/hooks/advanced.php,
+ documentation/examples/hooks/all.php, documentation/examples/hooks/basic.php,
+ documentation/examples/hooks/register/advanced.php,
+ documentation/examples/hooks/register/all.php,
+ documentation/examples/hooks/register/basic.php,
+ documentation/examples/hooks/register/emit.php,
+ documentation/examples/hooks/trigger.php,
+ documentation/examples/hooks/trigger/advanced.php,
+ documentation/examples/hooks/trigger/basic.php: cleaned up the plugin hooks
+ documentation
+
+ * documentation/examples/actions/basic.php,
+ documentation/examples/actions/manual_tokens.php,
+ documentation/examples/events/advanced.php,
+ documentation/examples/events/all.php,
+ documentation/examples/events/basic.php,
+ documentation/examples/events/emit.php,
+ documentation/examples/events/trigger.php,
+ documentation/examples/plugins/README.txt,
+ documentation/examples/plugins/languages/en.php,
+ documentation/examples/plugins/manifest.xml,
+ .../examples/plugins/manifest_options/manifest.xml,
+ .../examples/plugins/skeleton/manifest.xml, documentation/info/config.php,
+ documentation/info/manifest.xml, documentation/stubs/config.php: added better
+ plugin skeleton and added documentation to some of the examples
+
+2011-11-12 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/admin.php: added bottom margin to info modules for
+ plugin settings
+
+ * engine/lib/users.php, mod/groups/actions/groups/edit.php,
+ mod/groups/actions/groups/membership/leave.php, mod/invitefriends/start.php,
+ pages/entities/index.php, pages/settings/account.php,
+ pages/settings/statistics.php: removed uses of deprecated function for
+ setting page owner guid
+
+ * mod/invitefriends/actions/invite.php: fixed exception being thrown when no
+ site email address has been set
+
+ * views/default/css/admin.php: added a input class for text boxes so that
+ they aren't super long
+
+ * mod/messages/pages/messages/send.php: removed deprecated function from
+ messages plugin
+
+2011-11-10 cash <cash.costello@gmail.com>
+
+ * languages/en.php, mod/pages/pages/pages/edit.php: fixed WSOD when trying
+ to edit a private page
+
+ * engine/lib/database.php: Fixes #4071 hellekin was right - it was a bad
+ idea to format queries
+
+ * js/lib/ajax.js, js/lib/elgglib.js, js/lib/security.js,
+ js/tests/ElggLibTest.js, js/tests/ElggSecurityTest.js: Fixes #4010 not
+ sending naked query strings into add ajax tokens and also fixed a few related
+ bugs in JavaScript
+
+2011-11-08 Cash Costello <cash.costello@gmail.com>
+
+ * mod/likes/languages/en.php: exclamation marks are annoying in
+ notifications
+
+ * CONTRIBUTORS.txt, COPYRIGHT.txt: we rewrote default widgets from scratch
+ so updated copyright/contributors to reflect that
+
+ * .../examples/plugins/manifest_options/manifest.xml,
+ .../examples/plugins/skeleton/manifest.xml, engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_17/manifest.xml,
+ engine/tests/test_files/plugin_18/manifest.xml, mod/blog/manifest.xml,
+ mod/bookmarks/manifest.xml, mod/categories/manifest.xml,
+ mod/custom_index/manifest.xml, mod/dashboard/manifest.xml,
+ mod/developers/manifest.xml, mod/diagnostics/manifest.xml,
+ mod/embed/manifest.xml, mod/externalpages/manifest.xml,
+ mod/file/manifest.xml, mod/garbagecollector/manifest.xml,
+ mod/groups/manifest.xml, mod/htmlawed/manifest.xml,
+ mod/invitefriends/manifest.xml, mod/likes/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/members/manifest.xml, mod/messageboard/manifest.xml,
+ mod/messages/manifest.xml, mod/notifications/manifest.xml,
+ mod/oauth_api/manifest.xml, mod/pages/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/twitter_api/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: it is GPL General Public License not GPL Public
+ License
+
+ * views/rss/page/default.php: Refs #3150 can pass description to RSS page
+ shell
+
+2011-11-07 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggUser.php, views/default/js/initialize_elgg.php: Refs
+ #4007 previous solution to admin population in ElggUser was throwing warnings
+
+ * README.txt: fixed date on copyright and name of GPL
+
+ * mod/custom_index/start.php: removing deprecated functions from
+ custom_index plugin
+
+ * CHANGES.txt: Updated change log
+
+ * version.php: incremented version number
+
+ * INSTALL.txt: updated install instructions
+
+ * UPGRADE.txt: fixed wording in upgrade instructions
+
+2011-11-07 Evan Winslow <evan.b.winslow@gmail.com>
+
+ * documentation/coding_standards/best_practices.txt: Fixes #3397: Adds
+ 'positive' variable name standard to best practices file.
+
+2011-11-06 Cash Costello <cash.costello@gmail.com>
+
+ * mod/tinymce/views/default/js/tinymce.php,
+ .../default/tinymce/embed_custom_insert_js.php: Fixes #3853 caching a
+ bookmark for insert carot when embedding content into TinyMCE editor
+
+ * mod/tinymce/vendor/tinymce/changelog.txt,
+ .../tiny_mce/plugins/emotions/emotions.htm,
+ .../tiny_mce/plugins/emotions/js/emotions.js,
+ .../tiny_mce/plugins/emotions/langs/en_dlg.js,
+ .../tiny_mce/plugins/lists/editor_plugin.js,
+ .../tiny_mce/plugins/lists/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../tiny_mce/plugins/media/moxieplayer.swf,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/table.js,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../jscripts/tiny_mce/themes/advanced/charmap.htm,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../tiny_mce/themes/advanced/js/charmap.js,
+ .../tiny_mce/themes/advanced/js/color_picker.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../vendor/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_src.js: upgraded TinyMCE to 3.4.7
+
+ * mod/embed/views/default/js/embed/embed.php,
+ mod/likes/views/default/annotation/likes.php,
+ mod/messages/views/default/object/messages.php,
+ .../views/default/thewire/profile_status.php,
+ .../forms/twitter_api/interstitial_settings.php: removed uses of CSS class
+ .right from plugins
+
+ * views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php,
+ views/default/page/elements/footer.php: remove uses of the CSS class right
+ from core
+
+ * engine/lib/entities.php, mod/blog/activate.php, mod/thewire/activate.php:
+ Fixes #4068 not forcing update on adds when the subtype exists Refs #4058
+
+ * engine/lib/cron.php: $CONFIG->input is never initialized by page handling
+ so this code never did anything
+
+ * mod/blog/activate.php, mod/blog/deactivate.php, mod/search/README.txt,
+ mod/thewire/activate.php, mod/thewire/deactivate.php, mod/thewire/start.php:
+ Fixes #4067 adds activate/deactivate scripts
+
+ * views/default/icon/user/default.php: added a href override to the user
+ icon view
+
+2011-11-05 cash <cash.costello@gmail.com>
+
+ * engine/classes/ElggMenuItem.php, engine/lib/elgglib.php,
+ engine/lib/navigation.php, engine/lib/views.php, mod/blog/start.php,
+ mod/file/start.php, mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ .../views/default/object/groupforumtopic.php, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/profile/start.php,
+ mod/thewire/pages/thewire/everyone.php, pages/settings/account.php,
+ views/default/forms/login.php, views/default/input/button.php,
+ views/default/output/access.php, views/default/page/components/gallery.php,
+ views/default/page/components/list.php,
+ views/default/page/components/module.php,
+ views/default/page/layouts/one_column.php,
+ views/default/page/layouts/widgets.php: Fixes #4024 fixed a lot of notices -
+ enough for this release - found a few bugs
+
+ * .../views/default/admin/users/unvalidated.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ .../views/default/uservalidationbyemail/css.php,
+ .../views/default/uservalidationbyemail/js.php,
+ .../uservalidationbyemail/unvalidated_user.php: Fixes #3867 finished up
+ uservalidationbyemail styling after a great start by Sem
+
+ * views/default/css/admin.php, views/default/css/elements/core.php,
+ views/default/css/elements/helpers.php,
+ views/default/forms/admin/menu/save.php: cleaned up some CSS in admin theme
+
+ * mod/file/languages/en.php, mod/file/start.php,
+ views/default/navigation/listtype.php, views/default/navigation/viewtype.php,
+ views/default/page/elements/sidebar.php: Fixes #1253 added toggle for list
+ types to file plugin. It's not pretty so we may want to style/rethink in
+ future version
+
+ * engine/lib/input.php, engine/lib/views.php,
+ .../views/default/theme_preview/icons/avatars.php,
+ mod/file/views/default/icon/object/file.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../notifications/subscriptions/forminternals.php,
+ mod/profile/views/default/profile/owner_block.php,
+ views/default/icon/default.php, views/default/icon/user/default.php,
+ views/default/input/friendspicker.php, views/default/input/userpicker.php,
+ views/default/profile/icon.php, .../river/user/default/profileiconupdate.php:
+ Fixes #3567 standardized classes for icons
+
+ * mod/file/views/default/icon/object/file.php,
+ views/default/icon/default.php, views/default/icon/user/default.php: Fixes
+ #4023 escaping alt and title attributes in icon views
+
+ * mod/groups/start.php: Refs #4059 group icon handler needs to return true
+
+ * views/default/input/date.php, views/default/output/date.php: Fixes #4050
+ using ISO 8601 standard for dates
+
+ * engine/lib/entities.php: Fixes #4018 Refs #3722 merged up to 1.7.14 into
+ master
+
+ * engine/lib/entities.php: fixed spacing on two uses of unset()
+
+ * engine/lib/views.php, js/tests/jsTestDriver.conf,
+ vendors/jquery/jquery-1.6.1.min.js, vendors/jquery/jquery-1.6.2.min.js,
+ vendors/jquery/jquery-1.6.4.min.js, vendors/jquery/jquery-ui-1.8.14.min.js,
+ views/installation/page/default.php: Fixes #4057 updates jQuery version to
+ 1.6.4
+
+ * mod/file/download.php, mod/file/pages/file/download.php,
+ mod/file/pages/file/view.php, mod/file/start.php,
+ mod/file/views/rss/file/enclosure.php: Fixes #4048 using page handler for
+ file downloads
+
+ * engine/lib/database.php: Fixes #4049 casting bool to int so it doesn't
+ disappear in the cache key
+
+ * js/lib/elgglib.js, js/tests/ElggLibTest.js: Fixes #3976 fixed unit tests
+ for normalizing urls and standardized the code from the previous merge
+
+ * js/tests/README, js/tests/jsTestDriver.conf: Changed default port to a
+ common one found in tutorials. Let me know if this is an issue. Also added
+ intructions for running the unit tests.
+
+2011-11-05 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/pagehandler.php: Refs #4053 improved documentation of
+ page_handler()
+
+ * actions/avatar/upload.php: Refs #4011 forgot upload action
+
+ * mod/twitter_api/lib/twitter_api.php: Fixes #4061 getting icon sizes from
+ config for twitter plugin
+
+ * engine/lib/users.php, pages/account/login.php: Fixes #4060 combined some
+ page handlers for users lib
+
+2011-11-04 cash <cash.costello@gmail.com>
+
+ * engine/lib/admin.php, engine/lib/cron.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/pagehandler.php, engine/lib/river.php,
+ engine/lib/tags.php, engine/lib/user_settings.php, engine/lib/users.php,
+ mod/blog/start.php, mod/bookmarks/start.php, mod/categories/start.php,
+ mod/dashboard/start.php, mod/developers/start.php,
+ mod/externalpages/start.php, mod/file/start.php, mod/groups/start.php,
+ mod/invitefriends/start.php, mod/members/start.php,
+ mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/search/start.php, mod/thewire/start.php,
+ mod/twitter_api/start.php, mod/uservalidationbyemail/start.php: Fixes #4059
+ returning true when handling a page
+
+ * engine/lib/admin.php, engine/lib/deprecated-1.8.php,
+ engine/lib/elgglib.php, engine/lib/pagehandler.php, engine/lib/river.php,
+ engine/lib/tags.php, engine/lib/user_settings.php, engine/lib/users.php,
+ mod/blog/start.php, mod/bookmarks/start.php, mod/categories/start.php,
+ mod/dashboard/start.php, mod/developers/start.php, mod/diagnostics/start.php,
+ mod/externalpages/start.php, mod/file/start.php, mod/groups/start.php,
+ mod/invitefriends/start.php, mod/members/start.php,
+ mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/search/start.php, mod/thewire/start.php,
+ mod/twitter_api/start.php, mod/uservalidationbyemail/start.php: Fixes #4059
+ page handlers all return nothing
+
+ * mod/blog/start.php: fixed typo in comment for blog page handler
+
+2011-11-04 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/entities.php: Fixes #4058 updating a subtype if it already
+ exists
+
+ * mod/groups/languages/en.php,
+ .../views/rss/annotation/group_topic_post.php,
+ mod/groups/views/rss/discussion/replies.php,
+ mod/groups/views/rss/forum/topicposts.php,
+ mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/contentwrapper.php,
+ mod/groups/views/rss/groups/profile/layout.php,
+ mod/groups/views/rss/groups/profileitems.php,
+ mod/groups/views/rss/object/groupforumtopic.php: Fixes #4027 updated groups
+ RSS feeds for 1.8
+
+ * .../views/default/custom_index/css.php,
+ .../views/default/page/layouts/custom_index.php: Refs #2937 featured is
+ primary module class and highlight is extension
+
+ * views/default/core/walled_garden/login.php,
+ views/default/core/walled_garden/lost_password.php,
+ views/default/core/walled_garden/register.php,
+ views/default/page/components/module.php: Fixes #4047 header and footer
+ optional for the module view
+
+2011-11-03 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/ie7.php: updated CSS for walled garden and IE7
+
+ * views/default/forms/login.php: Fixes #3882 Remember me needed to be
+ floated before the button was added
+
+ * js/tests/jsTestDriver.conf: updated jsTest configuration for new jQuery
+ and hooks library
+
+ * js/tests/ElggLanguagesTest.js, js/tests/ElggSecurityTest.js: Fixes #4051 -
+ fixes security token unit test and language unit tests
+
+ * js/lib/elgglib.js: Fixes #4034 now using approach that exists in IE to
+ find elements in an Array
+
+ * js/lib/hooks.js: Refs #4051 hooks trigger function was returning undefined
+ when it should have been returning true
+
+ * js/classes/ElggPriorityList.js: Refs #4051 insert also needed to check for
+ undefined priorities
+
+ * js/classes/ElggPriorityList.js: Refs #4051 fixed insert for case when
+ priority is set to 0
+
+ * js/tests/ElggPriorityListTest.js: Refs #4051 fixed bad unit test for
+ ElggPriorityList.insert
+
+2011-11-03 Sem <sembrestels@riseup.net>
+
+ * .../forms/uservalidationbyemail/bulk_action.php,
+ .../views/default/uservalidationbyemail/css.php,
+ .../views/default/uservalidationbyemail/js.php,
+ .../uservalidationbyemail/unvalidated_user.php, views/default/css/admin.php:
+ Refs #3867. Unvalidated users is an unordered list now. Added right class and
+ other css helpers to admin css. Standarized css namespaces and dashes in
+ classes. Acomplishing code standards.
+
+2011-11-03 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * engine/lib/entities.php: Fixes 4041 (Deleted entities remain in memcache)
+
+2011-11-03 Cash Costello <cash.costello@gmail.com>
+
+ * mod/bookmarks/languages/en.php,
+ mod/bookmarks/views/rss/object/bookmarks.php, mod/file/start.php,
+ mod/file/views/rss/file/enclosure.php, mod/file/views/rss/object/file.php,
+ mod/search/views/rss/search/list.php,
+ mod/search/views/rss/search/listing.php, mod/thewire/languages/en.php,
+ mod/thewire/views/rss/object/thewire.php,
+ views/rss/annotation/generic_comment.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/user/default.php: Refs #4027 updated
+ all rss views except for groups
+
+ * mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/friends.php, mod/file/languages/en.php,
+ mod/file/pages/file/world.php, mod/groups/languages/en.php,
+ mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ .../views/default/discussion/group_module.php: Fixes #4042 made sure empty
+ content pages had a message about no content
+
+2011-11-03 Sem <sembrestels@riseup.net>
+
+ * js/lib/elgglib.js, js/tests/ElggLibTest.js: Fixes #3976.
+ elgg.normalize_url() js function has the fix in #3747.
+
+2011-11-02 Cash Costello <cash.costello@gmail.com>
+
+ * engine/start.php, install/ElggInstaller.php: input lib depends on
+ pageowner lib now
+
+ * .../views/default/theme_preview/forms.php: Refs #4039 updated the theming
+ sandbox for radio button classes
+
+2011-11-02 Sem <sembrestels@riseup.net>
+
+ * .../forms/uservalidationbyemail/bulk_action.php,
+ .../views/default/uservalidationbyemail/css.php,
+ .../uservalidationbyemail/unvalidated_user.php: Refs #3867.
+ elgg_view_image_block used for list users. Bulk operations as a list.
+
+ * mod/uservalidationbyemail/start.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ .../views/default/uservalidationbyemail/css.php,
+ .../views/default/uservalidationbyemail/js.php,
+ .../uservalidationbyemail/unvalidated_user.php: Fixes #3867. Rewrite and
+ style unvalidated users administration area.
+
+2011-11-02 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * views/default/css/elements/forms.php: #4039 (Incorrect CSS class set in
+ input/radio)
+
+2011-11-01 cash <cash.costello@gmail.com>
+
+ * .../views/default/admin/developers/settings.php,
+ .../admin/develop_utilities/diagnostics.php,
+ .../views/default/admin/appearance/expages.php,
+ mod/externalpages/views/default/expages/menu.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/appearance/profile_fields.php,
+ views/default/admin/plugin_settings.php,
+ views/default/admin/settings/advanced.php,
+ views/default/admin/settings/basic.php, views/default/css/admin.php: Fixes
+ #3672 added class for settings forms in admin area
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/entities.php, engine/lib/location.php, engine/lib/metadata.php,
+ engine/lib/plugins.php, engine/lib/private_settings.php,
+ engine/lib/relationships.php: standardized the elgg_get_entities* function
+ @return documentation
+
+ * mod/blog/lib/blog.php, mod/blog/views/default/object/blog.php,
+ mod/bookmarks/pages/bookmarks/view.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ views/default/object/elements/full.php: Fixes #4035 made the entity view
+ pages consistent for blog, bookmarks, file, pages, and forum posts
+
+ * js/lib/ui.js: Fixes #4022 made JS lib a little more consistent
+
+ * .../javascript_coding_standards.txt, js/lib/avatar_cropper.js,
+ js/lib/configuration.js, js/lib/elgglib.js, js/lib/hooks.js, js/lib/ui.js,
+ js/lib/ui.widgets.js, js/lib/userpicker.js,
+ mod/blog/views/default/js/blog/save_draft.php,
+ mod/bookmarks/views/default/bookmarks/js.php,
+ .../views/default/js/developers/developers.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ mod/thewire/views/default/js/thewire.php,
+ mod/tinymce/views/default/js/tinymce.php,
+ .../views/default/uservalidationbyemail/js.php: added semi-colons after
+ function expressions
+
+ * engine/classes/ElggUser.php, js/classes/ElggUser.js: Fixes #4007 merged in
+ sembrestels fix for ElggUser.isAdmin but used prototype instead of extending
+ object in constructor
+
+ * views/default/output/text.php: Fixes #4038 corrects comment for view
+ output/text
+
+2011-10-30 cash <cash.costello@gmail.com>
+
+ * engine/lib/elgglib.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/walled_garden/body.php,
+ views/default/core/walled_garden/login.php,
+ views/default/core/walled_garden/lost_password.php,
+ views/default/core/walled_garden/register.php,
+ views/default/css/walled_garden.php, views/default/forms/login.php,
+ views/default/js/walled_garden.php, views/default/page/walled_garden.php:
+ added back support for registration and forgotten passwords to walled garden
+ index
+
+ * _graphics/walled_garden/one_column_bottom.png,
+ _graphics/walled_garden/one_column_middle.png,
+ _graphics/walled_garden/one_column_top.png,
+ _graphics/walled_garden/two_column_bottom.png,
+ _graphics/walled_garden/two_column_middle.png,
+ _graphics/walled_garden/two_column_top.png,
+ _graphics/walled_garden_background_bottom.gif,
+ _graphics/walled_garden_background_extend.gif,
+ _graphics/walled_garden_background_top.gif,
+ _graphics/walled_garden_backgroundfull_bottom.gif,
+ _graphics/walled_garden_backgroundfull_top.gif, engine/lib/elgglib.php,
+ views/default/core/walled_garden/body.php,
+ views/default/css/walled_garden.php, views/default/page/walled_garden.php:
+ basic walled garden implementation for logging in
+
+ * views/default/core/account/login_box.php: added support for specifying the
+ module type to login box
+
+2011-10-30 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/plugins.php, languages/en.php, views/default/admin/plugins.php:
+ Fixes #2821. Plugins that are active and cannot be started emit an admin
+ notice.
+
+2011-10-30 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/input.php, mod/htmlawed/start.php,
+ views/default/output/longtext.php: Fixes #3370 running the anti-spam option
+ of htmlawed when filtering for output
+
+ * engine/lib/output.php: removed non-overridable insertion of inline style
+ to links
+
+ * engine/lib/configuration.php, engine/lib/pageowner.php: setting
+ $CONFIG->context earlier to avoid using the context functions before it is
+ initialized
+
+2011-10-29 Brett Profitt <brett.profitt@gmail.com>
+
+ * actions/widgets/save.php, views/default/widgets/river_widget/content.php,
+ views/default/widgets/river_widget/edit.php: Fixes #4001. Activity widget
+ passes a context so correct output is displayed upon save.
+
+ * js/lib/elgglib.js, js/lib/security.js: Fixes #4010, refs #3927. Fixed
+ elgg.security.addToken() to work with query strings, relative URLs, and full
+ URLs.
+
+ * mod/blog/lib/blog.php, mod/blog/start.php, mod/notifications/index.php,
+ mod/thewire/start.php, mod/tinymce/start.php: Refs #3859. Added
+ elgg_register_simplecache_view() to core plugins' js.
+
+ * engine/lib/cache.php: Fixes #4029, refs #3859.
+ elgg_invalidate_simplecache() resets the lastcached and lastupdate datasets.
+ Added documentation about how to use simple cache views.
+
+2011-10-29 cash <cash.costello@gmail.com>
+
+ * .../examples/plugins/full_manifest/manifest.xml,
+ .../examples/plugins/manifest_options/manifest.xml,
+ .../examples/plugins/simple_manifest/manifest.xml,
+ .../examples/plugins/skeleton/manifest.xml: better organization for the
+ manifests and plugin skeleton
+
+ * .../examples/plugins/full_manifest/manifest.xml,
+ documentation/examples/plugins/manifest.xml,
+ .../examples/plugins/simple_manifest/manifest.xml: creates a simple manifest
+ for people to copy and use
+
+ * .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ .../vendors/oauth/library/OAuthRequester.php,
+ .../vendors/oauth/library/OAuthServer.php: Refs #4028 reset the oAuth lib to
+ version r64 of oauth-php
+
+ * engine/classes/ElggEntity.php, engine/classes/Locatable.php,
+ languages/en.php, views/default/annotation/generic_comment.php,
+ views/rss/annotation/default.php, views/rss/annotation/generic_comment.php,
+ views/rss/group/default.php, views/rss/object/creator.php,
+ views/rss/object/default.php, views/rss/object/georss.php,
+ views/rss/output/url.php, views/rss/page/components/creator.php,
+ views/rss/page/components/georss.php, views/rss/page/default.php,
+ views/rss/page/elements/comments.php, views/rss/river/item.php,
+ views/rss/search/entity_list.php, views/rss/user/default.php: Fixes #3201
+ updates rss view type for core Elgg
+
+ * views/php/api/output.php, views/php/group/default.php,
+ views/php/object/default.php, views/php/page/default.php,
+ views/php/site/default.php, views/php/user/default.php: Refs #3201 updates
+ the php view type
+
+ * views/json/api/output.php, views/json/entities/entity_list.php,
+ views/json/group/default.php, views/json/object/default.php,
+ views/json/site/default.php, views/json/user/default.php,
+ views/php/search/entity_list.php: Refs #3201 this finishes the updates on the
+ JSON view
+
+ * engine/classes/ElggRiverItem.php, views/json/page/components/list.php,
+ views/json/page/default.php, views/json/river/item.php,
+ views/json/river/item/list.php, views/json/search/entity_list.php: Refs #3201
+ updates json river views and removed old search view
+
+ * engine/lib/views.php, .../views/default/river/object/blog/create.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/river/object/file/create.php,
+ .../river/annotation/group_topic_post/reply.php,
+ mod/groups/views/default/river/group/create.php,
+ .../river/object/groupforumtopic/create.php,
+ .../default/river/relationship/member/create.php,
+ .../default/river/object/messageboard/create.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/thewire/create.php,
+ .../river/annotation/generic_comment/create.php,
+ views/default/river/elements/layout.php, views/default/river/item.php,
+ views/default/river/relationship/friend/create.php,
+ .../river/user/default/profileiconupdate.php,
+ views/default/river/user/default/profileupdate.php: adds a river layout view
+ that all river views should use
+
+ * mod/search/search_hooks.php: Refs #3983 merged fix into master
+
+ * pages/avatar/view.php: Refs #3396 fixed the integration of this 1.7 fix
+ into 1.8 and also added better expires header
+
+2011-10-29 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggEntity.php, mod/profile/icon.php,
+ mod/profile/icondirect.php, mod/profile/start.php: Fixes #3920 profile plugin
+ adds a fast loading of user avatars
+
+ * mod/messages/pages/messages/read.php, mod/messages/start.php,
+ mod/messages/views/default/object/messages.php: Fixes #4015 decrementing the
+ count before adding to the topbar
+
+2011-10-28 Cash Costello <cash.costello@gmail.com>
+
+ * js/lib/ui.js, views/default/input/date.php: Fixes #4012 when using a
+ timestamp with input/date, return UTC time rather than local time
+
+ * .../views/default/theme_preview/forms.php: using correct date string now
+ in developers form sandbox
+
+2011-10-27 cash <cash.costello@gmail.com>
+
+ * actions/avatar/crop.php, engine/lib/views.php,
+ mod/groups/actions/groups/edit.php: Fixes #4011 icon sizes are configurable
+ now
+
+ * mod/externalpages/start.php, views/default/css/elements/navigation.php,
+ views/default/css/ie7.php, views/default/forms/login.php,
+ views/default/page/walled_garden.php: Fixes #3863 introduced
+ elgg-menu-general so that elgg-menu-footer can be specific to site footer
+
+ * views/default/object/plugin.php, views/default/object/plugin/advanced.php,
+ views/default/object/plugin/full.php, views/default/object/plugin/simple.php:
+ Refs #3917 removed more code from simple plugin interface
+
+ * mod/search/start.php, mod/search/views/default/search/css.php,
+ mod/search/views/default/search/header.php,
+ mod/search/views/default/search/search_box.php: Fixes #3687 added
+ .elgg-search-header for css specific to header search box
+
+ * js/lib/avatar_cropper.js: Fixes #3832 initialize avatar crop area
+
+ * mod/groups/lib/groups.php,
+ .../views/default/groups/membershiprequests.php: Refs #3296 displaying all
+ group membership requests on one page
+
+ * views/rss/page/default.php: Fixes #3150 added a blank description field so
+ RSS is valid - any better ideas?
+
+ * engine/lib/views.php, .../views/default/custom_index/css.php,
+ .../views/default/page/layouts/custom_index.php: Fixes #2937 added
+ .elgg-module-front
+
+2011-10-27 Cash Costello <cash.costello@gmail.com>
+
+ * pages/account/register.php, views/default/css/admin.php,
+ views/default/css/elements/forms.php: Refs #3672 updated account forms for
+ max width
+
+ * engine/lib/users.php: login page should not be displayed to logged in
+ users
+
+2011-10-26 Brett Profitt <brett.profitt@gmail.com>
+
+ * UPGRADE.txt: Made instructions for removing mod/profile clearer.
+
+2011-10-26 Cash Costello <cash.costello@gmail.com>
+
+ * mod/likes/start.php: Fixes #3958 added special catch for liking groups
+
+ * languages/en.php, .../admin/appearance/profile_fields/list.php,
+ views/default/forms/profile/fields/add.php: Fixes #3926 updated spacing for
+ edit profile field forms
+
+2011-10-26 Sem <sembrestels@riseup.net>
+
+ * mod/externalpages/start.php, views/default/css/walled_garden.php,
+ views/default/page/walled_garden.php: Closes #3947. External pages are now
+ viewable by visitors in walled-garden sites. Footer menu is also added into
+ walled-garden logging page.
+
+2011-10-25 cash <cash.costello@gmail.com>
+
+ * views/default/object/elements/summary.php: Fixes #2292 added
+ object/summary/extend view
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/pages/views/default/object/page_top.php,
+ views/default/object/elements/full.php: added new view for the full display
+ of objects
+
+2011-10-25 Cash Costello <cash.costello@gmail.com>
+
+ * views/ical/export/entity.php, views/ical/object/default.php,
+ views/ical/page/default.php, views/ical/search/entity_list.php: Refs #3201 a
+ working ical view type
+
+2011-10-24 cash <cash.costello@gmail.com>
+
+ * mod/profile/views/default/profile/metatags.php,
+ views/foaf/page/default.php, views/foaf/search/entity_list.php,
+ views/foaf/user/default.php: Refs #3201 updated foaf link to only be added to
+ user's pages
+
+ * views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/page/default.php: Refs #3201 updating failsafe viewtype to
+ Elgg standards for CSS
+
+ * .../admin/develop_utilities/diagnostics.php,
+ .../views/default/forms/diagnostics/download.php: Fixes #3868 removed
+ unnecessary form for downloading the diagnostics report
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ mod/pages/views/default/object/page_top.php: Fixes #3974 blog, bookmarks,
+ file, and pages plugins consistent in integration with categories plugin
+
+2011-10-23 germanazo <germanazo@phpdev>
+
+ * engine/lib/users.php: Cleanned the login failures on passwords resets,
+ this have more sense
+
+2011-10-23 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/page/components/module.php: Fixes #4003 footer in modules is
+ included by default
+
+ * views/default/input/reset.php, views/default/input/submit.php: Refs #3810
+ standardizes the button views
+
+2011-10-23 Brett Profitt <brett.profitt@gmail.com>
+
+ * .../admin/appearance/profile_fields/list.php, views/default/js/admin.php:
+ Fixes #3864. Removed old code from profile fields sorting. Name spaced IDs
+ and classes.
+
+ * engine/lib/elgglib.php, js/lib/avatar_cropper.js, js/lib/ui.js,
+ views/default/forms/avatar/crop.php: Fixes #3914. Pulled avatar code out into
+ its own library.
+
+ * js/lib/ui.js, views/default/css/elements/misc.php,
+ views/default/forms/avatar/crop.php: Fixes #3914. Moved avatar cropping to
+ ui.js.
+
+ * engine/lib/plugins.php: Fixes #3991. Populating provided_by in
+ elgg_get_plugins_provides().
+
+ * UPGRADE.txt: Fixes #3975. Added mod/profile to the list of dirs to remove
+ for an upgrade.
+
+ * mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/categories/manifest.xml, mod/custom_index/manifest.xml,
+ mod/dashboard/manifest.xml, mod/developers/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/embed/manifest.xml,
+ mod/externalpages/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/likes/manifest.xml, mod/logbrowser/manifest.xml,
+ mod/logrotate/manifest.xml, mod/members/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/oauth_api/manifest.xml,
+ mod/pages/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/twitter_api/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: Fixes #3959. Using elgg_release in core plugins.
+
+2011-10-21 Cash Costello <cash.costello@gmail.com>
+
+ * install/ElggInstaller.php, install/cli/sample_installer.php: Fixes #3995
+ the batch installer now skips the settings file creation step if settings.php
+ already exists
+
+ * install/ElggInstaller.php: Fixes #3994 cleaned up session handling for the
+ installer
+
+ * engine/lib/filestore.php: don't set default filestore if we don't have a
+ dataroot
+
+ * engine/classes/ElggSite.php: updated ElggSite::disable() to conform to
+ ElggEntity::disable()
+
+ * engine/classes/ElggMetadata.php, engine/lib/entities.php: Fixes #3988
+ correctly passing user_guid through canEdit for metadata
+
+ * engine/lib/entities.php: fixed access of non-object property in entities
+ lib
+
+ * engine/lib/access.php: Fixes #3989 fixed access of non-object property in
+ access lib
+
+ * views/installation/input/access.php, views/installation/input/button.php,
+ views/installation/input/checkbox.php, views/installation/input/dropdown.php,
+ views/installation/input/form.php, views/installation/input/password.php,
+ views/installation/input/text.php: cleaned up input views for installation so
+ that no notices are thrown
+
+2011-10-21 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * views/default/input/reset.php: #3810 (No class in input/reset view)
+
+2011-10-20 Brett Profitt <brett.profitt@gmail.com>
+
+ * views/default/admin/plugins.php: Fixes #3990 Using
+ ElggPlugin->getFriendlyName() for sorting alphabetically to avoid WSODs with
+ invalid plugins.
+
+ * engine/start.php: Fixes #3680. Explicitly connecting to db in start.php.
+
+ * languages/en.php: Fixes #3968. Added 'on' and 'off' to core language.
+
+ * views/default/forms/widgets/save.php: Fixes #3951. Added label for access
+ dropdown in widget edit view.
+
+2011-10-19 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/filestore.php, engine/lib/plugins.php: fixed minor errors in
+ the documentation in plugins and filestore lib
+
+2011-10-18 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/users.php: fixed typo in setting the default profile fields
+
+2011-10-17 cash <cash.costello@gmail.com>
+
+ * actions/useradd.php: added another check to useradd action
+
+2011-10-17 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggPluginPackage.php: added additional readme names for
+ display on plugin page
+
+2011-10-15 Brett Profitt <brett.profitt@gmail.com>
+
+ * js/lib/elgglib.js, js/lib/hooks.js: Fixes #3540. Added "instant hooks" to
+ JS hooks engine. elgg.register_instant_hook(name, type) will cause any
+ handler registering to that hook to be immediately executed if the hook has
+ been previously triggered. Open for better suggestions about the name.
+
+2011-10-14 Brett Profitt <brett.profitt@gmail.com>
+
+ * js/lib/security.js: Fixes #3927. elgg.security.addToken() works for URLs
+ without query strings.
+
+ * js/lib/elgglib.js: Refs #3927, #3976. Added elgg.parse_url() and
+ elgg.parse_str().
+
+2011-10-14 Janek Lasocki-Biczysko <j.lasocki-biczysko@intrallect.com>
+
+ * engine/classes/ElggMemcache.php: Ticket #3928 updated
+ ElggMemecache->save() to take 3rd optional parameter
+
+2011-10-14 Cash Costello <cash.costello@gmail.com>
+
+ * .../river/user/default/profileiconupdate.php: Fixes #3977 not showing
+ hover menu on avatar update in river
+
+2011-10-13 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php: Fixes #3901. Corrected typo for maxtime
+ sorting.
+
+ * actions/admin/plugins/simple_update_states.php,
+ documentation/examples/plugins/manifest.xml,
+ engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser18.php, engine/lib/admin.php,
+ engine/tests/api/plugins.php, engine/tests/test_files/plugin_18/manifest.xml,
+ languages/en.php, mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/categories/manifest.xml, mod/custom_index/manifest.xml,
+ mod/dashboard/manifest.xml, mod/developers/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/embed/manifest.xml,
+ mod/externalpages/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/likes/manifest.xml, mod/logbrowser/manifest.xml,
+ mod/logrotate/manifest.xml, mod/members/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/pages/manifest.xml,
+ mod/profile/manifest.xml, mod/reportedcontent/manifest.xml,
+ mod/search/manifest.xml, mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/uservalidationbyemail/manifest.xml, mod/zaudio/manifest.xml: Fixes #3917.
+ Removed uses of admin interface in manifests. Removed related code.
+
+2011-10-13 cash <cash.costello@gmail.com>
+
+ * js/lib/userpicker.js, views/default/input/userpicker.php: added
+ documentation for the userpicker
+
+2011-10-13 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/categories/listing.php, mod/categories/pages/categories/listing.php,
+ mod/categories/start.php: Fixes #3746. Moved the categories page handler
+ script. Updated the layout call.
+
+ * views/default/css/admin.php: Fixes #3880. Removed the too greedy CSS rule
+ for elgg-admin-notice a so only the close icon is float right.
+
+2011-10-13 cash <cash.costello@gmail.com>
+
+ * js/lib/userpicker.js: fixed bug where a removed user could not be added
+ again in userpicker
+
+2011-10-13 Brett Profitt <brett.profitt@gmail.com>
+
+ * languages/en.php: Fixes #3734. Changed "Tested value" to "Expected value"
+ in the plugin deps matrix.
+
+2011-10-13 cash <cash.costello@gmail.com>
+
+ * engine/lib/input.php, js/lib/userpicker.js,
+ views/default/css/elements/forms.php, views/default/input/userpicker.php:
+ displaying users that have been selected and added remove capability
+
+2011-10-13 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/twitter_api/languages/en.php,
+ .../default/plugins/twitter_api/usersettings.php: Fixes #3177. Don't show the
+ authorize twitter plugin setting if the admin hasn't set up the plugin.
+
+2011-10-13 cash <cash.costello@gmail.com>
+
+ * js/lib/userpicker.js, views/default/input/userpicker.php: got the friends
+ option working for user picker
+
+2011-10-12 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/output.php, engine/tests/api/helpers.php: Fixes #3747. Using
+ filter_var to check for any valid URI.
+
+2011-10-12 cash <cash.costello@gmail.com>
+
+ * engine/lib/input.php, mod/groups/views/default/group/default.php,
+ views/default/css/elements/forms.php, views/default/object/default.php,
+ views/default/user/default.php: Simple theme for autocomplete
+
+2011-10-11 Brett Profitt <brett.profitt@gmail.com>
+
+ * version.php: Setting version to 1.8.1b1 instead of 1.8.1b.
+
+ * CHANGES.txt: Fixed extra space in changes.
+
+2011-10-10 Brett Profitt <brett.profitt@gmail.com>
+
+ * CHANGES.txt: Ordered the bugfixes in a for relevance.
+
+ * CHANGES.txt: Fixed stray * in changes.
+
+ * CHANGES.txt, version.php: Version bump. Updated changes.
+
+2011-10-10 cash <cash.costello@gmail.com>
+
+ * engine/lib/user_settings.php, languages/en.php: Fixes #3952 handling
+ exceptions when password checks fail when changing password
+
+ * mod/blog/lib/blog.php, mod/bookmarks/pages/bookmarks/friends.php,
+ mod/bookmarks/pages/bookmarks/owner.php, mod/file/pages/file/friends.php,
+ mod/file/pages/file/owner.php, mod/pages/pages/pages/friends.php,
+ mod/pages/pages/pages/owner.php, mod/thewire/pages/thewire/friends.php,
+ mod/thewire/pages/thewire/owner.php: Refs #3916 added checks to all content
+ plugins in master for page owner in mine and friends pages
+
+ * mod/file/actions/file/upload.php, mod/file/languages/en.php: Refs #3919
+ merged file upload failure check to master
+
+2011-10-10 Cash Costello <cash.costello@gmail.com>
+
+ * actions/widgets/save.php: Fixes #3950 falling back to deprecated view when
+ saving a widget
+
+ * .../views/default/widgets/bookmarks/edit.php: Fixes #3949 bookmarks widget
+ fix
+
+2011-10-09 Cash Costello <cash.costello@gmail.com>
+
+ * languages/en.php, mod/messages/languages/en.php,
+ mod/notifications/languages/en.php,
+ .../core/settings/account/notifications.php: Fixes #595 separating email
+ address from email notification in language strings
+
+ * js/lib/ui.js, views/default/core/account/login_box.php,
+ views/default/forms/login.php, views/default/forms/register.php,
+ views/default/forms/user/requestnewpassword.php: Fixes #3673 added autofocus
+ class
+
+ * engine/lib/sites.php: Fixes #3796 get_site_by_url() now respects class
+ inheritance
+
+ * engine/classes/ElggSite.php: Fixes #3729 handling forwarding to page when
+ logging into a walled garden
+
+ * engine/tests/api/access_collections.php,
+ engine/tests/api/entity_getter_functions.php, engine/tests/api/helpers.php,
+ engine/tests/api/metadata.php, engine/tests/objects/entities.php: Fixes #3948
+ cleaning up stuff left behind by unit tests
+
+ * engine/classes/ElggSite.php: Fixes #3878 registering the security token
+ action as an external page
+
+2011-10-08 Cash Costello <cash.costello@gmail.com>
+
+ * engine/tests/objects/entities.php: Fixes #3946 deleting the temporary
+ entities created in entity unit tests
+
+ * engine/lib/entities.php, engine/tests/objects/sites.php: Fixes #3897 fixed
+ source of infinite regression loop in delete_entity()
+
+ * engine/classes/ElggAnnotation.php, engine/lib/access.php,
+ engine/lib/annotations.php, engine/tests/api/access_collections.php,
+ engine/tests/api/helpers.php, engine/tests/api/metadata.php,
+ engine/tests/objects/entities.php, engine/tests/objects/users.php,
+ engine/tests/regression/trac_bugs.php, mod/groups/start.php: Fixes #3942
+ fixed all the warnings and notices in the unit tests
+
+ * engine/classes/ElggPriorityList.php: Fixes #3945 using reset on the array
+
+ * engine/lib/widgets.php: Fixes #3944 fixing the default widgets
+ implementation
+
+ * engine/lib/entities.php: Fixes #3943 returning false in
+ can_write_to_container() if container does not exist
+
+ * engine/lib/elgglib.php: need to check if something exists before checking
+ its type
+
+ * engine/tests/ui/submenu.php: removed unused unit tests for old submenu
+ code
+
+ * engine/classes/ElggPlugin.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php: Fixes #3743 returning bool instead of int
+ when setting a private setting
+
+ * .../views/default/plugins/logrotate/settings.php: fixed bug with variable
+ name in log rotation
+
+ * engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/cache.php, engine/lib/calendar.php,
+ engine/lib/configuration.php, engine/lib/cron.php, engine/lib/database.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/filestore.php, engine/lib/group.php,
+ engine/lib/input.php, engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/navigation.php, engine/lib/notification.php,
+ engine/lib/objects.php, engine/lib/opendd.php, engine/lib/output.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/plugins.php, engine/lib/private_settings.php,
+ engine/lib/relationships.php, engine/lib/river.php, engine/lib/sessions.php,
+ engine/lib/sites.php, engine/lib/statistics.php, engine/lib/system_log.php,
+ engine/lib/tags.php, engine/lib/upgrade.php, engine/lib/user_settings.php,
+ engine/lib/users.php, engine/lib/views.php, engine/lib/web_services.php,
+ engine/lib/widgets.php, engine/lib/xml-rpc.php: Fixes #3936 added @access
+ private to internal functions
+
+ * engine/lib/actions.php: Fixes #3941 Refs #3936 added @access private in
+ action lib and added elgg_unregister_action()
+
+ * engine/lib/access.php, engine/lib/views.php: Fixes #3937 updated the
+ documentation for the access lib and a few minor code clean-ups
+
+ * engine/classes/ElggMenuItem.php,
+ mod/blog/views/default/blog/group_module.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/object/blog.php,
+ mod/blog/views/default/widgets/blog/content.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/widgets/bookmarks/content.php,
+ .../views/default/theme_preview/general.php,
+ .../admin/develop_utilities/diagnostics.php,
+ mod/file/views/default/file/group_module.php,
+ mod/file/views/default/icon/object/file.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/widgets/filerepo/content.php,
+ .../views/default/discussion/group_module.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/profile/summary.php,
+ .../views/default/groups/sidebar/members.php,
+ .../views/default/object/groupforumtopic.php,
+ .../default/widgets/a_users_groups/content.php,
+ mod/likes/views/default/annotation/likes.php,
+ mod/likes/views/default/likes/button.php,
+ mod/logbrowser/views/default/logbrowser/table.php,
+ .../views/default/widgets/messageboard/content.php,
+ mod/messages/views/default/object/messages.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/group_module.php,
+ mod/pages/views/default/widgets/pages/content.php,
+ .../views/default/object/reported_content.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/widgets/thewire/content.php,
+ .../forms/twitter_api/interstitial_settings.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ views/default/admin/appearance/default_widgets.php,
+ .../admin/appearance/profile_fields/list.php, views/default/admin/header.php,
+ views/default/icon/default.php, views/default/icon/user/default.php,
+ views/default/navigation/breadcrumbs.php,
+ views/default/navigation/menu/user_hover.php,
+ views/default/navigation/pagination.php, views/default/navigation/tabs.php,
+ views/default/object/admin_notice.php, views/default/object/default.php,
+ views/default/object/elements/summary.php,
+ views/default/object/plugin/advanced.php,
+ views/default/object/plugin/simple.php,
+ views/default/object/widget/elements/controls.php,
+ views/default/output/tag.php, views/default/output/url.php,
+ views/default/page/elements/footer.php,
+ views/default/page/elements/tagcloud_block.php,
+ views/default/page/layouts/widgets/add_button.php,
+ views/default/river/elements/body.php,
+ views/default/river/elements/responses.php,
+ views/default/river/elements/summary.php,
+ .../river/user/default/profileiconupdate.php,
+ views/default/river/user/default/profileupdate.php,
+ views/default/widgets/content_stats/content.php: Fixes #3411 output/url now
+ has a is_trusted parameter - defaults to false
+
+2011-10-07 Cash Costello <cash.costello@gmail.com>
+
+ * languages/en.php, .../admin/appearance/profile_fields/list.php,
+ views/default/forms/profile/fields/add.php: Fixes #3644 localized profile
+ field names
+
+2011-10-06 cash <cash.costello@gmail.com>
+
+ * engine/lib/elgglib.php, engine/lib/input.php, js/lib/autocomplete.js,
+ vendors/jquery/jquery.ui.autocomplete.html.js,
+ views/default/input/autocomplete.php, views/default/user/default.php: using
+ html extension to jquery.ui autocomplete
+
+ * engine/lib/input.php: Fixes #3932 Refs #3931 improved the livesearch
+ endpoint
+
+2011-10-05 cash <cash.costello@gmail.com>
+
+ * actions/useradd.php, engine/lib/users.php, languages/en.php: Fixes #3704
+ displaying error messages when adding users through admin interface
+
+2011-10-04 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/tinymce/vendor/tinymce/changelog.txt,
+ mod/tinymce/vendor/tinymce/examples/full.html,
+ .../vendor/tinymce/jscripts/tiny_mce/langs/en.js,
+ .../tiny_mce/plugins/advhr/langs/en_dlg.js,
+ .../tiny_mce/plugins/advimage/editor_plugin.js,
+ .../tiny_mce/plugins/advimage/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advimage/js/image.js,
+ .../tiny_mce/plugins/advimage/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlink/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlist/editor_plugin.js,
+ .../tiny_mce/plugins/advlist/editor_plugin_src.js,
+ .../tiny_mce/plugins/autolink/editor_plugin.js,
+ .../tiny_mce/plugins/autolink/editor_plugin_src.js,
+ .../tiny_mce/plugins/autoresize/editor_plugin.js,
+ .../plugins/autoresize/editor_plugin_src.js,
+ .../tiny_mce/plugins/autosave/editor_plugin.js,
+ .../tiny_mce/plugins/autosave/editor_plugin_src.js,
+ .../tiny_mce/plugins/contextmenu/editor_plugin.js,
+ .../plugins/contextmenu/editor_plugin_src.js,
+ .../plugins/emotions/img/smiley-foot-in-mouth.gif,
+ .../plugins/emotions/img/smiley-laughing.gif,
+ .../plugins/emotions/img/smiley-sealed.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-smile.gif,
+ .../plugins/emotions/img/smiley-surprised.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-wink.gif,
+ .../tiny_mce/plugins/emotions/langs/en_dlg.js,
+ .../plugins/example_dependency/editor_plugin.js,
+ .../example_dependency/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullscreen/editor_plugin.js,
+ .../plugins/fullscreen/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullscreen/fullscreen.htm,
+ .../tiny_mce/plugins/inlinepopups/editor_plugin.js,
+ .../plugins/inlinepopups/editor_plugin_src.js,
+ .../inlinepopups/skins/clearlooks2/img/alert.gif,
+ .../inlinepopups/skins/clearlooks2/img/button.gif,
+ .../inlinepopups/skins/clearlooks2/img/confirm.gif,
+ .../inlinepopups/skins/clearlooks2/img/corners.gif,
+ .../skins/clearlooks2/img/vertical.gif,
+ .../tiny_mce/plugins/layer/editor_plugin.js,
+ .../tiny_mce/plugins/layer/editor_plugin_src.js,
+ .../tiny_mce/plugins/lists/editor_plugin.js,
+ .../tiny_mce/plugins/lists/editor_plugin_src.js,
+ .../tiny_mce/plugins/media/editor_plugin.js,
+ .../tiny_mce/plugins/media/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/media/media.htm,
+ .../tiny_mce/plugins/nonbreaking/editor_plugin.js,
+ .../plugins/nonbreaking/editor_plugin_src.js,
+ .../tiny_mce/plugins/noneditable/editor_plugin.js,
+ .../plugins/noneditable/editor_plugin_src.js,
+ .../tiny_mce/plugins/paste/editor_plugin.js,
+ .../tiny_mce/plugins/paste/editor_plugin_src.js,
+ .../tiny_mce/plugins/paste/langs/en_dlg.js,
+ .../tiny_mce/plugins/searchreplace/langs/en_dlg.js,
+ .../tiny_mce/plugins/spellchecker/editor_plugin.js,
+ .../plugins/spellchecker/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/style/js/props.js,
+ .../tiny_mce/plugins/style/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/style/props.htm,
+ .../tiny_mce/plugins/tabfocus/editor_plugin.js,
+ .../tiny_mce/plugins/tabfocus/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/cell.htm,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/cell.js,
+ .../jscripts/tiny_mce/plugins/table/js/row.js,
+ .../tiny_mce/plugins/table/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/table/row.htm,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../tiny_mce/plugins/template/langs/en_dlg.js,
+ .../tiny_mce/plugins/wordcount/editor_plugin.js,
+ .../plugins/wordcount/editor_plugin_src.js,
+ .../tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../tiny_mce/themes/advanced/img/colorpicker.jpg,
+ .../tiny_mce/themes/advanced/img/flash.gif,
+ .../tiny_mce/themes/advanced/img/icons.gif,
+ .../tiny_mce/themes/advanced/img/quicktime.gif,
+ .../tiny_mce/themes/advanced/img/shockwave.gif,
+ .../jscripts/tiny_mce/themes/advanced/js/anchor.js,
+ .../jscripts/tiny_mce/themes/advanced/js/image.js,
+ .../jscripts/tiny_mce/themes/advanced/langs/en.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../themes/advanced/skins/default/content.css,
+ .../themes/advanced/skins/default/img/buttons.png,
+ .../themes/advanced/skins/default/img/items.gif,
+ .../themes/advanced/skins/default/img/tabs.gif,
+ .../tiny_mce/themes/advanced/skins/default/ui.css,
+ .../themes/advanced/skins/highcontrast/content.css,
+ .../themes/advanced/skins/highcontrast/ui.css,
+ .../themes/advanced/skins/o2k7/content.css,
+ .../themes/advanced/skins/o2k7/img/button_bg.png,
+ .../advanced/skins/o2k7/img/button_bg_black.png,
+ .../advanced/skins/o2k7/img/button_bg_silver.png,
+ .../tiny_mce/themes/advanced/skins/o2k7/ui.css,
+ .../jscripts/tiny_mce/themes/simple/img/icons.gif,
+ .../jscripts/tiny_mce/themes/simple/langs/en.js,
+ .../vendor/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_src.js,
+ .../jscripts/tiny_mce/utils/editable_selects.js: Refs #3853. Upgraded TinyMCE
+ to 3.4.6. Embed still inserts the content in the wrong place for IE 8.
+
+ * pages/avatar/view.php: Refs #3396. Added try / catch for avatar icon.
+
+2011-10-04 cash <cash.costello@gmail.com>
+
+ * mod/blog/lib/blog.php: Fixes #3793 blogs respect closed groups for main
+ index page
+
+ * .../views/default/object/reported_content.php,
+ views/default/css/admin.php: Refs #3809 implemented Evan's suggestion for
+ button spacing
+
+ * engine/lib/users.php: Fixes #3700 using different names for add friend and
+ remove friend user hover menu items
+
+ * mod/groups/lib/groups.php: Fixes #3841 not displaying leave group button
+ to group owners
+
+ * mod/groups/lib/groups.php: Fixes #3898 checking whether the viewer is
+ logged in before adding join/requet buttons
+
+ * engine/lib/entities.php: Fixes #3753 removed deprecated functions from
+ delete_entity()
+
+2011-10-03 cash <cash.costello@gmail.com>
+
+ * views/default/css/admin.php: Fixes #3866 added CSS for entity menu in
+ admin theme
+
+ * mod/embed/README.txt, mod/embed/views/default/embed/item.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/file/views/default/icon/object/file.php, views/default/icon/default.php:
+ using better insert class
+
+ * mod/embed/README.txt, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/layout.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/embed/views/default/navigation/menu/embed.php, mod/file/start.php,
+ .../views/default/embed/file_upload/content.php: removed the sections from
+ the menu to provide more flexibility in tab ordering
+
+2011-10-02 Brett Profitt <brett.profitt@gmail.com>
+
+ * pages/avatar/view.php: Fixed avatar handling for default icons if the
+ uploaded file is missing.
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/entities.php, engine/lib/metadata.php,
+ engine/lib/relationships.php: Merged docs update for getters from 1.7.
+
+ * engine/classes/ElggFile.php, mod/file/actions/file/upload.php: Merged file
+ mime type detection from 1.7.
+
+ * engine/lib/database.php: Merged fixes for delayed queries from 1.7.
+
+ * engine/tests/regression/trac_bugs.php: Merged test for
+ can_write_to_container().
+
+2011-09-10 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/tests/suite.php: Fixes #3675. Added admin gate keeper to unit
+ tests.
+
+2011-10-02 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/categories/deactivate.php: Removing admin notice for unpopulated
+ categories when disabling categories plugin.
+
+ * actions/admin/plugins/activate.php,
+ actions/admin/plugins/activate_all.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/deactivate_all.php,
+ actions/admin/plugins/set_priority.php, engine/classes/ElggPlugin.php,
+ engine/classes/ElggPluginPackage.php, languages/en.php: Fixes #3915. Added
+ ElggPlugin->getFriendlyName() to check for manifest->getName() first, then
+ for plugin ID. Added better descriptions for plugin activation errors.
+
+2011-10-01 cash <cash.costello@gmail.com>
+
+ * engine/lib/navigation.php, engine/lib/views.php: Fixes #3860 changed
+ context-sensitive to dynamic to describe menus
+
+ * mod/bookmarks/actions/bookmarks/save.php, mod/bookmarks/languages/en.php:
+ Fixes #3686 added work around for PHP bug when validating URLs with dashes
+
+2011-10-01 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/forms/avatar/crop.php: Fixes #3888 correcting initialization
+ of avatar cropping library
+
+ * engine/lib/elgglib.php, views/default/forms/avatar/crop.php: Fixes #3913
+ registering jquery.imgareaselect
+
+ * actions/avatar/upload.php: Fixes #3912 checking that the upload succeeded
+ before resizing
+
+ * languages/en.php: more was defined twice in the core language file
+
+2011-10-01 cash <cash.costello@gmail.com>
+
+ * mod/embed/README.txt, mod/embed/views/default/js/embed/embed.php: Updated
+ the instructions
+
+ * mod/embed/views/default/js/embed/embed.php,
+ mod/file/views/default/embed/file/content.php,
+ .../views/default/embed/file_upload/content.php: fixed the forwarding of an
+ embed upload form
+
+ * mod/embed/start.php, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/item.php,
+ mod/embed/views/default/js/embed/embed.php: cleaned up the embed item view
+ and removed the inline js
+
+ * mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item.php,
+ mod/embed/views/default/embed/list.php,
+ mod/embed/views/default/embed/tabs.php,
+ mod/embed/views/default/group/default/embed.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/embed/views/default/object/default/embed.php,
+ mod/embed/views/default/object/file/embed.php,
+ mod/embed/views/default/object/file/embedlist.php,
+ mod/embed/views/default/site/default/embed.php,
+ mod/embed/views/default/user/default/embed.php: removed unnecessary code
+
+ * mod/embed/languages/en.php, mod/embed/start.php,
+ mod/embed/views/default/embed/item.php,
+ mod/embed/views/default/embed/layout.php,
+ mod/embed/views/default/embed/list.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/embed/views/default/navigation/menu/embed.php, mod/file/start.php: using
+ the menu system for the embed tabs and adding a reusable select list view
+
+ * engine/lib/configuration.php: Fixes #3826 using wwwroot in 1.8.x releases
+
+2011-09-30 cash <cash.costello@gmail.com>
+
+ * views/default/forms/useradd.php: Fixes #3890 removed admin check in
+ useradd form since it is only used by admins
+
+ * engine/lib/navigation.php, mod/groups/start.php,
+ mod/likes/views/default/annotation/likes.php, mod/messageboard/start.php,
+ mod/messages/views/default/object/messages.php,
+ views/default/core/friends/collection.php,
+ views/default/output/confirmlink.php: Fixes #3904 action word should come
+ first for encode_text parameter
+
+2011-09-29 cash <cash.costello@gmail.com>
+
+ * views/default/css/elements/forms.php: Fixes #3894 ui-datepicker should
+ start out hidden
+
+ * views/default/css/elements/forms.php: Fixes #3666, #3748 distinct CSS for
+ inline vs popup date picker and fixed position bug for prev/next links in
+ header
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/metadata.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php, engine/lib/relationships.php: Fixes #3827
+ updated documentation on @return for elgg_get_entities* functions
+
+2011-09-28 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/elgglib.php, engine/lib/views.php,
+ engine/tests/api/helpers.php: Fixes #3891. elgg_register_external_file()
+ defaults priority to 500. Elgg's default CSS now at 500 instead of 1.
+
+ * .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/profile/views/default/profile/owner_block.php,
+ views/default/core/avatar/upload.php, views/default/forms/avatar/crop.php,
+ views/default/icon/user/default.php: Fixes #3879. Removed some instances of
+ deprecated views / functions.
+
+ * mod/file/pages/file/search.php: Fixes #3823. More carefully casting to int
+ for file's search.
+
+ * engine/tests/api/plugins.php: Refs #3808. Removed failing tests for
+ manifest translations.
+
+ * engine/lib/entities.php, engine/lib/metastrings.php, engine/lib/river.php,
+ engine/lib/tags.php, engine/tests/api/entity_getter_functions.php: Fixes
+ #3713. elgg_get_entities() and friends return false if passed invalid
+ options.
+
+2011-09-26 cash <cash.costello@gmail.com>
+
+ * engine/lib/output.php, views/default/input/checkboxes.php,
+ views/default/input/date.php, views/default/input/dropdown.php,
+ views/default/input/radio.php, views/default/input/userpicker.php: Fixes
+ #2921 clearing new ignore internal variables
+
+2011-09-25 cash <cash.costello@gmail.com>
+
+ * engine/lib/navigation.php, views/default/navigation/menu/site.php: Fixes
+ #3876 fixed dangling more site menu when items are manually selected - thanks
+ to JEBailey
+
+ * ...0.1-forum_reply_river_view-5758ce8d86ac56ce.php, version.php: Fixes
+ #3877 updates river db table for replying to forum topics
+
+ * languages/en.php, views/default/river/user/default/profileupdate.php: Refs
+ #3842 adding river view back so that those upgrading from earlier Elgg views
+ don't have empty river messages
+
+2011-09-24 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/admin.php, views/default/css/elements/icons.php,
+ views/default/css/ie.php, views/default/css/ie7.php: Fixes #3653 shrink
+ wrapping .elgg-avatar so that hover menu arrow is constrained to the avatar
+ image
+
+ * engine/lib/views.php, mod/embed/views/default/embed/css.php,
+ views/default/css/elements/core.php,
+ views/default/css/elements/navigation.php, views/default/css/ie.php,
+ views/default/css/ie6.php, views/default/css/ie7.php,
+ views/default/page/elements/head.php: Fixes #3845 added ie7 css view and
+ tested all current hacks for ie7
+
+2011-09-24 cash <cash.costello@gmail.com>
+
+ * mod/file/languages/en.php: Fixes #3858 added file notification string
+ translation - thanks to slyhne
+
+ * .../views/default/forms/logbrowser/refine.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/reportedcontent/admin_css.php, views/default/css/admin.php,
+ views/default/forms/admin/plugins/change_state.php,
+ views/default/forms/admin/plugins/filter.php,
+ views/default/forms/admin/plugins/sort.php: Fixes #3809 updated admin buttons
+ css
+
+ * engine/lib/deprecated-1.8.php, engine/lib/river.php, engine/lib/views.php,
+ mod/likes/views/default/likes/count.php,
+ mod/likes/views/default/likes/css.php, mod/likes/views/default/likes/js.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ views/default/css/elements/components.php: Fixes #3828 correct list classes
+
+ * .../admin/administer_utilities/logbrowser.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/logbrowser/refine.php: Fixes #3865 updated
+ logbrowser refine form
+
+ * views/default/css/admin.php: Fixes #3788 pagination highlighting updated
+ for admin theme
+
+ * views/default/admin/appearance/profile_fields.php,
+ views/default/forms/profile/fields/add.php,
+ views/default/forms/profile/fields/reset.php: Refs #3864 updated the two form
+ bodies for edit profile fields
+
+ * views/default/forms/account/settings.php, views/default/forms/login.php,
+ views/default/forms/plugins/settings/save.php,
+ views/default/forms/plugins/usersettings/save.php,
+ views/default/forms/register.php, views/default/forms/usersettings/save.php:
+ Fixes #3856 adds elgg-foot to forms missing it in /views/default/forms and
+ updated documentation
+
+2011-09-23 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/handlers/cache_handler.php: Refs #3859. Using PHP internal
+ functions to expire cache in +6 months instead of doing math manually to
+ avoid int overflow.
+
+2011-09-22 cash <cash.costello@gmail.com>
+
+ * mod/embed/views/default/embed/css.php,
+ mod/file/views/default/embed/file/content.php: Fixes #3795 not inserting the
+ file title when embeding a file and tweaked css - thanks to slyhne
+
+ * engine/classes/ElggPluginManifest.php, languages/en.php,
+ views/default/admin/plugins.php: Fixes #3808 not translating manifest fields
+ through elgg_echo()
+
+2011-09-22 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/upgrade.php: Fixes #3834 not loading version.php hundreds of
+ times - thanks to srokap
+
+2011-09-21 cash <cash.costello@gmail.com>
+
+ * js/lib/ui.js, views/default/css/elements/navigation.php,
+ views/default/css/ie.php, views/default/navigation/menu/site.php: Fixes #3770
+ CSS only site menu that works in IE7
+
+2011-09-19 Steve Clay <steve@mrclay.org>
+
+ * engine/lib/elgglib.php, engine/lib/group.php, engine/lib/sessions.php,
+ languages/en.php: forward throws Exception if headers sent. fix for
+ http://trac.elgg.org/ticket/3765
+
+ * engine/lib/views.php: don't generate false internalid deprecation notices:
+ http://trac.elgg.org/ticket/2921#comment:3
+
+2011-09-18 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggMenuItem.php: Fixes #3786 menu code was corrupting link
+ class if an additional class was passed through getContent()
+
+ * mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/admin/develop_tools/inspect.php,
+ .../views/default/admin/develop_tools/preview.php,
+ .../views/default/admin/developers/inspect.php,
+ .../views/default/admin/developers/preview.php: Fixes #3721 reorganized the
+ developer tools menu items in the admin area
+
+ * .../views/default/js/developers/developers.php: Fixes #3825 need to
+ specify the data type as json
+
+2011-09-17 cash <cash.costello@gmail.com>
+
+ * languages/en.php: Fixes #3819 added the request action words to the
+ language file
+
+ * mod/logrotate/languages/en.php, mod/logrotate/start.php,
+ .../views/default/plugins/logrotate/settings.php,
+ .../default/plugins/twitter_api/usersettings.php: Fixes #3824 fixed
+ deprecation warnings for plugin settings and usersettings
+
+ * views/default/object/plugin/advanced.php: Refs #3236 using .float-alt for
+ plugin activate button
+
+ * .../default/plugins/garbagecollector/settings.php,
+ .../default/settings/garbagecollector/edit.php,
+ .../views/default/plugins/groups/settings.php,
+ mod/groups/views/default/settings/groups/edit.php,
+ .../views/default/plugins/logrotate/settings.php,
+ .../views/default/settings/logrotate/edit.php,
+ .../views/default/plugins/twitter_api/settings.php,
+ .../default/plugins/twitter_api/usersettings.php,
+ .../views/default/settings/twitter_api/edit.php,
+ .../default/usersettings/twitter_api/edit.php: Fixes #2990 updated the
+ bundled plugins to use the new plugin/user settings structure
+
+2011-09-17 Cash Costello <cash.costello@gmail.com>
+
+ * .../views/default/settings/twitter_api/edit.php,
+ views/default/css/admin.php, views/default/object/plugin/advanced.php,
+ .../object/plugin/elements/dependencies.php,
+ views/default/object/plugin/invalid.php,
+ views/default/object/plugin/simple.php, views/default/page/admin.php: Fixes
+ #3236 finishes admin theme - open new tickets for new issues
+
+2011-09-15 cash <cash.costello@gmail.com>
+
+ * engine/lib/views.php: Fixes #3178 updated elgg_view_icon() to take an
+ optional class
+
+ * _graphics/elgg_sprites.png, mod/search/views/default/search/css.php,
+ views/default/css/elements/icons.php: Fixes #3400, #3820 added additional
+ icons to Elgg's sprite
+
+2011-09-15 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/lightbox.php: Fixes #3818 fixed short tag and extra
+ slash in URL for lightbox
+
+2011-09-14 Cash Costello <cash.costello@gmail.com>
+
+ * .../notifications/subscriptions/forminternals.php,
+ views/default/icon/user/default.php, views/default/input/friendspicker.php:
+ Fixes #3742 not including the hover menu on the personal notifications page
+
+ * engine/lib/navigation.php, languages/en.php,
+ mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ .../admin/develop_utilities/diagnostics.php,
+ .../views/default/admin/utilities/diagnostics.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ .../admin/administer_utilities/logbrowser.php,
+ .../views/default/admin/utilities/logbrowser.php,
+ mod/reportedcontent/languages/en.php, mod/reportedcontent/start.php,
+ .../admin/administer_utilities/reportedcontent.php,
+ .../default/admin/utilities/reportedcontent.php: Fixes #3681 fixed Utilities
+ menu collisions in admin section and added documentation about registering
+ more than one menu item with the same name to a menu
+
+ * views/default/forms/admin/site/update_advanced.php: Fixes #3783 using an
+ associative array for advanced settings checkboxes
+
+2011-09-13 Cash Costello <cash.costello@gmail.com>
+
+ * js/lib/elgglib.js, js/lib/languages.js, views/default/js/elgg.php: Fixes
+ #3539 two conditions for triggering init,system now - dom is ready and
+ languages loaded
+
+ * views/default/output/confirmlink.php: Fixes #3811 defaulting title to
+ confirm text if passed to output/confirmlink
+
+ * languages/en.php, views/default/admin/plugins.php: Fixes #3623 added
+ non-bundled filter option for plugins
+
+ * .../default/widgets/a_users_groups/content.php: Fixes #3803 fixed groups
+ more link in widget
+
+2011-09-12 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/admin.php, views/default/js/admin.php: Refs #3800 including
+ jeditable on more admin pages
+
+ * engine/lib/deprecated-1.8.php: Fixes #3801 fixed documentation for
+ page_owner_entity()
+
+ * mod/externalpages/manifest.xml: Fixes #3804 using Site Pages for the
+ plugin name
+
+2011-09-12 Brett Profitt <brett.profitt@gmail.com>
+
+ * .gitignore: Refs #3573. Using more specific rules in .gitignore.
+
+ * mod/embed/manifest.xml: Refs #3771. Fixed incorrect requires plugin name.
+
+2011-09-11 Brett Profitt <brett.profitt@gmail.com>
+
+ * .gitignore: Fixse #3573. Ignoring all files in /mod/ that aren't part of
+ core.
+
+ * mod/embed/manifest.xml, mod/file/views/default/embed/file/content.php,
+ .../views/default/embed/file_upload/content.php: Fixes #3771. Added missing
+ files for embed support. Added requirement for file in embed's manifest.
+
+2011-09-11 Cash Costello <cash.costello@gmail.com>
+
+ * mod/dashboard/languages/en.php, mod/dashboard/start.php,
+ .../default/widgets/group_activity/content.php,
+ .../views/default/widgets/group_activity/edit.php: Fixes #3340 adds group
+ activity widget for the user dashboard
+
+2011-09-11 Ravindra Nath Kakarla <ravindhranath@gmail.com>
+
+ * engine/lib/input.php: Livesearch handler returns proper JSON string now
+
+2011-09-11 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/users.php: Fixes #3794 fixes menu links so that admins can edit
+ avatars
+
+2011-09-10 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggMenuItem.php: Fixes #3741 fixed menu code so that all
+ links do not get empty title and confirm attributes
+
+ * engine/lib/views.php: Fixes #3665, #3660 added plugin hooks for page and
+ layouts so that rss icon for page meta menu can be registered consistently
+
+ * engine/lib/views.php: Fixes #3688 setting the page setup variable in
+ $CONFIG before trigger the event to prevent a stack overflow
+
+ * actions/admin/plugins/activate.php: Fixes #3714 also forwarding to the top
+ of the page when a plugin activation fails
+
+ * mod/groups/actions/groups/membership/join.php: Fixes #3752 corrected URL
+ for group membership requests
+
+ * engine/lib/plugins.php: made the documentation of the plugin settings code
+ a little clearer
+
+ * engine/classes/ElggEntity.php: Fixes #3782 only deleting metadata if the
+ entity has been saved
+
+ * mod/logbrowser/start.php,
+ mod/logbrowser/views/default/logbrowser/form.php: Fixes #3775 updated admin
+ area for logbrowser to utilities
+
+2011-09-05 Brett Profitt <brett.profitt@gmail.com>
+
+ * CHANGES.txt, engine/lib/access.php, version.php: Fixed a stupid problem I
+ introduced in the installation and only just caught >:O
+
+ * version.php: Version bump to 1.8.0. *whew*
+
+ * README.txt: Updated README to mention the Elgg Foundation.
+
+ * js/lib/ui.js, views/default/css/ie.php: Refs #3449, #3770. Using JS to fix
+ submenu dropdown in IE7.
+
+ * engine/lib/deprecated-1.8.php: Improved documentation for deprecated
+ functions.
+
+ * UPGRADE.txt: Added instructions to delete deprecated plugins during
+ upgrade.
+
+ * CHANGES.txt: Updated changes for 1.8.0.
+
+ * CONTRIBUTORS.txt: Updated contributors file with @elgg.org email
+ addresses.
+
+ * UPGRADE.txt: Added more explicit upgrade instructions for 1.7 -> 1.8.
+
+ * views/default/css/ie.php: Refs #3449. Some IE7 CSS fixes. I need to shower
+ now.
+
+2011-09-04 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/entities.php: Fixes #3661. Pulled in recursive delete fixes to
+ master.
+
+ * engine/classes/ElggEntity.php: Refs #3661. Merged lat/long metadata fixes
+ to master.
+
+ * engine/lib/entities.php, mod/search/search_hooks.php: Refs #3661. Merged
+ XSS fixes in search to master.
+
+ * mod/pages/pages/pages/edit.php: Refs #3661. Better filtering for
+ container_guid in pages.
+
+ * mod/file/pages/file/search.php: Refs #3661. Pulled in XSS fixes for file
+ search.
+
+ * mod/groups/lib/groups.php: Fixes #3720. Using correctly filters for tabs
+ on group landing page.
+
+ * engine/start.php: Refs #3661. Merged $CONFIG->lastcache fix to master.
+ Fixes #3530. $CONFIG->lastcache has correct value on page load when cache is
+ regenerated. Conflicts: engine/start.php
+
+2011-09-03 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/access.php: Fixed typo in call to function.
+
+2011-08-30 Brett Profitt <brett.profitt@gmail.com>
+
+ * actions/friends/collections/add.php,
+ actions/friends/collections/delete.php, actions/friends/collections/edit.php,
+ engine/lib/access.php, engine/tests/api/access_collections.php,
+ languages/en.php: Fixes #3543. Ported access collections fix to master.
+
+2011-08-29 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/views.php, views/default/css/lightbox.php: Fixes #3461: Using
+ absolute URLs for lightbox CSS.
+
+ * mod/embed/views/default/js/embed/embed.php: Removing debug string.
+
+2011-08-27 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/profile/views/default/profile/js.php: Fixes #3561. Only adding the
+ static profile block height to the widget canvas if on the profile page.
+
+ * mod/embed/languages/en.php, mod/embed/start.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/gallery.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/embed/views/default/js/embed/inline.php, mod/file/start.php: Fixes #2911.
+ Embed plugins works again. Added menu for embed sections. This plugin is
+ painfully messy.
+
+ * engine/classes/ElggPluginPackage.php, engine/lib/plugins.php,
+ languages/en.php, views/default/admin/plugins.php: Fixes #3434. Manifests are
+ checked more carefully on anything that checks deps. Disabling plugins with
+ invalid manifests from admin page.
+
+2011-08-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/views.php: Fixes #3535. elgg_view_form() automatically adds
+ elgg-form-action-name.
+
+ * mod/likes/start.php: Removed unused code for likes notification.
+
+ * mod/likes/actions/likes/add.php, mod/likes/languages/en.php,
+ mod/likes/start.php: Fixes #3131. Added generic liking notification text.
+
+ * mod/blog/start.php: Fixes #3558. Added upgrade for excerpt in blogs.
+
+ * mod/blog/start.php: Removed silly check for elgg version.
+
+ * mod/blog/start.php: Fixing blog upgrades for excerpt.
+
+ * CODING.txt: Fixes #3657. There's not a good way to ensure redirects for
+ CODING.txt because most of the code is off our servers now, so just putting a
+ placeholder.
+
+ * views/default/page/elements/head.php,
+ views/default/page/elements/shortcut_icon.php: Fixes #3662. Pulled out
+ shortcut_icon to its own view for easier overriding.
+
+2011-08-24 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/classes/ElggPriorityList.php: Checking for === false when moving
+ elements in ElggPriorityList instead of just !$priority. Fixes problems when
+ moving elements to / from 0.
+
+ * .../forms/uservalidationbyemail/bulk_action.php: Fixes #3621. Corrected
+ the URL for the unvalidated users pagination.
+
+ * mod/groups/actions/discussion/reply/save.php, mod/groups/start.php,
+ .../views/default/annotation/group_topic_post.php,
+ .../views/default/forms/discussion/reply/save.php,
+ .../views/default/annotation/messageboard.php: Fixes #3612, #3750. Added edit
+ replies back to group plugin with the annotation menu.
+
+ * mod/messageboard/start.php: Refs #3750. Messageboard using annotations
+ menu.
+
+ * engine/lib/navigation.php, views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php,
+ views/default/css/elements/navigation.php: Refs #3750. Added annotation menu
+ for generic comments (delete) and default annotations (empty).
+
+ * js/lib/hooks.js: Fixes #3589. JS "all" hook handlers called only once.
+
+ * actions/avatar/upload.php: Refs #3557: Upscaling small icons to 200x200.
+ This doesn't fix the problem if someone uploads a 100x200 image.
+
+ * mod/categories/actions/save.php, mod/categories/activate.php,
+ mod/categories/languages/en.php, mod/categories/start.php,
+ mod/categories/views/default/input/categories.php,
+ .../views/default/plugins/categories/settings.php,
+ .../views/default/settings/categories/edit.php: Refs #3746. Updated
+ categories for 1.8. Still some deprecation notices, but functional.
+
+2011-08-23 Brett Profitt <brett.profitt@gmail.com>
+
+ * .../actions/twitter_api/interstitial_settings.php,
+ mod/twitter_api/languages/en.php, mod/twitter_api/lib/twitter_api.php,
+ mod/twitter_api/pages/twitter_api/interstitial.php,
+ mod/twitter_api/start.php, .../forms/twitter_api/interstitial_settings.php,
+ .../default/usersettings/twitter_api/edit.php: Fixes #3117. Added an
+ interstitial page for twitter new users.
+
+ * views/default/navigation/menu/default.php: Rewriting more chars to - in
+ the default menu view.
+
+ * engine/classes/ElggPriorityList.php, engine/lib/elgglib.php,
+ engine/lib/views.php, engine/tests/api/helpers.php: Fixes #3355. Added
+ ElggPriorityList. Adapted the externals system to use it.
+
+2011-08-22 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/views.php, vendors/jquery/jquery-1.6.2.min.js,
+ vendors/jquery/jquery-ui-1.8.16.min.js, views/installation/page/default.php:
+ Closes #3015. jQuery updated to 1.6.2. jQuery-UI updated to 1.8.16.
+
+2011-08-21 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/groups/lib/groups.php: Fixes #3701. Removed early call to elgg_echo()
+ for group action button menu.
+
+ * engine/classes/ElggSite.php: Fixes #3606. Reset password page added to
+ public pages for walled garden mode.
+
+ * engine/lib/river.php: Fixes #3496. Using OR to concatenate unpaired type
+ and subtype clauses in elgg_get_river_type_subtype_where_sql().
+
+2011-08-18 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/views.php: Fixing priorities for jquery.
+
+2011-08-17 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/classes/ElggPriorityList.php, engine/lib/elgglib.php,
+ engine/tests/api/helpers.php: Finished ElggPriorityList. Migrated external
+ files to use it.
+
+2011-08-17 tvld <tom@lorinthe.com>
+
+ * htaccess_dist: My very first attempt to contribute...
+ http://trac.elgg.org/ticket/3601 For optimal speed, Firebug's Yslow
+ complained that the js and ico files did not have an Etag.
+
+2011-08-15 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/classes/ElggPriorityList.php, engine/tests/api/helpers.php: Refs
+ #3355. Added ElggPriorityList.
+
+ * pages/friends/collections/add.php,
+ pages/friends/collections/pickercallback.php,
+ pages/friends/collections/view.php, pages/friends/index.php,
+ pages/friends/of.php: Fixes #3715. Added the new collection button back.
+
+ * mod/search/views/default/search/list.php: Fixed pagination for search.
+
+ * mod/search/views/default/search/list.php: Fixes #3254. Removing limit for
+ "+X more Y" in search results.
+
+2011-07-27 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/classes/ElggBatch.php: Fixed some documentation.
+
+2011-07-27 Richard Loxley <richard.loxley@surevine.com>
+
+ * engine/lib/actions.php: Fixes Ticket #3709 "Embed plugin: uploading a file
+ in Firefox tries to save a JSON file in the user's browser"
+
+2011-07-10 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/views.php: Fixes #3336 functions that used elgg_view_exists()
+ were not falling back to the default views
+
+2011-07-09 cash <cash.costello@gmail.com>
+
+ * mod/file/pages/file/search.php: Refs #3685 need null for no container
+
+ * engine/lib/users.php, pages/avatar/view.php: fixed redirect for user
+ avatars if we cannot get the user
+
+2011-07-07 Brett Profitt <brett.profitt@gmail.com>
+
+ * mod/dashboard/start.php,
+ views/default/admin/appearance/default_widgets.php: Fixes #3669. Dashboard
+ now registers for default widgets.
+
+ * version.php: Version bump to 1.8.0b2
+
+2011-07-07 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/elements/components.php,
+ views/default/river/elements/body.php,
+ views/default/river/relationship/friend/create.php: fixed the float issue
+ with the friends river view
+
+ * views/default/icon/user/default.php: Refs #3567 added class extending to
+ icon/user/default
+
+2011-07-06 cash <cash.costello@gmail.com>
+
+ * views/default/input/radio.php: Refs #3624 fixed radio button value
+ detection
+
+2011-07-06 Cash Costello <cash.costello@gmail.com>
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ engine/classes/ElggPlugin.php: Fixes #2204 standardized the hooks/overrides
+ for plugin settings and usersettings
+
+ * engine/lib/river.php: $joins was not declared in elgg_get_river()
+
+ * vendors/jquery/jquery.imgareaselect-0.8.min.js,
+ .../jquery.imgareaselect-0.9.8/GPL-LICENSE.txt,
+ .../jquery.imgareaselect-0.9.8/MIT-LICENSE.txt, .../css/border-anim-h.gif,
+ .../css/border-anim-v.gif, .../jquery.imgareaselect-0.9.8/css/border-h.gif,
+ .../jquery.imgareaselect-0.9.8/css/border-v.gif,
+ .../css/imgareaselect-animated.css, .../css/imgareaselect-default.css,
+ .../css/imgareaselect-deprecated.css, .../scripts/jquery.imgareaselect.js,
+ .../scripts/jquery.imgareaselect.min.js,
+ .../scripts/jquery.imgareaselect.pack.js, .../scripts/jquery.min.js,
+ views/default/forms/avatar/crop.php: Fixes #3663 upgrades imgareaselect
+ library
+
+ * mod/likes/actions/likes/add.php,
+ .../default/river/annotation/likes/create.php: Fixes #3642 removing likes
+ river code
+
+ * engine/lib/navigation.php, mod/blog/lib/blog.php,
+ mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/friends.php,
+ mod/bookmarks/pages/bookmarks/owner.php, mod/file/pages/file/friends.php,
+ mod/file/pages/file/owner.php, mod/file/pages/file/world.php,
+ mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ mod/messages/pages/messages/inbox.php, mod/messages/pages/messages/sent.php,
+ mod/pages/pages/pages/friends.php, mod/pages/pages/pages/owner.php,
+ mod/pages/pages/pages/world.php: changed new convenience function from
+ elgg_register_add_button() to elgg_register_title_button()
+
+ * mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/js/embed/embed.php: updated the embed plugin for new
+ css class elgg-item rather than elgg-list-item
+
+2011-07-04 cash <cash.costello@gmail.com>
+
+ * views/default/css/elements/forms.php: styled the date picker for the main
+ theme
+
+ * views/default/css/admin.php: theming the date picker for the admin theme
+
+ * js/lib/ui.js, views/default/input/date.php, views/default/output/date.php:
+ Fixes #3560 input/date and output/date support ISO 8601 (YYYY-MM-DD) and Unix
+ timestamps. Need to think about how to handle alternate text formats.
+
+2011-07-03 Brett Profitt <brett.profitt@gmail.com>
+
+ * actions/friends/collections/add.php,
+ actions/friends/collections/delete.php, actions/friends/collections/edit.php,
+ engine/lib/access.php, engine/tests/api/access_collections.php,
+ languages/en.php: Merged ACL fixes from 1.7 branch.
+
+ * engine/lib/access.php, engine/tests/api/access_collections.php: Merged
+ d423aee393458d6827db from 1.7 to master. Fixes #3552. Addess ACL unit tests.
+ These currently fail because of #3522. Conflicts: engine/lib/access.php
+
+2011-07-03 cash <cash.costello@gmail.com>
+
+ * .../views/default/page/layouts/custom_index.php: removed deprecated
+ function from custom_index plugin
+
+ * views/default/page/elements/header_logo.php: reformatted the code in
+ page/elements/header_logo view due to line length
+
+ * .../views/default/page/layouts/custom_index.php: removed deprecated
+ function from custom_index plugin
+
+ * views/default/page/elements/header_logo.php: reformatted the code in
+ page/elements/header_logo view due to line length
+
+ * mod/blog/languages/en.php: Fixes #3593 defining the blog post notification
+ string
+
+ * languages/en.php: Fixes #3640 added 'none' as a language string
+
+ * engine/classes/ElggUser.php: Fixes #3650 deprecated
+ ElggUser::getCollections()
+
+ * documentation/coding_standards/best_practices.txt,
+ documentation/coding_standards/deprecation.txt: pulled deprecation guidelines
+ out of general best practices
+
+ * CODING.txt, documentation/coding_standards/best_practices.txt,
+ .../coding_standards/css_coding_standards.txt,
+ .../coding_standards/html_best_practices.txt,
+ .../coding_standards/javascript_best_practices.txt,
+ .../javascript_coding_standards.txt,
+ .../coding_standards/php_best_practices.txt,
+ .../coding_standards/php_coding_standards.txt: separate out coding standards
+
+2011-07-03 Cash Costello <cash.costello@gmail.com>
+
+ * engine/classes/ElggCache.php: Fixes #3656 updates the AccessArray
+ interface methods for ElggCache
+
+ * mod/notifications/start.php, mod/tinymce/start.php: these plugins should
+ not need special loading order
+
+ * views/default/css/admin.php: updated the admin theme for the new css
+ classes on input elements
+
+2011-07-02 cash <cash.costello@gmail.com>
+
+ * mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/admin/developers/settings.php: added logging of events and
+ plugin hooks
+
+ * mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/admin/developers/settings.php: Fixes #3152 adds wrapping of
+ views with comments
+
+ * mod/developers/classes/ElggLogCache.php: returning false to stop
+ elgg_dump() from also displaying the debugging information to the screen
+
+ * mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/admin/developers/settings.php: Fixes #3500 added setting
+ for raw string display
+
+ * mod/developers/views/default/developers/log.php: removed warning if no
+ messages in the cache
+
+ * engine/classes/ElggPlugin.php,
+ mod/developers/actions/developers/settings.php,
+ mod/developers/classes/ElggLogCache.php, mod/developers/languages/en.php,
+ mod/developers/start.php, .../views/default/admin/developers/settings.php,
+ mod/developers/views/default/developers/css.php,
+ mod/developers/views/default/developers/log.php: added logging to the web
+ page footer
+
+ * mod/developers/actions/developers/inspect.php,
+ mod/developers/classes/ElggInspector.php, mod/developers/languages/en.php,
+ mod/developers/start.php, mod/developers/vendors/jsTree/jquery.jstree.js,
+ mod/developers/vendors/jsTree/themes/apple/bg.jpg,
+ mod/developers/vendors/jsTree/themes/apple/d.png,
+ .../vendors/jsTree/themes/apple/dot_for_ie.gif,
+ .../vendors/jsTree/themes/apple/style.css,
+ .../vendors/jsTree/themes/apple/throbber.gif,
+ mod/developers/vendors/jsTree/themes/classic/d.gif,
+ mod/developers/vendors/jsTree/themes/classic/d.png,
+ .../vendors/jsTree/themes/classic/dot_for_ie.gif,
+ .../vendors/jsTree/themes/classic/style.css,
+ .../vendors/jsTree/themes/classic/throbber.gif,
+ .../vendors/jsTree/themes/default-rtl/d.gif,
+ .../vendors/jsTree/themes/default-rtl/d.png,
+ .../vendors/jsTree/themes/default-rtl/dots.gif,
+ .../vendors/jsTree/themes/default-rtl/style.css,
+ .../vendors/jsTree/themes/default-rtl/throbber.gif,
+ mod/developers/vendors/jsTree/themes/default/d.gif,
+ mod/developers/vendors/jsTree/themes/default/d.png,
+ .../vendors/jsTree/themes/default/style.css,
+ .../vendors/jsTree/themes/default/throbber.gif,
+ .../views/default/admin/developers/inspect.php,
+ mod/developers/views/default/developers/css.php,
+ mod/developers/views/default/developers/tree.php,
+ .../views/default/forms/developers/inspect.php,
+ .../views/default/js/developers/developers.php: added the inspect tool to
+ developers tool plugin
+
+ * engine/lib/river.php, pages/river.php: fixed river for #3544
+
+ * mod/embed/start.php, mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/upload/content.php: fixed embed plugin for
+ #3544
+
+ * mod/file/pages/file/search.php, mod/messages/pages/messages/send.php:
+ fixed messages and file plugins for #3544
+
+ * engine/lib/input.php: added note about preventing reflected XSS
+ vulnerabilities.
+
+2011-07-02 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/input/access.php, views/default/input/autocomplete.php,
+ views/default/input/button.php, views/default/input/calendar.php,
+ views/default/input/captcha.php, views/default/input/checkbox.php,
+ views/default/input/checkboxes.php, views/default/input/date.php,
+ views/default/input/dropdown.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/location.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/plaintext.php, views/default/input/radio.php,
+ views/default/input/tag.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Fixes #3624 input
+ views use class extending rather than overriding
+
+ * mod/blog/views/default/forms/blog/save.php: fixed the blog categories code
+ as the entity was not being passed
+
+2011-07-01 Cash Costello <cash.costello@gmail.com>
+
+ * mod/bookmarks/pages/bookmarks/bookmarklet.php: removed the add bookmark
+ button from get bookmarklet page
+
+2011-06-30 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/elgglib.php: Adds exception handling to shutdown hook from pull
+ request 50
+
+ * engine/lib/views.php, vendors/jquery/jquery-1.5.min.js,
+ vendors/jquery/jquery-1.6.1.min.js, vendors/jquery/jquery-ui-1.8.14.min.js,
+ vendors/jquery/jquery-ui-1.8.9.min.js: Refs #3015 updated jquery and
+ jquery-ui to their latest releases
+
+ * languages/en.php, views/default/object/plugin/advanced.php: Fixes #3635
+ added strings for activate and deactivate
+
+ * languages/en.php: Fixes #3636 added general language strings for sort and
+ filter
+
+2011-06-29 cash <cash.costello@gmail.com>
+
+ * .../views/default/groups/profile/widgets.php: made group widget columns
+ backward compatible so that content at least does not disappear
+
+ * engine/classes/ElggMenuItem.php: handling spaces and uppercase characters
+ when creating menu item classes
+
+ * engine/lib/views.php, views/default/page/elements/wrapper.php: added
+ backward compatibility for the view page_elements/content_wrapper
+
+ * engine/lib/group.php: added @since dates on two functions in group library
+
+2011-06-29 Cash Costello <cash.costello@gmail.com>
+
+ * mod/tinymce/views/default/js/tinymce.php,
+ mod/tinymce/views/default/tinymce/css.php: Fixes #3537 using elgg.echo() for
+ i18n of word count
+
+ * mod/tinymce/css/elgg_tinymce.css, mod/tinymce/tinymce_content.css,
+ mod/tinymce/views/default/js/tinymce.php: moved tinymce content css into its
+ own directory
+
+ * views/default/css/admin.php, views/default/css/elements/modules.php: Fixes
+ #3629 added overflow hidden to .elgg-module for both default and admin themes
+
+ * mod/thewire/pages/thewire/everyone.php,
+ mod/thewire/pages/thewire/friends.php, mod/thewire/pages/thewire/owner.php,
+ mod/thewire/pages/thewire/reply.php: Fixes #3578 added a css class to thewire
+ add form
+
+ * actions/admin/plugins/activate.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/set_priority.php,
+ views/default/object/plugin/advanced.php: Fixes #3630 using the plugin id for
+ the css id
+
+2011-06-28 Cash Costello <cash.costello@gmail.com>
+
+ * mod/thewire/views/default/forms/thewire/add.php: Fixes #3579 using
+ input/plaintext in the wire form
+
+ * views/default/css/admin.php, views/default/page/layouts/admin.php: Fixes
+ #3519 admin area now has title buttons
+
+ * engine/lib/views.php, views/default/page/layouts/content/header.php: using
+ elgg_view_title() in content layout header
+
+ * languages/en.php, views/default/widgets/content_stats/content.php: Fixes
+ #3597 defined a language string for 'more'
+
+ * languages/en.php: Fixes #3505 define language string for
+ menu:page:header:default
+
+ * .../views/default/forms/bookmarks/save.php,
+ .../views/default/forms/developers/settings.php,
+ .../views/default/forms/expages/edit.php,
+ mod/file/views/default/forms/file/upload.php,
+ .../views/default/forms/discussion/reply/save.php,
+ mod/groups/views/default/forms/discussion/save.php,
+ .../views/default/forms/invitefriends/invite.php,
+ .../views/default/forms/messages/process.php,
+ .../views/default/forms/messages/reply.php,
+ mod/messages/views/default/forms/messages/send.php,
+ .../forms/notificationsettings/groupsave.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/reportedcontent/add.php,
+ mod/thewire/views/default/forms/thewire/add.php: Fixes #3407 added elgg-foot
+ to plugin forms
+
+ * views/default/navigation/menu/elements/item.php: updated the menu item
+ view to work with the new setLinkClass/addLinkClass methods
+
+2011-06-27 Cash Costello <cash.costello@gmail.com>
+
+ * mod/blog/lib/blog.php, mod/blog/views/default/forms/blog/save.php,
+ mod/groups/lib/groups.php, mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/edit.php,
+ .../default/forms/notificationsettings/save.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ views/default/core/settings/account.php,
+ views/default/css/elements/forms.php, views/default/forms/avatar/crop.php,
+ views/default/forms/avatar/upload.php, views/default/forms/comments/add.php,
+ views/default/forms/friends/collections/add.php,
+ views/default/forms/plugins/settings/save.php,
+ views/default/forms/profile/edit.php,
+ views/default/forms/user/requestnewpassword.php,
+ views/default/forms/useradd.php, views/default/forms/usersettings/save.php,
+ views/default/forms/widgets/save.php, views/default/input/form.php: Refs
+ #3407 using elgg-form and elgg-foot in core forms. Plugins next
+
+2011-06-26 cash <cash.costello@gmail.com>
+
+ * mod/bookmarks/pages/bookmarks/add.php,
+ mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/bookmarklet.php,
+ mod/bookmarks/pages/bookmarks/edit.php,
+ mod/bookmarks/pages/bookmarks/friends.php,
+ mod/bookmarks/pages/bookmarks/owner.php, mod/file/pages/file/edit.php,
+ mod/file/pages/file/friends.php, mod/file/pages/file/owner.php,
+ mod/file/pages/file/search.php, mod/file/pages/file/upload.php,
+ mod/file/pages/file/view.php, mod/file/pages/file/world.php,
+ mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ .../views/default/groups/profile/buttons.php,
+ mod/members/pages/members/index.php,
+ mod/messageboard/pages/messageboard/owner.php,
+ mod/messages/pages/messages/inbox.php, mod/messages/pages/messages/read.php,
+ mod/messages/pages/messages/send.php, mod/messages/pages/messages/sent.php,
+ mod/messages/views/default/messages/js.php, mod/pages/pages/pages/edit.php,
+ mod/pages/pages/pages/friends.php, mod/pages/pages/pages/history.php,
+ mod/pages/pages/pages/new.php, mod/pages/pages/pages/owner.php,
+ mod/pages/pages/pages/revision.php, mod/pages/pages/pages/view.php,
+ mod/pages/pages/pages/world.php, mod/thewire/pages/thewire/everyone.php,
+ mod/thewire/pages/thewire/friends.php, mod/thewire/pages/thewire/owner.php,
+ mod/thewire/pages/thewire/previous.php, mod/thewire/pages/thewire/reply.php,
+ mod/thewire/pages/thewire/tag.php, mod/thewire/pages/thewire/thread.php,
+ pages/river.php: this should update all the core pages and plugins using
+ 'buttons'
+
+ * engine/lib/navigation.php, mod/blog/lib/blog.php,
+ views/default/page/layouts/content.php,
+ views/default/page/layouts/content/header.php: removed buttons logic from
+ content header view, created convenience function rather than copying and
+ pasting, and updated the blog plugin
+
+ * engine/classes/ElggMenuItem.php, engine/lib/navigation.php,
+ mod/groups/start.php: added a data array to ElggMenuItem. Now by default
+ options end up being passed to output/url.
+
+ * mod/embed/images/close_button.gif, mod/embed/js/embed.js,
+ mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/js/embed/embed.php: updated based on Brett's comments
+ and removed old stuff related to facebox lightbox
+
+2011-06-26 Cash Costello <cash.costello@gmail.com>
+
+ * engine/lib/relationships.php: Fixes #3585 do not need to check parameters
+ because was registered for only one event
+
+ * engine/classes/ElggMenuItem.php, engine/lib/navigation.php, js/lib/ui.js,
+ mod/groups/start.php, mod/logbrowser/views/default/logbrowser/form.php,
+ mod/profile/views/default/profile/owner_block.php,
+ .../views/default/object/reported_content.php,
+ views/default/object/plugin/advanced.php,
+ views/default/object/plugin/invalid.php,
+ views/default/object/widget/elements/controls.php,
+ views/default/page/layouts/widgets/add_button.php: Fixes #3470 using
+ rel=toggle now
+
+ * mod/thewire/languages/en.php,
+ .../views/default/river/object/thewire/create.php: provided a way to get to
+ the wire from activity page
+
+ * mod/blog/languages/en.php, mod/blog/lib/blog.php,
+ mod/bookmarks/pages/bookmarks/all.php, mod/bookmarks/start.php,
+ mod/file/languages/en.php, mod/file/pages/file/friends.php,
+ mod/file/pages/file/owner.php: made breadcrumbs consistent in content plugins
+
+ * mod/groups/start.php: not displaying the reply button for discussion
+ topics in widgets
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/object/default.php, views/default/object/elements/summary.php:
+ Fixes #3368 combining $vars with parameters for object/elements/summary view
+
+ * .../views/default/settings/logrotate/edit.php: removed use of deprecated
+ internalname key in log rotation
+
+ * engine/classes/ElggEntity.php, mod/blog/lib/blog.php,
+ mod/bookmarks/pages/bookmarks/view.php, mod/file/pages/file/view.php,
+ mod/groups/lib/discussion.php, .../views/default/groups/sidebar/featured.php,
+ mod/messages/pages/messages/read.php, mod/pages/pages/pages/view.php,
+ mod/search/views/default/search/entity.php, pages/entities/index.php,
+ views/default/page/elements/owner_block.php,
+ views/json/entities/entity_list.php: Fixes #3614 updated use of
+ elgg_view_entity() throughout core
+
+ * mod/messageboard/pages/messageboard/owner.php: better way of sorting
+ messageboard annotations
+
+2011-06-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/deprecated-1.8.php: Don't say the db was upgradeded when it
+ wasn't.
+
+ * engine/lib/upgrade.php, engine/lib/upgrades/2011010101.php: Fixes #3554.
+ Pulled 1.7->1.8 upgrade bootstrapping into a separate function. Made the
+ plugin upgrade that forwards (2011010101) set itself in the processed
+ upgrades.
+
+2011-06-25 cash <cash.costello@gmail.com>
+
+ * views/default/css/elements/layout.php,
+ views/default/page/layouts/one_column.php: one_column layout was not showing
+ title and nav
+
+ * mod/messageboard/pages/messageboard/owner.php: fixed ordering of
+ messageboard posts
+
+2011-06-25 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/configuration.php: datalist_get() was incorrectly setting
+ escaped values in the cache.
+
+2011-06-25 cash <cash.costello@gmail.com>
+
+ * engine/lib/admin.php: fixed spacing in
+ elgg_admin_add_plugin_settings_menu()
+
+ * languages/en.php, .../river/user/default/profileiconupdate.php: actually
+ read Evan's comment on pull request #48 and fixed previous
+
+ * languages/en.php, .../river/user/default/profileiconupdate.php: updates
+ the avatar update river view and closes pull request #48
+
+ * views/default/river/elements/body.php,
+ views/default/river/elements/responses.php,
+ views/default/river/elements/summary.php: added documentation to new river
+ views and improved handling of responses
+
+ * engine/classes/ElggEntity.php: Fixes #3609 removed use of deprecated
+ trigger_plugin_hook()
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/js.php,
+ mod/groups/views/default/groups/profile/module.php,
+ .../views/default/groups/profile/widgets.php: Fixes #3395 using a fluid
+ gallery for the groups profile page
+
+ * js/lib/ui.js, mod/likes/start.php,
+ mod/likes/views/default/likes/count.php,
+ mod/likes/views/default/likes/js.php: Fixes #3610 $guid was not defined
+
+2011-06-25 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/css/elements/navigation.php: Fixes #3388 put vertical-align:
+ middle back on topbar icons
+
+ * mod/likes/start.php, mod/likes/views/default/likes/button.php,
+ mod/likes/views/default/likes/count.php,
+ mod/likes/views/default/likes/css.php, views/default/river/elements/body.php:
+ Fixes #3566 separate out likes button from likes count
+
+ * mod/likes/views/default/likes/button.php,
+ mod/likes/views/default/likes/display.php,
+ views/default/css/elements/core.php,
+ views/default/css/elements/navigation.php: Refs #3388 entity menu has better
+ vertical alignment
+
+2011-06-24 cash <cash.costello@gmail.com>
+
+ * mod/groups/lib/groups.php: fixed breadcrumb on groups members page
+
+ * .../views/default/forms/messageboard/add.php: added spacing between
+ messageboard textarea and submit button
+
+ * mod/messages/pages/messages/read.php: adding some spacing between the
+ messages and the reply form
+
+ * mod/blog/views/default/blog/group_module.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ .../default/groups/profile/activity_module.php,
+ mod/groups/views/default/groups/profile/module.php,
+ mod/pages/views/default/pages/group_module.php: Fixes #3139 DRYs up group
+ modules
+
+ * mod/custom_index/index.php, .../views/default/groups/sidebar/members.php,
+ views/default/css/elements/components.php: Fixes #3559 adds
+ .elgg-gallery-users
+
+ * engine/lib/entities.php, engine/lib/views.php, mod/custom_index/index.php,
+ mod/file/views/default/file/typecloud.php,
+ .../views/default/groups/sidebar/members.php,
+ views/default/widgets/friends/content.php: Refs #1253 using 'list_type'
+ string instead of boolean 'gallery' for entity listing
+
+ * engine/lib/views.php, mod/search/views/default/search/list.php,
+ views/default/css/admin.php, views/default/css/elements/components.php,
+ views/default/object/elements/summary.php,
+ views/default/page/components/gallery.php,
+ views/default/page/components/list.php: cleaned up the list/gallery css
+ classes to use standard class naming - minor modifications only
+
+ * .../graphics/sign-in-with-twitter-d.png,
+ .../graphics/sign-in-with-twitter-l.png, mod/twitter_api/lib/twitter_api.php,
+ .../views/default/twitter_api/login.php: Fixes #2958 cleaned up user login
+ for twitter
+
+ * mod/thewire/start.php: Fixes #3204 adds hook trigger so that wire sends
+ out status updates
+
+ * mod/twitter_api/lib/twitter_api.php, mod/twitter_api/start.php: fixed the
+ post to twitter capability - was not loading the twitter oauth class
+
+ * mod/twitter_api/lib/twitter_api.php,
+ .../default/usersettings/twitter_api/edit.php: fixes the authorization to
+ post so that it does not include login
+
+ * mod/twitter_api/start.php: twitter @anywhere was causing problems - pages
+ were not loading and js errors
+
+2011-06-20 benbro <ben.browitt@gmail.com>
+
+ * engine/lib/statistics.php, engine/lib/users.php: added find_active_users
+ hook
+
+2011-06-24 Cash Costello <cash.costello@gmail.com>
+
+ * .../river/object/groupforumtopic/create.php,
+ views/default/river/elements/body.php: fixed group forum discussion inline
+ replies for activity page
+
+2011-06-23 cash <cash.costello@gmail.com>
+
+ * mod/twitter_api/languages/en.php, mod/twitter_api/start.php,
+ .../views/default/settings/twitter_api/edit.php,
+ mod/twitter_api/views/default/twitter_api/css.php: cleaned up the twitter api
+ plugin settings so instructions are correct. Need to verify that login works.
+
+ * .../views/default/settings/twitter_api/edit.php: added instructions back
+ to twitter api plugin settings
+
+ * views/default/css/admin.php: added a css class so that we can limit the
+ width of text instruction areas in admin area
+
+2011-06-23 Cash Costello <cash.costello@gmail.com>
+
+ * mod/groups/actions/groups/membership/remove.php,
+ mod/groups/languages/en.php: Refs #1867 let group owner know what user they
+ just removed
+
+ * mod/dashboard/start.php, mod/dashboard/views/default/dashboard/blurb.php,
+ mod/dashboard/views/default/dashboard/css.php: Fixes #3599 spacing of
+ dashboard blurb fixed
+
+ * views/default/css/elgg.php: Fixes #3471 moved helpers to end of css/elgg
+
+ * mod/twitter/views/default/twitter/css.php: Fixes #3603 fixes display of
+ @username in twitter widget - thanks to ManUtopiK
+
+2011-06-22 cash <cash.costello@gmail.com>
+
+ * views/default/page/default.php: backward compatibility of the admin page
+ shell was broken when we reorganized the page view directory
+
+ * mod/thewire/languages/en.php, mod/thewire/views/default/thewire/reply.php:
+ added @username in the reply text for a wire post
+
+2011-06-22 Cash Costello <cash.costello@gmail.com>
+
+ * mod/members/pages/members/search.php: Fixes #3598 sanitizing the $name
+ variable
+
+2011-06-21 Franz Liedke <franz@develophp.org>
+
+ * engine/classes/ElggMenuItem.php: Add param description to PHPDoc comments
+ of setText() function.
+
+2011-06-20 cash <cash.costello@gmail.com>
+
+ * engine/lib/actions.php: removed debug code
+
+2011-06-20 Franz Liedke <franz@develophp.org>
+
+ * engine/classes/ElggMenuItem.php: Add setText() method to ElggMenuItem
+ class. Fixes #3546.
+
+ * engine/classes/ElggMenuItem.php: Add setHref() method to ElggMenuItem
+ class. Fixes #3486.
+
+2011-06-19 cash <cash.costello@gmail.com>
+
+ * mod/thewire/start.php: fixed the wire's previous ajax - the link class for
+ the menu was lost in the conversion from plain class to link_class
+
+ * languages/en.php: fixed typo in edit profile fields instructions
+
+ * mod/file/views/default/forms/file/upload.php: we "upload" new files and
+ "save" old ones
+
+ * mod/file/pages/file/view.php, mod/file/views/default/object/file.php:
+ moved the download button for files to the action menu (which probably needs
+ to be a menu)
+
+ * mod/embed/views/default/embed/upload/content.php,
+ mod/embed/views/default/js/embed/embed.php: File uploads working now. It is
+ hard coded to only work with file plugin.
+
+ * engine/lib/actions.php: added another way for an action to be detected as
+ an Ajax action: set the request variable X-Requested-With = XMLHttpRequest.
+ This is because files cannot be uploaded with XMLHttpRequest
+
+ * mod/file/actions/file/upload.php,
+ mod/file/views/default/file/embed_upload.php,
+ mod/file/views/default/forms/file/upload.php: removed the special ajax/embed
+ code from the file plugin
+
+ * views/default/css/elements/layout.php: need the system messages to be
+ above the lightbox overlay at 1000 z-index
+
+ * mod/file/views/default/forms/file/upload.php: need a default container for
+ files if form included from outside file plugin (like the embed plugin)
+
+2011-06-19 Cash Costello <cash.costello@gmail.com>
+
+ * views/default/widgets/friends/content.php: Fixes #3581 checks that the
+ owner of a friends widget is a user
+
+2011-06-18 cash <cash.costello@gmail.com>
+
+ * mod/embed/start.php: fixed issue with embedding a file in an embedded file
+
+ * mod/embed/start.php, mod/embed/views/default/embed/tabs.php,
+ mod/embed/views/default/js/embed/embed.php: added back tab switching
+
+ * mod/embed/views/default/embed/addcontentjs.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/js/embed/embed.php: rewrote pagination for embed file
+ listing
+
+ * mod/embed/start.php, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/js/embed/embed.php,
+ mod/embed/views/default/js/embed/inline.php: rewrote the insert javascript as
+ an intermediate step. I'm sure I completely broke ECML integration and
+ uploading files.
+
+ * mod/embed/start.php, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/tabs.php,
+ views/default/css/elements/navigation.php: using the new lightbox and hacking
+ away at the complicated embed/embed view
+
+ * mod/blog/actions/blog/save.php,
+ mod/blog/views/default/forms/blog/save.php: Fixes #3580 adding blog preview
+ button that uses save action
+
+ * languages/en.php: added "Preview" as a general term defined in language
+ file
+
+ * mod/blog/actions/blog/save.php: using elgg_delete_river() rather than
+ custom SQL in blog save action
+
+ * mod/blog/views/default/forms/blog/save.php: moving the delete button in
+ blog form to right side
+
+ * mod/twitter_api/languages/en.php: Calling normal user registration
+ "manual" was confusing admin manual registration with user initiated
+ registration
+
+2011-06-18 Cash Costello <cash.costello@gmail.com>
+
+ * LICENCE.txt, LICENSE.txt: moved LICENCE.txt to LICENSE.txt to be
+ consistent with readme
+
+2011-06-13 Evan Winslow <evan@elgg.org>
+
+ * views/default/css/elements/components.php: Using tabs, not spaces for
+ indentation
+
+ * mod/groups/start.php, .../river/object/groupforumtopic/create.php,
+ views/default/river/elements/body.php,
+ views/default/river/elements/footer.php,
+ views/default/river/elements/responses.php: Renamed river footer to a more
+ semantic "responses". Fixed discussion to work inline again with this new
+ layout.
+
+ * views/default/css/elements/components.php: elgg-river-message and
+ elgg-river-attachments now get the old elgg-river-content styling
+
+2011-06-13 Jeff Tilson <jrtilson@gmail.com>
+
+ * mod/groups/actions/groups/membership/remove.php,
+ mod/groups/languages/en.php, mod/groups/start.php: Added 'remove from group'
+ link to the user hover menu (only appears when the page owner is a group)
+
+2011-06-13 Ravindra Nath Kakarla <ravindhranath@gmail.com>
+
+ * mod/thewire/views/default/js/thewire.php: textarea has to be jQuery object
+
+2011-06-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggMenuItem.php,
+ views/default/navigation/menu/elements/item.php: Fixes #3282 always using a
+ menu item's name in its class
+
+ * mod/tinymce/views/default/js/tinymce.php: Fixes #3175 toggled tinymce
+ takes full width now - thanks tomv
+
+ * languages/en.php: made some language clearer on default widgets
+ instructions
+
+ * .../views/default/forms/expages/edit.php: fixed formatting of site pages
+ creation form - longtext menu was overlapping tinymce
+
+ * views/default/css/admin.php: added the css for longtext control menu to
+ admin theme
+
+2011-06-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/reportedcontent/admin_css.php: fixing some display issues
+ with reported content - code use a little cleanup
+
+ * mod/thewire/languages/en.php: pulling in blacktooth's wire language typo
+ fix : pull request #32
+
+ * mod/likes/start.php: Fixes #3521 removed unecessary anchor tags - thanks
+ to blacktooth
+
+ * engine/classes/ElggSite.php,
+ ...8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php, version.php: Fixes #2910
+ set the site_guid of site entities
+
+ * engine/lib/elgglib.php: Fixes #3480 not requiring a timestamp when using
+ the js/css page handler
+
+ * views/default/css/elements/layout.php: Fixes #3409 fixed small viewport
+ issue with default theme
+
+ * views/default/core/settings/tools.php: adjusted the spacing between the
+ settings tools text and the surrounding elements
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/profile/fields.php: using divs for group
+ profile fields to work around html validation issues with the out/tags view
+ using a div
+
+2011-06-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/details.php: convert profile details to
+ use divs so that we don't have invalid html due to output/tags
+
+ * views/default/page/layouts/widgets/add_panel.php: need to maintain key
+ associations with widget types
+
+ * views/default/page/layouts/widgets/add_panel.php: sort widgets for add
+ widgets panel
+
+ * views/default/css/elements/navigation.php: moved the elgg logo to the left
+ by 10 pixels
+
+ * engine/lib/elgglib.php, engine/lib/users.php,
+ views/default/css/elements/navigation.php: topbar icons were pushing the site
+ title. Forced the elgg logo and avatar to behave. Adding overflow hidden to
+ the topbar div would prevent future problems but cause issues for those
+ adding drop down menus
+
+ * actions/avatar/crop.php, actions/avatar/upload.php, languages/en.php:
+ added user avatar river messages back
+
+ * engine/lib/deprecated-1.8.php, engine/lib/river.php: Fixes #3039 added
+ elgg_delete_river()
+
+ * views/default/css/elements/modules.php: made the widget edit area slightly
+ darker to provide contrast with content area
+
+ * mod/profile/views/default/profile/owner_block.php: added some spacing
+ around the profile action menu
+
+ * pages/account/forgotten_password.php, pages/account/register.php,
+ pages/account/reset_password.php, views/default/css/elements/forms.php,
+ views/default/forms/user/requestnewpassword.php: Fixes #3556 limiting width
+ of account text boxes
+
+ * index.php, mod/custom_index/index.php: Fixes #3376 added RSS feed to
+ default index page and suppressing on custom index front page
+
+ * engine/classes/ElggSite.php, engine/lib/users.php,
+ pages/account/forgotten_password.php, pages/account/reset_password.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/forms/login.php: Fixes #3515 created a unified page handler for
+ account pages
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/group/elements/summary.php, views/default/object/default.php,
+ views/default/user/default.php, views/default/user/elements/summary.php:
+ Fixes #3096 added user and group summery views an updated plugins to use the
+ new view locations
+
+ * views/default/object/elements/summary.php,
+ views/default/page/components/summary.php: Refs #3096 Moved
+ page/components/summary to object/elements/summary. Left
+ page/components/summary for backwards compatibility. Plugins will eventually
+ need to be updated to use $type/elements/summary
+
+ * mod/pages/views/default/object/page_top.php: Fixes #3523 setting public
+ write access to logged in for pages
+
+ * mod/pages/start.php, mod/pages/views/default/input/write_access.php: Refs
+ #3523 added a view for write access in pages plugin
+
+ * mod/pages/pages/pages/view.php, mod/pages/start.php: Fixes #2672 limiting
+ deleting pages and creating sub pages
+
+ * engine/classes/ElggMenuItem.php, engine/lib/admin.php: sorting plugin
+ settings menu items by text
+
+ * .../views/default/settings/categories/edit.php,
+ .../default/settings/garbagecollector/edit.php,
+ .../views/default/settings/logrotate/edit.php: Refs #2032 changed <p> to
+ <div> for plugin settings
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/groups/actions/groups/delete.php,
+ mod/groups/views/default/forms/groups/delete.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/edit.php,
+ .../views/default/forms/invitefriends/invite.php,
+ .../notifications/subscriptions/forminternals.php,
+ views/default/css/elements/forms.php, views/default/forms/avatar/crop.php,
+ views/default/forms/avatar/upload.php, views/default/forms/comments/add.php,
+ views/default/forms/usersettings/save.php: Refs #3407 adds a footer for forms
+
+
+ * install/css/install.css, views/installation/install/nav.php,
+ views/installation/install/pages/complete.php: fixed disabled button in
+ installer - css class had changed
+
+2011-06-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/languages/en.php,
+ .../views/default/theme_preview/general.php: Fixes #3394 added a landing page
+ to theme preview and break out of iframe link
+
+ * engine/lib/users.php, views/default/input/location.php,
+ views/default/input/tag.php, views/default/output/location.php,
+ views/default/output/tag.php, views/default/output/tags.php: Fixes #3489
+ added input/output views for tag and location
+
+ * mod/invitefriends/manifest.xml: added invite friends to default activated
+ plugins
+
+ * actions/admin/plugins/activate.php, actions/admin/plugins/deactivate.php:
+ Refs #2871 Forgot to update the forwarding for activate/deactivate actions
+
+ * languages/en.php, mod/diagnostics/languages/en.php,
+ mod/externalpages/languages/en.php: Refs #3410 all admin menu items have
+ consistent capitalization
+
+ * engine/lib/admin.php: Fixes #3548 the check for an admin menu's parent
+ wasn't working
+
+ * actions/admin/plugins/activate_all.php,
+ actions/admin/plugins/deactivate_all.php, views/default/admin/plugins.php,
+ views/default/css/admin.php,
+ views/default/forms/admin/plugins/change_state.php: Fixes #2871 activate
+ all/deactivate all now sensitive to filtering
+
+ * views/default/admin/plugins/simple.php,
+ .../forms/admin/plugins/simple_update_states.php: Refs #2871 removed the
+ simple plugins page
+
+ * engine/lib/admin.php, views/default/admin/plugins.php,
+ views/default/admin/plugins/advanced.php: Refs #2871 promoted advanced
+ plugins up to be a primary menu
+
+ * views/default/object/plugin/advanced.php: Refs #2871 also turning off
+ dragging when not in priority order
+
+ * views/default/admin/plugins/advanced.php,
+ views/default/object/plugin/advanced.php,
+ .../object/plugin/elements/dependencies.php: Refs #2871 only showing links
+ for changing priority when all plugins are shown in priority order
+
+ * languages/en.php, views/default/admin/plugins/advanced.php,
+ views/default/forms/admin/plugins/filter.php,
+ views/default/forms/admin/plugins/sort.php: Refs #2871 adding sorting to
+ advanced plugin page
+
+ * languages/en.php, views/default/admin/plugins/advanced.php: Refs #2871
+ filter plugins by active/inactive state
+
+ * mod/diagnostics/manifest.xml: setting correct category for diagnostics
+ plugin
+
+2011-06-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Closes #3510. Merged CHANGES.txt for 1.7.9 to trunk.
+
+ * engine/lib/deprecated-1.8.php: Refs #3510, #3366. Added warning about
+ count vs sum in egef_annotation_count() to trunk.
+
+ * mod/profile/start.php: Refs #3510, #3316. Merged
+ register_metadata_as_independent() fix in profile.
+
+2011-06-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2011052801.php, version.php: Refs #3510, #3416. Merged
+ update for making sure users have relationship member_of on site object.
+
+ * mod/messages/languages/en.php,
+ mod/messages/views/default/object/messages.php: Refs #3510, #3264. Ported fix
+ for icons of messages from deleted users to trunk.
+
+2011-06-08 Evan Winslow <evan@elgg.org>
+
+ * engine/lib/views.php, languages/en.php, mod/blog/languages/en.php,
+ .../views/default/river/object/blog/create.php,
+ mod/bookmarks/languages/en.php,
+ .../default/river/object/bookmarks/create.php, mod/file/languages/en.php,
+ .../views/default/river/object/file/create.php, mod/groups/languages/en.php,
+ .../river/annotation/group_topic_post/reply.php,
+ mod/groups/views/default/river/group/create.php,
+ .../river/object/groupforumtopic/create.php,
+ .../default/river/relationship/member/create.php,
+ .../default/river/annotation/likes/create.php,
+ mod/messageboard/languages/en.php,
+ .../default/river/object/messageboard/create.php, mod/pages/languages/en.php,
+ .../views/default/river/object/page/create.php, mod/thewire/languages/en.php,
+ .../views/default/river/object/thewire/create.php,
+ .../river/annotation/generic_comment/create.php,
+ views/default/river/elements/body.php,
+ views/default/river/elements/summary.php, views/default/river/item.php,
+ views/default/river/relationship/friend/create.php: River revamp for 1.8
+
+2011-06-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php: Refs #3510, #3414, #3536.
+ Ported https login fixes to trunk. Will need to backport changes to 1.7 for
+ #3536.
+
+ * engine/lib/group.php, engine/lib/sessions.php, languages/en.php: Refs
+ #3510, #3418. Merged fix for forwarding after output to trunk.
+
+ * mod/tinymce/vendor/tinymce/changelog.txt,
+ .../vendor/tinymce/examples/accessibility.html,
+ .../vendor/tinymce/examples/css/content.css,
+ mod/tinymce/vendor/tinymce/examples/css/word.css,
+ .../vendor/tinymce/examples/custom_formats.html,
+ mod/tinymce/vendor/tinymce/examples/full.html,
+ mod/tinymce/vendor/tinymce/examples/index.html,
+ .../vendor/tinymce/examples/lists/image_list.js,
+ .../vendor/tinymce/examples/lists/link_list.js,
+ .../vendor/tinymce/examples/lists/media_list.js,
+ .../vendor/tinymce/examples/lists/template_list.js,
+ mod/tinymce/vendor/tinymce/examples/media/logo.jpg,
+ .../vendor/tinymce/examples/media/logo_over.jpg,
+ .../vendor/tinymce/examples/media/sample.avi,
+ .../vendor/tinymce/examples/media/sample.dcr,
+ .../vendor/tinymce/examples/media/sample.flv,
+ .../vendor/tinymce/examples/media/sample.mov,
+ .../vendor/tinymce/examples/media/sample.ram,
+ .../vendor/tinymce/examples/media/sample.rm,
+ .../vendor/tinymce/examples/media/sample.swf,
+ mod/tinymce/vendor/tinymce/examples/menu.html,
+ mod/tinymce/vendor/tinymce/examples/simple.html,
+ mod/tinymce/vendor/tinymce/examples/skins.html,
+ .../vendor/tinymce/examples/templates/layout1.htm,
+ .../vendor/tinymce/examples/templates/snippet1.htm,
+ mod/tinymce/vendor/tinymce/examples/word.html,
+ .../vendor/tinymce/jscripts/tiny_mce/langs/en.js,
+ .../tiny_mce/plugins/advhr/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advhr/rule.htm,
+ .../jscripts/tiny_mce/plugins/advimage/image.htm,
+ .../jscripts/tiny_mce/plugins/advimage/js/image.js,
+ .../tiny_mce/plugins/advimage/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlink/js/advlink.js,
+ .../tiny_mce/plugins/advlink/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advlink/link.htm,
+ .../tiny_mce/plugins/advlist/editor_plugin.js,
+ .../tiny_mce/plugins/advlist/editor_plugin_src.js,
+ .../tiny_mce/plugins/autolink/editor_plugin.js,
+ .../tiny_mce/plugins/autolink/editor_plugin_src.js,
+ .../tiny_mce/plugins/autoresize/editor_plugin.js,
+ .../plugins/autoresize/editor_plugin_src.js,
+ .../tiny_mce/plugins/autosave/editor_plugin.js,
+ .../tiny_mce/plugins/autosave/editor_plugin_src.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin_src.js,
+ .../tiny_mce/plugins/contextmenu/editor_plugin.js,
+ .../plugins/contextmenu/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/emotions.htm,
+ .../tiny_mce/plugins/fullpage/css/fullpage.css,
+ .../tiny_mce/plugins/fullpage/editor_plugin.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/fullpage.htm,
+ .../tiny_mce/plugins/fullpage/js/fullpage.js,
+ .../tiny_mce/plugins/fullscreen/editor_plugin.js,
+ .../plugins/fullscreen/editor_plugin_src.js,
+ .../tiny_mce/plugins/inlinepopups/editor_plugin.js,
+ .../plugins/inlinepopups/editor_plugin_src.js,
+ .../inlinepopups/skins/clearlooks2/window.css,
+ .../tiny_mce/plugins/layer/editor_plugin.js,
+ .../tiny_mce/plugins/layer/editor_plugin_src.js,
+ .../tiny_mce/plugins/legacyoutput/editor_plugin.js,
+ .../plugins/legacyoutput/editor_plugin_src.js,
+ .../tiny_mce/plugins/lists/editor_plugin.js,
+ .../tiny_mce/plugins/lists/editor_plugin_src.js,
+ .../tiny_mce/plugins/media/css/content.css,
+ .../jscripts/tiny_mce/plugins/media/css/media.css,
+ .../tiny_mce/plugins/media/editor_plugin.js,
+ .../tiny_mce/plugins/media/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/img/flash.gif,
+ .../tiny_mce/plugins/media/img/flv_player.swf,
+ .../tiny_mce/plugins/media/img/quicktime.gif,
+ .../tiny_mce/plugins/media/img/realmedia.gif,
+ .../tiny_mce/plugins/media/img/shockwave.gif,
+ .../jscripts/tiny_mce/plugins/media/img/trans.gif,
+ .../tiny_mce/plugins/media/img/windowsmedia.gif,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/media/media.htm,
+ .../tiny_mce/plugins/media/moxieplayer.swf,
+ .../tiny_mce/plugins/nonbreaking/editor_plugin.js,
+ .../plugins/nonbreaking/editor_plugin_src.js,
+ .../tiny_mce/plugins/noneditable/editor_plugin.js,
+ .../plugins/noneditable/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/css/content.css,
+ .../tiny_mce/plugins/pagebreak/editor_plugin.js,
+ .../plugins/pagebreak/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/img/pagebreak.gif,
+ .../tiny_mce/plugins/pagebreak/img/trans.gif,
+ .../tiny_mce/plugins/paste/editor_plugin.js,
+ .../tiny_mce/plugins/paste/editor_plugin_src.js,
+ .../plugins/searchreplace/editor_plugin.js,
+ .../plugins/searchreplace/editor_plugin_src.js,
+ .../plugins/searchreplace/js/searchreplace.js,
+ .../plugins/searchreplace/searchreplace.htm,
+ .../tiny_mce/plugins/spellchecker/editor_plugin.js,
+ .../plugins/spellchecker/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/style/js/props.js,
+ .../tiny_mce/plugins/style/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/style/props.htm,
+ .../tiny_mce/plugins/tabfocus/editor_plugin.js,
+ .../tiny_mce/plugins/tabfocus/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/cell.htm,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/cell.js,
+ .../jscripts/tiny_mce/plugins/table/js/row.js,
+ .../jscripts/tiny_mce/plugins/table/js/table.js,
+ .../tiny_mce/plugins/table/langs/en_dlg.js,
+ .../tiny_mce/plugins/table/merge_cells.htm,
+ .../jscripts/tiny_mce/plugins/table/row.htm,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../tiny_mce/plugins/template/js/template.js,
+ .../tiny_mce/plugins/visualchars/editor_plugin.js,
+ .../plugins/visualchars/editor_plugin_src.js,
+ .../tiny_mce/plugins/wordcount/editor_plugin.js,
+ .../plugins/wordcount/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm,
+ .../tiny_mce/plugins/xhtmlxtras/acronym.htm,
+ .../tiny_mce/plugins/xhtmlxtras/attributes.htm,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/del.htm,
+ .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js,
+ .../plugins/xhtmlxtras/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm,
+ .../tiny_mce/plugins/xhtmlxtras/js/attributes.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js,
+ .../plugins/xhtmlxtras/js/element_common.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js,
+ .../jscripts/tiny_mce/themes/advanced/about.htm,
+ .../jscripts/tiny_mce/themes/advanced/anchor.htm,
+ .../jscripts/tiny_mce/themes/advanced/charmap.htm,
+ .../tiny_mce/themes/advanced/color_picker.htm,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/advanced/image.htm,
+ .../tiny_mce/themes/advanced/img/flash.gif,
+ .../tiny_mce/themes/advanced/img/iframe.gif,
+ .../tiny_mce/themes/advanced/img/pagebreak.gif,
+ .../tiny_mce/themes/advanced/img/quicktime.gif,
+ .../tiny_mce/themes/advanced/img/realmedia.gif,
+ .../tiny_mce/themes/advanced/img/shockwave.gif,
+ .../tiny_mce/themes/advanced/img/trans.gif,
+ .../tiny_mce/themes/advanced/img/video.gif,
+ .../tiny_mce/themes/advanced/img/windowsmedia.gif,
+ .../jscripts/tiny_mce/themes/advanced/js/about.js,
+ .../jscripts/tiny_mce/themes/advanced/js/anchor.js,
+ .../tiny_mce/themes/advanced/js/charmap.js,
+ .../tiny_mce/themes/advanced/js/color_picker.js,
+ .../jscripts/tiny_mce/themes/advanced/js/image.js,
+ .../jscripts/tiny_mce/themes/advanced/js/link.js,
+ .../tiny_mce/themes/advanced/js/source_editor.js,
+ .../jscripts/tiny_mce/themes/advanced/langs/en.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/link.htm,
+ .../tiny_mce/themes/advanced/shortcuts.htm,
+ .../themes/advanced/skins/default/content.css,
+ .../tiny_mce/themes/advanced/skins/default/ui.css,
+ .../themes/advanced/skins/highcontrast/content.css,
+ .../themes/advanced/skins/highcontrast/dialog.css,
+ .../themes/advanced/skins/highcontrast/ui.css,
+ .../themes/advanced/skins/o2k7/content.css,
+ .../tiny_mce/themes/advanced/skins/o2k7/dialog.css,
+ .../tiny_mce/themes/advanced/skins/o2k7/ui.css,
+ .../themes/advanced/skins/o2k7/ui_black.css,
+ .../themes/advanced/skins/o2k7/ui_silver.css,
+ .../tiny_mce/themes/advanced/source_editor.htm,
+ .../tiny_mce/themes/simple/editor_template.js,
+ .../tiny_mce/themes/simple/editor_template_src.js,
+ .../vendor/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_popup.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_src.js,
+ .../tinymce/jscripts/tiny_mce/utils/form_utils.js,
+ .../tinymce/jscripts/tiny_mce/utils/mctabs.js,
+ .../tinymce/jscripts/tiny_mce/utils/validate.js: Refs #3510, #9113. Updated
+ tinyMCE version in trunk.
+
+ * engine/classes/ElggEntity.php: Refs #3510, #3433. Ported r9062 to trunk.
+ Fix for comment hook returning 0 comments.
+
+ * CHANGES.txt: Refs #3510: Merged r8938 to trunk. Removed exec props.
+
+ * README.txt: Merged README.txt version removal to trunk.
+
+2011-06-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php: Fixes #3520 fix check for subdirectory in
+ installer
+
+ * mod/embed/README.txt, mod/embed/start.php,
+ mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/js.php,
+ .../default/tinymce/embed_custom_insert_js.php: Refs #3360 #2911 applying
+ ashleyward's patch for embed plugin - thanks!
+
+ * vendors/jquery/jquery.form.js: Refs #3360 updating the jquery form plugin
+
+ * mod/blog/actions/blog/delete.php, mod/blog/lib/blog.php,
+ mod/blog/start.php, mod/blog/views/default/blog/group_module.php,
+ mod/bookmarks/actions/bookmarks/delete.php,
+ mod/bookmarks/pages/bookmarks/view.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/file/actions/file/delete.php, mod/file/actions/file/upload.php,
+ mod/file/pages/file/search.php, mod/file/pages/file/upload.php,
+ mod/file/pages/file/view.php, mod/file/start.php,
+ mod/file/views/default/file/group_module.php,
+ mod/messageboard/pages/messageboard/owner.php, mod/messageboard/start.php,
+ .../views/default/widgets/messageboard/content.php,
+ mod/pages/actions/pages/delete.php, mod/pages/pages/pages/history.php,
+ mod/pages/pages/pages/revision.php, mod/pages/pages/pages/view.php,
+ mod/pages/start.php, mod/pages/views/default/pages/group_module.php: Fixes
+ #3138 using 'all' for group listing urls
+
+ * mod/likes/actions/likes/add.php, mod/likes/actions/likes/delete.php,
+ mod/likes/views/default/likes/display.php: Fixes #3497 users can unlike other
+ users content
+
+2011-06-02 Russell McLoughlin <mcloughlin3@llnl.gov>
+
+ * mod/file/actions/file/upload.php: fixed embarrassing spelling mistake.
+
+2011-06-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/likes/start.php: Fixes #3499 using consistent menu name for likes
+ plugin
+
+2011-06-01 Russell McLoughlin <mcloughlin3@llnl.gov>
+
+ * mod/file/actions/file/upload.php, mod/file/download.php: Modified upload
+ script to guarentee that the directory under elgg data is created or exists.
+ Removed strange chunking code with builtin php function
+
+ * mod/file/actions/file/upload.php: Modified upload code so that it uses
+ php's built in file copy function rather than reading the entire uploaded
+ file into memory from the temporary upload directory and then saving it to
+ elgg's data dir.
+
+2011-06-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Fixes #3455 added documentation back to
+ deprecated functions
+
+2011-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginPackage.php, languages/en.php,
+ views/default/css/admin.php, views/default/object/plugin/advanced.php: Fixes
+ #3467. Fixed bugs in priority deps. Can now disable active plugins with unmet
+ dependencies.
+
+2011-05-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: Refs #3236 added some margin to the bottom of
+ the admin footer
+
+ * engine/lib/users.php, mod/dashboard/manifest.xml, mod/dashboard/start.php,
+ mod/dashboard/views/default/dashboard/blurb.php, pages/dashboard.php,
+ views/default/core/dashboard/blurb.php, views/default/css/elements/misc.php:
+ Refs #3340 pulls dashboard out as plugin
+
+ * views/default/annotation/generic_comment.php,
+ views/default/page/elements/comments_block.php: Fixes #3457 showing a snippet
+ of a comment in sidebar instead of entire comment
+
+ * views/default/input/access.php, views/default/input/tags.php,
+ views/default/output/tags.php: Fixes #3189 adds entity support to tags and
+ access views
+
+ * languages/en.php, mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/categories/manifest.xml, mod/diagnostics/manifest.xml,
+ mod/embed/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/logrotate/manifest.xml, mod/messageboard/manifest.xml,
+ mod/pages/manifest.xml, mod/tagcloud/manifest.xml, mod/tinymce/manifest.xml,
+ mod/twitter/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: Refs #2104 changed extension to enhancement and
+ added security, widget, and theme categories
+
+ * engine/lib/river.php: Fixes #3300 adds a created,river event
+
+2011-05-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: 'creating', 'river' is the plugin hook for
+ preventing or catching a river addition before it happens
+
+ * engine/lib/output.php: Fixes #3454 not stripping empty attributes
+
+ * engine/lib/admin.php, views/default/object/plugin/advanced.php: Fixes
+ #3163 plugin/<plugin id>/settings.php is now the preferred way to add
+ settings plugins
+
+ * engine/classes/ElggPlugin.php, engine/lib/elgglib.php, languages/en.php:
+ Fixes #3462 empty classes directory is no longer treated as an error
+
+2011-05-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js, views/default/output/confirmlink.php,
+ views/default/page/elements/header.php: Fixes #3385 rel now used for the
+ confirm text so that title can be used separately
+
+ * engine/lib/pagehandler.php: Fixes #3132 added 'route', $handler plugin
+ hook
+
+ * views/default/forms/register.php: Fixes #3419 removed code about admin
+ option from registration form
+
+ * mod/groups/start.php: Fixes #3464 group discussion replies work on
+ activity page
+
+2011-05-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/languages/en.php: Fixes #3453 added link to wiki about the data
+ directory
+
+ * install/css/install.css,
+ views/installation/install/pages/requirements.php: fixed display issue in
+ installation where navigation was overlapping requirements
+
+ * install/ElggInstaller.php: fixed issue introduced with the session changes
+ in the installer
+
+ * install/ElggInstaller.php: do not need to initialize globals in installer
+ because they are now declared that way in Elgg core libs
+
+ * install/ElggInstaller.php: fixed regenerating cache when installing Elgg -
+ wasn't picking up the plugins before
+
+ * views/installation/page/elements/footer.php: helpful links in installer
+ open up in new page now
+
+ * install/ElggInstaller.php: Refs #3453 added $CONFIG->data_dir_override so
+ that people can put the data directory in Elgg's root if they want to. Will
+ add instructions to the wiki on using this and protecting the directory
+
+ * install/ElggInstaller.php, install/ElggRewriteTester.php,
+ install/css/install.css, install/js/install.js, install/languages/en.php,
+ views/installation/forms/install/template.php,
+ views/installation/input/checkbox.php,
+ views/installation/input/checkboxes.php, views/installation/input/combo.php,
+ views/installation/input/form.php, views/installation/input/hidden.php,
+ views/installation/input/text.php: Refs #3453 an implementation of creating
+ the data directory. This capability is turned off due to security concerns.
+
+2011-05-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/installation/input/access.php, views/installation/input/button.php,
+ views/installation/input/checkboxes.php,
+ views/installation/input/dropdown.php, views/installation/input/form.php,
+ views/installation/input/hidden.php, views/installation/input/longtext.php,
+ views/installation/input/password.php, views/installation/input/reset.php,
+ views/installation/input/securitytoken.php,
+ views/installation/input/submit.php, views/installation/input/text.php: clean
+ up installation input views
+
+ * install/css/install.css: fixed the width of text boxes for the installer
+
+ * actions/logout.php: on logout send the user to the main page
+
+ * install/ElggInstaller.php: Fixes #3446 password is not required anymore
+ for installer
+
+ * install/js/install.js, views/installation/forms/install/template.php,
+ views/installation/page/default.php: fixed the double form submission code
+ for the installer
+
+ * engine/lib/users.php, views/default/user/default.php: Fixes #3456
+ user/default now works much like the object/<subtype> views regarding the
+ menu
+
+ * engine/lib/extender.php: not using deprecated get_annotation/get_metadata
+ functions in can_edit_extender()
+
+ * views/default/navigation/topbar_tools.php,
+ views/default/page/elements/topbar.php: only display deprecation message if
+ someone extends/overrides the deprecated tools view
+
+ * mod/developers/languages/en.php: defined
+ elgg_dev_tools:settings:explanation
+
+ * views/default/input/dropdown.php: fixes a php warning if no options are
+ passed to input/dropdown view
+
+ * engine/lib/users.php: removed a deprecated function use in users lib
+
+ * .../views/default/theme_preview/forms.php,
+ views/default/input/userpicker.php: fixed passing wrong parameters to
+ input/userpicker (which is not currently functional)
+
+ * mod/externalpages/start.php, mod/thewire/start.php, mod/twitter/start.php:
+ removed deprecated functions from these 3 plugins
+
+ * engine/lib/actions.php: improved documentation of elgg_register_action()
+
+ * mod/pages/start.php: fixed page revisions url override
+
+ * engine/lib/extender.php: improved documentation of
+ elgg_register_extender_url_handler()
+
+ * views/default/forms/admin/menu/save.php: fixed php warning when no custom
+ menu items
+
+ * languages/en.php: fixed typo in the admin welcome widget
+
+ * views/default/admin/plugins/advanced.php: sorting plugin categories before
+ display
+
+ * languages/en.php, mod/groups/manifest.xml, mod/likes/manifest.xml,
+ mod/oauth_api/manifest.xml, mod/twitter_api/manifest.xml,
+ mod/zaudio/manifest.xml: Refs #2104 more category work for bundled plugins
+
+ * engine/lib/database.php: made database query logging explicitly set to
+ NOTICE level
+
+2011-05-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/lib/blog.php: Fixes #3439 forcing months to have leading zero
+
+2011-05-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+2011-05-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/userpicker.js: Pulled in Jeff's patch to fix the user picker.
+
+ * engine/classes/ElggPluginPackage.php: Fixes 3426. Not using a horrible
+ variable name and fixing the bug created by it.
+
+2011-05-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Fixed wrapper for annotation calculations.
+
+2011-04-29 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/css/admin.php,
+ views/default/widgets/admin_welcome/content.php: Made admin welcome widget a
+ bit more semantic
+
+ * upgrade.php: comment typo
+
+ * engine/.htaccess: Bah, can't do that
+
+ * engine/.htaccess: Deny all HTTP access to the engine directory
+
+2011-04-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitter/views/default/twitter/css.php: hacking the 1.7 css for current
+ twitter widget so it looks decent for screenshots
+
+ * mod/embed/start.php: Refs #3358 fixed another instance where link_class
+ should be used now due to changes in menu code
+
+2011-04-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/security.js, js/lib/ui.js: Fixes #3408. During token refresh, only
+ touching hrefs that contain __elgg_ts and __elgg_token to avoid changing
+ selector-only hrefs since fragment-only hrefs are normalized by the browser.
+ Not sure how this didn't show up until now.
+
+2011-04-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/widgets/admin_welcome/content.php: Trying
+ to increase probability that people will read the welcome widget by making
+ the text shorter
+
+ * languages/en.php, views/default/css/admin.php,
+ views/default/forms/profile/fields/reset.php: Refs #3236 updated the button
+ css so that disable plugin button looks like a button
+
+ * mod/messages/manifest.xml: activate messages plugin on install
+
+ * views/default/css/admin.php, .../object/plugin/elements/dependencies.php:
+ Refs #3236 removed elgg-states-* from admin css since it was overaggressive
+
+ * views/default/css/admin.php: Refs #3236 cleaned up the widget css in admin
+ area
+
+2011-04-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/start.php: Refs #3358. Missed Tinymce's use of class for its
+ menu.
+
+ * views/default/css/admin.php: Fixes #3326. Added CSS for inputs in admin
+ area. No more tiny text fields!
+
+ * mod/messageboard/views/default/messageboard/js.php: Fixed a problem with
+ the ajax for deleting message board posts.
+
+ * engine/lib/actions.php: Removed unneeded else.
+
+ * engine/lib/actions.php: Fixes #3127. Normalizing the json returned by the
+ ajax action handler. Doing this in PHP.
+
+2011-04-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: Added very basic CSS for elgg-markdown in
+ admin area.
+
+ * engine/lib/admin.php: Fixed possible WSOD for plugin text file page
+ handler.
+
+ * mod/search/README.txt: Fixed typo in search's readme.
+
+ * vendors/markdown/UPSTREAM_WARNING, vendors/markdown/markdown.php: Updated
+ markdown to add support for === instead of just ### for headers. Added
+ upstream warning.
+
+ * mod/search/README.txt: Updated search's readme to markdown.
+
+ * mod/logrotate/languages/en.php, mod/logrotate/start.php,
+ .../views/default/settings/logrotate/edit.php: Fixes #3253. Merged in
+ Shashank's patch.
+
+ * engine/lib/plugins.php: Removed stray test code.
+
+ * engine/lib/plugins.php, views/default/admin/plugins/advanced.php: Refs
+ #3362. Removed use of $show_bad in elgg_get_plugins().
+
+ * actions/admin/plugins/activate.php,
+ actions/admin/plugins/activate_all.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/deactivate_all.php,
+ actions/admin/plugins/set_priority.php,
+ actions/admin/plugins/simple_update_states.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggPluginPackage.php,
+ engine/lib/admin.php, engine/lib/deprecated-1.8.php, engine/lib/plugins.php,
+ install/ElggInstaller.php, views/default/admin/plugin_settings.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/core/settings/tools.php,
+ .../forms/admin/plugins/simple_update_states.php,
+ views/default/object/plugin/advanced.php,
+ .../object/plugin/elements/dependencies.php,
+ views/default/object/plugin/simple.php: Refs #3362. Plugins don't check deps
+ upon boot. Made package and manifest private properties of ElggPlugin and
+ added ->getPackage() and ->getManifest().
+
+2011-04-26 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/icons.php: Fixes #3380: .elgg-icon-user states
+ are now consistent with other elgg-icons
+
+ * views/default/css/elements/core.php,
+ views/default/css/elements/navigation.php: Fixes #3388: .elgg-icon is now
+ middle-aligned by default
+
+ * views/default/page/components/gallery.php: Fixes #3290: Fluid gallery w/o
+ tables -- working great for fixed-width content
+
+ * views/default/css/elements/typography.php: Fixes #3389: Sandbox base
+ styles for dl, dt, dd
+
+ * engine/lib/input.php, views/default/input/autocomplete.php: Fixes #2922:
+ pg/livesearch now works with "term" parameter
+
+ * engine/lib/elgglib.php: Fixes some coding standard issues in elgglib.php
+
+2011-04-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/readme.txt: Removed inaccurate readme.txt file.
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginPackage.php,
+ engine/lib/admin.php, engine/lib/plugins.php, languages/en.php,
+ vendors/markdown/License.text, vendors/markdown/PHP Markdown Extra
+ Readme.text, vendors/markdown/markdown.php,
+ views/default/object/plugin/advanced.php,
+ views/default/object/plugin/simple.php: Fixes #2899, #2870. Added README.txt,
+ CHANGES.txt, COPYRIGHT.txt, LICENSE.txt, and INSTALL.txt as markdown files
+ for plugins. Added page handler to parse and serve them. Added links in
+ plugin admin. Refs #3236. Problems with displaying parsed markdown because of
+ missing parts of the admin theme's CSS.
+
+ * engine/classes/ElggPlugin.php: Renamed ElggPlugin->canIncludeFile() to
+ ->canReadFile() and am using is_readable() instead of file_exists().
+
+2011-04-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/forms.php: Fixes #2196. Pulled in Francisco's
+ patch for datepicker CSS.
+
+2011-04-23 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/page/theme_preview.php,
+ .../views/default/theme_preview/buttons.php,
+ .../views/default/theme_preview/components.php,
+ .../theme_preview/components/image_block.php,
+ .../default/theme_preview/components/list.php,
+ .../default/theme_preview/components/messages.php,
+ .../default/theme_preview/components/table.php,
+ .../views/default/theme_preview/forms.php,
+ .../views/default/theme_preview/general.php,
+ .../views/default/theme_preview/grid.php,
+ .../views/default/theme_preview/icons.php,
+ .../views/default/theme_preview/icons/avatars.php,
+ .../views/default/theme_preview/icons/loader.php,
+ .../views/default/theme_preview/icons/sprites.php,
+ .../views/default/theme_preview/modules.php,
+ .../default/theme_preview/modules/modules.php,
+ .../default/theme_preview/modules/widgets.php,
+ .../views/default/theme_preview/navigation.php,
+ .../theme_preview/navigation/breadcrumbs.php,
+ .../default/theme_preview/navigation/default.php,
+ .../default/theme_preview/navigation/extras.php,
+ .../default/theme_preview/navigation/filter.php,
+ .../theme_preview/navigation/horizontal.php,
+ .../theme_preview/navigation/owner_block.php,
+ .../default/theme_preview/navigation/page.php,
+ .../theme_preview/navigation/pagination.php,
+ .../default/theme_preview/navigation/site.php,
+ .../default/theme_preview/navigation/tabs.php,
+ .../views/default/theme_preview/objects.php,
+ .../views/default/theme_preview/typography.php,
+ .../default/theme_preview/typography/headings.php,
+ .../default/theme_preview/typography/misc.php,
+ .../default/theme_preview/typography/paragraph.php,
+ .../views/default/theme_preview/widgets.php: Fixes #3042: Theme preview navs
+ now match css/elements/*. Also did a major cleanup of the presentation.
+
+2011-04-22 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/forms/developers/settings.php: Fixes #3374: echo
+ developers settings explanation
+
+ * views/default/navigation/menu/elements/item.php: Fixes #3282: Added a
+ class to menu items which includes menu item name (just like ul contains a
+ class with the menu name)
+
+2011-04-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Fixed rewriting for internalid and internalname to
+ not cause false deprecation notices if passed among views.
+
+ * views/default/forms/profile/fields/add.php: Fixed deprecated call to
+ input/pulldown.
+
+ * engine/lib/elgglib.php: Added 3rd param to elgg_deprecated_notice() to
+ control how much of the stack to show.
+
+ * engine/lib/statistics.php: Fixes some deprecated notices in admin online
+ user widget.
+
+ * engine/lib/views.php: Fixed erroneous notices about full_view when passing
+ $vars directly to another view within a view.
+
+2011-04-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metastrings.php: Refs #3195.
+ Selectively joining certain tables for performance with annotation
+ calculations.
+
+ * engine/lib/annotations.php, engine/lib/metastrings.php: Reverting the
+ annotation changes because they're not ready yet.
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/lib/metastrings.php, engine/tests/api/metastrings.php: Fixed a problem
+ with the annotation batch operation test.
+
+ * engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_18/manifest.xml: Fixes #3310. Removed old
+ on_activate unit tests.
+
+2011-04-20 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/views/default/object/bookmarks.php: Fixes #3369: Bookmarks
+ now have rel=nofollow
+
+2011-04-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/groups/featured.php, mod/groups/languages/en.php,
+ mod/groups/start.php: Fixes #3364: Added action tokens and fixed guids for
+ featuring/unfeaturing groups. Cleaned up language for result messages.
+
+2011-04-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggMenuItem.php, engine/lib/navigation.php,
+ views/default/page/layouts/content/header.php: Fixes #3358. Renamed menu's
+ class to link_class and documented possible problems with passing <a> tags in
+ the text option.
+
+ * engine/lib/database.php, engine/lib/entities.php,
+ engine/lib/metastrings.php, engine/lib/river.php: Fixes #2046. Applied Franz'
+ patch for sanitize_int().
+
+ * engine/lib/cache.php: Fixes #3365. Pulled in blacktooth's patch.
+
+2011-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser18.php, languages/en.php,
+ mod/blog/manifest.xml, mod/blog/start.php, mod/categories/manifest.xml,
+ mod/categories/start.php: Fixes #3310. Applied lie2815's patch to use
+ activate.php and deactivate.php instead of manifest on_de/activate fields in
+ plugins.
+
+2011-04-16 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/metastrings.php, engine/tests/api/entity_getter_functions.php:
+ Removed debug calls.
+
+ * .gitignore, engine/classes/ElggFile.php, engine/lib/annotations.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/tests/api/entity_getter_functions.php, engine/tests/suite.php:
+ Denormalizing annotation names for calculation functions.
+
+2011-04-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Fixed problem with
+ list_entities_from_metadata() wrapper.
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php,
+ engine/lib/metastrings.php: Refs #3195. Changed the way annotation
+ calculations are performed. Seems to be working better, but will want to test
+ more before closing.
+
+ * engine/classes/ElggMenuItem.php: Refs #3023. Exposed item_class option in
+ the menu item factory. Should we change 'class' to 'link_class' to avoid
+ confusion?
+
+2011-04-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/tests/api/helpers.php: fixed filtering of
+ external files array and suppressed warning in external files unit test
+
+2011-04-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/core.php: Fixes #2972: Following elements have
+ default clearfix: elgg-inner elgg-page-header elgg-page-footer elgg-foot
+ elgg-head elgg-col elgg-image-block
+
+ * views/default/page/admin.php, views/default/page/default.php,
+ views/default/page/elements/foot.php, views/default/page/walled_garden.php:
+ Fixes #3329: Added page/elements/foot and refactored page shells to use it
+
+2011-04-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Fixes #3268 forwarding to referrer (fixed by
+ ashwanthkumar)
+
+ * engine/lib/metastrings.php: handles empty array in get_metastring_id()
+ (hellekin)
+
+ * engine/lib/sessions.php: preventing warnings with the user password
+ authorization pam (hellekin)
+
+ * engine/classes/ElggEntity.php: fixes warnings in ElggEntity::getMetadata()
+ (hellekin)
+
+ * engine/classes/ElggEntity.php: making sure ElggEntity::getAnnotations()
+ returns an array, check if temporary annotation exists before returning, and
+ added a warning about annotating unsaved entities
+
+ * engine/tests/services/api.php: suppressing warnings in web services unit
+ tests (hellekin)
+
+ * engine/classes/ElggPAM.php: checking that PAM handlers have been
+ registered for the policy being tested (hellekin)
+
+ * engine/classes/ElggUser.php: Checking that get_user_by_username() returned
+ something in ElggUser constructor to prevent notice (hellekin)
+
+2011-04-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/cache_handler.php, engine/lib/cache.php,
+ engine/lib/elgglib.php: Fixes #3331. Changed cache schema to allow for JS/CSS
+ views with slashes and dots.
+
+ * engine/lib/elgglib.php: Consolidated the css and js pagehandlers with
+ elgg_cachable_view_pagehandler() and fixed for URLs with multiple dots after
+ the last / (like /js/calendars/fullcalendar.min.123456789.js)
+
+2011-04-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixes #3347 fixes comment typo for ege
+
+2011-04-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/initialize_elgg.php: Fixing JS problems when simple cache
+ is disabled.
+
+2011-04-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/output.php: Fixes #3327 fixed typo
+
+ * views/default/css/elgg.php: Fixes #3333 removed include of chrome css
+
+ * views/default/css/admin.php: Fixes #3325 added cursor: pointer to system
+ messages in admin area
+
+ * mod/file/start.php: Fixes #3322 file link removed from owner_block if
+ disabled for a group
+
+2011-04-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php, views/default/page/elements/head.php: Fixed #3313:
+ Removed the superfluous html_head/extend view from core. Anyone following
+ trunk should extend page/elements/head instead
+
+ * js/lib/languages.js: Fixes #3182: No attempt to go through simplecache at
+ all, but any language can be exported to js now without any extra effort on
+ the part of language pack authors
+
+ * js/lib/elgglib.js, js/lib/languages.js, views/default/js/elgg.php,
+ views/default/js/initialize_elgg.php: Refs #3182: Feeding language loading
+ through /ajax/view to keep thing simpler for now. Reorganized boot process
+ so that we can ajax load the languages asap
+
+ * views/default/css/elements/buttons.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/core.php, views/default/css/elements/grid.php,
+ views/default/css/elements/helpers.php, views/default/css/elements/icons.php,
+ views/default/css/elements/layout.php,
+ views/default/css/elements/navigation.php, views/default/css/elgg.php: Refs
+ #3281: css/elements/core.php for the cross-browser/hacky/non-trivial things
+ that themes should rarely, if ever, override.
+
+2011-04-09 Brett Profitt <brett.profitt@gmail.com>
+
+ * engine/lib/annotations.php, engine/lib/metastrings.php: Running
+ egef_annotation_calculation() through elgg_get_annotations() instead of
+ elgg_get_entities().
+
+2011-04-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * ....8_svn-admins_like_widgets-7f19d2783c1680d3.php: Reopens #3224 not as
+ clever as I thought - user experiences error before seeing reminder
+
+ * mod/bookmarks/languages/en.php, mod/bookmarks/start.php: registered
+ bookmarks widget
+
+ * views/default/css/admin.php: fixed delete icon in admin css
+
+ * actions/widgets/upgrade.php,
+ ...svn-update_default_widgets-7daf5a459720d06d.php, engine/lib/widgets.php,
+ languages/en.php, views/default/admin/appearance/default_widgets.php: Fixes
+ #3193 moves default widgets upgrade to an action
+
+ * engine/lib/upgrades/2011010101.php,
+ ....8_svn-admins_like_widgets-7f19d2783c1680d3.php: Fixes #3224 Fixes #3241
+ stopping upgrade after plugin upgrade and restarting
+
+2011-04-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/entity_getter_functions.php: Fixes #2600. Applied
+ Hellekin's patch. Props to him for understanding what was going on because
+ whoa.
+
+ * mod/twitter_api/lib/twitter_api.php: Removing odd ? after docblock in
+ twitter_api.
+
+2011-04-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrade.php: Refs #3241 sorting upgrades so that upgrades from
+ old upgrade system are ordered in datalist array
+
+ * ..._svn-goodbye_walled_garden-083121a656d06894.php: Refs #3241 deleting
+ old config value in registration upgrade
+
+ * engine/lib/upgrade.php, engine/lib/upgrades/2010050701.php,
+ ..._svn-goodbye_walled_garden-083121a656d06894.php: Refs #3241 cleaned up
+ upgrade sequence so that we don't need special catch for that one upgrade
+ created during 1.7 development. It doesn't hurt running it twice so sites
+ currently using svn trunk will not be negatively affected.
+
+ * engine/lib/upgrades/2010123101.php, engine/lib/upgrades/2011010401.php:
+ Refs #3241 moved the default site access check upgrade script to before the
+ plugin upgrade so plugin upgrade is last upgrade in old upgrade system. The
+ site access script can be run multiple times without causing problems.
+
+ * engine/lib/deprecated-1.8.php, engine/lib/upgrade.php,
+ engine/lib/version.php, engine/start.php, install/ElggInstaller.php: Refs
+ #3241 upgrade.php is a much better name for the upgrade library
+
+ * engine/lib/upgrades/2008100701.php, engine/lib/upgrades/2009022701.php,
+ engine/lib/upgrades/2009041701.php, engine/lib/upgrades/2009070101.php,
+ engine/lib/upgrades/2009102801.php, engine/lib/upgrades/2010033101.php,
+ engine/lib/upgrades/2010040201.php, engine/lib/upgrades/2010061501.php: Refs
+ #3241 cleaned up comments on upgrades and removed the turning off of time
+ limit in individual upgrades since this is now handled by the upgrade
+ function
+
+ * ...11031400-1.8_svn-oauth_api-8f33ee79c3e66222.php: Refs #3241 we never
+ distributed an oauth_lib plugin so we don't need an upgrade (those following
+ svn trunk have already upgraded or can manually update this)
+
+ * engine/lib/upgrades/2010100500.php: Refs #3241 we never distributed a
+ plugin called oauth and Justin Richer has so let's not disable his plugin
+
+ * ....8_svn-admins_like_widgets-7f19d2783c1680d3.php: added a comment to
+ explain why the call to elgg_add_admin_widgets() in the upgrade script has
+ parameters like it does
+
+2011-04-09 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/chrome.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/helpers.php,
+ views/default/css/elements/typography.php, views/default/css/elgg.php: Refs
+ #3286: Removed css/elements/chrome.php, putting all the style rules into
+ sensible locations
+
+2011-04-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/sidebar_alt.php,
+ views/default/page/layouts/two_sidebar.php: Fixes #3319 alternate sidebar
+ should work now
+
+ * _graphics/admin_sprites.png, views/default/css/admin.php: Refs #3108
+ forgot the user hover menu for the admin area
+
+ * engine/lib/upgrades/2010121401.php: Fixes #3320 no longer require the
+ upgrade to disable the members plugin
+
+2011-04-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php: Fixes #3232 removed unnecessary distinct plus
+ variable in select for metastrings calculation
+
+2011-04-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Refs #3278. No more likes in login popup handler.
+
+2011-04-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/admin_sprites.png, .../admin/appearance/profile_fields/list.php,
+ views/default/css/admin.php: Fixes #3108 added admin sprites (enough for beta
+ release)
+
+2011-04-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Fixes #3278 Login popup aligned to right side of button.
+
+2011-04-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/SPRITES_LICENSE.TXT, _graphics/elgg_sprites.png,
+ mod/messages/views/default/messages/css.php,
+ mod/search/views/default/search/css.php,
+ views/default/css/elements/icons.php: Refs #3108 added more sprites and a
+ license file - no visible changes
+
+2011-04-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_sprites.png, engine/lib/views.php, mod/bookmarks/start.php,
+ mod/bookmarks/views/default/object/bookmarks.php, mod/messages/start.php,
+ views/default/css/elements/helpers.php, views/default/css/elements/icons.php,
+ views/default/river/relationship/friend/create.php: Refs #3108 frontend
+ should be done and ready for review - admin area is next
+
+ * engine/lib/deprecated-1.7.php, engine/lib/objects.php,
+ engine/lib/users.php: moved two more deprecated functions out of the main
+ libs
+
+2011-04-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/buttons.php: Fixes
+ #3289 added inline-block to buttons
+
+ * mod/groups/languages/en.php, mod/groups/start.php,
+ .../river/object/groupforumtopic/create.php,
+ views/default/css/elements/components.php,
+ views/default/river/elements/footer.php: Fixes #3275 forms in a river item
+ are not forced to be hidden
+
+2011-04-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/favicon.ico, mod/reportedcontent/graphics/icon_reportthis.gif:
+ Refs #3307 removed executable prop from core files
+
+ * engine/lib/navigation.php, languages/en.php, mod/likes/start.php,
+ views/default/css/elements/navigation.php,
+ views/default/river/elements/body.php,
+ views/default/river/elements/controls.php, views/default/river/item.php: Refs
+ #3073 first version of horizontal river menu. css still needs work for likes
+ and the comment text bubble needs to be darkened
+
+ * mod/externalpages/start.php, mod/reportedcontent/start.php,
+ views/default/css/elements/navigation.php: Fixes #3305 switched default and
+ alt sections for footer menu
+
+ * _graphics/elgg_sprites.png, engine/lib/users.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/css/elements/chrome.php, views/default/css/elements/icons.php,
+ views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php,
+ views/default/object/widget/elements/controls.php: Refs #3108 fixed widgets
+ for main site (not admin) and tweaked topbar
+
+2011-04-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/pages/file/world.php: removed unnecessary context setting
+
+ * .../views/default/groups/group_sort_menu.php: Fixes #3105 group sort menu
+ uses filter menu
+
+ * engine/lib/navigation.php, languages/en.php: better title attributes for
+ entity menu edit/delete links
+
+ * views/default/output/confirmlink.php: output/confirmlink now supports
+ title attribute
+
+ * views/default/output/access.php: cleaned up css for output/access
+
+ * mod/blog/start.php: Refs #3184 added span so that blog post status would
+ be vertically aligned
+
+ * _graphics/elgg_sprites.png, engine/lib/users.php,
+ views/default/css/elements/icons.php,
+ views/default/css/elements/navigation.php: Refs #3108 partial implementation
+ of new sprites (widgets, hover menu, search are all broken)
+
+ * mod/likes/languages/en.php, mod/likes/views/default/likes/display.php:
+ cleans up likes display which was causing issues in entity menu - less markup
+
+
+ * views/default/css/elements/navigation.php: Refs #3184 needed to set height
+ for the icons
+
+ * views/default/css/elements/navigation.php: Fixes #3184 fixed alignment
+ issues for entity menu
+
+ * views/default/css/elements/navigation.php: added spaces to standardize the
+ css statements
+
+2011-04-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/pages/search/index.php,
+ mod/search/views/default/search/search_box.php: Refs #3179 pulled fix for
+ search query encoding into trunk from 1.7 branch
+
+ * engine/lib/elgglib.php: Refs #3149 reimplemented fix for calling a handler
+ more than once in trunk
+
+ * .../views/default/uservalidationbyemail/js.php: Refs #3001 made comment
+ change in trunk from 1.7 fix
+
+ * mod/search/search_hooks.php: Refs #2994 added group search fix from 1.7
+ branch to trunk
+
+ * engine/classes/ElggRelationship.php: Refs #2988 corrected typo in trunk
+
+ * mod/invitefriends/start.php: Refs #2968 invite friends link should not be
+ available for non-logged in users
+
+ * engine/lib/extender.php: Refs #2878 fixes detect_extender_valuetype() in
+ trunk
+
+ * documentation/examples/crontab.example: updated crontab example
+ documentation
+
+ * engine/lib/entities.php: Refs #3277 merged fix for recursive delete and
+ disabled entities into trunk
+
+ * mod/groups/start.php, mod/groups/views/default/groups/side_menu.php: Fixes
+ #3104 updated groups plugin to use new menu system for sidebar
+
+ * mod/groups/lib/groups.php,
+ mod/groups/views/default/groups/profile/layout.php: moved group profile
+ layout out of page handler so that plugins can override it
+
+ * engine/classes/ElggEntity.php, engine/lib/entities.php,
+ mod/blog/actions/blog/save.php: Fixes #3208 setting time_created on update
+
+ * actions/admin/plugins/activate.php: Refs #3229 at least we can forward so
+ that user sees error message immediately
+
+ * actions/register.php, views/default/forms/register.php: Refs #3233
+ registration form should be sticky too
+
+ * actions/useradd.php, views/default/forms/useradd.php: Fixes #3233 useradd
+ form is now sticky
+
+ * engine/classes/ElggPluginManifest.php: Fixes #3244 fixed variable name in
+ ElggPluginManifest
+
+ * .../views/default/theme_preview/widgets.php: fixed typo in theme preview -
+ widgets
+
+2011-04-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/hooks.js: Returning false in JS hooks is now sent through to the
+ calling trigger. Null still returns the original value.
+
+ * js/lib/elgglib.js, js/lib/ui.js: Refs #3098. Changed elgg.getUrlFragment
+ to elgg.getSelectorFromUrlFragment to allow for better selectors.
+
+2011-04-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, languages/en.php, mod/members/languages/en.php,
+ mod/members/manifest.xml, mod/members/pages/members/index.php,
+ mod/members/pages/members/search.php, mod/members/start.php,
+ mod/members/views/default/members/nav.php,
+ mod/members/views/default/members/sidebar.php, pages/members/index.php,
+ pages/members/search.php, views/default/core/members/nav.php,
+ views/default/core/members/sidebar.php: Fixes #3231 welcome back, members
+ plugin
+
+ * engine/classes/ElggMenuItem.php: Refs #3287 setting null for menu href
+ means you want an empty <a></a> tag with no href
+
+ * engine/classes/ElggMenuItem.php, engine/lib/navigation.php: Fixes #3287
+ added documentation on non-link menu items
+
+ * engine/lib/metastrings.php: Refs #3245 pulling in
+ https://github.com/Elgg/Elgg/pull/11 and thanks also to gprasanth
+
+ * views/default/user/default.php: fixed hardcoded string in user/default
+ view
+
+ * mod/thewire/views/default/object/thewire.php: Refs #3200 any time a wire
+ post is displayed, we may need the 'previous' javascript
+
+ * mod/thewire/languages/en.php: added notification messages to the wire
+
+ * mod/bookmarks/start.php: Fixes #3044 removed bookmark link from user hover
+ menu
+
+ * engine/lib/users.php, views/default/forms/user/passwordreset.php: Fixes
+ #3207 passing code variable to form for password reset
+
+2011-03-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Refs #2940 added php settings comments into trunk
+
+2011-03-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Fixed ajax status for elgg.action().
+
+2011-03-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/js/thewire.js, mod/thewire/languages/en.php,
+ mod/thewire/start.php, mod/thewire/views/default/js/thewire.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/previous.php: Fixes #3200 ajax-based view
+ previous link works for the wire
+
+ * mod/thewire/pages/thewire/previous.php: Refs #3200 pulling in
+ e1d75071737b2ed35cf9 from anirupdutta's pull request
+
+2011-03-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, js/lib/ajax.js: Fixed auto-display of system
+ errors in ajax actions. Fixed docs for system_messages(). Blech...that needs
+ cleaned up.
+
+2011-03-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/user_settings.php, mod/notifications/groups.php,
+ mod/notifications/index.php, .../forms/notificationsettings/groupsave.php,
+ .../notifications/subscriptions/forminternals.php: Fixes #3266 let the
+ settings pages have breadcrumbs
+
+ * views/default/page/layouts/content.php,
+ views/default/page/layouts/one_sidebar.php: one_sidebar layout wants
+ breadcrumbs, too!
+
+ * views/default/css/elements/chrome.php: fixed some typos in css chrome
+
+2011-03-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Fixes #3234: Adding explicit collision param for popups.
+
+2011-03-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/lib/groups.php,
+ mod/groups/start.php, mod/groups/views/default/groups/sidebar/find.php: Fixes
+ #3243 pulled in anirupdutta's patch with some modifications (moved tag search
+ to its own page handler function)
+
+2011-03-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/css.php: made search box span sidebar in
+ default theme
+
+2011-03-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php: Fixing css/elgg instead of css/screen.
+
+2011-03-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, languages/en.php: Fixes #2591 removing newlines
+ in queries - thanks to Tachyon
+
+ * engine/lib/views.php: Refs #3085 updated elgg_view_annotation() to use
+ $vars array
+
+ * engine/lib/views.php: Refs #3085 added $vars array to
+ elgg_view_river_item()
+
+ * engine/lib/users.php, engine/lib/views.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/object/file.php, mod/groups/lib/groups.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ .../views/default/annotation/messageboard.php,
+ mod/messages/views/default/object/messages.php,
+ mod/pages/pages/pages/revision.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/annotation/generic_comment.php,
+ views/default/object/plugin.php, views/default/page/components/gallery.php,
+ views/default/page/components/list.php, views/json/entities/entity_list.php:
+ Fixes #3086 using full_view instead of full
+
+ * engine/lib/views.php: Refs #3086 adds backward compatibility code in
+ elgg_view() for full_view vs full
+
+ * mod/blog/views/default/blog/sidebar.php: Fixes #2969 turned off group blog
+ archives
+
+2011-03-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/configuration.php,
+ mod/diagnostics/start.php, mod/profile/start.php: Fixes #3250
+ elgg_get_root_path() to be consistent
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ engine/lib/actions.php: Fixes #3249 fixed name of actions exists function
+
+ * mod/messages/languages/en.php,
+ .../views/default/forms/messages/process.php,
+ mod/messages/views/default/messages/css.php: forcing a min-height on inbox
+ list in messages plugin
+
+ * views/default/css/admin.php, views/default/css/elements/layout.php: Fixes
+ #3084 added clearfix to elgg-layout
+
+ * views/default/css/elements/chrome.php: Fixes #3183 limiting size of user
+ inserted images in content
+
+ * mod/externalpages/languages/en.php, mod/externalpages/start.php,
+ .../views/default/admin/appearance/expages.php,
+ .../views/default/admin/site/expages.php,
+ mod/externalpages/views/default/expages/menu.php: Fixes #3106 putting
+ external pages under appearance - no better place
+
+ * engine/classes/ElggMenuBuilder.php, engine/lib/navigation.php,
+ engine/lib/views.php: Fixes #3026 documentation for menu system
+
+ * engine/lib/admin.php: Fixes #2233 added documentation on admin menus and
+ pages
+
+ * engine/lib/deprecated-1.8.php: Refs #3248 deprecates remove_submenu_item()
+
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggMetadata.php,
+ engine/lib/annotations.php: Refs #3238 #3246 anootations needed the same
+ fixes as metadata
+
+ * engine/lib/metadata.php: Refs #3238 fix for updating name of metadata for
+ trunk
+
+ * engine/classes/ElggMetadata.php: Fixes #3246 fixed ElggMetadata()
+ constructor
+
+ * engine/lib/pageowner.php: fixed notice in get_context() when no context is
+ set
+
+ * engine/lib/output.php, engine/lib/users.php, engine/lib/views.php,
+ engine/lib/widgets.php: some light standardization of the core libraries
+
+2011-03-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Fixes #3234, refs #3094. Added the inTarget code back to the
+ popup closing function.
+
+2011-03-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php, mod/thewire/actions/delete.php,
+ mod/thewire/classes/ElggWire.php, mod/thewire/languages/en.php,
+ mod/thewire/pages/thewire/everyone.php,
+ mod/thewire/pages/thewire/friends.php, mod/thewire/pages/thewire/owner.php,
+ mod/thewire/pages/thewire/reply.php, mod/thewire/pages/thewire/thread.php,
+ mod/thewire/start.php, mod/thewire/tests/regex.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/thewire/profile_status.php,
+ mod/thewire/views/rss/object/thewire.php: standardized thewire plugin
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/tests/api/annotations.php, engine/tests/api/metadata.php,
+ engine/tests/objects/metadata.php: Closes #3202 'count' already supported,
+ added unit tests
+
+ * mod/bookmarks/lib/bookmarks.php,
+ .../views/default/forms/bookmarks/save.php, mod/file/lib/file.php,
+ mod/groups/lib/discussion.php, mod/pages/lib/pages.php: Fixes #3239 entities
+ aren't blown away in form prepare functions any more
+
+ * mod/pages/languages/en.php: fixed language strings in pages plugin
+
+ * mod/file/actions/file/upload.php: don't allow a user to remove a title on
+ a file, must replace with another title
+
+ * engine/lib/input.php, mod/blog/lib/blog.php: Refs #3239 added a new sticky
+ forms function to grab all variables and integrated into blog plugin
+
+2011-03-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/reset.php: Refs
+ #2979 forces vertical scrollbar without breaking widget dragging
+
+ * engine/lib/navigation.php: Refs #3119 if only one item left, move it off
+ more menu (but only when nothing selected)
+
+ * actions/admin/menu/save.php, views/default/forms/admin/menu/save.php:
+ Fixes #3206 using space so that echo('none') is not passed as value
+
+ * views/default/css/admin.php: Refs #3236 removed some unused css from admin
+ theme and did some reorganizing
+
+2011-03-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/languages/en.php: added missing language string for comments on
+ file in river
+
+ * engine/lib/views.php: Fixes #3166 registering css/elgg for simplecache
+
+2011-03-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Refs #3193 rollback version number
+
+ * upgrade.php: display_errors is on for upgrades
+
+ * ...svn-update_default_widgets-7daf5a459720d06d.php, version.php: Fixes
+ #3193 converts the default widgets for 1.8 - leaves behind the default
+ widgets object
+
+ * engine/lib/admin.php, views/default/css/admin.php: Refs #3165 floating
+ admin widgets in same direction as profile widgets
+
+ * ....8_svn-admins_like_widgets-7f19d2783c1680d3.php, version.php: Fixes
+ #3165 admins get widgets on upgrade - new upgrade creation process super
+ smooth #thanksBrett
+
+ * engine/lib/admin.php, engine/lib/users.php, install/ElggInstaller.php:
+ Refs #3165 new admin users all get admin widgets
+
+ * engine/classes/ElggFile.php: Fixes #3160 just needed a small variation off
+ of [8762] to handle getting filestore before metadata is set but after the
+ guid is set
+
+ * engine/classes/ElggFile.php: Fixes #3205 reverting [8762]
+
+ * engine/lib/elgglib.php: Fixes #3180 adds ajax page handler
+
+ * mod/bookmarks/start.php, mod/thewire/start.php: added an owner block link
+ for the wire plugin
+
+ * languages/en.php, mod/blog/languages/en.php, mod/blog/lib/blog.php,
+ mod/bookmarks/pages/bookmarks/all.php, mod/bookmarks/start.php,
+ mod/file/pages/file/owner.php, mod/groups/languages/en.php,
+ mod/pages/languages/en.php, views/default/page/layouts/content/header.php:
+ Fixes #3218 group content pages now use container method to determine who can
+ add content
+
+2011-03-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/pages/views/default/forms/pages/edit.php: fixed position of longtext
+ menu when editing pages
+
+ * mod/bookmarks/languages/en.php: better names for a bookmark - got rid of
+ 'bookmark item'
+
+ * mod/bookmarks/views/default/bookmarks/sidebar.php,
+ mod/file/views/default/file/sidebar.php,
+ mod/pages/views/default/pages/sidebar.php,
+ mod/thewire/pages/thewire/everyone.php, mod/thewire/pages/thewire/owner.php,
+ mod/thewire/views/default/thewire/sidebar.php: Fixes #2091 completes sidebar
+ tagcloud for major content plugins
+
+ * engine/lib/tags.php, mod/blog/views/default/blog/sidebar.php,
+ mod/blog/views/default/blog/sidebar/tagcloud.php,
+ views/default/output/tagcloud.php,
+ views/default/page/elements/tagcloud_block.php: Refs #2091 added a tagcloud
+ block that accepts subtype
+
+ * views/default/page/elements/comments_block.php: Fixes #2090 context
+ sensitive sidebar box is added - groups off
+
+ * mod/bookmarks/views/default/bookmarks/js.php,
+ mod/groups/views/default/groups/js.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ mod/messages/views/default/messages/js.php,
+ .../views/default/uservalidationbyemail/js.php: Refs #3016 making the final
+ elgg.js more readable
+
+ * .../views/default/uservalidationbyemail/js.php: another example of an
+ extra ; in js due to lazy copy/paste jobs
+
+ * mod/file/pages/file/owner.php, mod/file/pages/file/world.php,
+ mod/file/views/default/file/sidebar.php, mod/pages/pages/pages/owner.php,
+ mod/pages/pages/pages/world.php, mod/pages/views/default/pages/sidebar.php,
+ views/default/page/elements/comments_block.php: Refs #2090 added sidebar
+ comment block to file and pages plugins
+
+ * mod/file/start.php, mod/pages/start.php: Refs #3176 missed group owner
+ page in script renaming
+
+2011-03-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, vendors/jquery/fancybox/blank.gif,
+ vendors/jquery/fancybox/fancy_close.png,
+ vendors/jquery/fancybox/fancy_loading.png,
+ vendors/jquery/fancybox/fancy_nav_left.png,
+ vendors/jquery/fancybox/fancy_nav_right.png,
+ vendors/jquery/fancybox/fancy_shadow_e.png,
+ vendors/jquery/fancybox/fancy_shadow_n.png,
+ vendors/jquery/fancybox/fancy_shadow_ne.png,
+ vendors/jquery/fancybox/fancy_shadow_nw.png,
+ vendors/jquery/fancybox/fancy_shadow_s.png,
+ vendors/jquery/fancybox/fancy_shadow_se.png,
+ vendors/jquery/fancybox/fancy_shadow_sw.png,
+ vendors/jquery/fancybox/fancy_shadow_w.png,
+ vendors/jquery/fancybox/fancy_title_left.png,
+ vendors/jquery/fancybox/fancy_title_main.png,
+ vendors/jquery/fancybox/fancy_title_over.png,
+ vendors/jquery/fancybox/fancy_title_right.png,
+ vendors/jquery/fancybox/fancybox-x.png,
+ vendors/jquery/fancybox/fancybox-y.png, vendors/jquery/fancybox/fancybox.png,
+ vendors/jquery/fancybox/jquery.easing-1.3.pack.js,
+ vendors/jquery/fancybox/jquery.fancybox-1.3.4.css,
+ vendors/jquery/fancybox/jquery.fancybox-1.3.4.js,
+ .../jquery/fancybox/jquery.fancybox-1.3.4.pack.js,
+ .../fancybox/jquery.mousewheel-3.0.4.pack.js, views/default/js/lightbox.php:
+ Refs #2882 basic lightbox
+
+2011-03-21 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: No need to document NULL as possible return value
+ here
+
+ * engine/classes/ElggEntity.php: oof -- how did that happen?
+
+ * engine/classes/ElggEntity.php: Added documentation of magic properties to
+ ElggEntity
+
+2011-03-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/views/default/logbrowser/table.php: using - in log browser
+ css class names
+
+ * mod/bookmarks/languages/en.php: added missing language string
+
+ * mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/owner.php,
+ mod/bookmarks/views/default/bookmarks/sidebar.php: Refs #2090 added latest
+ comments to bookmarks sidebar
+
+ * engine/lib/views.php, languages/en.php,
+ mod/blog/views/default/blog/sidebar.php,
+ views/default/page/elements/comments.php,
+ views/default/page/elements/comments_block.php: Refs #2090 removed
+ elgg_view_latest_comments() and replaced it with a page elements view
+
+ * mod/groups/lib/groups.php,
+ mod/groups/views/default/groups/profile/fields.php,
+ .../views/default/groups/profile/profile_block.php,
+ .../views/default/groups/profile/summary.php: Fixes #3113 pulled group
+ profile fields out of top profile area
+
+ * views/default/admin/appearance/profile_fields.php: Fixes #3099 corrected
+ view name
+
+ * mod/logbrowser/views/default/logbrowser/form.php: Fixes #3082 fixed
+ toggler in log browser
+
+ * views/default/navigation/menu/user_hover.php: Fixes #3203 not calling the
+ view menu section code once per item
+
+ * views/default/page/layouts/widgets.php: Fixes #3168 not displaying a
+ widget when handler is not available
+
+2011-03-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggObject.php, mod/blog/lib/blog.php,
+ mod/groups/actions/discussion/reply/save.php,
+ mod/groups/actions/discussion/save.php, mod/groups/languages/en.php,
+ mod/groups/lib/discussion.php, mod/groups/start.php,
+ .../river/object/groupforumtopic/create.php: Fixes #2974 using
+ canWriteToContainer() to control access to creating group content
+
+ * install/ElggInstaller.php: Fixes #3101 removed language setting from
+ installer until we provide language files besides English
+
+ * .../forms/admin/plugins/simple_update_states.php: Fixes #3102 removed
+ plugin reset button
+
+ * views/default/forms/admin/site/update_advanced.php: Fixes #3100 removed
+ viewtype from advanced settings
+
+ * install/ElggInstaller.php, install/languages/en.php: Fixes #3062 checks if
+ data directory exists
+
+2011-03-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Fixes #3094. Removed event blocking code for popups.
+
+ * ..._svn-widgets_arent_plugins-61836261fa280a5c.php, version.php: Fixes
+ #3161. Added upgrade to update object, widget to ElggWidget.
+
+2011-03-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, mod/twitter/start.php: Refs #3171 Using correct
+ widget registration method
+
+2011-03-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/version.php: Fixes #3188. We no longer store the version as the
+ key, so a standard sort will do.
+
+2011-03-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, pages/river.php, views/rss/core/river/body.php,
+ views/rss/river/item.php, views/rss/river/item/list.php: Fixes #3197 fixed
+ the RSS feed for activity (river)
+
+ * views/rss/layout/objects/image_block.php,
+ views/rss/layout/objects/list.php, views/rss/layout/shells/default.php,
+ views/rss/page/components/image_block.php,
+ views/rss/page/components/list.php, views/rss/page/layouts/default.php: Refs
+ #3197 fixed layout views for RSS viewtype
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/sites.php,
+ engine/lib/users.php, engine/lib/views.php,
+ views/default/page/elements/sidebar.php: Fixes #3114 added the rss link back
+ to pages
+
+ * engine/lib/admin.php: Refs #2892 added elgg_get_admins() function - this
+ could eventually be a wrapper around elgg_get_users()
+
+ * mod/thewire/start.php: Fixes #3025 added back thewire's entity menu items
+
+ * engine/lib/elgglib.php: Fixes #3198 handling exceptions thrown in
+ exception handler by pointing to the error log
+
+2011-03-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php: Fixes #3192, refs #650.
+ ElggEntity->getMetaData() sets the limit to 0 for array-based metadata.
+
+ * engine/lib/deprecated-1.8.php: Fixes #3190. Added elgg_count_comments() to
+ deprecated-1.8.php.
+
+ * upgrade.php: Fixes #3064. Can't use the pretty new views to display the
+ can't upgrade messages. Using the failsafe view type.
+
+2011-03-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * ...031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php: Refs #3188 removed
+ empty call for guid
+
+ * languages/en.php: Fixes #3162
+
+2011-03-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/widgets/friends/content.php,
+ views/default/widgets/new_users/content.php,
+ views/default/widgets/online_users/content.php: added documentation headers
+ to the core widgets
+
+ * engine/lib/river.php, languages/en.php,
+ views/default/widgets/river_widget/content.php,
+ views/default/widgets/river_widget/edit.php: Fixes #3171 added river widget
+ using same name as 1.7 riverdashboard plugin
+
+ * actions/friends/add.php: Fixes #3167 friending now shows up in river
+
+ * mod/twitter/manifest.xml: added "widget" to this plugin's name to
+ descrease confusion with the api plugin
+
+ * languages/en.php, mod/profile/views/default/profile/owner_block.php: Fixes
+ #3173 quote was missing from conversion to new toggler pattern
+
+ * mod/file/pages/file/index.php, mod/file/pages/file/owner.php,
+ mod/file/start.php, mod/pages/pages/pages/index.php,
+ mod/pages/pages/pages/owner.php, mod/pages/start.php,
+ mod/thewire/pages/thewire/owner.php, mod/thewire/pages/thewire/user.php,
+ mod/thewire/start.php: Fixes #3176 replaced usage of index.php where
+ appropriate
+
+ * mod/pages/edit.php, mod/pages/friends.php, mod/pages/history.php,
+ mod/pages/index.php, mod/pages/new.php, mod/pages/pages/pages/edit.php,
+ mod/pages/pages/pages/friends.php, mod/pages/pages/pages/history.php,
+ mod/pages/pages/pages/index.php, mod/pages/pages/pages/new.php,
+ mod/pages/pages/pages/revision.php, mod/pages/pages/pages/view.php,
+ mod/pages/pages/pages/world.php, mod/pages/revision.php, mod/pages/start.php,
+ mod/pages/view.php, mod/pages/world.php, mod/search/index.php,
+ mod/search/pages/search/index.php, mod/search/start.php: Fixes #3158 updated
+ search and pages plugins for page handler scripts
+
+ * mod/messages/inbox.php, mod/messages/pages/messages/inbox.php,
+ mod/messages/pages/messages/read.php, mod/messages/pages/messages/send.php,
+ mod/messages/pages/messages/sent.php, mod/messages/read.php,
+ mod/messages/send.php, mod/messages/sent.php, mod/messages/start.php: Refs
+ #3158 update messages plugin
+
+ * mod/messageboard/pages/messageboard/owner.php,
+ mod/messageboard/pages/owner.php, mod/messageboard/start.php: Refs #3158
+ Fixes #3170 namespaces messageboard plugin page scripts
+
+ * mod/file/edit.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/pages/file/edit.php, mod/file/pages/file/friends.php,
+ mod/file/pages/file/index.php, mod/file/pages/file/search.php,
+ mod/file/pages/file/upload.php, mod/file/pages/file/view.php,
+ mod/file/pages/file/world.php, mod/file/search.php, mod/file/start.php,
+ mod/file/upload.php, mod/file/view.php,
+ mod/file/views/default/file/typecloud.php, mod/file/world.php: Refs #3158
+ namespace file plugin's page scripts
+
+2011-03-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/forms/register.php: using shorthand for document ready
+ callback
+
+2011-03-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/start.php: Fixes #3164. Denormalized unread message counting
+ query because it was making things so slow I couldn't test.
+
+ * engine/classes/ElggFile.php: Fixes #3160. ElggFile->getFilehandler() is
+ less horrible.
+
+ * engine/lib/metastrings.php: Fixing pluralization of singular options for
+ elgg_get_metadata() and elgg_get_annotations().
+
+2011-03-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/pages/add.php, mod/bookmarks/pages/all.php,
+ mod/bookmarks/pages/bookmarklet.php, mod/bookmarks/pages/bookmarks/add.php,
+ mod/bookmarks/pages/bookmarks/all.php,
+ mod/bookmarks/pages/bookmarks/bookmarklet.php,
+ mod/bookmarks/pages/bookmarks/edit.php,
+ mod/bookmarks/pages/bookmarks/friends.php,
+ mod/bookmarks/pages/bookmarks/owner.php,
+ mod/bookmarks/pages/bookmarks/view.php, mod/bookmarks/pages/edit.php,
+ mod/bookmarks/pages/friends.php, mod/bookmarks/pages/owner.php,
+ mod/bookmarks/pages/view.php, mod/bookmarks/start.php,
+ mod/thewire/pages/everyone.php, mod/thewire/pages/friends.php,
+ mod/thewire/pages/previous.php, mod/thewire/pages/reply.php,
+ mod/thewire/pages/tag.php, mod/thewire/pages/thewire/everyone.php,
+ mod/thewire/pages/thewire/friends.php,
+ mod/thewire/pages/thewire/previous.php, mod/thewire/pages/thewire/reply.php,
+ mod/thewire/pages/thewire/tag.php, mod/thewire/pages/thewire/thread.php,
+ mod/thewire/pages/thewire/user.php, mod/thewire/pages/thread.php,
+ mod/thewire/pages/user.php, mod/thewire/start.php: Refs #3158 namespaced
+ pages for bookmarks and thewire
+
+2011-03-17 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/forminternals.php: Using shorthand
+ document ready initialization
+
+ * mod/embed/views/default/embed/embed.php: Switching click handler to "live"
+
+2011-03-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: fixed typo in welcome widget text
+
+ * engine/lib/system_log.php: Refs #3154 adding system log cache bug fix to
+ trunk
+
+ * engine/lib/system_log.php: Fixes #3098 catching exceptions when loading an
+ object in system log
+
+2011-03-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Fixes #3094, Refs #3111. Clicking outside a popup closes the
+ visible popups.
+
+ * views/default/css/admin.php: elgg-head is no longer the direct child of
+ elgg-state-draggable. Restoring dragger icon for plugins.
+
+ * mod/blog/languages/en.php: Added missing language string.
+
+ * install/ElggInstaller.php: Changed order of the default admin widgets.
+
+ * engine/lib/cache.php, engine/lib/configuration.php,
+ ...-1.8_svn-datalist_grows_up-0b8aec5a55cc1e1c.php, engine/schema/mysql.sql,
+ version.php: Fixes #3123. Datalists and config names can now be up to 255
+ chars long. Debug mode is disabled when caching views to avoid saving bad
+ stuff.
+
+ * mod/likes/start.php: Fixes #3153. Fixed incorrect options.
+
+ * views/default/forms/comments/add.php,
+ views/default/river/elements/body.php: Fixes #3130. Fixed river/item/footer
+ -> river/elements/footer for comments.
+
+ * mod/twitter_api/lib/twitter_api.php: Fixes #2416. Twitter API pulls in
+ avatars from twitter for new users.
+
+ * ...031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php,
+ ...11031400-1.8_svn-oauth_api-8f33ee79c3e66222.php, languages/en.php,
+ mod/oauth_api/manifest.xml, mod/twitter_api/manifest.xml: Fixes #3141.
+ Disabling twitter_api and oauth_api upon upgrade because we can't check
+ previous states. Adding an admin notice. twitter_api conflicts with
+ twitterservice and oauth_api conflicts with oauth_lib.
+
+ * views/default/object/admin_notice.php: Refs #2242: Better placement for
+ the delete button for admin notices.
+
+ * engine/lib/plugins.php: Fixed a typo that broke ignore access. That was
+ fun to track down >:O
+
+ * views/default/object/admin_notice.php: Refs #2242. Removed incorrect
+ option passed to url view.
+
+ * actions/admin/delete_admin_notice.php, engine/lib/admin.php,
+ languages/en.php, views/default/css/admin.php, views/default/js/admin.php,
+ views/default/object/admin_notice.php, views/default/page/admin.php: Fixes
+ #2242. Can now delete admin notices manually.
+
+2011-03-16 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Fixes #3066 moves setting of lastcache value up in boot
+ sequence
+
+ * engine/classes/ElggMenuBuilder.php: Fixes #3145 adds a default for menu
+ sort_by
+
+ * index.php: Fixes #3144 not using undefined $options variable
+
+2011-03-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * ...031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php,
+ ...11031400-1.8_svn-oauth_api-8f33ee79c3e66222.php: Fixes #3141. Fixed
+ twitter_api and oauth_api upgrades. Only worked on localhost because of code
+ gnomes.
+
+2011-03-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * ...11031400-1.8_svn-oauth_api-8f33ee79c3e66222.php: Fixes #3129. Fixed
+ faulty logic that broke upgrades.
+
+2011-03-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #2814 can now check if an entity exists
+ indepedent of access permissions
+
+2011-03-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ajax.js, js/lib/configuration.js, js/lib/security.js,
+ languages/en.php, views/default/js/elgg.php: Refs #2538. Loading
+ js/configuration.js again. Only updating tokens on success and showing a
+ basic warning if refresh fails.
+
+ * js/lib/languages.js: JS elgg.echo() returns the key if the string isn't
+ found. This is consistent with the PHP version.
+
+ * js/classes/ElggPriorityList.js, js/lib/elgglib.js, js/lib/hooks.js,
+ js/lib/languages.js, js/lib/prototypes.js, js/lib/security.js,
+ js/lib/session.js, js/lib/ui.js, js/lib/userpicker.js: Refs #2538: Added
+ documentation to most of the JS methods missing it.
+
+ * mod/oauth_api/manifest.xml, mod/oauth_api/start.php,
+ mod/oauth_api/vendors/oauth/LICENSE,
+ mod/oauth_api/vendors/oauth/example/server/INSTALL,
+ .../vendors/oauth/example/server/core/init.php,
+ .../example/server/core/templates/inc/footer.tpl,
+ .../example/server/core/templates/inc/header.tpl,
+ .../oauth/example/server/core/templates/index.tpl,
+ .../oauth/example/server/core/templates/logon.tpl,
+ .../example/server/core/templates/register.tpl,
+ .../vendors/oauth/example/server/www/hello.php,
+ .../vendors/oauth/example/server/www/index.php,
+ .../vendors/oauth/example/server/www/logon.php,
+ .../vendors/oauth/example/server/www/oauth.php,
+ .../vendors/oauth/example/server/www/register.php,
+ .../oauth/example/server/www/services.xrds.php,
+ .../vendors/oauth/library/OAuthDiscovery.php,
+ .../vendors/oauth/library/OAuthException.php,
+ .../vendors/oauth/library/OAuthRequest.php,
+ .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ .../vendors/oauth/library/OAuthRequester.php,
+ .../vendors/oauth/library/OAuthServer.php,
+ mod/oauth_api/vendors/oauth/library/OAuthStore.php,
+ .../library/body/OAuthBodyContentDisposition.php,
+ .../library/body/OAuthBodyMultipartFormdata.php,
+ .../vendors/oauth/library/discovery/xrds_parse.php,
+ .../vendors/oauth/library/discovery/xrds_parse.txt,
+ .../OAuthSignatureMethod.class.php, .../OAuthSignatureMethod_HMAC_SHA1.php,
+ .../signature_method/OAuthSignatureMethod_MD5.php,
+ .../OAuthSignatureMethod_PLAINTEXT.php,
+ .../OAuthSignatureMethod_RSA_SHA1.php,
+ .../library/store/OAuthStoreAbstract.class.php,
+ .../oauth/library/store/OAuthStoreAnyMeta.php,
+ .../oauth/library/store/OAuthStoreMySQL.php,
+ .../vendors/oauth/library/store/mysql/install.php,
+ .../vendors/oauth/library/store/mysql/mysql.sql,
+ .../oauth/test/discovery/xrds-fireeagle.xrds,
+ .../oauth/test/discovery/xrds-getsatisfaction.xrds,
+ .../oauth/test/discovery/xrds-magnolia.xrds,
+ mod/oauth_api/vendors/oauth/test/oauth_test.php, mod/oauth_lib/manifest.xml,
+ mod/oauth_lib/start.php, mod/oauth_lib/vendors/oauth/LICENSE,
+ mod/oauth_lib/vendors/oauth/example/server/INSTALL,
+ .../vendors/oauth/example/server/core/init.php,
+ .../example/server/core/templates/inc/footer.tpl,
+ .../example/server/core/templates/inc/header.tpl,
+ .../oauth/example/server/core/templates/index.tpl,
+ .../oauth/example/server/core/templates/logon.tpl,
+ .../example/server/core/templates/register.tpl,
+ .../vendors/oauth/example/server/www/hello.php,
+ .../vendors/oauth/example/server/www/index.php,
+ .../vendors/oauth/example/server/www/logon.php,
+ .../vendors/oauth/example/server/www/oauth.php,
+ .../vendors/oauth/example/server/www/register.php,
+ .../oauth/example/server/www/services.xrds.php,
+ .../vendors/oauth/library/OAuthDiscovery.php,
+ .../vendors/oauth/library/OAuthException.php,
+ .../vendors/oauth/library/OAuthRequest.php,
+ .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ .../vendors/oauth/library/OAuthRequester.php,
+ .../vendors/oauth/library/OAuthServer.php,
+ mod/oauth_lib/vendors/oauth/library/OAuthStore.php,
+ .../library/body/OAuthBodyContentDisposition.php,
+ .../library/body/OAuthBodyMultipartFormdata.php,
+ .../vendors/oauth/library/discovery/xrds_parse.php,
+ .../vendors/oauth/library/discovery/xrds_parse.txt,
+ .../OAuthSignatureMethod.class.php, .../OAuthSignatureMethod_HMAC_SHA1.php,
+ .../signature_method/OAuthSignatureMethod_MD5.php,
+ .../OAuthSignatureMethod_PLAINTEXT.php,
+ .../OAuthSignatureMethod_RSA_SHA1.php,
+ .../library/store/OAuthStoreAbstract.class.php,
+ .../oauth/library/store/OAuthStoreAnyMeta.php,
+ .../oauth/library/store/OAuthStoreMySQL.php,
+ .../vendors/oauth/library/store/mysql/install.php,
+ .../vendors/oauth/library/store/mysql/mysql.sql,
+ .../oauth/test/discovery/xrds-fireeagle.xrds,
+ .../oauth/test/discovery/xrds-getsatisfaction.xrds,
+ .../oauth/test/discovery/xrds-magnolia.xrds,
+ mod/oauth_lib/vendors/oauth/test/oauth_test.php,
+ mod/twitter_api/manifest.xml: Refs #3115. Moved oauth_lib to oauth_api.
+
+ * engine/lib/version.php: Refs #1433. Restored db_upgrade() call during
+ upgrades to fix issues for people upgrading from earlier versions of 1.7 than
+ 2010062401. This is why we should follow deprecation policies, Brett........
+
+2011-03-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php, mod/developers/manifest.xml,
+ mod/developers/start.php, .../views/default/admin/developers/settings.php,
+ .../views/default/forms/developers/settings.php: Fixes #3009 a bare bones
+ developer tools settings
+
+2011-03-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/js/embed.js, mod/embed/start.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/embed/lightbox_init.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/file/views/default/file/embed_upload.php, mod/groups/start.php,
+ mod/groups/views/default/groups/js.php,
+ .../views/default/groups/profile/widgets.php, mod/messages/start.php,
+ .../views/default/forms/messages/process.php,
+ .../views/default/forms/messages/reply.php,
+ mod/messages/views/default/messages/js.php, mod/profile/start.php,
+ mod/profile/views/default/profile/js.php,
+ mod/profile/views/default/profile/wrapper.php, mod/thewire/start.php,
+ mod/thewire/views/default/forms/thewire/add.php,
+ views/default/css/elements/buttons.php: Refs #3016: Removes inline javascript
+ from embed, file, groups, messages, profile, thewire
+
+ * views/default/css/admin.php, views/default/css/elements/icons.php,
+ views/default/css/elements/modules.php,
+ views/default/object/widget/elements/controls.php: Refs #3112: Pulled out
+ widget gear icon into elgg-icon-gear, which widgets now use
+
+2011-03-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginPackage.php,
+ languages/en.php, views/default/admin/plugins/advanced.php,
+ views/default/object/plugin/invalid.php: Fixes #2928: Invalid plugins are
+ shown on the advance page with details about the problem and a link to the
+ docs.
+
+2011-03-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/layout.php: Refs
+ #3109: Fixes 3 more instances of background-color being used when background
+ should be
+
+ * .../views/default/theme_preview/navigation.php,
+ mod/embed/views/default/embed/css.php,
+ mod/search/views/default/search/css.php,
+ mod/thewire/views/default/thewire/css.php, views/default/css/admin.php,
+ views/default/css/elements/buttons.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/forms.php, views/default/css/elements/icons.php,
+ views/default/css/elements/layout.php, views/default/css/elements/misc.php,
+ views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php: Refs #3109: More CSS cleanup.
+ Fixes bugs introduced by last cleanup where background-color: was being used
+ instead of background:
+
+2011-03-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, engine/lib/plugins.php: Refs #3079: Making
+ sure elgg_get_max_plugin_priority() returns 1 instead. Fixed problems when
+ bootstrapping elgg plugins. Will perform tests against MySQL 5.5 when I have
+ a real internet connection.
+
+2011-03-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CODING.txt: Using tabs instead of spaces to indent lines in CODING.txt
+
+ * install/css/install.css, .../views/default/custom_index/css.php,
+ mod/embed/views/default/embed/css.php,
+ mod/groups/views/default/groups/css.php,
+ mod/messages/views/default/messages/css.php,
+ mod/profile/views/default/profile/css.php,
+ .../views/default/reportedcontent/admin_css.php,
+ mod/search/views/default/search/css.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ mod/twitter/views/default/twitter/css.php, views/default/css/admin.php,
+ views/default/css/elements/buttons.php,
+ views/default/css/elements/chrome.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/forms.php, views/default/css/elements/icons.php,
+ views/default/css/elements/misc.php, views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php: Fixes #3109: added
+ non-vendor-prefixed css property declarations where applicable. Cleaned up
+ various other aspects of the css
+
+ * engine/handlers/page_handler.php: Fixes #3080: Move redirect code to
+ before engine inclusion
+
+2011-03-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixes #3121 array_filter() passes array elements
+ to callback
+
+2011-03-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/menu/page.php: Fixes #3103. Re-added code
+ accidentally removed in r8611 that broke page menu selected items.
+
+ * ...031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php,
+ mod/twitter_api/graphics/sign_in_with_twitter.gif,
+ mod/twitter_api/languages/en.php, mod/twitter_api/lib/twitter_api.php,
+ mod/twitter_api/manifest.xml, mod/twitter_api/start.php,
+ mod/twitter_api/vendors/twitteroauth/LICENSE,
+ mod/twitter_api/vendors/twitteroauth/OAuth.php,
+ mod/twitter_api/vendors/twitteroauth/README,
+ .../vendors/twitteroauth/twitterOAuth.php,
+ .../views/default/settings/twitter_api/edit.php,
+ mod/twitter_api/views/default/twitter_api/css.php,
+ .../views/default/twitter_api/login.php,
+ .../views/default/twitter_api/metatags.php,
+ .../default/usersettings/twitter_api/edit.php,
+ .../graphics/sign_in_with_twitter.gif, mod/twitterservice/languages/en.php,
+ mod/twitterservice/manifest.xml, mod/twitterservice/start.php,
+ mod/twitterservice/twitterservice_lib.php,
+ mod/twitterservice/vendors/twitteroauth/LICENSE,
+ mod/twitterservice/vendors/twitteroauth/OAuth.php,
+ mod/twitterservice/vendors/twitteroauth/README,
+ .../vendors/twitteroauth/twitterOAuth.php,
+ .../views/default/settings/twitterservice/edit.php,
+ .../views/default/twitterservice/css.php,
+ .../views/default/twitterservice/login.php,
+ .../views/default/twitterservice/metatags.php,
+ .../default/usersettings/twitterservice/edit.php, version.php: Refs #3115.
+ Migrated twitterservice to twitter_api. Added upgrade to migrate plugin and
+ user settings.
+
+2011-03-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/start.php: fixed WSOD because of function name change when
+ using some 1.7 themes
+
+ * engine/lib/views.php: Refs #3059 should only fallback to 1.7 pageshell
+ when asking for default page shell - otherwise breaks admin area
+
+ * engine/lib/deprecated-1.8.php: Fixes #3116 old method of getting site menu
+ works again
+
+ * engine/handlers/page_handler.php: Refs #2228 reverting [8654] so
+ forwarding works
+
+ * languages/en.php: Reverted changes made for elgg.com on Tools menu
+
+2011-03-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php: Refs #3079: Better checks in
+ ElggPlugin::setPriority() to avoid priorities of 0. Still requires testing
+ for MySQL 5.5.
+
+ * languages/en.php: Refs #3009. Fixed a few typos and inaccuracies in the
+ welcome widget.
+
+2011-03-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/likes/views/default/likes/display.php: tweaked an id so that the likes
+ html would be valid
+
+ * views/default/page/elements/footer.php: how did that get there - removing
+ some test code
+
+ * js/lib/ui.js: Fixes #3110 - checking selector before running date picker
+ js
+
+ * .../views/default/admin/utilities/diagnostics.php,
+ .../views/default/diagnostics/forms/download.php: wrapped the submit button
+ in diagnostics plugin with a <p> so the bottom doesn't get cut off
+
+ * languages/en.php: Refs #2991 restored plugin settings language string
+ needed for page title
+
+ * languages/en.php: fixed typo in site settings
+
+ * .../views/default/groups/sidebar/members.php: Fixes #3072 using
+ elgg_list_entities*() in group members sidebar view
+
+ * mod/groups/languages/en.php, mod/groups/lib/groups.php: displaying a no
+ activity message on the activity page for new groups
+
+ * mod/pages/world.php: added text to pages plugin for case where no pages
+ have been created on site
+
+ * mod/file/index.php: fixed typo in file index.php
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/object/default.php,
+ views/default/page/components/list/body.php,
+ views/default/page/components/summary.php, views/default/user/default.php:
+ Refs #3096 using 'summary' instead of list/body
+
+2011-03-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/elements/body.php,
+ views/default/river/elements/controls.php,
+ views/default/river/elements/footer.php,
+ views/default/river/elements/image.php, views/default/river/item.php,
+ views/default/river/item/body.php, views/default/river/item/controls.php,
+ views/default/river/item/footer.php, views/default/river/item/image.php:
+ somehow we forgot to use 'elements' in river views
+
+2011-03-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, upgrade.php, views/default/page/upgrade.php: Fixes
+ #3064. Checking for views/default/welcome.php and aborting upgrade if found.
+ Need to add documention for how to replace views directory to wiki. Also
+ fixed ajax loader during upgrade.
+
+2011-03-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggUser.php, mod/custom_index/index.php,
+ views/default/widgets/friends/content.php: Fixes #3045 custom index and the
+ friends widget now use the gallery view for user icons
+
+ * engine/lib/views.php, views/default/page/components/gallery.php,
+ views/default/page/components/list.php, views/default/user/default.php: Refs
+ #3045 adds a gallery context based view for users
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/views.php,
+ engine/tests/api/helpers.php, mod/blog/lib/blog.php, mod/blog/start.php,
+ .../views/default/page/theme_preview.php, mod/notifications/index.php,
+ .../notifications/subscriptions/forminternals.php, mod/pages/start.php,
+ mod/tinymce/start.php, mod/tinymce/views/default/tinymce/init.php,
+ mod/zaudio/start.php, mod/zaudio/views/default/zaudio/audioplayer.php,
+ views/default/input/autocomplete.php, views/default/input/friendspicker.php,
+ views/default/input/userpicker.php, views/default/page/elements/head.php:
+ Fixes #3091 adds load functions for js and css
+
+2011-03-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php: Fixed #3093: Admin link shows only for admin users.
+
+ * languages/en.php: Fixes #3004: Updated admin widget text to reflect menu
+ changes.
+
+ * mod/blog/views/default/blog/sidebar/revisions.php: Fixed blog revision
+ links.
+
+ * js/lib/autocomplete.js, js/lib/elgglib.js, js/lib/events.js,
+ js/lib/hooks.js, js/lib/languages.js, js/lib/security.js, js/lib/ui.js,
+ js/lib/ui.widgets.js, js/lib/userpicker.js, js/tests/ElggEventsTest.js,
+ js/tests/ElggHooksTest.js, mod/blog/views/default/js/blog/save_draft.php,
+ mod/bookmarks/views/default/bookmarks/js.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ mod/tinymce/views/default/js/tinymce.php,
+ .../views/default/uservalidationbyemail/js.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/river/filter.php, views/default/js/admin.php,
+ views/default/js/elgg.php: Fixes #3065, #3089. Merged JS events and hooks to
+ a single system. Updated plugins and core to use it. Added
+ elgg.getURLFragment() and using it elgg.ui.popsUp().
+
+2011-03-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/admin.php, views/default/page/default.php: forgot to
+ include js registered for the footer in page shells
+
+ * engine/lib/elgglib.php, engine/tests/api/helpers.php: Refs #3091
+ registering js and css support priority though does not maintain registration
+ order if items have equal priority
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/views.php,
+ engine/tests/api/helpers.php, mod/blog/lib/blog.php,
+ mod/notifications/index.php,
+ .../notifications/subscriptions/forminternals.php, mod/pages/start.php,
+ mod/tinymce/views/default/tinymce/init.php,
+ mod/zaudio/views/default/zaudio/audioplayer.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/input/autocomplete.php, views/default/input/friendspicker.php,
+ views/default/input/userpicker.php, views/default/page/components/list.php:
+ Refs #3091 rewrote the js and css register functions to require a name
+
+ * mod/blog/views/default/blog/group_module.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ mod/pages/views/default/pages/group_module.php: Fixes #3071 group "widgets"
+ check permissions now
+
+2011-03-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/widgets.php,
+ views/default/admin/appearance/default_widgets.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/appearance/profile_fields.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/admin/settings/default_widgets.php,
+ views/default/admin/settings/menu_items.php,
+ views/default/admin/settings/profile_fields.php,
+ .../default/admin/settings/profile_fields/list.php,
+ views/default/css/admin.php, views/default/js/admin.php: Refs #2991: Readded
+ the appearance menu under configure. Moved plugin settings under
+ configure/settings.
+
+ * engine/lib/admin.php, languages/en.php, views/default/admin/sidebar.php,
+ views/default/css/admin.php: Refs #2991. Using section for admin menu.
+
+ * views/default/navigation/menu/elements/section.php: Refs #3088. Wrapping
+ section headers in <h2>s.
+
+ * engine/lib/views.php: Refs #3088. Added docs for section headers to
+ elgg_view_menu().
+
+ * views/default/navigation/menu/default.php,
+ views/default/navigation/menu/elements/section.php,
+ views/default/navigation/menu/page.php: Fixes #3088: Added section header
+ support to page and default menus.
+
+2011-03-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Refs #3085 finished support for passing $vars to
+ elgg_view_entity()
+
+ * engine/lib/views.php, views/default/page/components/gallery.php,
+ views/default/page/components/list.php, views/rss/layout/objects/list.php:
+ Refs #3085 moved full_view out of elgg_view_list_item() into $vars to be
+ consistent with other elgg_view* functions
+
+ * engine/lib/views.php, views/default/page/elements/comments.php: Refs #3085
+ added $vars to elgg_view_comments()
+
+ * engine/lib/views.php: Refs #3085 improved documentation of
+ elgg_view_entity_list() which already supported $vars array
+
+ * engine/classes/ElggEntity.php, engine/lib/entities.php: improved
+ documentation of can write to container method/function
+
+2011-03-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/elgg.php: Fixes #3081: Adding a new line between
+ javascript includes.
+
+ * engine/handlers/page_handler.php, engine/lib/admin.php,
+ engine/lib/widgets.php, languages/en.php, mod/developers/languages/en.php,
+ mod/developers/start.php, mod/diagnostics/start.php,
+ mod/externalpages/start.php, mod/logbrowser/start.php,
+ mod/reportedcontent/start.php, mod/uservalidationbyemail/start.php,
+ views/default/admin/appearance/default_widgets.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/appearance/profile_fields.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/admin/settings/advanced.php,
+ views/default/admin/settings/basic.php,
+ views/default/admin/settings/default_widgets.php,
+ views/default/admin/settings/menu_items.php,
+ views/default/admin/settings/profile_fields.php,
+ .../default/admin/settings/profile_fields/list.php,
+ views/default/admin/sidebar.php, views/default/admin/site/advanced.php,
+ views/default/admin/site/basic.php, views/default/css/admin.php,
+ views/default/js/admin.php: Refs #2991. First round at rearranging and
+ grouping admin menu based upon tasks.
+
+2011-03-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/activate.php, actions/admin/plugins/deactivate.php,
+ actions/admin/user/delete.php, actions/friends/collections/add.php,
+ actions/friends/collections/delete.php, engine/classes/ElggSite.php,
+ engine/lib/admin.php, engine/lib/cache.php, engine/lib/cron.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/input.php,
+ engine/lib/navigation.php, engine/lib/output.php, engine/lib/pagehandler.php,
+ engine/lib/pageowner.php, engine/lib/plugins.php, engine/lib/river.php,
+ engine/lib/user_settings.php, engine/lib/users.php,
+ engine/tests/api/helpers.php, index.php, install/ElggInstaller.php,
+ js/lib/elgglib.js, js/lib/languages.js, js/lib/userpicker.js,
+ js/tests/ElggLibTest.js, mod/blog/actions/blog/delete.php,
+ mod/blog/actions/blog/save.php, mod/blog/lib/blog.php, mod/blog/start.php,
+ mod/blog/views/default/blog/group_module.php,
+ mod/blog/views/default/blog/sidebar/archives.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/object/blog.php,
+ mod/blog/views/default/widgets/blog/content.php,
+ mod/bookmarks/actions/bookmarks/delete.php,
+ mod/bookmarks/actions/bookmarks/save.php, mod/bookmarks/pages/friends.php,
+ mod/bookmarks/pages/view.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/widgets/bookmarks/content.php, mod/categories/start.php,
+ mod/categories/views/default/output/categories.php, mod/developers/start.php,
+ .../views/default/admin/developers/preview.php, mod/embed/start.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/externalpages/start.php,
+ mod/externalpages/views/default/expages/menu.php,
+ mod/file/actions/file/delete.php, mod/file/actions/file/upload.php,
+ mod/file/edit.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/search.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/view.php, mod/file/views/default/file/embed_upload.php,
+ mod/file/views/default/file/group_module.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/widgets/filerepo/content.php,
+ mod/groups/actions/discussion/delete.php,
+ mod/groups/actions/groups/delete.php,
+ mod/groups/actions/groups/membership/invite.php,
+ mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ mod/groups/start.php, .../views/default/discussion/group_module.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/profile/buttons.php,
+ mod/groups/views/default/groups/side_menu.php,
+ mod/groups/views/default/groups/sidebar/find.php,
+ .../views/default/groups/sidebar/members.php,
+ .../default/widgets/a_users_groups/content.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/start.php,
+ mod/logbrowser/start.php, mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/logbrowser/table.php,
+ mod/messageboard/pages/owner.php, mod/messageboard/start.php,
+ .../views/default/widgets/messageboard/content.php,
+ mod/messages/actions/messages/send.php, mod/messages/read.php,
+ mod/messages/start.php, mod/messages/views/default/object/messages.php,
+ mod/notifications/start.php, mod/pages/actions/pages/delete.php,
+ mod/pages/friends.php, mod/pages/history.php, mod/pages/revision.php,
+ mod/pages/start.php, mod/pages/view.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/group_module.php,
+ mod/pages/views/default/widgets/pages/content.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/search/index.php,
+ mod/search/views/default/search/list.php,
+ mod/search/views/default/search/search_box.php, mod/thewire/actions/add.php,
+ mod/thewire/actions/delete.php, mod/thewire/pages/friends.php,
+ mod/thewire/pages/reply.php, mod/thewire/pages/tag.php,
+ mod/thewire/pages/thread.php, mod/thewire/pages/user.php,
+ mod/thewire/start.php, mod/thewire/tests/regex.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/widgets/thewire/content.php, mod/twitterservice/start.php,
+ mod/twitterservice/twitterservice_lib.php,
+ .../views/default/twitterservice/login.php,
+ .../default/usersettings/twitterservice/edit.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ views/default/admin/appearance/default_widgets.php,
+ views/default/admin/header.php, views/default/admin/plugins/advanced.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/members/nav.php, views/default/core/members/sidebar.php,
+ views/default/forms/login.php, views/default/group/search/finishblurb.php,
+ views/default/input/autocomplete.php,
+ views/default/object/plugin/advanced.php,
+ views/default/object/plugin/simple.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/page/default.php,
+ views/default/page/layouts/content/filter.php,
+ views/default/page/layouts/content/header.php,
+ .../page/layouts/two_column_left_sidebar.php,
+ views/default/user/search/finishblurb.php,
+ views/default/widgets/content_stats/content.php, views/foaf/page/default.php,
+ views/installation/page/elements/footer.php, views/rss/core/river/body.php:
+ Fixes #2228: Major cleanup of urls -- remove leading pg/ and trailing / from
+ most urls in core and plugins
+
+ * .gitignore: Ignoring some standard eclipse files
+
+ * engine/handlers/page_handler.php, htaccess_dist: Refs #2228: Deprecated
+ use of pg/ in page handlers. Now we get to have nice clean urls like
+ "example.com/bookmarks"
+
+2011-03-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/manifest.xml: Added curl requirement to twitterservice.
+
+
+ * .../views/default/groups/sidebar/members.php: Fixes #3072: Fixed group
+ member list in sidebar. Thoughts about using the elgg-menu-hz class for this?
+ It's not exactly a menu, but that CSS does exactly what's needed.
+
+ * mod/groups/lib/groups.php: Fixes #3069. Added group activity content.
+
+ * languages/en.php, views/default/widgets/admin_welcome/content.php: Refs
+ #3004. First draft of welcome widget text.
+
+ * views/default/css/admin.php: Fixes #2948: Put specific rules in for
+ .elgg-plugin.elgg-state-active to get white backgrounds in plugins, but not
+ break the action button. The admin CSS still needs a bit of work.
+
+2011-03-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php: fixed page owner setting for sites in a
+ subdirectory
+
+ * views/default/css/admin.php, views/default/page/admin.php: Fixes #3057
+ page wrapper now sets the margin so messages don't end up in far left
+
+2011-03-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js, mod/likes/views/default/likes/display.php: Refs #3027: Using
+ the event popup, ui for advanced placement in elgg.ui.popsUp()
+
+ * engine/lib/views.php: Fixes #3059. elgg_view_layout() checks for
+ deprecated layouts in canvas/layouts/ and elgg_view_page() checks for
+ deprecated pageshells in pageshells/pageshell.
+
+ * engine/classes/ElggBatch.php: Fixed some typos in documentation of
+ ElggBatch.
+
+2011-03-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/upgrades/2011030101.php: Fixes #2679 added a script to upgrade
+ forum topics from 1.7 and earlier
+
+ * actions/likes/add.php, actions/likes/delete.php,
+ engine/classes/ElggEntity.php, engine/lib/elgglib.php,
+ engine/lib/navigation.php, engine/lib/upgrades/2010121702.php,
+ engine/lib/views.php, languages/en.php,
+ .../views/default/theme_preview/icons.php, mod/likes/actions/likes/add.php,
+ mod/likes/actions/likes/delete.php, mod/likes/languages/en.php,
+ mod/likes/manifest.xml, mod/likes/start.php,
+ mod/likes/views/default/annotation/likes.php,
+ mod/likes/views/default/likes/css.php,
+ mod/likes/views/default/likes/display.php,
+ .../default/river/annotation/likes/create.php,
+ views/default/annotation/likes.php, views/default/core/likes/display.php,
+ views/default/css/admin.php, views/default/css/elements/components.php,
+ views/default/css/elements/icons.php, views/default/css/ie.php,
+ views/default/river/annotation/likes/create.php: Fixes #3058 pulls likes out
+ as a plugin
+
+ * views/default/navigation/menu/metadata.php: removed metadata menu which
+ has been replaced by the entity menu
+
+2011-03-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/categories/manifest.xml, mod/custom_index/manifest.xml,
+ mod/developers/manifest.xml, mod/diagnostics/manifest.xml,
+ mod/embed/manifest.xml, mod/externalpages/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/oauth_lib/manifest.xml,
+ mod/twitter/manifest.xml: Refs #2104 added bundled category to all core
+ plugins
+
+ * .../views/default/theme_preview/forms.php: added padding to the display of
+ buttons in developer preview
+
+ * languages/en.php, views/default/admin/plugins/advanced.php: Refs #2871
+ advanced plugin filtering works - sorting still does odd things
+
+2011-03-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, languages/en.php, views/default/admin/footer.php,
+ views/default/css/admin.php: Fixes #3005. Added links to admin faq, admin
+ manual, blog, and community forums in the admin footer.
+
+ * mod/thewire/start.php, mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/metadata.php: Fixes #3025: The wire uses
+ core's metadata view.
+
+ * engine/lib/views.php: Added a bit more docs to elgg_view_menu().
+
+ * engine/lib/upgrades/2010050701.php: Fixes #2310. Only conditionally
+ setting the allow_registration field for users who used
+ $CONFIG->disable_registration.
+
+ * js/lib/ui.js, views/default/core/likes/display.php: Fixes #3027. Likes
+ popup uses rel='popup' and elgg.ui.popsUp() to position absolute.
+
+ * mod/blog/views/default/blog/sidebar/revisions.php: Fixes #3054: Fixed URL
+ for editing a blog revision.
+
+2011-03-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/start.php, mod/tinymce/views/default/js/tinymce.php,
+ mod/tinymce/views/default/tinymce/init.php, views/default/input/longtext.php:
+ fixed tinymce toggle
+
+2011-03-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/js/blog/save_draft.php: Fixes #3053: Fixed JS for
+ blog draft autosave.
+
+ * ...8_svn-blog_status_metadata-4645225d7b440876.php,
+ mod/blog/actions/blog/auto_save_revision.php, mod/blog/actions/blog/save.php,
+ mod/blog/classes/ElggBlog.php, mod/blog/languages/en.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/input/datetime.php,
+ mod/blog/views/default/js/blog/save_draft.php,
+ mod/blog/views/default/object/blog.php, version.php: Fixes #2229. Removed
+ published data metadata in blog. Added upgrade to set all status metadata for
+ old blog posts.
+
+ * engine/classes/ElggBatch.php: Added a bit more docs to ElggBatch.
+
+ * mod/blog/lib/blog.php, mod/blog/views/default/blog/sidebar/archives.php:
+ Refs #2229: Using time_created instead of publish_date metadata to sort.
+
+2011-03-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/longtext.php: fixed longtext menu display
+
+2011-03-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/navigation.php, engine/lib/river.php, mod/blog/start.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php, mod/groups/start.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php, mod/pages/start.php,
+ mod/pages/views/default/object/page_top.php,
+ views/default/css/elements/navigation.php: Refs #2895 entity menu uses new
+ menu system
+
+ * engine/classes/ElggMenuItem.php: added support for confirm text to
+ ElggMenuItem
+
+ * views/default/output/confirmlink.php: made encoding text default to false
+ in confirm link
+
+ * mod/blog/views/default/blog/group_module.php,
+ .../views/default/bookmarks/group_module.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ mod/groups/views/default/forms/groups/delete.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/profile/profile_block.php,
+ .../views/default/groups/profile/widgets.php,
+ mod/pages/views/default/pages/group_module.php: cleaned up the groups plugin
+ css
+
+ * views/default/css/elements/navigation.php: owner block menu items appear
+ like normal page menu items in default theme
+
+ * engine/lib/river.php: not showing river buttons when displaying in widgets
+
+
+2011-03-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Elgg's web services API is not RESTful
+
+ * mod/custom_index/start.php: custom index plugin checks return value on
+ hook now
+
+ * _graphics/walled_garden_background_top.gif, engine/lib/elgglib.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/css/walled_garden.php, views/default/page/elements/footer.php,
+ views/default/page/walled_garden.php: Refs #2693 walled garden code is
+ functional. Push back a thorough clean up until Elgg 1.9
+
+ * engine/lib/elgglib.php, languages/en.php,
+ views/default/css/walled_garden.php, views/default/page/walled_garden.php:
+ Refs #2693 pulled walled garden css out as separate view
+
+ * documentation/examples/plugins/manifest.xml, mod/blog/manifest.xml,
+ mod/bookmarks/manifest.xml, mod/developers/manifest.xml,
+ mod/file/manifest.xml, mod/pages/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitterservice/manifest.xml,
+ mod/uservalidationbyemail/manifest.xml, mod/zaudio/manifest.xml,
+ views/default/admin/plugins/advanced.php: Refs #2104 added some categories to
+ core (bundled) plugins
+
+ * mod/thewire/languages/en.php,
+ .../views/default/thewire/profile_status.php: Fixes #3024 thewire view for
+ the profile page is finished
+
+ * engine/lib/river.php, mod/groups/start.php,
+ .../views/default/forms/discussion/reply/save.php,
+ .../river/object/groupforumtopic/create.php,
+ views/default/river/item/controls.php: Refs #2679 can comment on discussion
+ forums in river now
+
+ * mod/groups/start.php: Refs #2413 registered the subtype for discussion
+ topics so search works
+
+ * mod/groups/start.php: Refs #2679 added a function for processing groups
+ plugin upgrades
+
+ * engine/lib/river.php, views/default/river/item/controls.php: Fixes #2895
+ river menu reimplemented using plugin hook
+
+ * upgrade.php: Fixes #3029 added an upgrade, system event that always fires
+
+2011-03-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggMenuBuilder.php: added a catch to menu builder for bad
+ menu items
+
+ * views/default/css/elements/navigation.php: added background to li hover
+ for filter menu to work around sliver of white showing through - probably a
+ better way to do this
+
+ * mod/messages/start.php, mod/messages/views/default/messages/css.php: fixed
+ new message indicator
+
+ * views/default/navigation/menu/default.php: forcing dashes in elgg menu
+ classes
+
+ * mod/messages/read.php, mod/pages/view.php: changed rest of title buttons
+ to an elgg-menu
+
+ * mod/groups/languages/en.php, mod/groups/lib/groups.php: fixed some group
+ page titles
+
+ * mod/thewire/languages/en.php: thewire was missing object:<subtype> string
+
+ * views/default/css/elements/navigation.php: tweaked spacing of sidebar
+ menus
+
+ * languages/en.php: adjust language on like link title
+
+ * views/default/css/elements/layout.php,
+ views/default/css/elements/navigation.php: added a amrgin to elgg-menu-title
+ so that buttons have some space
+
+ * .../views/default/groups/profile/buttons.php: groups profile buttons now
+ elgg-menu-title - still need to be registered
+
+ * .../views/default/forms/messages/process.php,
+ mod/messages/views/default/object/messages.php,
+ views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/css/elements/buttons.php,
+ views/default/input/submit.php: cleared up confusion over elgg-icon-delete
+ and elgg-button-delete
+
+ * .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php: cleaned up the group
+ invitations and membership request pages
+
+ * mod/groups/actions/groups/edit.php,
+ mod/groups/views/default/forms/groups/edit.php: fixed a bug with invisible
+ groups - saving and display both had a problem
+
+ * mod/groups/views/default/forms/groups/search.php,
+ mod/groups/views/default/groups/edit.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../default/groups/profile/activity_module.php,
+ mod/groups/views/default/groups/side_menu.php,
+ .../views/default/groups/sidebar/members.php,
+ .../river/annotation/group_topic_post/reply.php,
+ .../default/river/relationship/member/create.php,
+ mod/groups/views/default/settings/groups/edit.php: reviewed groups plugin and
+ added todo's
+
+ * mod/bookmarks/views/default/object/bookmarks.php: added owner icons to
+ bookmarks
+
+ * views/default/css/elements/misc.php: drop down button did not need to have
+ such a large z-index
+
+ * views/default/css/elements/buttons.php: removed shadow from
+ elgg-button-dropdown inherited from elgg-button
+
+ * views/default/page/elements/footer.php: make sure powered by icon does not
+ sneak up in the menu area
+
+ * .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/icon/object/file.php: fixed two validation issues with
+ ampersands in file plugin
+
+ * views/default/page/elements/footer.php: forgot to close div tag
+
+ * .../views/default/custom_index/css.php,
+ .../views/default/page/layouts/custom_index.php: updated custom index spacing
+ so it spans the width of the central area
+
+ * engine/lib/elgglib.php, mod/externalpages/start.php,
+ mod/reportedcontent/start.php, views/default/css/elements/navigation.php,
+ views/default/page/elements/footer.php: pulled power by icon out of menu in
+ footer as it serves a different purpose than other menu items
+
+2011-03-05 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js, views/default/input/date.php,
+ views/default/input/datepicker.php, views/default/output/calendar.php,
+ views/default/output/date.php: Fixes #2321: Deprecated input/datepicker and
+ output/calendar in favor of input/date and output/date
+
+2011-03-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/groups/membership/join.php, mod/groups/start.php: Fixes
+ #1926 flushing access list when adding a user to a group
+
+ * mod/groups/lib/groups.php, .../default/groups/profile/activity_module.php:
+ preventing crashes when user does not have access to the group on group
+ profile page
+
+ * engine/lib/access.php: Refs #1926 should not be ignoring the flush
+ variable
+
+ * engine/lib/access.php: updated comment on why we may want to keep access
+ cache
+
+ * mod/groups/start.php: Refs #1926 user is now being added to access
+ collection of invisible group
+
+ * engine/lib/access.php: Refs #1926 made 'access:collections:add_user',
+ 'collection' plugin hook more useful
+
+ * mod/groups/actions/groups/edit.php, mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/edit.php: trying to make support for
+ invisible groups a little saner
+
+ * mod/groups/actions/groups/membership/join.php: fixed bug in accepting
+ invitations to closed groups
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/delete.php,
+ mod/groups/actions/edit.php, mod/groups/actions/featured.php,
+ mod/groups/actions/groups/delete.php, mod/groups/actions/groups/edit.php,
+ mod/groups/actions/groups/featured.php,
+ mod/groups/actions/groups/membership/add.php,
+ .../actions/groups/membership/delete_invite.php,
+ .../actions/groups/membership/delete_request.php,
+ mod/groups/actions/groups/membership/invite.php,
+ mod/groups/actions/groups/membership/join.php,
+ mod/groups/actions/groups/membership/leave.php,
+ mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/start.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/profile/buttons.php: updated the group actions -
+ edit group needs more work
+
+ * engine/lib/entities.php: added a hint about 0 meaning no limit for ege
+
+2011-03-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Refs #2679 preventing people from commenting on a
+ discussion topic in the river
+
+ * mod/groups/actions/discussion/reply/delete.php,
+ mod/groups/actions/discussion/reply/save.php, mod/groups/languages/en.php,
+ mod/groups/lib/discussion.php, mod/groups/lib/groups.php,
+ mod/groups/start.php, .../views/default/annotation/group_topic_post.php,
+ mod/groups/views/default/discussion/replies.php,
+ .../views/default/forms/discussion/reply/save.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/object/groupforumtopic.php,
+ .../river/annotation/group_topic_post/reply.php: Refs #2679 - returning to a
+ separate annotation for discussion forum replies. For those using the latest
+ out of svn you can update with this script: https://gist.github.com/852092
+
+2011-03-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, mod/blog/views/default/forms/blog/save.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ .../notifications/subscriptions/forminternals.php,
+ views/default/css/elements/chrome.php,
+ views/default/forms/admin/site/update_advanced.php,
+ views/default/forms/admin/site/update_basic.php,
+ views/default/forms/usersettings/save.php: Fixes #3006 restores previous
+ dividers
+
+ * mod/categories/views/default/output/categories.php: not showing categories
+ label if not categories chosen
+
+ * actions/login.php: Fixes #3036 moved setting of forward url to before
+ login in case session variables are being lost
+
+ * views/default/river/item/controls.php: Refs #2895 reverting [8532] as code
+ is not working as intended. Can comment and like everything because menu
+ items are being registered. Perhaps questionable benefit of using the menu
+ system here.
+
+ * mod/groups/actions/discussion/save.php: fixed the view name for discussion
+ topic river
+
+ * .../views/default/object/groupforumtopic.php: showing the text of a forum
+ topic post
+
+2011-03-02 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/views/default/tinymce/css.php,
+ views/default/core/friends/collection.php,
+ views/default/core/friends/collections.php,
+ views/default/core/friends/collectiontabs.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php,
+ views/default/page/elements/owner_block.php,
+ views/default/page/elements/topbar.php: Addressed several miscellaneous
+ todo's
+
+ * views/default/object/widget.php,
+ views/default/object/widget/elements/controls.php: Widget collapse button
+ uses elgg-toggler pattern
+
+ * views/default/page/layouts/widgets/add_button.php: Fixed widgets add
+ button
+
+ * views/default/object/plugin/advanced.php,
+ .../object/plugin/elements/dependencies.php: Plugin admin displays
+ dependencies again
+
+ * mod/twitterservice/start.php: Removed redundant requirements checking code
+
+ * views/default/admin/statistics/basic.php,
+ views/default/admin/statistics/numentities.php,
+ views/default/admin/statistics/overview.php: Refactored admin statistics
+ views -- no longer manually building elgg-module
+
+ * engine/lib/output.php: Added comment explaining purpose of regex
+
+ * engine/lib/output.php: elgg_normalize_url leaves #target and ?query urls
+ alone
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/messages.php: Fixes #3012 added hidden li
+
+ * js/lib/elgglib.js: cleaned up appending system messages since <ul> will
+ always be there
+
+ * install/ElggInstaller.php: Fixes #2929 Installer handles private default
+ access now
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/layouts/content/filter.php: Filter tabs ordered
+ correctly
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php: fixed bug where dataroot wasn't being set when
+ regenerating cache during the install
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/modules.php,
+ views/default/css/elements/navigation.php,
+ views/default/navigation/menu/site.php: Some fixes for site menu
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/save.php: because river entry is deleted we do not
+ need to do an update
+
+ * views/default/forms/comments/add.php: put margin back between longtext and
+ submit button for comment form
+
+ * mod/blog/actions/blog/save.php: fixes saving a new blog post - was trying
+ to do an update to without a guid
+
+ * engine/lib/views.php: Fixes #3033 removed use of set_view_location() from
+ core
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/users.php,
+ mod/embed/start.php, mod/messages/start.php, mod/reportedcontent/start.php,
+ views/default/admin/footer.php, views/default/admin/sidebar.php,
+ views/default/css/admin.php, views/default/css/elements/navigation.php,
+ views/default/input/longtext.php, views/default/page/elements/footer.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/layouts/content/filter.php,
+ views/default/page/layouts/content/header.php,
+ views/default/river/item/controls.php: Fixes #3031 using 'priority' now
+
+ * engine/lib/users.php: Fixes #3010 moved topbar menu registration to page
+ setup so that the url override is registered
+
+ * mod/tinymce/views/default/js/tinymce.php: fixed tinymce js code so that at
+ least it doesn't have syntax errors and runtime exceptions
+
+ * mod/tinymce/start.php: tinymce longtext menu item also needed the longtext
+ class
+
+ * mod/tinymce/start.php: fixes tinymce longtext registration
+
+ * mod/embed/start.php: fixed embed longtext menu registration
+
+ * views/default/input/button.php, views/default/input/submit.php: added
+ better support for classes to buttons
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggMenuItem.php, js/lib/ui.js,
+ mod/profile/views/default/profile/owner_block.php,
+ .../views/default/object/reported_content.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/object/plugin/advanced.php,
+ views/default/object/widget/elements/controls.php,
+ views/default/page/layouts/widgets/add_button.php,
+ views/default/river/item/controls.php: Fixes #3032: toggler pattern is now <a
+ href="#target" class="elgg-toggler">...</a> Wow, so much nicer.
+
+ * engine/classes/ElggMenuItem.php: Added support for "rel" to ElggMenuItem
+
+ * engine/classes/ElggMenuItem.php: Fixes #3023: added support for 'class'
+ argument in elgg_register_menu_item
+
+ * views/default/css/admin.php, views/default/css/elements/navigation.php,
+ views/default/navigation/menu/default.php,
+ views/default/navigation/menu/elements/group.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/navigation/menu/elements/section.php,
+ views/default/navigation/menu/metadata.php,
+ views/default/navigation/menu/page.php,
+ views/default/navigation/menu/site.php,
+ views/default/navigation/menu/user_hover.php,
+ views/default/page/elements/footer.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/layouts/content/filter.php,
+ views/default/page/layouts/content/header.php: Refs #3021:
+ elgg-section-$section => elgg-menu-$menu-$section Added elgg-menu-hz for
+ horizontal menus
+
+ * mod/embed/start.php, mod/embed/views/default/embed/link.php: Fixes #2895:
+ Embed uses longtext menu -- I believe that covers *all* the menus we had
+ brought up!
+
+ * mod/tinymce/start.php, mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/js/tinymce.php,
+ mod/tinymce/views/default/tinymce/init.php, views/default/input/longtext.php:
+ Refs #2538: Cleaned up custom tinymce code into elgg.tinymce.*. Refs #2895:
+ TinyMCE makes use of longtext menu
+
+ * views/default/river/item/controls.php: Refs #2895: River items now emit a
+ "river" menu. Not confident on the name, just trying to keep things short
+ and sweet.
+
+ * mod/search/start.php, views/default/page/elements/header.php: Removed
+ header/extend in favor of just extending page/elements/header
+
+ * views/default/css/elements/navigation.php,
+ views/default/page/layouts/content/header.php: Refs #2895: Content header now
+ emits a "title" menu
+
+2011-03-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/save.php: Fixes #2425, #2427. Blog status for
+ published and draft correctly set the river items.
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/likes/display.php,
+ views/default/css/elements/navigation.php: core/likes/display uses
+ image-block component. ensures that the like icon is even with the "x users
+ liked this" text. Wondering if we should split the two up entirely.
+
+ * views/default/css/elements/navigation.php,
+ views/default/page/layouts/content/filter.php: Refs #2895: Converted content
+ filter to a menu, duplicated styles to mimic tabs... ick.
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/manifest.xml, mod/blog/start.php: blog plugin uses on_activate to
+ set its class or the upgrade event
+
+ * mod/groups/views/default/forms/groups/search.php,
+ mod/thewire/views/default/forms/thewire/add.php,
+ views/default/css/elements/buttons.php,
+ views/default/forms/members/name_search.php,
+ views/default/forms/members/tag_search.php,
+ views/default/forms/widgets/save.php, views/default/input/submit.php: brought
+ back the blue submit button
+
+ * views/default/css/elements/buttons.php: yuck - have to reset all the
+ styling from elgg-button for elgg-button-delete
+
+ * actions/admin/plugins/activate.php, actions/admin/plugins/deactivate.php:
+ Fixes #3013 activating/deactivating a plugin forwards to plugin page with
+ changed plugin given focus
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/pages/all.php: No need for ".=" here
+
+ * mod/groups/start.php: pg/groups/world => pg/groups/all
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/widgets.php, mod/developers/start.php,
+ mod/diagnostics/start.php, mod/externalpages/start.php,
+ mod/logbrowser/start.php, mod/reportedcontent/start.php,
+ mod/uservalidationbyemail/start.php: Fixes #3014 using more standard
+ "register" in admin convenience function
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/navigation.php: Fixes for breadcrumbs and
+ metadata menus. Added basic styles for title menu
+
+ * views/default/core/likes/display.php: false is default for encode text in
+ output/url -- no need to specify
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messageboard/start.php, .../views/default/forms/messageboard/add.php,
+ .../views/default/messageboard/css.php: cleaned up the css for messageboard
+
+ * mod/messageboard/languages/en.php,
+ .../views/default/annotation/messageboard.php,
+ .../views/default/forms/messageboard/add.php,
+ .../views/default/messageboard/messageboard.php,
+ .../default/river/object/messageboard/create.php,
+ .../views/default/widgets/messageboard/content.php,
+ .../views/default/widgets/messageboard/edit.php: cleaned up the messageboard
+ plugin further
+
+ * views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php: finished making the "default"
+ view the default view for annotation rather than generic_comment
+
+2011-03-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/river/filter.php: Convert river filter javascript to
+ new style
+
+2011-03-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/annotation/default.php: improved the default annotation view
+
+
+2011-02-28 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/topbar.php: No more reason to explicitly add
+ elgg-menu-topbar class
+
+ * views/default/css/elements/navigation.php,
+ views/default/navigation/menu/site.php: Fixes for several menu issues
+
+ * views/default/page/elements/footer.php: No more need to explicitly include
+ elgg-menu-footer class
+
+ * views/default/navigation/menu/default.php: Always include name of menu in
+ menu classes
+
+ * mod/bookmarks/start.php, views/default/page/elements/sidebar.php: Refs
+ #2895: Renamed "page_links" to "extras" -- feels more semantic (facebook's
+ menu has actions such as unfriend, share, block)
+
+2011-02-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, mod/categories/manifest.xml,
+ mod/categories/start.php: Fixes #3011. on_activate and on_deactivate work for
+ plugins now. Updated the categories plugin to use it.
+
+2011-02-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php,
+ mod/categories/views/default/output/categories.php,
+ views/default/css/elements/icons.php,
+ views/default/page/components/list/body.php: pushing categories to the next
+ line when viewing an entity
+
+ * views/default/js/admin.php: slide up system messages in admin area
+
+ * views/default/page/admin.php: fixed the AWHOL state of system messages on
+ admin pages
+
+ * .../views/default/admin/users/unvalidated.php,
+ .../forms/uservalidationbyemail/bulk_action.php: fixed bad return value in
+ unvalidated users bulk action form
+
+2011-02-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/forms/useradd.php: fixed useradd form
+
+ * engine/lib/admin.php, engine/lib/navigation.php: Fixes #2951 not
+ registering utilities menu item by default but added code to automatically
+ register a parent menu if not registered in admin menu registration function.
+ We lose the ability to set a weight on utilities.
+
+ * engine/lib/admin.php, engine/lib/widgets.php, mod/developers/start.php,
+ mod/diagnostics/start.php, mod/externalpages/start.php,
+ mod/logbrowser/start.php, mod/reportedcontent/start.php,
+ mod/uservalidationbyemail/start.php: simplified admin menu registration
+ function in preparation for adding sections
+
+ * install/ElggInstaller.php, install/languages/en.php: Fixes #2799 added
+ check for session.auto_start
+
+ * engine/lib/admin.php, views/default/css/admin.php,
+ views/default/page/admin.php: moved admin messages into admin page shell
+
+ * engine/lib/admin.php, install/ElggInstaller.php, languages/en.php,
+ views/default/css/admin.php, views/default/widgets/admin_welcome/content.php:
+ Fixes #2913 - directs the user to admin dashboard when installer finishes
+
+ * .../views/default/bookmarks/bookmarklet.php: Fixes #2977 changed title to
+ alt
+
+ * _graphics/friendspicker.png, actions/friends/collections/edit.php,
+ languages/en.php, pages/friends/collections/add.php,
+ pages/friends/collections/pickercallback.php,
+ views/default/core/friends/collections.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php,
+ views/default/forms/friends/collections/add.php,
+ views/default/forms/friends/collections/edit.php,
+ views/default/input/friendspicker.php: Fixes #2982 friends collections work
+ even if the code is convoluted and poorly written.
+
+ * .../notifications/subscriptions/forminternals.php: fixed notifications
+ plugin's hacked up friends picker...shudder
+
+ * mod/groups/lib/groups.php,
+ mod/groups/views/default/forms/groups/invite.php: fixed group invite form
+
+ * engine/lib/elgglib.php: fixed image size attributes added to "power by"
+ image
+
+2011-02-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggSite.php: Refs #2693 - Added pg/css and pg/js to the
+ list of public pages for walled garden.
+
+2011-02-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/addcollection.php, actions/friends/collections/add.php,
+ actions/friends/collections/delete.php, actions/friends/collections/edit.php,
+ actions/friends/deletecollection.php, actions/friends/editcollection.php,
+ engine/lib/users.php, pages/friends/add.php, pages/friends/collections.php,
+ pages/friends/collections/add.php,
+ pages/friends/collections/pickercallback.php,
+ pages/friends/collections/view.php, pages/friends/edit.php,
+ pages/friends/pickercallback.php, views/default/core/friends/collection.php,
+ views/default/core/friends/collections.php,
+ views/default/core/friends/collectiontabs.php,
+ views/default/forms/friends/collectionfields.php,
+ views/default/forms/friends/collections/edit.php,
+ views/default/forms/friends/edit.php: Refs #2982 adding and deleting friend
+ collections works - editing does not
+
+ * engine/lib/views.php, mod/groups/views/default/forms/groups/invite.php,
+ pages/friends/pickercallback.php, views/default/core/friends/collection.php,
+ views/default/core/friends/picker.php, views/default/forms/friends/edit.php,
+ views/default/input/friendspicker.php: fixed friends picker js include
+
+2011-02-26 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/navigation.php: Switching elgg-menu-metadata to
+ inline-block method of declaring a horizontal menu
+
+ * mod/groups/views/default/group/default.php,
+ mod/thewire/views/default/thewire/metadata.php, views/default/css/admin.php,
+ views/default/css/elements/components.php,
+ views/default/css/elements/navigation.php,
+ views/default/navigation/menu/metadata.php,
+ views/default/object/plugin/advanced.php,
+ views/default/page/components/list/body.php, views/default/user/default.php:
+ Refs #2895: .elgg-list-metadata => .elgg-menu-metadata. Still not using menu
+ system yet, though
+
+ * views/default/css/elements/navigation.php: .elgg-menu enhancement for
+ horizontal menus
+
+ * views/default/css/elements/layout.php,
+ views/default/css/elements/navigation.php,
+ views/default/navigation/breadcrumbs.php: .elgg-menu is no longer trivial
+
+ * engine/lib/elgglib.php: Added explicit height and width to powered_by_elgg
+ icon
+
+ * views/default/css/elements/icons.php: Fixes #2691: Switching elgg-icon to
+ display:inline-block -- matches behavior of <img> tag
+
+2011-02-25 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/start.php, .../views/default/reportedcontent/css.php:
+ Converted report-this icon to be compatible with elgg_view_icon
+
+ * engine/lib/elgglib.php, mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/footer_link.php,
+ views/default/page/elements/footer.php: Refs #2895: Removed footer/links
+ view. Moved report-this link into alternate footer menu
+
+ * engine/lib/elgglib.php, views/default/css/elements/layout.php,
+ views/default/css/elements/navigation.php,
+ views/default/page/elements/footer.php: Refs #2895: Added support for an
+ "alt" section in the footer menu. Put "powered by Elgg" badge in here
+
+ * js/lib/elgglib.js, js/lib/session.js: Refs #2538: Functions don't need
+ double-namespacing
+
+ * views/default/css/elements/components.php,
+ views/default/css/elements/misc.php,
+ views/default/css/elements/navigation.php: Using shorthand in css to scrunch
+ it a bit
+
+ * views/default/css/elements/layout.php,
+ views/default/css/elements/page_layout.php, views/default/css/elgg.php:
+ Converted css/elements/page_layout to layout. Now we have a bunch of nice,
+ terse, 1-word names :)
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/users.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php,
+ views/default/page/elements/topbar.php: Refs #2895: Converted topbar to one
+ menu (felt dirty using two). Fixed styles.
+
+ * engine/lib/users.php, mod/messages/start.php,
+ mod/messages/views/default/messages/topbar.php: Refs #2895: Messages now uses
+ new topbar menu
+
+ * mod/bookmarks/start.php, .../views/default/bookmarks/page_links.php,
+ views/default/page/elements/page_links.php,
+ views/default/page/elements/sidebar.php: Refs #2895: Converted page_links
+ into a menu. Bookmarks now uses it
+
+ * engine/lib/admin.php, engine/lib/users.php,
+ views/default/page/elements/topbar.php: Refs #2895: Made topbar into 2 menus.
+ CSS will have to be fixed
+
+ * engine/lib/navigation.php: Corrects bug that occurred when ElggMenuItem is
+ passed
+
+ * mod/blog/views/default/object/blog.php, mod/groups/start.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/messages/views/default/object/messages.php,
+ .../notifications/subscriptions/forminternals.php,
+ mod/profile/views/default/profile/owner_block.php,
+ views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/core/friends/picker.php,
+ views/default/core/friends/tablelist.php,
+ views/default/forms/friends/edit.php, views/default/river/item/image.php,
+ views/default/river/relationship/friend/create.php,
+ views/default/user/default.php, views/default/widgets/friends/content.php:
+ Converted all uses of profile/icon in core + plugins to elgg_view_entity_icon
+
+ * engine/lib/navigation.php: Emit a warning + debug info when an attempt to
+ register a menu item fails
+
+ * engine/classes/ElggMenuItem.php: Supporting is_action in ElggMenuItem
+
+ * views/installation/forms/install/template.php,
+ views/installation/install/pages/admin.php,
+ views/installation/install/pages/database.php,
+ views/installation/install/pages/settings.php: Cleaned up some js in the
+ installer
+
+ * views/installation/input/checkbox.php,
+ views/installation/input/checkboxes.php: Updated input/checkboxes code in
+ installation viewtype
+
+ * views/installation/install/forms/admin.php,
+ views/installation/install/forms/database.php,
+ views/installation/install/forms/settings.php,
+ views/installation/install/forms/template.php,
+ views/installation/install/pages/admin.php,
+ views/installation/install/pages/database.php,
+ views/installation/install/pages/settings.php: Converted installation forms
+ to use elgg_view_form and the /forms/ directory
+
+2011-02-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/admin.php: Fixes #2998. Updated admin JS for dnd plugin
+ reordering with new plugin layout.
+
+2011-02-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggAnnotation.php: Fixes #2960 removing river entry for
+ deleted annotation
+
+ * views/default/css/admin.php, views/default/css/elements/reset.php: fixed
+ dragging/scrolling issue caused by overflow-y on body
+
+ * engine/classes/ElggMenuItem.php: fixed typo in elgg menu updates from last
+ night
+
+ * engine/lib/users.php, languages/en.php, pages/friends/collections.php,
+ views/default/css/elements/misc.php: fixing friends collections for backward
+ compatibility
+
+ * engine/classes/ElggMenuItem.php,
+ views/default/navigation/menu/elements/item.php: finished the implementation
+ of non-links in menu system
+
+ * engine/classes/ElggMenuItem.php,
+ mod/profile/views/default/profile/owner_block.php,
+ views/default/navigation/menu/elements/item.php: using getContent() in menu
+ system in preparation for supporting non-links
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/admin.php, engine/lib/deprecated-1.8.php,
+ engine/lib/navigation.php, engine/lib/user_settings.php,
+ engine/lib/users.php, engine/lib/views.php, mod/bookmarks/start.php,
+ mod/developers/start.php, mod/file/views/default/file/typecloud.php,
+ mod/invitefriends/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/lib/pages.php: Fixes #2997 - href used
+ instead of url in menu system
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/admin.php, engine/lib/deprecated-1.8.php,
+ engine/lib/user_settings.php, engine/lib/users.php, engine/lib/views.php,
+ mod/bookmarks/start.php, mod/developers/start.php,
+ mod/file/views/default/file/typecloud.php, mod/invitefriends/start.php,
+ mod/messages/start.php, mod/notifications/start.php, mod/pages/lib/pages.php,
+ views/default/forms/admin/menu/save.php: Refs #2997 switching from title to
+ text for menu items
+
+ * views/default/core/friends/tablelist.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php:
+ moved another friends picker css section to forms css view
+
+ * views/default/core/avatar/crop.php, views/default/core/avatar/upload.php,
+ views/default/css/elements/misc.php, views/default/forms/avatar/crop.php:
+ cutting down the amount of css required for the avatar page
+
+ * views/default/core/river/body.php, views/default/core/river/controls.php,
+ views/default/core/river/footer.php, views/default/core/river/image.php,
+ views/default/river/item.php, views/default/river/item/body.php,
+ views/default/river/item/controls.php, views/default/river/item/footer.php,
+ views/default/river/item/image.php: organized the river views according to
+ the subview pattern
+
+2011-02-23 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/modules.php: Adjusting offset for dropdown
+ module
+
+ * engine/lib/admin.php: Simplify registration of jeditable library
+
+ * views/default/css/elements/components.php,
+ views/default/css/elements/layout_objects.php, views/default/css/elgg.php:
+ Refs #2993: Changed css layout_objects to components
+
+ * views/default/css/elgg.php: Refs #2995: Including css/elements/buttons in
+ css/elgg
+
+ * views/default/css/elements/buttons.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php:
+ Fixes #2995: buttons get their own css file
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/object/default.php,
+ views/default/object/elements/list_body.php,
+ views/default/page/components/list/body.php, views/default/user/default.php:
+ Fixes #2992: moved object/elements/list_body to page/components/list/body
+
+ * js/lib/ui.js: Fixes #2976: Removed second toggler implementation
+
+ * mod/blog/lib/blog.php, mod/file/index.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php, mod/messages/read.php,
+ .../views/default/forms/messages/process.php,
+ mod/messages/views/default/object/messages.php, mod/pages/view.php,
+ mod/profile/views/default/profile/owner_block.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/thewire/profile_status.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/friends/picker.php,
+ views/default/forms/profile/fields/reset.php, views/default/input/button.php,
+ views/default/object/plugin/advanced.php,
+ views/default/page/layouts/content/header.php,
+ views/default/page/layouts/widgets/add_button.php: Every occurrence of
+ elgg-button-$type needs an elgg-button base class declaration -- or should we
+ remove that requirement?
+
+ * mod/profile/views/default/profile/owner_block.php,
+ .../views/default/object/reported_content.php,
+ views/default/core/river/controls.php, views/default/core/river/footer.php,
+ views/default/object/widget/elements/controls.php,
+ views/default/object/widget/elements/settings.php,
+ views/default/page/layouts/widgets/add_button.php,
+ views/default/page/layouts/widgets/add_panel.php: Refs #2976: Converted most
+ markup to use elgg-toggler elgg-toggles-* pattern
+
+ * views/default/css/elements/page_layout.php,
+ views/default/page/default.php: Fixes #2957: elgg-page-classic =>
+ elgg-page-default
+
+ * views/default/page/admin.php, views/default/page/layouts/one_column.php,
+ views/default/page/layouts/one_sidebar.php: Moved elgg-inner out of layouts
+ and into the page shell
+
+ * mod/messageboard/views/default/messageboard/js.php,
+ mod/messages/views/default/object/messages.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/css/ie.php,
+ views/default/css/ie6.php, views/default/page/upgrade.php: Converted
+ delete-button to elgg-button-delete throughout plugins
+
+ * views/default/css/elements/forms.php, views/default/css/elements/misc.php:
+ Moved elgg-button-dropdown to forms
+
+ * views/default/css/elements/chrome.php: Cleanup of css/elements/chrome.php
+
+ * views/default/css/elements/forms.php: Converted delete-button to
+ elgg-button-delete. This breaks some things because the semantics of the two
+ are not equivalent. .delete-button just really needed to die
+
+ * views/failsafe/canvas/default.php, views/foaf/canvas/default.php,
+ views/ical/canvas/default.php, views/json/canvas/default.php,
+ views/opendd/canvas/default.php, views/php/canvas/default.php: Deleting
+ deprecated canvas/ directory from all viewtypes
+
+ * views/default/navigation/menu/default.php: DRY'ed up default menu a bit
+
+2011-02-22 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/page/shells/theme_preview.php,
+ .../views/default/page/theme_preview.php: Moved theme_preview page shell out
+ into page/
+
+ * views/default/css/elements/page_layout.php,
+ views/default/page/elements/sidebar_alt.php,
+ views/default/page/layouts/one_column.php,
+ views/default/page/layouts/one_sidebar.php,
+ views/default/page/layouts/two_sidebar.php: Trying to simplify layout css:
+ nixed elgg-aside .elgg-sidebar.elgg-alt => .elgg-sidebar-alt (similar to
+ .elgg-image-alt)
+
+ * views/default/admin/footer.php, views/default/admin/header.php,
+ views/default/page/admin.php, views/default/page/layouts/admin.php: extracted
+ admin header, footer to admin/*. Moved pageshell code from admin layout to
+ admin pageshell.
+
+ * install/css/install.css, views/installation/install/footer.php,
+ views/installation/install/header.php,
+ views/installation/install/sidebar.php, views/installation/page/default.php,
+ views/installation/page/elements/footer.php,
+ views/installation/page/elements/header.php,
+ views/installation/page/elements/sidebar.php: Move install
+ footer/header/sidebar into page/elements. Converted CSS to use more standard
+ Elgg framework objects
+
+ * views/default/page/elements/content_header.php,
+ .../page/elements/content_header_member.php: Removing holdovers from elgg.com
+
+ * views/failsafe/page/default.php, views/failsafe/page/shells/default.php,
+ views/foaf/page/default.php, views/foaf/page/shells/default.php,
+ views/ical/page/default.php, views/ical/page/shells/default.php,
+ views/installation/page/default.php,
+ views/installation/page/shells/default.php, views/json/page/default.php,
+ views/json/page/shells/default.php, views/opendd/page/default.php,
+ views/opendd/page/shells/default.php, views/php/page/default.php,
+ views/php/page/shells/default.php, views/rss/page/default.php,
+ views/rss/page/shells/default.php, views/xml/page/default.php,
+ views/xml/page/shells/default.php: Moved page/shells/* to page/*
+
+ * mod/embed/views/default/embed/css.php, views/default/css/ie.php,
+ views/default/export/entity.php: entity-listing => elgg-image-block,
+ margin-top => mtm
+
+ * mod/groups/lib/groups.php,
+ mod/groups/views/default/forms/groups/delete.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forms/groups/search.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/profile/buttons.php,
+ .../views/default/groups/profile/profile_block.php,
+ .../views/default/groups/profile/widgets.php,
+ .../views/default/groups/sidebar/members.php: Touch ups of groups plugin
+
+ * mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php,
+ mod/embed/views/default/embed/lightbox_init.php,
+ mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/embed/views/default/group/default/embed.php,
+ mod/embed/views/default/object/file/embedlist.php: Touch ups for the embed
+ plugin -- this one needs some serious work still, though...
+
+ * views/default/output/url.php: Utilizing elgg_extract in output/url
+
+ * js/lib/configuration.js: Added elgg.get_site_url(), so people don't have
+ to deal with the config object.
+
+ * mod/diagnostics/actions/download.php,
+ .../views/default/admin/utilities/diagnostics.php,
+ .../views/default/diagnostics/forms/download.php: Touch ups for diagnostics
+ plugin
+
+ * views/default/admin/plugin_settings.php,
+ views/default/core/settings/tools.php,
+ views/default/forms/plugins/settings/save.php: Deprecated
+ (user)settings/$plugin_id/edit in favor of plugins/$plugin_id/(user)settings
+
+ * mod/bookmarks/start.php: Default permissions for new actions is logged_in,
+ so no need to make that explicit
+
+ * mod/blog/lib/blog.php, mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/input/datetime.php,
+ mod/blog/views/default/js/blog/save_draft.php: Cleaned up blog js
+
+2011-02-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Fixes #2952 less silliness in Elgg now
+
+ * engine/lib/pageowner.php: Refs #2790 - fixes it for real this time
+
+ * engine/lib/pageowner.php: Fixes #2790 adds fix from 1.7 branch into trunk
+
+2011-02-22 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * crontab.example, documentation/examples/crontab.example: Moved
+ crontab.example into documentation directory
+
+2011-02-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/actions/developers/settings.php,
+ mod/developers/languages/en.php, mod/developers/manifest.xml,
+ .../views/default/admin/developers/settings.php,
+ mod/developers/views/default/developers/css.php,
+ .../views/default/forms/developers/settings.php: started adding a settings
+ page
+
+2011-02-22 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * : hmmm... how did those get there?
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/thewire/views/default/object/thewire.php,
+ views/default/object/default.php, views/default/page/layouts/content.php,
+ views/default/user/default.php: Fixes #2950: All files that were calling into
+ layout/* now use the up-to-date locations
+
+ * .../views/default/bookmarks/page_links.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/theme_preview/icons.php,
+ mod/thewire/views/default/thewire/metadata.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/core/likes/display.php, views/default/icon/user/default.php,
+ views/default/navigation/menu/metadata.php,
+ views/default/navigation/menu/site.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/page/elements/page_links.php,
+ views/default/page/elements/topbar.php,
+ views/default/river/relationship/friend/create.php: Fixes #2980: DRY'ed up
+ all plugins to use elgg_view_icon instead of generating their own html
+
+ * views/default/forms/comments/inline.php: Deprecated forms/comments/inline
+ in favor of passing inline => TRUE to forms/comments/add
+
+ * views/default/core/river/footer.php: core river footer taking advantage of
+ new DRY comment form
+
+ * engine/lib/views.php: Refs #2980: Added an elgg_view_icon function
+
+ * views/default/graphics/ajax_loader.php: Typo in ajax_loader
+
+ * views/default/navigation/listtype.php,
+ views/default/navigation/topbar_tools.php: Cleaned up some nav views
+
+ * views/default/navigation/menu/metadata.php: Refs #2950:
+ layout/objects/list/metadata => navigation/menu/metadata
+
+ * views/default/object/elements/list_body.php,
+ views/default/page/components/list/body.php,
+ views/default/page/layouts/content.php,
+ views/default/page/layouts/widgets.php: Refs #2950: update locations of
+ layout elements + moved page/components/list/body into
+ object/elements/list_body -- not sure if this will be the final location
+
+ * views/default/navigation/viewtype.php: Added appropraite @deprecated tag
+ to navigation/viewtype
+
+ * views/default/profile/icon.php: Included proper deprecation notice with
+ deprecated view
+
+ * views/default/layout/objects/list/body.php,
+ views/default/layout/objects/list/metadata.php,
+ views/default/layout/shells/content/filter.php,
+ views/default/layout/shells/content/footer.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/content/sidebar.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/layout/shells/widgets/add_panel.php,
+ views/default/page/components/list/body.php,
+ views/default/page/layouts/content/filter.php,
+ views/default/page/layouts/content/footer.php,
+ views/default/page/layouts/content/header.php,
+ views/default/page/layouts/content/sidebar.php,
+ views/default/page/layouts/widgets/add_button.php,
+ views/default/page/layouts/widgets/add_panel.php: Refs #2950: Moved /layout/
+ views into /page/ dir -- still not satisfied with page/components/list/body,
+ page/layouts/content/* and page/layouts/widgets/add_button
+
+ * views/default/forms/comments/add.php: Dry'ed up forms/comments/add a bit
+
+ * views/default/forms/comments/add.php: merged comments/inline and
+ comments/add forms
+
+ * views/default/forms/friends/edit.php: Deleted completed @todo
+
+ * pages/friends/add.php, pages/friends/edit.php,
+ views/default/forms/friends/edit.php: forms/friends/edit no longer contains
+ input/form logic
+
+ * views/default/admin/users/add.php, views/default/forms/useradd.php:
+ Extracted input/form login from forms/useradd
+
+ * engine/lib/admin.php, views/default/admin/components/invalid_plugin.php,
+ views/default/admin/components/plugin.php,
+ .../admin/components/plugin_dependencies.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugin_settings.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/core/settings/tools.php,
+ views/default/core/settings/tools/plugin.php,
+ .../forms/admin/plugins/simple_update_states.php,
+ views/default/forms/plugins/usersettings/save.php,
+ views/default/js/admin.php, views/default/object/plugin.php,
+ views/default/object/plugin/advanced.php,
+ .../object/plugin/elements/dependencies.php,
+ views/default/object/plugin/invalid.php,
+ views/default/object/plugin/simple.php: Refs #2950: Cleanup of plugin-related
+ view structure
+
+ * views/default/output/longtext.php: output/longtext can now apply arbitrary
+ html attributes to the wrapper div
+
+ * views/default/core/dashboard/blurb.php: Cleaned up core/dashboard/blurb to
+ take advantage of the new <div> wrapper around output/longtext
+
+2011-02-21 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * pages/settings/tools.php: Removed use of deprecated set_page_owner
+
+ * views/default/admin/sidebar.php, views/default/admin/sidebar/menu.php,
+ views/default/page/layouts/admin.php: Refs #2950: Cleaned up admin sidebar
+ code
+
+ * engine/lib/deprecated-1.8.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/page/elements/owner_block.php: elgg-owner-block-menu =>
+ elgg-menu-owner-block
+
+ * views/default/admin/sidebar/menu.php,
+ views/default/layout/shells/admin/menu.php,
+ views/default/page/layouts/admin.php: Refs #2950: layout/shells/admin/menu =>
+ admin/sidebar/menu
+
+ * engine/lib/views.php, views/default/page/admin.php,
+ views/default/page/default.php, views/default/page/shells/admin.php,
+ views/default/page/shells/default.php, views/default/page/shells/upgrade.php,
+ views/default/page/shells/walled_garden.php, views/default/page/upgrade.php,
+ views/default/page/walled_garden.php: Refs #2950: Move page/shells/ directly
+ under /page/ since nowhere else in views do we use a shells directory.
+
+ * views/default/layout/objects/widget/controls.php,
+ views/default/layout/objects/widget/settings.php,
+ views/default/object/widget.php,
+ views/default/object/widget/elements/controls.php,
+ views/default/object/widget/elements/settings.php,
+ views/default/page/components/widget.php: Refs #2950: Moved widget code to
+ object/widget/*
+
+2011-02-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php: Default page owner code now ignores the query.
+ Works for pages like pg/bookmarks/add/34?address=http://google.com
+
+2011-02-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: fixed caching of user avatars
+
+ * engine/lib/admin.php, engine/lib/views.php, mod/bookmarks/start.php,
+ mod/categories/start.php, mod/custom_index/start.php,
+ .../views/default/page/shells/theme_preview.php, mod/embed/start.php,
+ mod/file/start.php, mod/groups/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/search/start.php, mod/tinymce/start.php,
+ mod/twitter/start.php, mod/zaudio/start.php, views/default/css.php,
+ views/default/css/elements/layout_objects.php, views/default/css/elgg.php,
+ views/default/css/screen.php, views/default/page/shells/default.php: Fixes
+ #2934 switching to css/elgg for css view since using a print viewtype is a
+ good idea and screen would become a confusing idea
+
+ * actions/likes/add.php, engine/classes/ElggEntity.php, languages/en.php,
+ views/default/core/likes/display.php, views/default/core/river/controls.php:
+ fixes #2885 #2569 likes controlled by canAnnotate() with plugin hook
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggObject.php, engine/classes/ElggUser.php,
+ mod/blog/classes/ElggBlog.php, mod/thewire/classes/ElggWire.php,
+ mod/thewire/start.php, views/default/core/river/controls.php: Fixes #2971
+ added canComment() method and implemented it for ElggBlog
+
+2011-02-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/activate.php,
+ actions/admin/plugins/activate_all.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/deactivate_all.php,
+ actions/admin/plugins/set_priority.php,
+ actions/admin/plugins/simple_update_states.php, install/ElggInstaller.php,
+ languages/en.php: Fixes #2452. Removed the first admin installation notice.
+ It was just a reminder to his "save" on the simple plugins screen. This is
+ pretty obvious.
+
+ * engine/lib/upgrades/2010050701.php: Fixes #2310. Rewriting
+ disable_registration to allow_registration in walled garden upgrade.
+
+ * mod/bookmarks/actions/bookmarks/save.php,
+ mod/messageboard/actions/add.php,
+ mod/messageboard/views/default/messageboard/js.php: Fixes #2719. Removing
+ hack from bookmarks add. Now appends http:// to www.example.com and validates
+ that.
+
+2011-02-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/save.php, mod/blog/lib/blog.php: fixed blog sticky
+ forms
+
+ * mod/file/index.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/view.php, mod/groups/lib/discussion.php, mod/groups/start.php,
+ mod/pages/friends.php, mod/pages/index.php, mod/pages/start.php,
+ mod/thewire/start.php: Fixes #2970 updated groups, file, pages, and wire
+ plugins for automatic page owner setting
+
+ * mod/bookmarks/actions/bookmarks/save.php: fixed sticky forms for bookmarks
+
+
+ * mod/bookmarks/views/default/object/bookmarks.php: fixed copy and paste
+ error in bookmarks
+
+ * mod/blog/lib/blog.php, mod/bookmarks/pages/add.php,
+ mod/bookmarks/pages/all.php, mod/bookmarks/pages/edit.php,
+ mod/bookmarks/pages/friends.php, mod/bookmarks/pages/owner.php,
+ mod/bookmarks/pages/view.php, mod/bookmarks/start.php: Refs #2970 updated
+ blog and bookmarks plugins
+
+2011-02-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/create_upgrade.php: Fixed a few bugs with
+ create_upgrade.php. It now also automatically increments version.php.
+
+ * version.php: Refs #2049: Missed version.php.
+
+2011-02-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php: added code to figure out page owner rather than
+ explicitly setting in all the plugin page handlers
+
+2011-02-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * ..._svn-custom_profile_fields-390ac967b0bb5665.php: Fixes #2049. Created
+ migration for 1.7 custom profile fields to 1.8.
+
+ * mod/groups/actions/delete.php: Refs #2787, #2956: Merged fix for deleting
+ group icon files on group delete to trunk.
+
+ * views/default/core/river/filter.php: Refs #2697, #2956. Ported fix to show
+ users and groups in river filter to trunk.
+
+ * engine/lib/actions.php: Refs #2833, #2956. Merged 1.7's action timeout
+ changes to 1.8.
+
+ * engine/tests/regression/trac_bugs.php: Refs #2956. Merged left out merges
+ from r2799 to trunk.
+
+ * engine/lib/elgglib.php: Refs #2749, #2956. Merged elgg_depracated_notice()
+ fixes to trunk.
+
+ * engine/lib/configuration.php: Refs #2793, #2956. Ported
+ run_function_once() and datalist_get/set() changes for values > 32 chars to
+ trunk.
+
+ * engine/lib/configuration.php: Refs #2813, #2956. Ported get_config()
+ returns null to 1.8's get_config() and elgg_get_config().
+
+ * engine/lib/notification.php: Refs #2617, #2956: Merged email notification
+ exception message fix in r7926 to trunk.
+
+ * mod/file/start.php: Refs #2765, #2956. Merged r7830 fix for group files to
+ trunk.
+
+ * engine/classes/ElggEntity.php, engine/tests/objects/entities.php: Fixes
+ #2963: Rewrote ElggEntity->setMetadata() because yikes. Wrote unit tests for
+ setting metadata on saved / unsaved entities.
+
+2011-02-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/layouts/admin.php: only include footer/analytics view
+ once on admin pages
+
+2011-02-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../actions/resend_validation.php,
+ mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ .../views/default/uservalidationbyemail/js.php,
+ .../uservalidationbyemail/unvalidated_user.php: Fixes #2658. Merged
+ uservalidationbyemail changes from 1.7 to 1.8. This plugin needs cleanup.
+
+ * engine/lib/widgets.php: Fixed problems with user-self registration if
+ default widgets are set.
+
+ * js/lib/ui.js: Removing more debug code.
+
+ * js/lib/ui.js: Removing debug code from previous.
+
+ * js/lib/ui.js: Fixes #2947: User hover menu attached to body and shows
+ regardless of overflow.
+
+ * mod/bookmarks/actions/bookmarks/save.php: Fixes #2719: Addresses are
+ checked and normalized (and checked again) for bookmarks.
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/views/default/forms/messages/send.php: Can send messages to
+ non-friends.
+
+ * languages/en.php, views/default/admin/appearance/default_widgets.php:
+ Added instructions for default widgets.
+
+ * actions/widgets/add.php: No need to say the widget was added because we
+ can see it happen.
+
+ * views/default/css/admin.php: Copied all the icons into the admin theme.
+
+ * install/ElggInstaller.php: Installation loads 3 default widgets for the
+ admin dashboard.
+
+ * views/default/css/elements/icons.php: Refs #2961: Restoring old icon CSS
+ for sprites and hover menu.
+
+ * mod/messageboard/views/default/messageboard/js.php: Fixes #2962. I hate
+ ie.
+
+ * mod/messageboard/actions/add.php, mod/messageboard/actions/delete.php,
+ mod/messageboard/ajax_endpoint/load.php, mod/messageboard/history.php,
+ mod/messageboard/index.php, mod/messageboard/languages/en.php,
+ mod/messageboard/manifest.xml, mod/messageboard/pages/owner.php,
+ mod/messageboard/start.php, .../views/default/annotation/messageboard.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ .../default/messageboard/messageboard_content.php,
+ .../views/default/widgets/messageboard/content.php,
+ .../views/default/widgets/messageboard/edit.php: Refs #2916. More cleanup of
+ the messageboard widget.
+
+ * views/default/admin/appearance/default_widgets.php: Refs #2753. Missed
+ this one.
+
+ * js/lib/ajax.js: elgg.action() now supports full URLs.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/views/default/input/longtext.php: fixed tinymce "remove
+ editor" javascript
+
+ * languages/en.php: updated language string for comments
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/elgglib.js: elgg.normalize_url() JS does the same as
+ elgg_normalize_url() PHP.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/layout/shells/custom_index.php,
+ .../views/default/page/layouts/custom_index.php: updated the custom index for
+ new views layout structure
+
+ * mod/notifications/start.php: fixed the call to unextend the user settings
+ for notifications
+
+ * views/default/page/elements/messages.php: system messages use autop() for
+ formatting rather than output/longtext
+
+ * views/default/css/elements/chrome.php,
+ views/default/forms/comments/add.php,
+ views/default/page/elements/comments.php: improved the styling of the comment
+ area
+
+ * languages/en.php, mod/blog/languages/en.php, mod/blog/lib/blog.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php,
+ mod/thewire/views/default/object/thewire.php: Fixes #2824 moved byline text
+ in core language file
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js: Avatar menus use live() so they'll work with content
+ inserted into the dom.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/chrome.php,
+ views/default/css/elements/typography.php, views/default/output/longtext.php:
+ added elgg-output class for displaying user input with typical styling for
+ lists and tables
+
+ * engine/lib/views.php: fixed typo
+
+ * views/default/page/elements/comments.php: another work around to suppress
+ incorrect warnings from elgg_view()
+
+ * views/default/input/longtext.php: added a work around for injecting
+ internal* variables to handle deprecation code - this prevents warnings from
+ being emitted for no reason
+
+ * mod/bookmarks/views/default/object/bookmarks.php,
+ views/default/css/elements/icons.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php,
+ views/default/layout/objects/list/body.php,
+ views/default/output/tagcloud.php, views/default/output/tags.php: improved
+ icon css so that they do not require having display: block
+
+ * views/default/css/screen.php: removed a $CONFIG usage in css/screen view
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/annotation/generic_comment.php: Genericked up
+ annotation/generic_comment view to allow reuse in plugins.
+
+ * install/ElggInstaller.php: Fixes #2959: Removed engine/lib/install.php
+ from ElggInstaller since it's no longer required.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/likes/display.php: fixed typo on function name
+
+2011-02-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/page_layout.php,
+ views/default/css/elements/typography.php: Moving elgg-heading-main into
+ typography
+
+ * views/default/css/elements/page_layout.php: That wasn't supposed to be
+ there...
+
+ * views/default/css/elements/page_layout.php,
+ views/default/css/elements/typography.php: Moved elgg-heading-site into
+ typography
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messageboard/actions/add.php, mod/messageboard/start.php,
+ .../views/default/forms/messageboard/add.php,
+ .../views/default/messageboard/forms/add.php,
+ mod/messageboard/views/default/messageboard/js.php,
+ .../views/default/widgets/messageboard/content.php: Refs #2916: Moved
+ messageboard js into elgg.messageboard object. Moved forms into
+ forms/messageboard. Can post now, but wow this plugin needs cleaned up.
+
+2011-02-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/views/default/messages/topbar.php: More consistent way of
+ building topbar item for messages plugin
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/actions/bookmarks/save.php: sticky form wasn't being cleared
+ in bookmarks - that's fixed now
+
+ * mod/bookmarks/views/default/object/bookmarks.php: fixed display issue when
+ a bookmark has no description text
+
+2011-02-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/theme_preview/forms.php: elgg-state-selected doesn't
+ make sense for non-default buttons
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/actions/bookmarks/delete.php: fixed forward url when
+ deleting a bookmark
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixes #2905: Admin action links on user hover menu
+ asks for confirmation.
+
+ * engine/classes/ElggMenuItem.php,
+ views/default/navigation/menu/elements/item.php: Added 4 methods to
+ ElggMenuItem: get/setLinkClass() and get/setItemClass(). This allows you to
+ put classes on the a and li tags it generates.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: added documentation for the livesearch page handler
+
+2011-02-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/page/shells/theme_preview.php,
+ .../views/default/theme_preview/forms.php: More buttons in forms theme
+ preview
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js, views/default/output/confirmlink.php: Pulled the confirm
+ link output view's JS into elgg.us. Any links with elgg-requires-confirmation
+ will get a confirm box with the title of the anchor tag as the question, or
+ the default "Are you sure?" if that doesn't exist.
+
+ * views/default/input/plaintext.php: Fixed the tab that was showing up in
+ every text area.
+
+2011-02-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/search_hooks.php: removed $CONFIG usage in search hooks
+
+ * mod/pages/views/default/pages/sidebar/history.php: Fixes #2955 fixed typo
+
+ * mod/blog/lib/blog.php, mod/thewire/tests/regex.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/forms/admin/menu/save.php: Fixes #2428 last of the $CONFIG
+ removals. Anything missed can be individual tickets
+
+2011-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/wrapper.php: Fixes #2768. min-height
+ needed a little bit more for the profile widgets.
+
+ * mod/groups/start.php: Removing test group default widget code.
+
+ * actions/widgets/add.php, actions/widgets/delete.php,
+ actions/widgets/move.php, actions/widgets/save.php, engine/lib/views.php,
+ engine/lib/widgets.php, js/lib/ui.widgets.js, languages/en.php,
+ mod/defaultwidgets/actions/update.php, mod/defaultwidgets/languages/en.php,
+ mod/defaultwidgets/manifest.xml, mod/defaultwidgets/start.php,
+ .../admin/appearance/default_dashboard_widgets.php,
+ .../admin/appearance/default_profile_widgets.php,
+ .../views/default/defaultwidgets/editor.php, mod/groups/start.php,
+ mod/profile/start.php, views/default/object/plugin.php,
+ views/default/page/components/widget.php,
+ views/default/page/layouts/widgets.php: Fixes #2753: Default widgets merged
+ into core as extensible admin section and updated to work with new widgets.
+ Will need an upgrade for users running the old default widgets in 1.7.
+
+2011-02-19 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/shells/widgets/add_panel.php: clearfix > clearfloat
+
+ * mod/developers/languages/en.php, mod/developers/start.php,
+ .../views/default/page/shells/theme_preview.php,
+ .../views/default/theme_preview/header.php,
+ .../views/default/theme_preview/index.php,
+ mod/developers/views/default/theme_preview/nav.php,
+ .../views/default/theme_preview/navigation.php: theme_preview is using more
+ familiar/correct page handling practices
+
+2011-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/pageowner.js, views/default/js/elgg.php: Added stub for page owners
+ in elgg.js
+
+ * views/default/core/likes/display.php: Fixes #2953: Like button doesn't
+ show up for logged out users.
+
+ * engine/lib/entities.php: Fixing list_registered_entities() from displaying
+ things it should. You now must explicitly register object subtypes to get
+ them to display.
+
+ * views/default/forms/plugins/settings/save.php: Fixed plugin settings save
+ form.
+
+ * .../views/default/thewire/scripts/counter.js,
+ mod/twitterservice/start.php, mod/twitterservice/twitterservice_lib.php,
+ .../views/default/twitterservice/metatags.php: Removing unneeded @copyright
+ and @license tags.
+
+2011-02-18 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: Added some color to the selected state for
+ admin page menu so we can tell what page we're on
+
+ * views/default/css/admin.php, views/default/css/elements/reset.php: Added
+ overflow-y: scroll by default so that the page doesn't get jerky when an
+ animation breaks the fold
+
+ * views/default/css/admin.php: Improved the admin menu a bit
+
+2011-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/categories/manifest.xml, mod/custom_index/manifest.xml,
+ mod/defaultwidgets/manifest.xml, mod/developers/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/embed/manifest.xml,
+ mod/externalpages/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/oauth_lib/manifest.xml,
+ mod/pages/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/twitterservice/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: Updated copyright and author information in plugin
+ manifests.
+
+2011-02-18 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php, engine/start.php: Fixes #2943: Removed
+ engine/lib/install.php
+
+2011-02-18 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/twitterservice_lib.php: Adding plugin hooks for
+ authorization and login events.
+
+2011-02-18 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php, engine/lib/river.php, engine/lib/views.php,
+ .../views/default/theme_preview/objects.php,
+ views/default/core/river/body.php, views/default/layout/objects/gallery.php,
+ views/default/layout/objects/image_block.php,
+ views/default/layout/objects/list.php,
+ views/default/layout/objects/module.php,
+ views/default/layout/objects/widget.php, views/default/object/widget.php,
+ views/default/page/components/gallery.php,
+ views/default/page/components/image_block.php,
+ views/default/page/components/list.php,
+ views/default/page/components/module.php,
+ views/default/page/components/widget.php,
+ views/default/page/elements/owner_block.php, views/default/river/item.php:
+ Refs #2950: layout/objects => page/components
+
+2011-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/layouts/widgets.php: Removed unused var in widgets
+ layout.
+
+2011-02-18 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, views/default/layout/shells/admin.php,
+ views/default/layout/shells/content.php,
+ views/default/layout/shells/default.php,
+ views/default/layout/shells/one_column.php,
+ views/default/layout/shells/one_sidebar.php,
+ .../layout/shells/two_column_left_sidebar.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/layout/shells/widgets.php,
+ views/default/page/layouts/admin.php, views/default/page/layouts/content.php,
+ views/default/page/layouts/default.php,
+ views/default/page/layouts/one_column.php,
+ views/default/page/layouts/one_sidebar.php,
+ .../page/layouts/two_column_left_sidebar.php,
+ views/default/page/layouts/two_sidebar.php,
+ views/default/page/layouts/widgets.php: Refs #2950: layout/shells =>
+ page/layouts
+
+ * engine/lib/views.php, mod/search/views/default/search/list.php,
+ views/default/layout/elements/comments.php,
+ views/default/layout/elements/owner_block.php,
+ views/default/layout/elements/page_links.php,
+ views/default/layout/elements/sidebar.php,
+ views/default/layout/elements/title.php,
+ views/default/layout/shells/one_sidebar.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/page/elements/comments.php,
+ views/default/page/elements/owner_block.php,
+ views/default/page/elements/page_links.php,
+ views/default/page/elements/sidebar.php,
+ views/default/page/elements/title.php: Refs #2950: layout/elements =>
+ page/elements
+
+ * views/default/admin/statistics/overview.php: @todos for refactoring admin
+ statistics
+
+2011-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginPackage.php, languages/en.php: Fixes #2945, Refs
+ #2946. Plugins that require priority on an uninstalled plugin don't crash the
+ plugins admin.
+
+ * .../views/default/bookmarks/page_links.php: Don't show the bookmark this
+ link if you're not logged in.
+
+2011-02-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/views/default/file/css.php,
+ .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/icon/object/file.php,
+ views/default/css/elements/chrome.php,
+ views/default/css/elements/layout_objects.php: improved .elgg-gallery and
+ added .elgg-photo
+
+2011-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php: Refs #2847. Install now sets the
+ viewspath_cache_enabled.
+
+ * engine/lib/cache.php, install/ElggInstaller.php: Refs #2847. Fixed
+ simplecache settings and functionality for initial installation.
+
+ * engine/lib/database.php, engine/lib/deprecated-1.8.php,
+ engine/lib/upgrades/create_upgrade.php, engine/lib/version.php,
+ install/ElggInstaller.php, upgrade.php: Fixes #1433, #2183. Upgrades are now
+ tracked and will be run if needed regardless of version.
+
+2011-02-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/twitterservice_lib.php: Fixes faulty logic in twitter
+ services that allowed new users to register via twitter when site
+ registration was off.
+
+ * views/default/admin/components/plugin_settings.php: Fixes #2938: Restored
+ the $vars['entity'] in plugin settings for backward compatibility with
+ plugins.
+
+2011-02-17 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/components/plugin_settings.php: Cleaned up a manual
+ implementation of elgg-module
+
+2011-02-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_bookmarklet.gif, mod/bookmarks/graphics/bookmark.gif,
+ mod/bookmarks/graphics/bookmarklet.gif, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/bookmarks/js.php,
+ .../views/default/bookmarks/page_links.php: Further cleanup of bookmarks.
+ Moved bookmarklet to plugin. Pulled in the 1.7 bookmark pin and made the
+ "Bookmark this page" less ugly. Added js to append the title.
+
+ * mod/bookmarks/actions/bookmarks/edit.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/group_module.php,
+ .../default/bookmarks/groupprofile_bookmarks.php,
+ .../views/default/forms/bookmarks/save.php: Fixes #2680. Added group profile
+ bookmark widget. Fixed a problem editing bookmarks.
+
+ * mod/bookmarks/pages/owner.php: Hiding the filter tabs for bookmarks when
+ not in a filter context.
+
+ * views/default/layout/shells/content/filter.php: Fixed typo in filter nav
+ view.
+
+ * mod/bookmarks/lib/bookmarks.php, mod/bookmarks/pages/add.php,
+ mod/bookmarks/pages/edit.php, mod/bookmarks/pages/owner.php,
+ mod/bookmarks/start.php: Fixes #2680: Added group support to bookmarks
+ plugin.
+
+ * mod/bookmarks/bookmarklet.php, mod/bookmarks/languages/en.php,
+ mod/bookmarks/lib/bookmarks.php, mod/bookmarks/pages/add.php,
+ mod/bookmarks/pages/all.php, mod/bookmarks/pages/bookmarklet.php,
+ mod/bookmarks/pages/friends.php, mod/bookmarks/pages/owner.php,
+ mod/bookmarks/start.php, .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/owner_block.php,
+ mod/bookmarks/views/default/bookmarks/sharing.php,
+ .../default/river/object/bookmarks/annotate.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/edit.php: Refs #2680: Bookmarks revamp,
+ part 3: menus and bookmarklet.
+
+2011-02-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/file/views/default/object/file.php: calling the new category output view
+ in the plugins - looks like the pages plugin is missing the categories code
+
+ * mod/tinymce/start.php: added tinymce to admin css
+
+2011-02-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/widget/settings.php: Fixes #2915. Can edit
+ widget settings again.
+
+ * mod/bookmarks/actions/bookmarks/add.php,
+ mod/bookmarks/actions/bookmarks/delete.php,
+ mod/bookmarks/actions/bookmarks/save.php, mod/bookmarks/lib/bookmarks.php,
+ mod/bookmarks/pages/add.php, mod/bookmarks/pages/edit.php,
+ mod/bookmarks/pages/inbox.php, mod/bookmarks/pages/view.php,
+ mod/bookmarks/start.php, .../views/default/forms/bookmarks/save.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/widgets/bookmarks/content.php,
+ .../views/default/widgets/bookmarks/edit.php,
+ .../views/default/widgets/bookmarks/view.php: Refs #2680. Bookmarks revamp,
+ part 2.
+
+2011-02-16 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/groups/start.php, mod/messages/start.php, mod/pages/start.php,
+ mod/profile/start.php, mod/thewire/start.php: Updated
+ register_entity_url_handler => elgg_* in plugins. Used this regex:
+ ([^_a-z])register_entity_url_handler\((.*),(.*,.*)\);
+
+2011-02-15 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.7.php, engine/lib/deprecated-1.8.php,
+ engine/lib/elgglib.php, engine/lib/install.php, engine/lib/pam.php,
+ engine/lib/views.php, engine/lib/widgets.php: Moved all deprecated core
+ functions into the appropriate deprecation fine
+
+ * engine/lib/entities.php, engine/lib/users.php, mod/blog/start.php,
+ mod/bookmarks/start.php, mod/file/start.php, mod/groups/start.php,
+ mod/pages/start.php, mod/thewire/start.php: Removed all calls to deprecated
+ register_entity_type
+
+ * actions/admin/site/update_advanced.php, engine/handlers/cache_handler.php,
+ engine/lib/actions.php, engine/lib/admin.php, engine/lib/cache.php,
+ engine/lib/deprecated-1.8.php, engine/lib/upgrades/2010060101.php,
+ engine/lib/views.php, engine/start.php,
+ .../views/default/page/shells/theme_preview.php, mod/notifications/index.php,
+ mod/profile/start.php, views/default/core/friends/picker.php,
+ views/default/page/elements/head.php: Fixes #2923: Removed "view" prefix from
+ simplecache function names
+
+ * engine/lib/elgglib.php: Fixes #2695: Return false on autoload fail, rather
+ than throwing exception
+
+ * engine/lib/entities.php: Fixes #2777: delete_entity is now recursive
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php,
+ engine/lib/entities.php, engine/lib/extender.php, engine/lib/metadata.php,
+ engine/lib/relationships.php: Fixes #2860: Deprecated several registration
+ functions that were using the 'callback-first' ordering
+
+ * views/default/css/elements/grid.php: Fixes #2924: elgg-grid clearfixes
+
+ * engine/lib/entities.php: Fixes #2476: update_entity_last_action()
+ sanitizes posted time.
+
+2011-02-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Updated egef_plugin_user_settings() to accept
+ plugin_id instead of plugin_name.
+
+ * engine/lib/upgrades/2011010101.php: Fixes #2926: Fixed upgrade for plugin
+ user settings.
+
+2011-02-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/languages/en.php: added language strings for theme preview
+
+2011-02-15 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/shells/walled_garden.php: Refs #2693: Walledgarden code
+ cleanup -- Too much custom code
+
+2011-02-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/start.php,
+ mod/developers/views/default/developers/ipsum.php,
+ .../views/default/theme_preview/forms.php,
+ .../views/default/theme_preview/general.php,
+ .../views/default/theme_preview/objects.php,
+ .../views/default/theme_preview/widgets.php: moved lorem ipsum into a view
+
+2011-02-15 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/lib/blog.php, mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/input/datetime.php,
+ mod/blog/views/default/widgets/blog/edit.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ mod/bookmarks/views/default/bookmarks/sharing.php,
+ mod/categories/views/default/input/categories.php,
+ .../views/default/settings/categories/edit.php,
+ .../views/default/defaultwidgets/editor.php,
+ .../views/default/theme_preview/forms.php,
+ mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/upload/content.php,
+ .../views/default/forms/expages/edit.php,
+ mod/file/views/default/file/embed_upload.php,
+ mod/file/views/default/forms/file/upload.php,
+ mod/file/views/default/widgets/filerepo/edit.php,
+ .../default/settings/garbagecollector/edit.php,
+ mod/groups/views/default/forms/discussion/save.php,
+ mod/groups/views/default/forms/groups/delete.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forms/groups/search.php,
+ mod/groups/views/default/settings/groups/edit.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ .../views/default/settings/logrotate/edit.php, mod/messages/read.php,
+ .../views/default/forms/messages/process.php,
+ .../views/default/forms/messages/reply.php,
+ mod/messages/views/default/forms/messages/send.php,
+ .../notifications/subscriptions/forminternals.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ .../views/default/forms/reportedcontent/add.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/widgets/reportedcontent/edit.php,
+ .../views/default/widgets/tagcloud/edit.php,
+ mod/thewire/views/default/forms/thewire/add.php,
+ mod/thewire/views/default/widgets/thewire/edit.php,
+ mod/tinymce/views/default/input/longtext.php,
+ .../views/default/settings/twitterservice/edit.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ .../uservalidationbyemail/unvalidated_user.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/friends/picker.php, views/default/core/river/controls.php,
+ views/default/core/river/filter.php, views/default/core/river/footer.php,
+ .../core/settings/account/default_access.php,
+ views/default/core/settings/account/email.php,
+ views/default/core/settings/account/language.php,
+ views/default/core/settings/account/name.php,
+ .../core/settings/account/notifications.php,
+ views/default/core/settings/account/password.php,
+ views/default/forms/admin/menu/save.php,
+ views/default/forms/admin/site/update_advanced.php,
+ views/default/forms/admin/site/update_basic.php,
+ views/default/forms/avatar/crop.php, views/default/forms/avatar/upload.php,
+ views/default/forms/comments/add.php,
+ views/default/forms/comments/inline.php,
+ views/default/forms/friends/edit.php, views/default/forms/login.php,
+ views/default/forms/members/name_search.php,
+ views/default/forms/members/tag_search.php,
+ views/default/forms/plugins/settings/save.php,
+ views/default/forms/profile/edit.php,
+ views/default/forms/profile/fields/add.php, views/default/forms/register.php,
+ views/default/forms/user/passwordreset.php,
+ views/default/forms/user/requestnewpassword.php,
+ views/default/forms/useradd.php, views/default/forms/widgets/save.php,
+ views/default/graphics/ajax_loader.php, views/default/input/access.php,
+ views/default/input/checkboxes.php, views/default/input/datepicker.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/radio.php, views/default/input/securitytoken.php,
+ views/default/input/userpicker.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_panel.php,
+ views/default/navigation/tabs.php,
+ views/default/widgets/content_stats/edit.php,
+ views/default/widgets/friends/edit.php,
+ views/default/widgets/new_users/edit.php,
+ views/default/widgets/online_users/edit.php,
+ views/installation/input/access.php, views/installation/input/button.php,
+ views/installation/input/checkboxes.php,
+ views/installation/input/dropdown.php, views/installation/input/form.php,
+ views/installation/input/hidden.php, views/installation/input/longtext.php,
+ views/installation/input/password.php,
+ views/installation/input/securitytoken.php,
+ views/installation/input/text.php,
+ views/installation/install/forms/template.php: Fixes #2921: converted
+ internalname => name and internalid => id
+
+ * engine/lib/cache.php, engine/lib/views.php: Fixes #2920: Moved simplecache
+ functions into cache.php
+
+ * engine/classes/ElggBatch.php, engine/classes/ElggPluginManifest.php,
+ engine/lib/admin.php, engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/lib/metastrings.php, engine/lib/plugins.php, engine/lib/river.php,
+ engine/lib/views.php, engine/lib/xml.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/forms/file/upload.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/forms/discussion/save.php,
+ mod/groups/views/default/groups/edit.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/messages/views/default/forms/messages/send.php,
+ mod/messages/views/default/object/messages.php,
+ mod/pages/views/default/object/page_top.php,
+ .../views/default/pages/sidebar/navigation.php,
+ mod/profile/views/default/profile/owner_block.php,
+ mod/thewire/views/default/forms/thewire/add.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/metadata.php,
+ mod/uservalidationbyemail/start.php,
+ .../uservalidationbyemail/unvalidated_user.php,
+ views/default/admin/components/invalid_plugin.php,
+ .../admin/components/plugin_dependencies.php,
+ views/default/annotation/generic_comment.php,
+ views/default/forms/plugins/settings/save.php,
+ views/default/forms/widgets/save.php, views/default/icon/user/default.php,
+ views/default/input/checkboxes.php, views/default/input/radio.php,
+ views/default/layout/elements/comments.php,
+ views/default/layout/objects/gallery.php,
+ views/default/layout/objects/image_block.php,
+ views/default/layout/objects/list.php,
+ views/default/layout/objects/list/body.php,
+ views/default/layout/objects/list/metadata.php,
+ views/default/layout/objects/module.php,
+ views/default/layout/objects/widget.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/shells/content.php,
+ views/default/layout/shells/content/filter.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_panel.php,
+ views/default/navigation/breadcrumbs.php,
+ views/default/navigation/menu/elements/group.php,
+ views/default/navigation/menu/user_hover.php,
+ views/default/navigation/pagination.php, views/default/navigation/tabs.php,
+ views/default/object/plugin.php, views/default/output/confirmlink.php,
+ views/default/output/longtext.php, views/default/output/url.php,
+ views/default/page/elements/body.php, views/default/profile/icon.php,
+ views/rss/layout/objects/list.php: Fixes #2808: elgg_get_array_value =>
+ elgg_extract
+
+ * js/lib/userpicker.js, views/default/input/autocomplete.php,
+ views/default/input/userpicker.php: Refs #2102: addressing more
+ userpicker/autocomplete bugs
+
+ * views/default/input/autocomplete.php: Refs #2102: Some input/autocomplete
+ fixes
+
+ * documentation/stubs/config.php, engine/handlers/page_handler.php,
+ engine/lib/admin.php, engine/lib/cron.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/input.php, engine/lib/pagehandler.php,
+ engine/lib/river.php, engine/lib/tags.php, engine/lib/user_settings.php,
+ engine/lib/users.php, js/lib/friends_picker.js, mod/blog/start.php,
+ mod/bookmarks/start.php, mod/categories/start.php, mod/developers/start.php,
+ mod/diagnostics/start.php, mod/embed/start.php, mod/externalpages/start.php,
+ mod/file/start.php, mod/groups/start.php, mod/invitefriends/start.php,
+ mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/search/start.php, mod/thewire/start.php,
+ mod/twitterservice/start.php, mod/uservalidationbyemail/start.php: Replaced
+ all occurrences of register_page_handler in core with
+ elgg_register_page_handler
+
+ * views/default/js/friendsPickerv1.php: Friendspicker was moved to
+ js/lib/friends_picker.js
+
+ * js/lib/userpicker.js, views/default/input/userpicker.php: Refs #2102:
+ Replace input/userpicker with jQuery UI autocomplete
+
+ * htaccess_dist: Combining two rewrite rules into one
+
+2011-02-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/autocomplete.js, views/default/input/autocomplete.php: Refs #2102:
+ Replaced input/autocomplete with jQuery UI autocomplete (untested)
+
+ * engine/lib/deprecated-1.8.php, engine/lib/pagehandler.php: Prepended elgg_
+ to (un)register_page_handler() functions. Deprecated old ones
+
+ * views/default/js/initialize_elgg.php,
+ views/default/page/elements/head.php: Views in the js/ directory should not
+ contain <script> tags
+
+2011-02-14 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/twitterservice_lib.php: Saving avatar filename with
+ user GUID instead of old-style username.
+
+2011-02-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/elgg.php: Removed unnecessary deprecated javascript
+ function
+
+ * js/lib/languages.js, js/lib/session.js, js/lib/ui.widgets.js: No need for
+ double-namespacing of javascript functions
+
+ * mod/developers/views/default/developers/css.php: Give the css preview a
+ little more vertical breathing room
+
+ * engine/lib/views.php: Refs #2610: Custom template handler for views now
+ sent through call_user_func
+
+ * engine/lib/views.php: Refs #2124: Adding backwards compatibility
+ conversions for internalname/internalid
+
+ * views/default/page/elements/body.php,
+ views/default/page/elements/footer.php,
+ views/default/page/elements/header.php,
+ views/default/page/elements/messages.php,
+ views/default/page/elements/topbar.php, views/default/page/shells/admin.php,
+ views/default/page/shells/default.php: Cleaned up views/default/page/
+ directory
+
+ * engine/lib/views.php, vendors/jquery/jquery-1.4.2.min.js,
+ vendors/jquery/jquery-1.5.min.js, vendors/jquery/jquery-ui-1.7.2.min.js,
+ vendors/jquery/jquery-ui-1.8.9.min.js: Refs #2525: jQuery => 1.5, jQuery UI
+ => 1.8.9
+
+ * views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php,
+ views/default/css/elements/modules.php: More cleanup of login/forms css --
+ converted login_dropdown to use elgg-toggler pattern
+
+ * js/lib/ui.js: Fixes #2902: Added elgg-toggler pattern.
+
+2011-02-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: remove some unused css from admin theme
+
+2011-02-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggBatch.php: Clearing caches in ElggBatch.
+
+ * engine/handlers/cache_handler.php: Cache handler won't serve up cached
+ pages if caching is disabled. Refs #2758: Added call to
+ elgg_view_regenerate_simplecache() on cache misses if cache is enabled.
+ Leaving #2758 open in case Cash has a better idea since he's more familiar
+ with the simple cache changes.
+
+ * engine/classes/ElggEntity.php, engine/lib/metadata.php: Removed last of
+ deprecated metadata calls in trunk.
+
+ * actions/comments/delete.php, actions/likes/delete.php,
+ actions/profile/edit.php, engine/classes/ElggAnnotation.php,
+ engine/classes/ElggEntity.php, engine/classes/ElggRiverItem.php,
+ engine/handlers/export_handler.php, engine/lib/annotations.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/tests/api/entity_getter_functions.php,
+ engine/tests/api/metastrings.php, engine/tests/regression/trac_bugs.php,
+ mod/blog/lib/blog.php, mod/messageboard/actions/delete.php,
+ mod/pages/revision.php: Updated trunk to use new annotation functions. Added
+ checks for annotations_* options vs annotation_* options because it's so easy
+ to confuse.
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggUser.php,
+ engine/lib/entities.php: Fixes #2918. Moved annotation/metadata delete
+ functions from ElggUser to ElggEntity. When deleted, entities now correctly
+ delete metadata they own as well as metadata on them. Removed uses of
+ deprecated functions.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php: More fixes to annotations/metadata changes. Now
+ all function support getting via a metastring id.
+
+ * engine/lib/relationships.php: Fixes #2914. Merged fix for r.time_created
+ sorting to trunk.
+
+2011-02-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/developers/start.php, .../views/default/theme_preview/forms.php,
+ .../views/default/theme_preview/header.php, views/default/icon/default.php:
+ getting rid of some warnings in theme preview
+
+ * mod/developers/start.php, .../views/default/admin/developers/preview.php,
+ .../views/default/theme_preview/forms.php,
+ .../views/default/theme_preview/general.php,
+ .../views/default/theme_preview/grid.php,
+ .../views/default/theme_preview/header.php,
+ .../views/default/theme_preview/icons.php,
+ mod/developers/views/default/theme_preview/nav.php,
+ .../views/default/theme_preview/objects.php,
+ .../views/default/theme_preview/widgets.php: Refs #2903 navigation updated
+ for theme preview
+
+2011-02-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php,
+ engine/lib/elgglib.php, engine/lib/metadata.php,
+ engine/tests/api/metastrings.php,
+ mod/pages/views/default/object/page_top.php: Refs #2912. Added checks for
+ constraints in dangerous functions. Unit tests no longer remove all
+ metadata/annotations.
+
+2011-02-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/theming/preview/forms.php,
+ documentation/theming/preview/general.php,
+ documentation/theming/preview/grid.php,
+ documentation/theming/preview/head.php,
+ documentation/theming/preview/icons.php,
+ documentation/theming/preview/index.php,
+ documentation/theming/preview/nav.php,
+ documentation/theming/preview/objects.php,
+ documentation/theming/preview/widgets.php, mod/developers/start.php,
+ .../views/default/page/shells/theme_preview.php,
+ .../views/default/theme_preview/forms.php,
+ .../views/default/theme_preview/general.php,
+ .../views/default/theme_preview/grid.php,
+ .../views/default/theme_preview/icons.php,
+ .../views/default/theme_preview/index.php,
+ mod/developers/views/default/theme_preview/nav.php,
+ .../views/default/theme_preview/objects.php,
+ .../views/default/theme_preview/widgets.php: Refs #2903 moving theme preview
+ into developers plugin - navigation and titles are broken
+
+2011-02-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php, engine/lib/entities.php,
+ engine/tests/objects/entities.php: Deprecated ElggEntity->clearMetadata() by
+ ElggEntity->deleteMetadata(). Disabling entities now disables their
+ annotations and metadata. Enabling entities enables annotations and metadata.
+ Fixes #1115.
+
+ * engine/classes/ElggBatch.php: If using a callback in ElggBatch, make sure
+ there's an initial value to return.
+
+ * engine/lib/metastrings.php: Allowing metastrings_type for metastring-based
+ object functions.
+
+2011-02-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: added tabs to admin theme
+
+ * mod/externalpages/actions/add.php, mod/externalpages/actions/addfront.php,
+ mod/externalpages/actions/edit.php, mod/externalpages/index.php,
+ mod/externalpages/languages/en.php, mod/externalpages/manifest.xml,
+ mod/externalpages/read.php, mod/externalpages/start.php,
+ .../views/default/expages/analytics.php,
+ mod/externalpages/views/default/expages/css.php,
+ .../views/default/expages/footer_menu.php,
+ .../views/default/expages/forms/edit.php,
+ .../views/default/expages/forms/editfront.php,
+ .../views/default/expages/front_left.php,
+ .../views/default/expages/front_right.php,
+ mod/externalpages/views/default/expages/menu.php,
+ .../views/default/forms/expages/edit.php,
+ mod/externalpages/views/default/object/expages.php: updates externalpages to
+ 1.8
+
+2011-02-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggMetadata.php, engine/lib/annotations.php,
+ engine/lib/deprecated-1.8.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/tests/api/metastrings.php: Refs #2907. DRY'd up and abstracted out a
+ lot of metadata / annotation functions so I can implement #1115 with a clean
+ conscious.
+
+2011-02-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/externalpages/actions/add.php, mod/externalpages/actions/addfront.php,
+ mod/externalpages/index.php, mod/externalpages/languages/en.php,
+ mod/externalpages/manifest.xml, mod/externalpages/read.php,
+ mod/externalpages/start.php, .../views/default/expages/analytics.php,
+ mod/externalpages/views/default/expages/css.php,
+ .../views/default/expages/footer_menu.php,
+ .../views/default/expages/forms/edit.php,
+ .../views/default/expages/forms/editfront.php,
+ .../views/default/expages/front_left.php,
+ .../views/default/expages/front_right.php,
+ mod/externalpages/views/default/expages/menu.php,
+ mod/externalpages/views/default/object/expages.php, mod/sitepages/README.txt,
+ mod/sitepages/actions/edit_settings.php, mod/sitepages/index.php,
+ mod/sitepages/languages/en.php, mod/sitepages/manifest.xml,
+ mod/sitepages/sitepages_functions.php, mod/sitepages/start.php,
+ .../views/default/admin/site/sitepages.php,
+ .../views/default/canvas/layouts/frontpage.php,
+ mod/sitepages/views/default/sitepages/css.php,
+ .../views/default/sitepages/custom_frontpage.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ .../views/default/sitepages/keywords/sitestats.php,
+ .../views/default/sitepages/keywords/userlist.php,
+ mod/sitepages/views/default/sitepages/members.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/sitepages/views/default/sitepages/metatags.php,
+ mod/sitepages/views/default/sitepages/sidebar.php,
+ mod/sitepages/views/default/sitepages/welcome.php: swapping sitepages for
+ externalpages since the external pages is easier to integrate into 1.8 .
+ sitepages needs more work before it is ready for release (plus we would need
+ an upgrade script)
+
+ * engine/lib/entities.php: Refs #2301 demoting type:subtype warnings to
+ notices
+
+ * actions/email/save.php, actions/user/default_access.php,
+ actions/user/language.php, actions/user/name.php, actions/user/password.php,
+ engine/lib/user_settings.php, engine/lib/users.php,
+ views/default/core/settings/account/language.php,
+ views/default/forms/account/settings.php: Fixes #2848 pulls user settings
+ code out of actions into functions. We should investigate putting them in a
+ library that is only loaded on demand
+
+ * engine/lib/user_settings.php, engine/lib/usersettings.php,
+ engine/start.php, install/ElggInstaller.php: user settings library is now
+ user_settings.php
+
+ * engine/lib/admin.php: documentation update for admin functions
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/admin.php, languages/en.php,
+ views/default/layout/shells/admin/menu.php: admin menu uses weights for
+ ordering
+
+2011-02-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggBatch.php: Additional checking in ElggBatch for valid
+ key.
+
+2011-02-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/confirmlink.php, views/default/output/dropdown.php,
+ views/default/output/email.php, views/default/output/pulldown.php,
+ views/default/output/radio.php, views/default/output/text.php,
+ views/default/output/url.php: Fixed #2218 finished up the encoding issues by
+ turning of double encoding
+
+ * mod/categories/views/default/categories/css.php,
+ mod/categories/views/default/input/categories.php: categories are listed
+ horizontally
+
+2011-02-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggBatch.php: Added ability to get results of callback
+ function in ElggBatch.
+
+ * engine/classes/ElggBatch.php: Fixed ElggBatch problems when specifying a
+ limit of 0. Fixed a shoot yourself in the foot situation if passing a dumb
+ number to chunk size.
+
+ * engine/classes/ElggBatch.php: Added ElggBatch class for more efficient
+ batch operations on large sets of Elgg* objects.
+
+2011-02-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/shells/admin.php: added the footer analytics view for
+ js
+
+ * mod/custom_index/index.php, mod/custom_index/languages/en.php,
+ mod/custom_index/manifest.xml, mod/custom_index/start.php,
+ .../views/default/canvas/layouts/new_index.php,
+ .../views/default/custom_index/css.php,
+ .../views/default/layout/shells/custom_index.php: updated custom index for
+ 1.8
+
+2011-02-13 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/account/login_dropdown.php,
+ views/default/css/elements/misc.php: Renamed signin to elgg-button-dropdown
+
+ * views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/misc.php, views/default/css/elements/modules.php,
+ views/default/forms/login.php: Progress refactoring the login dropdown and
+ login forms -- not quite there yet, though Added another module: dropdown.
+
+2011-02-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/custom_index/index.php, mod/custom_index/languages/en.php,
+ mod/custom_index/manifest.xml, mod/custom_index/start.php,
+ .../views/default/canvas/layouts/new_index.php,
+ .../views/default/custom_index/css.php: moved custom_index back into core
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/layout_objects.php: Updated docs for
+ layout_objects
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php, views/default/core/river/footer.php: Refs
+ #650. Replaced count_annotations().
+
+ * mod/pages/views/default/pages/sidebar/history.php,
+ views/default/core/likes/display.php, views/default/core/river/controls.php,
+ views/default/layout/elements/comments.php: Refs #650. Replaced
+ list_annotations() by elgg_list_annotations().
+
+ * engine/classes/ElggEntity.php, engine/lib/views.php,
+ mod/messageboard/history.php: Updated a few recent calls to
+ elgg_get_annotations() to use 'reverse_order_by' => true.
+
+ * engine/lib/metastrings.php: Refs #2906. Missed a file.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php: Fixes #2906. Added
+ elgg_sql_reverse_order_by() and wired it up to ege() and ega(). Pass
+ 'reverse_order_by' => true in option arrays.
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php, mod/thewire/actions/delete.php,
+ mod/thewire/add.php, mod/thewire/everyone.php, mod/thewire/index.php,
+ mod/thewire/languages/en.php, mod/thewire/manifest.xml,
+ mod/thewire/pages/everyone.php, mod/thewire/pages/friends.php,
+ mod/thewire/pages/previous.php, mod/thewire/pages/reply.php,
+ mod/thewire/pages/tag.php, mod/thewire/pages/thread.php,
+ mod/thewire/pages/user.php, mod/thewire/readme.txt, mod/thewire/start.php,
+ mod/thewire/tests/regex.php, mod/thewire/views/default/forms/thewire/add.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/thewire/views/default/thewire/metadata.php,
+ mod/thewire/views/default/thewire/notfound.php,
+ .../views/default/thewire/profile_status.php,
+ mod/thewire/views/default/thewire/reply.php,
+ mod/thewire/views/default/thewire/view.php,
+ .../views/default/widgets/thewire/content.php,
+ mod/thewire/views/default/widgets/thewire/edit.php: a mostly completed port
+ of JHU/APL wire plugin to 1.8
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php, engine/lib/annotations.php,
+ engine/lib/views.php, engine/tests/objects/entities.php,
+ mod/messageboard/history.php, views/default/core/likes/display.php,
+ views/default/core/river/controls.php, views/default/core/river/footer.php:
+ Refs #650. Replaced calls to get_annotations() by elgg_get_annotations().
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/details.php: added the status view into
+ details on profile page
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php, engine/lib/users.php,
+ views/default/forms/profile/edit.php: Refs #650. Replaced uses for
+ get_metadata_byname() by elgg_get_metadata()
+
+ * engine/classes/ElggMetadata.php, engine/handlers/export_handler.php,
+ engine/lib/deprecated-1.8.php, engine/lib/metadata.php: Refs #650. Changed
+ elgg_get_metadata_by_id() to elgg_get_metadata_from_id() to be consistent
+ with other functions.
+
+ * engine/classes/ElggMetadata.php, engine/handlers/export_handler.php,
+ engine/lib/metadata.php: Refs #650. Replaced get_metadata() by
+ elgg_get_metadata_by_id()
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggFile.php,
+ engine/lib/metadata.php, engine/lib/notification.php,
+ views/default/export/entity.php: Refs #650: Replaced uses of
+ get_metadata_for_entity() by elgg_get_metadata().
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/list/body.php: allow plugins to decline the
+ addition of tags to their entity list view
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php, engine/lib/metadata.php: Deprecated
+ get_metadata() by elgg_get_metadata_by_id() to avoid confusion with
+ elgg_get_metadata(). Not in love with the name...had considered
+ elgg_get_metadatum(). Open to suggestions.
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php: Refs #650: Deprecated
+ find_metadata() with elgg_get_metadata(). Deprecated
+ get_metadata_for_entity() and get_metadata_byname() <twitch>. Added
+ elgg_get_metastrings_based_objects() to deal with the commonalities between
+ the metadata and annotation getter functions.
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/checkboxes.php: Label wraps checkbox for usability
+
+ * mod/minify/lib/min/.htaccess, mod/minify/lib/min/README.txt,
+ mod/minify/lib/min/builder/_index.js, mod/minify/lib/min/builder/bm.js,
+ mod/minify/lib/min/builder/index.php, mod/minify/lib/min/builder/ocCheck.php,
+ mod/minify/lib/min/builder/rewriteTest.js, mod/minify/lib/min/config.php,
+ mod/minify/lib/min/groupsConfig.php, mod/minify/lib/min/index.php,
+ mod/minify/lib/min/lib/CSS.php, mod/minify/lib/min/lib/FirePHP.php,
+ mod/minify/lib/min/lib/HTTP/ConditionalGet.php,
+ mod/minify/lib/min/lib/HTTP/Encoder.php, mod/minify/lib/min/lib/JSMin.php,
+ mod/minify/lib/min/lib/JSMinPlus.php, mod/minify/lib/min/lib/Minify.php,
+ mod/minify/lib/min/lib/Minify/Build.php,
+ mod/minify/lib/min/lib/Minify/CSS/Compressor.php,
+ mod/minify/lib/min/lib/Minify/CSS/UriRewriter.php,
+ mod/minify/lib/min/lib/Minify/Cache/APC.php,
+ mod/minify/lib/min/lib/Minify/Cache/File.php,
+ mod/minify/lib/min/lib/Minify/Cache/Memcache.php,
+ mod/minify/lib/min/lib/Minify/CommentPreserver.php,
+ mod/minify/lib/min/lib/Minify/Controller/Base.php,
+ mod/minify/lib/min/lib/Minify/Controller/Files.php,
+ .../lib/min/lib/Minify/Controller/Groups.php,
+ .../lib/min/lib/Minify/Controller/MinApp.php,
+ mod/minify/lib/min/lib/Minify/Controller/Page.php,
+ .../lib/min/lib/Minify/Controller/Version1.php,
+ mod/minify/lib/min/lib/Minify/HTML.php,
+ mod/minify/lib/min/lib/Minify/ImportProcessor.php,
+ mod/minify/lib/min/lib/Minify/Lines.php,
+ mod/minify/lib/min/lib/Minify/Logger.php,
+ mod/minify/lib/min/lib/Minify/Packer.php,
+ mod/minify/lib/min/lib/Minify/Source.php,
+ mod/minify/lib/min/lib/Minify/YUICompressor.php,
+ mod/minify/lib/min/lib/Solar/Dir.php, mod/minify/lib/min/utils.php,
+ mod/minify/manifest.xml, mod/minify/start.php: Doh, how did this get here?
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/examples/plugins/manifest.xml,
+ engine/tests/test_files/plugin_18/manifest.xml: Refs #2898: Updated docs and
+ test manifest for the xmlns changes.
+
+ * engine/classes/ElggPluginManifest.php, mod/blog/manifest.xml,
+ mod/bookmarks/manifest.xml, mod/categories/manifest.xml,
+ mod/defaultwidgets/manifest.xml, mod/developers/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/embed/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/minify/manifest.xml, mod/notifications/manifest.xml,
+ mod/oauth_lib/manifest.xml, mod/pages/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/sitepages/manifest.xml, mod/tagcloud/manifest.xml,
+ mod/thewire/manifest.xml, mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/twitterservice/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: Refs #2898: Using an XML namespace instead of
+ version attribute on plugin manifests.
+
+ * mod/twitterservice/languages/en.php,
+ mod/twitterservice/twitterservice_lib.php,
+ .../views/default/settings/twitterservice/edit.php: Cleaned up more
+ twitterservice code. Twitter usernames now have random digits appended upon
+ name collision. Added the option for admins to allow twitter sign up even if
+ site registration is disabled.
+
+ * actions/admin/user/delete.php: Deleting a user from his profile forwards
+ to the right page.
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/delete.php, mod/file/actions/file/upload.php,
+ mod/pages/actions/pages/delete.php: Fixed #2887 redirects on blog, file, and
+ pages works now - bookmarks plugin still needs plenty of work
+
+ * mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, .../actions/reportedcontent/add.php,
+ .../actions/reportedcontent/archive.php,
+ .../actions/reportedcontent/delete.php, mod/reportedcontent/start.php,
+ .../views/default/forms/reportedcontent/add.php,
+ .../views/default/reportedcontent/form.php: updated reported content to use
+ elgg_view_form
+
+ * views/default/css/admin.php,
+ views/default/forms/admin/site/update_advanced.php,
+ views/default/forms/admin/site/update_basic.php,
+ views/default/forms/avatar/crop.php, views/default/forms/avatar/upload.php,
+ views/default/forms/comments/add.php, views/default/forms/friends/edit.php,
+ views/default/forms/login.php, views/default/forms/plugins/settings/save.php,
+ views/default/forms/profile/edit.php, views/default/forms/register.php,
+ views/default/forms/user/requestnewpassword.php,
+ views/default/forms/useradd.php, views/default/forms/usersettings/save.php,
+ views/default/forms/widgets/save.php, views/default/group/default.php: Refs
+ #2032 core forms use divs
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/widgets/blog/edit.php,
+ mod/categories/views/default/input/categories.php,
+ .../views/default/forms/diagnostics/download.php,
+ mod/file/views/default/forms/file/upload.php,
+ mod/file/views/default/widgets/filerepo/edit.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ .../views/default/forms/invitefriends/invite.php,
+ .../views/default/forms/messages/reply.php,
+ mod/messages/views/default/forms/messages/send.php,
+ .../forms/notificationsettings/groupsave.php,
+ .../default/forms/notificationsettings/save.php,
+ .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/personal.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/widgets/reportedcontent/edit.php,
+ .../default/usersettings/twitterservice/edit.php: updated the plugins that
+ have already been updated to 1.8 html/css to use divs rather than p tags in
+ forms
+
+ * mod/groups/views/default/forms/groups/delete.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/edit.php: pulled delete form out of edit view
+ for groups
+
+ * mod/groups/views/default/forms/discussion/save.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ views/default/css/elements/forms.php: recommended to use <div> in forms for
+ wrapping content - added css to support that and updated all group forms
+
+ * views/default/input/form.php: moved security tokens to top of form so we
+ can use :last-child
+
+ * views/default/input/access.php: fixed another bug from last night
+
+ * views/default/input/plaintext.php, views/default/input/radio.php: fixing a
+ few bugs introduced last night in the input views
+
+ * mod/bookmarks/languages/en.php: fixed enable group bookmarks language
+ string
+
+ * views/default/input/checkboxes.php, views/default/input/radio.php: Refs
+ #1393 added work around note to checkboxes and radio inputs for integer
+ labels
+
+ * views/default/css/elements/forms.php, views/default/input/checkboxes.php,
+ views/default/input/radio.php: Fixes #972 checkboxes and radio input fields
+ support horizontal and vertical alignments
+
+ * mod/blog/lib/blog.php: blog object wasn't being passed to the form view
+
+ * engine/lib/output.php: fixed bug in elgg_format_attributes() that caused
+ none string values to be ignored
+
+ * views/default/input/form.php: reverted part of [8148] that broke all forms
+
+
+ * views/default/admin/components/plugin_settings.php,
+ views/default/forms/plugins/settings/save.php: continued cleaning up admin
+ plugin settings
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/radio.php: Fixes #2143: DRYed up input/radio -- other
+ views still should be addressed, but not because they aren't DRY, therefore
+ I'm calling this ticket closed
+
+ * views/default/input/checkbox.php, views/default/input/form.php,
+ views/default/input/password.php, views/default/input/pulldown.php: Refs
+ #2143: General cleanup of input views
+
+ * views/default/input/access.php: Refs #2143: DRYed up input/access -- wow,
+ that feels good
+
+ * views/default/input/longtext.php: Refs #2143: DRYed up input/longtext --
+ maybe I missed it, but was there a difference b/w plaintext and longtext?
+
+ * views/default/input/plaintext.php: Refs #2143: DRYed up input/plaintext
+
+ * views/default/input/dropdown.php: Refs #2143: DRYed up input/dropdown --
+ probably could be better still
+
+ * views/default/input/hidden.php: Refs #2143: DRY up input/hidden
+
+ * views/default/input/password.php: Refs #2143: DRYed up input/password
+
+ * views/default/input/file.php: Refs #2143: DRYed up input/file
+
+ * engine/lib/deprecated-1.8.php, engine/lib/entities.php:
+ register_entity_url_handler => elgg_register_entity_url_handler (because
+ every other reigstration function asks for the callback last)
+
+ * engine/lib/entities.php, engine/lib/extender.php,
+ engine/lib/relationships.php: Refs #2610: Using call_user_func in url hooks
+
+ * engine/lib/pagehandler.php: Page handler uses call_user_func (so methods
+ of classes can be used as page handlers)
+
+2011-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/start.php, mod/twitterservice/twitterservice_lib.php:
+ Twitter services now allows login with twitter properly for a single user.
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php: Added
+ elgg_get_entities_from_plugin_user_settings(). Added a name_prefix option to
+ elgg_get_entities_from_private_settings().
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/theming/preview/objects.php, engine/lib/views.php,
+ mod/blog/views/default/blog/group_module.php,
+ mod/blog/views/default/blog/sidebar/archives.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/sidebar/featured.php,
+ mod/groups/views/default/groups/sidebar/find.php,
+ .../views/default/groups/sidebar/members.php,
+ mod/pages/views/default/pages/group_module.php,
+ mod/pages/views/default/pages/sidebar/history.php,
+ .../views/default/pages/sidebar/navigation.php,
+ views/default/core/members/sidebar.php, views/default/core/river/body.php,
+ views/default/layout/elements/owner_block.php,
+ views/default/layout/shells/admin/menu.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/output/tagcloud.php: Fixes #2904: Converted most
+ elgg_view('layout/objects/module') instances to elgg_view_module()
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/head.php, views/default/page/shells/admin.php,
+ views/default/page/shells/default.php,
+ views/default/page/shells/walled_garden.php: pulled <head> out into page
+ shell also
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Added an elgg_view_module shortcut function -- now
+ to try it out!
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/topbar.php: fixed topbar html
+
+2011-02-12 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Added missing @deprecated tags to a couple
+ functions
+
+ * engine/lib/deprecated-1.8.php, engine/lib/views.php: set_view_location =>
+ elgg_set_view_location (to match elgg_get_view_location)
+
+ * views/default/spotlight/default.php: Bye bye spotlight
+
+ * engine/lib/users.php: One more conversion to elgg_view_form
+
+ * .../views/default/diagnostics/forms/download.php,
+ .../views/default/forms/diagnostics/download.php,
+ mod/file/views/default/file/embed_upload.php,
+ mod/file/views/default/forms/file/upload.php,
+ .../views/default/forms/invitefriends/invite.php,
+ .../views/default/invitefriends/form.php,
+ .../views/default/invitefriends/formitems.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/minify/lib/min/.htaccess, mod/minify/lib/min/README.txt,
+ mod/minify/lib/min/builder/_index.js, mod/minify/lib/min/builder/bm.js,
+ mod/minify/lib/min/builder/index.php, mod/minify/lib/min/builder/ocCheck.php,
+ mod/minify/lib/min/builder/rewriteTest.js, mod/minify/lib/min/config.php,
+ mod/minify/lib/min/groupsConfig.php, mod/minify/lib/min/index.php,
+ mod/minify/lib/min/lib/CSS.php, mod/minify/lib/min/lib/FirePHP.php,
+ mod/minify/lib/min/lib/HTTP/ConditionalGet.php,
+ mod/minify/lib/min/lib/HTTP/Encoder.php, mod/minify/lib/min/lib/JSMin.php,
+ mod/minify/lib/min/lib/JSMinPlus.php, mod/minify/lib/min/lib/Minify.php,
+ mod/minify/lib/min/lib/Minify/Build.php,
+ mod/minify/lib/min/lib/Minify/CSS/Compressor.php,
+ mod/minify/lib/min/lib/Minify/CSS/UriRewriter.php,
+ mod/minify/lib/min/lib/Minify/Cache/APC.php,
+ mod/minify/lib/min/lib/Minify/Cache/File.php,
+ mod/minify/lib/min/lib/Minify/Cache/Memcache.php,
+ mod/minify/lib/min/lib/Minify/CommentPreserver.php,
+ mod/minify/lib/min/lib/Minify/Controller/Base.php,
+ mod/minify/lib/min/lib/Minify/Controller/Files.php,
+ .../lib/min/lib/Minify/Controller/Groups.php,
+ .../lib/min/lib/Minify/Controller/MinApp.php,
+ mod/minify/lib/min/lib/Minify/Controller/Page.php,
+ .../lib/min/lib/Minify/Controller/Version1.php,
+ mod/minify/lib/min/lib/Minify/HTML.php,
+ mod/minify/lib/min/lib/Minify/ImportProcessor.php,
+ mod/minify/lib/min/lib/Minify/Lines.php,
+ mod/minify/lib/min/lib/Minify/Logger.php,
+ mod/minify/lib/min/lib/Minify/Packer.php,
+ mod/minify/lib/min/lib/Minify/Source.php,
+ mod/minify/lib/min/lib/Minify/YUICompressor.php,
+ mod/minify/lib/min/lib/Solar/Dir.php, mod/minify/lib/min/utils.php,
+ mod/minify/manifest.xml, mod/minify/start.php, mod/notifications/groups.php,
+ .../forms/notificationsettings/groupsave.php,
+ .../default/forms/notificationsettings/save.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../forms/uservalidationbyemail/bulk_action.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/river/footer.php, views/default/core/settings/account.php,
+ views/default/forms/admin/site/update_advanced.php,
+ views/default/forms/admin/site/update_basic.php,
+ views/default/forms/friends/edit.php,
+ views/default/forms/user/passwordreset.php, views/default/forms/useradd.php,
+ views/default/forms/usersettings/save.php,
+ views/default/forms/widgets/save.php,
+ views/default/layout/objects/widget/settings.php,
+ views/installation/install/forms/admin.php,
+ views/installation/install/forms/database.php,
+ views/installation/install/forms/settings.php: Converted most forms to use
+ elgg_view_form (therefore also moved the views to forms/*). Some views are
+ left that _only_ do elgg_view_form, so I wonder if those should even be kept
+ around.
+
+2011-02-12 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/twitterservice_lib.php: Registering forward() calls to
+ a plugin-specific reason for use in plugin hooks.
+
+2011-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php, mod/embed/start.php,
+ mod/embed/views/default/embed/addcontentjs.php,
+ mod/embed/views/default/embed/lightbox_init.php,
+ mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/metatags.php: light clean up on the embed
+ plugin which doesn't appear to work at present
+
+2011-02-11 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Typo correction: @deprecate => @deprecated
+
+ * mod/blog/views/default/js/blog/save_draft.php,
+ .../views/default/widgets/bookmarks/view.php,
+ .../views/default/defaultwidgets/editor.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/gallery.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/metatags.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/file/views/default/file/embed_upload.php,
+ .../views/default/groups/profile/widgets.php,
+ .../views/default/widgets/messageboard/content.php,
+ .../views/default/forms/messages/process.php,
+ .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/jsfuncs.php,
+ .../views/default/pages/sidebar/navigation.php,
+ mod/profile/views/default/profile/wrapper.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/tinymce/views/default/tinymce/init.php,
+ mod/zaudio/views/default/zaudio/audioplayer.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/friends/collection.php,
+ views/default/core/friends/collections.php,
+ views/default/core/friends/collectiontabs.php,
+ views/default/core/friends/picker.php,
+ .../default/core/friends/tablelistcountupdate.php,
+ views/default/core/river/filter.php, views/default/forms/avatar/crop.php,
+ views/default/forms/register.php,
+ views/default/forms/user/requestnewpassword.php,
+ views/default/input/autocomplete.php, views/default/input/datepicker.php,
+ views/default/input/userpicker.php,
+ views/installation/install/forms/template.php: Added disapproving @todo's
+ wherever I could find javascript not conforming to 1.8 conventions
+
+2011-02-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/categories/actions/save.php, mod/categories/languages/en.php,
+ mod/categories/listing.php, mod/categories/readme.txt,
+ mod/categories/start.php, mod/categories/views/default/categories.php,
+ mod/categories/views/default/categories/list.php,
+ mod/categories/views/default/categories/view.php,
+ mod/categories/views/default/input/categories.php,
+ mod/categories/views/default/output/categories.php,
+ .../views/default/settings/categories/edit.php: some clean up of the
+ categories plugin - html/css polish needed
+
+2011-02-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Fixes #2888: Plugins are checked for validity in
+ elgg_get_plugins(). It won't return broken plugins unless specifically
+ requested.
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php: Moved
+ list_entities_from_annotation_count_by_metadata() to deprecated-18.php.
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php: Refs #650.
+ Added 'annotation_calculation' to elgg_get_annotations(). Deprecated
+ list_annotations() by elgg_list_annotations(). Deprecated get_annotations_*()
+ by elgg_get_annotations() and passing annotation_calculation.
+
+ * engine/lib/entities.php: Added $viewer callback option for
+ elgg_list_entities().
+
+ * engine/lib/views.php: Fixed doc spacing that was throwing errors in PHP
+ Code Sniffer.
+
+2011-02-11 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/page_layout.php,
+ views/default/page/shells/admin.php, views/default/page/shells/default.php:
+ elgg-classic => elgg-page-classic, elgg-admin => elgg-page-admin
+
+ * views/default/css/elements/layout_objects.php,
+ views/default/css/elements/modules.php, views/default/css/screen.php: Added
+ css/elements/modules.php. Modules and widgets deserve their own space.
+
+ * views/default/admin/components/plugin.php, views/default/css/admin.php,
+ views/default/page/shells/default.php: Cleaned up admin advanced plugins view
+ a bit
+
+ * views/default/page/elements/head.php,
+ views/default/page/elements/html_begin.php,
+ views/default/page/elements/html_end.php,
+ views/default/page/shells/admin.php, views/default/page/shells/default.php,
+ views/default/page/shells/walled_garden.php: Fixes #1303: Pulled
+ html_begin/end into page shells. extracted <head> element into
+ page/elements/head
+
+ * mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/categories/manifest.xml, mod/defaultwidgets/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/embed/manifest.xml, mod/file/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/invitefriends/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/oauth_lib/manifest.xml,
+ mod/pages/manifest.xml, mod/reportedcontent/manifest.xml,
+ mod/search/manifest.xml, mod/sitepages/manifest.xml,
+ mod/tagcloud/manifest.xml, mod/thewire/manifest.xml,
+ mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/twitterservice/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: Converted all manifest files to 1.8 style
+
+2011-02-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/deprecated-1.8.php: Moved
+ get_annotations() to deprecated-1.8.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/tests/api/entity_getter_functions.php: Refs #650. Deprecated
+ get_annotations() for elgg_get_annotations().
+
+2011-02-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/diagnostics/start.php: not outputing all the plugin information in
+ diagnostics plugin due to new plugin system structure
+
+ * engine/lib/admin.php: Fixes #2872 - returned plugin settings menu to
+ working order
+
+2011-02-11 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php,
+ .../forms/admin/plugins/simple_update_states.php: Cleanup of basic plugins
+ area
+
+ * views/default/admin/components/invalid_plugin.php,
+ views/default/admin/components/plugin.php, views/default/css/admin.php,
+ .../forms/admin/plugins/simple_update_states.php, views/default/js/admin.php:
+ More cleanup of admin/plugins css
+
+ * views/default/admin/components/plugin.php,
+ .../admin/components/plugin_dependencies.php, views/default/css/admin.php:
+ elgg-$state-dependency => elgg-state-(error|success)
+
+ * views/default/output/rss_view.php: Removed unused view: output/rss_view
+
+ * .../uservalidationbyemail/unvalidated_user.php: Converted hardcoded styles
+ to css primitives
+
+2011-02-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/reset.php, views/default/input/submit.php: Removed
+ nonsensical comments
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ .../notifications/subscriptions/forminternals.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/core/settings/account.php,
+ views/default/css/elements/chrome.php,
+ views/default/page/elements/topbar.php: Added border primitives
+ "b<loc><type>" where type is "a" or "b" -- anyone want to choose better
+ names? :)
+
+ * mod/blog/views/default/forms/blog/save.php:
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/groups/views/default/groups/edit.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php: disabled =>
+ elgg-state-disabled in plugins (only found in blog and groups)
+
+ * views/default/admin/plugins/simple.php,
+ .../forms/admin/plugins/simple_update_states.php: Moved the simple plugins
+ admin form to the forms/ dir
+
+ * views/default/admin/components/plugin.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/css/admin.php, views/default/css/elements/forms.php,
+ views/default/forms/profile/fields/reset.php,
+ views/default/page/shells/walled_garden.php,
+ views/installation/install/nav.php: .disabled => .elgg-state-disabled (core
+ only)
+
+ * views/default/admin/plugins/advanced.php: Using spacing primitives rather
+ than <br/>
+
+ * views/default/css/admin.php: Corrected minor problem with admin tables
+
+ * views/default/forms/plugins/settings/save.php,
+ views/default/forms/plugins/usersettings/save.php,
+ views/default/object/plugin.php: Plugin settings forms now use the forms/
+ directory
+
+2011-02-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/navigation.php: fixed access issue on menu name
+
+2011-02-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/theming/preview/forms.php, mod/blog/lib/blog.php,
+ mod/blog/views/default/forms/blog/save.php,
+ .../views/default/admin/utilities/diagnostics.php, mod/file/index.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/edit.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/groups/profile/buttons.php, mod/messages/read.php,
+ .../views/default/forms/messages/process.php, mod/pages/view.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/owner_block.php,
+ .../views/default/object/reported_content.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/friends/picker.php, views/default/css/admin.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php,
+ views/default/forms/profile/fields/reset.php, views/default/input/button.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/page/elements/content_header.php,
+ views/installation/input/button.php: Converted buttons to elgg-object-type
+ naming convention. Added table of buttons to forms theming preview meant for
+ previewing all button types and states (still have to implement those...)
+
+2011-02-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php, mod/garbagecollector/start.php,
+ mod/groups/actions/edit.php, mod/groups/views/default/forms/groups/edit.php,
+ mod/logrotate/start.php, mod/sitepages/start.php,
+ mod/twitterservice/start.php, mod/twitterservice/twitterservice_lib.php,
+ .../views/default/twitterservice/metatags.php,
+ views/default/core/settings/tools/plugin.php: Refs #2874. Finished removing
+ calls to deprecated plugin mgmt functions in core and core plugins.
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ engine/lib/admin.php, engine/lib/deprecated-1.8.php, engine/lib/plugins.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/core/settings/tools.php,
+ views/default/core/settings/tools/plugin.php,
+ views/default/object/plugin.php: Refs #2874: More removal of deprecated
+ function user in plugins systems.
+
+ * engine/classes/ElggPlugin.php, engine/lib/deprecated-1.8.php,
+ engine/lib/plugins.php: Refs #2869, #2874. Renamed ElggPlugin::remove*
+ functions to unset*. Added ElggPlugin::getAllUserSettings() and
+ getAllSettings(). Deprecated all plugin settings and user setting functions
+ with correctly named functions.
+
+2011-02-09 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/helpers.php: Slightly more efficient way of
+ declaring spacing helpers
+
+2011-02-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/manifest.xml, mod/messages/manifest.xml, mod/pages/manifest.xml,
+ mod/search/manifest.xml: updated version number
+
+2011-02-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, engine/lib/plugins.php: Refs #2869: Fixed
+ problems when deleting user settings using wrapper function.
+
+ * engine/classes/ElggPluginPackage.php, engine/lib/admin.php,
+ mod/diagnostics/start.php, pages/settings/tools.php,
+ views/default/core/settings/tools.php,
+ views/default/core/settings/tools/plugin.php,
+ views/default/object/plugin.php: Refs #2874: Using elgg_get_plugins() instead
+ of get_installed_plugins().
+
+ * engine/classes/ElggPlugin.php: Fixed typo that break
+ ElggPlugin::isActive().
+
+ * engine/lib/input.php, engine/lib/upgrades/2010050701.php,
+ engine/lib/upgrades/2010100500.php, mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/link.php, mod/notifications/start.php,
+ mod/sitepages/index.php, mod/thewire/start.php, mod/twitterservice/start.php,
+ views/default/core/settings/tools.php: Refs #2874: Using
+ elgg_is_active_plugin() in core and bundled plugins.
+
+2011-02-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php, engine/lib/deprecated-1.8.php,
+ engine/lib/plugins.php: Fixes #2858: is_plugin_enabled() is deprecated by
+ elgg_is_active_plugin() instead of ElggPlugin::isActive().
+
+ * engine/classes/ElggPlugin.php, engine/lib/plugins.php: Fixes #2869: User
+ settings for plugins work again.
+
+2011-02-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/languages/de.php, mod/tagcloud/languages/en.php,
+ mod/tagcloud/manifest.xml, mod/tagcloud/start.php, mod/tagcloud/tagcloud.php,
+ mod/tagcloud/views/default/tagcloud/css.php,
+ .../views/default/widgets/tagcloud/content.php,
+ .../views/default/widgets/tagcloud/edit.php: cleaned up tagcloud plugin
+
+ * mod/search/start.php, .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/list.php: updated search plugin for new
+ html/css
+
+ * .../views/default/admin/utilities/diagnostics.php: ahhh...missed this one
+ too
+
+ * mod/logbrowser/views/default/logbrowser/form.php: missed this file in the
+ admin backend update last night
+
+ * engine/lib/views.php, views/default/layout/elements/title.php: added a
+ class variable to title view
+
+2011-02-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginPackage.php: Fixes #2863: Can now use all 6 dep
+ types with conflicts.
+
+ * engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser18.php,
+ engine/classes/ElggPluginPackage.php, engine/lib/plugins.php,
+ engine/tests/api/plugins.php, engine/tests/test_files/plugin_18/manifest.xml,
+ languages/en.php, views/default/admin/components/plugin.php,
+ .../admin/components/plugin_dependencies.php, views/default/css/admin.php:
+ Added suggests to the plugins deps system. It parallels the requires system,
+ but doesn't affect if the plugin can be enabled and only shows up in the deps
+ table on the advanced view.
+
+ * engine/classes/ElggPluginManifest.php: Running plugins' blurb,
+ description, name, and screenshot->description through elgg_echo().
+
+2011-02-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/layout/shells/admin.php,
+ views/default/page/shells/admin.php: rough system messages implementation for
+ admin backend
+
+ * js/lib/ui.js, views/default/admin/components/plugin_settings.php,
+ views/default/admin/statistics/overview.php,
+ views/default/admin/users/newest.php, views/default/admin/users/online.php,
+ views/default/css/admin.php, views/default/forms/admin/menu/save.php,
+ views/default/forms/useradd.php, views/default/layout/shells/admin.php,
+ views/default/layout/shells/admin/menu.php: updates for the admin css based
+ on the reworking I did to the html
+
+ * .../views/default/reportedcontent/footer_link.php,
+ views/default/annotation/generic_comment.php,
+ views/default/css/elements/forms.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/typography.php, views/default/icon/default.php,
+ views/default/input/form.php, views/default/navigation/menu/user_hover.php,
+ views/default/output/tagcloud.php: bringing us a little closer to validating
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ .../notifications/subscriptions/forminternals.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/core/settings/account.php,
+ views/default/css/elements/chrome.php: a tiny amount of progress on the css
+ chrome element view
+
+ * js/lib/ui.js, views/default/css/elements/chrome.php,
+ views/default/css/elements/forms.php, views/default/css/elements/grid.php,
+ views/default/css/elements/helpers.php, views/default/css/elements/icons.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php,
+ views/default/css/elements/typography.php,
+ views/default/layout/elements/page_links.php,
+ views/default/layout/objects/image_block.php,
+ views/default/navigation/menu/page.php,
+ views/default/navigation/menu/site.php,
+ views/default/navigation/menu/user_hover.php,
+ views/default/page/elements/footer.php: more tweaking of css - menu and
+ general clean up
+
+ * views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php,
+ views/default/layout/shells/content/header.php,
+ views/default/page/elements/header_logo.php: starting to standardize on
+ elgg-<type>-<subtype> for css such as elgg-heading-site
+
+2011-02-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/chrome.php,
+ views/default/css/elements/forms.php,
+ views/default/css/elements/page_layout.php,
+ views/default/css/elements/reset.php,
+ views/default/css/elements/typography.php: removed some old css no longer
+ supported by modern browsers
+
+2011-02-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/profile/fields/add.php, actions/profile/fields/edit.php,
+ engine/lib/admin.php, .../admin/appearance/profile_fields/list.php,
+ views/default/css/admin.php, views/default/js/admin.php: Pulled elgg-icon and
+ elgg-icon-* into the admin css. Pulled out profile field JS into elgg.admin
+ obj. Fixed editing profile field names.
+
+ * _graphics/elgg_sprites.png, documentation/theming/preview/icons.php,
+ views/default/css/elements/icons.php: Added dragger icon.
+
+2011-02-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: fixed typo in plugin library
+
+ * languages/en.php, mod/search/index.php, mod/search/start.php,
+ mod/search/views/default/search/list.php,
+ mod/search/views/default/search/listing.php: Fixes 2354 Using list instead of
+ listing for search now
+
+ * mod/search/index.php, mod/search/start.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/entity_list.php,
+ mod/search/views/default/search/gallery.php,
+ .../views/default/search/gallery_listing.php,
+ mod/search/views/default/search/layout.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/search_box.php,
+ mod/search/views/default/search/startblurb.php,
+ mod/search/views/rss/search/comments/entity.php,
+ mod/search/views/rss/search/entity.php,
+ mod/search/views/rss/search/layout.php,
+ mod/search/views/rss/search/listing.php: Fixes #2335 #2336 clean up and minor
+ standardization of search plugin - needs html/css clean up
+
+2011-02-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php, views/default/js/admin.php: Added
+ drag and drop reordering of plugins. Started pulling out admin area's js into
+ elgg.admin JS object.
+
+2011-02-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/input.php: moved sticky forms into the
+ input library
+
+2011-02-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/entity.php,
+ views/default/entities/entity_list.php,
+ views/default/entities/entity_listing.php,
+ views/default/entities/gallery.php,
+ views/default/entities/gallery_listing.php, views/default/entities/list.php,
+ views/default/entities/list_item.php, views/default/graphics/icon.php,
+ views/default/object/default.php: removing old entities views that are no
+ longer needed and did the last changes for the icon system
+
+ * mod/groups/icon.php, mod/groups/start.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/groups/profile/profile_block.php: updated the groups plugin
+ to use the new icon structure
+
+ * engine/lib/views.php, mod/file/start.php,
+ mod/file/views/default/file/icon.php,
+ .../default/file/icon/application/default.php,
+ .../views/default/file/icon/application/excel.php,
+ .../views/default/file/icon/application/msword.php,
+ .../views/default/file/icon/application/pdf.php,
+ .../default/file/icon/application/powerpoint.php,
+ .../default/file/icon/application/vnd.ms-excel.php,
+ .../file/icon/application/vnd.ms-powerpoint.php,
+ .../application/vnd.oasis.opendocument.text.php,
+ .../views/default/file/icon/application/x-gzip.php,
+ .../file/icon/application/x-rar-compressed.php,
+ .../default/file/icon/application/x-stuffit.php,
+ .../views/default/file/icon/application/zip.php,
+ mod/file/views/default/file/icon/archive.php,
+ mod/file/views/default/file/icon/audio.php,
+ mod/file/views/default/file/icon/audio/default.php,
+ mod/file/views/default/file/icon/default.php,
+ mod/file/views/default/file/icon/document.php,
+ mod/file/views/default/file/icon/text/default.php,
+ .../views/default/file/icon/text/directory.php,
+ mod/file/views/default/file/icon/text/v-card.php,
+ mod/file/views/default/file/icon/video.php,
+ mod/file/views/default/file/icon/video/default.php,
+ mod/file/views/default/object/file.php, views/default/icon/default.php:
+ updated the file plugin to use the new icon structure
+
+ * engine/classes/ElggUser.php, engine/lib/actions.php,
+ engine/lib/database.php, engine/lib/deprecated-1.7.php,
+ engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/lib/relationships.php, engine/lib/widgets.php: fixed some minor
+ documentation issues
+
+ * mod/bookmarks/views/default/object/bookmarks.php: missed this use of
+ elgg_count_comments() in change to ->countComments()
+
+2011-02-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPlugin.php: Fixed bug when trying to set a plugin's
+ priority to 1 without using "first."
+
+2011-02-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php, engine/lib/elgglib.php,
+ engine/lib/views.php, mod/blog/views/default/object/blog.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/pages/views/default/object/page_top.php,
+ views/default/core/likes/display.php: moved the count comments and likes
+ functions into the ElggEntity class
+
+ * engine/lib/views.php, mod/file/edit.php, mod/messages/read.php: Fixes
+ #2854 removing my bad idea of auto-appending action in elgg_view_form()
+
+ * mod/pages/actions/pages/delete.php, mod/pages/start.php,
+ .../views/default/icon/object/page/medium.php,
+ mod/pages/views/default/icon/object/page/small.php,
+ .../views/default/icon/object/page_top/medium.php,
+ .../views/default/icon/object/page_top/small.php,
+ mod/pages/views/default/pages/icon.php: Fixes #2853 pages plugin uses the
+ icon url plugin hook and fixes delete action
+
+ * documentation/theming/preview/objects.php, js/lib/elgglib.js,
+ .../core/settings/statistics/numentities.php,
+ views/default/core/settings/statistics/online.php,
+ views/default/css/elements/chrome.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/page_layout.php,
+ views/default/page/elements/messages.php: more css/html improvements - added
+ .elgg-table and a featured module
+
+ * views/default/input/access.php, views/default/input/checkboxes.php,
+ views/default/input/datepicker.php, views/default/input/dropdown.php,
+ views/default/input/email.php, views/default/input/hidden.php,
+ views/default/input/longtext.php, views/default/input/plaintext.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/input/userpicker.php: Fixes #2510 sticky forms is finish - Elgg
+ 1.9 could have a ElggForm class that makes it even easier to use a sticky
+ form
+
+2011-02-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/theming/preview/objects.php, engine/lib/views.php,
+ mod/blog/views/default/blog/group_module.php,
+ mod/blog/views/default/blog/sidebar/archives.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ .../default/groups/profile/activity_module.php,
+ .../views/default/groups/sidebar/featured.php,
+ mod/groups/views/default/groups/sidebar/find.php,
+ .../views/default/groups/sidebar/members.php,
+ .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/personal.php,
+ mod/pages/views/default/pages/group_module.php,
+ mod/pages/views/default/pages/sidebar/history.php,
+ .../views/default/pages/sidebar/navigation.php,
+ views/default/core/likes/display.php, views/default/core/members/sidebar.php,
+ .../core/settings/account/default_access.php,
+ views/default/core/settings/account/email.php,
+ views/default/core/settings/account/language.php,
+ .../core/settings/account/notifications.php,
+ views/default/core/settings/account/password.php,
+ .../core/settings/statistics/numentities.php,
+ views/default/core/settings/statistics/online.php,
+ views/default/core/settings/tools/plugin.php,
+ views/default/css/elements/chrome.php, views/default/css/elements/grid.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/page_layout.php,
+ views/default/css/elements/reset.php, views/default/output/tagcloud.php:
+ using elgg-module-<type>
+
+ * views/default/icon/user/default/large.php,
+ views/default/icon/user/default/master.php,
+ views/default/icon/user/default/medium.php,
+ views/default/icon/user/default/small.php,
+ views/default/icon/user/default/tiny.php,
+ views/default/icon/user/default/topbar.php, views/default/profile/hover.php:
+ a little clean up of unnecessary views
+
+ * documentation/theming/preview/icons.php, engine/classes/ElggEntity.php,
+ engine/lib/deprecated-1.8.php, engine/lib/entities.php, engine/lib/input.php,
+ engine/lib/users.php, engine/lib/views.php, js/lib/ui.js,
+ mod/pages/views/default/pages/icon.php, views/default/css/elements/icons.php,
+ views/default/input/userpicker.php, views/default/page/elements/topbar.php,
+ views/default/profile/icon.php, views/foaf/page/shells/default.php: Fixes
+ #2559 refs #2475 added ElggEntity:getIconURL() and elgg_view_entity_icon()
+
+2011-02-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php, views/default/css/admin.php: The
+ screenshot desc is now used. Small css changes.
+
+ * views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php, views/default/css/admin.php: Better
+ displaying of full screenshots in plugins admin.
+
+ * engine/classes/ElggPluginPackage.php, engine/lib/plugins.php: Fixes #2852:
+ Checking other plugins' conflicts to see if plugin is able to be activated in
+ ElggPluginPackage->checkDependencies(). Some language clarification in admin
+ panel.
+
+2011-02-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/theming/preview/widgets.php: fixed widgets theming preview
+ by overriding some javascript
+
+ * engine/classes/ElggEntity.php: supporting private settings before an
+ entity is saved
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggWidget.php,
+ engine/lib/users.php: using setPrivateSetting() and getPrivateSetting()
+ instead of procedural functions
+
+ * views/default/css/elements/icons.php,
+ views/default/graphics/ajax_loader.php: fixed ajax loader css and html
+
+ * documentation/css/preview/forms.php,
+ documentation/css/preview/general.php, documentation/css/preview/grid.php,
+ documentation/css/preview/head.php, documentation/css/preview/icons.php,
+ documentation/css/preview/index.php, documentation/css/preview/nav.php,
+ documentation/css/preview/objects.php, documentation/css/preview/widgets.php,
+ documentation/theming/preview/forms.php,
+ documentation/theming/preview/general.php,
+ documentation/theming/preview/grid.php,
+ documentation/theming/preview/head.php,
+ documentation/theming/preview/icons.php,
+ documentation/theming/preview/index.php,
+ documentation/theming/preview/nav.php,
+ documentation/theming/preview/objects.php,
+ documentation/theming/preview/widgets.php, mod/developers/languages/en.php,
+ .../views/default/admin/developers/preview.php: changed named from css
+ preview to theming preview
+
+ * documentation/css/preview/forms.php,
+ documentation/css/preview/general.php, documentation/css/preview/grid.php,
+ documentation/css/preview/icons.php, documentation/css/preview/nav.php,
+ documentation/css/preview/objects.php, documentation/css/preview/widgets.php:
+ better navigation for theming previews
+
+ * documentation/css/preview/grid.php, documentation/css/preview/icons.php,
+ js/lib/ui.js, views/default/css/elements/grid.php,
+ views/default/css/elements/icons.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/navigation.php, views/default/js/elgg.php,
+ views/default/profile/hover.php: cleaned up hover menu
+
+ * mod/blog/views/default/forms/blog/save.php,
+ views/default/css/elements/base.php, views/default/css/elements/chrome.php,
+ views/default/css/elements/core.php, views/default/css/elements/forms.php,
+ views/default/css/elements/helpers.php,
+ views/default/css/elements/layout.php,
+ views/default/css/elements/layout_objects.php,
+ views/default/css/elements/misc.php,
+ views/default/css/elements/page_layout.php,
+ views/default/css/elements/spacing.php,
+ views/default/css/elements/typography.php, views/default/css/screen.php,
+ views/default/page/elements/header_logo.php: getting back to the css - making
+ changes based on Evan's comments
+
+ * documentation/css/preview/forms.php,
+ documentation/css/preview/general.php, documentation/css/preview/grid.php,
+ documentation/css/preview/icons.php, documentation/css/preview/images.php,
+ documentation/css/preview/index.php, documentation/css/preview/nav.php,
+ documentation/css/preview/objects.php, documentation/css/preview/widgets.php:
+ cleaned up navigation of the css preview documentation
+
+ * mod/developers/start.php, .../views/default/admin/developers/preview.php,
+ mod/developers/views/default/developers/css.php: setting size for iframe for
+ css preview
+
+ * views/default/css/admin.php, views/default/layout/shells/admin.php:
+ removed unecessary inner div for .elgg-main because of switch back to
+ overflow: hidden
+
+2011-02-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Fixed a problem with detecting conflicting plugin
+ versions. Not showing a stray = when versions aren't specified in conflicts
+ and requires.
+
+2011-02-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, views/default/admin/components/plugin.php,
+ views/default/css/admin.php: Added support for screenshots in the advanced
+ plugin admin.
+
+ * engine/classes/ElggPlugin.php: Fixed typo that caused ElggPlugin->path not
+ to be correctly set when loading from a plugin id.
+
+ * documentation/examples/plugins/manifest.xml,
+ engine/classes/ElggPluginManifest.php, engine/classes/ElggPluginPackage.php,
+ engine/lib/plugins.php, engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_18/manifest.xml: Renamed 'name' to 'plugin'
+ for priority req. Updated unit tests and docs.
+
+ * documentation/examples/plugins/manifest.xml: Added priority requires to
+ example manifest.
+
+ * engine/lib/plugins.php, languages/en.php,
+ views/default/admin/components/plugin.php: Fixed problems showing detected
+ values for plugin conflicts. Clarified language for what the first value
+ column means.
+
+ * engine/classes/ElggMenuItem.php, engine/classes/ElggPlugin.php,
+ engine/classes/ElggPluginManifest.php, engine/classes/ElggPluginPackage.php,
+ engine/lib/plugins.php, languages/en.php,
+ .../admin/components/plugin_dependencies.php, views/default/css/admin.php:
+ Added new priority 'requires' for plugin dep system. You can now say that a
+ plugin is required to be after / before another plugin in the system.
+
+2011-02-04 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggData.php: I'm a dummy -- getType and getSubtype are
+ taken care of by Loggable...
+
+ * engine/classes/ElggData.php: Added type and subtype abstract functions to
+ ElggData
+
+2011-02-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Fixes #2822: Added missing language string.
+
+ * engine/classes/ElggPluginPackage.php, engine/lib/deprecated-1.8.php,
+ engine/lib/plugins.php: Fixes #2820, Fixes #2823. Using elgg_get_plugins() in
+ elgg_get_plugins_provides(). Fixed plugin conflicts system. Removed cruft
+ from ElggPluginPackage. Fixed deprecated get_installed_plugins() to honor the
+ type requested.
+
+2011-02-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/deprecated-1.8.php: Updated elgg_get_plugin_path in
+ load_plugin_manifest to elgg_get_plugins_path
+
+ * mod/profile/start.php, mod/sitepages/views/default/sitepages/css.php,
+ pages/dashboard.php, views/default/layout/shells/widgets.php: Changed widgets
+ layout "box" parameter to "content" just like the other layouts
+
+2011-02-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/css/preview/forms.php, install/ElggInstaller.php,
+ mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/input/datetime.php,
+ mod/blog/views/default/widgets/blog/edit.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/file/views/default/widgets/filerepo/edit.php,
+ .../default/settings/garbagecollector/edit.php,
+ mod/groups/views/default/forms/discussion/save.php,
+ mod/groups/views/default/settings/groups/edit.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ .../views/default/settings/logrotate/edit.php,
+ mod/messages/views/default/forms/messages/send.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ .../views/default/widgets/reportedcontent/edit.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ .../views/default/widgets/tagcloud/edit.php,
+ .../views/default/settings/twitterservice/edit.php,
+ .../views/default/admin/users/unvalidated.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/core/river/filter.php,
+ views/default/core/settings/account/language.php,
+ views/default/css/admin.php, views/default/forms/admin/menu/save.php,
+ views/default/input/access.php, views/default/input/dropdown.php,
+ views/default/input/pulldown.php, views/default/output/dropdown.php,
+ views/default/output/pulldown.php,
+ views/default/widgets/content_stats/edit.php,
+ views/default/widgets/friends/edit.php,
+ views/default/widgets/new_users/edit.php,
+ views/default/widgets/online_users/edit.php,
+ views/installation/input/access.php, views/installation/input/dropdown.php,
+ views/installation/input/pulldown.php: changed input/pulldown to
+ input/dropdown
+
+ * engine/lib/tags.php, engine/lib/views.php, engine/tests/ui/submenu.php,
+ mod/bookmarks/bookmarklet.php, mod/thewire/add.php, mod/thewire/everyone.php,
+ mod/thewire/index.php, pages/friends/edit.php,
+ .../layout/shells/one_column_with_sidebar.php: removed
+ one_column_with_sidebar layout - use one_sidebar instead
+
+ * engine/lib/views.php, mod/categories/views/default/categories.php,
+ mod/categories/views/default/categories/list.php,
+ .../views/default/sitepages/keywords/userlist.php: removed uses of
+ $vars[config] in views
+
+ * engine/lib/output.php, .../views/default/twitterservice/login.php,
+ .../views/default/admin/users/unvalidated.php: removes uses of $vars[url]
+ from core and plugins
+
+ * engine/lib/views.php: Fixes #2124 only setting $vars[user], $vars[url],
+ and $vars[config] in elgg_view() if not already set
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginPackage.php,
+ engine/lib/configuration.php, engine/lib/plugins.php, mod/blog/start.php,
+ mod/categories/start.php, mod/defaultwidgets/start.php,
+ mod/developers/start.php, mod/diagnostics/start.php,
+ mod/file/actions/file/download.php, mod/file/start.php, mod/groups/icon.php,
+ mod/groups/start.php, mod/invitefriends/start.php,
+ mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php,
+ mod/reportedcontent/start.php, mod/sitepages/start.php,
+ mod/thewire/start.php, mod/twitterservice/start.php,
+ views/default/admin/components/plugin.php: changed elgg_get_plugin_path() to
+ elgg_get_plugins_path()
+
+ * engine/lib/configuration.php, mod/categories/start.php,
+ mod/defaultwidgets/start.php, mod/diagnostics/start.php,
+ mod/groups/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/search/start.php, mod/twitterservice/languages/en.php,
+ mod/twitterservice/twitterservice_lib.php,
+ .../default/usersettings/twitterservice/edit.php: Refs #2428 just a few more
+ CONFIG uses left to be replaced
+
+ * mod/categories/actions/save.php,
+ .../views/default/settings/categories/edit.php, mod/file/start.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/delete.php,
+ mod/groups/actions/featured.php, mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/icon.php,
+ mod/invitefriends/actions/invite.php,
+ .../views/default/invitefriends/formitems.php, mod/notifications/start.php,
+ mod/pages/start.php, mod/profile/icon.php, mod/profile/start.php,
+ mod/sitepages/sitepages_functions.php, mod/twitterservice/start.php,
+ mod/twitterservice/twitterservice_lib.php,
+ .../default/usersettings/twitterservice/edit.php,
+ mod/uservalidationbyemail/lib/functions.php: Refs #2428 almost done removing
+ CONFIG access - mostly plugin start.php left
+
+2011-02-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/actions/add.php, mod/bookmarks/actions/bookmarks/add.php,
+ mod/bookmarks/actions/bookmarks/delete.php,
+ mod/bookmarks/actions/bookmarks/edit.php, mod/bookmarks/actions/delete.php,
+ mod/bookmarks/actions/edit.php, mod/bookmarks/actions/reference.php,
+ mod/bookmarks/actions/remove.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/languages/en.php, mod/bookmarks/pages/add.php,
+ mod/bookmarks/pages/all.php, mod/bookmarks/pages/friends.php,
+ mod/bookmarks/pages/inbox.php, mod/bookmarks/pages/owner.php,
+ mod/bookmarks/pages/view.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ .../default/bookmarks/groupprofile_bookmarks.php,
+ .../views/default/bookmarks/owner_block.php,
+ mod/bookmarks/views/default/bookmarks/sharing.php,
+ mod/bookmarks/views/default/bookmarks/stats.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/river/object/bookmarks/annotate.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/bookmarks/views/rss/object/bookmarks.php: Refs #2680: First pass at
+ porting the 1.7 bookmarks to 1.8. Functional, but code is still messy.
+
+ * engine/lib/actions.php: Added more info to the @params documentation for
+ elgg_register_action.
+
+2011-02-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ .../core/settings/account/default_access.php,
+ views/default/core/settings/account/language.php,
+ views/default/forms/login.php, views/default/input/button.php,
+ views/default/js/initialize_elgg.php,
+ views/default/page/elements/html_begin.php,
+ views/default/page/elements/html_end.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/rss/page/shells/default.php,
+ views/xml/messages/exceptions/exception.php: Refs #2428 removed some uses of
+ CONFIG in the views
+
+ * views/default/css/elements/navigation.php,
+ views/default/navigation/pagination.php: Fixes #2802 put state class on list
+ element rather than span
+
+ * install/ElggInstaller.php: fixes #2784 for real this time
+
+ * install/ElggInstaller.php: Fixes #2784 #2842 installer uses new plugin
+ system now
+
+2011-02-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/manifest.xml, mod/bookmarks/manifest.xml,
+ mod/defaultwidgets/manifest.xml, mod/embed/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/logbrowser/manifest.xml,
+ mod/logrotate/manifest.xml, mod/messageboard/manifest.xml,
+ mod/messages/manifest.xml, mod/notifications/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/search/manifest.xml,
+ mod/tinymce/manifest.xml, mod/uservalidationbyemail/manifest.xml,
+ mod/zaudio/manifest.xml: updated the plugin manifest files to use the new
+ variable name for activation on installation
+
+2011-02-02 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, views/default/river/item.php: Fixes #2846:
+ elgg_view_river_item calls river/item view first.
+
+ * views/default/core/river/body.php: Adding quotes to "constant" item
+
+2011-02-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Fixes #2844 setting table for access_id to fix fatal
+ error
+
+ * mod/groups/actions/edit.php, mod/groups/start.php,
+ mod/groups/views/default/forms/groups/edit.php: moved name out of
+ configurable fields for a group
+
+ * mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/edit.php: more clean up of the group edit
+ form
+
+ * mod/groups/lib/groups.php, mod/groups/start.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/edit.php: a little clean up of the groups
+ edit form
+
+ * .../layout/shells/two_column_left_sidebar.php,
+ views/default/page/shells/default.php: backward compatibility code for
+ plugins that add admin pages
+
+ * languages/en.php: added a string from 1.7 profile plugin into core for
+ backward compatibility
+
+2011-02-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page/elements/html_begin.php: Puts css before js in the
+ head, per website performance best practices
+
+ * engine/lib/views.php: Initialize global $CURRENT_SYSTEM_VIEWTYPE correctly
+
+ * engine/lib/deprecated-1.7.php, engine/lib/deprecated-1.8.php,
+ engine/lib/sessions.php, engine/lib/sites.php, engine/lib/tags.php,
+ engine/lib/users.php, engine/lib/usersettings.php, engine/lib/views.php:
+ Moved deprecated files from sessions.php - xml.php into deprecation files for
+ 1.7 and 1.8
+
+ * engine/lib/deprecated-1.7.php, engine/lib/deprecated-1.8.php,
+ engine/lib/group.php, engine/lib/location.php, engine/lib/metadata.php,
+ engine/lib/navigation.php, engine/lib/objects.php, engine/lib/output.php,
+ engine/lib/pageowner.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php, engine/lib/relationships.php,
+ engine/lib/river.php: Moved functions from export.php - river.php into
+ deprecated files
+
+ * engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/deprecated-1.7.php,
+ engine/lib/deprecated-1.8.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/start.php: Moving deprecated functions out of
+ files access.php - entities.php. This time into two files based on version
+ deprecated and maintaining documentation
+
+ * engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/deprecated.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/install.php, engine/lib/location.php, engine/lib/mb_wrapper.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/navigation.php, engine/lib/objects.php, engine/lib/output.php,
+ engine/lib/pageowner.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php: Reversing 7975
+
+ * engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/deprecated.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/install.php, engine/lib/location.php, engine/lib/mb_wrapper.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/navigation.php, engine/lib/objects.php, engine/lib/output.php,
+ engine/lib/pageowner.php, engine/lib/plugins.php,
+ engine/lib/private_settings.php, engine/start.php: Refs #2839: moved
+ deprecated functions from access.php - private_settings.php to
+ deprecated.php. Still have to do relationships.php - xml.php. Deleted
+ documentation for these functions since 1) it was using up precious bytes,
+ and 2) documentation should not be needed since people should not be trying
+ to use these if they are using 1.8, and 3) I assume the documentation will
+ exist as archived 1.7 docs.
+
+2011-01-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/group_module.php,
+ mod/file/views/default/file/group_module.php,
+ .../views/default/discussion/group_module.php,
+ mod/groups/views/default/groups/css.php,
+ .../default/groups/profile/activity_module.php,
+ mod/pages/views/default/pages/group_module.php,
+ views/default/css/elements/core.php: fixed css for group module headers
+
+ * engine/lib/output.php: supporting 'javascript:' when normalizing urls
+
+ * engine/lib/pageowner.php: fixed typo in deprecation notice
+
+ * .../layout/shells/two_column_left_sidebar.php: made
+ two_column_left_sidebar layout also handle $vars['content']
+
+ * engine/lib/navigation.php: accidently removed the site menu set up
+ function
+
+2011-01-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/forms/blog/save.php,
+ mod/pages/views/default/annotation/page.php,
+ views/default/annotation/default.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/css/admin.php,
+ views/default/css/elements/core.php,
+ views/default/layout/objects/list/body.php: introducing elgg-subtext as
+ replacement for elgg-list-subtitle and elgg-subtitle
+
+ * engine/lib/elgglib.php, engine/lib/navigation.php,
+ engine/tests/ui/submenu.php, views/default/layout/elements/sidebar.php,
+ views/default/layout/elements/title.php,
+ views/default/navigation/sidebar_menu.php,
+ views/default/navigation/submenu_group.php,
+ views/default/navigation/submenu_item.php,
+ views/default/navigation/submenu_js.php: removed menu code introduced for
+ elgg.com that did not make it into 1.8
+
+ * views/default/annotation/default.php: using the new image block rather
+ than deprecated listing view
+
+ * views/default/navigation/tabs.php: supporting adding a class to navigation
+ tabs
+
+2011-01-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/statistics/overview.php: updated the overview
+ statistics page
+
+ * engine/lib/group.php, engine/lib/pageowner.php, engine/lib/users.php,
+ engine/lib/widgets.php, mod/blog/views/default/blog/group_module.php,
+ mod/blog/views/default/blog/sidebar/archives.php,
+ mod/blog/views/default/blog/sidebar/tagcloud.php,
+ mod/blog/views/default/widgets/blog/content.php,
+ mod/bookmarks/bookmarklet.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ .../views/default/widgets/bookmarks/view.php,
+ .../views/default/defaultwidgets/editor.php, mod/file/friends.php,
+ mod/file/index.php, mod/file/search.php, mod/file/upload.php,
+ mod/file/view.php, mod/file/views/default/file/group_module.php,
+ .../views/default/widgets/filerepo/content.php, mod/groups/lib/groups.php,
+ .../default/widgets/a_users_groups/content.php, mod/messageboard/index.php,
+ .../views/default/widgets/messageboard/content.php, mod/messages/inbox.php,
+ mod/messages/read.php, mod/messages/sent.php, mod/pages/friends.php,
+ mod/pages/index.php, mod/pages/revision.php, mod/pages/view.php,
+ mod/pages/views/default/pages/group_module.php,
+ .../views/default/pages/sidebar/navigation.php,
+ mod/pages/views/default/widgets/pages/content.php, mod/profile/icon.php,
+ mod/profile/views/default/profile/details.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/owner_block.php, mod/thewire/index.php,
+ .../views/default/widgets/thewire/content.php, pages/avatar/edit.php,
+ pages/avatar/view.php, pages/friends/index.php, pages/friends/of.php,
+ pages/friends/pickercallback.php, pages/profile/edit.php,
+ pages/settings/account.php, pages/settings/statistics.php,
+ pages/settings/tools.php, .../core/settings/account/default_access.php,
+ views/default/core/settings/account/email.php,
+ views/default/core/settings/account/language.php,
+ views/default/core/settings/account/name.php,
+ views/default/core/settings/account/password.php,
+ views/default/js/initialize_elgg.php,
+ views/default/layout/elements/owner_block.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/widgets.php,
+ views/default/page/elements/content_header.php,
+ .../page/elements/content_header_member.php,
+ views/foaf/page/shells/default.php: changed elgg_get_page_owner() to
+ elgg_get_page_owner_entity() to be more consistent
+
+ * mod/file/languages/en.php: updated language file for file plugin due to
+ change in groups
+
+ * mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/groups/css.php,
+ .../default/groups/profile/activity_module.php,
+ .../default/groups/profile/activity_widget.php,
+ .../views/default/groups/profile/widgets.php: adding activity module to
+ groups
+
+ * views/default/css/admin.php: going back to overflow:hidden on elgg-body -
+ too many issues with display: table-cell
+
+ * languages/en.php, views/default/css/admin.php,
+ views/default/widgets/content_stats/content.php,
+ views/default/widgets/content_stats/edit.php,
+ views/default/widgets/friends/edit.php,
+ views/default/widgets/new_users/edit.php,
+ views/default/widgets/online_users/edit.php: added edit views for admin
+ widgets
+
+ * mod/ecml/README.txt, mod/ecml/actions/save_permissions.php,
+ mod/ecml/ecml_functions.php, mod/ecml/graphics/dailymotion.png,
+ mod/ecml/graphics/ecml.png, mod/ecml/graphics/googlemaps.png,
+ mod/ecml/graphics/logo_bliptv.gif, mod/ecml/graphics/logo_dailymotion.gif,
+ mod/ecml/graphics/logo_googlemaps.gif, mod/ecml/graphics/logo_livevideo.gif,
+ mod/ecml/graphics/logo_redlasso.gif, mod/ecml/graphics/logo_slideshare.gif,
+ mod/ecml/graphics/logo_vimeo.gif, mod/ecml/graphics/logo_youtube.gif,
+ mod/ecml/graphics/redlasso_1.png, mod/ecml/graphics/redlasso_2.png,
+ mod/ecml/graphics/slideshare.png, mod/ecml/graphics/url_status.png,
+ mod/ecml/graphics/vimeo.png, mod/ecml/graphics/youtube.png,
+ mod/ecml/languages/en.php, mod/ecml/manifest.xml, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/help.php,
+ mod/ecml/views/default/ecml/help/blip.tv.php,
+ mod/ecml/views/default/ecml/help/dailymotion.php,
+ mod/ecml/views/default/ecml/help/googlemaps.php,
+ mod/ecml/views/default/ecml/help/livevideo.php,
+ mod/ecml/views/default/ecml/help/redlasso.php,
+ mod/ecml/views/default/ecml/help/slideshare.php,
+ mod/ecml/views/default/ecml/help/vimeo.php,
+ mod/ecml/views/default/ecml/help/youtube.php,
+ mod/ecml/views/default/ecml/input_ext.php,
+ mod/ecml/views/default/ecml/keyword_help.php,
+ mod/ecml/views/default/ecml/keywords/blip.tv.php,
+ .../views/default/ecml/keywords/dailymotion.php,
+ mod/ecml/views/default/ecml/keywords/entity.php,
+ .../views/default/ecml/keywords/googlemaps.php,
+ mod/ecml/views/default/ecml/keywords/livevideo.php,
+ mod/ecml/views/default/ecml/keywords/redlasso.php,
+ .../views/default/ecml/keywords/slideshare.php,
+ mod/ecml/views/default/ecml/keywords/user_list.php,
+ mod/ecml/views/default/ecml/keywords/vimeo.php,
+ mod/ecml/views/default/ecml/keywords/youtube.php,
+ .../views/default/embed/web_services/content.php,
+ mod/ecml/views/default/settings/ecml/edit.php: moving ecml to plugins
+ repository as it won't be a part of 1.8.0. It will be back though...
+
+ * views/default/css/admin.php, views/default/css/elements/navigation.php,
+ views/default/css/elements/reset.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/navigation/pagination.php, views/default/navigation/tabs.php:
+ adding elgg-state-* css elements
+
+ * engine/lib/views.php: fixed bug where a null passed as 2nd parameter to
+ elgg_view_layout() prevented backward compatibility
+
+ * js/lib/ui.widgets.js: one too many parents in the widget collapse code
+
+ * mod/ecml/views/default/ecml/input_ext.php,
+ mod/embed/views/default/embed/link.php, views/default/css/admin.php,
+ views/default/css/elements/forms.php: namespaced longtext-control
+
+ * mod/tinymce/graphics/ed-bg.gif, mod/tinymce/graphics/example.gif,
+ mod/tinymce/graphics/more.gif, mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ mod/tinymce/views/default/tinymce/init.php: cleaned up tinymce plugin
+
+ * mod/reportedcontent/start.php, .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/user_report.php,
+ .../default/widgets/reportedcontent/content.php,
+ .../views/default/widgets/reportedcontent/edit.php: added reported content
+ widget
+
+ * mod/reportedcontent/languages/en.php, mod/reportedcontent/start.php,
+ .../default/admin/utilities/reportedcontent.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/reportedcontent/admin_css.php, views/default/css/admin.php:
+ adding margin to admin buttons
+
+ * .../graphics/sign_in_with_twitter.gif,
+ mod/twitterservice/languages/en.php, mod/twitterservice/manifest.xml,
+ mod/twitterservice/start.php, mod/twitterservice/twitterservice_lib.php,
+ mod/twitterservice/vendors/twitteroauth/LICENSE,
+ mod/twitterservice/vendors/twitteroauth/OAuth.php,
+ mod/twitterservice/vendors/twitteroauth/README,
+ .../vendors/twitteroauth/twitterOAuth.php,
+ .../views/default/settings/twitterservice/edit.php,
+ .../views/default/twitterservice/css.php,
+ .../views/default/twitterservice/login.php,
+ .../views/default/twitterservice/metatags.php,
+ .../default/usersettings/twitterservice/edit.php: moved twitterservice into
+ core
+
+2011-01-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/chrome.php,
+ views/default/css/elements/core.php, views/default/css/elements/icons.php,
+ views/default/css/elements/navigation.php,
+ views/default/layout/objects/gallery.php,
+ views/default/layout/objects/list.php: light clean-up of the css
+
+ * js/lib/ui.widgets.js, pages/dashboard.php,
+ views/default/admin/dashboard.php, views/default/css/admin.php,
+ views/default/css/elements/core.php, views/default/layout/objects/widget.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/objects/widget/settings.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/layout/shells/widgets/add_panel.php: converted widgets to
+ modules
+
+ * engine/lib/views.php: added support for $vars to elgg_view_entity() - need
+ to clean up documentation and deprecate old usage
+
+2011-01-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/widgets.php, languages/en.php,
+ mod/developers/languages/en.php, mod/developers/start.php,
+ mod/thewire/start.php, views/default/admin/dashboard.php,
+ views/default/admin/overview/statistics.php,
+ views/default/admin/statistics/overview.php, views/default/css/admin.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_panel.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/widgets/content_stats/content.php,
+ views/default/widgets/new_users/content.php,
+ views/default/widgets/online_users/content.php: welcome to the admin
+ dashboard
+
+2011-01-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/logbrowser/start.php,
+ .../views/default/admin/utilities/logbrowser.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/logbrowser/table.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/appearance/profile_fields.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/overview/statistics.php,
+ views/default/admin/users/newest.php, views/default/admin/users/online.php,
+ views/default/css/admin.php, views/default/forms/admin/menu/save.php,
+ views/default/forms/profile/fields/add.php, views/default/forms/useradd.php,
+ views/default/layout/shells/admin.php,
+ views/default/layout/shells/admin/menu.php: updated more of the admin backend
+ to use new CSS/HTML
+
+ * views/default/admin/overview/statistics.php, views/default/css/admin.php:
+ starting to remove the old HTML/CSS in the admin backend
+
+ * views/default/css/admin.php, views/default/layout/shells/admin.php,
+ views/default/layout/shells/admin/menu.php: take two of the admin header and
+ sidebar menu - sidebar menu still needs plenty of work
+
+ * views/default/layout/objects/module.php: default elgg-inner to false in
+ module
+
+ * engine/lib/group.php, mod/groups/start.php: Refs #2557 merged fix into
+ trunk from 1.7 branch
+
+ * engine/lib/database.php, engine/lib/entities.php,
+ engine/lib/metastrings.php, engine/lib/notification.php, engine/lib/pam.php,
+ engine/lib/users.php, engine/lib/web_services.php, engine/lib/xml-rpc.php:
+ Refs #2804 #2805 pulling changes in trunk from 1.7 branch
+
+ * languages/en.php: forgot these language strings in the admin theme update
+
+ * views/default/css/admin.php, views/default/layout/shells/admin.php:
+ playing around a little with the admin theme
+
+2011-01-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ErrorResult.php: Fixes #2586 ErrorResult has PHP5
+ constructor now
+
+ * engine/lib/web_services.php: missed check for null parameters in web
+ services parameter code
+
+ * engine/lib/web_services.php: Fixes #2548 do not need include_post_data()
+ because of changes to rewrite rules
+
+ * engine/lib/sessions.php, engine/lib/web_services.php,
+ mod/uservalidationbyemail/start.php: testing for the existence of username in
+ pam credentials before using
+
+ * mod/groups/languages/en.php, mod/groups/lib/groups.php,
+ mod/groups/start.php, .../views/default/groups/sidebar/members.php: Fixes
+ #2295 added a group member list page
+
+ * views/default/css/elements/base.php,
+ .../layout/shells/one_column_with_sidebar.php: css now provides center for
+ text and centered for divs
+
+ * mod/pages/history.php, mod/pages/images/application.png,
+ mod/pages/images/code.png, mod/pages/images/css.png, mod/pages/images/db.png,
+ mod/pages/images/directory.png, mod/pages/images/doc.png,
+ mod/pages/images/file.gif, mod/pages/images/file.png,
+ mod/pages/images/film.png, mod/pages/images/flash.png,
+ mod/pages/images/folder-closed.gif, mod/pages/images/folder.gif,
+ mod/pages/images/folder_open.png, mod/pages/images/html.png,
+ mod/pages/images/java.png, mod/pages/images/linux.png,
+ mod/pages/images/minus.gif, mod/pages/images/music.png,
+ mod/pages/images/pdf.png, mod/pages/images/php.png,
+ mod/pages/images/picture.png, mod/pages/images/plus.gif,
+ mod/pages/images/ppt.png, mod/pages/images/psd.png,
+ mod/pages/images/ruby.png, mod/pages/images/script.png,
+ mod/pages/images/spinner.gif, mod/pages/images/treeview-black-line.gif,
+ mod/pages/images/treeview-black.gif,
+ mod/pages/images/treeview-default-line.gif,
+ mod/pages/images/treeview-default.gif,
+ mod/pages/images/treeview-famfamfam-line.gif,
+ mod/pages/images/treeview-famfamfam.gif,
+ mod/pages/images/treeview-gray-line.gif, mod/pages/images/treeview-gray.gif,
+ mod/pages/images/treeview-red-line.gif, mod/pages/images/treeview-red.gif,
+ mod/pages/images/txt.png, mod/pages/images/xls.png, mod/pages/images/zip.png,
+ mod/pages/index.php, mod/pages/javascript/jquery.treeview.async.js,
+ mod/pages/javascript/jquery.treeview.js, mod/pages/lib/pages.php,
+ mod/pages/new.php, mod/pages/pagesTree.php, mod/pages/revision.php,
+ mod/pages/start.php, mod/pages/vendors/jquery-treeview/.gitignore,
+ mod/pages/vendors/jquery-treeview/README.md,
+ mod/pages/vendors/jquery-treeview/changelog.txt,
+ mod/pages/vendors/jquery-treeview/demo/async.html,
+ mod/pages/vendors/jquery-treeview/demo/bg.gif,
+ mod/pages/vendors/jquery-treeview/demo/demo.js,
+ mod/pages/vendors/jquery-treeview/demo/edit.html,
+ mod/pages/vendors/jquery-treeview/demo/images.html,
+ mod/pages/vendors/jquery-treeview/demo/index.html,
+ mod/pages/vendors/jquery-treeview/demo/large.html,
+ .../vendors/jquery-treeview/demo/prerendered.html,
+ mod/pages/vendors/jquery-treeview/demo/screen.css,
+ mod/pages/vendors/jquery-treeview/demo/simple.html,
+ .../vendors/jquery-treeview/demo/sortable.html,
+ mod/pages/vendors/jquery-treeview/demo/source.php,
+ mod/pages/vendors/jquery-treeview/demo/source.phps,
+ .../vendors/jquery-treeview/images/ajax-loader.gif,
+ mod/pages/vendors/jquery-treeview/images/file.gif,
+ .../jquery-treeview/images/folder-closed.gif,
+ .../vendors/jquery-treeview/images/folder.gif,
+ mod/pages/vendors/jquery-treeview/images/minus.gif,
+ mod/pages/vendors/jquery-treeview/images/plus.gif,
+ .../jquery-treeview/images/treeview-black-line.gif,
+ .../jquery-treeview/images/treeview-black.gif,
+ .../images/treeview-default-line.gif,
+ .../jquery-treeview/images/treeview-default.gif,
+ .../images/treeview-famfamfam-line.gif,
+ .../jquery-treeview/images/treeview-famfamfam.gif,
+ .../jquery-treeview/images/treeview-gray-line.gif,
+ .../jquery-treeview/images/treeview-gray.gif,
+ .../jquery-treeview/images/treeview-red-line.gif,
+ .../jquery-treeview/images/treeview-red.gif,
+ .../jquery-treeview/jquery.treeview.async.js,
+ .../vendors/jquery-treeview/jquery.treeview.css,
+ .../jquery-treeview/jquery.treeview.edit.js,
+ .../vendors/jquery-treeview/jquery.treeview.js,
+ .../vendors/jquery-treeview/jquery.treeview.min.js,
+ .../jquery-treeview/jquery.treeview.sortable.js,
+ .../vendors/jquery-treeview/lib/jquery.cookie.js,
+ mod/pages/vendors/jquery-treeview/lib/jquery.js,
+ mod/pages/vendors/jquery-treeview/todo, mod/pages/view.php,
+ mod/pages/views/default/pages/css.php,
+ mod/pages/views/default/pages/metatags.php,
+ mod/pages/views/default/pages/sidebar/history.php,
+ .../views/default/pages/sidebar/navigation.php,
+ .../views/default/pages/sidebar/sidebarthis.php,
+ mod/pages/views/default/pages/sidebar/starter.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/sidebar/wrapper.php: finished the first pass on
+ the pages plugin for using the new HTML/CSS
+
+ * views/default/layout/shells/content/header.php: this time got the guid
+ correct for the add button
+
+ * views/default/css/elements/navigation.php: limiting the +/- additions to
+ page menus
+
+ * js/lib/ui.js: limit the collapsible menus to page menus
+
+ * actions/widgets/add.php: making sure context is set correctly when adding
+ a widget
+
+ * views/default/layout/shells/content/header.php: fixed add link for all
+ site content pages
+
+ * mod/pages/actions/pages/edit.php, mod/pages/edit.php,
+ mod/pages/friends.php, mod/pages/history.php, mod/pages/index.php,
+ mod/pages/languages/en.php, mod/pages/lib/pages.php, mod/pages/new.php,
+ mod/pages/revision.php, mod/pages/start.php,
+ mod/pages/views/default/annotation/icon.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/css.php,
+ mod/pages/views/default/pages/group_module.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/icon.php,
+ mod/pages/views/default/pages/pagegallery.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/pages/sidebar/navigation.php,
+ mod/pages/views/default/widgets/pages/content.php,
+ mod/pages/views/default/widgets/pages/edit.php, mod/pages/world.php: more
+ clean up of the pages plugin to use new HTML/CSS
+
+ * mod/blog/views/default/object/blog.php: using list metadata view rather
+ than custom code
+
+ * engine/classes/ElggPlugin.php: fixed bug with plugin settings because of
+ assignment operator confusion
+
+ * engine/lib/private_settings.php: do not need {} around quoted variables
+ surrounded by quotes
+
+ * engine/classes/ElggPlugin.php: Fixes #2812 - correct check for guid now
+
+ * engine/classes/ElggPlugin.php: fixed backward compatibility issue with
+ $CONFIG in plugins' start.php
+
+ * engine/lib/navigation.php: deprecated add_menu() and made it compatible
+ with 1.8
+
+ * .../layout/shells/two_column_left_sidebar.php: added the
+ two_column_left_sidebar layout back so that plugins from 1.7 work with 1.8
+
+2011-01-21 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php, views/default/css/elements/base.php,
+ views/default/css/elements/chrome.php, views/default/css/elements/core.php,
+ views/default/css/elements/forms.php, views/default/css/elements/grid.php,
+ views/default/css/elements/icons.php, views/default/css/elements/layout.php,
+ views/default/css/elements/misc.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/reset.php, views/default/css/elements/spacing.php,
+ views/default/css/elements/typography.php: Made a thorough pass over the css.
+ Included todo's throughout to track what still needs to be done.
+
+2011-01-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/list/metadata.php: moved likes to end of
+ metadata and added a links parameter
+
+ * views/default/layout/shells/content/header.php: using page owner rather
+ than owner for better support for groups
+
+ * engine/lib/views.php: adding 'action' to url when overriding the form
+ action
+
+2011-01-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/actions/delete.php, mod/messages/actions/messages/delete.php,
+ mod/messages/actions/messages/process.php,
+ mod/messages/actions/messages/send.php, mod/messages/actions/send.php,
+ mod/messages/inbox.php, mod/messages/index.php,
+ mod/messages/languages/en.php, mod/messages/lib/messages.php,
+ mod/messages/read.php, mod/messages/readme.txt, mod/messages/send.php,
+ mod/messages/sent.php, mod/messages/start.php,
+ .../views/default/forms/messages/process.php,
+ .../views/default/forms/messages/reply.php,
+ mod/messages/views/default/forms/messages/send.php,
+ mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php,
+ mod/messages/views/default/object/messages.php: Updated the messages plugin
+ to use the new CSS/HTML
+
+ * mod/pages/actions/pages/editwelcome.php, mod/pages/edit.php,
+ mod/pages/friends.php, mod/pages/history.php, mod/pages/index.php,
+ mod/pages/languages/en.php, mod/pages/lib/pages.php, mod/pages/new.php,
+ mod/pages/start.php, mod/pages/view.php,
+ .../views/default/forms/pages/editwelcome.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/welcome.php, mod/pages/welcome.php,
+ mod/pages/world.php: pages plugin using new layout - still need to get
+ subpages working and navigation
+
+2011-01-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/export_handler.php, index.php,
+ mod/reportedcontent/start.php, mod/sitepages/sitepages_functions.php,
+ mod/tagcloud/tagcloud.php, pages/friends/add.php,
+ pages/friends/collections.php: changed layout on pages to one_sidebar
+
+ * mod/search/index.php, mod/search/views/default/search/layout.php,
+ mod/search/views/default/search/no_results.php: using new menu system and
+ page layouts in search
+
+ * mod/groups/graphics/icon.php, mod/groups/icon.php,
+ mod/groups/languages/en.php, mod/groups/lib/discussion.php,
+ mod/groups/start.php, .../views/default/discussion/group_module.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ .../views/default/groups/profile/forum_widget.php,
+ .../views/default/groups/profile/widgets.php,
+ .../views/default/object/groupforumtopic.php: finished discussion rewrite to
+ use new html/css
+
+2011-01-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/discussion/delete.php,
+ mod/groups/actions/discussion/save.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/addtopic.php,
+ mod/groups/edittopic.php, mod/groups/forum.php, mod/groups/languages/en.php,
+ mod/groups/lib/discussion.php, mod/groups/start.php,
+ mod/groups/topicposts.php,
+ mod/groups/views/default/forms/discussion/save.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/viewposts.php,
+ .../views/default/groups/group_sort_menu.php,
+ .../views/default/groups/profile/forum_widget.php,
+ .../views/default/object/groupforumtopic.php: discussion topics using new
+ page handler
+
+ * mod/developers/languages/en.php, mod/developers/manifest.xml,
+ mod/developers/start.php, .../views/default/admin/developers/preview.php:
+ added the beginnings of a core developers tool plugin
+
+ * documentation/css/preview/general.php, documentation/css/preview/grid.php,
+ documentation/css/preview/images.php, documentation/css/preview/index.php,
+ documentation/css/preview/nav.php, documentation/css/preview/objects.php,
+ documentation/css/preview/widgets.php: Added images to css preview and
+ removed the page centering
+
+ * engine/lib/river.php: Fixes #2402 adds 'add' 'river' plugin hook
+
+ * actions/profile/edit.php: Fixes #2372 fixed the entity included in profile
+ update event
+
+ * engine/tests/suite.php: Refs #2757 merged fix into trunk
+
+ * mod/twitter/languages/en.php, mod/twitter/start.php: Refs #2791 merged fix
+ into trunk
+
+2011-01-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/list/body.php: Small typo in comment
+
+2011-01-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/invite.php, mod/groups/lib/groups.php,
+ mod/groups/membershipreq.php, mod/groups/start.php,
+ .../views/default/groups/profile/buttons.php: finished moving the group pages
+ to library - forum pages next
+
+ * mod/groups/activity.php, mod/groups/all.php, mod/groups/edit.php,
+ mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invitations.php, mod/groups/languages/en.php,
+ mod/groups/lib/groups.php, mod/groups/membership.php, mod/groups/new.php,
+ mod/groups/start.php, .../views/default/groups/group_sort_menu.php,
+ .../views/default/groups/profile/buttons.php: moved most of the groups pages
+ into its library
+
+2011-01-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, mod/diagnostics/languages/en.php,
+ mod/logbrowser/languages/en.php,
+ .../views/default/admin/utilities/logbrowser.php: finished the admin title
+ modifications
+
+ * engine/lib/system_log.php: Fixed problem where system log code would crash
+ due to new plugin code
+
+ * engine/lib/admin.php, languages/en.php, mod/defaultwidgets/start.php,
+ .../views/default/admin/utilities/diagnostics.php,
+ mod/uservalidationbyemail/languages/en.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/appearance/profile_fields.php,
+ views/default/admin/overview/numentities.php,
+ views/default/admin/overview/online.php,
+ views/default/admin/overview/statistics.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/admin/users/add.php, views/default/admin/users/newest.php,
+ views/default/admin/users/online.php, views/default/layout/shells/admin.php,
+ views/default/layout/shells/administration.php: drying up the title creation
+ in the admin backend
+
+ * mod/groups/all.php, mod/groups/languages/en.php,
+ mod/groups/views/default/group/default.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ .../views/default/groups/sidebar/featured.php,
+ mod/groups/views/default/groups/sidebar/find.php,
+ .../views/default/icon/group/default/large.php,
+ .../views/default/icon/group/default/medium.php,
+ .../views/default/icon/group/default/small.php,
+ .../views/default/icon/group/default/tiny.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/settings/groups/edit.php: cleanup of the groups
+ plugin views
+
+2011-01-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/installation/canvas/default.php: elgg_view_layout is not used in
+ installation so removing old view
+
+ * install/css/install.css, views/installation/messages/errors/error.php,
+ views/installation/messages/errors/list.php,
+ views/installation/messages/list.php,
+ views/installation/messages/messages/list.php,
+ views/installation/messages/messages/message.php,
+ views/installation/page/elements/messages.php,
+ views/installation/page/shells/default.php: Fixes #2783 - updated
+ installation message code to mirror default views
+
+2011-01-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginPackage.php: Refs #2781: Checking if a dir was
+ passed as a plugin package. Need to do this to allow packages to be loaded
+ outside of plugin_dir.
+
+ * engine/classes/ElggPlugin.php: Refs #2781: Using same technique to check
+ for full plugin path in ElggPlugin.
+
+ * views/default/admin/plugins/simple.php: Refs #2782: Fixed WSOD for simple
+ plugin admin.
+
+ * languages/en.php, views/default/admin/components/invalid_plugin.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php: Refs #2782: Fixed WSOD for invalid
+ plugins on admin screen. Needs better CSS, but holding off until admin area
+ CSS revamp.
+
+ * engine/lib/entities.php: Changed callback function option from
+ 'row_callback' to 'callback' for elgg_get_entities().
+
+2011-01-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginPackage.php: Refs #2781 path checking in
+ ElggPluginPackage constructor should work for both *nix and Windows now
+
+ * mod/groups/groupprofile.php, .../views/default/groups/activity_latest.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/members.php,
+ .../default/groups/profile/activity_widget.php,
+ .../views/default/groups/profile/buttons.php,
+ .../default/groups/profile/closed_membership.php,
+ .../views/default/groups/profile/forum_widget.php,
+ .../views/default/groups/profile/profile_block.php,
+ .../views/default/groups/profile/widgets.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/groups/sidebar/members.php: cleaned up the group profile
+
+2011-01-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php,
+ mod/file/views/default/object/file.php,
+ views/default/css/elements/chrome.php, views/default/output/tags.php: changed
+ tag display to <ul>
+
+2011-01-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixes #1242: elgg_get_data() correctly returns an
+ empty array on no results. It still returns false on error, but I consider
+ that the correct behavior. Please reopen if it needs discussion.
+
+ * engine/lib/database.php, engine/tests/objects/entities.php: Refs #1242,
+ Fixes #2775. Pulled common code between get_data() and get_data_row() into
+ elgg_query_runner(). Caching is now done in the query runner instead of
+ spread across execute_query() and get_data*(). Namespacing cache for callback
+ and single row request. I'm open to better names for that function. Not
+ closing #1242 because the elgg_get_entities*() functions can still return
+ false.
+
+2011-01-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/start.php: moved action registration into init
+
+ * mod/sitepages/sitepages_functions.php: updating the site pages class to
+ use initializeAttributes
+
+ * mod/blog/languages/en.php, mod/blog/lib/blog.php, mod/blog/start.php,
+ mod/blog/views/default/blog/group_module.php, mod/file/index.php,
+ mod/file/languages/en.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/file/group_module.php,
+ views/default/layout/shells/content/header.php: switched from new to add
+
+ * engine/lib/relationships.php: Fixes test for $relationship_guid in sql
+ generating function
+
+ * engine/classes/ElggPluginPackage.php, engine/lib/elgglib.php,
+ engine/lib/metadata.php, engine/lib/views.php, engine/lib/xml.php: Fixes
+ #2774 - fixes several E_NOTICE issues - mostly due to accessign array indexes
+
+
+ * engine/start.php: replaced deprecated load_plugins() - thanks to hellekin
+
+2011-01-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ajax.js: Refs #2770 - success messages are stoted is success array
+ now in json
+
+ * js/lib/ui.js, views/default/js/elgg.php: Refs #2676 removes old
+ elgg_system_messages() function
+
+2011-01-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/elgglib.js: Fixes #2770: Corrected markup in JS to create system
+ messages.
+
+ * mod/profile/manifest.xml: Refs #2761. Removed test dep from profile
+ manifest. Profile no longer requires a version of Elgg from the year 3009.
+
+ * actions/admin/plugins/activate.php,
+ actions/admin/plugins/activate_all.php, actions/admin/plugins/deactivate.php,
+ actions/admin/plugins/deactivate_all.php, actions/admin/plugins/disable.php,
+ actions/admin/plugins/disableall.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/enableall.php, actions/admin/plugins/reorder.php,
+ actions/admin/plugins/set_priority.php,
+ actions/admin/plugins/simple_update_states.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginPackage.php, engine/lib/plugins.php,
+ languages/en.php, mod/profile/manifest.xml,
+ views/default/admin/components/plugin.php,
+ .../admin/components/plugin_dependencies.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php: Fixes #2760. Refs #2759. Updated
+ plugin admin actions to use the new system. Added plugin dependency views in
+ admin. ElggPluginPackage->checkDependencies() now returns the detected value.
+
+
+ * engine/classes/ElggPluginManifestParser17.php: Refs #2759: Added
+ elgg_version to 1.7 manifest parser.
+
+ * mod/oauth_lib/start.php: Fixes #2764. Corrected plugin path for oauth
+ vendor libs.
+
+2011-01-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.js, views/default/js/elgg.php: Fixes #2676 system messages fade
+ out again
+
+ * engine/lib/upgrades/2011010401.php, version.php: Fixes #2458 adds upgrade
+ to set default_access on old installs
+
+2011-01-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../page/elements/content_header_member.php,
+ views/default/page/shells/admin.php: Refs #7221: Removed CRLFs.
+
+ * views/default/js/languages.php, views/default/js/languages/en.php: Refs
+ #2771: Removed CRLFs.
+
+ * engine/lib/filestore.php: Refs #2771: Removed CRLF.
+
+ * js/lib/ajax.js, js/lib/elgglib.js, js/lib/languages.js,
+ js/lib/security.js, js/lib/session.js, js/lib/ui.js, js/lib/ui.widgets.js,
+ js/tests/ElggAjaxOptionsTest.js, js/tests/ElggAjaxTest.js,
+ js/tests/ElggLanguagesTest.js, js/tests/ElggLibTest.js,
+ js/tests/ElggSecurityTest.js, js/tests/ElggSessionTest.js,
+ js/tests/jsTestDriver.conf: Refs #2771: Removing CRLFs from javascript files.
+
+
+ * engine/lib/plugins.php: Fixed problem removing plugin entities if physical
+ files were deleted.
+
+2011-01-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/start.php: Refs #2732 added link to site pages but tab menu
+ still does not work
+
+ * mod/captcha/backgrounds/bg1.jpg, mod/captcha/backgrounds/bg2.jpg,
+ mod/captcha/backgrounds/bg3.jpg, mod/captcha/backgrounds/bg4.jpg,
+ mod/captcha/backgrounds/bg5.jpg, mod/captcha/captcha.php,
+ mod/captcha/fonts/1.ttf, mod/captcha/fonts/Liberation_serif_License.txt,
+ mod/captcha/languages/en.php, mod/captcha/manifest.xml,
+ mod/captcha/start.php, mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php, mod/crontrigger/manifest.xml,
+ mod/crontrigger/start.php: moving captcha and crontrigger plugins out of core
+
+
+2011-01-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginPackage.php: Removed experimental duplicate code
+ from ElggPlugin.
+
+ * engine/classes/ElggPlugin.php: Added ElggPlugin::getPath().
+
+ * engine/lib/plugins.php: Reindexing plugin priorities after regenerating
+ entities.
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginManifest.php,
+ engine/lib/plugins.php: Fixes #2763. Better normalizing for unused 1.7
+ manifest options. Added logging when ElggPluginPackage can't be loaded.
+ Better disabling of deleted physical plugins.
+
+ * mod/oauth_lib/manifest.xml: Removing unsupported requires in 1.7 manifest
+ for oauth lib.
+
+2011-01-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/examples/plugins/manifest.xml,
+ engine/classes/ElggPlugin.php, engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser18.php,
+ engine/classes/ElggPluginPackage.php, engine/lib/plugins.php,
+ engine/lib/upgrades/2011010101.php, engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_18/manifest.xml, languages/en.php,
+ version.php: Fixes #1986, #2170, #2225, #2759. Integrated ElggPluginPackage
+ and ElggPluginManifest with ElggPlugin. System now uses ElggPlugin objects to
+ determin plugins. Order is stored in private settings. This absolutely
+ requires running upgrade.php.
+
+ * engine/lib/elgglib.php: Refs #7552, #2547. Autoloading functions return
+ bool.
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggExtender.php,
+ engine/classes/ElggRelationship.php, engine/classes/ElggWidget.php: Refs
+ #2490. Using array_key_exists() instead of isset() in get() overrides to
+ prevent a check for (invalid) metadata with the name of an attribute if that
+ attribute evaluates to !isset().
+
+ * engine/lib/private_settings.php: Added checking for real entities to other
+ private setting functions.
+
+ * engine/lib/private_settings.php: set_private_setting() checks if the guid
+ is a real entity.
+
+ * upgrade.php: Upgrade invalidates simplecache instead of regenerating it.
+
+2011-01-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/save.php, mod/groups/languages/en.php,
+ mod/groups/views/default/groups/featured.php,
+ .../default/widgets/a_users_groups/content.php,
+ .../views/default/widgets/a_users_groups/edit.php: updated group widget
+
+ * engine/lib/admin.php, views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/plugins_advanced.php,
+ views/default/admin/plugins/plugins_simple.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/admin/site/site_advanced.php,
+ views/default/admin/site/site_basic.php: revert structure of admin views and
+ fixed uniqueness of admin page menu items
+
+2011-01-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, mod/blog/views/default/blog/sidebar/archives.php,
+ mod/blog/views/default/blog/sidebar/revisions.php,
+ mod/blog/views/default/forms/blog/save.php,
+ mod/embed/views/default/object/file/embedlist.php,
+ mod/groups/views/default/forms/groups/search.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/members.php,
+ views/default/annotation/generic_comment.php,
+ views/default/core/likes/display.php, views/default/core/members/sidebar.php,
+ views/default/css/admin.php, views/default/css/elements/core.php,
+ views/default/css/elements/misc.php, views/default/output/tagcloud.php:
+ updating the sidebar boxes to use the new module classes
+
+ * engine/lib/languages.php, .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/personal.php,
+ views/default/core/dashboard/blurb.php,
+ .../core/settings/account/default_access.php,
+ views/default/core/settings/account/email.php,
+ views/default/core/settings/account/language.php,
+ .../core/settings/account/notifications.php,
+ views/default/core/settings/account/password.php,
+ .../core/settings/statistics/numentities.php,
+ views/default/core/settings/statistics/online.php,
+ views/default/core/settings/tools/plugin.php,
+ views/default/css/elements/forms.php, views/default/css/elements/misc.php,
+ views/default/css/screen.php: using the info module for user settings
+
+ * views/default/css/admin.php, views/default/css/elements/base.php,
+ views/default/css/elements/chrome.php, views/default/css/elements/core.php,
+ views/default/css/elements/icons.php, views/default/css/elements/layout.php,
+ views/default/css/elements/misc.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/skin.php, views/default/css/elements/spacing.php,
+ views/default/css/elements/typography.php, views/default/css/screen.php,
+ .../layout/shells/one_column_with_sidebar.php: Refs #2317 dividing css
+ element views into skin views and base views. The expectation is that the
+ base views would not be overridden in a theme so the admin css can depend on
+ them.
+
+ * mod/blog/views/default/object/blog.php,
+ views/default/css/elements/core.php, views/default/navigation/menu/site.php,
+ views/default/output/longtext.php: starting adding a .elgg-text class -
+ plugins need to use output/longtext when displaying text
+
+ * .../views/default/bookmarks/bookmarklet.php,
+ views/default/css/elements/core.php: added discoverable pattern to css
+
+ * mod/blog/views/default/widgets/blog/edit.php,
+ mod/file/actions/file/delete.php, mod/file/actions/file/download.php,
+ mod/file/actions/file/save.php, mod/file/actions/file/upload.php,
+ mod/file/classes/FilePluginFile.php, mod/file/edit.php, mod/file/friends.php,
+ mod/file/index.php, mod/file/languages/en.php, mod/file/lib/file.php,
+ mod/file/search.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/file/css.php,
+ mod/file/views/default/file/group_module.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/icon.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/file/upload.php,
+ mod/file/views/default/forms/file/upload.php,
+ .../views/default/widgets/filerepo/content.php,
+ mod/file/views/default/widgets/filerepo/edit.php, mod/file/world.php,
+ mod/groups/views/default/groups/css.php,
+ views/default/output/confirmlink.php: almost finished updating the file
+ plugin to work with new html/css
+
+ * engine/lib/elgglib.php: removed unnecessary variable from stick forms code
+
+
+ * engine/lib/views.php: fixed the function for viewing latest comments
+
+ * engine/lib/output.php: stop double encoding attributes in output/input
+ elements
+
+ * engine/lib/users.php, languages/en.php: Fixes #2740 - exception messages
+ using the value for minimum username and password length
+
+ * engine/lib/group.php: Fixes #2561 only triggering join, group event if the
+ add relationship succeeded
+
+ * engine/lib/metadata.php: Fixes #2698 not sanitizing strings to prevent
+ double encoding
+
+2010-12-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #2684, #2754: Merged r7701 to trunk.
+
+2010-12-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: not caching js and css when not served through
+ simple cache right now
+
+2010-12-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Refs #2583, #2754: Merged r7445-7446 to
+ trunk.
+
+2010-12-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * documentation/css/preview/grid.php: added borders to the css grid preview
+
+2010-12-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php, engine/lib/views.php: Refs #2752, #2635. Merged
+ r7299 to trunk.
+
+ * engine/lib/metadata.php: Merged r7272 from 1.7 to trunk.
+
+2010-12-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/lib/blog.php, mod/file/download.php, mod/file/index.php,
+ mod/file/start.php, mod/file/thumbnail.php, mod/file/upload.php,
+ mod/file/views/default/file/groupprofile_files.php: file index page now
+ working for both users and groups
+
+ * mod/file/download.php, mod/file/index.php, mod/file/search.php,
+ mod/file/thumbnail.php, mod/file/views/default/file/upload.php,
+ .../views/default/widgets/filerepo/content.php,
+ mod/file/views/rss/object/file.php: a little standardization of the file
+ plugin code
+
+ * mod/embed/views/default/embed/embed.php,
+ views/default/navigation/tabs.php: Fixes #2703 - added support for url ids in
+ navigation tabs
+
+ * mod/embed/views/default/embed/css.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ views/default/core/friends/collectiontabs.php, views/default/css/admin.php,
+ views/default/css/elements/navigation.php, views/default/css/ie.php,
+ views/default/navigation/tabs.php: switching to a better name for tabs in css
+
+
+ * views/default/css/admin.php, views/default/css/elements/heading.php,
+ views/default/css/screen.php: removed heading css elements view
+
+ * views/default/navigation/menu/site.php: site menu needs a clearfix
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/views.php,
+ mod/file/search.php, mod/file/views/default/file/css.php,
+ views/default/layout/objects/gallery.php: added a proper gallery view - still
+ need to wire up the elgg_view_list_item functions and remove the use of
+ context
+
+ * mod/blog/views/default/object/blog.php: updated blog plugin due to change
+ in output/confirmlink
+
+2010-12-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/search.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/object/file.php, views/default/css/elements/core.php,
+ views/default/layout/objects/list.php,
+ views/default/layout/objects/list/metadata.php: added gallery css for the
+ file plugin
+
+ * documentation/css/preview/forms.php,
+ documentation/css/preview/general.php, documentation/css/preview/grid.php,
+ documentation/css/preview/head.php, documentation/css/preview/index.php,
+ documentation/css/preview/nav.php, documentation/css/preview/objects.php,
+ documentation/css/preview/widgets.php: major addition - adding preview of CSS
+ for developers and themers
+
+ * views/default/css/elements/skin.php: added some base css for 4 different
+ modules
+
+ * views/default/layout/objects/widget.php,
+ views/default/layout/objects/widget/controls.php: allow anyone to minimize a
+ widget
+
+ * views/default/widgets/friends/content.php: put a catch in for a bad owner
+ in the friends widget
+
+ * engine/lib/entities.php: adding ability to override access regardless of
+ whether the entity is saved in the database yet
+
+ * views/default/graphics/icon.php, views/default/output/confirmlink.php,
+ views/default/profile/hover.php: more html validation cleanup
+
+ * mod/tinymce/views/default/input/longtext.php: supporting an id in tinycme
+ longtext and not using the invalid language attribute
+
+ * views/default/input/autocomplete.php, views/default/input/checkboxes.php,
+ views/default/input/datepicker.php, views/default/input/userpicker.php: fixed
+ a few minor issues in input views for validation
+
+ * views/default/layout/objects/list/metadata.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/output/access.php: updated the default object entity view
+
+ * views/default/layout/objects/list/metadata.php: let likes code handle
+ whether the user is logged in or not
+
+ * views/default/input/autocomplete.php: fixes documentation and url of
+ endpoint
+
+ * mod/file/view.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/file/icon.php,
+ .../default/file/icon/application/default.php,
+ .../views/default/file/icon/application/excel.php,
+ .../views/default/file/icon/application/msword.php,
+ .../views/default/file/icon/application/pdf.php,
+ .../default/file/icon/application/powerpoint.php,
+ .../default/file/icon/application/vnd.ms-excel.php,
+ .../file/icon/application/vnd.ms-powerpoint.php,
+ .../application/vnd.oasis.opendocument.text.php,
+ .../views/default/file/icon/application/x-gzip.php,
+ .../file/icon/application/x-rar-compressed.php,
+ .../default/file/icon/application/x-stuffit.php,
+ .../views/default/file/icon/application/zip.php,
+ mod/file/views/default/file/icon/archive.php,
+ mod/file/views/default/file/icon/audio.php,
+ mod/file/views/default/file/icon/audio/default.php,
+ mod/file/views/default/file/icon/default.php,
+ mod/file/views/default/file/icon/document.php,
+ mod/file/views/default/file/icon/text/default.php,
+ .../views/default/file/icon/text/directory.php,
+ mod/file/views/default/file/icon/text/v-card.php,
+ mod/file/views/default/file/icon/video.php,
+ mod/file/views/default/file/icon/video/default.php,
+ .../default/file/specialcontent/audio/mid.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/x-wav.php,
+ .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/object/file.php: updated the object/file view
+
+ * actions/admin/user/resetpassword.php, actions/register.php,
+ actions/user/default_access.php, actions/useradd.php,
+ pages/account/register.php, pages/avatar/view.php,
+ views/default/admin/overview/statistics.php, views/default/profile/hover.php,
+ views/installation/input/button.php: Refs #2428 removed more CONFIG uses
+
+ * mod/groups/all.php, mod/groups/views/default/group/default.php: fixed new
+ groups listing
+
+ * engine/lib/views.php: required for river rss to work
+
+ * views/rss/canvas/default.php, views/rss/core/river/body.php,
+ views/rss/layout/objects/image_block.php, views/rss/output/url.php:
+ supporting river rss
+
+ * views/rss/entities/entity_list.php, views/rss/layout/objects/list.php,
+ views/rss/layout/shells/default.php: Fixes #2113 - updated rss view type to
+ use new view structure for lists
+
+ * engine/lib/plugins.php, views/default/admin/plugins/plugins_simple.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/admin/site/site_advanced.php,
+ views/default/admin/site/site_basic.php: fixed a few issues with the admin
+ backend - need to look into better ways to structure admin sub views
+
+2010-12-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/categories/views/default/categories/css.php,
+ mod/embed/views/default/embed/css.php,
+ .../views/default/invitefriends/formitems.php,
+ .../views/default/messageboard/forms/add.php,
+ .../views/default/widgets/messageboard/content.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/messages.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ mod/tinymce/views/default/input/longtext.php,
+ .../uservalidationbyemail/unvalidated_user.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/plugins_advanced.php,
+ views/default/css/admin.php, views/default/css/elements/forms.php,
+ views/default/css/screen.php, views/default/input/access.php,
+ views/default/input/checkbox.php, views/default/input/checkboxes.php,
+ views/default/input/email.php, views/default/input/file.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/plaintext.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/page/shells/walled_garden.php,
+ views/installation/input/access.php, views/installation/input/checkboxes.php,
+ views/installation/input/longtext.php, views/installation/input/pulldown.php:
+ stage 1 in moving the forms markup to elgg- namespaced css - buttons still
+ need work
+
+ * mod/diagnostics/index.php, mod/diagnostics/start.php,
+ .../views/default/admin/utilities/diagnostics.php,
+ .../views/default/diagnostics/forms/download.php,
+ .../views/default/diagnostics/runalltests.php: updated the diagnostics plugin
+ to use the new admin backend
+
+ * engine/lib/admin.php, languages/en.php, mod/logbrowser/start.php,
+ mod/reportedcontent/start.php: added admin utilities menu item
+
+ * mod/diagnostics/index.php, mod/search/index.php,
+ mod/sitepages/sitepages_functions.php,
+ views/default/page/elements/content.php: Fixes #2241 - removed direct calls
+ to the content wrapper view and removed the view as it is been replaced by a
+ body view
+
+ * mod/blog/lib/blog.php: Refs #2077 added new blog post button to group blog
+ - can be used as module for remianing group tools
+
+ * mod/blog/lib/blog.php: Fixes #2169 - setting the blog edit page owner to
+ container
+
+ * mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/messages.php,
+ views/foaf/user/default.php: Refs #1553 - removed all hard coded profile urls
+ from core
+
+ * engine/lib/river.php, engine/lib/views.php: Fixes #2221 - rewrite of rover
+ functions has been completed with moving elgg_view_river_item() into the
+ views library. The ugly C&P functions were moved into the riverdashboard
+ plugin and new 1.7 style get/list functions were introduced
+
+ * actions/profile/edit.php, actions/profile/fields/add.php,
+ actions/profile/fields/delete.php, actions/profile/fields/reorder.php,
+ actions/profile/fields/reset.php, engine/lib/users.php,
+ mod/profile/views/default/profile/details.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/forms/profile/edit.php: Fixes #2751 profile custom fields uses
+ the config table now
+
+ * engine/lib/configuration.php: added a catch for configuration names longer
+ than 32 characters
+
+ * engine/lib/configuration.php: fixed bug where get_config was returning 0
+ because there is not not auto id on the config table
+
+ * mod/tabbed_profile/actions/addcomment.php,
+ mod/tabbed_profile/actions/deletecomment.php,
+ mod/tabbed_profile/graphics/defaultlarge.gif,
+ mod/tabbed_profile/graphics/defaultmaster.gif,
+ mod/tabbed_profile/graphics/defaultmedium.gif,
+ mod/tabbed_profile/graphics/defaultsmall.gif,
+ mod/tabbed_profile/graphics/defaulttiny.gif,
+ mod/tabbed_profile/graphics/defaulttopbar.gif,
+ mod/tabbed_profile/graphics/drag_handle.png,
+ mod/tabbed_profile/graphics/speech_bubble_tail.gif,
+ mod/tabbed_profile/graphics/twitter16px.png, mod/tabbed_profile/icon.php,
+ mod/tabbed_profile/icondirect.php, mod/tabbed_profile/languages/en.php,
+ mod/tabbed_profile/manifest.xml, mod/tabbed_profile/start.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ .../views/default/profile/content_wrapper.php,
+ mod/tabbed_profile/views/default/profile/css.php,
+ .../views/default/profile/listing.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ .../views/default/profile/menu/links.php,
+ .../views/default/profile/metatags.php,
+ .../views/default/profile/ownerblock.php,
+ .../views/default/profile/sidebar.php,
+ .../views/default/profile/tab_navigation.php,
+ .../views/default/profile/tabs/activity.php,
+ .../views/default/profile/tabs/commentwall.php,
+ .../views/default/profile/tabs/details.php,
+ .../views/default/profile/tabs/friends.php,
+ .../views/default/profile/tabs/groups.php,
+ .../views/default/profile/tabs/twitter.php: Fixes #2481 - moving
+ tabbed_profile plugin into the plugins repo from core - it needs some updates
+ to reflect changes to the core profile plugin
+
+ * mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ mod/riverdashboard/endpoint/get_comments.php,
+ mod/riverdashboard/endpoint/get_likes.php,
+ mod/riverdashboard/endpoint/ping.php,
+ mod/riverdashboard/graphics/follow_icon.png,
+ mod/riverdashboard/graphics/refresh.png, mod/riverdashboard/index.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/manifest.xml,
+ mod/riverdashboard/start.php, .../views/default/river/dashboard.php,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/ecml/activity.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/river/body.php,
+ .../views/default/riverdashboard/river/footer.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/json/riverdashboard/container.php,
+ .../views/rss/riverdashboard/container.php: Fixes #2226 moves riverdashboard
+ into secondary plugins from core plugins - most of riverdashboard
+ functionality is now in core (except for displaying who has liked stuff and
+ ajax refreshes)
+
+ * views/default/css/screen.php, views/default/forms/likes/display.php,
+ views/default/forms/likes/link.php: cleaned up left over views and css from
+ likes
+
+ * actions/likes/add.php, actions/likes/delete.php, engine/lib/elgglib.php,
+ js/lib/ui.js, languages/en.php, views/default/annotation/likes.php,
+ views/default/core/likes/display.php, views/default/core/river/controls.php,
+ views/default/css/screen.php, views/default/forms/likes/edit.php,
+ views/default/js/elgg.php: rewrote the display of likes
+
+ * engine/lib/annotations.php: updated documentation on new
+ elgg_annotation_exists() function
+
+ * mod/blog/views/default/object/blog.php: let likes code handle logged in
+ user status
+
+ * views/default/css/elements/navigation.php: forgot to remove commented css
+ statement
+
+ * views/default/css/elements/navigation.php,
+ views/default/page/elements/footer.php: styled the footer menu
+
+ * views/default/css/elements/core.php, views/default/css/elements/skin.php,
+ views/default/layout/elements/page_links.php,
+ views/default/layout/elements/sidebar.php: created a new layout element -
+ page links - holds stuff like the rss link
+
+ * mod/file/classes/FilePluginFile.php, mod/file/start.php: moved the file
+ class into a class file
+
+ * mod/blog/lib/blog.php, mod/blog/start.php: more clean up of the blog
+ plugin - removed unused functions and moved the url forwarder into library
+
+ * mod/defaultwidgets/start.php, mod/diagnostics/start.php,
+ mod/logbrowser/start.php, mod/messages/start.php,
+ mod/reportedcontent/start.php, mod/uservalidationbyemail/start.php: updating
+ plugins to use new page menu
+
+ * mod/file/view.php: forgot to add this file for the fie plugin
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/admin.php, engine/lib/navigation.php, engine/lib/users.php,
+ js/lib/ui.js, views/default/admin/overview.php,
+ views/default/admin/overview/statistics.php, views/default/css/admin.php,
+ views/default/css/elements/navigation.php,
+ views/default/layout/elements/sidebar.php,
+ views/default/navigation/menu/elements/group.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/navigation/menu/page.php: page menu using the new menu system -
+ admin menu updated
+
+ * mod/file/actions/delete.php, mod/file/actions/download.php,
+ mod/file/actions/file/delete.php, mod/file/actions/file/download.php,
+ mod/file/actions/file/save.php, mod/file/actions/file/upload.php,
+ mod/file/actions/save.php, mod/file/actions/upload.php, mod/file/edit.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/languages/en.php,
+ mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/object/file.php, mod/file/world.php: starting to
+ update the file plugin to use the new html/css
+
+ * mod/blog/languages/en.php, mod/blog/lib/blog.php, mod/blog/start.php,
+ mod/blog/views/default/blog/group_module.php,
+ views/default/layout/shells/content/header.php: new content link uses guid to
+ make supporting groups and users easier
+
+ * views/default/output/url.php: supporting anchors with a href in output/url
+
+
+ * views/default/layout/objects/list/metadata.php: added a general metadata
+ view for lists
+
+2010-12-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Cleaned up register_translations().
+
+2010-12-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Added elgg_register_viewtype().
+
+2010-12-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: merged the admin profile edit fields language strings
+ into core
+
+ * engine/lib/plugins.php: fixing merge of plugin code [7727] - it blew away
+ the plugin class loading code
+
+ * languages/en.php, mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/details.php: moved profile fields language
+ strings into core and update profile plugin details view
+
+ * engine/lib/users.php, views/default/navigation/menu/user_admin.php:
+ removed early version of admin context menu and fixed missing edit profile
+ button
+
+2010-12-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Refs #2635, #2643. Merged cache changes into
+ trunk.
+
+2010-12-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/graphics/drag_handle.png,
+ mod/profile/graphics/twitter16px.png, mod/profile/languages/en.php,
+ mod/profile/start.php, mod/profile/views/default/profile/box.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/details.php,
+ mod/profile/views/default/profile/listing.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ mod/profile/views/default/profile/menu/links.php,
+ mod/profile/views/default/profile/owner_block.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ mod/profile/views/default/profile/sidebar.php,
+ mod/profile/views/default/profile/wrapper.php: more clean up of the basic
+ profile plugin - reorged views and removed a lot of cruft
+
+2010-12-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Refs #2543: set_default_config() uses better
+ names. get_config() rewrites old names to new, but have to double up
+ assignments in $CONFIG for ppl not using get_config().
+
+2010-12-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/users.php, engine/lib/views.php, mod/blog/start.php,
+ mod/bookmarks/start.php, mod/file/start.php, mod/logbrowser/start.php,
+ mod/messages/start.php, mod/pages/start.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ views/default/navigation/menu/user_hover.php: improved menu creation for on
+ demand menus and integrated hover menu items into profile owner block
+
+ * engine/classes/ElggUser.php, engine/lib/elgglib.php, engine/lib/users.php,
+ mod/logbrowser/start.php, mod/messages/start.php,
+ views/default/css/elements/navigation.php, views/default/js/elgg.php,
+ views/default/navigation/menu/user_hover.php,
+ views/default/profile/hover.php: moved most of the code for the user hover
+ menu into the new menu system
+
+2010-12-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/icons/user/defaultlarge.gif,
+ _graphics/icons/user/defaultmaster.gif,
+ _graphics/icons/user/defaultmedium.gif,
+ _graphics/icons/user/defaultsmall.gif, _graphics/icons/user/defaulttiny.gif,
+ _graphics/icons/user/defaulttopbar.gif,
+ mod/profile/graphics/defaultlarge.gif,
+ mod/profile/graphics/defaultmaster.gif,
+ mod/profile/graphics/defaultmedium.gif,
+ mod/profile/graphics/defaultsmall.gif, mod/profile/graphics/defaulttiny.gif,
+ mod/profile/graphics/defaulttopbar.gif,
+ mod/profile/graphics/speech_bubble_tail.gif,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ views/default/icon/user/default/large.php,
+ views/default/icon/user/default/master.php,
+ views/default/icon/user/default/medium.php,
+ views/default/icon/user/default/small.php,
+ views/default/icon/user/default/tiny.php,
+ views/default/icon/user/default/topbar.php: moved default profile icons into
+ core
+
+ * mod/blog/start.php, mod/blog/views/default/blog/group_module.php,
+ mod/bookmarks/languages/en.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/groups/views/default/group/default.php, mod/pages/start.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/skin.php,
+ views/default/layout/elements/owner_block.php,
+ views/default/layout/elements/sidebar.php,
+ views/default/layout/objects/list/body.php,
+ views/default/navigation/menu/default.php, views/default/user/default.php:
+ updated owner blocks for users and groups
+
+2010-12-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, mod/blog/views/default/object/blog.php,
+ views/default/layout/elements/comments.php: supporting id for comments for in
+ page links
+
+ * mod/blog/views/default/object/blog.php,
+ views/default/layout/objects/list/body.php: fixing a few display issues in
+ the object/blog view
+
+ * mod/blog/views/default/object/blog.php,
+ views/default/css/elements/core.php,
+ views/default/layout/objects/list/body.php: creating standard list body for
+ plugins
+
+2010-12-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/profile/tabs/friends.php,
+ .../views/default/profile/tabs/groups.php: using new list methods in tabbed
+ profile plugin
+
+ * engine/classes/ElggUser.php: Added list groups and list friends class
+ methods - will be handy for federation
+
+ * engine/classes/ElggUser.php: added a class math to get a user's groups and
+ cleaned up some documentation
+
+ * engine/lib/users.php: Refs #2283 using entity_row_to_elggstar() when
+ loading user from username or code so that ElggUser can be subclassed
+
+ * views/default/layout/objects/list.php: Fixes #2730 - passing the vars
+ array into elgg_view_list_item so that eventually plugins can pass additional
+ parameters into list views
+
+ * engine/lib/elgglib.php: Fixes #2741 skipping :// when replacing // in file
+ paths so that we support URIs
+
+ * mod/tabbed_profile/manifest.xml: do not enable tabbed profile by default -
+ also need to set a conflict key in its manifest for the profile plugin
+
+2010-12-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/defaultwidgets/editor.php,
+ .../views/default/embed/web_services/content.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../views/default/riverdashboard/css.php,
+ views/default/admin/components/plugin.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/core/friends/picker.php, views/default/css/admin.php,
+ views/default/css/elements/forms.php, views/default/css/screen.php,
+ views/default/input/button.php, views/installation/input/button.php: adding
+ elgg namespace to button css classes
+
+2010-12-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: merged the fix to get access collection
+ documentation into trunk from 1.7 branch
+
+2010-12-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php, pages/entities/index.php,
+ views/default/css/elements/skin.php, views/default/css/screen.php,
+ views/default/forms/likes/edit.php, views/default/output/confirmlink.php:
+ added elgg-icon-delete and elgg-icon-likes
+
+ * engine/lib/views.php, mod/groups/views/default/groups/grouplisting.php,
+ .../views/default/profile/listing.php,
+ .../views/default/profile/tabs/activity.php,
+ .../views/default/profile/tabs/friends.php,
+ .../views/default/profile/tabs/groups.php: added the core river to the tabbed
+ profile plugin and fixed some deprecated function warnings
+
+2010-12-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/admin.php: fixed a bug I introduced in the admin css
+
+ * mod/profile/views/default/profile/box.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/details.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ mod/profile/views/default/profile/sidebar.php,
+ views/default/css/elements/skin.php: an almost done widget-based profile
+ plugin
+
+ * actions/widgets/save.php, engine/classes/ElggDiskFilestore.php,
+ js/lib/ui.js, js/lib/ui.widgets.js,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php, pages/dashboard.php,
+ views/default/css/screen.php, views/default/graphics/ajax_loader.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/objects/widget/settings.php,
+ views/default/layout/shells/widgets.php: fixed a few bugs and updated the
+ widget code
+
+ * js/lib/ui.widgets.js, views/default/css/screen.php,
+ views/default/layout/objects/widget.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/objects/widget/settings.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/layout/shells/widgets/add_panel.php: namespaced the widget code
+
+
+ * js/lib/ui.widgets.js, pages/dashboard.php,
+ views/default/core/dashboard/blurb.php, views/default/css/screen.php,
+ views/default/layout/shells/widgets.php: starting to use the grid in the
+ widget code
+
+ * engine/lib/river.php: fixed missed variable name change in river's use of
+ image block pattern
+
+ * mod/profile/views/default/profile/javascript.php,
+ .../views/default/profile/javascript.php: moved avatar drop down javascript
+ into core
+
+ * mod/file/views/default/file/css.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/icon.php, mod/profile/start.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/tabbed_profile/start.php,
+ mod/tabbed_profile/views/default/profile/css.php,
+ .../views/default/profile/javascript.php, views/default/css/screen.php,
+ views/default/js/elgg.php, views/default/profile/icon.php: using
+ elgg-user-icon instead of usericon and moving the css into core
+
+ * mod/blog/views/default/forms/blog/save.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/messages/views/default/messages/messages.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ .../views/default/object/reported_content.php,
+ mod/tabbed_profile/views/default/profile/css.php,
+ .../views/default/profile/ownerblock.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/css/admin.php, views/default/css/elements/forms.php,
+ views/default/css/elements/skin.php, views/default/css/screen.php,
+ views/default/forms/profile/fields/reset.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/page/elements/content_header.php: replacing action-button with
+ elgg-action-button
+
+ * views/default/css/elements/skin.php,
+ views/default/layout/shells/content/header.php: using more generic markup for
+ main header
+
+ * mod/search/views/default/search/css.php,
+ mod/search/views/default/search/search_box.php: updated search box css
+
+ * .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/footer_link.php, mod/sitepages/start.php,
+ .../views/default/sitepages/footer_menu.php,
+ views/default/css/elements/skin.php, views/default/page/elements/footer.php:
+ cleaning up the page footer - still need to add css for footer menu
+
+ * views/default/css/elements/skin.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/page/elements/topbar.php: refining the elgg-alt pattern
+
+ * views/default/css/admin.php, views/default/css/elements/core.php,
+ views/default/css/elements/layout.php, views/default/css/screen.php,
+ views/default/layout/objects/image_block.php: completed the media to image
+ block switch
+
+ * engine/lib/river.php, engine/lib/views.php,
+ mod/blog/views/default/object/blog.php, mod/riverdashboard/start.php,
+ views/default/annotation/generic_comment.php,
+ views/default/css/elements/layout.php,
+ views/default/layout/objects/image_block.php,
+ views/default/layout/objects/media.php: changed name from media block to
+ image block
+
+ * views/default/css/admin.php,
+ views/default/layout/shells/administration.php,
+ views/default/page/shells/admin.php: started cleaning up the admin css
+
+ * engine/lib/admin.php, engine/lib/views.php, engine/start.php: added a
+ ready,system event so that plugins can do things after the init has finished
+ but before pages are created
+
+ * views/default/navigation/menu/user_admin.php,
+ views/default/profile/hover.php, views/default/profile/icon.php: cleaned up
+ profile hover menu
+
+ * engine/lib/users.php, mod/logbrowser/start.php,
+ .../views/default/logbrowser/adminlinks.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ .../views/default/profile/admin_menu.php,
+ .../views/default/profile/hoverover.php,
+ mod/tabbed_profile/views/default/profile/icon.php,
+ .../views/default/profile/ownerblock.php,
+ views/default/navigation/menu/user_admin.php, views/default/profile/icon.php:
+ added a user admin menu that plugins can add menu items to
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/pages/start.php, mod/profile/views/default/profile/ownerblock.php: pulled
+ user owner block menu out of profile plugin with new menu code
+
+ * mod/profile/actions/addcomment.php, mod/profile/actions/deletecomment.php,
+ mod/profile/start.php, mod/profile/views/default/profile/box.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ .../views/default/profile/content_wrapper.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/details.php,
+ .../views/default/profile/tab_navigation.php,
+ .../views/default/profile/tabs/activity.php,
+ .../views/default/profile/tabs/commentwall.php,
+ mod/profile/views/default/profile/tabs/details.php,
+ mod/profile/views/default/profile/tabs/friends.php,
+ mod/profile/views/default/profile/tabs/groups.php,
+ mod/profile/views/default/profile/tabs/twitter.php,
+ mod/tabbed_profile/actions/addcomment.php,
+ mod/tabbed_profile/actions/deletecomment.php,
+ mod/tabbed_profile/graphics/defaultlarge.gif,
+ mod/tabbed_profile/graphics/defaultmaster.gif,
+ mod/tabbed_profile/graphics/defaultmedium.gif,
+ mod/tabbed_profile/graphics/defaultsmall.gif,
+ mod/tabbed_profile/graphics/defaulttiny.gif,
+ mod/tabbed_profile/graphics/defaulttopbar.gif,
+ mod/tabbed_profile/graphics/drag_handle.png,
+ mod/tabbed_profile/graphics/speech_bubble_tail.gif,
+ mod/tabbed_profile/graphics/twitter16px.png, mod/tabbed_profile/icon.php,
+ mod/tabbed_profile/icondirect.php, mod/tabbed_profile/languages/en.php,
+ mod/tabbed_profile/manifest.xml, mod/tabbed_profile/start.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ .../views/default/profile/admin_menu.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ .../views/default/profile/content_wrapper.php,
+ mod/tabbed_profile/views/default/profile/css.php,
+ .../views/default/profile/hoverover.php,
+ mod/tabbed_profile/views/default/profile/icon.php,
+ .../views/default/profile/javascript.php,
+ .../views/default/profile/listing.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ .../views/default/profile/menu/links.php,
+ .../views/default/profile/metatags.php,
+ .../views/default/profile/ownerblock.php,
+ .../views/default/profile/sidebar.php,
+ .../views/default/profile/tab_navigation.php,
+ .../views/default/profile/tabs/activity.php,
+ .../views/default/profile/tabs/commentwall.php,
+ .../views/default/profile/tabs/details.php,
+ .../views/default/profile/tabs/friends.php,
+ .../views/default/profile/tabs/groups.php,
+ .../views/default/profile/tabs/twitter.php: rough widget profile plugin
+
+ * mod/profile/javascript.php, mod/profile/start.php,
+ .../views/default/profile/content_wrapper.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/ownerblock.php,
+ .../views/default/profile/profile_content.php,
+ .../default/profile/profile_contents/activity.php,
+ .../profile/profile_contents/commentwall.php,
+ .../default/profile/profile_contents/details.php,
+ .../default/profile/profile_contents/friends.php,
+ .../default/profile/profile_contents/groups.php,
+ .../default/profile/profile_contents/twitter.php,
+ .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php,
+ mod/profile/views/default/profile/sidebar.php,
+ .../views/default/profile/tab_navigation.php,
+ .../views/default/profile/tabs/activity.php,
+ .../views/default/profile/tabs/commentwall.php,
+ mod/profile/views/default/profile/tabs/details.php,
+ mod/profile/views/default/profile/tabs/friends.php,
+ mod/profile/views/default/profile/tabs/groups.php,
+ mod/profile/views/default/profile/tabs/twitter.php: more profile clean up
+
+ * mod/profile/edit.php, mod/profile/index.php, mod/profile/profile_lib.php,
+ mod/profile/start.php: more cleanup of the profile plugin from the
+ reorganization
+
+2010-12-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/profile/fields/add.php, actions/profile/fields/delete.php,
+ actions/profile/fields/reorder.php, actions/profile/fields/reset.php,
+ engine/lib/admin.php, mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/editdefault.php, mod/profile/actions/editfield.php,
+ mod/profile/actions/reorder.php, mod/profile/actions/resetdefaultprofile.php,
+ mod/profile/start.php, mod/profile/vendor/jquery.jeditable.mini.js,
+ .../default/admin/appearance/defaultprofile.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../default/profile/editdefaultprofileitems.php,
+ vendors/jquery/jquery.jeditable.mini.js,
+ views/default/admin/appearance/profile_fields.php,
+ .../admin/appearance/profile_fields/list.php,
+ views/default/forms/profile/fields/add.php,
+ views/default/forms/profile/fields/reset.php: continuing to slash and burn
+ the profile plugin - moving the admin profile fields into core - last major
+ change
+
+ * actions/profile/edit.php, engine/lib/users.php, languages/en.php,
+ mod/profile/actions/edit.php, mod/profile/start.php, pages/avatar/edit.php,
+ pages/profile/edit.php, views/default/forms/profile/edit.php: moved profile
+ edit form into core
+
+ * engine/lib/users.php, languages/en.php, mod/profile/editicon.php,
+ .../views/default/js/jquery.imgareaselect-0.8.js,
+ .../default/js/jquery.imgareaselect-0.8.min.js,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/editicon.php,
+ .../views/default/profile/profile_ownerblock.php, pages/avatar/edit.php,
+ pages/avatar/view.php, vendors/jquery/jquery.imgareaselect-0.8.min.js,
+ views/default/core/avatar/crop.php, views/default/core/avatar/upload.php,
+ views/default/css/screen.php, views/default/forms/avatar/crop.php,
+ views/default/forms/avatar/upload.php: pulling the avatar code out of the
+ profile plugin - just some minor icon related code left
+
+ * actions/avatar/crop.php, actions/avatar/upload.php, engine/lib/users.php,
+ languages/en.php, mod/groups/start.php, mod/profile/actions/cropicon.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/views/default/profile/editicon.php,
+ views/default/forms/avatar/crop.php, views/default/forms/avatar/upload.php:
+ moved the avatar forms and actions into core from profile plugin
+
+ * engine/classes/ElggMenuItem.php, engine/lib/users.php,
+ engine/lib/usersettings.php, mod/invitefriends/index.php,
+ mod/invitefriends/start.php, .../views/default/invitefriends/formitems.php,
+ mod/notifications/groups.php, mod/notifications/index.php,
+ mod/notifications/start.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/groupsform.php,
+ views/default/css/elements/navigation.php,
+ views/default/layout/elements/sidebar.php,
+ views/default/navigation/menu/default.php: half way through converting
+ submenu to new menu code - pages and groups are the two major users left
+
+ * actions/admin/menu/save.php, actions/admin/menu_items.php,
+ engine/classes/ElggMenuItem.php, engine/lib/admin.php,
+ engine/lib/navigation.php, engine/lib/river.php, engine/lib/users.php,
+ mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/groups/start.php, mod/pages/start.php, mod/riverdashboard/start.php,
+ mod/thewire/start.php, views/default/admin/appearance/menu_items.php,
+ views/default/navigation/menu/elements/item.php,
+ views/default/navigation/menu/site.php,
+ views/default/navigation/site_nav.php,
+ views/default/page/elements/header.php: site nav menu now uses new menu code
+ (and finished the implementation of custom menu items while I was at it - not
+ backward compatible with the previous half finished version)
+
+2010-12-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * pages/account/forgotten_password.php, pages/account/register.php,
+ pages/entities/list.php, pages/friends/index.php, pages/friends/of.php,
+ pages/settings/statistics.php: updated some of the core pages based on new
+ CSS and layouts
+
+ * mod/notifications/start.php: fixed another underline to dash conversion
+ issue
+
+ * engine/lib/upgrades/2010121702.php, languages/en.php, version.php,
+ views/default/annotation/annotatelike.php,
+ views/default/river/annotation/likes/create.php: last of the river updates I
+ hope - fixes the likes river view
+
+ * engine/lib/notification.php, engine/lib/statistics.php,
+ engine/lib/users.php, engine/lib/usersettings.php,
+ mod/notifications/start.php, pages/settings/account.php,
+ pages/settings/index.php, pages/settings/plugins.php,
+ pages/settings/statistics.php, pages/settings/tools.php,
+ pages/settings/user.php, views/default/core/settings/account.php,
+ .../core/settings/account/default_access.php,
+ views/default/core/settings/account/email.php,
+ views/default/core/settings/account/language.php,
+ views/default/core/settings/account/name.php,
+ .../core/settings/account/notifications.php,
+ views/default/core/settings/account/password.php,
+ views/default/core/settings/statistics.php,
+ .../core/settings/statistics/numentities.php,
+ views/default/core/settings/statistics/online.php,
+ views/default/core/settings/tools.php,
+ views/default/core/settings/tools/plugin.php,
+ views/default/forms/account/settings.php,
+ views/default/page/elements/topbar.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php, views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/notifications.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/usersettings/user.php: reorganized the settings views and
+ updated the pages to use new layout
+
+ * .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php: removed old river code from
+ the profile plugin - profile updates no longer go to the river
+
+ * engine/lib/upgrades/2010121701.php, mod/groups/languages/en.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ .../river/object/groupforumtopic/annotate.php,
+ .../river/object/groupforumtopic/create.php,
+ .../river/object/groupforumtopic/update.php,
+ .../default/river/relationship/member/create.php, version.php: updated group
+ member and group forum topics to new river
+
+ * mod/pages/actions/pages/edit.php,
+ .../views/default/river/object/page/update.php,
+ .../views/default/river/object/page_top/update.php: removed pages update
+ river code
+
+ * mod/pages/languages/en.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/page_top/create.php,
+ mod/thewire/languages/en.php,
+ .../views/default/river/object/thewire/create.php: added pages and thewire
+ river entries
+
+ * languages/en.php, .../views/default/river/object/blog/create.php,
+ .../default/river/object/bookmarks/create.php, mod/file/languages/en.php,
+ .../views/default/river/object/file/create.php, mod/groups/languages/en.php,
+ mod/groups/views/default/river/group/create.php: supporting putting content
+ in groups in for river views and added file river code
+
+ * .../views/default/river/object/blog/create.php,
+ mod/bookmarks/languages/en.php,
+ .../default/river/object/bookmarks/create.php, views/default/css/screen.php,
+ .../river/annotation/generic_comment/create.php,
+ views/default/river/relationship/friend/create.php: updated river views for
+ content display and added new bookmarks river view code
+
+ * mod/bookmarks/start.php: bookmarks plugin needs to be rewritten - hacked
+ it to get the add functionality working
+
+ * engine/classes/ElggMenuBuilder.php, engine/classes/ElggMenuItem.php,
+ engine/lib/navigation.php, engine/lib/views.php: Refs #2320 added new menu
+ functions and classes
+
+ * mod/riverdashboard/start.php, .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/river/footer.php: fixed remaining javascript
+ for riverdashboard - it's ready to be moved out to plugins
+
+ * .../views/default/riverdashboard/css.php: fixed comment form toggle in
+ riverdashboard plugin
+
+ * mod/riverdashboard/index.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/river/body.php,
+ .../views/default/riverdashboard/river/footer.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ views/default/forms/likes/display.php: updated riverdashboard plugin to use
+ new river display code - javascript code currently broken for comments and
+ likes
+
+ * .../views/default/river/object/blog/create.php,
+ mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ mod/riverdashboard/start.php, .../views/default/river/item/list.php: updated
+ riverdashboard to load the river item class
+
+ * actions/comments/add.php, engine/lib/upgrades/2010121602.php,
+ mod/blog/languages/en.php, mod/file/languages/en.php,
+ mod/pages/languages/en.php, .../views/default/river/object/page/annotate.php,
+ .../default/river/object/page_top/annotate.php, version.php,
+ views/default/annotation/annotate.php,
+ .../river/annotation/generic_comment/create.php: updated the river
+ generic_comment view for the new river code
+
+ * _graphics/elgg_sprites.png, engine/lib/upgrades/2010121601.php,
+ languages/en.php, .../default/river/relationship/friend/create.php,
+ version.php, views/default/core/river/controls.php,
+ views/default/css/elements/skin.php, views/default/css/screen.php,
+ views/default/friends/river/create.php, views/default/river/item/list.php,
+ views/default/river/item/wrapper.php,
+ views/default/river/relationship/friend/create.php: updated the river friend
+ view for the new river code
+
+2010-12-16 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/upload_js.php: Fixes #2313, #1106 removed the last of the
+ aborted multiple file uploading code
+
+ * engine/lib/elgglib.php, js/lib/languages.js: Fixes #2725 - js page handler
+ now handles javascript views with slashes in their names
+
+ * engine/lib/elgglib.php: fixed a lot of notices being generated by the new
+ plugin hook code
+
+ * pages/members/search.php: replaced deprecated function in members search
+ page
+
+ * views/default/css/elements/skin.php,
+ views/default/layout/shells/one_column.php,
+ views/default/layout/shells/one_sidebar.php,
+ views/default/layout/shells/two_sidebar.php: adjusted page body css to use
+ top level class to determine width and centering
+
+ * pages/members/search.php, views/default/layout/shells/one_sidebar.php:
+ added title parameter to one_sidebar layout
+
+ * pages/members/search.php, views/default/layout/shells/content.php,
+ views/default/layout/shells/one_sidebar.php: layout views should use
+ 'content' to support alternate viewtypes (like rss) - updated the one_sidebar
+ view
+
+ * engine/lib/users.php, languages/en.php, mod/friends/languages/en.php,
+ mod/friends/manifest.xml, mod/friends/start.php,
+ .../views/default/widgets/friends/content.php,
+ mod/friends/views/default/widgets/friends/edit.php,
+ views/default/widgets/friends/content.php,
+ views/default/widgets/friends/edit.php: moved friends widget into core
+
+2010-12-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/widget.php,
+ views/default/layout/objects/widget/controls.php,
+ views/default/layout/objects/widget/settings.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout/shells/widgets/add_button.php,
+ views/default/layout/shells/widgets/add_panel.php,
+ views/default/object/widget.php, views/default/widgets/add_button.php,
+ views/default/widgets/add_panel.php, views/default/widgets/controls.php,
+ views/default/widgets/settings.php, views/default/widgets/wrapper.php: moved
+ widget into layout/objects as one of our core css objects
+
+ * engine/classes/ElggPluginManifestParser17.php: Fixes #2728 creating a name
+ for plugins with 1.7 manifests based on hellekin's patch
+
+ * views/default/admin/plugins/advanced.php: checking if categories are set
+ before looping (hellekin)
+
+ * engine/lib/statistics.php, mod/diagnostics/start.php,
+ mod/groups/start.php: updated to removing more deprecation warnings (from
+ hellekin)
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/friends/start.php, mod/groups/start.php, mod/messageboard/start.php,
+ mod/pages/start.php, mod/tagcloud/start.php, mod/thewire/start.php,
+ mod/twitter/start.php: replacing calls to add_widget_type() with
+ elgg_register_widget_type() (from hellekin)
+
+ * install/ElggRewriteTester.php: Ignore SSL certificate errors when testing
+ URL rewriting during installation (from hellekin)
+
+ * engine/lib/access.php, engine/lib/users.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ pages/friends/pickercallback.php, views/default/core/friends/collection.php,
+ views/default/core/friends/collections.php,
+ views/default/core/friends/collectiontabs.php,
+ views/default/core/friends/picker.php,
+ views/default/core/friends/tablelist.php,
+ .../default/core/friends/tablelistcountupdate.php,
+ views/default/forms/friends/edit.php, views/default/friends/collection.php,
+ views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php, views/default/friends/picker.php,
+ views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php: moving friends views into
+ core
+
+ * pages/friends/add.php, pages/friends/edit.php,
+ pages/friends/pickercallback.php,
+ views/default/forms/friends/collectionfields.php,
+ views/default/forms/friends/edit.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php: moved friend forms into forms directory
+
+
+ * engine/lib/elgglib.php, .../default/river/object/bookmarks/create.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/river/object/thewire/create.php,
+ views/default/annotation/annotate.php, views/default/core/river/controls.php,
+ views/default/forms/likes/display.php, views/default/forms/likes/edit.php,
+ views/default/forms/likes/link.php, views/default/likes/forms/display.php,
+ views/default/likes/forms/edit.php, views/default/likes/forms/link.php: moved
+ likes forms into forms directory
+
+ * mod/notifications/index.php: added friends picker js to notifications
+ plugin - is there a reason it isn't using the friends picker view?
+
+ * engine/lib/notification.php, mod/notifications/start.php,
+ .../notifications/settings/usersettings.php,
+ views/default/usersettings/notifications.php: moved default notification
+ settings into usersettings
+
+ * views/default/js/initialise_elgg.php,
+ views/default/js/initialize_elgg.php,
+ views/default/page/elements/html_begin.php,
+ views/default/scripts/initialize_elgg.php: last step in conversion to elgg.js
+
+
+ * engine/lib/views.php, mod/embed/start.php, mod/profile/start.php,
+ views/default/js/elgg.php, views/default/js/initialise_elgg.php: 1st step in
+ changing initialise_elgg.js to elgg.js
+
+ * views/default/upload/upload_form_content.php: upload form content view not
+ used anywhere
+
+ * views/default/settings/system.php: site settings were moved to admin views
+
+
+ * pages/account/forgotten_password.php, pages/account/register.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php, views/default/admin/users/add.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/forms/login.php, views/default/forms/register.php,
+ views/default/forms/user/requestnewpassword.php,
+ views/default/forms/useradd.php: moved account forms into forms directory
+
+2010-12-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/users.php, index.php,
+ mod/sitepages/start.php, views/default/account/login_box.php,
+ views/default/account/login_dropdown.php,
+ views/default/account/login_walled_garden.php,
+ views/default/core/account/login_box.php,
+ views/default/core/account/login_dropdown.php,
+ views/default/core/account/login_walled_garden.php,
+ views/default/page/elements/header.php: moved account views into core views -
+ account forms are next
+
+ * views/default/css/elements/core.php,
+ views/default/css/elements/layout.php,
+ views/default/css/elements/page_layout.php,
+ views/default/css/elements/skin.php,
+ views/default/css/elements/typography.php, views/default/css/screen.php:
+ moving more css into the skin view - including page layout information
+
+ * upgrade.php, views/default/page/shells/upgrade.php,
+ views/default/settings/upgrading.php: Refs #2733 added explanation on the
+ security of the upgrade script
+
+ * engine/lib/users.php: Fixes #2103 adding a site nav entry for members
+
+ * mod/members/index.php, mod/members/languages/en.php,
+ mod/members/manifest.xml, mod/members/start.php,
+ mod/members/views/default/members/css.php,
+ .../views/default/members/members_navigation.php,
+ mod/members/views/default/members/search.php: Refs #2723 removing old members
+ plugin
+
+ * engine/lib/upgrades/2010121401.php, engine/lib/users.php,
+ languages/en.php, pages/members/index.php, pages/members/search.php,
+ version.php, views/default/core/members/nav.php,
+ views/default/core/members/sidebar.php,
+ views/default/forms/members/name_search.php,
+ views/default/forms/members/tag_search.php: Fixes #2723 members listing pages
+ now in core
+
+2010-12-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: sanitise_filepath() removes double /s.
+
+ * engine/classes/ElggPluginPackage.php: Cleaned up constructor logic for
+ ElggPluginPackage. Better detection of invalid paths.
+
+2010-12-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: front page code does not depend on riverdashboard plugin
+ anymore
+
+ * .../views/default/river/object/blog/create.php: Refs #2226 need a catch in
+ river views until riverdashboard plugin is updated
+
+ * mod/blog/languages/en.php, .../views/default/river/object/blog/create.php:
+ Refs #2226 updated blog plugin to use new river view
+
+ * engine/classes/ElggRiverItem.php, engine/lib/annotations.php,
+ engine/lib/river.php, engine/lib/views.php, languages/en.php,
+ mod/riverdashboard/index.php, mod/riverdashboard/start.php,
+ .../views/default/river/item/list.php, pages/river.php,
+ views/default/core/river/body.php, views/default/core/river/controls.php,
+ views/default/core/river/filter.php, views/default/core/river/footer.php,
+ views/default/core/river/image.php, views/default/css/screen.php,
+ views/default/forms/comments/inline.php: Refs #2226 moving riverdashboard
+ into core - need to clean up riverdashboard plugin and move to plugins
+ repository and update plugins with new river views
+
+2010-12-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/core/dashboard/blurb.php, views/default/dashboard/blurb.php:
+ adding a place to put views for core pages
+
+ * js/lib/ui.js: added toggler function
+
+ * views/default/page/shells/admin.php,
+ views/default/page/shells/default.php: removed unnecessary title code in page
+ shells
+
+ * pages/dashboard/latest.php: removed unused dashboard directory
+
+ * engine/lib/users.php, pages/dashboard.php, pages/dashboard/index.php:
+ moved dashboard handler into base pages directory
+
+ * views/default/layout/objects/media.php: fixed typo
+
+2010-12-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/page_layout.php,
+ views/default/layout/objects/media.php: added alternate picture block to css
+ media object
+
+ * views/default/layout/shells/content.php,
+ views/default/layout/shells/one_column.php,
+ views/default/layout/shells/one_sidebar.php,
+ views/default/layout/shells/two_sidebar.php: supporting an additional class
+ on primary layouts
+
+ * views/default/layout/objects/list.php: added better list id's based on
+ type
+
+ * views/default/css/elements/page_layout.php,
+ views/default/layout/objects/module.php, views/default/output/tagcloud.php:
+ updated module markup and fixed a bug with its footer code
+
+ * engine/lib/entities.php: fixed spelling error in documentation
+
+ * engine/lib/tags.php: updated tags library to use new sql functions
+
+ * engine/lib/relationships.php: provided more flexibility in creating the
+ relationships join sql
+
+ * views/default/page/elements/topbar.php: fixed copy and paste error in the
+ topbar view
+
+2010-12-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/lib/blog.php, views/default/layout/shells/content/filter.php:
+ using all rather than everyone to be more consistent
+
+ * views/default/css/elements/core.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/reset.php, views/default/css/elements/skin.php,
+ views/default/css/screen.php: Refs #2317 starting create a css skin sub view
+
+ * engine/lib/views.php, views/default/css/elements/page_layout.php,
+ views/default/layout/objects/media.php: changed name of icon block to picture
+ block in media object to avoid conflicts with elgg sprites
+
+ * mod/search/views/default/search/css.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php, views/default/css/screen.php,
+ views/default/navigation/site_nav.php: a few more adjustments to the page
+ header
+
+ * views/default/css/elements/navigation.php,
+ views/default/navigation/site_nav.php: finished clean up the header css
+ (except for search box in search plugin
+
+ * _graphics/elgg_toolbar_logo.gif, mod/search/views/default/search/css.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php,
+ views/default/navigation/site_nav.php,
+ views/default/page/elements/header_logo.php: stage 1 of cleaning up page
+ header css
+
+ * views/default/css/elements/page_layout.php, views/default/css/screen.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/elements/topbar_logout.php: completed the topbar
+ modifications
+
+2010-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/css.php: Fixes #2724 fixed typo in
+ riverdashboard CSS
+
+ * views/default/input/userpicker.php: Fixes #2726 applied zcho's patch to
+ fix more errors from the "_" to "-" CSS conversion
+
+2010-12-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #1411: Can specify custom row callbacks with
+ 'row_callback' options in elgg_get_entities().
+
+2010-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php, .../views/default/profile/topbar_extend.php: topbar
+ friends should be in core, not profile plugin
+
+ * mod/embed/views/default/embed/js.php,
+ views/default/settings/upgrading.php: Fixes #2717 - fixing more errors
+ introduced by my over aggressive renaming script - thanks to zcho and
+ hellekin
+
+ * engine/classes/ElggSite.php: Fixes #2721 fixed typo - thanks for the
+ report!
+
+2010-12-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Refs #1411: Documentation fix.
+
+ * engine/lib/annotations.php: Refs #1411. Added ability to specify
+ annotation time_created lower and upper. Deprecated remaining
+ get/list_entities_from/by_annotation*() functions.
+
+2010-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/page_layout.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/elements/topbar_logout.php: cleaning up the topbar CSS
+
+2010-12-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/tests/api/entity_getter_functions.php:
+ Refs #1411. Added elgg_get_entities_from_annotation_calculation(). Deprecated
+ get_entities_from_annotations_count() and
+ get_entities_from_annotation_calculate_x().
+ elgg_get_entities_from_annotations() now runs through egef_metadata() for
+ backward compatibility support.
+
+2010-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layout/objects/list.php: added ability to include pagination
+ before and after a list
+
+ * engine/lib/views.php, views/default/layout/objects/list.php,
+ views/default/navigation/pagination.php: fixed pagination for annotations due
+ to changes in views
+
+2010-12-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: DRY'd up elgg_get_entities() where clause helper
+ functions. Added ability to specify guids in elgg_get_entity*() functions.
+
+2010-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/elements/core.php,
+ views/default/css/elements/navigation.php,
+ views/default/css/elements/page_layout.php, views/default/css/screen.php:
+ Refs #2317 pulled more css out into sub views
+
+ * views/default/css/screen.php, views/default/navigation/pagination.php:
+ Updated pagination to use semantic html
+
+2010-12-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added ability to check for empty string in
+ elgg_get_array_value().
+
+ * engine/lib/entities.php: Fixed a bug that wouldn't let you specify
+ multiple selects in get_entities().
+
+ * engine/lib/relationships.php: Refs #1411. Deprecated
+ get_entities_by_relationship_count() and
+ list_entities_by_relationship_count().
+
+ * engine/tests/api/entity_getter_functions.php: Removed the silly things I
+ was doing in the egef_relationship_count() test.
+
+2010-12-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/ajax/loader.php, views/default/graphics/ajax_loader.php:
+ moved ajax loader into the graphics view directory
+
+ * views/default/css/components/OOCSS_LICENSE,
+ views/default/css/components/forms.php,
+ views/default/css/components/grid.php,
+ views/default/css/components/heading.php,
+ views/default/css/components/reset.php,
+ views/default/css/components/spacing.php,
+ views/default/css/components/typography.php,
+ views/default/css/elements/OOCSS_LICENSE,
+ views/default/css/elements/forms.php, views/default/css/elements/grid.php,
+ views/default/css/elements/heading.php, views/default/css/elements/reset.php,
+ views/default/css/elements/spacing.php,
+ views/default/css/elements/typography.php, views/default/css/screen.php:
+ changed css/components to css/elements
+
+ * views/default/css/screen.php, views/default/page/elements/footer.php,
+ views/default/page/elements/header.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/shells/default.php: using the generic .elgg-inner class on
+ topbar, header, and footer
+
+2010-12-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/entity_getter_functions.php: D'oh. Re-enabled the other
+ getter unit tests.
+
+ * engine/lib/relationships.php,
+ engine/tests/api/entity_getter_functions.php: Refs #1411: Added
+ elgg_get_entity_from_relationship_count().
+
+2010-12-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/comments/latest.php: comment views have been moved
+
+ * engine/lib/views.php, mod/blog/views/default/blog/sidebar_menu.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/list.php, views/default/comments/list.php,
+ views/default/layout/elements/comments.php,
+ views/default/layout/objects/list.php: Fixes #2189 created the object/list
+ view with semantic markup
+
+ * engine/lib/elgglib.php, engine/lib/views.php, mod/blog/lib/blog.php,
+ mod/bookmarks/bookmarklet.php, mod/bookmarks/start.php,
+ mod/diagnostics/index.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/search.php, mod/file/world.php, mod/groups/all.php,
+ mod/groups/index.php, mod/groups/membership.php, mod/members/index.php,
+ mod/search/index.php, mod/sitepages/sitepages_functions.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/page/elements/body.php,
+ views/default/page/elements/content.php,
+ views/default/page/elements/content_header.php,
+ .../page/elements/content_header_member.php,
+ views/default/page/elements/footer.php,
+ views/default/page/elements/header.php,
+ views/default/page/elements/header_logo.php,
+ views/default/page/elements/html_begin.php,
+ views/default/page/elements/html_end.php,
+ views/default/page/elements/messages.php,
+ views/default/page/elements/topbar.php,
+ views/default/page/elements/topbar_logout.php,
+ views/default/page/shells/admin.php, views/default/page/shells/default.php,
+ views/default/page/shells/walled_garden.php,
+ views/default/page_elements/body.php,
+ views/default/page_elements/content.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_logo.php,
+ views/default/page_elements/html_begin.php,
+ views/default/page_elements/html_end.php,
+ views/default/page_elements/messages.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_elements/topbar_logout.php,
+ views/default/page_shells/admin.php, views/default/page_shells/default.php,
+ views/default/page_shells/walled_garden.php,
+ views/failsafe/page/shells/default.php,
+ views/failsafe/page_shells/default.php, views/foaf/page/shells/default.php,
+ views/foaf/page_elements/contentwrapper.php,
+ views/foaf/page_shells/default.php, views/ical/page/shells/default.php,
+ views/ical/pageshells/pageshell.php,
+ views/installation/page/shells/default.php,
+ views/installation/page_shells/default.php,
+ views/json/page/shells/default.php,
+ views/json/page_elements/contentwrapper.php,
+ views/json/page_shells/default.php, views/opendd/page/shells/default.php,
+ views/opendd/pageshells/pageshell.php, views/php/page/shells/default.php,
+ views/php/page_shells/default.php, views/rss/page/shells/default.php,
+ views/rss/page_elements/contentwrapper.php,
+ views/rss/page_shells/default.php, views/xml/page/shells/default.php,
+ views/xml/page_shells/default.php: reorganized the page views as discussed
+
+ * views/js/object/default.php, views/js/pageshells/pageshell.php,
+ views/js/user/default.php: removed unused viewtype js
+
+ * views/default/layout/elements/owner_block.php,
+ views/default/layout/elements/sidebar.php,
+ views/default/layout/elements/title.php,
+ views/default/layout/shells/administration.php,
+ .../layout/shells/one_column_with_sidebar.php,
+ views/default/layout/shells/one_sidebar.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/sidebar.php,
+ views/default/page_elements/title.php: moved a few elements to layout from
+ page
+
+ * views/default/content/filter.php, views/default/content/footer.php,
+ views/default/content/header.php, views/default/content/sidebar.php,
+ views/default/layout/shells/content.php,
+ views/default/layout/shells/content/filter.php,
+ views/default/layout/shells/content/footer.php,
+ views/default/layout/shells/content/header.php,
+ views/default/layout/shells/content/sidebar.php: moved content views into
+ layout/shells/content
+
+2010-12-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/item/wrapper.php: Refs #2700 fixed another stray
+ conversion in riverdashboard
+
+ * engine/lib/views.php, mod/blog/start.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ views/default/layout/objects/media.php,
+ views/default/layout/objects/module.php,
+ views/default/layout/shells/administration.php,
+ views/default/layout/shells/content.php,
+ views/default/layout/shells/default.php,
+ views/default/layout/shells/one_column.php,
+ .../layout/shells/one_column_with_sidebar.php,
+ views/default/layout/shells/one_sidebar.php,
+ views/default/layout/shells/two_sidebar.php,
+ views/default/layout/shells/widgets.php,
+ views/default/layout_elements/media.php,
+ views/default/layout_elements/module.php,
+ views/default/layouts/administration.php, views/default/layouts/default.php,
+ views/default/layouts/main_content.php, views/default/layouts/one_column.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/layouts/one_sidebar.php, views/default/layouts/two_sidebar.php,
+ views/default/layouts/widgets.php, views/default/output/tagcloud.php:
+ reorganized the layout views
+
+2010-12-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Refs #2220. Check that an autoload class is
+ registered before trying to include it.
+
+ * engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginPackage.php: Removed leading _ in private var names.
+
+
+2010-12-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser17.php,
+ engine/classes/ElggPluginManifestParser18.php,
+ engine/classes/ElggPluginPackage.php, engine/tests/api/plugins.php,
+ engine/tests/test_files/plugin_18/manifest.xml: Renamed 'elgg' manifest
+ requirment to 'elgg_version' to be more in line with the current options.
+ Removed assignments in if statements. 1.7 manifest files properly show
+ elgg_version as a requirement.
+
+2010-12-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/views.php,
+ views/default/messages/list.php, views/default/page_elements/messages.php,
+ views/default/page_shells/admin.php, views/default/page_shells/default.php,
+ views/default/page_shells/walled_garden.php: cleaned up system messages
+ display code
+
+ * views/default/friends/list.php,
+ views/default/messages/exceptions/exception.php: removing unused views
+
+ * views/default/css/screen.php, views/default/layout_elements/media.php,
+ views/default/layout_elements/module.php: added more options to module view
+
+ * engine/lib/views.php, languages/en.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/list.php, views/default/comments/forms/edit.php,
+ views/default/forms/comments/add.php,
+ views/default/layout_elements/media.php: comments use the media view now
+
+ * mod/blog/lib/blog.php, views/default/css/screen.php: Fixed minor display
+ issues with blog breadcrumbs and also the archives page
+
+2010-12-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/screen.php, views/default/navigation/breadcrumbs.php:
+ rewrote breadcrumbs
+
+ * languages/en.php: changed "my friends" to "friends"
+
+ * engine/lib/views.php, mod/blog/languages/en.php, mod/blog/lib/blog.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/forms/blog/save.php,
+ mod/blog/views/default/js/blog/save_draft.php, views/default/css/screen.php:
+ blog plugin now uses the new elgg_view_form() function
+
+ * engine/lib/views.php: Fixes #2616 Adds Evan's view form convenience
+ function
+
+ * engine/lib/views.php, mod/blog/views/default/object/blog.php,
+ views/default/annotation/generic_comment.php: added a convience function for
+ the media content pattern - is elgg_view_media() a good name?
+
+ * mod/blog/views/default/object/blog.php,
+ views/default/annotation/generic_comment.php, views/default/css/screen.php,
+ views/default/layout_elements/media.php: changed img | body media element to
+ icon | body
+
+ * engine/lib/views.php: moved the view functions around so that they are
+ grouped together by function
+
+ * engine/lib/views.php, languages/en.php, mod/blog/actions/blog/delete.php,
+ mod/blog/actions/blog/save.php, mod/blog/languages/en.php,
+ mod/blog/lib/blog.php, mod/blog/start.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php, views/default/content/filter.php,
+ views/default/content/header.php, views/default/css/components/forms.php:
+ Clean-up of the blog plugin - now using urls from 1.7.5
+
+ * mod/uservalidationbyemail/start.php: fixed bug in uservalidationbyemail
+ permissions hook handler - was giving everyone permission to everything
+
+2010-12-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, mod/blog/blog_lib.php, mod/blog/lib/blog.php,
+ mod/blog/start.php: Fixes #2519 we can now register and load php libraries -
+ blog plugin is using this
+
+ * engine/lib/views.php, mod/blog/views/default/object/blog.php,
+ views/default/annotation/generic_comment.php,
+ views/default/comments/latest.php, views/default/css/screen.php,
+ views/default/entities/list.php: object/blog view uses new media view - needs
+ some clean up
+
+ * engine/lib/views.php, mod/blog/views/default/blog/sidebar_menu.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/world.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/comments/latest.php, views/default/css/screen.php,
+ views/default/layout_elements/media.php,
+ views/default/layout_elements/module.php: welcome to the new media view - it
+ is being used in the new latest comments module
+
+ * views/default/css/screen.php, views/default/layouts/main_content.php,
+ views/default/layouts/one_sidebar.php, views/default/page_elements/body.php,
+ views/default/page_elements/content.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_shells/default.php: using classes for page level divs
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/object/blog.php, views/default/content/header.php,
+ views/default/css/screen.php: fitting blog object display into new html
+ structure
+
+ * mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ views/default/annotation/latest_comments.php, views/default/css/screen.php,
+ views/default/layout_elements/module.php, views/default/layouts/module.php,
+ views/default/output/tagcloud.php: blog sidebar html updates finished - uses
+ modules!
+
+ * mod/blog/blog_lib.php, mod/blog/start.php,
+ views/default/content/filter.php, views/default/content/footer.php,
+ views/default/content/header.php, views/default/content/sidebar.php,
+ views/default/css/screen.php, views/default/layouts/main_content.php: a
+ better main content view structure
+
+ * views/default/css/screen.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/page_elements/content.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_shells/default.php: striking balance between all classes
+ and giving ids on major layout elements for easy css-only theming
+
+ * engine/lib/views.php: check if there are any messages before grabbing them
+ in elgg_view_page()
+
+2010-12-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Fixes #2706 simplecache url generator was not
+ handling an empty last cache date
+
+ * install/ElggInstaller.php, install/css/install.css,
+ views/installation/install/forms/template.php,
+ views/installation/install/nav.php,
+ views/installation/install/pages/complete.php,
+ views/installation/page_shells/default.php: Refs #2706 updates display of
+ installer due to switch to dashes in CSS elements
+
+2010-12-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/cache_handler.php: Cache handler needs to support _ in
+ views
+
+ * mod/riverdashboard/index.php,
+ .../views/default/riverdashboard/ecml/activity.php: Refs #2700: Removed a few
+ stray hyphens.
+
+ * install/ElggInstaller.php: Refs #2706. Added configuration.php to
+ installation engine bootstrapping. Required because of use of
+ elgg_get_site_url().
+
+2010-12-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/components/grid.php: updated grid css - added sixths
+
+ * engine/lib/views.php, views/default/entities/list.php,
+ views/default/entities/list_item.php: Refs #2189 the beginning of semantic
+ markup for entity lists - needs some reorganization
+
+ * views/default/navigation/tabs.php: removed extra div in navigation/tabs
+
+2010-12-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/item/wrapper.php: Another stray hyphens
+
+ * .../views/default/river/item/list.php: hyphen snuck in to
+ elgg_view_river_item
+
+2010-12-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser.php,
+ engine/classes/ElggPluginManifestParser17.php,
+ engine/classes/ElggPluginManifestParser18.php,
+ engine/classes/ElggPluginPackage.php, engine/lib/plugins.php,
+ engine/tests/api/plugins.php, engine/tests/test_files/plugin_17/manifest.xml,
+ engine/tests/test_files/plugin_18/manifest.xml, languages/en.php: Refs #1986
+ #2170 #2225. Added semantic manifest.xml support and unit tests. Also added
+ plugin dependencies system. See
+ engine/tests/test_files/plugin_18/manifest.xml for examples. Not closing
+ tickets pending discussion.
+
+ * mod/oauth_lib/manifest.xml, mod/sitepages/manifest.xml: Removed more
+ incompatible 1.8 attributes in 1.7-style manifests.
+
+ * mod/ecml/manifest.xml: Removing unsupported 1.7-style manifest elements.
+
+2010-12-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php, mod/blog/start.php, views/default/css/screen.php,
+ views/default/layouts/module.php,
+ views/default/page_elements/main_header.php,
+ views/default/page_elements/main_module.php,
+ views/default/page_elements/main_nav.php: preview of what the main content
+ area looks like with a module approach
+
+ * views/default/css/screen.php, views/default/navigation/breadcrumbs.php:
+ updated breadcrumbs with elgg- namespace
+
+ * views/default/css/screen.php, views/default/layouts/one_column.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/page_elements/footer.php: adjusted the one column and two
+ column layouts
+
+ * mod/blog/views/default/object/blog.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/groups/groupprofile.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/messages/views/default/messages/messages.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php, views/default/css/screen.php,
+ views/default/js/initialise_elgg.php, views/default/likes/forms/edit.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php: Refs #2700 completed the _ to -
+ conversion for screen.css (leaves admin.css and plugin css)
+
+2010-12-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/start.php: Refs #2700. Fixed a misplaced - in
+ riverdashboard from the css _ to - conversion.
+
+2010-12-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/layouts/module.php: adding a generic module layout
+
+ * views/default/css/screen.php, views/default/page_elements/header.php:
+ cleaned up header css for new layout
+
+2010-12-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Better code and docs or previous.
+
+ * engine/lib/elgglib.php: Added 'true' as a truthy value for ini_get_bool().
+
+
+2010-12-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css/screen.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/page_elements/footer.php: more cleanup of the basic layout css
+
+ * views/default/css/screen.php, views/default/page_elements/topbar.php:
+ cleaned up the topbar css
+
+ * views/default/widgets/wrapper.php: fixed typo in widget display
+ deprecation
+
+ * views/default/page_elements/footer.php: restored the powered by badge
+ image
+
+ * js/lib/ui.js, views/default/css/components/reset.php,
+ views/default/css/screen.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/messages/errors/list.php, views/default/messages/list.php,
+ views/default/messages/messages/list.php,
+ views/default/page_elements/content.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_shells/default.php: rough implementation of Evan's page
+ layout
+
+ * engine/lib/sites.php: added a function for getting current site entity
+
+ * js/lib/ui.js, js/lib/ui.widgets.js, views/default/js/initialise_elgg.php,
+ views/default/layouts/widgets.php, views/default/widgets/add_panel.php,
+ views/default/widgets/wrapper.php: Refs #2700 fixed the widget code with the
+ new CSS element names
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php,
+ .../views/default/river/object/blog/create.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/view.php,
+ .../views/default/defaultwidgets/editor.php,
+ .../views/default/embed/web_services/content.php,
+ mod/ecml/views/default/settings/ecml/edit.php,
+ mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/object/file/embedlist.php, mod/file/friends.php,
+ mod/file/index.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/upload.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/widgets/filerepo/content.php, mod/groups/groupprofile.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../default/river/relationship/member/create.php,
+ .../views/default/invitefriends/formitems.php, mod/members/index.php,
+ mod/members/views/default/members/css.php,
+ .../views/default/members/members_navigation.php,
+ mod/members/views/default/members/search.php,
+ .../views/default/widgets/messageboard/content.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/view.php, mod/notifications/start.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../views/default/river/object/page/create.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../default/profile/editdefaultprofileitems.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/listing.php,
+ .../views/default/profile/profile_navigation.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ .../default/admin/overview/reportedcontent.php,
+ .../views/default/reportedcontent/form.php,
+ mod/riverdashboard/endpoint/get_comments.php,
+ mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ mod/riverdashboard/start.php, .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/ecml/activity.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/search_box.php,
+ .../views/default/canvas/layouts/frontpage.php,
+ mod/sitepages/views/default/sitepages/css.php,
+ mod/sitepages/views/default/sitepages/members.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ mod/thewire/views/default/thewire/css.php,
+ .../views/default/thewire/profile_status.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/account/login_dropdown.php,
+ views/default/account/login_walled_garden.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/overview.php, views/default/admin/overview/online.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/admin/users/newest.php, views/default/admin/users/online.php,
+ views/default/ajax/loader.php, views/default/annotation/annotate.php,
+ views/default/annotation/annotatelike.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/annotation/likes.php, views/default/comments/forms/edit.php,
+ views/default/css/admin.php, views/default/css/ie.php,
+ views/default/css/ie6.php, views/default/css/screen.php,
+ views/default/dashboard/blurb.php, views/default/entities/entity_listing.php,
+ views/default/export/entity.php, views/default/export/metadata.php,
+ views/default/export/relationship.php, views/default/friends/collection.php,
+ views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php, views/default/friends/picker.php,
+ views/default/input/userpicker.php, views/default/js/friendsPickerv1.php,
+ views/default/js/initialise_elgg.php,
+ views/default/layouts/administration.php,
+ views/default/layouts/one_column.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/layouts/widgets.php, views/default/likes/forms/edit.php,
+ views/default/likes/forms/link.php, views/default/messages/errors/list.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/navigation/listtype.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/site_nav.php, views/default/navigation/tabs.php,
+ .../notifications/settings/usersettings.php,
+ views/default/output/rss_view.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_logo.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_elements/topbar_logout.php,
+ views/default/page_shells/walled_garden.php,
+ views/default/river/item/wrapper.php, views/default/settings/system.php,
+ views/default/settings/upgrading.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/widgets/add_button.php, views/default/widgets/add_panel.php,
+ views/default/widgets/controls.php, views/default/widgets/settings.php,
+ views/default/widgets/wrapper.php,
+ views/installation/page_shells/default.php: Refs #2700 replaced most
+ underscores with hyphens - there may be broken display code due to extent of
+ this change
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/object/blog.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/defaultwidgets/editor.php,
+ mod/ecml/views/default/ecml/input_ext.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/link.php,
+ mod/file/views/default/object/file.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/object/groupforumtopic.php,
+ .../views/default/invitefriends/formitems.php,
+ .../views/default/messageboard/forms/add.php,
+ .../views/default/widgets/messageboard/content.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/view.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../default/admin/appearance/defaultprofile.php,
+ .../profile/commentwall/commentwall_content.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../default/profile/editdefaultprofileitems.php,
+ mod/profile/views/default/profile/editicon.php,
+ .../views/default/profile/profile_ownerblock.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/riverdashboard/css.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/twitter/views/default/twitter/css.php,
+ .../uservalidationbyemail/unvalidated_user.php,
+ views/default/account/forms/register.php,
+ views/default/account/login_walled_garden.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/css/admin.php,
+ views/default/css/components/forms.php, views/default/css/ie.php,
+ views/default/css/ie6.php, views/default/css/screen.php,
+ views/default/friends/picker.php, views/default/input/access.php,
+ views/default/input/button.php, views/default/input/checkbox.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php, views/default/input/userpicker.php,
+ views/default/js/upload_js.php, views/default/layouts/widgets.php,
+ views/default/page_elements/content_header.php,
+ views/default/page_shells/walled_garden.php,
+ views/default/usersettings/form.php, views/default/widgets/add_button.php,
+ views/installation/input/access.php, views/installation/input/button.php,
+ views/installation/input/longtext.php, views/installation/input/password.php,
+ views/installation/input/text.php: Refs #2700 changed underscores to hyphens
+ for the forms css elements
+
+ * views/default/css/admin.php, views/default/css/components/OOCSS_LICENSE,
+ views/default/css/components/forms.php,
+ views/default/css/components/grid.php,
+ views/default/css/components/heading.php,
+ views/default/css/components/reset.php,
+ views/default/css/components/spacing.php,
+ views/default/css/components/typography.php, views/default/css/screen.php:
+ Refs #2317 pulled a few sections of CSS out to try out granular CSS
+
+ * views/default/css.php, views/default/css/screen.php: moved the CSS into
+ the new css/screen view and added a check for old themes
+
+2010-12-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php, mod/blog/start.php, mod/bookmarks/start.php,
+ mod/captcha/start.php, mod/categories/start.php, mod/ecml/start.php,
+ mod/embed/start.php, mod/file/start.php, mod/groups/start.php,
+ mod/members/start.php, mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/riverdashboard/start.php,
+ mod/search/start.php, mod/sitepages/start.php, mod/tagcloud/start.php,
+ mod/thewire/start.php, mod/tinymce/start.php, mod/twitter/start.php,
+ mod/zaudio/start.php, views/default/css/elgg.php,
+ views/default/css/screen.php: screen.css is a better name for our main css
+ file
+
+2010-12-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Fixes #1457. Added optional status param for
+ get_installed_plugins()
+
+2010-12-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Fixes #2461 unsetting CONFIG variable in
+ unset_config()
+
+ * engine/lib/access.php: Fixes #2430 adds
+ get_entities_from_access_collection() into trunk
+
+ * .../views/default/widgets/filerepo/content.php,
+ mod/file/views/default/widgets/filerepo/view.php,
+ .../views/default/widgets/friends/content.php,
+ mod/friends/views/default/widgets/friends/view.php,
+ .../default/widgets/a_users_groups/content.php,
+ .../views/default/widgets/a_users_groups/view.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php,
+ .../views/default/widgets/messageboard/content.php,
+ .../views/default/widgets/messageboard/view.php,
+ mod/pages/views/default/widgets/pages/content.php,
+ mod/pages/views/default/widgets/pages/view.php,
+ .../views/default/widgets/tagcloud/content.php,
+ .../views/default/widgets/tagcloud/view.php,
+ .../views/default/widgets/thewire/content.php,
+ mod/thewire/views/default/widgets/thewire/view.php,
+ .../views/default/widgets/twitter/content.php,
+ mod/twitter/views/default/widgets/twitter/view.php,
+ views/default/widgets/wrapper.php: Fixes #2555 content.php is the new display
+ view for widgets
+
+2010-11-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Fix typo in previous.
+
+ * engine/classes/ElggPlugin.php, engine/classes/ElggPluginManifest.php,
+ engine/classes/ElggPluginManifestParser.php,
+ engine/classes/ElggPluginManifestParser17.php,
+ engine/classes/ElggPluginManifestParser18.php, engine/lib/plugins.php,
+ engine/tests/api/plugins.php: Refs #1986 #2170 #2225 Added
+ ElggPluginManifest, ElggPluginManifestParser, and its parser classes for 1.7
+ and 1.8 style manifests. Changed load_plugin_manifest() to use new parser.
+ Added initial unit tests.
+
+2010-11-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/user/passwordreset.php, actions/usersettings/save.php,
+ pages/account/register.php, pages/dashboard/latest.php,
+ pages/friends/pickercallback.php: Refs #2428 removed a few CONFIG uses in
+ core
+
+ * mod/crontrigger/start.php, mod/garbagecollector/start.php,
+ mod/invitefriends/start.php, mod/logbrowser/start.php, mod/members/start.php,
+ mod/messageboard/start.php, mod/reportedcontent/start.php,
+ mod/sitepages/start.php, mod/thewire/start.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php: Refs #2428 removed some global CONFIG
+ usage in plugins
+
+ * mod/uservalidationbyemail/start.php: fixed typo in uservalidationbyemail
+ plugin
+
+ * mod/messages/start.php, mod/messages/views/default/messages/topbar.php:
+ started cleaning up the messages plugin
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php: Refs #2428 adds
+ elgg_get_plugin_path() and elgg_get_data_path()
+
+ * mod/zaudio/manifest.xml, mod/zaudio/readme.txt, mod/zaudio/start.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/mpg.php,
+ mod/zaudio/views/default/zaudio/audioplayer.php,
+ mod/zaudio/views/default/zaudio/css.php: Updated the zaudio plugin for 1.8
+
+2010-11-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggEntity.php: Refs #2668: Deprecated
+ ElggEntity::setContainer() for setContainerGUID()
+
+2010-11-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Fixes #2694 fixed typo in join_group()
+
+ * engine/handlers/export_handler.php: fixed typo in the code that I moved
+ from /services/export
+
+ * mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php: Fixes #2508 Sending user to referrer
+ in reported content admin actions
+
+ * engine/lib/configuration.php, views/default/page_shells/admin.php,
+ views/default/page_shells/default.php,
+ views/default/page_shells/walled_garden.php: Refs #2428 added
+ elgg_get_config(), elgg_set_config(), and elgg_save_config()
+
+ * views/default/css/admin.php: removed reported content css in admin css
+ view
+
+ * mod/crontrigger/start.php, mod/garbagecollector/languages/en.php,
+ mod/garbagecollector/start.php,
+ .../default/settings/garbagecollector/edit.php,
+ mod/logrotate/languages/en.php, mod/logrotate/start.php,
+ .../views/default/settings/logrotate/edit.php, mod/tinymce/languages/en.php,
+ mod/tinymce/start.php: cleaned up some of the other smaller plugins
+
+ * mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ .../views/default/admin/overview/logbrowser.php,
+ .../views/default/logbrowser/adminlinks.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/logbrowser/table.php,
+ mod/logbrowser/views/default/object/logwrapper.php: Cleaned up the log
+ browser plugin
+
+ * mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/languages/en.php, mod/reportedcontent/start.php,
+ .../default/admin/overview/reportedcontent.php,
+ .../views/default/object/reported_content.php,
+ .../views/default/reportedcontent/admin_css.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/footer_link.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/reportedcontent/user_report.php: cleaned up the reported
+ content plugin
+
+2010-11-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/views.php,
+ views/default/friends/picker.php, views/default/page_elements/html_begin.php:
+ Fixes #2173 #2507 integrated the ie and admin stylesheets into the new
+ simplecache code
+
+ * _css/css.php, _css/js.php, engine/handlers/cache_handler.php,
+ engine/lib/views.php, engine/start.php, htaccess_dist, simplecache/view.php,
+ views/default/css/elgg.php, views/default/friends/picker.php: Fixes #2160
+ #2678 introducing a more flexible simplecache handler (this requires an
+ htaccess update)
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, views/default/css/admin.php,
+ views/default/css/ie.php, views/default/css/ie6.php,
+ views/default/css_ie.php, views/default/css_ie6.php,
+ views/default/layouts/administration.php,
+ views/default/page_elements/html_begin.php,
+ views/default/page_elements/html_begin_admin.php,
+ views/default/page_shells/admin.php: Refs #2173 #2160 #2507 added a css page
+ handler to support multiple css files
+
+ * services/export/handler.php: Refs #2681 removes services directory
+
+ * engine/handlers/export_handler.php, htaccess_dist: Fixes #2681 moves
+ export handler into handler directory - current installs need to have
+ .htaccess updated
+
+ * engine/lib/web_services.php, services/api/rest_api.php: moved rest/rpc web
+ services handler into web_services library
+
+ * engine/lib/api.php, engine/lib/web_services.php, engine/start.php,
+ install/ElggInstaller.php: moved api.php to web_services.php as it is more
+ descriptive
+
+2010-11-27 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/ajax/loader.php: Fixes #2280: ajax/loader view starts out
+ with display set to none
+
+2010-11-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: Updated contrib file.
+
+ * CONTRIBUTORS.txt, README.txt: Cleaned up some typos and formatting issues
+ in README and CONTRIB files.
+
+ * CONTRIBUTORS.txt, COPYRIGHT.txt: Fixed typos and cleaned up copyright and
+ contrib file.
+
+2010-11-24 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Fixes #2664: elgg_view_entity subtype defaults to
+ "default" rather than $type
+
+ * engine/handlers/page_handler.php, engine/handlers/pagehandler.php,
+ htaccess_dist: Fixes #2667: pagehandler.php => page_handler.php. You'll need
+ to update .htaccess to keep developing
+
+ * mod/sitepages/start.php: unnecessary declaration of global $CONFIG;
+
+ * mod/blog/blog_lib.php, mod/blog/start.php, mod/sitepages/start.php:
+ Removing superfluous calls to insert site root in urls
+
+ * engine/lib/metadata.php: Deprecated list_entities_from_metadata_multi
+
+ * languages/en.php: Added generic function deprecation translation
+
+ * mod/bookmarks/actions/add.php, mod/bookmarks/actions/edit.php,
+ mod/defaultwidgets/actions/update.php, mod/defaultwidgets/start.php,
+ mod/file/actions/upload.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/featured.php, mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/start.php,
+ mod/messages/actions/delete.php, mod/pages/actions/pages/edit.php,
+ mod/pages/actions/pages/editwelcome.php, mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/editfield.php, mod/profile/actions/iconupload.php,
+ mod/profile/actions/reorder.php, mod/profile/actions/resetdefaultprofile.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/start.php,
+ mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php:
+ Refs #2451: Removes (admin_)gatekeeper() calls from core plugin actions
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, actions/admin/site/update_advanced.php,
+ actions/admin/site/update_basic.php, actions/admin/user/ban.php,
+ actions/admin/user/delete.php, actions/admin/user/makeadmin.php,
+ actions/admin/user/removeadmin.php, actions/admin/user/resetpassword.php,
+ actions/admin/user/unban.php, actions/comments/add.php,
+ actions/email/save.php, actions/entities/delete.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/remove.php, actions/import/opendd.php, actions/likes/add.php,
+ .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php, actions/user/spotlight.php,
+ actions/useradd.php, actions/usersettings/save.php,
+ engine/lib/notification.php, engine/lib/users.php: Refs #2451: Removed
+ gatekeeper/admin_gatekeeper() calls from core actions
+
+ * engine/lib/actions.php, engine/lib/admin.php, engine/lib/elgglib.php,
+ engine/lib/export.php, engine/lib/plugins.php, engine/lib/sessions.php,
+ engine/lib/users.php, engine/lib/widgets.php, mod/blog/start.php,
+ mod/bookmarks/start.php, mod/categories/start.php,
+ mod/defaultwidgets/start.php, mod/diagnostics/start.php, mod/ecml/start.php,
+ mod/file/start.php, mod/groups/start.php, mod/invitefriends/start.php,
+ mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/sitepages/start.php,
+ mod/thewire/start.php, mod/uservalidationbyemail/start.php: Fixes #2655:
+ Converted register_action to elgg_register_action throughout core
+
+ * engine/lib/actions.php: Refs #2655: Introducing elgg_register_action() + a
+ few fixes to typos in documentation
+
+2010-11-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/cron_handler.php, engine/lib/cron.php: Fixes #2472 move
+ cron_handler.php logic into cron page handler
+
+ * mod/groups/views/default/groups/groupprofile.php: Fixes #2638 - specifying
+ the full url on the urls so we don't have this problem anymore
+
+ * mod/embed/start.php, mod/pages/start.php, mod/profile/start.php,
+ mod/sitepages/start.php, views/default/page_elements/html_begin.php: Fixes
+ #2270 - deprecates metatags view and replaces with html_head/extend
+
+ * mod/profile/actions/cropicon.php, mod/profile/actions/iconupload.php:
+ Fixes #2418 and merges [7121] into trunk
+
+ * engine/lib/widgets.php: returning an empty array when there are no widgets
+ for a context
+
+ * views/default/css.php: adjusted text color of widget titles
+
+ * views/default/input/checkbox.php, views/default/input/checkboxes.php:
+ Fixes #397 and Refs #2396 Can suppress the default value for both
+ input/checkbox and input/checkboxes
+
+2010-11-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggSite.php, engine/lib/sites.php: Fixes #2488 "return"
+ was missing in ElggSite::getObjects() (also updated some documentation)
+
+ * engine/classes/ElggSite.php, engine/lib/sites.php: updated the deprecated
+ list_site_members() to use new ElggSite::listMembers() method and updated
+ ElggSite::getMembers() to accept all the arguments from elgg_get_entities()
+
+ * engine/lib/sites.php: deprecated some sites functions that were never
+ supported or fully implemented
+
+ * engine/lib/database.php, engine/lib/plugins.php: Refs #2673 moved changes
+ into trunk from 1.7 branch
+
+2010-11-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Refs #2660: Merged r7409's
+ remove_group_tool_option() to trunk.
+
+ * mod/bookmarks/actions/add.php,
+ mod/bookmarks/views/default/object/bookmarks.php: Merged bookmarks XSS fixes
+ in r7406 to trunk.
+
+2010-11-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: widgets should not have content outside their
+ container
+
+ * engine/classes/ElggWidget.php, engine/lib/widgets.php: widget column ids
+ must be integers
+
+2010-11-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/user/password.php, languages/en.php,
+ views/default/user/settings/password.php: Refs #2669: Merged password change
+ fixes in 7404 to trunk.
+
+ * mod/members/views/default/members/search.php: Refs #2612: Merged r7402 to
+ trunk.
+
+ * mod/profile/views/default/profile/listing.php,
+ .../default/profile/profile_contents/details.php: Refs #2670: Merged XFN
+ fixes from 1.7 to 1.8. Removed unused code in profile_contents/details.php
+
+2010-11-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/index.php: removed call to deprecated page_owner()
+
+ * engine/lib/tags.php, mod/blog/views/default/blog/sidebar_menu.php,
+ mod/file/start.php, mod/tagcloud/tagcloud.php,
+ .../views/default/widgets/tagcloud/view.php: removed deprecated tag library
+ calls
+
+ * engine/classes/ElggSite.php, engine/lib/sites.php, engine/lib/views.php,
+ mod/thewire/index.php: deprecated two site functions and removed a use of
+ previously deprecated function in the wire plugin
+
+ * engine/lib/widgets.php: fix for previous
+
+ * engine/lib/widgets.php: use more Elgg standrad function names -
+ elgg_register_widget_type()
+
+2010-11-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ui.widgets.js: added hack for opera/jquery-ui bug
+
+ * js/lib/ui.widgets.js, languages/en.php, views/default/css.php,
+ views/default/widgets/controls.php, views/default/widgets/wrapper.php: added
+ collapsible state to widgets
+
+ * engine/classes/ElggData.php: Refs #2629 Brett is correct - don't need the
+ call to initializeAttributes() because all the first level subclasses call
+ initializeAttributes()
+
+ * engine/classes/ElggData.php, engine/classes/ElggFile.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggWidget.php: Refs #2629 This
+ should fix this ticket. Need to remove initialise_attributes from any class
+ updated with new method and add call to initializeAttributes in ElggData for
+ those that are not updated.
+
+ * engine/classes/ElggWidget.php, languages/en.php, views/default/css.php,
+ views/default/dashboard/blurb.php, views/default/widgets/controls.php,
+ views/default/widgets/wrapper.php: added some light styling to the widget
+ control buttons
+
+2010-11-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggGroup.php, engine/classes/ElggObject.php,
+ engine/classes/ElggSite.php, engine/classes/ElggUser.php: Fixes #2629: Pulled
+ old initialise_attributes() into ElggData and added a default param to emit a
+ deprecation notice if called.
+
+2010-11-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/widgets/settings.php: Fixes #1342 dashboard widgets do not
+ have access controls
+
+ * js/lib/ui.widgets.js, mod/friends/start.php,
+ views/default/widgets/add_panel.php, views/default/widgets/wrapper.php: Fixes
+ #472 handling interactive adding/deleting of widgets with single/multiple
+ instance constraints
+
+ * js/lib/ui.widgets.js, languages/en.php, mod/friends/start.php,
+ views/default/css.php, views/default/layouts/widgets.php,
+ views/default/widgets/add_panel.php: Refs #472 not allowing widgets to be
+ added if only single instance allowed
+
+ * actions/widgets/add.php, actions/widgets/save.php,
+ engine/classes/ElggWidget.php, engine/lib/widgets.php: moved save widget
+ settings function to ElggWidget
+
+ * engine/lib/widgets.php, views/default/layouts/widgets.php: added a plugin
+ hook for determining who can edit a widget layout
+
+ * actions/widgets/add.php, engine/classes/ElggWidget.php,
+ js/lib/ui.widgets.js: fixed bug where widgets were not saving their new
+ position
+
+ * engine/classes/ElggWidget.php: do not need special canEdit method for
+ ElggWidget
+
+ * engine/classes/ElggEntity.php, engine/tests/objects/objects.php: Refs
+ #2668 adds getContainerGUID()
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggUser.php,
+ engine/classes/Loggable.php, engine/lib/entities.php,
+ engine/lib/extender.php, engine/tests/objects/entities.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/actions/leave.php,
+ mod/thewire/actions/delete.php: Fixes #2668 adding getOwnerGUID()
+
+2010-11-20 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/helpers.php: Fixed typos in text expectations that were
+ cause elgg_normalize_url unit tests to fial
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggObject.php, engine/classes/ElggSite.php,
+ engine/classes/ElggUser.php, engine/tests/objects/entities.php,
+ engine/tests/objects/objects.php, engine/tests/objects/sites.php,
+ engine/tests/objects/users.php: Fixes #2490: attributes initialize to NULL
+ instead of empty string or 0. Updated tests to reflect this
+
+ * engine/classes/ElggPlugin.php: Marking initialise_attributes as deprecated
+ in ElggPlugin
+
+ * engine/classes/ElggGroup.php: Marking initialise_attributes as deprecated
+
+ * engine/handlers/pagehandler.php, engine/lib/actions.php,
+ engine/lib/elgglib.php, engine/lib/group.php, engine/lib/sessions.php: Fixes
+ #2237: Added 'reason' parameter to forward() to allow proper headers and more
+ flexible destinations via plugin hooks. Also made use of this in core
+ gatekeeper functions and in pagehandler.php
+
+ * views/default/input/checkbox.php, views/default/input/checkboxes.php:
+ Fixes #2396: Added a new input/checkbox view. input/checkboxes harnesses it
+
+ * engine/lib/views.php: Fixes #2615: Viewtype now included in views plugin
+ hooks
+
+ * mod/htmlawed/start.php: Fixes #2497: htmLawed now uses a plugin hook for
+ allowed_styles and htmlawed_config
+
+ * engine/lib/elgglib.php, engine/lib/users.php: Fixes #2468: Deprecated
+ call_gatekeeper() and callpath_gatekeeper()
+
+ * views/default/output/calendar.php, views/default/output/confirmlink.php,
+ views/default/output/email.php, views/default/output/friendlytime.php,
+ views/default/output/pulldown.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php: Fixes #2036: using htmlspecialchars in output
+ views
+
+ * js/lib/security.js: Fixes #2620: Security token refresh action is now
+ security/refreshtoken
+
+ * mod/messageboard/actions/add.php: Fixes #2357: messageboard post action
+ redirects to referrer
+
+ * engine/classes/ElggEntity.php, engine/lib/entities.php,
+ engine/tests/objects/entities.php: Fixes #2473: removes
+ initialise_entity_cache()
+
+ * mod/blog/views/default/blog/forms/edit.php, mod/diagnostics/index.php,
+ .../views/default/embed/web_services/content.php,
+ .../views/default/admin/users/unvalidated.php,
+ views/default/admin/plugins/advanced.php, views/default/input/button.php,
+ views/default/input/reset.php, views/default/input/submit.php,
+ views/installation/input/reset.php, views/installation/input/submit.php: Refs
+ #2143: DRY up button input views (button, reset, submit). Changed core uses
+ of button to reflect the fact that it no longer defaults to submit
+
+ * js/lib/security.js: Utilizing elgg.extend, rather than jQuery.extend
+
+ * js/lib/languages.js: Commented elgg.add_translation Utilizing elgg.extend
+ instead of $.extend
+
+ * js/lib/elgglib.js: Added an elgg.extend method for merging two or more
+ objects
+
+ * views/default/input/submit.php: Refs #2143: Cleaned up input/submit
+
+ * views/default/input/tags.php: Refs #2143: DRY up input/tags
+
+ * views/default/input/email.php: Refs #2143: DRY up input/email
+
+ * views/default/input/text.php: Refs #2143: DRY up input/text
+
+ * views/default/input/form.php: Refs #2143: DRYed up input/form
+
+ * engine/lib/output.php: Doesn't make any sense for elgg_format_attributes
+ to default to an empty array...
+
+ * engine/lib/output.php, views/default/input/url.php,
+ views/default/output/url.php: Refs #2143: Added elgg_format_attributes() for
+ generating an attribute string from an associative array. DRYed up
+ input/output url
+
+2010-11-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/add.php, engine/lib/widgets.php, js/lib/ui.widgets.js,
+ views/default/css.php, views/default/layouts/widgets.php,
+ views/default/widgets/add.php, views/default/widgets/add_panel.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/settings.php,
+ views/default/widgets/wrapper.php: improving interactions of widgets -
+ containment wasn't working due to height issues
+
+ * engine/lib/widgets.php, views/default/widgets/add.php,
+ views/default/widgets/wrapper.php: finished updated the widgets library
+
+ * actions/widgets/save.php, js/lib/ui.widgets.js,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php:
+ updating widget contents when settings are changed
+
+ * actions/widgets/save.php, engine/lib/widgets.php, js/lib/ui.widgets.js,
+ views/default/css.php, views/default/widgets/controls.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php:
+ saving widget settings
+
+ * actions/widgets/delete.php, engine/classes/ElggWidget.php,
+ engine/lib/widgets.php, js/lib/ui.widgets.js, languages/en.php,
+ views/default/css.php, views/default/widgets/controls.php,
+ views/default/widgets/wrapper.php: users can delete widgets from layout
+
+ * actions/widgets/add.php, actions/widgets/move.php,
+ engine/classes/ElggWidget.php, engine/lib/widgets.php: moved some widget
+ functionality into ElggWidget class
+
+ * mod/file/views/default/widgets/filerepo/edit.php,
+ mod/file/views/default/widgets/filerepo/view.php: updated file widget to use
+ 1.7 elgg_get_entities* APIs
+
+ * .../views/default/widgets/bookmarks/edit.php,
+ .../views/default/widgets/bookmarks/view.php: updated bookmarks widget to use
+ 1.7 APIs
+
+ * actions/register.php: Closes #2653 users are logged in on registration and
+ login exceptions are caught for unvalidated users
+
+ * engine/lib/users.php, mod/uservalidationbyemail/actions/delete.php,
+ .../actions/resend_validation.php,
+ mod/uservalidationbyemail/actions/validate.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php: Closes #617 core has get and set
+ functions for user validation status
+
+ * actions/widgets/add.php, actions/widgets/move.php, engine/lib/widgets.php,
+ js/lib/ui.widgets.js, languages/en.php, views/default/layouts/widgets.php,
+ views/default/widgets/wrapper.php: saving widget position after moving
+
+ * engine/lib/version.php: $CONFIG->path is not set up early enough for some
+ elgg deprecate notices
+
+ * engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/pagehandler.php, engine/handlers/service_handler.php,
+ engine/handlers/xml-rpc_handler.php: switching to using full paths in
+ handlers
+
+2010-11-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/add.php, engine/lib/widgets.php, js/lib/ui.widgets.js:
+ Added functions to support moving and adding widgets
+
+ * engine/lib/widgets.php, views/default/css.php,
+ views/default/layouts/widgets.php, views/default/widgets/wrapper.php: Refs
+ #1793 getting sorted widgets from elgg_get_widgets()
+
+ * actions/widgets/add.php, engine/lib/widgets.php, js/lib/ui.widgets.js,
+ languages/en.php, views/default/css.php, views/default/layouts/widgets.php,
+ views/default/widgets/add.php, views/default/widgets/add_button.php: Refs
+ #1793 added ability to add widgets to layout through ajax
+
+ * engine/lib/location.php: Refs #1411, #2165 added
+ elgg_list_entities_from_location() and deprecated in_area functions
+
+ * engine/lib/location.php, engine/tests/api/entity_getter_functions.php:
+ Refs #2165 adds elgg_get_entities_from_location()
+
+ * engine/lib/private_settings.php,
+ engine/tests/api/entity_getter_functions.php: Refs #2165 added
+ elgg_get_entities_from_private_settings()
+
+2010-11-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/url.php: Refs #2143 I need ids for urls for the
+ widget code right now
+
+ * engine/lib/widgets.php, js/lib/ui.widgets.js, languages/en.php,
+ views/default/css.php, views/default/layouts/widgets.php,
+ views/default/widgets/add.php, views/default/widgets/add_button.php: Refs
+ #1793 - added a basic add new widgets view - it is not wired up yet
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/removeadmin.php, actions/admin/user/resetpassword.php,
+ actions/admin/user/unban.php, languages/en.php: Closes #1422 admin user
+ actions now check for self before banning, deleting, or removing admin
+ privileges
+
+ * pages/friends/index.php, pages/friends/of.php: Refs #1411 using new
+ elgg_list* functions in friends page handlers
+
+ * pages/friends/index.php, pages/friends/of.php: Refs #2662 removed html
+ from friends page handlers
+
+ * js/lib/ui.widgets.js, views/default/css.php,
+ views/default/layouts/widgets.php, views/default/widgets/wrapper.php: Refs
+ #821 #1793 early widget layout - does not include edit settings, delete,
+ collapsing, reloading, or adding widgets
+
+2010-11-16 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/lib/functions.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../uservalidationbyemail/unvalidated_user.php: Refs #2573 updates the
+ uservalidationbyemail plugin to work with new validation metadata approach
+
+ * engine/lib/upgrades/2010111501.php, version.php: Fixes #2573 upgrade
+ script for new user validation approach
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/views.php,
+ install/ElggInstaller.php: Fixes #2642 changed elgg_view_page() to always
+ pick up page_shell views for the page_shells directory
+
+ * .gitignore, engine/lib/actions.php, engine/settings.example.php,
+ install/ElggInstaller.php: Pulled in hellekin's fixes from
+ https://github.com/Elgg/Elgg/pull/2
+
+ * engine/lib/views.php: made page_draw() backward compatible with 1.7
+
+ * engine/lib/install.php: just in case any plugin called the previous
+ install functions, I put them back as stubs
+
+2010-11-15 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Refs #617 put user validation functions back in
+ users lib
+
+ * mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php: Refs #2573 fixes validation issue for
+ users registered with validation turned off. Still need to write an upgrade
+ script since validation status wasn't set on unvalidated users before this
+
+ * engine/classes/ElggPAM.php, engine/lib/pam.php,
+ mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/start.php: Fixes #1417 Users get notified when
+ their accounts are not validated for any authentication attempt
+
+ * actions/register.php: #Refs 2653 removed login() call since it was
+ conflicting with user validation plugin
+
+2010-11-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, engine/classes/ElggPAM.php,
+ engine/classes/LoginException.php, engine/lib/api.php, engine/lib/pam.php,
+ engine/lib/sessions.php, engine/tests/services/api.php, languages/en.php:
+ Refs #1417 Elgg core now passes back useful messages to user when log in
+ fails - uservalidationbyemail is next
+
+ * index.php: fixed bug where the front page wasn't being populated with the
+ views
+
+ * engine/classes/ElggAccess.php: fixed typo in comment
+
+2010-11-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/entities/entity_listing.php: Refs
+ #2391: Baby steps toward getting a unified css -- haven't landed on a name
+ yet, but listing/icon/info seems to make the most sense. Do we need to be
+ worried about naming collisions, since those names are so simple?
+
+ * js/classes/ElggPriorityList.js, js/lib/elgglib.js, js/lib/events.js,
+ js/lib/languages.js, js/lib/prototypes.js, js/tests/ElggEventsTest.js,
+ js/tests/ElggLibTest.js, js/tests/jsTestDriver.conf, vendors/sprintf.js,
+ views/default/js/initialise_elgg.php: Refs #2538: Added vsprintf support to
+ elgg.echo. Added unit tests for normalize_url, added prototype definitions
+ for Array#forEach for compatibility with IE.
+
+ * js/classes/ElggPriorityList.js, js/lib/events.js: Refs #2538: Refactored
+ and cleaned up ElggPriorityList and events
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/calendar.php, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/location.php, engine/lib/metadata.php,
+ engine/lib/relationships.php, engine/lib/users.php, engine/lib/views.php,
+ mod/ecml/ecml_functions.php, mod/file/search.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/object/file.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/search/views/default/search/entity_list.php,
+ views/default/entities/entity_list.php,
+ views/default/navigation/listtype.php, views/default/navigation/viewtype.php,
+ views/default/object/default.php, views/default/user/default.php: Fixes
+ #2334: Converted viewtype => listtype and viewtypetoggle => listtypetoggle.
+ Did my best to maintain backwards compatibility but might have missed
+ something...
+
+ * engine/tests/api/helpers.php: Added some more unit tests for
+ elgg_normalize_url
+
+ * engine/classes/ElggEntity.php: No comment...
+
+ * engine/classes/ElggEntity.php: Wow, what a blunder -- what to go deleting
+ random methods, Winslow
+
+ * views/default/input/button.php: Refs #1208: Default input/button to
+ 'button' type (rather than 'submit' type).
+
+ * engine/classes/ElggEntity.php: Refs #2486: Added support for the
+ 'recursive' parameter to ElggEntity::delete()
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggData.php,
+ engine/classes/ElggEntity.php: Added comments to several undocumented methods
+
+ * mod/pages/actions/pages/editwelcome.php: Fixes #2572: Removed last
+ @license tag from pages plugin
+
+2010-11-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Fixes #2561 fixed typo - thanks for the report
+
+2010-11-13 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/objects/entities.php: Cleaning up database after new
+ ElggEntity unit test.
+
+2010-11-12 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/tests/objects/entities.php: Updating
+ ElggEntity::clearMetaData() to fail when passed a non-existent metadata name.
+ Fixes #2273
+
+2010-11-11 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Obliterated C&P in elgg_trigger_plugin_hook
+
+ * engine/lib/elgglib.php: Making CodeSniffer happy + reduced C&P in
+ elgg_trigger_event
+
+2010-11-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Refs #2641 merged [7295] into trunk
+
+ * mod/groups/views/default/groups/groupprofile.php: Fixes #2638 fixes group
+ action url problem
+
+ * mod/groups/all.php: Refs #2640 fixes a layout issue due to change in
+ elgg_view_layout()
+
+ * views/default/canvas/default.php,
+ views/default/canvas/layouts/administration.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/one_column_with_sidebar.php,
+ views/default/canvas/layouts/widgets.php: Closes #2637 good-bye canvas
+
+ * engine/lib/views.php, views/default/layouts/administration.php,
+ views/default/layouts/default.php, views/default/layouts/one_column.php,
+ views/default/layouts/one_column_with_sidebar.php,
+ views/default/layouts/widgets.php: Refs #2637 moved canvas/layouts to layouts
+
+
+ * engine/lib/admin.php, engine/lib/tags.php, engine/lib/users.php,
+ engine/lib/views.php, engine/tests/ui/submenu.php, index.php,
+ mod/blog/start.php, mod/bookmarks/bookmarklet.php, mod/bookmarks/start.php,
+ mod/diagnostics/index.php, mod/ecml/start.php, mod/file/edit.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/search.php,
+ mod/file/upload.php, mod/file/world.php, mod/groups/activity.php,
+ mod/groups/addtopic.php, mod/groups/all.php, mod/groups/edit.php,
+ mod/groups/edittopic.php, mod/groups/forum.php, mod/groups/groupprofile.php,
+ mod/groups/index.php, mod/groups/invitations.php, mod/groups/invite.php,
+ mod/groups/membership.php, mod/groups/membershipreq.php, mod/groups/new.php,
+ mod/groups/topicposts.php, mod/invitefriends/index.php,
+ mod/members/index.php, mod/messages/index.php, mod/messages/read.php,
+ mod/messages/send.php, mod/messages/sent.php, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/pages/edit.php, mod/pages/history.php,
+ mod/pages/index.php, mod/pages/new.php, mod/pages/view.php,
+ mod/pages/welcome.php, mod/pages/world.php, mod/profile/edit.php,
+ mod/profile/editicon.php, mod/profile/index.php, mod/profile/start.php,
+ mod/reportedcontent/add.php, mod/riverdashboard/index.php,
+ mod/search/index.php, mod/search/views/default/search/layout.php,
+ mod/sitepages/index.php, mod/sitepages/sitepages_functions.php,
+ mod/tagcloud/tagcloud.php, mod/thewire/add.php, mod/thewire/everyone.php,
+ mod/thewire/index.php, pages/account/forgotten_password.php,
+ pages/account/register.php, pages/dashboard/index.php,
+ pages/dashboard/latest.php, pages/entities/index.php, pages/friends/add.php,
+ pages/friends/collections.php, pages/friends/edit.php,
+ pages/friends/index.php, pages/friends/of.php, pages/settings/plugins.php,
+ pages/settings/statistics.php, pages/settings/user.php,
+ services/export/handler.php, views/default/canvas/default.php,
+ views/default/canvas/layouts/administration.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/one_column_with_sidebar.php,
+ views/default/js/initialise_elgg.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/page_elements/sidebar.php: Fixes #2640 - elgg_view_layout now
+ uses a parameter array like all the other elgg_view* functions
+
+2010-11-11 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixes #2367: Corrected plugin hook documentation
+ to maintain that the default priority is 500
+
+2010-11-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixes #2306: deprecated get/count/list_user_objects
+ as well as get_user_objects_by_metadata
+
+ * engine/lib/elgglib.php: Using max() to give priority a minimum value of 0
+ for plugin hooks
+
+ * actions/login.php, actions/plugins/settings/save.php,
+ actions/register.php, actions/usersettings/save.php,
+ documentation/examples/events/advanced.php,
+ documentation/examples/events/all.php,
+ documentation/examples/events/basic.php,
+ documentation/examples/events/emit.php,
+ documentation/examples/hooks/basic.php,
+ documentation/examples/hooks/register/advanced.php,
+ documentation/examples/hooks/register/all.php,
+ documentation/examples/hooks/register/basic.php,
+ documentation/examples/hooks/register/emit.php,
+ documentation/examples/hooks/trigger/advanced.php,
+ documentation/examples/hooks/trigger/basic.php,
+ documentation/stubs/config.php, engine/classes/ElggSession.php,
+ engine/classes/ElggSite.php, engine/handlers/cron_handler.php,
+ engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/api.php, engine/lib/configuration.php,
+ engine/lib/cron.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/filestore.php, engine/lib/group.php, engine/lib/input.php,
+ engine/lib/location.php, engine/lib/metadata.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/output.php,
+ engine/lib/pageowner.php, engine/lib/plugins.php,
+ engine/lib/relationships.php, engine/lib/sessions.php, engine/lib/sites.php,
+ engine/lib/statistics.php, engine/lib/system_log.php, engine/lib/users.php,
+ engine/lib/usersettings.php, engine/lib/version.php, engine/lib/views.php,
+ engine/lib/widgets.php, engine/start.php, engine/tests/suite.php,
+ engine/tests/test_skeleton.php, index.php, install/ElggInstaller.php,
+ mod/blog/start.php, mod/bookmarks/start.php, mod/captcha/start.php,
+ mod/categories/start.php, mod/crontrigger/start.php,
+ mod/defaultwidgets/start.php, mod/diagnostics/actions/download.php,
+ mod/diagnostics/start.php, mod/ecml/ecml_functions.php, mod/ecml/start.php,
+ mod/embed/start.php, mod/embed/views/default/embed/embed.php,
+ mod/file/start.php, mod/friends/start.php, mod/garbagecollector/start.php,
+ mod/groups/start.php, mod/htmlawed/start.php, mod/invitefriends/start.php,
+ mod/logbrowser/start.php, mod/logrotate/start.php, mod/members/index.php,
+ mod/members/start.php, mod/messageboard/start.php, mod/messages/start.php,
+ mod/notifications/start.php, mod/pages/start.php,
+ mod/profile/actions/edit.php, mod/profile/actions/iconupload.php,
+ mod/profile/start.php, mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/start.php,
+ mod/riverdashboard/start.php, mod/search/index.php, mod/search/start.php,
+ mod/sitepages/start.php, mod/tagcloud/start.php, mod/thewire/start.php,
+ mod/tinymce/start.php, mod/twitter/start.php,
+ mod/uservalidationbyemail/start.php, mod/zaudio/start.php,
+ services/api/rest_api.php, services/export/handler.php,
+ views/default/page_elements/owner_block.php: Fixes #2367: With fear and
+ trepidation, converting events/plugin hooks to use elgg_ prefixed versions
+
+ * engine/lib/views.php: Refs #2124: Removed js, page_owner, and
+ page_owner_user variables from $vars
+
+ * engine/lib/views.php: Refs #2124: Removed session variables from $vars
+
+2010-11-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/register.php: Refs #866 - registration uses
+ https if configured for login
+
+2010-11-10 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/login_box.php: No sense in calling
+ elgg_get_site_url() twice here...
+
+ * views/default/account/login_box.php: Prevent "https login" from breaking
+ login on sites that are https by default
+
+2010-11-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php: Refs #2609 - added fix to trunk
+
+ * views/default/annotation/default.php: Refs #2626 - adds default annotation
+ view to trunk
+
+ * engine/lib/metadata.php: Refs #2632 - cleaned up documentation on metadata
+
+
+ * engine/lib/elgglib.php, engine/lib/users.php, index.php,
+ mod/sitepages/start.php, views/default/account/forms/login.php,
+ views/default/account/forms/login_dropdown.php,
+ .../default/account/forms/login_walled_garden.php,
+ views/default/account/login_box.php,
+ views/default/account/login_dropdown.php,
+ views/default/account/login_walled_garden.php, views/default/css.php,
+ views/default/css_ie.php, views/default/page_elements/header.php: Refs #2506
+ reorged the login box views - css still needs to be cleaned up
+
+ * mod/diagnostics/index.php, mod/members/index.php, mod/search/index.php,
+ mod/sitepages/sitepages_functions.php,
+ views/default/canvas/layouts/administration.php,
+ .../canvas/layouts/one_column_with_sidebar.php,
+ views/default/page_elements/content.php,
+ views/default/page_elements/elgg_content.php,
+ views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/elgg_header.php,
+ views/default/page_elements/elgg_header_logo.php,
+ views/default/page_elements/elgg_sidebar.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/elgg_topbar_logout.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_logo.php,
+ views/default/page_elements/sidebar.php,
+ views/default/page_elements/topbar.php,
+ views/default/page_elements/topbar_logout.php,
+ views/default/page_shells/admin.php, views/default/page_shells/default.php:
+ Fixes #2631 removes 'elgg_' namespace from the page element views - anyone
+ working with the trunk will need to update their theme and/or flush their
+ cache
+
+2010-11-09 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/tests/ElggLibTest.js: Renamed test method appropriately. jslinted
+ ElggLibTest.
+
+ * js/tests/ElggEventsTest.js: Using nullFunction + abstractMethod reference
+ instead of new closures in EventsTest
+
+ * js/tests/ElggAjaxOptionsTest.js: Using nullFunction reference instead of
+ new closure in ajaxOptionsTest
+
+ * js/lib/ui.widgets.js: jslinted ui.widgets.js
+
+ * js/lib/ui.js: jslinted ui.js
+
+ * js/lib/session.js: jsLinted session.js, employed elgg type-checker
+ functions, and did some more miscellaneous cleanup
+
+ * js/lib/elgglib.js: Added elgg.isNumber type-checking function
+
+ * js/lib/security.js: jsLinted security.js + using elgg typecheckers rather
+ than ===
+
+ * js/lib/languages.js: jslinted languages.js
+
+ * js/lib/elgglib.js: Abstract methods are no longer nameable
+
+2010-11-07 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ajax.js: Various tweaks to coding style + comments (apologies for
+ my schizo here... trying to experiment to see what works). Using
+ type-checking helpers rather than raw typeof and === checks
+
+ * js/lib/elgglib.js: Addition of type-checking helper functions, various
+ tweaks to comments, code style, etc.
+
+2010-11-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggDiskFilestore.php: replaced usages of
+ make_file_matrix() with new method makeFileMatrix()
+
+ * views/default/css.php: added text color for warnings otherwise warnings
+ that occur in topbar end up blank
+
+ * engine/lib/entities.php, engine/lib/private_settings.php,
+ engine/start.php, install/ElggInstaller.php: pulled private settings out into
+ a separate lib
+
+ * engine/lib/relationships.php: Refs #1411 fixes bug introduced in [7213]
+ that broke listing relationships
+
+2010-11-06 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * js/lib/ajax.js: jsLinted ajax.js, removed experimental functions
+
+2010-11-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php: removed hacked in link to conversations
+ plugin in riverdashboard
+
+2010-11-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * COPYRIGHT.txt, README.txt: small tweaks to the readme and copyright pages
+
+2010-11-04 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/output.php, engine/tests/api/helpers.php: Fixes #2463: Added
+ support for forwarding to root-level files, e.g. forward('install.php')
+
+2010-11-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/output.php: Refs #2463 Added trim for leading /s to avoid //s
+ when passing elgg_normalize_url('/mod/some/file.php').
+
+2010-11-04 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/output.php, engine/tests/api/helpers.php: Fixes #2463: Added ^
+ to beginning of normalize_url regex to prevent matching on urls like
+ mod/plugin/page.php. Added unit tests to verify functionality.
+
+ * engine/lib/elgglib.php: Added @deprecated docblock tag to events()
+
+ * engine/tests/objects/objects.php: Removed requirement that object
+ container be a group
+
+2010-11-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/views.php,
+ views/default/friends/picker.php, views/default/page_elements/html_begin.php:
+ Fixes #2210 - using new functions for registering the core js and css files
+
+2010-11-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php: Moved list_entities_groups
+ to groups.php and deprecated in favor of elgg_list_entities
+
+2010-11-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/river/create.php: Fixed missing ).
+
+ * COPYRIGHT.txt: Added myself to the copyright.
+
+ * mod/blog/start.php, mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/object/blog.php,
+ .../views/default/river/object/blog/create.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ .../default/river/object/bookmarks/create.php, mod/categories/listing.php,
+ mod/categories/start.php, mod/diagnostics/actions/download.php,
+ mod/diagnostics/start.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/search.php, mod/file/start.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/river/object/file/create.php,
+ mod/garbagecollector/start.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/invite.php, mod/groups/actions/joinrequest.php,
+ mod/groups/activity.php, mod/groups/all.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../river/object/groupforumtopic/annotate.php,
+ .../river/object/groupforumtopic/create.php,
+ .../river/object/groupforumtopic/update.php,
+ .../default/river/relationship/member/create.php,
+ mod/invitefriends/actions/invite.php,
+ .../views/default/invitefriends/formitems.php, mod/members/index.php,
+ mod/messageboard/index.php, mod/messageboard/start.php,
+ .../default/river/object/messageboard/create.php, mod/messages/index.php,
+ mod/messages/read.php, mod/messages/send.php, mod/messages/sent.php,
+ mod/messages/start.php, mod/pages/history.php, mod/pages/index.php,
+ mod/pages/new.php, mod/pages/start.php, mod/pages/view.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/annotate.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/page/update.php,
+ .../default/river/object/page_top/annotate.php,
+ .../views/default/river/object/page_top/create.php,
+ .../views/default/river/object/page_top/update.php, mod/pages/welcome.php,
+ mod/pages/world.php, mod/profile/actions/addcomment.php,
+ mod/profile/actions/edit.php,
+ .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/welcome.php, mod/search/index.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/startblurb.php,
+ mod/search/views/rss/search/comments/entity.php, mod/tagcloud/tagcloud.php,
+ mod/thewire/index.php, mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/rss/object/thewire.php,
+ .../views/rss/search/object/thewire/entity.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ .../uservalidationbyemail/unvalidated_user.php: Fixes #1320: Bundled mods use
+ elgg_echo()'s internal string substitution.
+
+2010-11-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Refs #2351: deprecated get_objects_in_group() in
+ favor of elgg_get_entities(). There's nothing the former can do that the
+ latter can't, so it's not worth maintaining.
+
+2010-11-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, actions/admin/user/delete.php,
+ actions/admin/user/resetpassword.php, actions/comments/add.php,
+ actions/entities/delete.php, actions/friends/add.php,
+ actions/friends/remove.php, actions/likes/add.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, engine/classes/ElggAnnotation.php,
+ engine/classes/ElggDiskFilestore.php, engine/classes/ElggExtender.php,
+ engine/classes/ElggFile.php, engine/classes/ElggFileCache.php,
+ engine/classes/ElggGroup.php, engine/classes/ElggMemcache.php,
+ engine/classes/ElggMetadata.php, engine/classes/ElggObject.php,
+ engine/classes/ElggRelationship.php, engine/classes/ElggSite.php,
+ engine/classes/ElggUser.php, engine/handlers/cron_handler.php,
+ engine/lib/actions.php, engine/lib/api.php, engine/lib/cron.php,
+ engine/lib/database.php, engine/lib/entities.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/group.php, engine/lib/notification.php,
+ engine/lib/objects.php, engine/lib/output.php, engine/lib/plugins.php,
+ engine/lib/relationships.php, engine/lib/sites.php, engine/lib/users.php,
+ engine/lib/xml-rpc.php, index.php, install/ElggInstaller.php,
+ install/ElggRewriteTester.php, languages/en.php, pages/friends/index.php,
+ pages/friends/of.php, services/export/handler.php,
+ views/default/admin/plugins/simple.php,
+ views/default/annotation/annotate.php,
+ views/default/friends/river/create.php,
+ views/default/group/search/startblurb.php, views/default/object/default.php,
+ views/default/user/search/startblurb.php: Refs #1320. Updated core to use
+ elgg_echo()'s native string replacement.
+
+ * engine/lib/languages.php: Refs #1320: elgg_echo() has built-in sprintf
+ support.
+
+ * mod/groups/views/default/groups/find.php: Refs #2582. Merged [7224] to
+ trunk.
+
+2010-11-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, mod/blog/views/default/object/blog.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/object/file/embedlist.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/widgets/filerepo/view.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../views/default/groups/invitationrequests.php,
+ mod/groups/views/default/groups/members.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/widgets/a_users_groups/view.php,
+ .../views/default/admin/overview/logbrowser.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/view.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../views/default/profile/profile_ownerblock.php,
+ .../views/default/reportedcontent/listing.php,
+ mod/riverdashboard/endpoint/get_comments.php,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/entity.php,
+ .../views/default/canvas/layouts/frontpage.php,
+ mod/sitepages/views/default/sitepages/members.php,
+ mod/sitepages/views/default/sitepages/sidebar.php,
+ mod/sitepages/views/default/sitepages/welcome.php,
+ mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ .../default/account/forms/login_walled_garden.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/annotation/likes.php,
+ views/default/canvas/layouts/administration.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/one_column_with_sidebar.php, views/default/css.php,
+ views/default/css_ie.php, views/default/entities/entity_listing.php,
+ views/default/entities/gallery_listing.php, views/default/friends/picker.php,
+ views/default/likes/forms/edit.php, views/default/navigation/pagination.php,
+ views/default/navigation/site_nav.php, views/default/output/rss_view.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_shells/walled_garden.php: Fixes #2440: Converted
+ clearfloat to clearfix, brought back orig clearfloat
+
+ * engine/lib/entities.php: Refs #2050: Added missing docblock parameters
+
+ * engine/classes/ElggEntity.php, engine/lib/entities.php: Fixes #2050: Added
+ subtype parameter to can_write_to_container functions and hooks
+
+ * engine/lib/entities.php: Set return type of get_entity to ElggEntity
+
+ * engine/classes/ElggEntity.php, engine/classes/ElggObject.php: Fixes #2134:
+ Moved getContainerEntity() method to ElggEntity
+
+ * engine/lib/group.php: Refs #1411: Deprecated
+ get_entities_from_metadata_groups(_multi) in favor of
+ elgg_get_entities_from_metadata. Added proper deprecation for
+ delete_group_entity. Unsure of version deprecated -- set to 1.6
+
+ * engine/lib/access.php: bah! forgot to rename all variables in
+ list_entities_from_access_id
+
+ * engine/lib/access.php: Fixed regression in deprecated
+ list_entities_from_access_id -- was passing access_id as 'collection_id'
+ instead of 'access_id'
+
+2010-11-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/api.php, engine/lib/navigation.php,
+ engine/lib/users.php, engine/lib/usersettings.php, engine/lib/views.php,
+ engine/lib/widgets.php, engine/tests/ui/submenu.php, index.php,
+ mod/bookmarks/start.php, .../default/river/object/bookmarks/create.php,
+ mod/categories/listing.php, .../views/default/defaultwidgets/editor.php,
+ mod/diagnostics/index.php, mod/diagnostics/start.php, mod/ecml/start.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/search.php,
+ mod/file/start.php, mod/file/views/default/object/file.php,
+ mod/file/world.php, mod/groups/all.php, mod/groups/forum.php,
+ mod/groups/groupprofile.php, mod/groups/index.php, mod/groups/membership.php,
+ mod/groups/start.php, .../views/default/object/groupforumtopic.php,
+ mod/invitefriends/index.php, mod/invitefriends/start.php,
+ mod/members/index.php, mod/messages/start.php, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/notifications/start.php,
+ mod/pages/actions/pages/edit.php, mod/pages/index.php, mod/pages/start.php,
+ mod/pages/view.php, mod/pages/world.php, mod/profile/edit.php,
+ mod/profile/editicon.php, mod/profile/start.php,
+ mod/riverdashboard/index.php, .../views/default/river/item/wrapper.php,
+ mod/sitepages/index.php, mod/sitepages/start.php,
+ mod/sitepages/views/default/sitepages/metatags.php,
+ .../views/default/widgets/tagcloud/view.php, mod/thewire/start.php,
+ mod/uservalidationbyemail/start.php, pages/dashboard/index.php,
+ pages/dashboard/latest.php, pages/entities/index.php,
+ pages/entities/list.php, views/default/admin/overview/online.php,
+ views/default/admin/users/online.php, views/default/annotation/annotate.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/site_nav.php, views/default/output/tagcloud.php,
+ views/default/page_elements/content_header.php,
+ views/default/widgets/editwrapper.php: Fixes #2128 - replaces all uses of
+ set_context() and get_context() in core and plugins
+
+2010-11-03 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: Fixes #2151: Replaced elgg_get_viewtype()
+ implementation with @cash's much simpler version
+
+ * engine/lib/annotations.php, engine/lib/relationships.php: Refs #1411:
+ Deprecated list_entities_from_relationship() in favor of
+ elgg_list_entities_from_relationship()
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/entities.php, engine/lib/metadata.php: Fixes #2606: Abstracted
+ elgg_list_entities. Takes an optional second argument for the 'getter',
+ defaulting to 'elgg_get_entities'. Converted current elgg_list_entities*
+ functions to use it
+
+ * README.txt: Added .txt for consistency
+
+2010-11-02 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/xml-rpc_handler.php, engine/lib/admin.php,
+ engine/lib/api.php, engine/lib/elgglib.php, engine/lib/tags.php,
+ engine/lib/users.php, engine/lib/xml-rpc.php, engine/tests/ui/submenu.php,
+ index.php, install/ElggInstaller.php, mod/blog/start.php,
+ mod/bookmarks/bookmarklet.php, mod/bookmarks/start.php,
+ mod/categories/listing.php, mod/diagnostics/index.php, mod/ecml/start.php,
+ mod/file/edit.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/search.php, mod/file/upload.php, mod/file/world.php,
+ mod/groups/activity.php, mod/groups/addtopic.php, mod/groups/all.php,
+ mod/groups/edit.php, mod/groups/edittopic.php, mod/groups/forum.php,
+ mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invitations.php, mod/groups/invite.php, mod/groups/membership.php,
+ mod/groups/membershipreq.php, mod/groups/new.php, mod/groups/topicposts.php,
+ mod/invitefriends/index.php, mod/members/index.php,
+ mod/messageboard/history.php, mod/messageboard/index.php,
+ mod/messages/index.php, mod/messages/read.php, mod/messages/send.php,
+ mod/messages/sent.php, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/pages/edit.php, mod/pages/history.php,
+ mod/pages/index.php, mod/pages/new.php, mod/pages/view.php,
+ mod/pages/welcome.php, mod/pages/world.php, mod/profile/edit.php,
+ mod/profile/editicon.php, mod/profile/index.php, mod/profile/start.php,
+ mod/reportedcontent/add.php, mod/riverdashboard/index.php,
+ mod/search/index.php, mod/sitepages/index.php, mod/sitepages/start.php,
+ mod/tagcloud/tagcloud.php, mod/thewire/add.php, mod/thewire/everyone.php,
+ mod/thewire/index.php, pages/account/forgotten_password.php,
+ pages/account/register.php, pages/dashboard/index.php,
+ pages/dashboard/latest.php, pages/entities/index.php,
+ pages/entities/list.php, pages/friends/add.php,
+ pages/friends/collections.php, pages/friends/edit.php,
+ pages/friends/index.php, pages/friends/of.php, pages/settings/plugins.php,
+ pages/settings/statistics.php, pages/settings/user.php,
+ services/api/rest_api.php, services/export/handler.php: Fixes #2360:
+ page_draw => elgg_view_page in core + bundled plugins
+
+ * documentation/examples/hooks/basic.php,
+ documentation/examples/hooks/register/all.php,
+ documentation/examples/hooks/register/emit.php: Fixed several typos in
+ documentation examples
+
+ * documentation/examples/hooks/register/advanced.php, engine/lib/views.php:
+ Refs #2360: Deprecated page_draw in favor of elgg_view_page. Updated
+ packaged documentation to reflect this.
+
+ * engine/lib/elgglib.php, engine/tests/api/helpers.php: Added url
+ normalization support to elgg_register_js and elgg_register_css
+
+ * documentation/examples/hooks/register/advanced.php,
+ documentation/examples/hooks/register/basic.php: Corrected a couple typos in
+ the documentation that are being registered as php errors
+
+ * .../default/messageboard/messageboard_content.php, mod/messages/start.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/view.php, mod/pages/history.php,
+ mod/pages/new.php, mod/pages/start.php, mod/pages/view.php,
+ mod/pages/welcome.php, mod/profile/start.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ .../views/default/riverdashboard/sitemessage.php, mod/sitepages/start.php,
+ mod/thewire/start.php, mod/thewire/views/default/object/thewire.php,
+ .../uservalidationbyemail/unvalidated_user.php: Fixes #2463: Removed
+ gratuitous references to $CONFIG->url, etc. from the rest of the plugins.
+
+ * mod/blog/start.php, mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php, mod/bookmarks/start.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/diagnostics/forms/download.php, mod/file/start.php,
+ mod/file/views/default/object/file.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/join.php, mod/groups/all.php, mod/groups/index.php,
+ mod/groups/membership.php, mod/groups/start.php,
+ mod/groups/views/default/forum/maintopic.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ .../views/default/object/groupforumtopic.php: Refs #2463: Removed gratuitous
+ references to $CONFIG->url, etc. in blog - groups plugins
+
+ * engine/lib/actions.php, engine/lib/entities.php, engine/lib/extender.php:
+ Refs #2463: Added URL normalization support for entity and extender url
+ handlers
+
+ * views/default/page_elements/content_header.php: Refs #2463:
+ page_elements/content_header normalizes 'new_link'
+
+ * engine/lib/entities.php: Refs #2463: Fixed typo of elgg_normalize_url
+ function
+
+ * engine/classes/ElggSite.php, engine/lib/actions.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/navigation.php,
+ engine/lib/views.php, engine/tests/ui/submenu.php, install/ElggInstaller.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/likes.php, views/default/friends/collection.php,
+ views/default/object/default.php,
+ views/default/page_elements/content_header.php,
+ views/default/page_elements/elgg_topbar_logout.php: Refs #2463: Removed some
+ more instances of $CONFIG->url. Added support for elgg_normalize_url to
+ elgg_add_action_tokens_to_url
+
+ * engine/lib/output.php, views/default/output/confirmlink.php,
+ views/default/output/url.php: Refs #2463: Added url normalization support to
+ output/url, output/confirmlink. Enhanced normalization to take care of urls
+ like "example.com"
+
+ * engine/lib/admin.php, engine/lib/users.php, mod/bookmarks/start.php,
+ mod/diagnostics/start.php, .../views/default/diagnostics/runalltests.php,
+ mod/file/views/default/file/embed_upload.php, mod/groups/start.php,
+ mod/invitefriends/start.php, .../views/default/invitefriends/form.php,
+ mod/logbrowser/views/default/logbrowser/form.php, mod/messages/start.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/notifications/groups.php, mod/notifications/start.php,
+ .../default/notifications/subscriptions/form.php, mod/pages/index.php,
+ mod/pages/start.php, mod/pages/view.php, mod/pages/world.php,
+ mod/profile/start.php, .../default/admin/appearance/defaultprofile.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/admin/users/unvalidated.php,
+ views/default/account/forms/forgotten_password.php,
+ .../default/account/forms/login_walled_garden.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugins/simple.php,
+ views/default/comments/forms/edit.php, views/default/friends/forms/edit.php,
+ views/default/object/plugin.php, views/default/usersettings/form.php,
+ views/default/widgets/editwrapper.php: Refs #2463: Removed many more
+ graituitous calls to elgg_get_site_url(), $CONFIG->url, etc.
+
+ * views/default/input/form.php: Refs #2463: input/form now normalizes the
+ action parameter
+
+ * engine/lib/output.php: Refs #2463: Removed stay { that was causing the
+ regexp to break
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/groups/start.php, mod/pages/start.php, mod/riverdashboard/start.php,
+ mod/thewire/start.php: Refs #2463: Removed some gratuitous calls to
+ elgg_get_site_url() from core plugins
+
+ * engine/lib/elgglib.php, engine/lib/navigation.php, engine/lib/output.php:
+ Refs #2463: Added elgg_normalize_url. forward() and add_menu() make use of
+ it
+
+ * actions/admin/menu_items.php, actions/admin/plugins/disable.php,
+ actions/admin/plugins/disableall.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/enableall.php, actions/admin/plugins/reorder.php,
+ actions/admin/plugins/simple_update_states.php,
+ actions/admin/site/update_advanced.php, actions/admin/site/update_basic.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ actions/admin/user/resetpassword.php, actions/admin/user/unban.php,
+ actions/comments/add.php, actions/comments/delete.php,
+ actions/email/save.php, actions/entities/delete.php, actions/friends/add.php,
+ actions/friends/remove.php, actions/import/opendd.php, actions/likes/add.php,
+ actions/likes/delete.php, actions/login.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/user/name.php, actions/useradd.php, actions/usersettings/save.php,
+ actions/widgets/add.php, actions/widgets/reorder.php,
+ actions/widgets/save.php, mod/blog/actions/blog/delete.php,
+ mod/blog/start.php, mod/bookmarks/actions/delete.php,
+ mod/categories/actions/save.php, mod/ecml/actions/save_permissions.php,
+ mod/file/actions/upload.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/edit.php, mod/groups/actions/featured.php,
+ mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/invitefriends/actions/invite.php,
+ mod/messages/actions/delete.php, mod/notifications/actions/groupsave.php,
+ mod/notifications/actions/save.php, mod/pages/actions/pages/delete.php,
+ mod/pages/actions/pages/edit.php, mod/profile/actions/addcomment.php,
+ mod/profile/actions/cropicon.php, mod/profile/actions/deletecomment.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/actions/resetdefaultprofile.php,
+ mod/sitepages/actions/edit_settings.php: Using REFERER shorthand throughout
+ core
+
+ * js/lib/elgglib.js: Refs #2538: Removed stray 'f' from elgg.system_messages
+ that was causing fatal error
+
+ * js/tests/jsTestDriver.conf, jsTestDriver.conf: Refs #2538: Moved
+ jsTestDriver.conf to js/tests/
+
+ * engine/js/classes/ElggEntity.js, engine/js/classes/ElggPriorityList.js,
+ engine/js/classes/ElggUser.js, engine/js/lib/ajax.js,
+ engine/js/lib/configuration.js, engine/js/lib/elgglib.js,
+ engine/js/lib/events.js, engine/js/lib/languages.js,
+ engine/js/lib/security.js, engine/js/lib/session.js, engine/js/lib/ui.js,
+ engine/js/lib/ui.widgets.js, engine/js/tests/ElggAjaxOptionsTest.js,
+ engine/js/tests/ElggAjaxTest.js, engine/js/tests/ElggEventsTest.js,
+ engine/js/tests/ElggLanguagesTest.js, engine/js/tests/ElggLibTest.js,
+ engine/js/tests/ElggPriorityListTest.js, engine/js/tests/ElggSecurityTest.js,
+ engine/js/tests/ElggSessionTest.js, js/classes/ElggEntity.js,
+ js/classes/ElggPriorityList.js, js/classes/ElggUser.js, js/lib/ajax.js,
+ js/lib/configuration.js, js/lib/elgglib.js, js/lib/events.js,
+ js/lib/languages.js, js/lib/security.js, js/lib/session.js, js/lib/ui.js,
+ js/lib/ui.widgets.js, js/tests/ElggAjaxOptionsTest.js,
+ js/tests/ElggAjaxTest.js, js/tests/ElggEventsTest.js,
+ js/tests/ElggLanguagesTest.js, js/tests/ElggLibTest.js,
+ js/tests/ElggPriorityListTest.js, js/tests/ElggSecurityTest.js,
+ js/tests/ElggSessionTest.js, jsTestDriver.conf,
+ views/default/js/initialise_elgg.php: Refs #2538: Moved js directory to elgg
+ root.
+
+ * engine/js/lib/ajax.js, engine/js/lib/elgglib.js,
+ engine/js/tests/ElggLibTest.js, engine/lib/entities.php: Refs #2538: Renamed
+ elgg.extendUrl to elgg.normalize_url
+
+ * engine/js/lib/elgglib.js: Refs #2538: Added type checking to some more
+ core functions
+
+ * engine/js/classes/ElggPriorityList.js, engine/js/lib/elgglib.js,
+ engine/js/lib/events.js, engine/js/lib/languages.js,
+ engine/js/lib/security.js, engine/js/lib/ui.js, engine/js/lib/ui.widgets.js,
+ engine/js/tests/ElggEventsTest.js, engine/js/tests/ElggLibTest.js,
+ engine/js/tests/ElggPriorityListTest.js,
+ views/default/js/initialise_elgg.php: Refs #2538: Added Elggy event system.
+ Javascript boot sequence mimics PHP.
+
+2010-11-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/js/lib/elgglib.js, views/default/css.php,
+ views/default/messages/errors/list.php, views/default/messages/list.php,
+ views/default/messages/messages/list.php: Fixes #2318: Adjusted system
+ message markup + styles to work with ajax actions
+
+ * engine/lib/actions.php: Refs #2538: Pulled in support for ajax actions
+
+ * actions/security/refreshtoken.php, engine/js/classes/ElggEntity.js,
+ engine/js/classes/ElggUser.js, engine/js/lib/elgglib.js,
+ engine/js/lib/languages.js, engine/js/tests/ElggLibTest.js,
+ jsTestDriver.conf, views/default/js/initialise_elgg.php,
+ views/default/js/languages.php, views/default/js/languages/en.php,
+ views/default/page_elements/html_begin.php,
+ views/default/page_elements/html_begin_admin.php,
+ views/default/scripts/initialize_elgg.php: Refs #2538: Added some models,
+ inheritance, more bootstrapping code
+
+ * engine/js/classes/ElggUser.js, engine/js/lib/elgglib.js,
+ engine/js/lib/languages.js, engine/js/lib/session.js,
+ engine/js/tests/ElggLanguagesTest.js: Refs #2538: Pulled in some i18n
+ features
+
+ * engine/js/tests/ElggAjaxOptionsTest.js, engine/js/tests/ElggLibTest.js,
+ engine/js/tests/ElggSecurityTest.js: Commented some js Test files
+
+ * jsTestDriver.conf: Switched jsTestDriver.conf to use default jsTestDriver
+ port
+
+2010-11-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggSite.php: Fixes #2603: Corrected is_public_page() to
+ isPublicPage().
+
+2010-11-01 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/js/lib/ajax.js, engine/js/lib/configuration.js,
+ engine/js/lib/elgglib.js, engine/js/lib/security.js,
+ engine/js/lib/session.js, engine/js/lib/ui.js, engine/js/lib/ui.widgets.js,
+ engine/js/tests/ElggAjaxOptionsTest.js, engine/js/tests/ElggAjaxTest.js,
+ engine/js/tests/ElggLibTest.js, engine/js/tests/ElggSecurityTest.js,
+ engine/js/tests/ElggSessionTest.js, jsTestDriver.conf: Refs #2538: Pulled in
+ elgg JS object and unit tests
+
+2010-10-31 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php: Refs #2597: Pushed getOwner and
+ getOwnerEntity into ElggEntity and ElggExtender
+
+ * engine/classes/ElggData.php, engine/classes/Loggable.php: Refs #2597:
+ Deprecated Loggable::getObjectOwnerGUID()
+
+2010-10-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Refs #2210 - added functions for managing
+ javascript and css files
+
+ * engine/tests/regression/trac_bugs.php: Fixed bug in regression test for
+ upscaling turned off
+
+ * engine/tests/objects/sites.php, engine/tests/objects/users.php: Fixes for
+ [7165] - entity variable changed
+
+ * engine/tests/objects/filestore.php: updated unit test for file matrix to
+ reflect updates in directory structure and class method names
+
+ * engine/tests/objects/entities.php, engine/tests/objects/objects.php,
+ engine/tests/objects/sites.php, engine/tests/objects/users.php: Refs #2597 -
+ fixes some unit tests broken in the reorg of the data models
+
+ * engine/tests/suite.php: Unit tests with the system log turned on are too
+ slow
+
+2010-10-31 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggData.php,
+ engine/classes/ElggEntity.php, engine/classes/ElggMetadata.php,
+ engine/classes/ElggRelationship.php: Refs #2597: Pulled __set, __get, __isset
+ magic functions definitions into ElggData
+
+ * engine/classes/ElggEntity.php: Refs #2597: Auto-initialize temp_metadata,
+ temp_annotations, and volatile as arrays
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggRelationship.php: Refs
+ #2597: Moved "implements Exportable" up to {{{ElggData}}}
+
+ * engine/classes/ElggEntity.php: Refs #2597:
+ ElggEntity::initializeAttributes calls into parent initializeAttributes()
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggData.php,
+ engine/classes/ElggEntity.php, engine/classes/ElggExtender.php,
+ engine/classes/ElggMetadata.php, engine/classes/ElggRelationship.php:
+ Improved initializeAttributes implementations
+
+ * engine/classes/ElggGroup.php, engine/classes/ElggObject.php,
+ engine/classes/ElggUser.php: Refs #2597: Entity type constructors all use
+ initializeAttributes now
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php: Refs #2597: Added getURL(),
+ getTimeCreated(), and initializeAttributes() to {{{ElggData}}}
+
+2010-10-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php: Refs #2597: pulled getOwner and
+ getOwnerEntity functions into ElggData I thought this would be OK even
+ though relationships don't technically have owners because ElggRelationship
+ implemented the getObectOwnerGUID method
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggRelationship.php: Refs
+ #2597: Pulled Loggable functions with identical implementations into ElggData
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggRelationship.php: Refs
+ #2597: Pulled identical {{{Iterator}}} and {{{ArrayAccess}}} implementations
+ into {{{ElggData}}}
+
+2010-10-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php, engine/lib/pageowner.php: Refs #2128 - added
+ stack context functions
+
+2010-10-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggData.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggRelationship.php: Refs
+ #2597: Added a new ElggData class that ElggEntity, ElggExtender, and
+ ElggRelationship all extend
+
+ * views/default/page_elements/title.php: Changed get_submenu to
+ elgg_get_submenu
+
+ * mod/bookmarks/views/default/object/bookmarks.php,
+ mod/ecml/views/default/ecml/input_ext.php,
+ .../views/default/groups/activity_latest.php,
+ mod/groups/views/default/river/forum/create.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ .../views/default/profile/menu/adminlinks.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php:
+ Refs #2598: Converted the rest of the $vars['url'] references to
+ elgg_get_site_url()
+
+ * mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/captcha/views/default/input/captcha.php,
+ mod/categories/views/default/categories/view.php,
+ .../views/default/defaultwidgets/editor.php,
+ .../views/default/diagnostics/runalltests.php,
+ mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/help/blip.tv.php,
+ mod/ecml/views/default/ecml/help/dailymotion.php,
+ mod/ecml/views/default/ecml/help/googlemaps.php,
+ mod/ecml/views/default/ecml/help/livevideo.php,
+ mod/ecml/views/default/ecml/help/redlasso.php,
+ mod/ecml/views/default/ecml/help/slideshare.php,
+ mod/ecml/views/default/ecml/help/vimeo.php,
+ mod/ecml/views/default/ecml/help/youtube.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/js.php, mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/upload/content.php,
+ mod/file/views/default/file/css.php,
+ mod/file/views/default/file/embed_upload.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/icon.php,
+ .../default/file/specialcontent/audio/mid.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/x-wav.php,
+ .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/file/upload.php,
+ mod/file/views/default/object/file.php,
+ mod/file/views/default/widgets/filerepo/view.php,
+ mod/file/views/rss/object/file.php, mod/groups/actions/delete.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../views/default/groups/invitationrequests.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/groups/views/default/groups/side_menu.php,
+ .../views/default/icon/group/default/large.php,
+ .../views/default/icon/group/default/medium.php,
+ .../views/default/icon/group/default/small.php,
+ .../views/default/icon/group/default/tiny.php,
+ .../views/default/object/groupforumtopic.php,
+ .../views/default/river/forum/topic/create.php,
+ .../views/default/invitefriends/form.php,
+ .../views/default/logbrowser/adminlinks.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ .../views/default/members/members_navigation.php,
+ mod/members/views/default/members/search.php,
+ .../views/default/messageboard/css.php,
+ .../views/default/messageboard/forms/add.php,
+ .../default/messageboard/messageboard_content.php,
+ .../views/default/widgets/messageboard/view.php,
+ mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php,
+ .../views/default/notifications/css.php,
+ .../default/notifications/subscriptions/form.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../views/default/icon/object/page/medium.php,
+ mod/pages/views/default/icon/object/page/small.php,
+ .../views/default/icon/object/page_top/medium.php,
+ .../views/default/icon/object/page_top/small.php,
+ mod/pages/views/default/pages/css.php,
+ mod/pages/views/default/pages/metatags.php,
+ mod/pages/views/default/widgets/pages/view.php,
+ mod/profile/actions/cropicon.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../default/profile/editdefaultprofileitems.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/icon.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ .../views/default/profile/profile_ownerblock.php,
+ .../views/default/profile/topbar_extend.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/footer_link.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/search_box.php,
+ .../views/default/sitepages/footer_menu.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ mod/thewire/views/default/widgets/thewire/view.php,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/twitter/views/default/twitter/css.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../uservalidationbyemail/unvalidated_user.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/mpg.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/login_dropdown.php,
+ .../default/account/forms/login_walled_garden.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/plugins/simple.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/annotation/likes.php,
+ views/default/canvas/layouts/administration.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/comments/forms/edit.php, views/default/css.php,
+ views/default/dashboard/blurb.php, views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/forms/edit.php,
+ views/default/group/search/finishblurb.php,
+ views/default/input/autocomplete.php, views/default/input/userpicker.php,
+ views/default/likes/forms/edit.php, views/default/likes/forms/link.php,
+ views/default/object/default.php, views/default/object/plugin.php,
+ views/default/output/tagcloud.php, views/default/output/tags.php,
+ views/default/page_elements/content_header.php,
+ views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/elgg_header_logo.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/elgg_topbar_logout.php,
+ views/default/page_elements/html_begin.php,
+ views/default/page_elements/html_begin_admin.php,
+ views/default/page_shells/walled_garden.php,
+ views/default/settings/system.php, views/default/settings/upgrading.php,
+ views/default/user/search/finishblurb.php,
+ views/default/usersettings/form.php, views/default/widgets/editwrapper.php,
+ views/default/widgets/wrapper.php, views/foaf/page_shells/default.php,
+ views/foaf/user/default.php, views/installation/install/header.php,
+ views/installation/install/nav.php,
+ views/installation/install/pages/complete.php,
+ views/installation/page_shells/default.php: Refs #2598: Converted most
+ $vars['url'] to elgg_get_site_url()
+
+2010-10-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: checking if the site has any groups before looping
+ over them
+
+ * mod/blog/blog_lib.php: fixed minor issue where blog code wasn't setting
+ type when getting subtype
+
+2010-10-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php, engine/lib/relationships.php,
+ install/ElggInstaller.php, mod/blog/start.php,
+ mod/blog/views/default/blog/sidebar_menu.php, mod/bookmarks/start.php,
+ mod/diagnostics/index.php, mod/diagnostics/start.php,
+ mod/file/actions/save.php, mod/file/actions/upload.php, mod/file/start.php,
+ .../default/file/icon/application/default.php,
+ .../views/default/file/icon/application/excel.php,
+ .../views/default/file/icon/application/msword.php,
+ .../views/default/file/icon/application/pdf.php,
+ .../default/file/icon/application/powerpoint.php,
+ .../default/file/icon/application/vnd.ms-excel.php,
+ .../file/icon/application/vnd.ms-powerpoint.php,
+ .../application/vnd.oasis.opendocument.text.php,
+ mod/file/views/default/file/icon/archive.php,
+ mod/file/views/default/file/icon/audio.php,
+ mod/file/views/default/file/icon/default.php,
+ mod/file/views/default/file/icon/document.php,
+ .../views/default/file/icon/text/directory.php,
+ mod/file/views/default/file/icon/video.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/activity.php,
+ mod/groups/forum.php, mod/groups/start.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/start.php,
+ mod/members/index.php, mod/messageboard/start.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/messages/start.php, mod/notifications/groups.php,
+ mod/notifications/start.php, mod/pages/index.php, mod/pages/start.php,
+ mod/pages/view.php, mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/world.php, mod/profile/actions/addcomment.php,
+ mod/profile/start.php, .../default/admin/appearance/defaultprofile.php,
+ .../views/default/reportedcontent/user_report.php,
+ mod/riverdashboard/start.php, mod/search/index.php, mod/thewire/start.php,
+ views/default/page_elements/content_header.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/installation/input/button.php: Refs #2598: Converted virtually all uses
+ of $CONFIG->wwwroot to elgg_get_site_url()
+
+2010-10-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggFile.php, engine/tests/objects/entities.php,
+ mod/blog/classes/ElggBlog.php: finished the conversion to
+ initializeAttributes()
+
+2010-10-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixes #2598: Added elgg_get_site_url()
+
+ * .../admin/appearance/default_dashboard_widgets.php,
+ .../admin/appearance/default_profile_widgets.php, mod/file/search.php,
+ mod/file/world.php, mod/groups/actions/leave.php, mod/pages/world.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ mod/profile/views/default/profile/icon.php,
+ .../views/default/profile/menu/adminlinks.php, mod/thewire/index.php,
+ mod/thewire/start.php: Replaced $_SESSION['id'] and $_SESSION['guid'] with
+ get_loggedin_userid()
+
+2010-10-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: fixed php exception and error handlers not being
+ next to each other in elgglib
+
+ * documentation/stubs/config.php, engine/lib/configuration.php,
+ engine/lib/database.php, engine/lib/install.php, engine/lib/sessions.php,
+ engine/lib/sites.php, engine/lib/version.php, engine/start.php: ripped out
+ last remaining tentacles of old installer from core - just needs removal of
+ install.php when elgg_view() is updated
+
+2010-10-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/users.php, engine/lib/views.php,
+ mod/blog/views/default/blog/sidebar_menu.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/start.php, .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ .../views/default/widgets/bookmarks/view.php,
+ .../views/default/defaultwidgets/editor.php, mod/file/edit.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/search.php,
+ mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/file/upload.php, mod/file/world.php,
+ mod/groups/activity.php, mod/groups/addtopic.php, mod/groups/all.php,
+ mod/groups/edittopic.php, mod/groups/forum.php, mod/groups/index.php,
+ mod/groups/membership.php, mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ .../views/default/groups/activity_latest.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/object/groupforumtopic.php, mod/members/index.php,
+ mod/messageboard/index.php, .../views/default/messageboard/forms/add.php,
+ .../views/default/widgets/messageboard/view.php, mod/messages/send.php,
+ mod/pages/edit.php, mod/pages/history.php, mod/pages/index.php,
+ mod/pages/new.php, mod/pages/start.php, mod/pages/view.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php, mod/profile/edit.php, mod/profile/editicon.php,
+ mod/profile/icon.php, mod/profile/start.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/metatags.php,
+ .../default/profile/profile_contents/details.php,
+ .../views/default/profile/profile_ownerblock.php,
+ mod/reportedcontent/add.php, .../views/default/widgets/tagcloud/view.php,
+ mod/thewire/index.php, mod/thewire/start.php,
+ mod/thewire/views/default/widgets/thewire/view.php, pages/friends/index.php,
+ pages/friends/of.php, pages/friends/pickercallback.php,
+ pages/settings/index.php, pages/settings/plugins.php,
+ pages/settings/statistics.php, pages/settings/user.php,
+ views/default/canvas/layouts/widgets.php,
+ .../notifications/settings/usersettings.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/title.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php,
+ views/foaf/page_shells/default.php: Refs #1439: Using new page_owner
+ functions in all of core
+
+ * engine/lib/filestore.php, mod/bookmarks/actions/add.php,
+ mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ mod/diagnostics/actions/download.php, mod/file/actions/delete.php,
+ mod/file/actions/save.php, mod/file/world.php, mod/groups/actions/delete.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/actions/leave.php,
+ mod/groups/groupprofile.php, mod/groups/membership.php, mod/groups/start.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/side_menu.php, mod/members/index.php,
+ mod/messages/actions/delete.php, mod/messages/send.php,
+ mod/messages/sent.php, mod/messages/start.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php,
+ .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/personal.php,
+ mod/pages/actions/pages/edit.php, mod/pages/edit.php, mod/pages/new.php,
+ mod/pages/start.php, mod/pages/welcome.php, mod/pages/world.php,
+ mod/profile/actions/addcomment.php, mod/profile/actions/edit.php,
+ mod/profile/start.php, mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/icon.php,
+ .../views/default/profile/profile_ownerblock.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/add.php,
+ .../views/default/reportedcontent/form.php,
+ mod/riverdashboard/actions/add.php, mod/riverdashboard/index.php,
+ .../views/default/riverdashboard/ecml/activity.php,
+ .../views/default/riverdashboard/welcome.php, mod/thewire/index.php,
+ mod/thewire/start.php, views/default/canvas/layouts/widgets.php,
+ views/foaf/page_shells/default.php: Refs #2124: Using get_loggedin_user
+ functions instead of $vars['user'], $_SESSION['user'], etc.
+
+ * mod/pages/views/default/pages/breadcrumbs.php,
+ views/foaf/user/default.php: Refs #2124: Using elgg_get_page_owner instead of
+ $vars['page_owner'] in views
+
+2010-10-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: organized functions in elgglib by purpose - more
+ or less
+
+ * engine/lib/elgglib.php, engine/lib/navigation.php, engine/start.php,
+ install/ElggInstaller.php: pulled navigation functions out of elgglib.php
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php: moved datalist code
+ into the configuration lib
+
+ * engine/lib/plugins.php: fixed spelling mistake in comment
+
+ * engine/lib/cache.php, engine/lib/elgglib.php: moved file path cache
+ functions into the cache lib which seems to be a more logical location for
+ them
+
+2010-10-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/useradd.php, engine/lib/entities.php: Fixed an invalid call to
+ get_pageowner_guid() in can_edit_entity(). Removed the call to the validation
+ function in useradd.
+
+2010-10-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt, README.txt: Language changes for contributors and
+ readme.
+
+2010-10-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: small readme tweak.
+
+2010-10-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/mb_wrapper.php: Fixes #2544. Pulled out the eval() for creating
+ elgg_*() mb wrapper functions.
+
+ * engine/lib/filestore.php: Fixes #2150: Removed old code in filestore.
+
+ * CHANGES.txt, _css/css.php, _css/js.php, actions/admin/menu_items.php,
+ actions/admin/plugins/simple_update_states.php, actions/comments/add.php,
+ actions/email/save.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/editcollection.php, actions/friends/remove.php,
+ actions/likes/add.php, actions/likes/delete.php, actions/login.php,
+ actions/register.php, actions/user/language.php, actions/user/password.php,
+ actions/user/spotlight.php, actions/useradd.php,
+ actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php,
+ engine/classes/APIException.php, engine/classes/CallException.php,
+ engine/classes/ClassException.php, engine/classes/ClassNotFoundException.php,
+ engine/classes/ConfigurationException.php, engine/classes/CronException.php,
+ engine/classes/DataFormatException.php, engine/classes/DatabaseException.php,
+ engine/classes/ElggAccess.php, engine/classes/ElggAnnotation.php,
+ engine/classes/ElggCache.php, engine/classes/ElggDiskFilestore.php,
+ engine/classes/ElggEntity.php, engine/classes/ElggExtender.php,
+ engine/classes/ElggFile.php, engine/classes/ElggFileCache.php,
+ engine/classes/ElggFilestore.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggHMACCache.php, engine/classes/ElggMemcache.php,
+ engine/classes/ElggMetadata.php, engine/classes/ElggObject.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggRelationship.php,
+ engine/classes/ElggSession.php, engine/classes/ElggSharedMemoryCache.php,
+ engine/classes/ElggSite.php, engine/classes/ElggStaticVariableCache.php,
+ engine/classes/ElggUser.php, engine/classes/ElggWidget.php,
+ engine/classes/ErrorResult.php, engine/classes/ExportException.php,
+ engine/classes/Exportable.php, engine/classes/Friendable.php,
+ engine/classes/GenericResult.php, engine/classes/IOException.php,
+ engine/classes/ImportException.php, engine/classes/Importable.php,
+ engine/classes/InstallationException.php,
+ engine/classes/InvalidClassException.php,
+ engine/classes/InvalidParameterException.php, engine/classes/Locatable.php,
+ engine/classes/Loggable.php, engine/classes/NotImplementedException.php,
+ engine/classes/Notable.php, engine/classes/NotificationException.php,
+ engine/classes/ODD.php, engine/classes/ODDDocument.php,
+ engine/classes/ODDEntity.php, engine/classes/PluginException.php,
+ engine/classes/RegistrationException.php,
+ engine/classes/SecurityException.php, engine/classes/SuccessResult.php,
+ engine/classes/XMLRPCArrayParameter.php,
+ engine/classes/XMLRPCBase64Parameter.php,
+ engine/classes/XMLRPCBoolParameter.php, engine/classes/XMLRPCCall.php,
+ engine/classes/XMLRPCDateParameter.php,
+ engine/classes/XMLRPCDoubleParameter.php,
+ engine/classes/XMLRPCErrorResponse.php,
+ engine/classes/XMLRPCIntParameter.php, engine/classes/XMLRPCParameter.php,
+ engine/classes/XMLRPCResponse.php, engine/classes/XMLRPCStringParameter.php,
+ engine/classes/XMLRPCStructParameter.php,
+ engine/classes/XMLRPCSuccessResponse.php, engine/classes/XmlElement.php,
+ engine/handlers/xml-rpc_handler.php, engine/lib/access.php,
+ engine/lib/actions.php, engine/lib/admin.php, engine/lib/annotations.php,
+ engine/lib/api.php, engine/lib/calendar.php, engine/lib/configuration.php,
+ engine/lib/cron.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/filestore.php, engine/lib/group.php, engine/lib/input.php,
+ engine/lib/install.php, engine/lib/languages.php, engine/lib/location.php,
+ engine/lib/memcache.php, engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/opendd.php,
+ engine/lib/output.php, engine/lib/pagehandler.php, engine/lib/pageowner.php,
+ engine/lib/pam.php, engine/lib/plugins.php, engine/lib/relationships.php,
+ engine/lib/river.php, engine/lib/sessions.php, engine/lib/sites.php,
+ engine/lib/statistics.php, engine/lib/system_log.php, engine/lib/tags.php,
+ engine/lib/upgrades/2008100701.php, engine/lib/upgrades/2008101303.php,
+ engine/lib/upgrades/2009022701.php, engine/lib/upgrades/2009041701.php,
+ engine/lib/upgrades/2009070101.php, engine/lib/upgrades/2009102801.php,
+ engine/lib/upgrades/2010033101.php, engine/lib/upgrades/2010060401.php,
+ engine/lib/upgrades/2010061501.php, engine/lib/upgrades/2010062301.php,
+ engine/lib/upgrades/2010071001.php, engine/lib/upgrades/2010071002.php,
+ engine/lib/users.php, engine/lib/usersettings.php, engine/lib/version.php,
+ engine/lib/views.php, engine/lib/widgets.php, engine/lib/xml-rpc.php,
+ engine/lib/xml.php, engine/settings.example.php, engine/start.php, index.php,
+ install.php, install/ElggInstaller.php, install/ElggRewriteTester.php,
+ .../views/default/profile/profile_ownerblock.php,
+ pages/account/forgotten_password.php, pages/account/register.php,
+ pages/dashboard/index.php, pages/dashboard/latest.php,
+ pages/entities/index.php, pages/friends/add.php, pages/friends/edit.php,
+ pages/friends/index.php, pages/friends/of.php,
+ pages/friends/pickercallback.php, pages/settings/plugins.php,
+ services/api/rest_api.php, services/export/handler.php, simplecache/view.php,
+ upgrade.php: Standardized code in all of core, not including language files,
+ tests, or core mods.
+
+2010-10-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt, README.txt: Updated readme to reflect the MIT license.
+ Updated contributors to be a flat list.
+
+2010-10-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * simplecache/view.php: Fixes #2590 - simplecache now works when simplecache
+ turned off
+
+2010-10-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/AccessControlQueryComponent.php,
+ engine/classes/DeleteQueryTypeQueryComponent.php,
+ engine/classes/InsertQueryTypeQueryComponent.php,
+ engine/classes/JoinQueryComponent.php,
+ engine/classes/LimitOffsetQueryComponent.php,
+ engine/classes/OrderQueryComponent.php, engine/classes/Query.php,
+ engine/classes/QueryComponent.php,
+ engine/classes/QueryTypeQueryComponent.php,
+ engine/classes/SelectFieldQueryComponent.php,
+ engine/classes/SelectQueryTypeQueryComponent.php,
+ engine/classes/SetQueryComponent.php, engine/classes/SimpleQuery.php,
+ engine/classes/TableQueryComponent.php,
+ engine/classes/UpdateQueryTypeQueryComponent.php,
+ engine/classes/WhereQueryComponent.php,
+ engine/classes/WhereSetQueryComponent.php,
+ engine/classes/WhereStaticQueryComponent.php: Closes #2511. Query object
+ classes removed.
+
+2010-10-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * COPYRIGHT.txt, actions/admin/menu_items.php, actions/comments/add.php,
+ actions/comments/delete.php, actions/entities/delete.php,
+ actions/friends/add.php, actions/friends/addcollection.php,
+ actions/friends/deletecollection.php, actions/friends/editcollection.php,
+ actions/friends/remove.php, actions/import/opendd.php, actions/likes/add.php,
+ actions/likes/delete.php, actions/logout.php,
+ .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/spotlight.php,
+ actions/useradd.php, actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php,
+ engine/classes/ElggFile.php, engine/classes/ElggFileCache.php,
+ engine/classes/ElggFilestore.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggHMACCache.php, engine/classes/ElggMemcache.php,
+ engine/classes/ElggMetadata.php, engine/classes/ElggStaticVariableCache.php,
+ engine/classes/ErrorResult.php, engine/classes/Exportable.php,
+ engine/classes/GenericResult.php, engine/classes/IOException.php,
+ engine/classes/Importable.php,
+ engine/classes/InsertQueryTypeQueryComponent.php,
+ engine/classes/InstallationException.php,
+ engine/classes/InvalidClassException.php,
+ engine/classes/InvalidParameterException.php,
+ engine/classes/JoinQueryComponent.php,
+ engine/classes/LimitOffsetQueryComponent.php, engine/classes/Loggable.php,
+ engine/classes/NotImplementedException.php,
+ engine/classes/NotificationException.php, engine/classes/ODD.php,
+ engine/classes/ODDDocument.php, engine/classes/ODDEntity.php,
+ engine/classes/OrderQueryComponent.php, engine/classes/Query.php,
+ engine/classes/QueryComponent.php,
+ engine/classes/QueryTypeQueryComponent.php,
+ engine/classes/RegistrationException.php,
+ engine/classes/SecurityException.php,
+ engine/classes/SelectFieldQueryComponent.php,
+ engine/classes/SelectQueryTypeQueryComponent.php,
+ engine/classes/SetQueryComponent.php, engine/classes/SimpleQuery.php,
+ engine/classes/SuccessResult.php, engine/classes/TableQueryComponent.php,
+ engine/classes/UpdateQueryTypeQueryComponent.php,
+ engine/classes/WhereQueryComponent.php,
+ engine/classes/WhereSetQueryComponent.php,
+ engine/classes/WhereStaticQueryComponent.php,
+ engine/classes/XMLRPCArrayParameter.php,
+ engine/classes/XMLRPCBase64Parameter.php,
+ engine/classes/XMLRPCBoolParameter.php, engine/classes/XMLRPCCall.php,
+ engine/classes/XMLRPCDateParameter.php,
+ engine/classes/XMLRPCDoubleParameter.php,
+ engine/classes/XMLRPCErrorResponse.php,
+ engine/classes/XMLRPCIntParameter.php, engine/classes/XMLRPCParameter.php,
+ engine/classes/XMLRPCResponse.php, engine/classes/XMLRPCStringParameter.php,
+ engine/classes/XMLRPCStructParameter.php,
+ engine/classes/XMLRPCSuccessResponse.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/api.php, engine/lib/cache.php,
+ engine/lib/calendar.php, engine/lib/cron.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/filestore.php, engine/lib/group.php,
+ engine/lib/input.php, engine/lib/install.php, engine/lib/languages.php,
+ engine/lib/location.php, engine/lib/memcache.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, engine/lib/notification.php,
+ engine/lib/objects.php, engine/lib/opendd.php, engine/lib/output.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/plugins.php, engine/lib/relationships.php, engine/lib/river.php,
+ engine/lib/sessions.php, engine/lib/sites.php, engine/lib/statistics.php,
+ engine/lib/system_log.php, engine/lib/tags.php, engine/lib/users.php,
+ engine/lib/usersettings.php, engine/lib/version.php, engine/lib/widgets.php,
+ engine/lib/xml-rpc.php, engine/lib/xml.php,
+ engine/tests/api/entity_getter_functions.php, engine/tests/api/helpers.php,
+ engine/tests/objects/entities.php, engine/tests/objects/filestore.php,
+ engine/tests/objects/metadata.php, engine/tests/objects/objects.php,
+ engine/tests/objects/sites.php, engine/tests/objects/users.php,
+ engine/tests/regression/trac_bugs.php, engine/tests/services/api.php,
+ engine/tests/suite.php, engine/tests/test_skeleton.php, index.php,
+ install.php, install/ElggInstaller.php, languages/en.php,
+ mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/delete.php, mod/blog/actions/blog/save.php,
+ mod/blog/blog_lib.php, mod/blog/start.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php, mod/bookmarks/actions/add.php,
+ mod/bookmarks/actions/delete.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/start.php, .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../views/default/widgets/bookmarks/edit.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/bookmarks/views/rss/object/bookmarks.php, mod/captcha/captcha.php,
+ mod/captcha/languages/en.php, mod/captcha/start.php,
+ mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php, mod/categories/actions/save.php,
+ mod/categories/listing.php, mod/categories/start.php,
+ mod/categories/views/default/categories.php,
+ mod/categories/views/default/categories/css.php,
+ .../views/default/settings/categories/edit.php, mod/crontrigger/start.php,
+ mod/defaultwidgets/actions/update.php, mod/defaultwidgets/start.php,
+ .../admin/appearance/default_dashboard_widgets.php,
+ .../admin/appearance/default_profile_widgets.php,
+ .../views/default/defaultwidgets/editor.php,
+ mod/diagnostics/actions/download.php, mod/diagnostics/index.php,
+ mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ .../views/default/diagnostics/forms/download.php,
+ .../views/default/diagnostics/runalltests.php,
+ mod/ecml/actions/save_permissions.php, mod/ecml/ecml_functions.php,
+ mod/ecml/languages/en.php, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/help.php,
+ mod/ecml/views/default/ecml/input_ext.php,
+ mod/ecml/views/default/ecml/keywords/blip.tv.php,
+ .../views/default/ecml/keywords/dailymotion.php,
+ mod/ecml/views/default/ecml/keywords/entity.php,
+ .../views/default/ecml/keywords/googlemaps.php,
+ mod/ecml/views/default/ecml/keywords/livevideo.php,
+ mod/ecml/views/default/ecml/keywords/redlasso.php,
+ .../views/default/ecml/keywords/slideshare.php,
+ mod/ecml/views/default/ecml/keywords/user_list.php,
+ mod/ecml/views/default/ecml/keywords/vimeo.php,
+ mod/ecml/views/default/ecml/keywords/youtube.php,
+ mod/ecml/views/default/settings/ecml/edit.php, mod/embed/start.php,
+ mod/embed/views/default/embed/css.php, mod/file/actions/delete.php,
+ mod/file/actions/download.php, mod/file/actions/save.php,
+ mod/file/actions/upload.php, mod/file/download.php, mod/file/edit.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/languages/en.php,
+ mod/file/search.php, mod/file/start.php, mod/file/thumbnail.php,
+ mod/file/upload.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/file/icon.php, mod/file/views/default/file/upload.php,
+ mod/file/views/default/object/file.php, mod/file/views/rss/object/file.php,
+ mod/file/world.php, mod/friends/start.php,
+ mod/friends/views/default/widgets/friends/edit.php,
+ mod/friends/views/default/widgets/friends/view.php,
+ mod/garbagecollector/languages/en.php, mod/garbagecollector/start.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/edit.php,
+ mod/groups/actions/featured.php, mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/all.php, mod/groups/edit.php,
+ mod/groups/graphics/icon.php, mod/groups/groupprofile.php,
+ mod/groups/index.php, mod/groups/invitations.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/membership.php,
+ mod/groups/membershipreq.php, mod/groups/new.php, mod/groups/start.php,
+ mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/group/default.php,
+ .../views/default/groups/activity_latest.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ mod/groups/views/default/groups/members.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/object/groupforumtopic.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php,
+ mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/profileitems.php,
+ mod/groups/views/rss/object/groupforumtopic.php, mod/htmlawed/start.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/index.php,
+ mod/invitefriends/languages/en.php, mod/invitefriends/start.php,
+ .../views/default/invitefriends/form.php,
+ .../views/default/invitefriends/formitems.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ .../views/default/admin/overview/logbrowser.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/object/logwrapper.php,
+ mod/logrotate/languages/en.php, mod/logrotate/start.php,
+ mod/members/index.php, mod/members/languages/en.php, mod/members/start.php,
+ mod/members/views/default/members/css.php,
+ mod/members/views/default/members/search.php,
+ mod/messageboard/actions/add.php, mod/messageboard/actions/delete.php,
+ mod/messageboard/ajax_endpoint/load.php, mod/messageboard/history.php,
+ mod/messageboard/index.php, mod/messageboard/start.php,
+ .../views/default/messageboard/css.php,
+ .../views/default/messageboard/forms/add.php,
+ .../views/default/messageboard/messageboard.php,
+ .../default/messageboard/messageboard_content.php,
+ .../views/default/widgets/messageboard/edit.php,
+ .../views/default/widgets/messageboard/view.php,
+ mod/messages/actions/delete.php, mod/messages/actions/send.php,
+ mod/messages/index.php, mod/messages/languages/en.php, mod/messages/read.php,
+ mod/messages/send.php, mod/messages/sent.php, mod/messages/start.php,
+ mod/messages/views/default/messages/css.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php,
+ mod/notifications/actions/groupsave.php, mod/notifications/actions/save.php,
+ mod/notifications/groups.php, mod/notifications/index.php,
+ mod/notifications/start.php, .../views/default/notifications/css.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/groupsform.php,
+ mod/pages/actions/pages/editwelcome.php, mod/pages/history.php,
+ mod/pages/views/default/widgets/pages/view.php,
+ mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/editfield.php, mod/profile/actions/iconupload.php,
+ mod/profile/actions/reorder.php, mod/profile/actions/resetdefaultprofile.php,
+ mod/profile/edit.php, mod/profile/editicon.php, mod/profile/icon.php,
+ mod/profile/icondirect.php, mod/profile/index.php,
+ mod/profile/javascript.php, mod/profile/profile_lib.php,
+ mod/profile/start.php, .../default/admin/appearance/defaultprofile.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/listing.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/friendlinks.php,
+ mod/profile/views/default/profile/menu/links.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/sidebar.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/languages/en.php, mod/reportedcontent/start.php,
+ .../default/admin/overview/reportedcontent.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/footer_link.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/riverdashboard/ecml/activity.php,
+ .../views/default/riverdashboard/sitemessage.php, mod/search/index.php,
+ mod/search/search_hooks.php, mod/search/start.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/gallery.php,
+ .../views/default/search/gallery_listing.php,
+ mod/search/views/default/search/layout.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/startblurb.php,
+ mod/search/views/rss/search/comments/entity.php,
+ mod/search/views/rss/search/entity.php,
+ mod/search/views/rss/search/listing.php, mod/sitepages/languages/en.php,
+ mod/sitepages/sitepages_functions.php, mod/sitepages/start.php,
+ .../views/default/admin/site/sitepages.php,
+ .../views/default/sitepages/custom_frontpage.php,
+ .../views/default/sitepages/footer_menu.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ .../views/default/sitepages/keywords/sitestats.php,
+ .../views/default/sitepages/keywords/userlist.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/sitepages/views/default/sitepages/metatags.php,
+ mod/thewire/actions/add.php, mod/thewire/actions/delete.php,
+ mod/thewire/add.php, mod/thewire/everyone.php, mod/thewire/index.php,
+ mod/thewire/start.php, mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/thewire/views/default/thewire/notfound.php,
+ mod/thewire/views/default/thewire/view.php,
+ mod/thewire/views/rss/object/thewire.php,
+ .../views/rss/search/object/thewire/entity.php, mod/tinymce/start.php,
+ mod/tinymce/views/default/input/longtext.php, mod/twitter/start.php,
+ mod/twitter/views/default/twitter/css.php,
+ mod/twitter/views/default/widgets/twitter/edit.php,
+ mod/twitter/views/default/widgets/twitter/view.php, mod/zaudio/start.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/mpg.php, pages/dashboard/index.php,
+ pages/dashboard/latest.php, pages/entities/index.php,
+ pages/entities/list.php, pages/friends/add.php,
+ pages/friends/collections.php, pages/friends/edit.php,
+ pages/friends/index.php, pages/friends/of.php,
+ pages/friends/pickercallback.php, pages/settings/index.php,
+ pages/settings/plugins.php, pages/settings/statistics.php,
+ pages/settings/user.php, services/api/rest_api.php,
+ services/export/handler.php, simplecache/view.php, upgrade.php, version.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/admin/appearance/menu_items.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/overview.php,
+ views/default/admin/overview/numentities.php,
+ views/default/admin/overview/online.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/ajax/loader.php, views/default/api/output.php,
+ views/default/canvas/default.php,
+ views/default/canvas/layouts/administration.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/one_column_with_sidebar.php,
+ views/default/comments/forms/edit.php, views/default/dashboard/blurb.php,
+ views/default/entities/entity_list.php,
+ views/default/entities/entity_listing.php,
+ views/default/entities/gallery.php,
+ views/default/entities/gallery_listing.php, views/default/export/entity.php,
+ views/default/export/metadata.php, views/default/export/relationship.php,
+ views/default/friends/collection.php, views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/list.php,
+ views/default/friends/picker.php, views/default/friends/river/create.php,
+ views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php,
+ views/default/graphics/icon.php, views/default/group/default.php,
+ views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php, views/default/input/access.php,
+ views/default/input/autocomplete.php, views/default/input/button.php,
+ views/default/input/captcha.php, views/default/input/checkboxes.php,
+ views/default/input/datepicker.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/form.php,
+ views/default/input/hidden.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/reset.php, views/default/input/securitytoken.php,
+ views/default/input/submit.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/input/urlshortener.php, views/default/input/userpicker.php,
+ views/default/likes/forms/display.php, views/default/likes/forms/edit.php,
+ views/default/likes/forms/link.php, views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/breadcrumbs.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/sidebar_menu.php,
+ views/default/navigation/submenu_group.php,
+ views/default/navigation/submenu_item.php,
+ views/default/navigation/submenu_js.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/navigation/viewtype.php,
+ .../notifications/settings/usersettings.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/object/plugin.php, views/default/object/widget.php,
+ views/default/output/calendar.php, views/default/output/checkboxes.php,
+ views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/email.php, views/default/output/iframe.php,
+ views/default/output/longtext.php, views/default/output/pulldown.php,
+ views/default/output/radio.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php, views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_shells/admin.php, views/default/page_shells/default.php,
+ views/default/river/item/list.php, views/default/river/item/wrapper.php,
+ views/default/settings/system.php, views/default/settings/upgrading.php,
+ views/default/site/default.php, views/default/spotlight/default.php,
+ views/default/upload/upload_form_content.php, views/default/user/default.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php, views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/usersettings/user.php, views/default/widgets/editwrapper.php,
+ views/default/widgets/wrapper.php, views/failsafe/canvas/default.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/page_shells/default.php, views/foaf/canvas/default.php,
+ views/foaf/page_elements/contentwrapper.php,
+ views/foaf/page_shells/default.php, views/foaf/search/entity_list.php,
+ views/foaf/user/default.php, views/ical/canvas/default.php,
+ views/ical/export/entity.php, views/ical/object/default.php,
+ views/ical/pageshells/pageshell.php, views/ical/search/entity_list.php,
+ views/installation/canvas/default.php, views/installation/input/access.php,
+ views/installation/input/button.php, views/installation/input/checkboxes.php,
+ views/installation/input/form.php, views/installation/input/hidden.php,
+ views/installation/input/longtext.php, views/installation/input/password.php,
+ views/installation/input/pulldown.php, views/installation/input/reset.php,
+ views/installation/input/securitytoken.php,
+ views/installation/input/submit.php, views/installation/input/text.php,
+ views/installation/messages/errors/error.php,
+ views/installation/messages/errors/list.php,
+ views/installation/messages/list.php,
+ views/installation/messages/messages/list.php,
+ views/installation/messages/messages/message.php,
+ views/installation/page_shells/default.php, views/js/object/default.php,
+ views/js/pageshells/pageshell.php, views/js/user/default.php,
+ views/json/api/output.php, views/json/canvas/default.php,
+ views/json/export/entity.php, views/json/export/metadata.php,
+ views/json/export/relationship.php, views/json/group/default.php,
+ views/json/messages/exceptions/exception.php, views/json/object/default.php,
+ views/json/page_elements/contentwrapper.php,
+ views/json/page_shells/default.php, views/json/river/item/list.php,
+ views/json/search/entity_list.php, views/json/site/default.php,
+ views/json/user/default.php, views/opendd/canvas/default.php,
+ views/opendd/export/entity.php, views/opendd/export/metadata.php,
+ views/opendd/export/relationship.php, views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/search/entity_list.php, views/opendd/site/default.php,
+ views/opendd/user/default.php, views/php/api/output.php,
+ views/php/canvas/default.php, views/php/export/entity.php,
+ views/php/export/metadata.php, views/php/export/relationship.php,
+ views/php/group/default.php, views/php/messages/exceptions/exception.php,
+ views/php/object/default.php, views/php/page_shells/default.php,
+ views/php/search/entity_list.php, views/php/site/default.php,
+ views/php/user/default.php, views/rss/annotation/default.php,
+ views/rss/canvas/default.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/page_elements/contentwrapper.php,
+ views/rss/page_shells/default.php, views/rss/river/item/list.php,
+ views/rss/search/entity_list.php, views/rss/user/default.php,
+ views/xml/api/output.php, views/xml/messages/exceptions/exception.php,
+ views/xml/page_shells/default.php, views/xml/xml-rpc/output.php: Removed
+ @license, @copyright, and @author from files. License and copyright are
+ covered by LICENSE.txt and COPYRIGHT.txt in root.
+
+2010-10-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * pages/entities/index.php, pages/entities/list.php: Fixes #2578 - entity
+ pages should not need call to load engine
+
+ * engine/lib/elgglib.php: Fixes #733 - events now support PHP callbacks
+
+ * engine/lib/elgglib.php: better creation of event and plugin hook
+ registration arrays
+
+ * engine/lib/elgglib.php: Fixes #2466 - split events() into register and
+ trigger functions
+
+2010-10-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Refs #733 - plugin hooks now support PHP callbacks
+
+
+2010-10-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/actions/add.php, mod/bookmarks/languages/en.php,
+ mod/bookmarks/views/default/object/bookmarks.php: Refs #2551 - merged [7051]
+ and [7053] into trunk
+
+ * views/default/annotation/annotate.php: Merges [7038] into trunk from 1.7
+ branch
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php,
+ actions/admin/plugins/simple_update_states.php: Refs #2537 - merged [7026]
+ into trunk from 1.7 branch
+
+ * engine/lib/views.php, simplecache/view.php: Refs #2410 - merged [7024]
+ into trunk from 1.7 branch
+
+ * mod/profile/views/default/profile/javascript.php,
+ .../views/default/riverdashboard/js.php: Refs #2493 - merged [7008] into
+ trunk from 1.7 branch
+
+ * engine/classes/ElggMemcache.php: Refs #2465 - merged [7007] into trunk
+ from 1.7 branch
+
+ * engine/lib/filestore.php, mod/profile/actions/iconupload.php: Refs #2499 -
+ merged [6990] into trunk from 1.7 branch
+
+ * mod/groups/views/default/river/forum/create.php: Refs #2498 - merged
+ [6982] into trunk from 1.7 branch
+
+ * mod/file/start.php, mod/file/views/default/file/groupprofile_files.php:
+ Refs #2489 - manually merged [6981] from 1.7 branch to keep group file option
+ consistent across Elgg versions
+
+ * engine/lib/database.php: Refs #2474 - merged [6976] from 1.7 branch into
+ trunk
+
+ * mod/pages/actions/pages/editwelcome.php, mod/pages/index.php,
+ mod/pages/start.php, .../views/default/forms/pages/editwelcome.php,
+ mod/pages/welcome.php, mod/pages/world.php: Refs #2496 - manually merged
+ [6975] from 1.7 branch
+
+ * mod/pages/actions/pages/edit.php: fixed stray character that got into
+ pages edit action
+
+ * install/ElggInstaller.php, views/installation/install/forms/admin.php,
+ views/installation/install/forms/database.php,
+ views/installation/install/forms/settings.php: Fixes #2570 - cannot replicate
+ issue with current_page_url() so returned to using it - fixes subdirectory
+ install issue
+
+2010-10-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/languages/en.php: added a check for
+ register globals
+
+2010-10-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/input.php, engine/start.php: Fixes
+ #2563 - setup autoload in elgglib.php so exceptions and other classes are
+ available as soon as possible
+
+ * install/ElggInstaller.php: removed exceptions.php from install boot
+ loading
+
+2010-10-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, languages/en.php: Fixes #2514 - separating action
+ error messages for undefined and no action script file
+
+ * engine/lib/query.php, engine/start.php, install/ElggInstaller.php: Refs
+ #2511 - removed empty query.php lib file
+
+ * engine/lib/elgglib.php, engine/lib/output.php, engine/lib/social.php,
+ engine/start.php, install/ElggInstaller.php: Fixes #2339 - removes social
+ library and deprecates its two functions (put it output.php for lack of a
+ better location)
+
+ * engine/lib/entities.php: Fixes #2403 - adds unregister_entity_type()
+
+2010-10-14 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/exceptions.php, engine/start.php: Deprecated unnecessary
+ exceptions.php lib file
+
+ * mod/blog/classes/ElggBlog.php: Switching blog over to autoload method for
+ plugin classes
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php, engine/start.php,
+ mod/blog/blog_lib.php: Fixes #2547: Plugins can now participate in
+ autoloading classes.
+
+2010-10-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/ElggRewriteTester.php,
+ install/cli/sample_installer.php, install/languages/en.php: Fixes #2556 - one
+ step install now supported with sample cli script
+
+2010-10-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/languages/en.php: Fixes #2312 -
+ checking value of arg_separator.output during install
+
+ * views/installation/input/button.php, views/installation/input/form.php,
+ views/installation/install/forms/admin.php,
+ views/installation/install/forms/database.php,
+ views/installation/install/forms/settings.php,
+ views/installation/install/forms/template.php,
+ views/installation/install/nav.php: Fixes #2522 - disabling form submission
+ after first submission
+
+ * install/ElggRewriteTester.php, install/languages/en.php: Fixes #2521 -
+ added check for old .htaccess
+
+ * install/ElggInstaller.php, install/languages/en.php, languages/en.php:
+ better handling of settings file issues during installation
+
+ * htaccess_dist: forgot to update rewrite rule in htaccess_dist
+
+2010-10-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/ElggRewriteTester.php,
+ install/languages/en.php: Pulled rewrite test out into separate class
+
+2010-10-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/start.php: Fixes #2529 for real this time. Not
+ using made up ElggEntity attributes. Added canEdit() override for user
+ validation so it can disable users after they register.
+
+ * engine/lib/entities.php: Checking for a valid entity before using its
+ methods in update_entity().
+
+ * engine/classes/ElggEntity.php: ElggEntity::disable() and enable() now
+ update the attributes so you don't have stale data on the object.
+
+2010-10-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, engine/settings.example.php,
+ install/ElggInstaller.php, install/languages/en.php: using config variable
+ for minimum password length
+
+ * install/ElggInstaller.php, install/languages/en.php: better error messages
+ when there are already Elgg database tables in the database
+
+ * install/ElggInstaller.php: fixed issue when settings.php is filled out
+ before installation is started
+
+ * engine/lib/elgglib.php, engine/lib/install.php, languages/en.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/page_shells/default.php: handling the database being down/busy
+ or an incomplete install. Also cleaned up failsafe views
+
+ * engine/lib/database.php: removed function replaced by installer
+
+ * install/ElggInstaller.php, views/installation/install/pages/complete.php:
+ finished the auto login option for the installer
+
+2010-10-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/register.php, install/ElggInstaller.php, install/languages/en.php:
+ pulled out special exception in registration action for first admin login
+
+2010-10-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/start.php: Fixes #2529. User validation only
+ prevents logins for disabled users to avoid conflicting with alternative
+ login plugins.
+
+2010-10-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/languages/en.php: using new email
+ validation in installer
+
+ * engine/lib/input.php, engine/lib/users.php: Fixes #2161 - using
+ filter_var() in email validation and moved is_email_address() to the input
+ library
+
+2010-10-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, install/languages/en.php,
+ views/installation/install/pages/complete.php: pulled more language strings
+ out of installer into language file
+
+ * _graphics/elgg_logo.png, install/css/install.css, install/install.css,
+ views/installation/install/header.php,
+ views/installation/page_shells/default.php: added Elgg logo to installer
+ screens
+
+2010-10-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/actions/validate.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../uservalidationbyemail/unvalidated_user.php: Merged some fixes from the
+ 1.7.4 backport of uservalidationbyemail.
+
+2010-10-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, engine/lib/actions.php,
+ engine/lib/elgglib.php, engine/lib/install.php, engine/start.php,
+ install/languages/en.php, languages/en.php,
+ views/default/settings/install.php: removed several parts of the old
+ installer from the core
+
+ * .../messages/sanitisation/dbsettings_error.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/settings/install.php, views/failsafe/settings/system.php:
+ removed old views used in previous installer
+
+ * install/ElggInstaller.php, install/languages/en.php, languages/en.php,
+ views/installation/install/forms/template.php,
+ views/installation/page_shells/default.php: Pulled installation language
+ strings out of core language file into installer
+
+2010-10-05 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2010100500.php, version.php: Creating an upgrade to
+ migrate users from old oauth to new oauth_lib plugin. Closes #2532
+
+ * mod/oauth/manifest.xml, mod/oauth/start.php,
+ mod/oauth/vendors/oauth/LICENSE,
+ mod/oauth/vendors/oauth/example/server/INSTALL,
+ .../vendors/oauth/example/server/core/init.php,
+ .../example/server/core/templates/inc/footer.tpl,
+ .../example/server/core/templates/inc/header.tpl,
+ .../oauth/example/server/core/templates/index.tpl,
+ .../oauth/example/server/core/templates/logon.tpl,
+ .../example/server/core/templates/register.tpl,
+ .../vendors/oauth/example/server/www/hello.php,
+ .../vendors/oauth/example/server/www/index.php,
+ .../vendors/oauth/example/server/www/logon.php,
+ .../vendors/oauth/example/server/www/oauth.php,
+ .../vendors/oauth/example/server/www/register.php,
+ .../oauth/example/server/www/services.xrds.php,
+ mod/oauth/vendors/oauth/library/OAuthDiscovery.php,
+ mod/oauth/vendors/oauth/library/OAuthException.php,
+ mod/oauth/vendors/oauth/library/OAuthRequest.php,
+ .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ mod/oauth/vendors/oauth/library/OAuthRequester.php,
+ mod/oauth/vendors/oauth/library/OAuthServer.php,
+ mod/oauth/vendors/oauth/library/OAuthStore.php,
+ .../library/body/OAuthBodyContentDisposition.php,
+ .../library/body/OAuthBodyMultipartFormdata.php,
+ .../vendors/oauth/library/discovery/xrds_parse.php,
+ .../vendors/oauth/library/discovery/xrds_parse.txt,
+ .../OAuthSignatureMethod.class.php, .../OAuthSignatureMethod_HMAC_SHA1.php,
+ .../signature_method/OAuthSignatureMethod_MD5.php,
+ .../OAuthSignatureMethod_PLAINTEXT.php,
+ .../OAuthSignatureMethod_RSA_SHA1.php,
+ .../library/store/OAuthStoreAbstract.class.php,
+ .../oauth/library/store/OAuthStoreAnyMeta.php,
+ .../oauth/library/store/OAuthStoreMySQL.php,
+ .../vendors/oauth/library/store/mysql/install.php,
+ .../vendors/oauth/library/store/mysql/mysql.sql,
+ .../oauth/test/discovery/xrds-fireeagle.xrds,
+ .../oauth/test/discovery/xrds-getsatisfaction.xrds,
+ .../oauth/test/discovery/xrds-magnolia.xrds,
+ mod/oauth/vendors/oauth/test/oauth_test.php, mod/oauth_lib/manifest.xml,
+ mod/oauth_lib/start.php, mod/oauth_lib/vendors/oauth/LICENSE,
+ mod/oauth_lib/vendors/oauth/example/server/INSTALL,
+ .../vendors/oauth/example/server/core/init.php,
+ .../example/server/core/templates/inc/footer.tpl,
+ .../example/server/core/templates/inc/header.tpl,
+ .../oauth/example/server/core/templates/index.tpl,
+ .../oauth/example/server/core/templates/logon.tpl,
+ .../example/server/core/templates/register.tpl,
+ .../vendors/oauth/example/server/www/hello.php,
+ .../vendors/oauth/example/server/www/index.php,
+ .../vendors/oauth/example/server/www/logon.php,
+ .../vendors/oauth/example/server/www/oauth.php,
+ .../vendors/oauth/example/server/www/register.php,
+ .../oauth/example/server/www/services.xrds.php,
+ .../vendors/oauth/library/OAuthDiscovery.php,
+ .../vendors/oauth/library/OAuthException.php,
+ .../vendors/oauth/library/OAuthRequest.php,
+ .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ .../vendors/oauth/library/OAuthRequester.php,
+ .../vendors/oauth/library/OAuthServer.php,
+ mod/oauth_lib/vendors/oauth/library/OAuthStore.php,
+ .../library/body/OAuthBodyContentDisposition.php,
+ .../library/body/OAuthBodyMultipartFormdata.php,
+ .../vendors/oauth/library/discovery/xrds_parse.php,
+ .../vendors/oauth/library/discovery/xrds_parse.txt,
+ .../OAuthSignatureMethod.class.php, .../OAuthSignatureMethod_HMAC_SHA1.php,
+ .../signature_method/OAuthSignatureMethod_MD5.php,
+ .../OAuthSignatureMethod_PLAINTEXT.php,
+ .../OAuthSignatureMethod_RSA_SHA1.php,
+ .../library/store/OAuthStoreAbstract.class.php,
+ .../oauth/library/store/OAuthStoreAnyMeta.php,
+ .../oauth/library/store/OAuthStoreMySQL.php,
+ .../vendors/oauth/library/store/mysql/install.php,
+ .../vendors/oauth/library/store/mysql/mysql.sql,
+ .../oauth/test/discovery/xrds-fireeagle.xrds,
+ .../oauth/test/discovery/xrds-getsatisfaction.xrds,
+ .../oauth/test/discovery/xrds-magnolia.xrds,
+ mod/oauth_lib/vendors/oauth/test/oauth_test.php: Changing the name of the
+ oAuth plugin to reflect it's library service status. Refs #2532
+
+2010-10-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/install.css, views/installation/messages/errors/list.php,
+ views/installation/messages/messages/list.php: Fixes #2523 - errors get red
+ box during install
+
+ * install/ElggInstaller.php, views/failsafe/input/access.php,
+ views/failsafe/input/button.php, views/failsafe/input/checkboxes.php,
+ views/failsafe/input/form.php, views/failsafe/input/hidden.php,
+ views/failsafe/input/longtext.php, views/failsafe/input/password.php,
+ views/failsafe/input/pulldown.php, views/failsafe/input/reset.php,
+ views/failsafe/input/securitytoken.php, views/failsafe/input/submit.php,
+ views/failsafe/input/text.php, views/failsafe/install/footer.php,
+ views/failsafe/install/forms/admin.php,
+ views/failsafe/install/forms/database.php,
+ views/failsafe/install/forms/settings.php,
+ views/failsafe/install/forms/template.php, views/failsafe/install/header.php,
+ views/failsafe/install/nav.php, views/failsafe/install/pages/admin.php,
+ views/failsafe/install/pages/complete.php,
+ views/failsafe/install/pages/database.php,
+ views/failsafe/install/pages/requirements.php,
+ views/failsafe/install/pages/settings.php,
+ views/failsafe/install/pages/welcome.php, views/failsafe/install/sidebar.php,
+ views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php, views/failsafe/messages/list.php,
+ views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/page_shells/install.php, views/installation/input/access.php,
+ views/installation/input/button.php, views/installation/input/checkboxes.php,
+ views/installation/input/form.php, views/installation/input/hidden.php,
+ views/installation/input/longtext.php, views/installation/input/password.php,
+ views/installation/input/pulldown.php, views/installation/input/reset.php,
+ views/installation/input/securitytoken.php,
+ views/installation/input/submit.php, views/installation/input/text.php,
+ views/installation/install/footer.php,
+ views/installation/install/forms/admin.php,
+ views/installation/install/forms/database.php,
+ views/installation/install/forms/settings.php,
+ views/installation/install/forms/template.php,
+ views/installation/install/header.php, views/installation/install/nav.php,
+ views/installation/install/pages/admin.php,
+ views/installation/install/pages/complete.php,
+ views/installation/install/pages/database.php,
+ views/installation/install/pages/requirements.php,
+ views/installation/install/pages/settings.php,
+ views/installation/install/pages/welcome.php,
+ views/installation/install/sidebar.php,
+ views/installation/messages/errors/error.php,
+ views/installation/messages/errors/list.php,
+ views/installation/messages/list.php,
+ views/installation/messages/messages/list.php,
+ views/installation/messages/messages/message.php,
+ views/installation/page_shells/default.php: moved installation to its own
+ viewtype
+
+2010-10-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/lib/functions.php,
+ .../views/default/admin/users/unvalidated.php: Using more built-in API to get
+ unvalidated users.
+
+2010-10-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, languages/en.php: Refs #2129: Pulls some
+ strings out into elgg_echo() in new installation.
+
+ * languages/en.php: Refs #2129: Added missing language string for new
+ installer.
+
+ * htaccess_dist: Cleaned up tabs vs spaces in htaccess_dist.
+
+ * languages/en.php: Refs #2129: Added missing language string for new
+ installer.
+
+2010-10-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php: uservalidationbyemail is turned on by default
+ so we need to have the first admin user validated
+
+2010-10-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install/ElggInstaller.php, languages/en.php: Closes #2129 - installer now
+ works with web servers besides Apache - tested with nginx
+
+2010-10-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/actions/bulk_action.php,
+ mod/uservalidationbyemail/actions/delete.php,
+ .../actions/resend_validation.php,
+ mod/uservalidationbyemail/actions/validate.php,
+ mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php,
+ .../views/default/admin/users/unvalidated.php,
+ .../uservalidationbyemail/unvalidated_user.php: Added admin page to validate,
+ resend validation requests, or delete unvalidated users.
+
+2010-10-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login_dropdown.php: Fixes #2505 - fixes the
+ registration link on the drop down login form
+
+2010-10-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/start.php,
+ .../default/admin/overview/reportedcontent.php: Fixed incorrect echoing of an
+ array.
+
+ * simplecache/view.php: Fixes #2504. Renamed $view to $view_name in
+ simplecache/view.php to avoid var name collision with engine/start.php's
+ $view.
+
+2010-10-01 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: replacing more documentation lost in integration of
+ installer
+
+ * engine/settings.example.php, engine/start.php, htaccess_dist, install.php,
+ install/ElggInstaller.php, install/install.css, languages/en.php,
+ views/failsafe/input/password.php, views/failsafe/install/footer.php,
+ views/failsafe/install/forms/admin.php,
+ views/failsafe/install/forms/database.php,
+ views/failsafe/install/forms/settings.php,
+ views/failsafe/install/forms/template.php, views/failsafe/install/header.php,
+ views/failsafe/install/nav.php, views/failsafe/install/pages/admin.php,
+ views/failsafe/install/pages/complete.php,
+ views/failsafe/install/pages/database.php,
+ views/failsafe/install/pages/requirements.php,
+ views/failsafe/install/pages/settings.php,
+ views/failsafe/install/pages/welcome.php, views/failsafe/install/sidebar.php,
+ views/failsafe/page_shells/install.php: Refs #2129 - integrates new installer
+ code from http://github.com/cash/Elgg - does not work yet with non-Apache web
+ servers
+
+2010-09-30 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, friends/add.php, friends/collections.php,
+ friends/edit.php, friends/index.php, friends/of.php,
+ friends/pickercallback.php, pages/friends/add.php,
+ pages/friends/collections.php, pages/friends/edit.php,
+ pages/friends/index.php, pages/friends/of.php,
+ pages/friends/pickercallback.php, views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php: Closes #2344 - moves friends pages
+ into pages directory
+
+ * engine/lib/entities.php, entities/index.php, entities/list.php,
+ mod/file/start.php, pages/entities/index.php, pages/entities/list.php: Refs
+ #2344 - moves entities directory to pages directory
+
+ * admin/index.php, engine/lib/admin.php, search/index.php: Refs #2344 -
+ removed unused search and admin directories
+
+ * engine/lib/usersettings.php, pages/settings/index.php,
+ pages/settings/plugins.php, pages/settings/statistics.php,
+ pages/settings/user.php, settings/index.php, settings/plugins.php,
+ settings/statistics.php, settings/user.php: Refs #2344 - moves settings pages
+ into the pages directory
+
+ * dashboard/index.php, dashboard/latest.php, engine/lib/users.php,
+ pages/dashboard/index.php, pages/dashboard/latest.php,
+ views/default/dashboard/blurb.php: Refs #2344 - moves dashboard pages into
+ pages directory
+
+ * account/forgotten_password.php, account/register.php,
+ engine/classes/ElggSite.php, engine/lib/users.php,
+ pages/account/forgotten_password.php, pages/account/register.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/login_dropdown.php,
+ .../default/account/forms/login_walled_garden.php: Refs #2344 - move account
+ pages into pages directory
+
+2010-09-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/register.php,
+ actions/user/requestnewpassword.php, engine/lib/sessions.php,
+ engine/lib/users.php, languages/en.php,
+ mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/lib/functions.php,
+ mod/uservalidationbyemail/start.php: Fixes #617, #2271 User validation
+ removed from core to UserValidationByEmail plugin. Without a validation
+ plugin, users can login immediately. Fixes #2243 Removed "You have validated
+ your email" email. Users are logged in immediately after registration or
+ validating email. Refs #2409 Added register, user plugin hook that is called
+ only on self registration. Can be used to halt registration.
+
+2010-09-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Checking for menu items before doing a foreach().
+
+ * engine/lib/views.php: Checking for $CONFIG->view_type before accessing it
+ in elgg_is_valid_viewtype(). Prevents a notice during installation.
+
+2010-09-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/save.php: Cleaned up the file docblock.
+
+2010-09-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/save.php: Fixes #1418: Changing an email address no longer
+ invalidates an account.
+
+ * engine/classes/ElggUser.php: Refs #617: ElggUser:makeAdmin() and
+ removeAdmin() correctly set the attribute for unsaved users.
+
+ * engine/lib/api.php: Refs #2459: Merged [6927] to trunk.
+
+ * views/json/entities/entity_list.php: Merged [6923] to trunk.
+
+ * actions/register.php, languages/en.php: Refs #2454: Merged [6920] to
+ trunk.
+
+ * mod/profile/start.php: Merged [6905] to trunk.
+
+ * engine/lib/group.php: Refs #2437: Merged [6707] to trunk.
+
+ * mod/profile/start.php: Refs #2429: Merged [6889] to trunk.
+
+2010-09-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/ElggObject.php, engine/classes/ElggSite.php: Refs #2450:
+ Documented ElggSite, clarified some docs on ElggObject.
+
+2010-09-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/APIException.php,
+ engine/classes/AccessControlQueryComponent.php,
+ engine/classes/CallException.php, engine/classes/ClassException.php,
+ engine/classes/ClassNotFoundException.php,
+ engine/classes/ConfigurationException.php, engine/classes/CronException.php,
+ engine/classes/DataFormatException.php, engine/classes/DatabaseException.php,
+ engine/classes/DeleteQueryTypeQueryComponent.php,
+ engine/classes/ElggAccess.php, engine/classes/ElggAnnotation.php,
+ engine/classes/ElggCache.php, engine/classes/ElggEntity.php,
+ engine/classes/ElggExtender.php, engine/classes/ElggFileCache.php,
+ engine/classes/ElggFilestore.php, engine/classes/ElggGroup.php,
+ engine/classes/ElggHMACCache.php, engine/classes/ElggMemcache.php,
+ engine/classes/ElggMetadata.php, engine/classes/ElggObject.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggRelationship.php,
+ engine/classes/ElggSession.php, engine/classes/ElggSharedMemoryCache.php,
+ engine/classes/ElggSite.php, engine/classes/ElggStaticVariableCache.php,
+ engine/classes/ElggUser.php, engine/classes/ElggWidget.php,
+ engine/classes/ErrorResult.php, engine/classes/ExportException.php,
+ engine/classes/Exportable.php, engine/classes/GenericResult.php,
+ engine/classes/IOException.php, engine/classes/ImportException.php,
+ engine/classes/Importable.php,
+ engine/classes/InsertQueryTypeQueryComponent.php,
+ engine/classes/InstallationException.php,
+ engine/classes/InvalidClassException.php,
+ engine/classes/InvalidParameterException.php,
+ engine/classes/JoinQueryComponent.php,
+ engine/classes/LimitOffsetQueryComponent.php, engine/classes/Locatable.php,
+ engine/classes/Loggable.php, engine/classes/NotImplementedException.php,
+ engine/classes/Notable.php, engine/classes/NotificationException.php,
+ engine/classes/ODD.php, engine/classes/ODDDocument.php,
+ engine/classes/ODDEntity.php, engine/classes/OrderQueryComponent.php,
+ engine/classes/PluginException.php, engine/classes/Query.php,
+ engine/classes/QueryComponent.php,
+ engine/classes/QueryTypeQueryComponent.php,
+ engine/classes/RegistrationException.php,
+ engine/classes/SecurityException.php,
+ engine/classes/SelectFieldQueryComponent.php,
+ engine/classes/SelectQueryTypeQueryComponent.php,
+ engine/classes/SetQueryComponent.php, engine/classes/SimpleQuery.php,
+ engine/classes/SuccessResult.php, engine/classes/TableQueryComponent.php,
+ engine/classes/UpdateQueryTypeQueryComponent.php,
+ engine/classes/WhereQueryComponent.php,
+ engine/classes/WhereSetQueryComponent.php,
+ engine/classes/WhereStaticQueryComponent.php,
+ engine/classes/XMLRPCArrayParameter.php,
+ engine/classes/XMLRPCBase64Parameter.php,
+ engine/classes/XMLRPCBoolParameter.php, engine/classes/XMLRPCCall.php,
+ engine/classes/XMLRPCDateParameter.php,
+ engine/classes/XMLRPCDoubleParameter.php,
+ engine/classes/XMLRPCErrorResponse.php,
+ engine/classes/XMLRPCIntParameter.php, engine/classes/XMLRPCParameter.php,
+ engine/classes/XMLRPCResponse.php, engine/classes/XMLRPCStringParameter.php,
+ engine/classes/XMLRPCStructParameter.php,
+ engine/classes/XMLRPCSuccessResponse.php, engine/classes/XmlElement.php:
+ Converted line endings to unix.
+
+ * engine/classes/ElggAnnotation.php, engine/classes/ElggExtender.php,
+ engine/classes/ElggPlugin.php, engine/classes/ElggRelationship.php: Refs
+ #2450: Documented a few more classes.
+
+ * engine/classes/ElggObject.php: Refs #2450: Documented ElggObject.
+
+ * engine/classes/ElggEntity.php: Refs #2450: ElggEntity documented.
+
+ * engine/lib/entities.php: Refs #2450: Changed the subpackage and fixed a
+ typo.
+
+2010-09-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/APIException.php,
+ engine/classes/AccessControlQueryComponent.php,
+ engine/classes/CallException.php, engine/classes/ClassException.php,
+ engine/classes/ClassNotFoundException.php,
+ engine/classes/ConfigurationException.php, engine/classes/CronException.php,
+ engine/classes/DataFormatException.php, engine/classes/DatabaseException.php,
+ engine/classes/DeleteQueryTypeQueryComponent.php,
+ engine/classes/ElggAccess.php, engine/classes/ElggAnnotation.php,
+ engine/classes/ElggCache.php, engine/classes/ElggDiskFilestore.php: Refs
+ #2450: Documented first bit of the classes.
+
+ * engine/lib/views.php: Refs #2450: Documented views.php.
+
+2010-09-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Fixes #2479: Removed unused actions init and
+ registered "error" action.
+
+ * documentation/examples/actions/manual_tokens.php,
+ engine/handlers/action_handler.php, engine/lib/actions.php: Refs #2450: Added
+ documentation for actions.
+
+2010-09-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Refs #2450: Documented access.php.
+
+ * engine/lib/elgglib.php: Refs #2450: Changed preferred syntax for talking
+ about hooks / events because :s are used in some names. Now using $name,
+ $type.
+
+ * engine/lib/elgglib.php: Correct spaces issue in autoload function.
+
+ * engine/lib/entities.php: Refs #2450: Documented entities.php
+
+2010-09-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/pagehandler.php, engine/handlers/service_handler.php,
+ engine/handlers/xml-rpc_handler.php: Refs #2450: Documented handler files.
+
+2010-09-15 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/classes/APIException.php,
+ engine/classes/AccessControlQueryComponent.php,
+ engine/classes/CallException.php, engine/classes/ClassException.php,
+ engine/classes/ClassNotFoundException.php,
+ engine/classes/ConfigurationException.php,
+ engine/classes/DataFormatException.php, engine/classes/DatabaseException.php,
+ engine/classes/DeleteQueryTypeQueryComponent.php,
+ engine/classes/IOException.php,
+ engine/classes/InsertQueryTypeQueryComponent.php,
+ engine/classes/InstallationException.php,
+ engine/classes/InvalidClassException.php,
+ engine/classes/InvalidParameterException.php,
+ engine/classes/JoinQueryComponent.php,
+ engine/classes/LimitOffsetQueryComponent.php,
+ engine/classes/NotImplementedException.php,
+ engine/classes/NotificationException.php,
+ engine/classes/OrderQueryComponent.php, engine/classes/PluginException.php,
+ engine/classes/Query.php, engine/classes/QueryComponent.php,
+ engine/classes/QueryTypeQueryComponent.php,
+ engine/classes/RegistrationException.php,
+ engine/classes/SecurityException.php,
+ engine/classes/SelectFieldQueryComponent.php,
+ engine/classes/SelectQueryTypeQueryComponent.php,
+ engine/classes/SetQueryComponent.php, engine/classes/SimpleQuery.php,
+ engine/classes/TableQueryComponent.php,
+ engine/classes/UpdateQueryTypeQueryComponent.php,
+ engine/classes/WhereQueryComponent.php,
+ engine/classes/WhereSetQueryComponent.php,
+ engine/classes/WhereStaticQueryComponent.php, engine/lib/access.php,
+ engine/lib/actions.php, engine/lib/admin.php, engine/lib/annotations.php,
+ engine/lib/api.php, engine/lib/cache.php, engine/lib/calendar.php,
+ engine/lib/cron.php, engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/lib/exceptions.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/filestore.php, engine/lib/group.php, engine/lib/input.php,
+ engine/lib/install.php, engine/lib/location.php, engine/lib/memcache.php,
+ engine/lib/metadata.php, engine/lib/notification.php, engine/lib/objects.php,
+ engine/lib/opendd.php, engine/lib/plugins.php, engine/lib/query.php,
+ engine/lib/relationships.php, engine/lib/river.php, engine/lib/sessions.php,
+ engine/lib/sites.php, engine/lib/system_log.php, engine/lib/tags.php,
+ engine/lib/users.php, engine/lib/widgets.php, engine/lib/xml-rpc.php,
+ engine/lib/xml.php: Refs #2220: Pulled remaining classes out of lib files.
+ Core classes now autoloaded via __autoload().
+
+2010-09-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/forgotten_password.php, account/register.php: Refs #2450: Updated
+ docs for account/*
+
+ * engine/start.php: Refs #2450: Documented engine/start.php
+
+ * documentation/stubs/config.php: Refs @2450: Better documentation for
+ $CONFIG->view.
+
+ * documentation/stubs/config.php: Refs #2450: Added config.php stub to
+ document many of the $CONFIG vars.
+
+ * actions/admin/menu_items.php: Removing unused
+ 'menu_items_hide_toolbar_entries' config value.
+
+ * engine/lib/elgglib.php: Fixes #2366: Deprecated test_ip() and
+ is_ip_in_array().
+
+ * documentation/examples/events/advanced.php,
+ documentation/examples/events/all.php,
+ documentation/examples/events/basic.php,
+ documentation/examples/events/emit.php,
+ documentation/examples/hooks/basic.php,
+ documentation/examples/hooks/register/advanced.php,
+ documentation/examples/hooks/register/all.php,
+ documentation/examples/hooks/register/basic.php,
+ documentation/examples/hooks/register/emit.php,
+ documentation/examples/hooks/trigger/advanced.php,
+ documentation/examples/hooks/trigger/basic.php: Adding documentation and
+ examples.
+
+ * engine/lib/elgglib.php: Refs #2450: Added documentation to elgglib.
+
+2010-09-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Refs #2450: Really removed the @uses and @see
+ tags.
+
+ * engine/lib/database.php: Refs #2450: Removing @see and @uses. Replaced NB:
+ with English phrases.
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php,
+ actions/admin/plugins/simple_update_states.php,
+ actions/admin/site/update_advanced.php, actions/admin/site/update_basic.php,
+ actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ actions/admin/user/resetpassword.php, actions/admin/user/unban.php: Refs
+ #2450: Updated docs for core admin actions.
+
+2010-09-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Merged get_entities() is_numeric() fix to trunk.
+
+2010-09-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/settings.example.php: Updated settings.example.php docs
+
+ * engine/lib/configuration.php: Refs #2450: Documented configuration.php.
+
+2010-09-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Refs #2450: Documentation added for database
+ functions.
+
+ * engine/settings.example.php: Refs #2450: Added db_disable_query_cache to
+ settings.example.php.
+
+ * engine/settings.example.php: Refs #2450: Documented db-related $CONFIG
+ vars.
+
+2010-09-07 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, _css/js.php: Refs #2450: Fixed some typos in css/js
+ simplecache documentation
+
+2010-09-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/forgotten_password.php, account/register.php: Refs #2450:
+ Documentation for account/ files added.
+
+ * _css/js.php: Refs #2450: Added the default viewtype in the views dir for
+ the @see tag.
+
+ * _css/css.php, _css/js.php: Refs #2450: Added documentation for js and css
+ files.
+
+2010-08-31 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php: Refs #2434 - make view
+ failures spectacular rather than silent since they should only happen during
+ development
+
+ * mod/profile/start.php, .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php: Refs #2434 - made the
+ profile plugin more robust to bad urls and did a little code standardization
+
+2010-08-30 ewinslow <ewinslow@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php, mod/groups/views/default/group/default.php,
+ mod/groups/views/default/group/group.php: Fixes #2289: grouprofile.php now
+ uses elgg_view_entity and group/group has been renamed to group/default
+
+ * views/default/css.php, views/default/navigation/breadcrumbs.php: Refs
+ #2394: changed breadcrumbs from an id to a class
+
+2010-08-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/metadata.php: Merged [6875] from 1.7 branch into trunk
+
+ * mod/captcha/start.php: merged [6876] into trunk from 1.7 branch
+
+2010-08-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: added escaping to
+ get_entities_from_private_setting_multi()
+
+2010-08-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Closes #2420 Trac seems to work.
+
+ * README.txt: Refs #2420 trac test.
+
+ * README.txt: Refs #2420: Trac test.
+
+ * README.txt: Refs #2420 trac test.
+
+2010-08-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php: Refs #1439 added better page owner functions
+
+2010-08-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2010062301.php: Merged [6857] into trunk
+
+2010-08-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/captcha/captcha.php, mod/captcha/languages/en.php,
+ mod/captcha/manifest.xml, mod/captcha/start.php,
+ mod/captcha/views/default/input/captcha.php: standardized captcha plugin
+
+2010-08-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, .../views/default/object/groupforumtopic.php:
+ Merged [6819] into trunk from 1.7 branch
+
+ * mod/thewire/languages/en.php,
+ .../views/default/thewire/profile_status.php: merged [6828] into trunk from
+ 1.7 branch
+
+ * mod/thewire/languages/en.php,
+ mod/thewire/views/default/object/thewire.php: merged [6829] from 1.7 branch
+ into trunk
+
+ * .../views/default/object/groupforumtopic.php: merged [6832] into trunk
+ from 1.7 branch
+
+2010-08-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Fixed text overflow and word-breaking for base
+ theme
+
+2010-08-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, CONTRIBUTORS.txt, engine/lib/annotations.php,
+ engine/lib/entities.php, engine/lib/plugins.php,
+ engine/schema/upgrades/2009100701.sql, engine/start.php, languages/en.php,
+ mod/embed/views/default/object/default/embed.php,
+ mod/reportedcontent/languages/en.php, mod/search/start.php,
+ mod/twitter/views/default/widgets/twitter/view.php,
+ views/default/messages/errors/error.php,
+ views/default/messages/messages/message.php,
+ views/default/output/longtext.php: Merged r6812:6837 from 1.7 branch to trunk
+ (skipping some changes to plugins like groups and wire)
+
+ * CHANGES.txt, .../notifications/settings/usersettings/save.php,
+ actions/user/default_access.php, engine/lib/access.php,
+ engine/lib/actions.php, engine/lib/annotations.php, engine/lib/api.php,
+ engine/lib/cache.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/extender.php, engine/lib/filestore.php,
+ engine/lib/group.php, engine/lib/install.php, engine/lib/languages.php,
+ engine/lib/location.php, engine/lib/mb_wrapper.php, engine/lib/memcache.php,
+ engine/lib/metadata.php, engine/lib/notification.php, engine/lib/objects.php,
+ engine/lib/pam.php, engine/lib/plugins.php, engine/lib/query.php,
+ engine/lib/relationships.php, engine/lib/river.php, engine/lib/sessions.php,
+ engine/lib/sites.php, engine/lib/tags.php, engine/lib/users.php,
+ engine/lib/views.php, engine/lib/widgets.php, engine/lib/xml-rpc.php,
+ languages/en.php, mod/friends/add.php, mod/friends/collections.php,
+ mod/friends/edit.php, mod/friends/languages/en.php, mod/friends/start.php,
+ mod/friends/views/default/widgets/friends/edit.php,
+ mod/friends/views/default/widgets/friends/view.php, mod/htmlawed/start.php,
+ mod/messages/start.php, .../views/default/widgets/messages/view.php,
+ mod/pages/languages/en.php, mod/riverdashboard/languages/en.php,
+ services/export/handler.php, views/default/account/forms/useradd.php,
+ views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php,
+ views/default/input/autocomplete.php, views/default/page_elements/title.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php: Merged r6757:6810 from
+ 1.7 branch into trunk
+
+ * actions/email/save.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/remove.php, actions/plugins/usersettings/save.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php, actions/user/spotlight.php,
+ engine/lib/annotations.php, engine/lib/database.php,
+ engine/lib/filestore.php, engine/lib/group.php, engine/lib/metadata.php,
+ engine/lib/plugins.php, engine/lib/relationships.php, engine/lib/tags.php,
+ engine/tests/regression/trac_bugs.php, entities/list.php,
+ mod/categories/listing.php, mod/categories/views/default/categories/list.php,
+ mod/file/search.php, mod/groups/actions/addtogroup.php,
+ mod/groups/languages/en.php, .../views/default/groups/closedmembership.php,
+ settings/index.php, settings/plugins.php, settings/statistics.php,
+ settings/user.php, views/json/river/item/list.php: Merged r6701:6756 from 1.7
+ branch into trunk
+
+ * engine/lib/entities.php, engine/lib/relationships.php,
+ engine/lib/upgrades/2010071001.php, engine/lib/upgrades/2010071002.php,
+ mod/notifications/start.php, mod/pages/actions/pages/edit.php,
+ mod/pages/start.php, mod/pages/views/default/forms/pages/edit.php,
+ mod/profile/actions/cropicon.php, mod/profile/actions/iconupload.php,
+ mod/profile/icon.php, mod/profile/icondirect.php, mod/profile/start.php,
+ version.php: Merged r6684:6694 from 1.7 branch to trunk (pages plugin was
+ manually merged due to standardization of code in trunk but not branch)
+
+ * engine/lib/entities.php, engine/lib/metadata.php, engine/lib/output.php,
+ engine/lib/views.php, engine/lib/widgets.php, mod/file/world.php: Merged
+ r6671:6683 from 1.7 branch to trunk
+
+ * actions/admin/user/delete.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/filestore.php, engine/lib/metadata.php,
+ engine/lib/output.php, engine/lib/version.php, engine/lib/views.php,
+ htaccess_dist, languages/en.php,
+ mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/delete.php, mod/blog/actions/blog/save.php,
+ mod/bookmarks/actions/delete.php,
+ mod/embed/views/default/embed/item/gallery.php,
+ mod/embed/views/default/embed/item/list.php, mod/file/actions/delete.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/pages/actions/pages/delete.php,
+ .../views/default/river/object/page/create.php,
+ .../default/admin/overview/reportedcontent.php,
+ mod/riverdashboard/endpoint/get_comments.php,
+ .../views/default/river/item/wrapper.php, views/default/input/checkboxes.php,
+ views/default/input/radio.php, views/failsafe/input/checkboxes.php: Merged
+ r6620:6653 from 1.7 branch into trunk
+
+ * engine/lib/annotations.php, engine/lib/api.php, mod/file/start.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/sharing/invite.php: Merged r6614:6617 from 1.7
+ branch into trunk
+
+ * engine/lib/upgrades/2010070301.php, mod/groups/actions/edit.php,
+ mod/groups/actions/join.php, mod/groups/languages/en.php,
+ mod/groups/views/default/river/group/create.php,
+ .../default/river/relationship/member/create.php, version.php: Merged [6612]
+ from 1.7 into the trunk
+
+ * engine/lib/entities.php, engine/lib/export.php, engine/lib/input.php,
+ engine/lib/metadata.php, engine/tests/objects/metadata.php,
+ .../views/default/forms/forums/edittopic.php,
+ .../views/default/object/groupforumtopic.php,
+ .../views/default/river/object/group/create.php,
+ views/foaf/page_elements/title.php, views/json/page_elements/title.php,
+ views/rss/navigation/pagination.php, views/rss/page_elements/title.php:
+ Merged [6600],[6601],[6605],[6606],[6607],[6608],[6611] from 1.7 branch into
+ trunk
+
+2010-08-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/output.php, mod/blog/start.php,
+ mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php,
+ .../views/default/river/object/blog/create.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/object/file/embedlist.php, mod/file/start.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/object/file.php,
+ mod/file/views/default/widgets/filerepo/view.php, mod/groups/start.php,
+ mod/groups/views/default/forum/maintopic.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../default/messageboard/messageboard_content.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/view.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/river/object/page/create.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ .../views/default/reportedcontent/listing.php,
+ mod/riverdashboard/endpoint/get_comments.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/entity.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ .../views/default/thewire/profile_status.php,
+ views/default/annotation/annotate.php,
+ views/default/annotation/annotatelike.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/annotation/likes.php, views/default/object/default.php,
+ views/default/output/friendlytime.php, views/default/river/item/wrapper.php:
+ Merged r6586:6587 from 1.7 branch into trunk
+
+ * engine/lib/actions.php, mod/groups/views/default/forms/groups/edit.php,
+ views/default/graphics/icon.php: Merged [6573],[6574],[6582] from 1.7 branch
+ into trunk
+
+ * CODING.txt, INSTALL.txt, engine/lib/elgglib.php, engine/lib/metadata.php,
+ engine/lib/output.php, engine/lib/relationships.php,
+ engine/lib/upgrades/2010062301.php, engine/lib/upgrades/2010062302.php,
+ engine/schema/mysql.sql, engine/schema/upgrades/2010062401.sql,
+ engine/tests/api/entity_getter_functions.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/views/default/groups/grouplisting.php,
+ mod/search/search_hooks.php, mod/search/start.php, version.php,
+ views/default/friends/picker.php, views/default/input/checkboxes.php: Merged
+ r6534-6559 from 1.7 branch to trunk
+
+ * engine/lib/metadata.php, engine/lib/upgrades/2010061501.php,
+ engine/tests/api/entity_getter_functions.php, mod/search/start.php: Merging
+ r6517:6520 from 1.7 branch
+
+2010-08-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_shells/walled_garden.php: Updated walledgarden login to
+ wraplongnames
+
+2010-08-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * LICENCE.txt: cleaned up the included license, GPL v2
+
+2010-08-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/html_begin.php: Removed additional
+ header/extend view from HTML head. Moved metatags view to right before
+ </html>. Removed the check if the view exists since it's done in elgg_view()
+ anyway.
+
+2010-08-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Added optional param to sanitise_filepath() that
+ appends a / or not. Also removes any ../s
+
+2010-08-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/css.php: Updated embed css
+
+ * views/default/page_shells/walled_garden.php: Updated walled-garden login
+ input boxes - so they are not effected by any theme running
+
+2010-08-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/html_begin.php: a view inserted for plugins to
+ extend
+
+2010-08-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/overview.php: inserted a view for plugins to extend
+
+2010-07-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: correcting a mistake in the readme file.
+
+2010-07-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/nav.php: small nav tweak to the filter
+
+2010-07-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php, .../views/default/riverdashboard/nav.php:
+ Moved start conversation button
+
+2010-07-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php: missing string added
+
+ * mod/profile/index.php, .../default/profile/profile_contents/groups.php,
+ .../views/default/profile/profile_navigation.php: groups tab added to profile
+
+ * .../views/default/riverdashboard/nav.php: lang tweak on activity filter
+
+2010-07-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/activity.php, mod/riverdashboard/index.php,
+ .../views/default/riverdashboard/nav.php: Added interface elements for inline
+ conversation posting from activity stream
+
+2010-07-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php: added a view for plugins to extend the
+ activity view if required
+
+2010-07-18 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/activity.php: view for plugins to extend on group activity
+
+2010-07-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/pages/actions/pages/edit.php, mod/pages/history.php: More code cleanup
+ to pages.
+
+ * engine/lib/views.php: Added display:page plugin hook in page_draw
+ function.
+
+ * engine/lib/output.php, mod/ecml/start.php: plugin hook output:strip_tags
+ is now format:strip_tags.
+
+ * engine/lib/output.php: elgg_make_excerpt() uses elgg_strip_tags().
+
+2010-07-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Using elgg_strip_tags() for notification
+ body.
+
+ * mod/ecml/start.php: ECML removes keywords for elgg_strip_tags().
+
+ * engine/lib/output.php: Fixes #2099. Added elgg_strip_tags() to allow
+ plugins to remove extra formatting.
+
+ * mod/pages/start.php: Parsing pages views for ecml.
+
+ * mod/pages/actions/pages/delete.php, mod/pages/actions/pages/edit.php,
+ mod/pages/actions/pages/editwelcome.php, mod/pages/edit.php,
+ mod/pages/history.php, mod/pages/index.php, mod/pages/languages/en.php,
+ mod/pages/new.php, mod/pages/pagesTree.php, mod/pages/start.php,
+ mod/pages/view.php, mod/pages/views/default/annotation/icon.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../views/default/icon/object/page/medium.php,
+ mod/pages/views/default/icon/object/page/small.php,
+ .../views/default/icon/object/page_top/medium.php,
+ .../views/default/icon/object/page_top/small.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/css.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/metatags.php,
+ mod/pages/views/default/pages/pagegallery.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/pages/sidebar/sidebarthis.php,
+ mod/pages/views/default/pages/sidebar/starter.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/sidebar/wrapper.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/annotate.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/page/update.php,
+ .../default/river/object/page_top/annotate.php,
+ .../views/default/river/object/page_top/create.php,
+ .../views/default/river/object/page_top/update.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php: First pass at standardizing pages.
+
+ * mod/pages/actions/pages/editwelcome.php, mod/pages/history.php,
+ mod/pages/index.php, mod/pages/languages/en.php, mod/pages/new.php,
+ mod/pages/start.php, .../views/default/forms/pages/editwelcome.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/css.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/update.php,
+ .../views/default/river/object/page_top/update.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php: Converting spaces to tabs without the stray t.
+
+ * mod/pages/actions/pages/editwelcome.php, mod/pages/history.php,
+ mod/pages/index.php, mod/pages/languages/en.php, mod/pages/new.php,
+ mod/pages/start.php, .../views/default/forms/pages/editwelcome.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/css.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/update.php,
+ .../views/default/river/object/page_top/update.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php: Convert spaces to tabs.
+
+ * views/default/page_elements/elgg_header.php,
+ views/default/page_elements/elgg_header_logo.php: Fixes #2284. Pulled out
+ home link in elgg_header to page_elements/elgg_header_logo. Removed
+ csseditor-specific code that caused custom logos to still appear even when
+ csseditor was disabled.
+
+2010-07-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/account/forms/login_walled_garden.php: Added ugly hack to get
+ around problems with sliding in hidden images in visual captcha on login
+ pages in webkit browsers.
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/views.php: Fixes
+ #2195. 3rd and 4th params of page_draw() are now $page_shell and $vars.
+
+2010-07-14 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/invitefriends/languages/en.php,
+ .../views/default/invitefriends/formitems.php: Disabling friend invite form
+ when site has disabled new user registration.
+
+2010-07-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/join.php,
+ mod/groups/views/default/groups/groupprofile.php: Admin users can join
+ groups. Don't request to join a closed group if admin.
+
+2010-07-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css_ie.php: Added clearfloat improvement to IE7/8 CSS
+
+ * mod/ecml/graphics/logo_bliptv.gif, mod/ecml/graphics/logo_dailymotion.gif,
+ mod/ecml/graphics/logo_googlemaps.gif, mod/ecml/graphics/logo_livevideo.gif,
+ mod/ecml/graphics/logo_redlasso.gif, mod/ecml/graphics/logo_slideshare.gif,
+ mod/ecml/graphics/logo_vimeo.gif, mod/ecml/graphics/logo_youtube.gif,
+ mod/ecml/views/default/ecml/admin/css.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php: Added logos to embed web services
+ pane, and made embed nav-bar theme agnostic
+
+ * mod/embed/views/default/embed/css.php: Removed old classes from embed
+
+ * mod/ecml/graphics/url_status.png,
+ mod/ecml/views/default/ecml/admin/css.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php: Updated ecml and embed with new
+ success/failure for input code.
+
+ * views/default/css.php: Added disabled class to submit_button
+
+ * .../views/default/embed/web_services/content.php: Corrected js for preview
+ pane toggleclass
+
+2010-07-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/start.php: messages now parse ecml
+
+ * mod/groups/languages/en.php, mod/groups/start.php: ecml added to group
+ profiles
+
+2010-07-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/link.php: Web services tab now default embed
+ tab if ecml is enabled.
+
+2010-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/views/default/ecml/admin/css.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php: Updated embed/ecml modal interface
+
+2010-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/start.php: keep sitepages settings in their normal location
+
+2010-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_sprites.png: Updated elgg sprites graphic with embed modal
+ arrows
+
+ * mod/ecml/languages/en.php, mod/ecml/views/default/ecml/admin/css.php,
+ .../views/default/embed/web_services/content.php: continuation of embed modal
+ interfacing
+
+ * mod/ecml/views/default/ecml/admin/css.php,
+ .../views/default/embed/web_services/content.php,
+ mod/embed/views/default/embed/css.php: Beginnings of embed modal web-services
+ interfacing improvements.
+
+2010-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/river/group/create.php: river view tweaked
+
+ * mod/ecml/languages/en.php: missing string added
+
+2010-07-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php: Added instructions.
+
+ * mod/ecml/graphics/dailymotion.png, mod/ecml/graphics/googlemaps.png,
+ mod/ecml/graphics/redlasso_1.png, mod/ecml/graphics/redlasso_2.png,
+ mod/ecml/graphics/slideshare.png, mod/ecml/graphics/vimeo.png,
+ mod/ecml/graphics/youtube.png, mod/ecml/languages/en.php, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/help/blip.tv.php,
+ mod/ecml/views/default/ecml/help/dailymotion.php,
+ mod/ecml/views/default/ecml/help/googlemaps.php,
+ mod/ecml/views/default/ecml/help/livevideo.php,
+ mod/ecml/views/default/ecml/help/redlasso.php,
+ mod/ecml/views/default/ecml/help/slideshare.php,
+ mod/ecml/views/default/ecml/help/vimeo.php,
+ mod/ecml/views/default/ecml/help/youtube.php,
+ mod/ecml/views/default/ecml/keyword_help.php,
+ .../views/default/ecml/keywords/googlemaps.php,
+ mod/ecml/views/default/ecml/keywords/livevideo.php,
+ .../views/default/embed/web_services/content.php: Added ecml help for web
+ service embeds.
+
+2010-07-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/oauth/start.php: Adding a missed oauth library file.
+
+2010-07-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/README.txt, mod/embed/start.php,
+ mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/embed.php: Sorting tabs and upload sections
+ correctly by name instead of id. Passing internal_name to all views related
+ to embedding to allow correct calls to elggEmbedInsertContent() in overrided
+ layouts.
+
+ * .../views/default/embed/web_services/content.php: Added missing important
+ view for ECML web services embed.
+
+ * mod/ecml/README.txt, mod/ecml/ecml_functions.php, mod/ecml/start.php:
+ Pulled ECML regex into a constant. Added ecml_get_keywords(),
+ ecml_parse_string(), ecml_extract_keywords(), ecml_get_keyword_info(). Added
+ callback for resolving ECML given an embed code / URL. Removed unused page
+ setup hook. Added web services support. Updated docs.
+
+2010-07-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ .../views/default/groups/invitationrequests.php: Updated group forum forms
+ with an id
+
+ * .../views/default/river/object/blog/create.php,
+ .../default/river/object/bookmarks/create.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/river/object/thewire/create.php,
+ views/default/annotation/annotate.php: Moved all river entry metadata inside
+ span (pushed onto new line) and added relevant css
+
+2010-07-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added elgg_sort_3d_array_by_value(). I do this
+ often enough that a helper function will be nice.
+
+2010-07-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/manifest.xml: undo the last sitepages manifest change
+
+ * mod/sitepages/manifest.xml: site pages enabled
+
+ * mod/bookmarks/views/default/bookmarks/form.php: bookmark edit form access
+ options fixed for groups
+
+2010-07-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php,
+ mod/embed/views/default/embed/upload/content.php: Pulled out some language
+ strings.
+
+ * mod/file/views/default/file/embed_upload.php: Removed stray </div> that
+ broke IE and wasted 3 hours.
+
+ * mod/file/actions/upload.php, mod/file/start.php,
+ mod/file/views/default/file/embed_upload.php: Added upload support to file
+ embed.
+
+ * mod/file/start.php: Added embed support to file plugin.
+
+ * mod/embed/README.txt, mod/embed/languages/en.php, mod/embed/start.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/link.php: Updated documentation for embed.
+ Fixed bug passing internal_name for elggEmbedInsertContent(). Showing a
+ message if no embedable items are returned.
+
+2010-07-06 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Adding javascript and CSS to the walled garden
+ whitelist.
+
+2010-07-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/upload.php: Removed unused upload.php file in embed.
+
+2010-07-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Updated small button hover text
+
+ * mod/groups/activity.php: Added js to groups riverdashboard view
+
+2010-07-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php: small lang tweak
+
+2010-07-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/item/noaccess.php: removing stopgap from [3082] since
+ denied river items are now skipped
+
+ * views/default/river/dashboard.php: Removing another pre-1.5 view that is
+ no longer used
+
+ * views/default/river/relationship/friend/create.php: Closes #2121 - removed
+ view from pre-1.5 days
+
+ * views/default/river/wrapper.php: leftover view from pre-Elgg 1.5 days
+
+2010-07-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/start.php: removing navigation when editing for consistency
+
+2010-07-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/oauth/manifest.xml, mod/oauth/start.php,
+ mod/oauth/vendors/oauth/LICENSE,
+ mod/oauth/vendors/oauth/example/server/INSTALL,
+ .../vendors/oauth/example/server/core/init.php,
+ .../example/server/core/templates/inc/footer.tpl,
+ .../example/server/core/templates/inc/header.tpl,
+ .../oauth/example/server/core/templates/index.tpl,
+ .../oauth/example/server/core/templates/logon.tpl,
+ .../example/server/core/templates/register.tpl,
+ .../vendors/oauth/example/server/www/hello.php,
+ .../vendors/oauth/example/server/www/index.php,
+ .../vendors/oauth/example/server/www/logon.php,
+ .../vendors/oauth/example/server/www/oauth.php,
+ .../vendors/oauth/example/server/www/register.php,
+ .../oauth/example/server/www/services.xrds.php,
+ mod/oauth/vendors/oauth/library/OAuthDiscovery.php,
+ mod/oauth/vendors/oauth/library/OAuthException.php,
+ mod/oauth/vendors/oauth/library/OAuthRequest.php,
+ .../vendors/oauth/library/OAuthRequestLogger.php,
+ .../vendors/oauth/library/OAuthRequestSigner.php,
+ .../vendors/oauth/library/OAuthRequestVerifier.php,
+ mod/oauth/vendors/oauth/library/OAuthRequester.php,
+ mod/oauth/vendors/oauth/library/OAuthServer.php,
+ mod/oauth/vendors/oauth/library/OAuthStore.php,
+ .../library/body/OAuthBodyContentDisposition.php,
+ .../library/body/OAuthBodyMultipartFormdata.php,
+ .../vendors/oauth/library/discovery/xrds_parse.php,
+ .../vendors/oauth/library/discovery/xrds_parse.txt,
+ .../OAuthSignatureMethod.class.php, .../OAuthSignatureMethod_HMAC_SHA1.php,
+ .../signature_method/OAuthSignatureMethod_MD5.php,
+ .../OAuthSignatureMethod_PLAINTEXT.php,
+ .../OAuthSignatureMethod_RSA_SHA1.php,
+ .../library/store/OAuthStoreAbstract.class.php,
+ .../oauth/library/store/OAuthStoreAnyMeta.php,
+ .../oauth/library/store/OAuthStoreMySQL.php,
+ .../vendors/oauth/library/store/mysql/install.php,
+ .../vendors/oauth/library/store/mysql/mysql.sql,
+ .../oauth/test/discovery/xrds-fireeagle.xrds,
+ .../oauth/test/discovery/xrds-getsatisfaction.xrds,
+ .../oauth/test/discovery/xrds-magnolia.xrds,
+ mod/oauth/vendors/oauth/test/oauth_test.php: Moved oauth from plugins to core
+ since twitterservices is core and it depends upon oauth.
+
+2010-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php,
+ views/default/page_elements/html_begin_admin.php,
+ views/default/page_shells/admin.php: Updated admin area to be stand-alone.
+ Added a new html begin for admin area.
+
+2010-07-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/views.php,
+ views/default/page_shells/admin.php: added a parameter to the page_draw
+ function so you can specify a different page shell if required.
+
+2010-06-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/README.txt, mod/sitepages/start.php,
+ .../views/default/admin/site/sitepages.php,
+ .../views/default/settings/sitepages/edit.php: Updated README.txt for new
+ ECML. Moved settings to site category.
+
+ * mod/tinymce/views/default/embed/addcontentjs.php,
+ .../default/tinymce/embed_custom_insert_js.php: Embed's
+ elggEmbedInsertContent() now supports multiple losely coupled views to handle
+ custom insertion js. Plugin order no longer matters.
+
+ * mod/embed/start.php, mod/embed/views/default/embed/embed.php: Embed
+ correctly passes text area name to elggEmbedInsertContent().
+
+2010-06-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/views/default/sitepages/members.php,
+ mod/sitepages/views/default/sitepages/sidebar.php,
+ mod/sitepages/views/default/sitepages/welcome.php: Interface updates to
+ sitepages
+
+ * views/default/canvas/layouts/administration.php: Added more stand-alone
+ admin area rules
+
+ * mod/groups/start.php, mod/groups/views/default/forms/groups/edit.php,
+ views/default/page_elements/elgg_sidebar.php: Added classname to group edit
+ form, divider before edit buttons, and moved the invalid number preceding the
+ classname.
+
+ * mod/members/views/default/members/search.php: Added classnames to members
+ search form
+
+ * mod/members/views/default/members/search.php: Updated wrapper with new
+ naming
+
+2010-06-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/tagcloud.php: Added wrapper to tagcloud + title (for
+ theming)
+
+ * mod/profile/views/default/profile/admin_menu.php: Added float-clear on
+ owner-block links (for theming)
+
+2010-06-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Updated sidebar comments text overflow
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/object/blog.php: Updated the layout of a blogpost
+
+ * mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/groups/css.php: Updated the layout of a topic post
+ within group discussions
+
+2010-06-27 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/html_begin.php,
+ views/default/page_elements/owner_block.php: Closes #2307 #2308 - encoding
+ ampersands in RSS links
+
+2010-06-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/object/thewire/create.php: The wire can now have
+ comments and likes via the activity stream.
+
+2010-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css_ie.php: Updates to IE7 css
+
+ * views/default/admin/components/plugin.php: Updated advanced plugin strings
+ markup/classes
+
+2010-06-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/manifest.xml: notfications default state enabled
+
+ * mod/bookmarks/manifest.xml: changed the default state for bookmarks
+
+2010-06-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Added optional 4th argument 'class' for
+ elgg_instanceof().
+
+ * views/default/page_elements/content_header.php: Updated documentation for
+ page_elements/content_header
+
+2010-06-23 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/tabs.php: Only displaying navigation div when
+ tabs are present.
+
+2010-06-22 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/content_header.php: Allowing plugin authors to
+ override the default tabs (filters) displayed on the content header.
+
+2010-06-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, .../views/default/bookmarks/group_bookmarks.php,
+ .../views/default/groups/activity_latest.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/forum_latest.php: Added a 'view all' link to
+ group tools widgets.
+
+ * mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/groups/css.php: Updated groups/forums topic css
+
+2010-06-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/edittopic.php: forward to the correct place
+ after editing a topic
+
+ * mod/groups/actions/forums/addpost.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletepost.php,
+ mod/groups/actions/forums/editpost.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/activity.php,
+ mod/groups/addtopic.php, mod/groups/all.php, mod/groups/discussions.php,
+ mod/groups/edit.php, mod/groups/edittopic.php, mod/groups/forum.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forum/maintopic.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/object/groupforumtopic.php,
+ .../views/default/river/forum/topic/create.php: There was no point in group
+ discussions having their own comment annotations, better to use the generic
+ comments so this has been changed and a full group activity stream added. For
+ v1.8, there will need to be an upgrade script which will change
+ 'group_topic_post' -> 'generic_comment' and on all existing topics, take the
+ first annotation of type 'group_topic_post' and populate the topic's
+ description.
+
+ * .../views/default/river/item/wrapper.php: group discussion no longer needs
+ this check as it will be possible to comment on discussions from the activity
+ stream.
+
+2010-06-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php: Ref #2294 - group creation action also needs
+ page owner set
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/join.php,
+ mod/groups/actions/joinrequest.php, mod/groups/actions/leave.php: Refs #2294
+ - groups_write_acl_plugin_hook depends on page owner since [5782] and group
+ actions seem to end up with the group owner as the page owner. This is a
+ temporary fix for this issue. All group activity since [5782] on installs now
+ have corrupted group access lists. I have a script to fix this that I can
+ share.
+
+ * mod/groups/actions/join.php: Fixed broken join action for closed groups -
+ encoding issue on forward URL
+
+2010-06-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/views.php: included an option to display existing comments but
+ not show the new comment form.
+
+2010-06-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2010061501.php, engine/lib/views.php,
+ engine/start.php, mod/groups/actions/invite.php, version.php: Merged
+ r6506:6509 from 1.7 to trunk.
+
+ * engine/lib/pagehandler.php, friends/add.php, friends/collections.php,
+ friends/edit.php, friends/index.php, friends/of.php: Merged friends pages
+ fixes in r6501:6503 from 1.7 to trunk.
+
+ * engine/lib/notification.php, engine/lib/users.php, languages/en.php:
+ Merging r6497:6499 to trunk.
+
+ * mod/groups/actions/featured.php,
+ mod/groups/views/default/groups/grouplisting.php: Merged group featuring
+ fixes to trunk [6493]
+
+2010-06-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/pages/views/default/pages/breadcrumbs.php: Updated Pages breadcrumbs
+ markup to use generic breadcrumb style
+
+2010-06-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/pages/start.php: Making menu link for pages go to all pages instead of
+ owned pages.
+
+ * mod/pages/actions/pages/delete.php,
+ mod/pages/actions/pages/editwelcome.php, mod/pages/edit.php,
+ mod/pages/history.php, mod/pages/index.php, mod/pages/languages/en.php,
+ mod/pages/new.php, mod/pages/pagesTree.php, mod/pages/start.php,
+ mod/pages/view.php, mod/pages/views/default/annotation/icon.php,
+ mod/pages/views/default/annotation/page.php,
+ .../views/default/icon/object/page/medium.php,
+ mod/pages/views/default/icon/object/page/small.php,
+ .../views/default/icon/object/page_top/medium.php,
+ .../views/default/icon/object/page_top/small.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/pagegallery.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/pages/sidebar/sidebarthis.php,
+ mod/pages/views/default/pages/sidebar/starter.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/sidebar/wrapper.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/annotate.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/page/update.php,
+ .../default/river/object/page_top/annotate.php,
+ .../views/default/river/object/page_top/create.php,
+ .../views/default/river/object/page_top/update.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php: Quick and dirty changes to pages to work on 1.8's
+ layout.
+
+ * engine/start.php: Making sure to load all plugins when doing an upgrade to
+ pull in CSS changes and allow plugins to register for the upgrade hook.
+
+2010-06-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/views.php, engine/start.php: Merged
+ [6485] and [6486] to trunk.
+
+2010-06-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Merged 6482 to trunk.
+
+2010-06-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/register.php, engine/lib/access.php, engine/lib/users.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/languages/en.php:
+ Merged r6362:6366 from 1.7 to trunk.
+
+2010-06-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: Always show access level when
+ listing blogs, regardless of canEdit().
+
+ * mod/blog/blog_lib.php: Removing old time_created fudging for blogs. It
+ doens't work right.
+
+ * mod/profile/languages/en.php, mod/profile/profile_lib.php,
+ mod/profile/start.php, .../views/default/profile/profile_content.php,
+ .../default/profile/profile_contents/activity.php,
+ .../profile/profile_contents/commentwall.php,
+ .../default/profile/profile_contents/details.php,
+ .../default/profile/profile_contents/friends.php,
+ .../default/profile/profile_contents/sidebar.php,
+ .../default/profile/profile_contents/twitter.php,
+ mod/profile/views/default/profile/sidebar.php: Some code cleanup on profile
+ plugin. Added wrapper view for profile content. Added ECML for profile
+ content. Moved profile/profile_content/sidebar to profile/sidebar
+
+ * mod/groups/languages/en.php: Slight code cleanup in groups langauges.
+ Added string for group discussion ECML option.
+
+ * mod/groups/start.php: Added group forums to ECML views to parse.
+
+ * mod/bookmarks/languages/en.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php: Small code cleanup on bookmarks.
+ Added better logic for determining the username to use when adding a bookmark
+ via the bookmarklet.
+
+ * .../views/default/river/item/wrapper.php: Activity stream comments now
+ show up outside of the hidden div so you can see them when on the like tab.
+
+ * mod/riverdashboard/languages/en.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php: Added "Show less" on activity stream
+ comments.
+
+2010-06-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/css.php: Updates to embed interface to make
+ it theme agnostic in core
+
+ * .../views/default/riverdashboard/css.php: Updated inline comment form css
+ height - for a smoother slide animation
+
+2010-06-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php: Updated administration
+ area css with more styles to make it totally stand-alone
+
+ * mod/profile/views/default/profile/css.php: Small update to latest tweets
+ list style
+
+ * .../profile/profile_contents/commentwall.php: Added wrapper to profile
+ page commentwall
+
+2010-06-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php: ECML is
+ parsed on the activity stream.
+
+2010-06-10 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/endpoint/get_comments.php,
+ .../views/default/river/item/wrapper.php: Adding "twitter_anywhere" class to
+ Conversation and Riverdashboard posts.
+
+ * views/default/input/userpicker.php: Performing checks to handle empty
+ arrays and malformed values.
+
+2010-06-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/views/default/object/bookmarks.php: Moved view extend call -
+ so it's for all users (not just object owner), and added likes to bookmarks
+ (as we already have it in the activity stream)
+
+2010-06-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/bookmarks/group_bookmarks.php: group bookmarks now
+ provides a link to create if none exist
+
+ * mod/groups/views/default/groups/forum_latest.php: if there is no group
+ discussion, provide a link to create a topic
+
+2010-06-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/js.php: Added a 'show less' link. [Still
+ needs a js function adding to collapse list]
+
+ * mod/groups/all.php, .../views/default/groups/group_sort_menu.php: Updated
+ Groups tabs so you land on newest groups tab rather than discussion.
+
+2010-06-09 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: Pre-populating userpicker list when
+ values are passed.
+
+2010-06-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/upload/content.php: Updated embed modal
+ listings with timestamp and text formatting / css.
+
+2010-06-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/gallery.php,
+ mod/embed/views/default/embed/item/list.php: Embed hooks now accept icon_size
+ for displaying items in gallery / list view.
+
+ * .../views/default/riverdashboard/js.php: Removing debug call...I've been
+ very bad about this!
+
+ * mod/embed/views/default/embed/item/gallery.php: Embed default gallery list
+ uses medium icon instead of tiny.
+
+2010-06-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/views/default/ecml/keywords/entity.php,
+ mod/embed/views/default/embed/css.php: Updated embeded object links ui
+
+ * mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php,
+ mod/embed/views/default/embed/upload/content.php: Updated embed modal with
+ wrappers & classnames for each pane
+
+ * mod/embed/views/default/embed/css.php: Updated embed modal with an initial
+ default size
+
+ * mod/ecml/views/default/ecml/keywords/entity.php: Updated ecml inline
+ embeded document links to have a classname
+
+ * views/default/css.php: Updated core css download button
+
+2010-06-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/profile/profile_navigation.php: Properly extending
+ profile navigation view.
+
+2010-06-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/endpoint/get_likes.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/js.php: Ajaxified likes view on activity
+ stream.
+
+2010-06-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/groups/groupprofile.php: Cleaning up groups
+ navigation. Action buttons have replaced the submenu links, helping to
+ standardize user experience. Added a membership-dependent breadcrumb trail.
+
+2010-06-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/profile/profile_ownerblock.php: profile owmer block link
+ fixed
+
+2010-06-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/views/default/embed/embed.php: removing debug output.
+
+ * mod/embed/views/default/embed/embed.php: Fixed invalid variable name that
+ caused embed to ignore custom views for embed content.
+
+ * mod/embed/views/default/embed/embed.php: Upload tab selected when
+ uploading in embed modal.
+
+2010-06-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Updated documents. Removed large and small document
+ icons - we now just use the very small ones from the old filter directory.
+ Updated doc's list view and download button.
+
+ * .../views/default/riverdashboard/css.php: Updated riverdashboard more
+ comments link
+
+ * views/default/css.php, views/default/css_ie.php,
+ views/default/js/initialise_elgg.php: Updated display and position of likes
+ lists. Added js to dismiss list if a click outside the list is detected, also
+ added js so only one list is viewable at a time.
+
+2010-06-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_sidebar.php: Reverting [6371] because
+ Cash already took care of it.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php:
+ elgg_get_entities_from_metadata() and egef_annotations() support singular ->
+ plural rewrites. (Why didn't I add this originally?!)
+
+2010-06-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/endpoint/get_comments.php,
+ mod/riverdashboard/index.php, mod/riverdashboard/languages/en.php,
+ mod/riverdashboard/start.php, .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/js.php: Minimal attempt to bring
+ riverdashboard up to code standards. Fixed comment count in +N more string.
+ Added ajax grabbing of all comments when clicking more link.
+
+ * mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/save.php: Added metadata 'new_post' when autosaving
+ blogs to help with river / revision logic. Autosaved blogs now correctly
+ show up in river and don't create a revision upon initial save.
+
+ * mod/blog/views/default/blog/forms/edit.php: Fix for displaying auto save
+ time. HTML was changed without relevent JS updates.
+
+2010-06-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, .../views/default/widgets/a_users_groups/view.php:
+ Removing deprecated calls to get_entities_from_relationship() from core code.
+
+
+2010-06-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php: group create river action moved
+
+2010-06-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topicposts.php,
+ views/default/annotation/generic_comment.php: Added a classname to generic
+ comment and forum topic posts anchors - for theming purposes.
+
+2010-06-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/languages/en.php,
+ .../notifications/subscriptions/collections.php: Updating Notifications
+ language file.
+
+2010-06-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php, mod/groups/languages/en.php,
+ mod/groups/views/default/river/group/create.php: creating a new group now
+ displays in the activity stream.
+
+ * mod/groups/languages/en.php,
+ .../views/default/river/forum/topic/create.php: updated the group discussion
+ river view
+
+2010-06-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, views/default/admin/users/find.php: Removing user
+ "Find" from Admin area. Closes #2216
+
+2010-06-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: lang tweak
+
+ * mod/groups/actions/featured.php, mod/groups/languages/en.php,
+ mod/groups/views/default/groups/grouplisting.php: featuring and unfeaturing
+ groups now works
+
+ * mod/ecml/start.php: don't extend input fields yet with ecml as it is not
+ designed as an end user tool
+
+ * mod/blog/views/default/object/blog.php: blog tags will not display the
+ class if no tags exist
+
+ * actions/likes/add.php, languages/en.php: missing lang strings added
+
+2010-06-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_sidebar.php: Added elgg_sidebar/extend
+ view.
+
+2010-06-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php: Added missing language string for embed.
+
+ * mod/embed/start.php, mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/upload/content.php: Added first loosely coupled
+ upload support to embed.
+
+2010-06-04 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/users/find.php, views/default/css.php: Updating Find
+ User in the Admin section to use the livesearch user picker.
+
+2010-06-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2010060401.php,
+ .../views/default/widgets/a_users_groups/view.php, version.php: Merged
+ r6349:6351 from 1.7 to trunk.
+
+ * engine/lib/elgglib.php, engine/lib/upgrades/2010060101.php,
+ engine/start.php, .../views/default/defaultwidgets/editor.php,
+ mod/notifications/start.php, mod/profile/views/default/profile/icon.php,
+ simplecache/view.php, upgrade.php, version.php,
+ views/default/canvas/layouts/widgets.php: Merge r6301:6338 from 1.7 to trunk.
+
+
+2010-06-04 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/start.php: Allowing new users to validate email
+ addresses if the site is a Private Network.
+
+2010-06-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/invite.php: Added id to invite
+ friends to group form (for theming purposes).
+
+ * .../profile/profile_contents/commentwall.php: Removed profile content
+ wrapper from comment wall content.
+
+2010-06-03 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php: Updating views to no
+ longer parse usernames as this is handled directly thru Mentions.
+
+2010-06-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/README.txt, mod/ecml/ecml_functions.php, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/keywords/entity.php: Added entity keyword to
+ ECML. (NB: The old entity keyword is now entity_list)
+
+2010-06-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/views/default/input/longtext.php: Removed one unused and one
+ absent plugin from tinyMCE init that was causing problems in some browsers.
+
+2010-06-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CODING.txt: Updated CODING.txt with more best practices. Simplified some
+ of the examples.
+
+ * mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/gallery.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php: Moved most of the logic for
+ embed viewing into a single place. Added gallery support (still no CSS).
+
+2010-06-02 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Mathematical calculations on annotations will
+ return false for non-existent entity subtypes.
+
+ * engine/lib/tags.php, languages/en.php, mod/tagcloud/start.php,
+ mod/tagcloud/views/default/tagcloud/extend.php,
+ views/default/output/tagcloud.php: Moving new Site Tags functionality out of
+ Tagcloud plugin and into core.
+
+ * engine/lib/annotations.php, engine/tests/objects/entities.php: Requesting
+ annotations from a non-existent subtype will now return nothing instead of
+ everything. This functionality is required to preserve context.
+
+2010-06-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/languages/en.php: Added missing language strings for blog.
+
+ * views/default/entities/entity_listing.php,
+ views/default/entities/gallery_listing.php: Updated documentation for
+ entity_listing and gallery_listing.
+
+ * views/default/entities/gallery_listing.php: Updated gallery_listing.php
+ view. No CSS yet.
+
+ * mod/embed/embed.php, mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/media.php,
+ mod/embed/views/default/embed/pagination.php,
+ mod/embed/views/default/embed/simpletype.php,
+ mod/embed/views/default/embed/tabs.php,
+ mod/embed/views/default/embed/upload.php: Removing unused views and files
+ from embed.
+
+2010-06-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/views/default/tagcloud/extend.php: Updated tagcloud link
+
+2010-06-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/languages/en.php, mod/embed/views/default/embed/embed.php:
+ Standardized embed language file. Fixed title language string for embed
+ modal.
+
+2010-06-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/walled_garden_background_top.gif,
+ _graphics/walled_garden_backgroundfull_bottom.gif,
+ _graphics/walled_garden_backgroundfull_top.gif,
+ .../default/account/forms/login_walled_garden.php,
+ views/default/account/forms/register.php, views/default/css.php,
+ views/default/page_shells/walled_garden.php: Updated private network
+ (previously walled garden) login/register/lost password to be independent of
+ any theme running, and improved interface.
+
+2010-06-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php: removed redundant view call
+
+2010-06-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/start.php: Updated all site Tagcloud to use 2column canvas.
+
+2010-06-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/embed/README.txt, mod/embed/embed.php, mod/embed/manifest.xml,
+ mod/embed/start.php, mod/embed/views/default/embed/addcontentjs.php,
+ mod/embed/views/default/embed/embed.php,
+ mod/embed/views/default/embed/item/list.php,
+ mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/embed/layouts/gallery.php,
+ mod/embed/views/default/embed/layouts/list.php,
+ mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/media.php,
+ mod/embed/views/default/embed/upload.php: First pass at a loosely couple
+ embed plugin using ECML.
+
+2010-06-01 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/account/forms/login_walled_garden.php, views/default/css.php:
+ Adding a "Register" link to the Walled Garden login screen. This mimics
+ pre-existing "Lost Password" functionality without redirecting to an internal
+ page.
+
+2010-06-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Pagination uses
+ elgg_get_array_value().
+
+ * engine/lib/elgglib.php: Added elgg_get_array_value() helper function.
+
+ * views/default/navigation/pagination.php: Fixed bug in detecting and using
+ baseurl in navingation/pagination view.
+
+ * views/default/entities/entity_listing.php: Updated documentation for
+ entities/entity_listing view.
+
+2010-06-01 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/start.php, mod/tagcloud/views/default/tagcloud/extend.php,
+ views/default/output/tagcloud.php: Extending default tagcloud view to include
+ a link to all site tags. Also fixing a bug where errant "," was prepended to
+ tag list.
+
+2010-06-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: get_input() defaults to NULL instead of empty
+ string. Works better with isset().
+
+ * mod/tinymce/tinymce_content.css,
+ .../themes/advanced/skins/default/content.css: Forgot to svn add
+ tinymce_content.css. Added tinymce_content.css and reverted [6300] to allow
+ for easier tinymce upgrades.
+
+2010-06-01 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php, mod/blog/views/default/blog/sidebar_menu.php:
+ Restricting tag cloud display on Blogs and Documents by context.
+
+2010-06-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/start.php, mod/sitepages/views/default/sitepages/css.php,
+ mod/sitepages/views/default/sitepages/sidebar.php,
+ mod/sitepages/views/default/sitepages/welcome.php: Updated Sitepages homepage
+ markup with clearfloat, content wrappers and associated css.
+
+ * mod/profile/views/default/profile/css.php: Updated avatar user-menu
+ font-style.
+
+ * .../themes/advanced/skins/default/content.css: TinyMCE default editor
+ font-size increased to match preview and publish size.
+
+2010-05-31 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php: remove the filter header if not logged in
+
+ * mod/bookmarks/languages/en.php,
+ .../default/river/object/bookmarks/create.php: bookmarks river view altered
+ for groups
+
+2010-05-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: make sure logged out river display correctly
+
+ * engine/lib/river.php: small tweak to the new river
+
+ * mod/bookmarks/start.php: removed a breadcrumb view when on the all page
+
+ * mod/bookmarks/languages/en.php: change community to group for consistency
+
+2010-05-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/output.php: Merged r6263:6271 to trunk.
+
+
+ * engine/handlers/pagehandler.php, engine/lib/pagehandler.php,
+ mod/tinymce/views/default/input/longtext.php,
+ views/default/input/pulldown.php: Merged [6248] - [6252] into trunk.
+
+ * engine/lib/upgrades/2010052601.php, mod/groups/actions/edit.php,
+ mod/groups/views/default/forms/groups/edit.php, version.php: Merged [6223] -
+ [6228] into trunk.
+
+ * mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/editpost.php: Merging [6091] to trunk.
+
+ * mod/tinymce/languages/en.php, mod/tinymce/readme.txt,
+ mod/tinymce/start.php, mod/tinymce/tinymce/changelog.txt,
+ mod/tinymce/tinymce/jscripts/tiny_mce/langs/en.js,
+ mod/tinymce/tinymce/jscripts/tiny_mce/license.txt,
+ .../jscripts/tiny_mce/plugins/advhr/css/advhr.css,
+ .../tiny_mce/plugins/advhr/editor_plugin.js,
+ .../tiny_mce/plugins/advhr/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advhr/js/rule.js,
+ .../tiny_mce/plugins/advhr/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advhr/rule.htm,
+ .../tiny_mce/plugins/advimage/css/advimage.css,
+ .../tiny_mce/plugins/advimage/editor_plugin.js,
+ .../tiny_mce/plugins/advimage/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advimage/image.htm,
+ .../tiny_mce/plugins/advimage/img/sample.gif,
+ .../jscripts/tiny_mce/plugins/advimage/js/image.js,
+ .../tiny_mce/plugins/advimage/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlink/css/advlink.css,
+ .../tiny_mce/plugins/advlink/editor_plugin.js,
+ .../tiny_mce/plugins/advlink/editor_plugin_src.js,
+ .../tiny_mce/plugins/advlink/js/advlink.js,
+ .../tiny_mce/plugins/advlink/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advlink/link.htm,
+ .../tiny_mce/plugins/autosave/editor_plugin.js,
+ .../tiny_mce/plugins/autosave/editor_plugin_src.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin_src.js,
+ .../tiny_mce/plugins/compat2x/editor_plugin.js,
+ .../tiny_mce/plugins/compat2x/editor_plugin_src.js,
+ .../tiny_mce/plugins/contextmenu/editor_plugin.js,
+ .../plugins/contextmenu/editor_plugin_src.js,
+ .../plugins/directionality/editor_plugin.js,
+ .../plugins/directionality/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/editor_plugin.js,
+ .../tiny_mce/plugins/emotions/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/emotions.htm,
+ .../tiny_mce/plugins/emotions/img/smiley-cool.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-cry.gif,
+ .../plugins/emotions/img/smiley-embarassed.gif,
+ .../plugins/emotions/img/smiley-foot-in-mouth.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-frown.gif,
+ .../plugins/emotions/img/smiley-innocent.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-kiss.gif,
+ .../plugins/emotions/img/smiley-laughing.gif,
+ .../plugins/emotions/img/smiley-money-mouth.gif,
+ .../plugins/emotions/img/smiley-sealed.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-smile.gif,
+ .../plugins/emotions/img/smiley-surprised.gif,
+ .../plugins/emotions/img/smiley-tongue-out.gif,
+ .../plugins/emotions/img/smiley-undecided.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-wink.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-yell.gif,
+ .../tiny_mce/plugins/emotions/js/emotions.js,
+ .../tiny_mce/plugins/emotions/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/example/dialog.htm,
+ .../tiny_mce/plugins/example/editor_plugin.js,
+ .../tiny_mce/plugins/example/editor_plugin_src.js,
+ .../tiny_mce/plugins/example/img/example.gif,
+ .../jscripts/tiny_mce/plugins/example/js/dialog.js,
+ .../jscripts/tiny_mce/plugins/example/langs/en.js,
+ .../tiny_mce/plugins/example/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullpage/css/fullpage.css,
+ .../tiny_mce/plugins/fullpage/editor_plugin.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/fullpage.htm,
+ .../tiny_mce/plugins/fullpage/js/fullpage.js,
+ .../tiny_mce/plugins/fullpage/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullscreen/editor_plugin.js,
+ .../plugins/fullscreen/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullscreen/fullscreen.htm,
+ .../tiny_mce/plugins/iespell/editor_plugin.js,
+ .../tiny_mce/plugins/iespell/editor_plugin_src.js,
+ .../tiny_mce/plugins/inlinepopups/editor_plugin.js,
+ .../plugins/inlinepopups/editor_plugin_src.js,
+ .../inlinepopups/skins/clearlooks2/img/alert.gif,
+ .../inlinepopups/skins/clearlooks2/img/button.gif,
+ .../inlinepopups/skins/clearlooks2/img/buttons.gif,
+ .../inlinepopups/skins/clearlooks2/img/confirm.gif,
+ .../inlinepopups/skins/clearlooks2/img/corners.gif,
+ .../skins/clearlooks2/img/horizontal.gif,
+ .../skins/clearlooks2/img/vertical.gif,
+ .../inlinepopups/skins/clearlooks2/window.css,
+ .../tiny_mce/plugins/inlinepopups/template.htm,
+ .../plugins/insertdatetime/editor_plugin.js,
+ .../plugins/insertdatetime/editor_plugin_src.js,
+ .../tiny_mce/plugins/layer/editor_plugin.js,
+ .../tiny_mce/plugins/layer/editor_plugin_src.js,
+ .../tiny_mce/plugins/media/css/content.css,
+ .../jscripts/tiny_mce/plugins/media/css/media.css,
+ .../tiny_mce/plugins/media/editor_plugin.js,
+ .../tiny_mce/plugins/media/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/img/flash.gif,
+ .../tiny_mce/plugins/media/img/flv_player.swf,
+ .../tiny_mce/plugins/media/img/quicktime.gif,
+ .../tiny_mce/plugins/media/img/realmedia.gif,
+ .../tiny_mce/plugins/media/img/shockwave.gif,
+ .../jscripts/tiny_mce/plugins/media/img/trans.gif,
+ .../tiny_mce/plugins/media/img/windowsmedia.gif,
+ .../jscripts/tiny_mce/plugins/media/js/embed.js,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/media/media.htm,
+ .../tiny_mce/plugins/nonbreaking/editor_plugin.js,
+ .../plugins/nonbreaking/editor_plugin_src.js,
+ .../tiny_mce/plugins/noneditable/editor_plugin.js,
+ .../plugins/noneditable/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/css/content.css,
+ .../tiny_mce/plugins/pagebreak/editor_plugin.js,
+ .../plugins/pagebreak/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/img/pagebreak.gif,
+ .../tiny_mce/plugins/pagebreak/img/trans.gif,
+ .../jscripts/tiny_mce/plugins/paste/blank.htm,
+ .../jscripts/tiny_mce/plugins/paste/css/blank.css,
+ .../tiny_mce/plugins/paste/css/pasteword.css,
+ .../tiny_mce/plugins/paste/editor_plugin.js,
+ .../tiny_mce/plugins/paste/editor_plugin_src.js,
+ .../tiny_mce/plugins/paste/js/pastetext.js,
+ .../tiny_mce/plugins/paste/js/pasteword.js,
+ .../tiny_mce/plugins/paste/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/paste/pastetext.htm,
+ .../jscripts/tiny_mce/plugins/paste/pasteword.htm,
+ .../tiny_mce/plugins/preview/editor_plugin.js,
+ .../tiny_mce/plugins/preview/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/preview/example.html,
+ .../tiny_mce/plugins/preview/jscripts/embed.js,
+ .../tiny_mce/plugins/print/editor_plugin.js,
+ .../tiny_mce/plugins/print/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/safari/blank.htm,
+ .../tiny_mce/plugins/safari/editor_plugin.js,
+ .../tiny_mce/plugins/safari/editor_plugin_src.js,
+ .../tiny_mce/plugins/save/editor_plugin.js,
+ .../tiny_mce/plugins/save/editor_plugin_src.js,
+ .../plugins/searchreplace/css/searchreplace.css,
+ .../plugins/searchreplace/editor_plugin.js,
+ .../plugins/searchreplace/editor_plugin_src.js,
+ .../plugins/searchreplace/js/searchreplace.js,
+ .../tiny_mce/plugins/searchreplace/langs/en_dlg.js,
+ .../plugins/searchreplace/searchreplace.htm,
+ .../tiny_mce/plugins/spellchecker/css/content.css,
+ .../tiny_mce/plugins/spellchecker/editor_plugin.js,
+ .../plugins/spellchecker/editor_plugin_src.js,
+ .../tiny_mce/plugins/spellchecker/img/wline.gif,
+ .../jscripts/tiny_mce/plugins/style/css/props.css,
+ .../tiny_mce/plugins/style/editor_plugin.js,
+ .../tiny_mce/plugins/style/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/style/js/props.js,
+ .../tiny_mce/plugins/style/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/style/props.htm,
+ .../jscripts/tiny_mce/plugins/table/cell.htm,
+ .../jscripts/tiny_mce/plugins/table/css/cell.css,
+ .../jscripts/tiny_mce/plugins/table/css/row.css,
+ .../jscripts/tiny_mce/plugins/table/css/table.css,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/cell.js,
+ .../tiny_mce/plugins/table/js/merge_cells.js,
+ .../jscripts/tiny_mce/plugins/table/js/row.js,
+ .../jscripts/tiny_mce/plugins/table/js/table.js,
+ .../tiny_mce/plugins/table/langs/en_dlg.js,
+ .../tiny_mce/plugins/table/merge_cells.htm,
+ .../jscripts/tiny_mce/plugins/table/row.htm,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../jscripts/tiny_mce/plugins/template/blank.htm,
+ .../tiny_mce/plugins/template/css/template.css,
+ .../tiny_mce/plugins/template/editor_plugin.js,
+ .../tiny_mce/plugins/template/editor_plugin_src.js,
+ .../tiny_mce/plugins/template/js/template.js,
+ .../tiny_mce/plugins/template/langs/en_dlg.js,
+ .../tiny_mce/plugins/template/template.htm,
+ .../tiny_mce/plugins/visualchars/editor_plugin.js,
+ .../plugins/visualchars/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm,
+ .../tiny_mce/plugins/xhtmlxtras/acronym.htm,
+ .../tiny_mce/plugins/xhtmlxtras/attributes.htm,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm,
+ .../tiny_mce/plugins/xhtmlxtras/css/attributes.css,
+ .../tiny_mce/plugins/xhtmlxtras/css/popup.css,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/del.htm,
+ .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js,
+ .../plugins/xhtmlxtras/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm,
+ .../tiny_mce/plugins/xhtmlxtras/js/abbr.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/acronym.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/attributes.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/cite.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js,
+ .../plugins/xhtmlxtras/js/element_common.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js,
+ .../tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/about.htm,
+ .../jscripts/tiny_mce/themes/advanced/anchor.htm,
+ .../jscripts/tiny_mce/themes/advanced/charmap.htm,
+ .../tiny_mce/themes/advanced/color_picker.htm,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/advanced/image.htm,
+ .../tiny_mce/themes/advanced/img/colorpicker.jpg,
+ .../tiny_mce/themes/advanced/img/icons.gif,
+ .../jscripts/tiny_mce/themes/advanced/js/about.js,
+ .../jscripts/tiny_mce/themes/advanced/js/anchor.js,
+ .../tiny_mce/themes/advanced/js/charmap.js,
+ .../tiny_mce/themes/advanced/js/color_picker.js,
+ .../jscripts/tiny_mce/themes/advanced/js/image.js,
+ .../jscripts/tiny_mce/themes/advanced/js/link.js,
+ .../tiny_mce/themes/advanced/js/source_editor.js,
+ .../jscripts/tiny_mce/themes/advanced/langs/en.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/link.htm,
+ .../themes/advanced/skins/default/content.css,
+ .../themes/advanced/skins/default/dialog.css,
+ .../themes/advanced/skins/default/img/buttons.png,
+ .../themes/advanced/skins/default/img/items.gif,
+ .../advanced/skins/default/img/menu_arrow.gif,
+ .../advanced/skins/default/img/menu_check.gif,
+ .../themes/advanced/skins/default/img/progress.gif,
+ .../themes/advanced/skins/default/img/tabs.gif,
+ .../tiny_mce/themes/advanced/skins/default/ui.css,
+ .../themes/advanced/skins/o2k7/content.css,
+ .../tiny_mce/themes/advanced/skins/o2k7/dialog.css,
+ .../themes/advanced/skins/o2k7/img/button_bg.png,
+ .../advanced/skins/o2k7/img/button_bg_black.png,
+ .../advanced/skins/o2k7/img/button_bg_silver.png,
+ .../tiny_mce/themes/advanced/skins/o2k7/ui.css,
+ .../themes/advanced/skins/o2k7/ui_black.css,
+ .../themes/advanced/skins/o2k7/ui_silver.css,
+ .../tiny_mce/themes/advanced/source_editor.htm,
+ .../tiny_mce/themes/simple/editor_template.js,
+ .../tiny_mce/themes/simple/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/simple/img/icons.gif,
+ .../jscripts/tiny_mce/themes/simple/langs/en.js,
+ .../themes/simple/skins/default/content.css,
+ .../tiny_mce/themes/simple/skins/default/ui.css,
+ .../tiny_mce/themes/simple/skins/o2k7/content.css,
+ .../themes/simple/skins/o2k7/img/button_bg.png,
+ .../tiny_mce/themes/simple/skins/o2k7/ui.css,
+ mod/tinymce/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_popup.js,
+ .../jscripts/tiny_mce/utils/editable_selects.js,
+ .../tinymce/jscripts/tiny_mce/utils/form_utils.js,
+ .../tinymce/jscripts/tiny_mce/utils/mctabs.js,
+ .../tinymce/jscripts/tiny_mce/utils/validate.js,
+ mod/tinymce/vendor/tinymce/changelog.txt,
+ .../vendor/tinymce/jscripts/tiny_mce/langs/en.js,
+ .../vendor/tinymce/jscripts/tiny_mce/license.txt,
+ .../jscripts/tiny_mce/plugins/advhr/css/advhr.css,
+ .../tiny_mce/plugins/advhr/editor_plugin.js,
+ .../tiny_mce/plugins/advhr/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advhr/js/rule.js,
+ .../tiny_mce/plugins/advhr/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advhr/rule.htm,
+ .../tiny_mce/plugins/advimage/css/advimage.css,
+ .../tiny_mce/plugins/advimage/editor_plugin.js,
+ .../tiny_mce/plugins/advimage/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advimage/image.htm,
+ .../tiny_mce/plugins/advimage/img/sample.gif,
+ .../jscripts/tiny_mce/plugins/advimage/js/image.js,
+ .../tiny_mce/plugins/advimage/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlink/css/advlink.css,
+ .../tiny_mce/plugins/advlink/editor_plugin.js,
+ .../tiny_mce/plugins/advlink/editor_plugin_src.js,
+ .../tiny_mce/plugins/advlink/js/advlink.js,
+ .../tiny_mce/plugins/advlink/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advlink/link.htm,
+ .../tiny_mce/plugins/advlist/editor_plugin.js,
+ .../tiny_mce/plugins/advlist/editor_plugin_src.js,
+ .../tiny_mce/plugins/autoresize/editor_plugin.js,
+ .../plugins/autoresize/editor_plugin_src.js,
+ .../tiny_mce/plugins/autosave/editor_plugin.js,
+ .../tiny_mce/plugins/autosave/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/autosave/langs/en.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin_src.js,
+ .../tiny_mce/plugins/contextmenu/editor_plugin.js,
+ .../plugins/contextmenu/editor_plugin_src.js,
+ .../plugins/directionality/editor_plugin.js,
+ .../plugins/directionality/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/editor_plugin.js,
+ .../tiny_mce/plugins/emotions/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/emotions.htm,
+ .../tiny_mce/plugins/emotions/img/smiley-cool.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-cry.gif,
+ .../plugins/emotions/img/smiley-embarassed.gif,
+ .../plugins/emotions/img/smiley-foot-in-mouth.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-frown.gif,
+ .../plugins/emotions/img/smiley-innocent.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-kiss.gif,
+ .../plugins/emotions/img/smiley-laughing.gif,
+ .../plugins/emotions/img/smiley-money-mouth.gif,
+ .../plugins/emotions/img/smiley-sealed.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-smile.gif,
+ .../plugins/emotions/img/smiley-surprised.gif,
+ .../plugins/emotions/img/smiley-tongue-out.gif,
+ .../plugins/emotions/img/smiley-undecided.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-wink.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-yell.gif,
+ .../tiny_mce/plugins/emotions/js/emotions.js,
+ .../tiny_mce/plugins/emotions/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/example/dialog.htm,
+ .../tiny_mce/plugins/example/editor_plugin.js,
+ .../tiny_mce/plugins/example/editor_plugin_src.js,
+ .../tiny_mce/plugins/example/img/example.gif,
+ .../jscripts/tiny_mce/plugins/example/js/dialog.js,
+ .../jscripts/tiny_mce/plugins/example/langs/en.js,
+ .../tiny_mce/plugins/example/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullpage/css/fullpage.css,
+ .../tiny_mce/plugins/fullpage/editor_plugin.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/fullpage.htm,
+ .../tiny_mce/plugins/fullpage/js/fullpage.js,
+ .../tiny_mce/plugins/fullpage/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullscreen/editor_plugin.js,
+ .../plugins/fullscreen/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullscreen/fullscreen.htm,
+ .../tiny_mce/plugins/iespell/editor_plugin.js,
+ .../tiny_mce/plugins/iespell/editor_plugin_src.js,
+ .../tiny_mce/plugins/inlinepopups/editor_plugin.js,
+ .../plugins/inlinepopups/editor_plugin_src.js,
+ .../inlinepopups/skins/clearlooks2/img/alert.gif,
+ .../inlinepopups/skins/clearlooks2/img/button.gif,
+ .../inlinepopups/skins/clearlooks2/img/buttons.gif,
+ .../inlinepopups/skins/clearlooks2/img/confirm.gif,
+ .../inlinepopups/skins/clearlooks2/img/corners.gif,
+ .../skins/clearlooks2/img/horizontal.gif,
+ .../skins/clearlooks2/img/vertical.gif,
+ .../inlinepopups/skins/clearlooks2/window.css,
+ .../tiny_mce/plugins/inlinepopups/template.htm,
+ .../plugins/insertdatetime/editor_plugin.js,
+ .../plugins/insertdatetime/editor_plugin_src.js,
+ .../tiny_mce/plugins/layer/editor_plugin.js,
+ .../tiny_mce/plugins/layer/editor_plugin_src.js,
+ .../tiny_mce/plugins/legacyoutput/editor_plugin.js,
+ .../plugins/legacyoutput/editor_plugin_src.js,
+ .../tiny_mce/plugins/media/css/content.css,
+ .../jscripts/tiny_mce/plugins/media/css/media.css,
+ .../tiny_mce/plugins/media/editor_plugin.js,
+ .../tiny_mce/plugins/media/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/img/flash.gif,
+ .../tiny_mce/plugins/media/img/flv_player.swf,
+ .../tiny_mce/plugins/media/img/quicktime.gif,
+ .../tiny_mce/plugins/media/img/realmedia.gif,
+ .../tiny_mce/plugins/media/img/shockwave.gif,
+ .../jscripts/tiny_mce/plugins/media/img/trans.gif,
+ .../tiny_mce/plugins/media/img/windowsmedia.gif,
+ .../jscripts/tiny_mce/plugins/media/js/embed.js,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/media/media.htm,
+ .../tiny_mce/plugins/nonbreaking/editor_plugin.js,
+ .../plugins/nonbreaking/editor_plugin_src.js,
+ .../tiny_mce/plugins/noneditable/editor_plugin.js,
+ .../plugins/noneditable/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/css/content.css,
+ .../tiny_mce/plugins/pagebreak/editor_plugin.js,
+ .../plugins/pagebreak/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/img/pagebreak.gif,
+ .../tiny_mce/plugins/pagebreak/img/trans.gif,
+ .../tiny_mce/plugins/paste/editor_plugin.js,
+ .../tiny_mce/plugins/paste/editor_plugin_src.js,
+ .../tiny_mce/plugins/paste/js/pastetext.js,
+ .../tiny_mce/plugins/paste/js/pasteword.js,
+ .../tiny_mce/plugins/paste/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/paste/pastetext.htm,
+ .../jscripts/tiny_mce/plugins/paste/pasteword.htm,
+ .../tiny_mce/plugins/preview/editor_plugin.js,
+ .../tiny_mce/plugins/preview/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/preview/example.html,
+ .../tiny_mce/plugins/preview/jscripts/embed.js,
+ .../jscripts/tiny_mce/plugins/preview/preview.html,
+ .../tiny_mce/plugins/print/editor_plugin.js,
+ .../tiny_mce/plugins/print/editor_plugin_src.js,
+ .../tiny_mce/plugins/save/editor_plugin.js,
+ .../tiny_mce/plugins/save/editor_plugin_src.js,
+ .../plugins/searchreplace/css/searchreplace.css,
+ .../plugins/searchreplace/editor_plugin.js,
+ .../plugins/searchreplace/editor_plugin_src.js,
+ .../plugins/searchreplace/js/searchreplace.js,
+ .../tiny_mce/plugins/searchreplace/langs/en_dlg.js,
+ .../plugins/searchreplace/searchreplace.htm,
+ .../tiny_mce/plugins/spellchecker/css/content.css,
+ .../tiny_mce/plugins/spellchecker/editor_plugin.js,
+ .../plugins/spellchecker/editor_plugin_src.js,
+ .../tiny_mce/plugins/spellchecker/img/wline.gif,
+ .../jscripts/tiny_mce/plugins/style/css/props.css,
+ .../tiny_mce/plugins/style/editor_plugin.js,
+ .../tiny_mce/plugins/style/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/style/js/props.js,
+ .../tiny_mce/plugins/style/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/style/props.htm,
+ .../tiny_mce/plugins/tabfocus/editor_plugin.js,
+ .../tiny_mce/plugins/tabfocus/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/cell.htm,
+ .../jscripts/tiny_mce/plugins/table/css/cell.css,
+ .../jscripts/tiny_mce/plugins/table/css/row.css,
+ .../jscripts/tiny_mce/plugins/table/css/table.css,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/cell.js,
+ .../tiny_mce/plugins/table/js/merge_cells.js,
+ .../jscripts/tiny_mce/plugins/table/js/row.js,
+ .../jscripts/tiny_mce/plugins/table/js/table.js,
+ .../tiny_mce/plugins/table/langs/en_dlg.js,
+ .../tiny_mce/plugins/table/merge_cells.htm,
+ .../jscripts/tiny_mce/plugins/table/row.htm,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../jscripts/tiny_mce/plugins/template/blank.htm,
+ .../tiny_mce/plugins/template/css/template.css,
+ .../tiny_mce/plugins/template/editor_plugin.js,
+ .../tiny_mce/plugins/template/editor_plugin_src.js,
+ .../tiny_mce/plugins/template/js/template.js,
+ .../tiny_mce/plugins/template/langs/en_dlg.js,
+ .../tiny_mce/plugins/template/template.htm,
+ .../tiny_mce/plugins/visualchars/editor_plugin.js,
+ .../plugins/visualchars/editor_plugin_src.js,
+ .../tiny_mce/plugins/wordcount/editor_plugin.js,
+ .../plugins/wordcount/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm,
+ .../tiny_mce/plugins/xhtmlxtras/acronym.htm,
+ .../tiny_mce/plugins/xhtmlxtras/attributes.htm,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm,
+ .../tiny_mce/plugins/xhtmlxtras/css/attributes.css,
+ .../tiny_mce/plugins/xhtmlxtras/css/popup.css,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/del.htm,
+ .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js,
+ .../plugins/xhtmlxtras/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm,
+ .../tiny_mce/plugins/xhtmlxtras/js/abbr.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/acronym.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/attributes.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/cite.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js,
+ .../plugins/xhtmlxtras/js/element_common.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js,
+ .../tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/about.htm,
+ .../jscripts/tiny_mce/themes/advanced/anchor.htm,
+ .../jscripts/tiny_mce/themes/advanced/charmap.htm,
+ .../tiny_mce/themes/advanced/color_picker.htm,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/advanced/image.htm,
+ .../tiny_mce/themes/advanced/img/colorpicker.jpg,
+ .../tiny_mce/themes/advanced/img/icons.gif,
+ .../jscripts/tiny_mce/themes/advanced/js/about.js,
+ .../jscripts/tiny_mce/themes/advanced/js/anchor.js,
+ .../tiny_mce/themes/advanced/js/charmap.js,
+ .../tiny_mce/themes/advanced/js/color_picker.js,
+ .../jscripts/tiny_mce/themes/advanced/js/image.js,
+ .../jscripts/tiny_mce/themes/advanced/js/link.js,
+ .../tiny_mce/themes/advanced/js/source_editor.js,
+ .../jscripts/tiny_mce/themes/advanced/langs/en.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/link.htm,
+ .../themes/advanced/skins/default/content.css,
+ .../themes/advanced/skins/default/dialog.css,
+ .../themes/advanced/skins/default/img/buttons.png,
+ .../themes/advanced/skins/default/img/items.gif,
+ .../advanced/skins/default/img/menu_arrow.gif,
+ .../advanced/skins/default/img/menu_check.gif,
+ .../themes/advanced/skins/default/img/progress.gif,
+ .../themes/advanced/skins/default/img/tabs.gif,
+ .../tiny_mce/themes/advanced/skins/default/ui.css,
+ .../themes/advanced/skins/o2k7/content.css,
+ .../tiny_mce/themes/advanced/skins/o2k7/dialog.css,
+ .../themes/advanced/skins/o2k7/img/button_bg.png,
+ .../advanced/skins/o2k7/img/button_bg_black.png,
+ .../advanced/skins/o2k7/img/button_bg_silver.png,
+ .../tiny_mce/themes/advanced/skins/o2k7/ui.css,
+ .../themes/advanced/skins/o2k7/ui_black.css,
+ .../themes/advanced/skins/o2k7/ui_silver.css,
+ .../tiny_mce/themes/advanced/source_editor.htm,
+ .../tiny_mce/themes/simple/editor_template.js,
+ .../tiny_mce/themes/simple/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/simple/img/icons.gif,
+ .../jscripts/tiny_mce/themes/simple/langs/en.js,
+ .../themes/simple/skins/default/content.css,
+ .../tiny_mce/themes/simple/skins/default/ui.css,
+ .../tiny_mce/themes/simple/skins/o2k7/content.css,
+ .../themes/simple/skins/o2k7/img/button_bg.png,
+ .../tiny_mce/themes/simple/skins/o2k7/ui.css,
+ .../vendor/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_popup.js,
+ .../jscripts/tiny_mce/utils/editable_selects.js,
+ .../tinymce/jscripts/tiny_mce/utils/form_utils.js,
+ .../tinymce/jscripts/tiny_mce/utils/mctabs.js,
+ .../tinymce/jscripts/tiny_mce/utils/validate.js,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php: Upgraded TinyMCE to 3.3.6.
+
+2010-05-29 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/breadcrumbs.php: added a hint on breadcrumb usage
+
+ * views/default/page_elements/owner_block.php: removed some code made
+ unnecessary by the changes to layout in 1.8
+
+ * views/default/page_elements/elgg_sidebar.php: updated documentation on
+ optional parameters
+
+ * views/default/canvas/layouts/administration.php: updated administration
+ layout to work with new sidebar view
+
+2010-05-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/sidebar_menu.php,
+ views/default/page_elements/elgg_sidebar.php,
+ views/default/page_elements/owner_block.php: sidebar menu deserves its own
+ view
+
+2010-05-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php: Refs #2115: Added
+ elgg_is_valid_view_type(). Currently calculated at each load but will want to
+ cache like view paths. Cleaned up autoregister_views() and load_plugins()
+ code. Added spaces between function params in numerous places. C'mon
+ guys...spaces are free.
+
+2010-05-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/editdefaultprofileitems.php: Removed debug log to
+ console as it was preventing FF from executing the rest of the callback
+ function.
+
+2010-05-28 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php: when editing details, return to the details
+ tab when done.
+
+2010-05-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/appearance/menu_items.php,
+ views/default/canvas/layouts/administration.php: Updated interface for custom
+ menu items
+
+ * mod/profile/views/default/profile/css.php,
+ .../default/profile/editdefaultprofileitems.php: Updated interface for edit
+ profile fields
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/sidebar_menu.php: Updated archive list-style
+
+2010-05-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: Fixed mismatched <span></a> tags
+ in blog list status display.
+
+ * mod/blog/views/default/blog/sidebar_menu.php: Fixed typo in blog sidebar
+ menu that caused an extra LI item in archives.
+
+2010-05-27 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Registering user password request/reset as public
+ actions.
+
+2010-05-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: Fixing code for JS userpicker remove
+ function to cope with recent structure changes.
+
+2010-05-27 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cron.php, engine/lib/sites.php, mod/sitepages/start.php:
+ Updating walled garden to register public pages as regular expressions.
+
+2010-05-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php,
+ .../views/default/profile/profile_navigation.php: removed hard coded lang in
+ profile tabs
+
+2010-05-26 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/start.php, .../notifications/settings/usersettings.php:
+ Un-extending core notification view in favor of Notifications plugin.
+
+ * mod/sitepages/actions/add.php, mod/sitepages/actions/addfront.php,
+ mod/sitepages/actions/addfrontsimple.php, mod/sitepages/actions/addmeta.php,
+ mod/sitepages/actions/edit_settings.php,
+ mod/sitepages/sitepages_functions.php, mod/sitepages/start.php,
+ .../views/default/settings/sitepages/edit.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../views/default/sitepages/forms/editfront.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/menu.php: Updating Sitepages plugin
+ settings for new administration layout.
+
+2010-05-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php: Gatekeeper() added to blog edit/create pagehandler.
+
+ * engine/lib/entities.php: Fix problem rewriting type_subtype_pair ->
+ type_subtype_pairs in elgg_get_entities().
+
+2010-05-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/forums/addtopic.php: group discussion
+ access defaults to the group
+
+2010-05-26 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php, mod/groups/start.php: Ensuring Blogs and Forum links
+ display properly in the group ownerblock.
+
+2010-05-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/content_header.php: small tweak to header
+ contents
+
+ * mod/bookmarks/start.php: bookmark header bug fixed
+
+2010-05-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../page_elements/content_header_member.php: Updated content area title
+ when viewing a users objects
+
+ * .../views/default/profile/profile_ownerblock.php: Additional links to
+ tools added to profile pages ownerblock (hardcoded for phase1)
+
+2010-05-25 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/defaultwidgets/actions/update.php, mod/defaultwidgets/dashboard.php,
+ mod/defaultwidgets/profile.php, mod/defaultwidgets/start.php,
+ .../admin/appearance/default_dashboard_widgets.php,
+ .../admin/appearance/default_profile_widgets.php, mod/logbrowser/index.php,
+ mod/logbrowser/start.php, .../views/default/admin/overview/logbrowser.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/profile/defaultprofile.php, mod/profile/start.php,
+ .../default/admin/appearance/defaultprofile.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/index.php,
+ mod/reportedcontent/start.php,
+ .../default/admin/overview/reportedcontent.php: Updating administration
+ plugins with admin submenu views.
+
+2010-05-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/tabs.php: Navigation/tabs uses output/url for the
+ links.
+
+ * views/default/output/url.php: Added title to output/url. Fixed typo
+ breaking js support in output/url.
+
+ * CHANGES.txt: Added changes to CHANGES.txt.
+
+ * views/default/output/url.php: Fixed documentation for output/url view.
+
+ * views/default/output/url.php: Added title to url output.
+
+2010-05-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/start.php: change the bookmark header depending on whose
+ bookmarks are being viewed
+
+2010-05-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Updated documentation for register_plugin_hook().
+
+ * engine/lib/elgglib.php: Updated documentation and cleaned up code for
+ trigger_plugin_hook().
+
+2010-05-25 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/walled_garden_background_bottom.gif,
+ _graphics/walled_garden_background_extend.gif,
+ _graphics/walled_garden_background_top.gif, engine/lib/elgglib.php,
+ .../default/account/forms/login_walled_garden.php, views/default/css.php,
+ views/default/page_shells/walled_garden.php: Walled Garden login page is no
+ longer tied to the default page shell.
+
+2010-05-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: only display comment count if
+ there are comments
+
+ * mod/blog/blog_lib.php: check to see if comments are on or off
+
+ * mod/blog/views/default/blog/sidebar_revisions.php: blog revisions tweaked
+
+2010-05-25 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/defaultwidgets/dashboard.php, mod/defaultwidgets/profile.php,
+ mod/defaultwidgets/start.php, .../views/default/defaultwidgets/editor.php:
+ Updating Default Widgets administration to use new canvas layout.
+
+2010-05-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/css.php: Fix for blogs list view interface in
+ some browsers
+
+2010-05-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php: comment wall notification message tweaked
+
+2010-05-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_revisions.php: Updates to Blogs edit UI.
+
+2010-05-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../page_elements/content_header_member.php: content header added for use
+ when viewing another user
+
+ * mod/tagcloud/all.php, mod/tagcloud/tagcloud.php: added an all site
+ tagcloud view, tagcloud.php will be customised to run in the sidebar.
+
+2010-05-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php: UI update to avatar menu
+ list-style.
+
+2010-05-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../canvas/layouts/one_column_with_sidebar.php,
+ views/default/page_elements/elgg_sidebar.php: Refs #2114 - added elgg_sidebar
+ view
+
+2010-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/languages/en.php, mod/blog/views/default/object/blog.php: Added
+ blog author link by line on blog list.
+
+ * mod/blog/views/default/object/blog.php: Added access level in blog list.
+
+ * views/default/output/access.php: Added output/access view for displaying
+ entity access levels.
+
+2010-05-24 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/index.php, mod/logbrowser/start.php, mod/profile/start.php,
+ mod/reportedcontent/start.php, mod/sitepages/start.php: Updating multiple
+ plugins to no longer register admin menus with an event hook.
+
+2010-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/save.php, mod/blog/blog_lib.php,
+ mod/blog/views/default/object/blog.php: Blog uses elgg_make_excerpt() now
+ instead of its own.
+
+ * engine/lib/output.php: Replacing '...' with html elipse character (&#8230)
+ in elgg_make_excerpt().
+
+ * engine/lib/river.php: Copied explaination for weird str_replace() in
+ get_river_items() to the same call in elgg_get_river_items_new() so I stay
+ sane.
+
+ * mod/blog/actions/blog/save.php, mod/blog/blog_lib.php,
+ mod/blog/views/default/blog/forms/edit.php: Removing publish_date interface
+ for blogs pending better l10n for dates.
+
+ * mod/blog/start.php: Removing blogs from groups, part 2.
+
+ * mod/blog/start.php: Removing blog options from groups, part 1.
+
+2010-05-24 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php: Only notifying name change when it actually
+ changed.
+
+ * views/default/output/url.php: Ensuring text displays on URL view for both
+ "value" and "html" sent as property.
+
+2010-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php: Moved blog edit sidebar revisions to the top of the
+ sidebar.
+
+2010-05-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/object/blog/create.php,
+ .../default/river/object/bookmarks/create.php: you can no longer comment on
+ river item while logged out
+
+2010-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/forms/edit.php: Blog edit/create form displays
+ correct title.
+
+ * mod/blog/actions/blog/save.php: Blogs only show up in the river if in
+ published state.
+
+ * mod/riverdashboard/endpoint/ping.php: Added access controls to the
+ activity stream update count.
+
+ * mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/js.php: The activity stream's count uses the
+ river table instead of trying to combine entities + annotations based up on
+ time_created. Also brought small bits of code up to standards.
+
+2010-05-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php, views/default/css.php: UI
+ updates to users links and admin menu on profile pages
+
+2010-05-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/views/default/sitepages/menu.php: the correct tab now
+ highlights
+
+2010-05-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php: Saving a blog post no longer rewrites all entity
+ time_created and time_updated fields. Yikes.
+
+2010-05-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php, views/default/css.php:
+ Updated css for admin area/plugins and submenu list style
+
+ * mod/profile/views/default/profile/css.php, views/default/css.php: Added
+ missing formatting to user-generated content
+
+2010-05-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/start.php: messages now display the correct number unread
+
+2010-05-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Updated group forum link to only appear in group
+ ownerblock, and when group forum is enabled.
+
+ * mod/messages/views/default/messages/forms/send.php: Updated 'Send a
+ message to' form to display users display name rather than username.
+
+2010-05-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/invite.php: Small tweak to group
+ invite friends so it will show your friends correctly
+
+2010-05-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php: Group forum link added
+ to group ownerblock
+
+2010-05-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/index.php: sitepages river tweak
+
+ * mod/sitepages/index.php: sitepages now displays the correct river
+
+ * mod/riverdashboard/index.php,
+ .../views/default/settings/riverdashboard/edit.php: activity type toggle
+ removed as it was poorly thought out and implemented.
+
+ * mod/sitepages/actions/addfrontsimple.php, mod/sitepages/index.php,
+ mod/sitepages/languages/en.php, mod/sitepages/sitepages_functions.php,
+ mod/sitepages/start.php, .../views/default/canvas/layouts/frontpage.php,
+ mod/sitepages/views/default/sitepages/css.php,
+ .../default/sitepages/forms/editfrontsimple.php,
+ mod/sitepages/views/default/sitepages/members.php,
+ mod/sitepages/views/default/sitepages/sidebar.php,
+ mod/sitepages/views/default/sitepages/welcome.php: a simple version of the
+ sitepages index - we will need to turn this into a basic and advance
+ selection for admins.
+
+2010-05-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ views/default/page_elements/owner_block.php: Ownerblock links to users
+ objects interface updated.
+
+ * mod/groups/start.php: Group link to forum removed from sidebar submenu
+
+ * mod/blog/start.php, mod/bookmarks/start.php: Group blog and bookmarks
+ submenu removed from sidebar (links are now in the group ownerblock)
+
+2010-05-23 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/page_shells/default.php, views/foaf/pageshells/pageshell.php,
+ views/php/page_shells/default.php, views/php/pageshells/pageshell.php,
+ views/xml/page_shells/default.php, views/xml/pageshells/pageshell.php: fixed
+ page shells for xml, php, and foaf
+
+2010-05-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php,
+ .../views/default/reportedcontent/footer_link.php: added title attribute to
+ report this footer link
+
+ * mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/footer_link.php,
+ views/default/page_elements/elgg_footer.php: removing reported content
+ dependency from core code...again
+
+ * views/default/page_elements/elgg_footer.php: Fixes #2122 - footer
+ analytics view added
+
+2010-05-21 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: Using a lambda function to
+ sort the profile menu.
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ views/default/page_elements/owner_block.php: Registering new plugin hooks to
+ extend the owner block profile menu.
+
+ * views/default/page_elements/owner_block.php: Fixing a typo. Works this
+ time; no, really.
+
+ * mod/pages/start.php, mod/pages/views/default/pages/profile_extend.php:
+ Updating Pages plugin to extend profile owner block directly with
+ user-specific links.
+
+ * views/default/page_elements/owner_block.php: Cleaning up profile owner
+ blocks to allow for view extensions.
+
+2010-05-20 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/pages/start.php: Adding submenu items for standard plugins to owner
+ block.
+
+2010-05-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/entity_getter_functions.php: Fixes #2159: Updated entity
+ getter test to order by guid instead of time_created.
+
+ * engine/tests/objects/entities.php, engine/tests/objects/objects.php,
+ engine/tests/objects/sites.php, engine/tests/objects/users.php: Update unit
+ tests for last_action column.
+
+ * engine/lib/entities.php, engine/lib/river.php: create_entity() now adds a
+ default last_action set to the same as time_created. This solves a problem of
+ having to specify an order by of last_action desc, time_created desc on each
+ call. Standardized update_entity_last_action() and moved it from river.php to
+ entities.php.
+
+ * engine/lib/river.php: Properly merged old 1.8 river2.php with river.php to
+ fix last_action-based bubble ups.
+
+2010-05-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/content_header.php: small edit to header
+ contents, will need to find a better way to extend this view in the required
+ fashion.
+
+ * mod/bookmarks/start.php: small bookmark add bug fixed.
+
+2010-05-20 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/annotation/default.php, views/rss/object/creator.php,
+ views/rss/object/default.php, views/rss/object/georss.php: Updating RSS views
+ to allow for object creator and geolocation.
+
+2010-05-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/forgotten_password.php, account/register.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php: Updated Register and ForgottenLogin
+ forms to use default canvases.
+
+ * views/default/canvas/layouts/administration.php: Added a link to 'return
+ to network' from admin area.
+
+2010-05-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, languages/en.php,
+ views/default/admin/users/newest.php: Added "Newest Users" admin section.
+
+ * mod/groups/all.php, mod/groups/discussions.php, mod/groups/forum.php,
+ mod/groups/views/default/forum/topics.php: Removed legacy calls from groups.
+
+ * engine/lib/annotations.php: Refs #2165: Added
+ elgg_list_entities_from_annotations() to deprecate
+ list_entities_from_annotations().
+
+ * mod/groups/forum.php: Missed passing group_guid to forum topics.
+
+ * mod/groups/views/default/forum/topics.php: Fixed incorrect call for $vars
+ in group forum topics.
+
+ * mod/riverdashboard/manifest.xml: Riverdashboard enabled on default
+ installs.
+
+ * mod/custom_index/index.php, mod/custom_index/languages/en.php,
+ mod/custom_index/manifest.xml, mod/custom_index/start.php,
+ .../views/default/canvas/layouts/new_index.php,
+ .../views/default/custom_index/css.php: Custom index is deprecated by Site
+ pages. These two provide the same functionality but in different ways, so
+ just moving Custom Index to the plugins repo.
+
+ * mod/externalpages/actions/add.php, mod/externalpages/index.php,
+ mod/externalpages/languages/en.php, mod/externalpages/manifest.xml,
+ mod/externalpages/read.php, mod/externalpages/start.php,
+ .../views/default/expages/analytics.php,
+ mod/externalpages/views/default/expages/css.php,
+ .../views/default/expages/footer_menu.php,
+ .../views/default/expages/forms/edit.php,
+ mod/externalpages/views/default/expages/menu.php,
+ mod/externalpages/views/default/object/expages.php: The Externalpages plugin
+ is now Site Pages. Removing old plugin.
+
+2010-05-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/jquery/jquery-1.4.2.min.js, vendors/jquery/jquery-1.4.min.js,
+ views/default/page_elements/html_begin.php: jQuery updated to v1.4.2
+
+ * mod/groups/views/default/groups/css.php: Small UI update to Group activity
+ widget.
+
+ * views/default/annotation/annotatelike.php: Likes river entry timestamp
+ wrapped in span.
+
+2010-05-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Moved output.php into the pre-installation required lib
+ list to fix trunk installation.
+
+2010-05-18 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/graphics/background_bottom.gif,
+ mod/walledgarden/graphics/background_extend.gif,
+ mod/walledgarden/graphics/background_top.gif, mod/walledgarden/index.php,
+ mod/walledgarden/languages/en.php, mod/walledgarden/manifest.xml,
+ mod/walledgarden/readme.txt, mod/walledgarden/start.php,
+ .../views/default/account/forms/login.php,
+ .../default/page_shells/walled_garden_index.php,
+ .../views/default/walledgarden/css.php,
+ .../views/default/walledgarden/walledgarden.php: Removing Walled Garden
+ plugin from trunk.
+
+ * engine/lib/elgglib.php, engine/lib/sites.php: Ensuring the Walled Garden
+ hook properly exits before plugins can continue to extend view.
+
+ * views/json/canvas/default.php, views/json/page_shells/default.php,
+ views/json/pageshells/pageshell.php: Updating the core JSON views to allow
+ for proper object export.
+
+2010-05-18 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/members/index.php: browse members now working for 1.8
+
+ * languages/en.php, views/default/account/forms/login.php,
+ views/default/account/forms/login_dropdown.php: as you can login with either
+ username or email, reflect this in the lang.
+
+2010-05-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/components/plugin_settings.php,
+ views/default/canvas/layouts/administration.php: Interface updates to plugins
+ settings form.
+
+2010-05-18 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: small lang changes
+
+2010-05-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php: Admin area long-text
+ fields width updated.
+
+2010-05-17 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/river/item/list.php: Defaulting RSS view to use Elgg Entity
+ view.
+
+ * views/rss/object/default.php, views/rss/page_shells/default.php,
+ views/rss/pageshells/pageshell.php, views/rss/river/item/list.php: Updating
+ RSS feeds to use proper views called with page_shells.
+
+2010-05-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/css.php: Another UI update to individual blog
+ page.
+
+ * mod/blog/views/default/blog/css.php,
+ mod/profile/views/default/profile/css.php: ..a couple more ui tweaks.
+
+ * mod/messages/views/default/messages/forms/view.php,
+ mod/profile/graphics/speech_bubble_tail.gif,
+ mod/profile/graphics/twitter16px.png,
+ views/default/canvas/layouts/administration.php: A few UI updates.
+
+2010-05-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/css.php, views/default/css.php: Updates
+ to core css UI and riverdashboard mod.
+
+2010-05-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Fixed loading of activity and database files.
+
+ * engine/lib/actions.php, engine/lib/activity.php, engine/lib/api.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/input.php,
+ engine/lib/output.php, engine/lib/pagehandler.php, engine/lib/river.php,
+ engine/lib/river2.php, engine/lib/sessions.php, engine/start.php,
+ htaccess_dist, languages/en.php, mod/groups/invitations.php,
+ mod/groups/new.php, mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ .../views/default/river/object/page/create.php, mod/profile/actions/edit.php:
+ Merged 5928-6908 from 1.7 branch to trunk.
+
+ * actions/widgets/save.php, engine/lib/access.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/notification.php, engine/lib/river2.php,
+ engine/lib/sessions.php, engine/lib/system_log.php, engine/lib/tags.php,
+ engine/lib/users.php, mod/groups/forum.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/index.php,
+ mod/invitefriends/languages/en.php, mod/invitefriends/start.php,
+ .../views/default/invitefriends/form.php,
+ .../views/default/invitefriends/formitems.php, mod/profile/icon.php,
+ views/default/friends/river/create.php, views/rss/entities/entity_list.php:
+ merge -r5898:5928 (not excluding riverdashboard, notifications, and
+ messageboard) from 1.7 to trunk.
+
+2010-05-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php: Updated admin area css
+
+2010-05-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/actions.php, engine/lib/api.php,
+ engine/lib/elgglib.php, engine/lib/notification.php, engine/lib/river2.php,
+ mod/invitefriends/actions/invite.php, services/api/rest_api.php: merge
+ -r5832:5898 from 1.7 to trunk.
+
+ * views/foaf/pageshells/pageshell.php, views/foaf/user/default.php: merge
+ -r5822:5825 from 1.7 to trunk.
+
+ * engine/lib/xml.php, mod/file/actions/upload.php,
+ mod/groups/actions/forums/deletepost.php: Merge r5761:5788 from 1.7 to trunk.
+
+
+2010-05-14 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php: Moving login/extend view to call
+ after the login button (consistent with login dropdown).
+
+ * engine/lib/sites.php, languages/en.php: Updating language files for new
+ Walled Garden support.
+
+ * _css/css.php, _css/js.php, engine/handlers/action_handler.php,
+ engine/handlers/cron_handler.php, engine/handlers/pagehandler.php,
+ engine/handlers/service_handler.php, engine/handlers/xml-rpc_handler.php,
+ engine/lib/cron.php, engine/lib/sites.php, index.php,
+ mod/externalpages/read.php, upgrade.php: Updating core code to allow public
+ pages using new Walled Garden functionality.
+
+2010-05-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/sidebar_menu.php, mod/tagcloud/tagcloud.php,
+ mod/tagcloud/views/default/tagcloud/css.php, views/default/css.php,
+ views/default/output/tagcloud.php: Updated core tagcloud view markup/css.
+
+2010-05-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/views/default/output/tagcloud.php: Removing tagcloud output
+ view from tagcloud mod--it's in core now.
+
+2010-05-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/administration.php, views/default/css.php:
+ Update to submenu items css.
+
+ * mod/profile/defaultprofile.php, mod/reportedcontent/index.php,
+ mod/sitepages/sitepages_functions.php: Updated plugins to use new admin area
+ canvas.
+
+2010-05-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: To detect if a submenu item is selected, using
+ output from full_url() instead of $_SERVER['REQUEST_URI'] because the host
+ isn't set in REQUEST_URI.
+
+2010-05-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, views/default/canvas/layouts/administration.php,
+ views/default/css.php: Beginnings of a stand-alone admin area.
+
+ * mod/profile/views/default/profile/icon.php: Fix for @mentions mod creating
+ multiple hrefs in avatar submenu.
+
+ * views/default/admin/overview.php, views/default/admin/site/advanced.php,
+ views/default/admin/site/basic.php, views/default/admin/users/add.php,
+ views/default/admin/users/find.php, views/default/admin/users/online.php:
+ Added content titles to admin area pages.
+
+2010-05-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php: removed extra div from riverdashboard index
+ page
+
+ * mod/riverdashboard/start.php, .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php: merged [5959] from 1.7 branch into
+ trunk for riverdashboard plugin
+
+ * mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/ecml/activity.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/default/settings/riverdashboard/edit.php: attempting to standardize
+ riverdashboard plugin in similar manner as 1.7 branch revision [5943]
+
+ * mod/notifications/actions/groupsave.php,
+ mod/notifications/actions/save.php, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/notifications/languages/en.php,
+ mod/notifications/start.php, .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/jsfuncs.php,
+ .../notifications/subscriptions/personal.php: merged in notifications plugin
+ cleanup from 1.7 branch: [5962], [5978] - [5980], [6000]
+
+2010-05-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messageboard/actions/add.php, mod/messageboard/actions/delete.php,
+ mod/messageboard/ajax_endpoint/load.php, mod/messageboard/history.php,
+ mod/messageboard/index.php, mod/messageboard/languages/en.php,
+ mod/messageboard/readme.txt, mod/messageboard/start.php,
+ .../views/default/messageboard/css.php,
+ .../views/default/messageboard/forms/add.php,
+ .../default/messageboard/group_messageboard.php,
+ .../views/default/messageboard/messageboard.php,
+ .../default/messageboard/messageboard_content.php,
+ .../default/river/object/messageboard/create.php,
+ .../views/default/widgets/messageboard/edit.php,
+ .../views/default/widgets/messageboard/view.php: merging messageboard cleanup
+ from 1.7 branch [5908],[5909],[5917]
+
+2010-05-12 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/register.php, engine/lib/elgglib.php, engine/lib/sites.php,
+ mod/sitepages/start.php: Creating a hook for plugin authors to register
+ Walled Garden public sites.
+
+2010-05-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/languages/en.php: removed a duplicate lang string
+
+ * .../views/default/bookmarks/group_bookmarks.php: fix so group bookmarks
+ display on group frontpage
+
+2010-05-11 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_advanced.php,
+ actions/systemsettings/install.php, engine/lib/elgglib.php,
+ engine/lib/sites.php, engine/lib/upgrades/2010050701.php,
+ views/default/admin/site/advanced.php: Do not display site pages when in
+ Walled Garden mode, excepting system-defined whitelist.
+
+ * account/register.php: Not allowing new user registration to continue
+ action when disabled.
+
+2010-05-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Fixed a typo.
+
+ * engine/lib/admin.php, engine/lib/elgglib.php,
+ views/default/navigation/submenu_item.php: Fix admin area for overview and
+ appearance.
+
+2010-05-10 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/elgg_topbar_logout.php: Breaking logout link into
+ a separate view.
+
+2010-05-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/tests/ui/submenu.php,
+ .../default/admin/components/admin_page_layout.php,
+ views/default/admin/components/sidemenu.php,
+ views/default/navigation/submenu_item.php, views/default/output/url.php,
+ views/default/page_elements/owner_block.php: Admin area now uses standard
+ submenu tools.
+
+2010-05-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/basic_elements/welcome.php, views/default/welcome.php,
+ views/default/welcome/logged_in.php, views/default/welcome/logged_out.php:
+ removing more views that haven't been used/touched in almost 2 years
+
+ * views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php: removing some chuff that's been just sitting
+ there for a long time - these views ended up in the external pages/site pages
+ plugins
+
+2010-05-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Not setting $item->selected on a submenu item acts
+ the same as setting it to NULL for selected state guessing. Removed unused
+ code in submenu system.
+
+ * engine/lib/elgglib.php, engine/tests/ui/submenu.php,
+ views/default/canvas_header/submenu_group.php,
+ views/default/canvas_header/submenu_template.php, views/default/css.php,
+ views/default/navigation/submenu_group.php,
+ views/default/navigation/submenu_item.php,
+ views/default/navigation/submenu_js.php: Added new submenu system. Added
+ elgg_http_url_is_identical(). Moved canvas_header/submenu* to
+ navigation/submenu*. Added UI test for submenu.
+
+2010-05-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_advanced.php, actions/register.php,
+ actions/systemsettings/install.php, engine/lib/upgrades/2010050701.php,
+ version.php, views/default/account/forms/login.php,
+ views/default/account/forms/login_dropdown.php,
+ views/default/admin/site/advanced.php: Adding an option to restrict new user
+ registration in advanced site settings. This is the first step in fully
+ merging "Walled Garden" plugin into core Elgg engine.
+
+2010-05-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php,
+ actions/admin/plugins/simple_update_states.php,
+ actions/admin/site/update_advanced.php, actions/admin/site/update_basic.php,
+ actions/login.php, actions/plugins/settings/save.php, actions/register.php,
+ actions/systemsettings/install.php, admin/index.php, admin/menu_items.php,
+ admin/plugins.php, admin/site.php, admin/statistics.php, admin/user.php,
+ engine/lib/actions.php, engine/lib/admin.php, engine/lib/plugins.php,
+ engine/lib/sessions.php, languages/en.php, mod/blog/manifest.xml,
+ mod/blog/views/default/blog/forms/edit.php, mod/bookmarks/manifest.xml,
+ mod/captcha/manifest.xml, mod/categories/actions/save.php,
+ mod/categories/languages/en.php, mod/categories/manifest.xml,
+ mod/categories/settings.php, mod/categories/start.php,
+ mod/categories/views/default/categories/css.php,
+ .../views/default/categories/settings.php,
+ .../views/default/categories/settingsform.php,
+ .../views/default/settings/categories/edit.php, mod/crontrigger/manifest.xml,
+ mod/custom_index/manifest.xml, mod/defaultwidgets/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/ecml/manifest.xml, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/admin/ecml_admin.php,
+ mod/ecml/views/default/settings/ecml/edit.php, mod/embed/manifest.xml,
+ mod/externalpages/manifest.xml, mod/file/manifest.xml,
+ mod/friends/manifest.xml, mod/garbagecollector/manifest.xml,
+ mod/groups/manifest.xml, mod/htmlawed/manifest.xml,
+ mod/invitefriends/manifest.xml, mod/logbrowser/manifest.xml,
+ mod/logrotate/manifest.xml, mod/members/manifest.xml,
+ mod/messageboard/manifest.xml, mod/messages/manifest.xml,
+ mod/notifications/manifest.xml, mod/pages/manifest.xml,
+ mod/profile/manifest.xml, mod/reportedcontent/manifest.xml,
+ mod/riverdashboard/manifest.xml, mod/search/manifest.xml,
+ mod/sitepages/manifest.xml, mod/tagcloud/manifest.xml,
+ mod/thewire/manifest.xml, mod/tinymce/manifest.xml, mod/twitter/manifest.xml,
+ mod/uservalidationbyemail/manifest.xml, mod/walledgarden/manifest.xml,
+ mod/zaudio/manifest.xml, views/default/admin/appearance/menu_items.php,
+ .../default/admin/components/admin_page_layout.php,
+ views/default/admin/components/plugin.php,
+ views/default/admin/components/plugin_settings.php,
+ views/default/admin/components/sidemenu.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/menu_items.php,
+ views/default/admin/overview.php,
+ views/default/admin/overview/numentities.php,
+ views/default/admin/overview/online.php, views/default/admin/plugins.php,
+ views/default/admin/plugins/advanced.php,
+ views/default/admin/plugins/simple.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/site/advanced.php, views/default/admin/site/basic.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/search.php, views/default/admin/users/add.php,
+ views/default/admin/users/find.php, views/default/admin/users/online.php,
+ views/default/css.php, views/default/object/admin_notice.php: Merged
+ 18_new_admin branch to trunk.
+
+2010-05-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/usersettings/form.php: Added ID to submit button on user
+ settings form.
+
+ * views/default/canvas_header/submenu_group.php: Updated submenu with
+ missing groupname.
+
+ * mod/profile/views/default/profile/editicon.php: Addition of a wrapper on
+ edit avatar page for theming purposes.
+
+2010-05-04 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: Returning extended view to
+ original location in code (to preserve CSS rendering).
+
+2010-05-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php: Updated avatar sub-menu font
+ sizes.
+
+2010-05-04 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php, .../views/default/profile/topbar_extend.php:
+ Extending topbar view to include My Friends link.
+
+ * views/default/page_elements/elgg_topbar.php: Removing hard-coded plugin
+ extensions from core topbar.
+
+2010-05-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/views/default/bookmarks/form.php: Added id to bookmark edit
+ form (for use theming).
+
+ * .../default/profile/commentwall/commentwall.php: Minor update to the
+ comment wall wrapper div.
+
+2010-05-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: Fixes #1480 - not passing empty array element
+ from page_handler()
+
+2010-04-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/groupsform.php,
+ views/default/usersettings/plugins.php: Minor updates to User Settings
+ interface.
+
+ * mod/search/views/default/search/entity.php: Search results float cleared.
+
+2010-04-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/activity.php,
+ .../views/default/riverdashboard/css.php: Updated activity stream on users
+ Profile to include riverdashboard js. Added extra css rules for inline
+ comments and likes on profile activity.
+
+ * mod/profile/views/default/profile/edit.php, views/default/css_ie.php,
+ views/default/js/initialise_elgg.php: Updates to Profile edit, likes js, and
+ tools css for IE7 rendering.
+
+2010-04-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/tabs.php: Added navigation/tabs view for tabbed
+ navigation.
+
+2010-04-27 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/start.php: Restricting external user creation from
+ Facebook Services.
+
+2010-04-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: if the activity stream is enabled show on the frontpage, if
+ not, list entities.
+
+2010-04-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/css_ie.php: More fixes for IE
+ rendering (entity listings, private messages, topbar, profile, activity)
+
+2010-04-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/languages/en.php, mod/sitepages/start.php: Updated language
+ strings for site page ecml
+
+ * mod/ecml/languages/en.php, mod/ecml/start.php: Removed view and entity
+ ECML. Updated language strings.
+
+ * mod/sitepages/start.php, .../views/default/sitepages/forms/editfront.php:
+ Only admin users can view site pages. Corrected ECML default for site pages.
+ Moved view and entity ECML keywords to sitepages and restricted them.
+
+ * engine/lib/users.php, mod/blog/manifest.xml, mod/riverdashboard/index.php,
+ mod/riverdashboard/manifest.xml, mod/riverdashboard/start.php,
+ .../views/default/river/item/list.php,
+ views/default/account/forms/login_dropdown.php: Graceful degrading for non-JS
+ users on the dropdown login box.
+
+ * mod/ecml/views/default/ecml/admin/ecml_admin.php: Fixed admin area
+ language string.
+
+ * .../views/default/river/object/blog/create.php: Fixes #2098: River view
+ for blog pulls correct time.
+
+ * engine/lib/plugins.php: Plugins are *required* to have a manifest.xml
+ file.
+
+2010-04-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/item/wrapper.php, views/default/css_ie.php:
+ Updates to riverdashboard wrapper for IE rendering. Temporary IE rules for
+ riverdashboard added to css_ie.php.
+
+2010-04-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php, mod/groups/index.php, mod/groups/membership.php:
+ Updated calls to content_header to point to correct new link in groups.
+
+ * mod/bookmarks/add.php, mod/bookmarks/all.php, mod/bookmarks/friends.php,
+ mod/bookmarks/index.php, mod/bookmarks/start.php: Bookmarks work with groups
+ and use new style content header filter.
+
+2010-04-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login_dropdown.php, views/default/css.php:
+ Updates to homepage layout and drop-down login for IE.
+
+ * mod/groups/views/default/forms/groups/edit.php: Update to edit Groups page
+ for ECML and longtext controls positioning.
+
+ * .../views/default/sitepages/forms/editfront.php: Updated SitePages with
+ example homepage markup/ECML.
+
+ * .../views/default/sitepages/forms/editfront.php, views/default/css.php:
+ Update to SitePages and CSSEditor code input fields, code input (monospaced
+ style) added to base css file.
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/icon.php: Update to site user avatars to
+ use CSS3 rounding for modern browsers. Older browsers will display as square
+ avatars.
+
+2010-04-26 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Fixes #2084 - layout issue with front page
+
+2010-04-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/account/forms/login.php,
+ .../default/page_shells/walled_garden_index.php,
+ .../views/default/walledgarden/css.php: Updated WalledGarden login page for
+ correct rendering in IE.
+
+ * languages/en.php, .../views/default/account/forms/login.php,
+ .../default/page_shells/walled_garden_index.php: Updates to WalledGarden
+ login. Lost password text simplified/shortened, text spacing adjusted, rule
+ added to prevent custom css page background from showing on walledgarden
+ login page.
+
+2010-04-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/graphics/background_bottom.gif,
+ mod/walledgarden/graphics/background_extend.gif,
+ mod/walledgarden/graphics/background_top.gif,
+ .../views/default/account/forms/login.php,
+ .../default/page_shells/walled_garden_index.php,
+ .../views/default/walledgarden/css.php: Updated walledgarden login.
+
+ * mod/groups/views/default/forms/forums/addtopic.php: Completed breadcrumb
+ for addtopic (missed in 5855)
+
+ * mod/ecml/start.php, mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/input_ext.php, mod/embed/languages/en.php,
+ mod/embed/start.php, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/link.php,
+ .../views/default/expages/forms/edit.php,
+ mod/externalpages/views/default/expages/menu.php,
+ mod/file/views/default/file/upload.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/messages.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../views/default/reportedcontent/form.php, mod/tinymce/languages/en.php,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ views/default/comments/forms/edit.php, views/default/css.php,
+ views/default/upload/upload_form_content.php: Updated longtext/tinymce area
+ extra controls. Moved and updated ecml help link, 'edit/remove editor' link
+ and 'add media' links both moved and improved. Redundant css removed.
+
+2010-04-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/index.php, .../views/default/account/forms/login.php,
+ .../default/account/forms/login_walledgarden.php: small walled garden tweak
+
+ * mod/sitepages/start.php: frontpage creation respects walledgarden
+
+ * .../default/account/forms/login_walledgarden.php: included a view for
+ plugins to extend
+
+ * mod/walledgarden/index.php, mod/walledgarden/start.php,
+ .../default/account/forms/login_walledgarden.php,
+ .../default/page_shells/walled_garden_index.php: The start of a new walled
+ garden index page
+
+2010-04-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/forum.php, mod/groups/views/default/forum/viewposts.php:
+ Completed breadcrumbs for Groups Forums.
+
+2010-04-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/all.php, mod/bookmarks/index.php: Updated booksmarks to 1.7
+ API.
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/sharing/invite.php,
+ .../views/default/widgets/a_users_groups/view.php: Updated groups to 1.7 api.
+
+
+2010-04-22 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/object/groupforumtopic.php: group forum discussion view
+ updated to match the community
+
+ * .../views/default/object/groupforumtopic.php: a small tweak so latest
+ discussion shows the last user to comment.
+
+2010-04-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Cleaned up some comments about group acl hooks.
+
+ * mod/blog/views/default/blog/sidebar_revisions.php: Cleaned up code to show
+ revisions. Added ability to go to published revision.
+
+ * mod/blog/views/default/blog/forms/edit.php: Decoding html entities for
+ blog excerpts in edit form.
+
+ * mod/blog/blog_lib.php, mod/blog/views/default/object/blog.php: Blog
+ excerpts now work for MB strings and properly detect word breaks.
+
+ * mod/blog/blog_lib.php: Removing unneeded order by metadata.
+
+ * mod/blog/blog_lib.php: Rewriting time_created and time_updated instead of
+ trying to be tricky with metadata.
+
+2010-04-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/profile/profile_ownerblock.php: profile owner block can
+ now be viewed while logged out.
+
+ * mod/groups/start.php: a simple function which can be used to restrict
+ group access options
+
+ * .../default/river/object/bookmarks/create.php: bookmark activity view
+ altered to work with both the classic and new versions of activity.
+
+ * .../views/default/river/object/blog/create.php: remove likes and comments
+ from blog activity view if in classic mode
+
+ * engine/lib/river2.php, .../default/profile/profile_contents/activity.php,
+ mod/riverdashboard/index.php, mod/riverdashboard/languages/en.php,
+ .../views/default/river/item/wrapper_classic.php,
+ .../views/default/settings/riverdashboard/edit.php: let site admins toggle
+ between a classic activity stream or the new clustered version
+
+2010-04-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: cleaning up [5822] - putting elgg_format_url() in
+ the same location in elgglib.php
+
+2010-04-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/start.php,
+ .../views/default/settings/riverdashboard/edit.php: Removed toggle for
+ overriding river dashboard. If the plugin is enabled, the dashboard is
+ enabled.
+
+ * engine/lib/elgglib.php: Merge previous to trunk.
+
+2010-04-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_sprites.png, index.php,
+ views/default/account/forms/login_dropdown.php, views/default/css.php,
+ views/default/page_elements/elgg_header.php: Added the beginnings of a
+ drop-down login box for Elgg as an alternative to the front-page login box in
+ the homepage sidebar.
+
+2010-04-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/languages/en.php: Fixed missing language string in admin
+
+ * mod/ecml/views/default/ecml/admin/ecml_admin.php: Added smarter check all
+ checkboxes for ECML admin area.
+
+ * mod/search/index.php, mod/search/search_hooks.php: Merged previous to
+ trunk.
+
+2010-04-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/river/object/bookmarks/create.php: #2087 fixed
+
+2010-04-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Updated docs for types and subtypes in
+ elgg_get_entities().
+
+2010-04-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: pass the entity so other plugins
+ can extend properly
+
+ * mod/ecml/start.php: correct layout applied to ecml help page
+
+ * mod/sitepages/actions/addfront.php: missing ] added to the frontpage
+ action file
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Merged type_subtype_pair fix from 1.7 branch.
+
+2010-04-16 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/start.php: Removed attempt to hook into system index page
+ from Walled Garden. This is unnecessary at best, and conflicts entirely when
+ custom login Site Pages are used.
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Fixing a logged out problem with group access.
+
+2010-04-16 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/languages/en.php, mod/walledgarden/start.php: Registering
+ a Walled Garden hook which will not allow new user signup with Twitter
+ Services.
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Only showing group access levels within group
+ contexts. Not showing unrelated access levels within group contexts.
+
+2010-04-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/bookmarks/group_bookmarks.php,
+ mod/file/views/default/file/css.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/widgets/filerepo/view.php: Removed js drop-down
+ description on group profile tools widgets.
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/actions/save_permissions.php, mod/ecml/languages/en.php,
+ mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/admin/ecml_admin.php: ECML permissions frontend
+ presents a whitelist instead of a black list.
+
+2010-04-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_sprites.png, engine/lib/users.php, views/default/css.php,
+ views/default/page_elements/elgg_topbar.php: Friends link removed from
+ primary nav and added to top toolbar.
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/ecml/activity.php: Fixed activity stream
+ ecml view.
+
+ * mod/sitepages/languages/en.php, mod/sitepages/start.php: Removed some left
+ over code from decoupling ECML. Fixed help files for [[ -> [ transition.
+
+ * mod/ecml/README.txt, mod/ecml/languages/en.php, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/help.php: ECML now only requires a single square
+ bracket.
+
+ * mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/ecml/activity.php: Added activity ecml
+ keyword.
+
+ * mod/sitepages/actions/addfront.php: Correctly checking for logoutbox for
+ custom front pages.
+
+ * mod/thewire/actions/add.php: Fix the name of the input in the wire's add
+ action.
+
+2010-04-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/blog/views/default/blog/sidebar_menu.php: Tagcloud
+ localized and updated on blogs.
+
+ * views/default/css.php: Tweaked 'Likes' icon css.
+
+ * views/default/css.php: Updated tools menu spacing and added selected class
+ rule for tools submenu items.
+
+ * _graphics/indicator.gif: Removed unused indicator gif. Spinners across the
+ site have been updated to use elgg's ajax_loader gif, except Shared Access
+ mod which still uses indicator gif - which is now in the shared access plugin
+ bundle.
+
+2010-04-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/indicator.gif, engine/lib/elgglib.php,
+ mod/categories/actions/save.php, mod/categories/languages/en.php,
+ mod/categories/listing.php, mod/categories/settings.php,
+ mod/categories/start.php, mod/categories/views/default/categories.php,
+ mod/categories/views/default/categories/list.php,
+ .../views/default/categories/settings.php,
+ mod/categories/views/default/categories/view.php,
+ mod/profile/actions/cropicon.php, mod/profile/icondirect.php,
+ mod/profile/start.php, mod/search/search_hooks.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity.php,
+ mod/thewire/views/rss/object/thewire.php: Merged [5623]:head from 1.7 to
+ trunk.
+
+ * mod/ecml/start.php, mod/ecml/views/default/ecml/keywords/blip.tv.php,
+ .../views/default/ecml/keywords/dailymotion.php,
+ mod/ecml/views/default/ecml/keywords/livevideo.php,
+ mod/ecml/views/default/ecml/keywords/redlasso.php: Added more video sources.
+ Allowing the . character in keywords.
+
+2010-04-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/views/default/ecml/admin/ecml_admin.php: Added ability to check
+ all rows or columns in ecml permissions page.
+
+ * mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/admin/ecml_admin.php: Inverted the admin matrix
+ for ecml views / keywords.
+
+ * mod/sitepages/languages/en.php, mod/sitepages/start.php,
+ .../default/sitepages/keywords/site_stats.php,
+ .../views/default/sitepages/keywords/sitestats.php,
+ .../views/default/sitepages/keywords/user_list.php,
+ .../views/default/sitepages/keywords/userlist.php: Added usage to the
+ keywords. Restricting keywords to userlist, loginbox, and sitestats to custom
+ front page.
+
+ * mod/ecml/start.php: Correctly setting context to admin to pull in the
+ admin sidebar for ECML permissions page.
+
+ * mod/ecml/README.txt: Updated docs with a FAQ.
+
+2010-04-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/groups/activity_latest.php: Activity view added for
+ Groups profile page, based on code by Jon Maul.
+
+2010-04-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: Jon Maul added as a contributor with MITRE.
+
+ * mod/blog/blog_lib.php, mod/blog/views/default/object/blog.php: Separated
+ blog object view from comments.
+
+ * mod/ecml/ecml_functions.php,
+ mod/ecml/views/default/ecml/admin/ecml_admin.php: Added ability for ECML
+ keyword definitions to restrict themselves to specific views.
+
+2010-04-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/start.php, mod/ecml/views/default/ecml/admin/ecml_admin.php:
+ Small UI updates to ECML.
+
+ * mod/search/views/default/search/entity.php, views/default/css.php: Update
+ to search results view, and small entity list style updates.
+
+2010-04-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/README.txt, mod/ecml/actions/save_permissions.php,
+ mod/ecml/ecml_functions.php, mod/ecml/languages/en.php, mod/ecml/start.php,
+ mod/ecml/views/default/ecml/admin/css.php,
+ mod/ecml/views/default/ecml/admin/ecml_admin.php,
+ .../views/default/ecml/keywords/googlemaps.php: Added granular access for
+ views in ECML. Added 'usage' on keyword info. Updated docs.
+
+ * mod/ecml/start.php, .../views/default/ecml/keywords/googlemaps.php:
+ Googlemaps support added for ECML.
+
+ * mod/ecml/views/default/ecml/help.php: ECML keyword help page now properly
+ lists all registered keywords.
+
+ * mod/sitepages/start.php: Removed _ from Site Pages ECML keywords.
+
+ * mod/ecml/README.txt, mod/ecml/ecml_functions.php, mod/ecml/manifest.xml,
+ mod/ecml/start.php: Updated ECML docs. Removed the _ as a valid keyword
+ character (it looks funny). Added the media sites in start.php. Fixed bug
+ that prevented [[view]] from working. Consequently, [[view]] now requires a
+ src="" attribute.
+
+2010-04-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/start.php, mod/ecml/views/default/ecml/keywords/vimeo.php: Added
+ vimeo support to ECML.
+
+ * mod/ecml/ecml_functions.php, mod/ecml/start.php,
+ .../views/default/ecml/keywords/slideshare.php,
+ mod/ecml/views/default/ecml/keywords/youtube.php: Changed tokenizer for ECML
+ to support attribute quotes. Added core youtube and slideshare keywords.
+ Passing the full keyword and attribute string to views.
+
+ * mod/blog/start.php: Added ECML support in blogs.
+
+2010-04-13 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Creating a function to clear user-specific plugin
+ settings.
+
+2010-04-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/ecml/start.php: Remove unneeded check in ecml view hook.
+
+ * mod/ecml/start.php: ECML uses the brand new granular view hooks.
+
+ * mod/blog/languages/en.php: Added item:object:blog language key for stats.
+
+ * engine/lib/elgglib.php: Added granular view hook view:$view_name instead
+ of a monolithic display:view hook.
+
+ * mod/ecml/start.php: Update todo.
+
+ * mod/ecml/README.txt, mod/ecml/ecml_functions.php,
+ mod/ecml/graphics/ecml.png, mod/ecml/languages/en.php, mod/ecml/manifest.xml,
+ mod/ecml/start.php, mod/ecml/views/default/ecml/help.php,
+ mod/ecml/views/default/ecml/input_ext.php,
+ mod/ecml/views/default/ecml/keywords/user_list.php: First version of ecml.
+
+ * mod/sitepages/README.txt, mod/sitepages/languages/en.php,
+ mod/sitepages/manifest.xml, mod/sitepages/sitepages_functions.php,
+ mod/sitepages/start.php, mod/sitepages/views/default/sitepages/keywords.php,
+ .../views/default/sitepages/keywords/user_list.php: Removed ECML from Site
+ Pages.
+
+2010-04-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/bookmarks/group_bookmarks.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/groups/languages/en.php, mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/river/item/wrapper.php: Groups profile page tool widget
+ boxes updated.
+
+ * views/default/css.php, views/default/page_elements/elgg_header.php:
+ Updates to site header and css for Custom Logo mod.
+
+2010-04-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/README.txt, mod/sitepages/actions/addfront.php,
+ mod/sitepages/languages/en.php, mod/sitepages/sitepages_functions.php,
+ mod/sitepages/start.php, .../default/sitepages/keywords/site_stats.php,
+ .../views/default/sitepages/keywords/user_list.php: Updated site pages docs.
+ Added ability to pass arguments to custom keywords. Added user_list keyword.
+ Reject logged out front pages that don't have [[login_box]].
+
+ * mod/sitepages/manifest.xml, mod/sitepages/sitepages_functions.php: Added
+ 'customization' category to manifest. Cleaned up some comments.
+
+ * mod/sitepages/start.php: Checking if we need to pull in a view before
+ calling it.
+
+ * mod/sitepages/views/default/sitepages/menu.php: DRY'd up the edit code in
+ site pages.
+
+ * mod/sitepages/README.txt: Added docs for site pages.
+
+2010-04-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/defaultprofile.php, mod/profile/languages/en.php,
+ mod/profile/views/default/profile/css.php,
+ .../default/profile/editdefaultprofileitems.php: Updated custom profile
+ fields admin area / list re-ordering ui.
+
+ * _graphics/avatar_menu_arrows.gif, _graphics/elgg_sprites.png,
+ _graphics/elgg_toolbar_logout.gif, _graphics/friends_picker_arrows.gif,
+ _graphics/icon_bookmarkthis.gif, _graphics/icon_customise_drag.gif,
+ _graphics/icon_customise_info.gif, _graphics/icon_customise_remove.gif,
+ _graphics/icon_customise_remove.png, _graphics/icon_delete.png,
+ _graphics/icon_gallery.gif, _graphics/icon_like.png, _graphics/icon_odd.gif,
+ _graphics/icon_reportthis.gif, _graphics/icon_rss.gif,
+ _graphics/icon_rss.png, _graphics/icon_tag.gif, _graphics/icon_tag.png,
+ _graphics/more_sprite.png, _graphics/river_icons/river_icon_blog.gif,
+ _graphics/river_icons/river_icon_bookmarks.gif,
+ _graphics/river_icons/river_icon_comment.gif,
+ _graphics/river_icons/river_icon_feed.gif,
+ _graphics/river_icons/river_icon_files.gif,
+ _graphics/river_icons/river_icon_forum.gif,
+ _graphics/river_icons/river_icon_friends.gif,
+ _graphics/river_icons/river_icon_messageboard.gif,
+ _graphics/river_icons/river_icon_pages.gif,
+ _graphics/river_icons/river_icon_plugin.gif,
+ .../river_icons/river_icon_privatemessage.gif,
+ _graphics/river_icons/river_icon_profile.gif,
+ _graphics/river_icons/river_icon_status.gif,
+ _graphics/river_icons/river_icon_thewire.gif, _graphics/search.png,
+ _graphics/speech_bubble_tail.gif, _graphics/thewire_speech_bubble.gif,
+ _graphics/topbar_icons.png, _graphics/twitter16px.png,
+ mod/file/views/default/file/css.php,
+ mod/profile/views/default/profile/css.php, mod/twitter/graphics/twitter.png,
+ mod/twitter/graphics/twitter16px.png,
+ mod/twitter/views/default/twitter/css.php, views/default/css.php,
+ views/default/output/rss_view.php: Collected all core sprites into graphics
+ and updated css accordingly. Removed unused core graphics. Moved
+ plugin-specific graphics into respective plugins graphics directories.
+
+2010-04-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/html_begin.php: Removed custom-form-elements
+
+2010-04-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/toolbar_messages_icon.gif,
+ mod/messages/graphics/toolbar_messages_icon.gif,
+ mod/messages/views/default/messages/css.php: Messages icon removed form main
+ css and graphics and added to messages mod.
+
+ * _graphics/icon_like.png, languages/en.php, views/default/css.php,
+ views/default/js/initialise_elgg.php, views/default/likes/forms/edit.php:
+ Icon added to likes and interface tweaked. Likes list js fixed to correctly
+ get height of current list.
+
+ * languages/en.php, mod/blog/views/default/object/blog.php,
+ mod/profile/views/default/profile/css.php, views/default/css.php,
+ views/default/likes/forms/edit.php: Likes updated for plugins entity list
+ display (just icon remaining to add)
+
+2010-04-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php, views/default/page_elements/content_header.php:
+ create a new group button added
+
+ * .../views/default/bookmarks/group_bookmarks.php: change group bookmarks to
+ get from container guid
+
+2010-04-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: Updated Likes on Blog and
+ Videolist single entity pages
+
+ * .../views/default/riverdashboard/css.php, views/default/css.php,
+ views/default/js/initialise_elgg.php, views/default/likes/forms/edit.php:
+ Added a popup list of users for Likes.
+
+2010-04-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php: Allow login via email.
+
+2010-04-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_header.php: allow for a site logo
+
+2010-04-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/twitterservice/languages/en.php, mod/twitterservice/manifest.xml,
+ mod/twitterservice/start.php, mod/twitterservice/vendors/twitter/license.txt,
+ mod/twitterservice/vendors/twitter/load.php,
+ mod/twitterservice/vendors/twitter/readme.txt,
+ mod/twitterservice/vendors/twitter/send.php,
+ .../vendors/twitter/twitter.class.php,
+ .../default/usersettings/twitterservice/edit.php: Moving Twitter Service
+ plugin from core into the plugins directory.
+
+ * mod/blog/languages/en.php: Adding a language definition.
+
+2010-04-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/item/wrapper.php: conversations now use
+ generic_comments for replies so no need for the extra logic in the river
+ wrapper.
+
+2010-04-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/addcomment.php, mod/profile/actions/deletecomment.php,
+ mod/profile/actions/editfield.php, mod/profile/actions/reorder.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ .../default/profile/editdefaultprofileitems.php,
+ .../profile/profile_contents/commentwall.php: Removed windows line endings.
+
+ * mod/profile/actions/deletedefaultprofileitem.php,
+ .../default/profile/editdefaultprofileitems.php: Fixed incorrect casting to
+ int for profile ids. Fixed incorrect URL for reordering.
+
+ * mod/profile/start.php: Fixed displaying of custom profile fields on
+ profile page.
+
+ * mod/profile/start.php, .../default/profile/editdefaultprofileitems.php:
+ Fixed editable profile fields.
+
+ * mod/profile/vendor/jq.editable.min.js,
+ mod/profile/vendor/jquery.jeditable.mini.js,
+ .../default/profile/editdefaultprofileitems.php: Wrong jquery editable lib.
+
+ * mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/editdefault.php, mod/profile/actions/editfield.php,
+ mod/profile/actions/reorder.php, mod/profile/actions/resetdefaultprofile.php,
+ mod/profile/defaultprofile.php, mod/profile/graphics/drag_handle.png,
+ mod/profile/languages/en.php, mod/profile/manifest.xml,
+ mod/profile/start.php, mod/profile/vendor/jq.editable.min.js,
+ .../views/default/profile/editdefaultprofile.php,
+ .../default/profile/editdefaultprofileitems.php: First go at merging in
+ draggable profile fields. Added categories to profile plugin.
+
+ * engine/lib/elgglib.php: Added optional html_encode parameter to
+ elgg_add_action_tokens_to_url() so it can be used in ajax calls.
+
+2010-04-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php, mod/blog/languages/en.php, mod/blog/start.php:
+ Highlighting current tab in content header. Includes updates to language
+ strings.
+
+2010-04-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/index.php: mine tab selects correctly now
+
+2010-04-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php, mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/object/blog.php: Creating content for the blog posts
+ of user's friends.
+
+2010-04-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php: Fixed broken interface on
+ updated plugin list
+
+2010-04-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/views/default/blog/forms/edit.php: Updating autosave handler and
+ "Saved date" return values.
+
+ * engine/lib/metadata.php: Ensuring malformed offset/limit values are
+ ignored by elgg_list_entities_from_metadata(). Refs #2046
+
+2010-04-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, .../views/default/river/object/blog/create.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ views/default/annotation/annotate.php, views/default/annotation/likes.php,
+ views/default/css.php, views/default/js/initialise_elgg.php,
+ views/default/likes/forms/display.php, views/default/likes/forms/edit.php,
+ views/default/likes/forms/link.php: Riverdashboard refreshed, and updated
+ display of comments and likes (the loading of these needs to be moved to ajax
+ callbacks)
+
+2010-04-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/feeds.php,
+ .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php: profile feeds moved from
+ top tabs
+
+2010-04-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/settings/system.php: Removed installation usage settings.
+
+2010-04-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/css.php,
+ views/default/js/initialise_elgg.php: Added screenshots to plugins list.
+
+2010-04-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt:
+
+ * CONTRIBUTORS.txt: upon request
+
+2010-04-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Sanitise int on the offset.
+
+2010-04-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_footer.php: Footer float cleared for
+ theming purposes.
+
+2010-04-05 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/save.php, mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/input/datetime.php: Adding a datetime view for use
+ with blog publication.
+
+2010-04-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php, languages/en.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php: Added category and name as valid
+ plugin manifest keys/values.
+
+2010-04-05 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Metadata lists will default offset and limit to
+ existing url elements.
+
+2010-04-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: load_plugin_manifest() converts multiple keys with
+ the same name into assoc arrays.
+
+2010-04-05 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog.php: Ensuring generic text line breaks
+ are replaced by paragraph tags.
+
+ * engine/lib/metadata.php: Passing entity list options on to view.
+
+ * engine/lib/elgglib.php: Refs #1947: Do not require views to explicitly
+ pass in the offset.
+
+2010-04-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/input.php, engine/schema/mysql.sql,
+ mod/htmlawed/start.php, mod/messages/views/default/messages/css.php,
+ .../notifications/subscriptions/forminternals.php,
+ mod/profile/actions/edit.php, mod/search/languages/en.php,
+ mod/search/search_hooks.php, mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/rss/search/comments/entity.php,
+ views/default/account/forms/register.php, views/default/friends/picker.php,
+ views/default/output/friendlytitle.php: Merged 5605:5622 from 1.7 to trunk.
+
+ * CHANGES.txt, actions/admin/user/makeadmin.php,
+ actions/admin/user/removeadmin.php, actions/register.php,
+ actions/useradd.php, engine/lib/actions.php, engine/lib/annotations.php,
+ engine/lib/database.php, engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/lib/group.php, engine/lib/metadata.php, engine/lib/notification.php,
+ engine/lib/river2.php, engine/lib/sessions.php,
+ engine/lib/upgrades/2010033101.php, engine/lib/upgrades/2010040201.php,
+ engine/lib/users.php, engine/lib/widgets.php,
+ engine/schema/upgrades/2009100701.sql,
+ engine/tests/api/entity_getter_functions.php, engine/tests/objects/users.php,
+ languages/en.php, mod/bookmarks/index.php, mod/bookmarks/start.php,
+ .../views/default/widgets/bookmarks/edit.php, mod/file/index.php,
+ mod/file/start.php, mod/file/views/default/widgets/filerepo/edit.php,
+ mod/file/views/default/widgets/filerepo/view.php, mod/groups/discussions.php,
+ mod/pages/index.php, mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/profile/actions/edit.php,
+ mod/profile/icondirect.php, .../views/default/profile/menu/adminlinks.php,
+ mod/search/index.php, mod/thewire/actions/add.php, mod/thewire/everyone.php,
+ mod/thewire/languages/en.php, mod/thewire/start.php,
+ .../views/default/thewire/activity_view.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/widgets/thewire/edit.php,
+ mod/thewire/views/default/widgets/thewire/view.php,
+ .../views/rss/search/object/thewire/entity.php, version.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/output/friendlytime.php,
+ views/default/output/friendlytitle.php, views/default/output/url.php,
+ views/default/page_elements/elgg_topbar.php: Merged 5530:5604 from 1.7 to
+ trunk.
+
+ * engine/lib/entities.php, mod/bookmarks/actions/add.php,
+ mod/embed/views/default/embed/media.php,
+ mod/embed/views/default/embed/pagination.php, mod/file/actions/save.php,
+ mod/groups/actions/edit.php, mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/members/index.php,
+ mod/members/views/default/members/search.php, mod/messages/actions/send.php,
+ mod/pages/actions/pages/edit.php, views/default/output/url.php,
+ views/failsafe/messages/sanitisation/settings.php: Merged 5487:5525 from 1.7
+ to trunk.
+
+2010-04-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/feeds.php: count added
+
+ * mod/profile/profile_lib.php,
+ .../default/profile/profile_contents/feeds.php,
+ .../views/default/profile/profile_navigation.php: feeds options added to the
+ profile
+
+ * views/default/account/forms/login.php: return to referer added to the
+ login form
+
+2010-04-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/forminternals.php: merged [5526] - [5530]
+ into trunk from 1.7 branch - there are more changes before and after these
+ revisions to be merged
+
+ * views/default/admin/plugins.php: the disable button may be for disabling
+ plugins but it is not disabled itself
+
+ * CHANGES.txt, engine/lib/elgglib.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php: Fixes #1184 - added
+ elgg_format_url() for handling ampersands in urls
+
+ * views/default/page_elements/elgg_topbar.php: target is not allowed in
+ xhtml strict
+
+ * views/default/account/forms/login.php: fixed some markup issues with login
+ box
+
+ * views/default/navigation/site_nav.php: only display navigation if there
+ are registered nav items - cannot have ul element without li elements
+
+ * views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/html_begin.php: removed two elements not allowed
+ with xhtml strict and removed blank line at top of html sent to browser
+
+2010-04-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/site_nav.php: Fixed the empty nav item entries
+ when automatically building menu.
+
+2010-04-02 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php: Determining which content header to use based on
+ blog owner. Primary navigation tabs should not display on other users' blog
+ lists.
+
+ * mod/blog/blog_lib.php, mod/blog/languages/en.php: Allowing non-owners to
+ view published blog posts.
+
+ * mod/blog/blog_lib.php: Truncating lengthy blog excerpts on word breaks.
+
+ * mod/blog/blog_lib.php, mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/object/blog.php: Fixing breadcrumb navigation and
+ content header links for blogs.
+
+ * views/default/page_elements/content_header.php: Allowing default page
+ handler to be overridden. You can pass in full url overrides to the content
+ header view for all/mine/friend tabs.
+
+2010-04-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/activity.php: limit set for profile
+ river
+
+ * views/default/annotation/latest_comments.php: small lang tweak
+
+ * mod/groups/start.php: point the groups main nav link to the all groups
+ page
+
+ * mod/bookmarks/all.php, mod/bookmarks/languages/en.php,
+ mod/bookmarks/views/default/bookmarks/stats.php: bookmark stats now correct,
+ missing strings applied and a function call moved out of the view.
+
+ * mod/profile/start.php: hash out the profile menu option for now, this will
+ be moved to the topbar.
+
+2010-03-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/more_sprite.png, languages/en.php,
+ views/default/admin/menu_items.php, views/default/css.php,
+ views/default/css_ie.php, views/default/css_ie6.php,
+ views/default/navigation/site_nav.php: Updated site primary nav bar and
+ improved drop-down submenu and made IE compatible, also cleaned up / improved
+ menuitem admin area.
+
+2010-03-31 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/languages/en.php, .../views/default/river/object/blog/create.php:
+ blog river view altered to pull out some content
+
+2010-03-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css_ie.php, views/default/css_ie6.php,
+ views/default/page_elements/html_begin.php: Updated paths to IE specific css,
+ and triggered hasLayout for IE.
+
+2010-03-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/languages/en.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/group_bookmarks.php,
+ mod/groups/views/default/groups/css.php: Added the beginnings of a bookmark
+ view for group profile pages.
+
+ * mod/file/start.php, mod/file/views/default/file/groupprofile_files.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/profileitems.php: Added the beginnings of a
+ new method for displaying the latest content from each tool on a groups
+ profile page.
+
+ * mod/blog/views/default/blog/sidebar_menu.php: Changed blog archive header
+ tag.
+
+ * mod/profile/languages/en.php,
+ .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ mod/profile/views/default/profile/css.php: Updated UI for commentwall on
+ profile page.
+
+2010-03-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/addcomment.php, mod/profile/actions/deletecomment.php,
+ mod/profile/languages/en.php, mod/profile/profile_lib.php,
+ mod/profile/start.php, .../default/profile/commentwall/commentwall.php,
+ .../profile/commentwall/commentwall_content.php,
+ .../default/profile/commentwall/commentwalladd.php,
+ .../profile/profile_contents/commentwall.php,
+ .../views/default/profile/profile_navigation.php: simple comment wall added
+ to profiles
+
+ * .../views/default/profile/profile_navigation.php: inserted a view for
+ others to extend on profile navigation
+
+2010-03-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/object/blog/create.php: Added river item views to
+ blog.
+
+ * README.txt: Changed Ben's email addy in README.txt.
+
+2010-03-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/likes/forms/edit.php: Updated Likes link.
+
+ * languages/en.php, views/default/comments/forms/edit.php: Updated generic
+ comment submit button text.
+
+2010-03-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Bumped version in README.
+
+ * actions/likes/delete.php, mod/bookmarks/actions/edit.php,
+ mod/bookmarks/actions/reference.php, mod/bookmarks/actions/remove.php,
+ mod/bookmarks/views/default/bookmarks/stats.php,
+ .../views/default/members/members_navigation.php,
+ mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ .../views/default/riverdashboard/welcome.php,
+ mod/sitepages/actions/addmeta.php, mod/sitepages/sitepages_functions.php,
+ .../views/default/settings/sitepages/edit.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/keywords.php,
+ mod/sitepages/views/default/sitepages/metatags.php,
+ views/default/annotation/annotatelike.php,
+ views/default/annotation/likes.php, views/foaf/search/entity_list.php,
+ views/opendd/search/entity_list.php, views/rss/search/entity_list.php:
+ Converting all line endings to unix style.
+
+ * .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/rivercomment.php,
+ views/default/js/initialise_elgg.php, views/default/likes/forms/edit.php:
+ Fixed likes interface JS.
+
+ * mod/blog/actions/blog/save.php, mod/blog/blog_lib.php,
+ mod/blog/languages/en.php, mod/blog/start.php: Added river support to blog.
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php: Cleaned up the likes
+ interface a bit.
+
+ * mod/blog/blog_lib.php: Fixed weird login in blog for real.
+
+ * mod/blog/blog_lib.php: Added access controls to blog archive grabbing
+ function. Corrected weird logic for checking validity of blog entities while
+ displaying posts.
+
+2010-03-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/mpg.php: Small update to zaudio player
+ spacing for new layout.
+
+2010-03-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/search/comments/entity.php,
+ views/default/annotation/generic_comment.php: Added anchor names for
+ comments.
+
+ * actions/admin/menu_items.php, engine/lib/elgglib.php, languages/en.php,
+ views/default/admin/menu_items.php: Added ability to make arbitrary links for
+ the menu items.
+
+ * mod/blog/blog_lib.php, mod/blog/views/default/blog/sidebar_menu.php: Added
+ archive view for blogs.
+
+ * engine/lib/metadata.php: Added documentation for order_by_metadata.
+
+2010-03-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: tag cloud functions are deprecated in 1.8
+
+2010-03-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/blog_lib.php, mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/sidebar_menu.php: Added filtering by archive
+ date.
+
+ * views/default/input/datepicker.php: Corrected bug in datepicker for
+ passing in values.
+
+ * CHANGES.txt, engine/lib/entities.php: Added remove_subtype() and
+ update_subtype().
+
+ * engine/lib/elgglib.php: Added missing merge from Merge Monday.
+
+ * mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/save.php, mod/blog/blog_lib.php,
+ mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/object/blog.php: Added an ElggBlog class to override
+ the time_created field. Added extra language files.
+
+2010-03-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php, mod/riverdashboard/index.php: Minor update
+ to profile language strings, and corrected view on riverdashboard for views
+ to extend.
+
+ * views/default/input/userpicker.php: Updated userpicker to use generic
+ delete button
+
+ * views/default/page_elements/elgg_topbar.php: Reordered the top toolbar
+ items.
+
+ * views/default/css.php: Moved Shared Access css into plugin
+
+2010-03-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/site_nav.php: Added selected class in navbar
+ menu.
+
+2010-03-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/languages/en.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../views/default/sitepages/forms/editfront.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/keywords.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/sitepages/views/default/sitepages/metatags.php: Updated SitePages to new
+ code standards & UI.
+
+2010-03-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/settings/upgrading.php: Update to
+ ajax loader css and upgrade.php
+
+2010-03-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/configuration.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/input.php,
+ engine/lib/install.php, engine/lib/metadata.php, engine/lib/tags.php,
+ engine/lib/users.php, languages/en.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ mod/custom_index/languages/en.php, mod/externalpages/actions/add.php,
+ .../views/default/expages/forms/edit.php,
+ mod/groups/actions/groupskillinvitation.php, mod/groups/all.php,
+ mod/groups/languages/en.php, mod/groups/views/default/groups/find.php,
+ .../views/default/groups/invitationrequests.php,
+ mod/groups/views/rss/groups/profileitems.php,
+ mod/groups/views/rss/object/groupforumtopic.php, mod/messages/index.php,
+ mod/messages/sent.php, mod/search/views/rss/search/layout.php,
+ mod/thewire/start.php, mod/tinymce/views/default/input/longtext.php,
+ views/default/output/tagcloud.php,
+ .../messages/sanitisation/dbsettings_error.php: Merged 1.7 bugfixes back into
+ core. (5376:HEAD).
+
+2010-03-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/start.php, mod/file/views/default/file/menu.php,
+ mod/messages/start.php, mod/messages/views/default/messages/menu.php,
+ mod/pages/start.php, mod/pages/views/default/pages/menu.php,
+ mod/profile/languages/en.php, mod/profile/start.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminwrapper.php,
+ .../views/default/profile/menu/friendlinks.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ .../views/default/profile/profile_ownerblock.php,
+ mod/profile/views/default/profile/submenu.php,
+ .../views/default/reportedcontent/user_report.php: Updated avatar menu:
+ Removed links to tools, provided a view to extend menu, added @username to
+ menu, cleaned-up and simplified menu generation.
+
+ * mod/profile/index.php, mod/profile/profile_lib.php, mod/profile/start.php,
+ .../views/default/profile/profile_navigation.php: Removed widget view from
+ Profile.
+
+2010-03-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/rivercomment.php: hide the river comment
+ form - still need to add a handle to each one so the correct comment form
+ opens
+
+ * actions/comments/add.php, actions/comments/delete.php,
+ mod/riverdashboard/start.php, .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/rivercomment.php: the beginnings of a
+ mechanism to comment on river objects
+
+ * actions/likes/delete.php: after delete action, return to the correct
+ context
+
+ * views/default/annotation/likes.php: timestamp added to like action view
+
+ * .../views/default/river/item/wrapper.php,
+ views/default/likes/forms/edit.php: more tweaks to likes on the activity
+ stream
+
+ * .../views/default/river/item/wrapper.php: likes added to the activity
+ river
+
+ * mod/blog/views/default/object/blog.php: like display added to blog object
+
+ * mod/blog/views/default/object/blog.php: like added to blog posts
+
+ * actions/likes/add.php, actions/likes/delete.php,
+ engine/lib/annotations.php, engine/lib/elgglib.php, languages/en.php,
+ views/default/annotation/annotatelike.php,
+ views/default/annotation/likes.php, views/default/likes/forms/edit.php:
+ generic like this functionality added
+
+2010-03-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, languages/en.php,
+ views/default/admin/menu_items.php, views/default/css.php,
+ views/default/navigation/site_nav.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/page_elements/elgg_topbar.php: Moved toolbar dropdown menu to
+ main nav. Added CSS for main nav dropdown. Emptied navigation/topbar_tools
+ view.
+
+ * engine/start.php: Removed non-working "lightmode" option.
+
+ * engine/lib/elgglib.php, engine/start.php: Removed ui_page_setup() to fix
+ installation. Gave engine/start.php a bit of love.
+
+2010-03-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/start.php, mod/bookmarks/start.php, mod/file/start.php,
+ mod/groups/start.php, mod/riverdashboard/start.php,
+ mod/thewire/languages/en.php, mod/thewire/start.php: Default all tools' menu
+ items to "world" view. Removed "My" prefix.
+
+ * mod/tinymce/views/default/input/longtext.php: Added a space between the
+ word count colon and the number for tinymce.
+
+ * engine/lib/elgglib.php: Namespaces sticky forms. Requires more testing.
+
+2010-03-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/content_header_filter.gif,
+ vendors/jquery/custom-form-elements.js, views/default/css.php,
+ views/default/page_elements/content_header.php: Removed page content area
+ filter menu, in favor of simple tabs.
+
+ * languages/en.php, mod/blog/views/default/blog/sidebar_menu.php,
+ mod/file/friends.php, mod/file/index.php, mod/file/world.php,
+ views/default/annotation/latest_comments.php, views/default/css.php: Updated
+ latest comments to new UI and coding standards, and added to Blog and Files
+ sidebar.
+
+2010-03-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/blog/auto_save_revision.php,
+ mod/blog/actions/blog/save.php, mod/blog/actions/blog/save_draft.php,
+ mod/blog/blog_lib.php, mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/sidebar_edit.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/sidebar_revisions.php,
+ mod/blog/views/default/object/blog.php: Updated blog to support multiple
+ revisions and automatic saving of drafts.
+
+2010-03-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/object/blog.php, mod/bookmarks/add.php,
+ mod/bookmarks/all.php, mod/bookmarks/friends.php, mod/bookmarks/index.php,
+ mod/bookmarks/views/default/object/bookmarks.php: Included a view for plugins
+ to extend (on the new reworked Bookmarks and Blogs).
+
+2010-03-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/languages/en.php: Added blog languages.
+
+ * actions/admin/menu_items.php, admin/menu_items.php, engine/lib/admin.php,
+ engine/lib/elgglib.php, engine/lib/users.php, languages/en.php,
+ views/default/admin/menu_items.php, views/default/navigation/site_nav.php,
+ views/default/navigation/topbar_tools.php: Added config options for tabs and
+ menu items.
+
+2010-03-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/activity.php,
+ .../views/default/river/item/wrapper.php, views/default/css.php,
+ views/default/navigation/site_nav.php: Updates to: site nav (changed unused
+ id's to title tags), latest wire post in admin/user lists, riverdashboard
+ timestamps unified, and latest wire post on profile page.
+
+2010-03-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Updated documentation for set_config().
+ Removed unnecessary escaping of value before serializing, which broke arrays
+ anyway...
+
+ * views/default/input/pulldown.php: Documented pulldown quirks for NULL and
+ FALSE as values. Fixed bug when calling htmlentities() on the values before
+ testing them.
+
+ * views/default/input/pulldown.php: Refs #1362: Fixed a problem when
+ comparing int and string values to determin the pulldown's selected value.
+
+2010-03-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/messages/views/default/messages/css.php: Minor css update to new
+ message notification.
+
+ * views/default/navigation/site_nav.php: Addition of 'conversations' to
+ temporary site_nav.
+
+ * entities/list.php, mod/blog/start.php,
+ mod/bookmarks/views/default/bookmarks/stats.php,
+ .../views/default/widgets/bookmarks/view.php, mod/members/index.php: Replaced
+ more calls to deprecated functions.
+
+ * services/export/handler.php, views/default/export/entity.php,
+ views/default/export/metadata.php, views/default/export/relationship.php:
+ Updates to default entity views (within admin/log browser).
+
+ * mod/logbrowser/views/default/logbrowser/form.php: Minor update (form
+ spacing) to log browser.
+
+ * .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/form.php: Minor UI updates to reported
+ content.
+
+ * mod/file/views/default/widgets/filerepo/view.php,
+ views/default/navigation/viewtype.php: Minor updates to Files.
+
+ * mod/embed/embed.php, mod/embed/images/button_spacer.gif,
+ mod/embed/images/loading.gif, mod/embed/images/media_modal.png,
+ mod/embed/start.php, mod/embed/views/default/embed/css.php,
+ mod/embed/views/default/embed/js.php, mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/media.php,
+ mod/embed/views/default/embed/pagination.php,
+ mod/embed/views/default/embed/simpletype.php,
+ mod/embed/views/default/embed/tabs.php,
+ mod/embed/views/default/embed/upload.php,
+ mod/embed/views/default/group/default/embed.php,
+ mod/embed/views/default/object/default/embed.php,
+ mod/embed/views/default/object/file/embed.php,
+ mod/embed/views/default/object/file/embedlist.php,
+ mod/embed/views/default/site/default/embed.php,
+ mod/embed/views/default/user/default/embed.php: Updated Embed mod to new UI.
+
+ * views/default/css.php: Updates to generic comments
+
+2010-03-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/views/default/file/css.php,
+ mod/file/views/default/object/file.php: Further updates to files single
+ entity view.
+
+ * entities/index.php, mod/file/edit.php, mod/file/friends.php,
+ mod/file/index.php, mod/file/languages/en.php, mod/file/search.php,
+ mod/file/start.php, mod/file/upload.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/file/upload.php,
+ mod/file/views/default/object/file.php, mod/file/world.php,
+ mod/profile/views/default/profile/css.php,
+ mod/search/views/default/search/gallery.php,
+ mod/tinymce/views/default/tinymce/css.php, views/default/css.php,
+ views/default/entities/gallery.php, views/default/navigation/site_nav.php:
+ Updated File mod to new UI.
+
+ * mod/profile/defaultprofile.php: Corrected misspelt classname.
+
+2010-03-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tagcloud/start.php: Replaced extend_view() with elgg_extend_view().
+
+ * .../views/default/reportedcontent/listing.php, mod/sitepages/start.php,
+ views/default/output/confirmlink.php, views/default/output/url.php: Replaced
+ calls to deprecated elgg_validate_action_url() with
+ elgg_add_action_tokens_to_url().
+
+2010-03-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php, views/default/css.php: Update to
+ longtext/tintMCE input box ui.
+
+ * admin/plugins.php, mod/profile/defaultprofile.php,
+ mod/profile/views/default/profile/css.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../views/default/reportedcontent/listing.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ views/default/admin/plugins.php, views/default/admin/plugins_opt/plugin.php,
+ views/default/admin/site.php, views/default/admin/user.php,
+ views/default/css.php, views/default/settings/system.php: Updates to Admin
+ area UI.
+
+ * mod/captcha/captcha.php, mod/captcha/start.php,
+ mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php: Updated Captcha UI.
+
+ * mod/twitter/views/default/twitter/css.php,
+ mod/twitter/views/default/widgets/twitter/view.php,
+ mod/twitterservice/start.php,
+ .../default/usersettings/twitterservice/edit.php: Updates to Twitter and
+ TwitterService UI.
+
+ * views/default/usersettings/plugins.php: Small update to
+ user-settings/tools page.
+
+ * mod/thewire/everyone.php: …and doing it properly this time.
+
+ * mod/invitefriends/index.php, mod/invitefriends/manifest.xml,
+ mod/invitefriends/start.php, .../views/default/invitefriends/formitems.php:
+ Updated Invite Friends mod to new ui.
+
+ * .../graphics/icon_notifications_site.gif, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/notifications/languages/en.php,
+ .../views/default/notifications/css.php,
+ .../notifications/settings/usersettings.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/personal.php, views/default/css.php: Updated
+ Notifications to new UI.
+
+2010-03-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Trunk isn't 1.7.
+
+2010-03-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/search_box.php,
+ views/default/input/form.php: seems you need to wrap form inputs fields with
+ the fieldset tag for strict xhtml
+
+ * views/default/page_elements/html_begin.php: capitals not allow for strict
+ xhtml
+
+ * views/default/page_elements/html_begin.php: self close the favicon link
+
+2010-03-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/blog/sidebar_menu.php,
+ mod/tagcloud/languages/de.php, mod/tagcloud/languages/en.php,
+ mod/tagcloud/manifest.xml, mod/tagcloud/start.php, mod/tagcloud/tagcloud.php,
+ mod/tagcloud/views/default/output/tagcloud.php,
+ mod/tagcloud/views/default/tagcloud/css.php,
+ .../views/default/widgets/tagcloud/edit.php,
+ .../views/default/widgets/tagcloud/view.php, views/default/css.php: Added
+ updated tagcloud plugin and added to core mods.
+
+2010-03-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * UPGRADE.txt, admin/user.php, engine/lib/elgglib.php, index.php,
+ languages/en.php, mod/diagnostics/start.php, mod/file/friends.php,
+ mod/file/index.php, mod/file/search.php, mod/file/world.php,
+ mod/groups/all.php, mod/groups/index.php, mod/groups/membership.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/pages/actions/pages/edit.php, mod/pages/index.php,
+ mod/pages/languages/en.php, mod/pages/views/default/forms/pages/edit.php,
+ mod/pages/views/default/pages/welcome.php, mod/pages/world.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/search/search_hooks.php,
+ mod/thewire/everyone.php, mod/uservalidationbyemail/start.php: Merged Cash's
+ bugfixes from the 1.7 branch (3288:5377).
+
+2010-03-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/header_shadow.png, mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/object/blog.php,
+ views/default/annotation/annotate.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php, views/default/css.php:
+ Updated/cleaned-up generic comments with new UI.
+
+ * mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/object/blog.php,
+ views/default/annotation/generic_comment.php,
+ views/default/comments/forms/edit.php: Updated interface on new blog
+ (listings and edit/new blog pages).
+
+ * mod/bookmarks/views/default/object/bookmarks.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/groups/css.php,
+ mod/messages/views/default/messages/view.php,
+ mod/thewire/views/default/object/thewire.php, views/default/css.php: Updated
+ and simplified generic entity listings metadata block (edit, delete, access)
+ to not use tables.
+
+ * mod/blog/views/default/blog/sidebar_menu.php,
+ mod/groups/views/default/groups/side_menu.php, mod/members/index.php,
+ mod/profile/views/default/profile/submenu.php,
+ .../views/default/riverdashboard/menu.php,
+ views/default/canvas_header/submenu_group.php, views/default/css.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/title.php: Removed unneeded div from around
+ submenu lists.
+
+2010-03-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Added elgg_list_entities_from_metadata() and
+ deprecated list_entities_from_metadata().
+
+ * views/default/input/calendar.php, views/default/input/datepicker.php:
+ Added datepicker view and deprecated calendar view.
+
+ * mod/blog/actions/add.php, mod/blog/actions/blog/delete.php,
+ mod/blog/actions/blog/save.php, mod/blog/actions/blog/save_draft.php,
+ mod/blog/actions/delete.php, mod/blog/actions/edit.php, mod/blog/add.php,
+ mod/blog/all.php, mod/blog/archive.php, mod/blog/blog_lib.php,
+ mod/blog/edit.php, mod/blog/endpoint/index.php, mod/blog/everyone.php,
+ mod/blog/friends.php, mod/blog/index.php, mod/blog/languages/en.php,
+ mod/blog/manifest.xml, mod/blog/preview.php, mod/blog/read.php,
+ mod/blog/savedraft.php, mod/blog/shared.php, mod/blog/start.php,
+ mod/blog/views/default/blog/archive.php,
+ mod/blog/views/default/blog/categorylist.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/gallery.php,
+ mod/blog/views/default/blog/listing.php,
+ mod/blog/views/default/blog/menu.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/previewpane.php,
+ mod/blog/views/default/blog/sidebar_menu.php,
+ mod/blog/views/default/blog/stats.php, mod/blog/views/default/blog/view.php,
+ mod/blog/views/default/object/blog.php,
+ .../views/default/river/object/blog/annotate.php,
+ .../views/default/river/object/blog/create.php,
+ .../views/default/river/object/blog/update.php: Rough first version of a new
+ blog plugin.
+
+2010-03-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/css.php: Minor interface updates for
+ search results.
+
+2010-03-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/elgglib.php,
+ mod/tinymce/views/default/input/longtext.php, views/default/input/access.php,
+ views/default/input/calendar.php, views/default/input/checkboxes.php,
+ views/default/input/email.php, views/default/input/hidden.php,
+ views/default/input/longtext.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php, views/default/input/userpicker.php: Implemented
+ sticky forms.
+
+2010-03-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/search/comments/entity.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/listing.php, views/default/css.php,
+ views/default/entities/gallery_listing.php: Updated Search results UI.
+
+2010-03-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/elgglib.php, mod/bookmarks/add.php,
+ mod/bookmarks/index.php, mod/groups/forum.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/messages/views/default/messages/messages.php,
+ views/default/navigation/breadcrumbs.php,
+ views/default/page_elements/breadcrumbs.php,
+ views/default/page_elements/content_header.php: Added breadcrumb support and
+ updated the mods with old-style breadcrumbs.
+
+2010-03-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/user.php, mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/embed/views/default/embed/upload.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/invitefriends/formitems.php,
+ mod/tinymce/views/default/input/longtext.php, views/default/css.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php, views/failsafe/input/access.php,
+ views/failsafe/input/longtext.php, views/failsafe/input/text.php: Updates:
+ longtext editor default size added (and overridden in group/forums), more
+ updates to lists of members, remaining/previously-missed generic input
+ classes renamed to lowercase.
+
+ * friends/index.php, friends/of.php,
+ mod/members/views/default/members/css.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/thewire/views/default/thewire/css.php,
+ views/default/admin/statistics_opt/online.php, views/default/css.php: Updated
+ friends/members listings when there is a latest wire post to display.
+
+ * mod/blog/views/default/blog/menu.php,
+ mod/file/views/default/file/menu.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/pages/views/default/pages/menu.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminwrapper.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ .../views/default/reportedcontent/user_report.php: Updated avatar user menu
+ to generate an ordered list, reinstated the add/remove friend link, & cleaned
+ up css.
+
+ * .../default/river/object/bookmarks/create.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ mod/riverdashboard/endpoint/ping.php,
+ mod/riverdashboard/graphics/refresh.png,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/default/river/object/thewire/create.php,
+ mod/thewire/views/default/thewire/css.php,
+ views/default/annotation/annotate.php, views/default/css.php,
+ views/default/friends/river/create.php, views/default/river/item/wrapper.php,
+ views/default/river/wrapper.php: Riverdashboard updated to new UI. DOM
+ simplified a bit & css cleaned up.
+
+2010-03-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/tests/api/helpers.php: Added elgg_instanceof().
+
+2010-03-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/languages/en.php, mod/members/views/default/members/css.php,
+ .../views/default/notifications/css.php,
+ .../notifications/subscriptions/forminternals.php, views/default/css.php,
+ views/default/friends/collections.php, views/default/friends/picker.php,
+ views/default/js/friendsPickerv1.php: Updated Friends Picker UI and added to
+ core css.
+
+ * mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/css.php: Minor ui updates to group forms
+
+2010-03-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/profile/profile_contents/activity.php: profile activity
+ tweaked // it is still not working correctly but doesn't cause a wsod
+
+2010-03-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php, mod/groups/discussions.php, mod/groups/forum.php,
+ mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/group/group.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ .../views/default/groups/invitationrequests.php,
+ mod/groups/views/default/groups/members.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/rss/groups/profileitems.php: Updated Groups to the new
+ interface. Some view clean-up & simplification done.
+
+2010-03-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php: river time stamps added to
+ profile edits
+
+ * mod/bookmarks/views/default/object/bookmarks.php: bookmarks open in a new
+ window ticket #1965
+
+ * mod/riverdashboard/index.php: closing div applied. Note: this needs
+ cleaning up.
+
+ * mod/riverdashboard/endpoint/ping.php, mod/riverdashboard/index.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/manifest.xml,
+ mod/riverdashboard/start.php, .../views/default/river/dashboard.php,
+ .../views/default/river/item/list.php,
+ .../views/default/river/item/wrapper.php,
+ .../default/river/relationship/friend/create.php,
+ .../views/default/river/sitemessage/create.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/menu.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/default/settings/riverdashboard/edit.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php: the beginnings of a new
+ activity river with ajax notification and conversation clustering.
+
+ * engine/lib/river2.php: new activity river api functions
+
+2010-03-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed incorrect deprecated function rewrite for
+ list_entities().
+
+ * .../canvas/layouts/one_column_with_sidebar.php: Fixed documentation for
+ one_column_with_sidebar layout.
+
+2010-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/add.php, mod/blog/actions/delete.php,
+ mod/blog/actions/edit.php, mod/blog/add.php, mod/blog/edit.php,
+ mod/blog/endpoint/index.php, mod/blog/languages/en.php,
+ mod/blog/manifest.xml, mod/blog/savedraft.php, mod/blog/start.php,
+ mod/blog/views/default/blog/archive.php,
+ mod/blog/views/default/blog/categorylist.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/gallery.php,
+ mod/blog/views/default/blog/listing.php,
+ mod/blog/views/default/blog/menu.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/previewpane.php,
+ mod/blog/views/default/blog/stats.php, mod/blog/views/default/blog/view.php,
+ mod/blog/views/default/object/blog.php: Blogs updated to new UI (needs Brett
+ to look over first)
+
+ * mod/profile/profile_lib.php,
+ .../default/profile/profile_contents/sidebar.php,
+ .../views/default/profile/profile_ownerblock.php: Added large avatar to
+ Profile/details page.
+
+2010-03-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php: Forwarding to index.php after login instead of
+ pg/dashboard.
+
+2010-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/index.php, .../default/profile/profile_contents/details.php:
+ Full profile fields reinstated on profile/details page
+
+ * mod/profile/index.php, .../default/profile/profile_contents/activity.php:
+ Updated profile page calls to profile_contents.
+
+2010-03-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/sitepages_functions.php: Fixes #1956: Corrected typo for
+ filtering by owner=username.
+
+2010-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/languages/en.php, views/default/css.php,
+ views/default/navigation/main_nav.php, views/default/navigation/site_nav.php,
+ views/default/page_elements/elgg_header.php: Added basic (stage1) site-wide
+ navigation. Needs improving with a way for admin and plugin authors to decide
+ which mods display in the primary nav-bar, and which page within each tool
+ they point at.
+
+ * _graphics/icon_rss.png, languages/en.php,
+ mod/bookmarks/views/default/bookmarks/form.php, views/default/css.php,
+ views/default/page_elements/owner_block.php: Generic rss feed icon added
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/editicon.php: Edit profile icon ui fixed.
+
+2010-03-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/sitepages/forms/editmeta.php: add/edit metatags form bug
+ fixed
+
+2010-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/edit.php, mod/profile/editicon.php, mod/profile/start.php:
+ Fixed canvas layout for profile edit views
+
+2010-03-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/object/thewire.php: Ticket #1954 fixed
+
+2010-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/languages/en.php, mod/thewire/start.php: Updated 'my wire'
+ link in toolbar menu
+
+ * mod/bookmarks/all.php, mod/members/index.php: Removed users owner block
+ from 'all bookmarks', and 'all members' views.
+
+ * admin/plugins.php, admin/site.php, admin/statistics.php, admin/user.php,
+ dashboard/latest.php, friends/add.php, friends/collections.php,
+ friends/edit.php, friends/index.php, friends/of.php, index.php,
+ mod/blog/all.php, mod/blog/archive.php, mod/blog/everyone.php,
+ mod/blog/friends.php, mod/blog/index.php, mod/blog/preview.php,
+ mod/blog/read.php, mod/blog/shared.php, mod/bookmarks/add.php,
+ mod/bookmarks/all.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/friends.php, mod/bookmarks/index.php,
+ mod/diagnostics/index.php, mod/externalpages/index.php,
+ mod/externalpages/read.php, mod/groups/addtopic.php, mod/groups/all.php,
+ mod/groups/discussions.php, mod/groups/edit.php, mod/groups/edittopic.php,
+ mod/groups/forum.php, mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invitations.php, mod/groups/invite.php, mod/groups/membership.php,
+ mod/groups/membershipreq.php, mod/groups/new.php, mod/groups/topicposts.php,
+ mod/logbrowser/index.php, mod/members/index.php, mod/messages/index.php,
+ mod/messages/read.php, mod/messages/send.php, mod/messages/sent.php,
+ mod/profile/defaultprofile.php, mod/profile/edit.php,
+ mod/profile/editicon.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/index.php, mod/search/index.php,
+ mod/search/views/default/search/layout.php,
+ mod/sitepages/sitepages_functions.php, mod/thewire/add.php,
+ mod/thewire/everyone.php, mod/thewire/index.php, mod/walledgarden/index.php,
+ settings/plugins.php, settings/statistics.php, settings/user.php,
+ .../canvas/layouts/one_column_with_sidebar.php: Updated new page canvases
+ (and calls to elgg_view_layout) so that empty vars are not required.
+
+2010-03-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/actions/addfront.php, mod/sitepages/actions/addmeta.php,
+ mod/sitepages/languages/en.php, mod/sitepages/sitepages_functions.php,
+ mod/sitepages/start.php, .../views/default/settings/sitepages/edit.php,
+ .../views/default/sitepages/custom_frontpage.php,
+ .../views/default/sitepages/footer_menu.php,
+ .../views/default/sitepages/forms/editfront.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/keywords.php,
+ mod/sitepages/views/default/sitepages/metatags.php: Added dynamic keywords
+ for view and entity. Separated logged in and logged out front page views.
+ Fixed a problem with saving metatags. Added PHPDoc headers. Updated language
+ strings.
+
+ * mod/sitepages/actions/add.php, mod/sitepages/actions/addfront.php,
+ mod/sitepages/actions/addmeta.php, mod/sitepages/frontpage.php,
+ mod/sitepages/index.php, mod/sitepages/languages/en.php,
+ mod/sitepages/read.php, mod/sitepages/sitepages_functions.php,
+ mod/sitepages/start.php, .../views/default/sitepages/analytics.php,
+ mod/sitepages/views/default/sitepages/css.php,
+ .../views/default/sitepages/custom_frontpage.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../views/default/sitepages/forms/editfront.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/keywords.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/sitepages/views/default/sitepages/metatags.php: Brought sitepages up to
+ standards. Added basic static keyword/view substitution support.
+
+2010-03-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/start.php, .../views/default/page_elements/searchbox.php,
+ mod/search/views/default/search/search_box.php,
+ views/default/page_elements/elgg_header.php,
+ views/default/page_elements/html_begin.php: Removed hard-coded search box and
+ replaced with extended header/extend view from search page.
+
+2010-03-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php, mod/groups/edit.php, mod/groups/groupprofile.php,
+ mod/groups/views/default/groups/contentwrapper.php: Removed the superfluous
+ groups contentwrapper
+
+ * mod/groups/addtopic.php, mod/groups/all.php, mod/groups/discussions.php,
+ mod/groups/edit.php, mod/groups/edittopic.php, mod/groups/forum.php,
+ mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invitations.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/manifest.xml,
+ mod/groups/membership.php, mod/groups/membershipreq.php, mod/groups/new.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/css.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/side_menu.php: Beginnings of the refreshed
+ groups interface
+
+ * .../page_elements/content_header_member.php,
+ views/default/page_elements/title.php: updates to page_elements
+
+2010-03-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/html_begin.php: Commenting out old (hopefully
+ unneeded) jquery hack.
+
+2010-03-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/sitepages/actions/add.php, mod/sitepages/actions/addfront.php,
+ mod/sitepages/actions/addmeta.php, mod/sitepages/frontpage.php,
+ mod/sitepages/index.php, mod/sitepages/languages/en.php,
+ mod/sitepages/manifest.xml, mod/sitepages/read.php,
+ mod/sitepages/sitepages_functions.php, mod/sitepages/start.php,
+ .../views/default/settings/sitepages/edit.php,
+ .../views/default/sitepages/analytics.php,
+ mod/sitepages/views/default/sitepages/css.php,
+ .../views/default/sitepages/footer_menu.php,
+ .../views/default/sitepages/forms/edit.php,
+ .../views/default/sitepages/forms/editfront.php,
+ .../views/default/sitepages/forms/editmeta.php,
+ mod/sitepages/views/default/sitepages/keywords.php,
+ mod/sitepages/views/default/sitepages/menu.php,
+ mod/sitepages/views/default/sitepages/metatags.php: Site pages will
+ eventually replace the external pages and custom index plugins as well as
+ introduce a new keywords system to enable dynamic content to be displayed
+ without needing to know php or Elgg. This will be handy for frontpage
+ layout/design.
+
+2010-03-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php, mod/thewire/add.php,
+ mod/thewire/everyone.php, mod/thewire/graphics/thewire_speech_bubble.gif,
+ mod/thewire/index.php, mod/thewire/languages/en.php,
+ mod/thewire/manifest.xml, mod/thewire/views/default/object/thewire.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/thewire/scripts/counter.js: Updates to thewire interface
+
+ * mod/profile/views/default/profile/css.php, views/default/css.php,
+ views/default/page_elements/owner_block.php: Updates to Profile and
+ owner_block interface
+
+2010-03-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tinymce/graphics/ed-bg.gif, mod/tinymce/graphics/example.gif,
+ mod/tinymce/graphics/more.gif, mod/tinymce/manifest.xml,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php: Updated tinymce to new interface
+
+2010-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/profile_lib.php, mod/profile/start.php,
+ mod/profile/views/default/profile/css.php: Removed horizontal nav from avatar
+ edit view and debug string from sidebar. Added temp fix for large avatar
+ upload image scaling
+
+2010-03-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/profile_lib.php, mod/profile/start.php,
+ .../default/profile/profile_contents/activity.php,
+ .../default/profile/profile_contents/details.php,
+ .../default/profile/profile_contents/friends.php,
+ .../default/profile/profile_contents/sidebar.php,
+ .../default/profile/profile_contents/twitter.php: Pulled profile sidebar out
+ into separate view. Using one_column_with_sidebar layout for editing profile.
+
+
+ * mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/actions/resetdefaultprofile.php, mod/profile/defaultprofile.php,
+ mod/profile/edit.php, mod/profile/editicon.php, mod/profile/icon.php,
+ mod/profile/icondirect.php, mod/profile/index.php,
+ mod/profile/javascript.php, mod/profile/languages/en.php,
+ mod/profile/profile_lib.php, mod/profile/start.php,
+ mod/profile/views/default/profile/admin_menu.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/adminwrapper.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/metatags.php,
+ .../default/profile/profile_contents/activity.php,
+ .../default/profile/profile_contents/details.php,
+ .../default/profile/profile_contents/friends.php,
+ .../default/profile/profile_contents/twitter.php,
+ .../views/default/profile/profile_navigation.php,
+ .../views/default/profile/profile_ownerblock.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/userdetails.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php: Merged interface changes to
+ profile in.
+
+2010-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/bookmarks/add.php, mod/bookmarks/all.php,
+ mod/bookmarks/bookmarklet.php, mod/bookmarks/friends.php,
+ mod/bookmarks/index.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ .../default/bookmarks/bookmarklet_menu_option.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/object/bookmarks.php, views/default/css.php:
+ Updated Bookmarks interface (old sidebar nav removed, breadcrumbs fixed,
+ bookmarklet fixed & updated)
+
+ * .../default/bookmarks/bookmarklet_menu_option.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/messages/views/default/messages/messages.php,
+ .../views/default/reportedcontent/listing.php: Removed empty href in
+ elgg_slide_toggle calls to prevent page jump
+
+ * views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/register.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/input/form.php,
+ views/default/js/initialise_elgg.php: Interface updates to js, and login,
+ register, lost password
+
+ * languages/en.php: Merged EN language updates
+
+ * _graphics/favicon.ico: Added the default elgg favicon (linked from
+ html_begin)
+
+ * vendors/jquery/jquery-ui-1.7.2.custom.min.js: Removed jquery custom UI
+ package, we now provide/use the full 1.7.2 UI package
+
+ * mod/search/index.php, mod/search/views/default/search/layout.php,
+ mod/search/views/default/search/startblurb.php: Merged Search interface
+ updates
+
+ * mod/messages/graphics/icon_notifications_site.gif, mod/messages/sent.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php: Merged missing Messages
+ interface modifications
+
+ * mod/members/views/default/members/search.php: Added missing php closing
+ tag
+
+ * mod/bookmarks/add.php, mod/bookmarks/all.php, mod/bookmarks/index.php,
+ .../views/default/bookmarks/bookmarklet.php: Merged missing Bookmarks
+ interface modifications
+
+2010-03-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/walledgarden/index.php, .../views/default/account/forms/login.php,
+ .../views/default/canvas/layouts/new_index.php,
+ .../views/default/walledgarden/css.php: Merged walledgarden changes.
+
+ * mod/walledgarden/index.php, mod/walledgarden/manifest.xml,
+ mod/walledgarden/readme.txt, mod/walledgarden/start.php,
+ .../views/default/account/forms/login.php,
+ .../views/default/canvas/layouts/new_index.php,
+ .../views/default/walledgarden/css.php,
+ .../views/default/walledgarden/walledgarden.php: Moved walled garden into
+ trunk.
+
+ * mod/reportedcontent/add.php,
+ mod/reportedcontent/graphics/icon_reportthis.gif,
+ mod/reportedcontent/index.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/start.php, .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/reportedcontent/owner_block.php: Merged reported content
+ interface changes.
+
+ * mod/messages/actions/delete.php, mod/messages/actions/send.php,
+ mod/messages/index.php, mod/messages/languages/en.php, mod/messages/read.php,
+ mod/messages/readme.txt, mod/messages/send.php, mod/messages/sent.php,
+ mod/messages/start.php, mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/message.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/send.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php: Merged messages interface
+ changes.
+
+ * mod/members/index.php, mod/members/languages/en.php,
+ mod/members/start.php, mod/members/views/default/members/css.php,
+ .../views/default/members/members_navigation.php,
+ .../views/default/members/members_sort_menu.php,
+ mod/members/views/default/members/online.php,
+ mod/members/views/default/members/search.php: Merged members plugin's new
+ layout.
+
+ * mod/externalpages/actions/addfront.php, mod/externalpages/index.php,
+ mod/externalpages/read.php, mod/externalpages/start.php,
+ mod/externalpages/views/default/expages/css.php,
+ .../views/default/expages/footer_menu.php,
+ .../views/default/expages/forms/editfront.php,
+ .../views/default/expages/front_left.php,
+ .../views/default/expages/front_right.php,
+ mod/externalpages/views/default/expages/menu.php: Updated external pages to
+ new interface.
+
+2010-03-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/jquery/custom-form-elements.js,
+ vendors/jquery/jquery-1.3.2.min.js, vendors/jquery/jquery-1.4.min.js: Added
+ new version of jQuery and custom form elements.
+
+ * mod/bookmarks/actions/add.php, mod/bookmarks/actions/delete.php,
+ mod/bookmarks/actions/edit.php, mod/bookmarks/actions/reference.php,
+ mod/bookmarks/actions/remove.php, mod/bookmarks/add.php,
+ mod/bookmarks/all.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/everyone.php, mod/bookmarks/friends.php,
+ mod/bookmarks/inbox.php, mod/bookmarks/index.php,
+ mod/bookmarks/languages/en.php, mod/bookmarks/start.php,
+ .../views/default/bookmarks/bookmarklet.php,
+ .../default/bookmarks/bookmarklet_menu_option.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/owner_block.php,
+ mod/bookmarks/views/default/bookmarks/sharing.php,
+ mod/bookmarks/views/default/bookmarks/stats.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/river/object/bookmarks/annotate.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/edit.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/bookmarks/views/rss/object/bookmarks.php: Updated bookmarks with new
+ interface.
+
+ * index.php, languages/en.php, settings/plugins.php,
+ settings/statistics.php, settings/user.php: Pulling in MORE changes that
+ weren't in the patch. Apparently I fail at patching.
+
+ * _graphics/spacer.gif: Removing unneeded svn:executable properties on
+ files.
+
+ * views/default/page_shells/default.php: Merged in a lost change for the
+ interface.
+
+ * actions/systemsettings/install.php: Forward to the registration
+ pagehandler after installation.
+
+ * views/failsafe/page_shells/default.php,
+ views/failsafe/pageshells/pageshell.php: Installation uses new views system.
+
+2010-03-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/edit_layout.php,
+ views/default/canvas/layouts/sidebar_boxes.php,
+ .../canvas/layouts/two_column_right_sidebar.php: old canvases removed
+
+2010-03-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/users.php: Pulled in missing interface
+ modifications for the engine dir.
+
+2010-03-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/ajax_loader_bw.gif, _graphics/button_background.gif,
+ _graphics/button_graduation.png, _graphics/content_header_filter.gif,
+ _graphics/icon_delete.png, _graphics/icon_tag.png, _graphics/search.png,
+ _graphics/sidebar_background.gif, _graphics/speech_bubble_tail.gif,
+ _graphics/topbar_icons.png, _graphics/twitter16px.png, views/default/css.php:
+ new graphics added and css updated to reflect new location
+
+2010-03-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/forgotten_password.php, admin/plugins.php, admin/site.php,
+ admin/statistics.php, admin/user.php, dashboard/latest.php, friends/add.php,
+ friends/collections.php, friends/edit.php, friends/index.php, friends/of.php,
+ mod/blog/actions/add.php, mod/blog/actions/delete.php,
+ mod/blog/actions/edit.php, mod/blog/add.php, mod/blog/archive.php,
+ mod/blog/edit.php, mod/blog/everyone.php, mod/blog/friends.php,
+ mod/blog/index.php, mod/blog/languages/en.php, mod/blog/manifest.xml,
+ mod/blog/preview.php, mod/blog/read.php, mod/blog/savedraft.php,
+ mod/blog/start.php, mod/blog/views/default/blog/categorylist.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/gallery.php,
+ mod/blog/views/default/blog/listing.php,
+ mod/blog/views/default/blog/menu.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/previewpane.php,
+ mod/blog/views/default/blog/view.php, mod/blog/views/default/object/blog.php,
+ .../views/default/river/object/blog/annotate.php,
+ .../views/default/river/object/blog/create.php,
+ .../views/default/river/object/blog/update.php,
+ mod/bookmarks/actions/add.php, mod/bookmarks/actions/delete.php,
+ mod/bookmarks/add.php, mod/bookmarks/bookmarklet.php,
+ mod/bookmarks/everyone.php, mod/bookmarks/friends.php,
+ mod/bookmarks/inbox.php, mod/bookmarks/index.php,
+ mod/bookmarks/languages/en.php, mod/bookmarks/manifest.xml,
+ mod/bookmarks/start.php, .../views/default/bookmarks/bookmarklet.php,
+ mod/bookmarks/views/default/bookmarks/css.php,
+ mod/bookmarks/views/default/bookmarks/form.php,
+ .../views/default/bookmarks/owner_block.php,
+ mod/bookmarks/views/default/bookmarks/sharing.php,
+ mod/bookmarks/views/default/object/bookmarks.php,
+ .../default/river/object/bookmarks/annotate.php,
+ .../default/river/object/bookmarks/create.php,
+ .../views/default/widgets/bookmarks/edit.php,
+ .../views/default/widgets/bookmarks/view.php,
+ mod/bookmarks/views/rss/object/bookmarks.php,
+ mod/captcha/backgrounds/bg1.jpg, mod/captcha/backgrounds/bg2.jpg,
+ mod/captcha/backgrounds/bg3.jpg, mod/captcha/backgrounds/bg4.jpg,
+ mod/captcha/backgrounds/bg5.jpg, mod/captcha/captcha.php,
+ mod/captcha/fonts/1.ttf, mod/captcha/fonts/Liberation_serif_License.txt,
+ mod/captcha/languages/en.php, mod/captcha/manifest.xml,
+ mod/captcha/start.php, mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php, mod/categories/actions/save.php,
+ mod/categories/languages/en.php, mod/categories/manifest.xml,
+ mod/categories/readme.txt, mod/categories/settings.php,
+ mod/categories/start.php, mod/categories/views/default/categories.php,
+ mod/categories/views/default/categories/css.php,
+ mod/categories/views/default/categories/list.php,
+ .../views/default/categories/settings.php,
+ .../views/default/categories/settingsform.php,
+ mod/categories/views/default/categories/view.php, mod/custom_index/index.php,
+ mod/custom_index/languages/en.php, mod/custom_index/manifest.xml,
+ mod/custom_index/start.php, .../views/default/canvas/layouts/new_index.php,
+ .../views/default/custom_index/css.php,
+ mod/defaultwidgets/actions/update.php, mod/defaultwidgets/dashboard.php,
+ mod/defaultwidgets/languages/en.php, mod/defaultwidgets/manifest.xml,
+ mod/defaultwidgets/profile.php, mod/defaultwidgets/start.php,
+ .../views/default/defaultwidgets/editor.php, mod/diagnostics/index.php,
+ mod/diagnostics/languages/en.php, mod/embed/README.txt, mod/embed/embed.php,
+ mod/embed/images/button_spacer.gif, mod/embed/images/close_button.gif,
+ mod/embed/images/loading.gif, mod/embed/images/media_modal.png,
+ mod/embed/languages/en.php, mod/embed/manifest.xml, mod/embed/start.php,
+ mod/embed/upload.php, mod/embed/views/default/embed/addcontentjs.php,
+ mod/embed/views/default/embed/css.php, mod/embed/views/default/embed/js.php,
+ mod/embed/views/default/embed/link.php,
+ mod/embed/views/default/embed/media.php,
+ mod/embed/views/default/embed/metatags.php,
+ mod/embed/views/default/embed/pagination.php,
+ mod/embed/views/default/embed/simpletype.php,
+ mod/embed/views/default/embed/tabs.php,
+ mod/embed/views/default/embed/upload.php,
+ mod/embed/views/default/group/default/embed.php,
+ mod/embed/views/default/object/default/embed.php,
+ mod/embed/views/default/object/file/embed.php,
+ mod/embed/views/default/object/file/embedlist.php,
+ mod/embed/views/default/site/default/embed.php,
+ mod/embed/views/default/user/default/embed.php,
+ mod/externalpages/actions/add.php, mod/externalpages/actions/addfront.php,
+ mod/externalpages/index.php, mod/externalpages/languages/en.php,
+ mod/externalpages/manifest.xml, mod/externalpages/read.php,
+ mod/externalpages/start.php, .../views/default/expages/analytics.php,
+ mod/externalpages/views/default/expages/css.php,
+ .../views/default/expages/footer_menu.php,
+ .../views/default/expages/forms/edit.php,
+ .../views/default/expages/forms/editfront.php,
+ .../views/default/expages/front_left.php,
+ .../views/default/expages/front_right.php,
+ mod/externalpages/views/default/expages/menu.php,
+ mod/externalpages/views/default/object/expages.php,
+ mod/file/actions/delete.php, mod/file/actions/download.php,
+ mod/file/actions/save.php, mod/file/actions/upload.php,
+ mod/file/download.php, mod/file/edit.php, mod/file/friends.php,
+ mod/file/graphics/icons/application.gif,
+ mod/file/graphics/icons/application_lrg.gif,
+ mod/file/graphics/icons/archive.gif, mod/file/graphics/icons/archive_lrg.gif,
+ mod/file/graphics/icons/excel.gif, mod/file/graphics/icons/excel_lrg.gif,
+ mod/file/graphics/icons/general.gif, mod/file/graphics/icons/general_lrg.gif,
+ mod/file/graphics/icons/music.gif, mod/file/graphics/icons/music_lrg.gif,
+ mod/file/graphics/icons/openoffice.gif,
+ mod/file/graphics/icons/openoffice_lrg.gif,
+ mod/file/graphics/icons/pages.gif, mod/file/graphics/icons/pages_lrg.gif,
+ mod/file/graphics/icons/pdf.gif, mod/file/graphics/icons/pdf_lrg.gif,
+ mod/file/graphics/icons/ppt.gif, mod/file/graphics/icons/ppt_lrg.gif,
+ mod/file/graphics/icons/text.gif, mod/file/graphics/icons/text_lrg.gif,
+ mod/file/graphics/icons/vcard.gif, mod/file/graphics/icons/vcard_lrg.gif,
+ mod/file/graphics/icons/video.gif, mod/file/graphics/icons/video_lrg.gif,
+ mod/file/graphics/icons/word.gif, mod/file/graphics/icons/word_lrg.gif,
+ mod/file/index.php, mod/file/languages/en.php, mod/file/manifest.xml,
+ mod/file/search.php, mod/file/start.php, mod/file/thumbnail.php,
+ mod/file/upload.php, mod/file/views/default/file/css.php,
+ mod/file/views/default/file/groupprofile_files.php,
+ mod/file/views/default/file/icon.php,
+ .../default/file/icon/application/default.php,
+ .../views/default/file/icon/application/excel.php,
+ .../views/default/file/icon/application/msword.php,
+ .../views/default/file/icon/application/pdf.php,
+ .../default/file/icon/application/powerpoint.php,
+ .../default/file/icon/application/vnd.ms-excel.php,
+ .../file/icon/application/vnd.ms-powerpoint.php,
+ .../application/vnd.oasis.opendocument.text.php,
+ .../views/default/file/icon/application/x-gzip.php,
+ .../file/icon/application/x-rar-compressed.php,
+ .../default/file/icon/application/x-stuffit.php,
+ .../views/default/file/icon/application/zip.php,
+ mod/file/views/default/file/icon/archive.php,
+ mod/file/views/default/file/icon/audio.php,
+ mod/file/views/default/file/icon/audio/default.php,
+ mod/file/views/default/file/icon/default.php,
+ mod/file/views/default/file/icon/document.php,
+ mod/file/views/default/file/icon/text/default.php,
+ .../views/default/file/icon/text/directory.php,
+ mod/file/views/default/file/icon/text/v-card.php,
+ mod/file/views/default/file/icon/video.php,
+ mod/file/views/default/file/icon/video/default.php,
+ mod/file/views/default/file/menu.php,
+ .../default/file/specialcontent/audio/mid.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/x-wav.php,
+ .../default/file/specialcontent/image/default.php,
+ mod/file/views/default/file/typecloud.php,
+ mod/file/views/default/file/upload.php,
+ mod/file/views/default/object/file.php,
+ .../views/default/river/object/file/create.php,
+ mod/file/views/default/widgets/filerepo/edit.php,
+ mod/file/views/default/widgets/filerepo/view.php,
+ mod/file/views/rss/object/file.php, mod/file/world.php, mod/friends/add.php,
+ mod/friends/collections.php, mod/friends/edit.php,
+ mod/friends/languages/en.php, mod/friends/manifest.xml,
+ mod/friends/start.php, mod/friends/views/default/widgets/friends/edit.php,
+ mod/friends/views/default/widgets/friends/view.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/delete.php,
+ mod/groups/actions/edit.php, mod/groups/actions/featured.php,
+ mod/groups/actions/forums/addpost.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletepost.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/editpost.php,
+ mod/groups/actions/forums/edittopic.php,
+ mod/groups/actions/groupskillinvitation.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/addtopic.php, mod/groups/all.php,
+ mod/groups/discussions.php, mod/groups/edit.php, mod/groups/edittopic.php,
+ mod/groups/forum.php, mod/groups/graphics/defaultlarge.gif,
+ mod/groups/graphics/defaultmedium.gif, mod/groups/graphics/defaultsmall.gif,
+ mod/groups/graphics/defaulttiny.gif, mod/groups/graphics/icon.php,
+ mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invitations.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/manifest.xml,
+ mod/groups/membership.php, mod/groups/membershipreq.php, mod/groups/new.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/group/group.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/contentwrapper.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ .../views/default/groups/invitationrequests.php,
+ mod/groups/views/default/groups/members.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/groups/views/default/groups/profileitems.php,
+ mod/groups/views/default/groups/side_menu.php,
+ .../views/default/icon/group/default/large.php,
+ .../views/default/icon/group/default/medium.php,
+ .../views/default/icon/group/default/small.php,
+ .../views/default/icon/group/default/tiny.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../views/default/river/object/group/create.php,
+ .../river/object/groupforumtopic/annotate.php,
+ .../river/object/groupforumtopic/create.php,
+ .../river/object/groupforumtopic/update.php,
+ .../default/river/relationship/member/create.php,
+ mod/groups/views/default/settings/groups/edit.php,
+ mod/groups/views/default/sharing/invite.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ .../views/default/widgets/a_users_groups/view.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php,
+ mod/groups/views/rss/forum/topicposts.php,
+ mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/contentwrapper.php,
+ mod/groups/views/rss/groups/profileitems.php,
+ mod/invitefriends/actions/invite.php, mod/invitefriends/index.php,
+ mod/invitefriends/languages/en.php, mod/invitefriends/manifest.xml,
+ mod/invitefriends/start.php, .../views/default/invitefriends/form.php,
+ .../views/default/invitefriends/formitems.php, mod/logbrowser/index.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/logbrowser/form.php, mod/members/index.php,
+ mod/members/languages/en.php, mod/members/manifest.xml,
+ mod/members/start.php, mod/members/views/default/members/css.php,
+ .../views/default/members/members_sort_menu.php,
+ mod/members/views/default/members/online.php,
+ mod/members/views/default/members/search.php,
+ mod/messageboard/actions/add.php, mod/messageboard/actions/delete.php,
+ mod/messageboard/ajax_endpoint/load.php, mod/messageboard/history.php,
+ mod/messageboard/index.php, mod/messageboard/languages/en.php,
+ mod/messageboard/manifest.xml, mod/messageboard/readme.txt,
+ mod/messageboard/start.php, .../views/default/messageboard/css.php,
+ .../views/default/messageboard/forms/add.php,
+ .../default/messageboard/group_messageboard.php,
+ .../views/default/messageboard/messageboard.php,
+ .../default/messageboard/messageboard_content.php,
+ .../default/river/object/messageboard/create.php,
+ .../views/default/widgets/messageboard/edit.php,
+ .../views/default/widgets/messageboard/view.php,
+ mod/messages/actions/delete.php, mod/messages/actions/send.php,
+ mod/messages/graphics/icon_notifications_site.gif, mod/messages/index.php,
+ mod/messages/languages/en.php, mod/messages/manifest.xml,
+ mod/messages/read.php, mod/messages/readme.txt, mod/messages/send.php,
+ mod/messages/sent.php, mod/messages/start.php,
+ mod/messages/views/default/messages/css.php,
+ .../views/default/messages/forms/message.php,
+ .../views/default/messages/forms/reply.php,
+ mod/messages/views/default/messages/forms/view.php,
+ mod/messages/views/default/messages/menu.php,
+ mod/messages/views/default/messages/messages.php,
+ mod/messages/views/default/messages/topbar.php,
+ mod/messages/views/default/messages/view.php,
+ .../views/default/widgets/messages/view.php,
+ mod/notifications/actions/groupsave.php, mod/notifications/actions/save.php,
+ .../graphics/icon_notifications_email.gif, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/notifications/languages/en.php,
+ mod/notifications/manifest.xml, mod/notifications/start.php,
+ .../views/default/notifications/css.php,
+ .../notifications/settings/usersettings.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/jsfuncs.php,
+ .../notifications/subscriptions/personal.php,
+ mod/pages/actions/pages/delete.php, mod/pages/actions/pages/edit.php,
+ mod/pages/actions/pages/editwelcome.php, mod/pages/edit.php,
+ mod/pages/history.php, mod/pages/images/application.png,
+ mod/pages/images/code.png, mod/pages/images/css.png, mod/pages/images/db.png,
+ mod/pages/images/directory.png, mod/pages/images/doc.png,
+ mod/pages/images/file.gif, mod/pages/images/file.png,
+ mod/pages/images/film.png, mod/pages/images/flash.png,
+ mod/pages/images/folder-closed.gif, mod/pages/images/folder.gif,
+ mod/pages/images/folder_open.png, mod/pages/images/html.png,
+ mod/pages/images/java.png, mod/pages/images/linux.png,
+ mod/pages/images/minus.gif, mod/pages/images/music.png,
+ mod/pages/images/pages.gif, mod/pages/images/pages_lrg.gif,
+ mod/pages/images/pdf.png, mod/pages/images/php.png,
+ mod/pages/images/picture.png, mod/pages/images/plus.gif,
+ mod/pages/images/ppt.png, mod/pages/images/psd.png,
+ mod/pages/images/ruby.png, mod/pages/images/script.png,
+ mod/pages/images/spinner.gif, mod/pages/images/treeview-black-line.gif,
+ mod/pages/images/treeview-black.gif,
+ mod/pages/images/treeview-default-line.gif,
+ mod/pages/images/treeview-default.gif,
+ mod/pages/images/treeview-famfamfam-line.gif,
+ mod/pages/images/treeview-famfamfam.gif,
+ mod/pages/images/treeview-gray-line.gif, mod/pages/images/treeview-gray.gif,
+ mod/pages/images/treeview-red-line.gif, mod/pages/images/treeview-red.gif,
+ mod/pages/images/txt.png, mod/pages/images/xls.png, mod/pages/images/zip.png,
+ mod/pages/index.php, mod/pages/javascript/jquery.treeview.async.js,
+ mod/pages/javascript/jquery.treeview.js, mod/pages/languages/en.php,
+ mod/pages/manifest.xml, mod/pages/new.php, mod/pages/pagesTree.php,
+ mod/pages/start.php, mod/pages/view.php,
+ mod/pages/views/default/annotation/icon.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ .../views/default/icon/object/page/medium.php,
+ mod/pages/views/default/icon/object/page/small.php,
+ .../views/default/icon/object/page_top/medium.php,
+ .../views/default/icon/object/page_top/small.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/css.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/menu.php,
+ mod/pages/views/default/pages/metatags.php,
+ mod/pages/views/default/pages/pagegallery.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/pages/sidebar/sidebarthis.php,
+ mod/pages/views/default/pages/sidebar/starter.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/sidebar/wrapper.php,
+ mod/pages/views/default/pages/welcome.php,
+ .../views/default/river/object/page/annotate.php,
+ .../views/default/river/object/page/create.php,
+ .../views/default/river/object/page/update.php,
+ .../default/river/object/page_top/annotate.php,
+ .../views/default/river/object/page_top/create.php,
+ .../views/default/river/object/page_top/update.php,
+ mod/pages/views/default/widgets/pages/edit.php,
+ mod/pages/views/default/widgets/pages/view.php, mod/pages/welcome.php,
+ mod/pages/world.php, mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/actions/resetdefaultprofile.php, mod/profile/defaultprofile.php,
+ mod/profile/edit.php, mod/profile/editicon.php,
+ mod/profile/graphics/defaultlarge.gif,
+ mod/profile/graphics/defaultmaster.gif,
+ mod/profile/graphics/defaultmedium.gif,
+ mod/profile/graphics/defaultsmall.gif, mod/profile/graphics/defaulttiny.gif,
+ mod/profile/graphics/defaulttopbar.gif, mod/profile/icon.php,
+ mod/profile/icondirect.php, mod/profile/index.php,
+ mod/profile/javascript.php, mod/profile/languages/en.php,
+ mod/profile/manifest.xml, mod/profile/start.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ .../views/default/js/jquery.imgareaselect-0.8.js,
+ .../default/js/jquery.imgareaselect-0.8.min.js,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/adminwrapper.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/submenu.php,
+ mod/profile/views/default/profile/userdetails.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/index.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/manifest.xml, mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/reportedcontent/owner_block.php,
+ .../views/default/reportedcontent/user_report.php,
+ mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ mod/riverdashboard/graphics/follow_icon.png, mod/riverdashboard/index.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/manifest.xml,
+ mod/riverdashboard/start.php, .../views/default/river/sitemessage/create.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/default/settings/riverdashboard/edit.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../views/json/riverdashboard/container.php,
+ .../views/rss/riverdashboard/container.php,
+ mod/search/views/default/search/css.php, mod/thewire/actions/add.php,
+ mod/thewire/actions/delete.php, mod/thewire/add.php,
+ mod/thewire/everyone.php, mod/thewire/graphics/river_icon_thewire.gif,
+ mod/thewire/graphics/thewire_speech_bubble.gif, mod/thewire/index.php,
+ mod/thewire/languages/en.php, mod/thewire/manifest.xml,
+ mod/thewire/readme.txt, mod/thewire/start.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ .../views/default/thewire/activity_view.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/thewire/views/default/thewire/notfound.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/thewire/scripts/counter.js,
+ mod/thewire/views/default/thewire/view.php,
+ mod/thewire/views/default/widgets/thewire/edit.php,
+ mod/thewire/views/default/widgets/thewire/view.php,
+ mod/tinymce/languages/en.php, mod/tinymce/manifest.xml,
+ mod/tinymce/readme.txt, mod/tinymce/start.php,
+ mod/tinymce/tinymce/changelog.txt,
+ mod/tinymce/tinymce/jscripts/tiny_mce/langs/en.js,
+ mod/tinymce/tinymce/jscripts/tiny_mce/license.txt,
+ .../jscripts/tiny_mce/plugins/advhr/css/advhr.css,
+ .../tiny_mce/plugins/advhr/editor_plugin.js,
+ .../tiny_mce/plugins/advhr/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advhr/js/rule.js,
+ .../tiny_mce/plugins/advhr/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advhr/rule.htm,
+ .../tiny_mce/plugins/advimage/css/advimage.css,
+ .../tiny_mce/plugins/advimage/editor_plugin.js,
+ .../tiny_mce/plugins/advimage/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/advimage/image.htm,
+ .../tiny_mce/plugins/advimage/img/sample.gif,
+ .../jscripts/tiny_mce/plugins/advimage/js/image.js,
+ .../tiny_mce/plugins/advimage/langs/en_dlg.js,
+ .../tiny_mce/plugins/advlink/css/advlink.css,
+ .../tiny_mce/plugins/advlink/editor_plugin.js,
+ .../tiny_mce/plugins/advlink/editor_plugin_src.js,
+ .../tiny_mce/plugins/advlink/js/advlink.js,
+ .../tiny_mce/plugins/advlink/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/advlink/link.htm,
+ .../tiny_mce/plugins/autosave/editor_plugin.js,
+ .../tiny_mce/plugins/autosave/editor_plugin_src.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin.js,
+ .../tiny_mce/plugins/bbcode/editor_plugin_src.js,
+ .../tiny_mce/plugins/compat2x/editor_plugin.js,
+ .../tiny_mce/plugins/compat2x/editor_plugin_src.js,
+ .../tiny_mce/plugins/contextmenu/editor_plugin.js,
+ .../plugins/contextmenu/editor_plugin_src.js,
+ .../plugins/directionality/editor_plugin.js,
+ .../plugins/directionality/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/editor_plugin.js,
+ .../tiny_mce/plugins/emotions/editor_plugin_src.js,
+ .../tiny_mce/plugins/emotions/emotions.htm,
+ .../tiny_mce/plugins/emotions/img/smiley-cool.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-cry.gif,
+ .../plugins/emotions/img/smiley-embarassed.gif,
+ .../plugins/emotions/img/smiley-foot-in-mouth.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-frown.gif,
+ .../plugins/emotions/img/smiley-innocent.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-kiss.gif,
+ .../plugins/emotions/img/smiley-laughing.gif,
+ .../plugins/emotions/img/smiley-money-mouth.gif,
+ .../plugins/emotions/img/smiley-sealed.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-smile.gif,
+ .../plugins/emotions/img/smiley-surprised.gif,
+ .../plugins/emotions/img/smiley-tongue-out.gif,
+ .../plugins/emotions/img/smiley-undecided.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-wink.gif,
+ .../tiny_mce/plugins/emotions/img/smiley-yell.gif,
+ .../tiny_mce/plugins/emotions/js/emotions.js,
+ .../tiny_mce/plugins/emotions/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/example/dialog.htm,
+ .../tiny_mce/plugins/example/editor_plugin.js,
+ .../tiny_mce/plugins/example/editor_plugin_src.js,
+ .../tiny_mce/plugins/example/img/example.gif,
+ .../jscripts/tiny_mce/plugins/example/js/dialog.js,
+ .../jscripts/tiny_mce/plugins/example/langs/en.js,
+ .../tiny_mce/plugins/example/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullpage/css/fullpage.css,
+ .../tiny_mce/plugins/fullpage/editor_plugin.js,
+ .../tiny_mce/plugins/fullpage/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullpage/fullpage.htm,
+ .../tiny_mce/plugins/fullpage/js/fullpage.js,
+ .../tiny_mce/plugins/fullpage/langs/en_dlg.js,
+ .../tiny_mce/plugins/fullscreen/editor_plugin.js,
+ .../plugins/fullscreen/editor_plugin_src.js,
+ .../tiny_mce/plugins/fullscreen/fullscreen.htm,
+ .../tiny_mce/plugins/iespell/editor_plugin.js,
+ .../tiny_mce/plugins/iespell/editor_plugin_src.js,
+ .../tiny_mce/plugins/inlinepopups/editor_plugin.js,
+ .../plugins/inlinepopups/editor_plugin_src.js,
+ .../inlinepopups/skins/clearlooks2/img/alert.gif,
+ .../inlinepopups/skins/clearlooks2/img/button.gif,
+ .../inlinepopups/skins/clearlooks2/img/buttons.gif,
+ .../inlinepopups/skins/clearlooks2/img/confirm.gif,
+ .../inlinepopups/skins/clearlooks2/img/corners.gif,
+ .../skins/clearlooks2/img/horizontal.gif,
+ .../skins/clearlooks2/img/vertical.gif,
+ .../inlinepopups/skins/clearlooks2/window.css,
+ .../tiny_mce/plugins/inlinepopups/template.htm,
+ .../plugins/insertdatetime/editor_plugin.js,
+ .../plugins/insertdatetime/editor_plugin_src.js,
+ .../tiny_mce/plugins/layer/editor_plugin.js,
+ .../tiny_mce/plugins/layer/editor_plugin_src.js,
+ .../tiny_mce/plugins/media/css/content.css,
+ .../jscripts/tiny_mce/plugins/media/css/media.css,
+ .../tiny_mce/plugins/media/editor_plugin.js,
+ .../tiny_mce/plugins/media/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/media/img/flash.gif,
+ .../tiny_mce/plugins/media/img/flv_player.swf,
+ .../tiny_mce/plugins/media/img/quicktime.gif,
+ .../tiny_mce/plugins/media/img/realmedia.gif,
+ .../tiny_mce/plugins/media/img/shockwave.gif,
+ .../jscripts/tiny_mce/plugins/media/img/trans.gif,
+ .../tiny_mce/plugins/media/img/windowsmedia.gif,
+ .../jscripts/tiny_mce/plugins/media/js/embed.js,
+ .../jscripts/tiny_mce/plugins/media/js/media.js,
+ .../tiny_mce/plugins/media/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/media/media.htm,
+ .../tiny_mce/plugins/nonbreaking/editor_plugin.js,
+ .../plugins/nonbreaking/editor_plugin_src.js,
+ .../tiny_mce/plugins/noneditable/editor_plugin.js,
+ .../plugins/noneditable/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/css/content.css,
+ .../tiny_mce/plugins/pagebreak/editor_plugin.js,
+ .../plugins/pagebreak/editor_plugin_src.js,
+ .../tiny_mce/plugins/pagebreak/img/pagebreak.gif,
+ .../tiny_mce/plugins/pagebreak/img/trans.gif,
+ .../jscripts/tiny_mce/plugins/paste/blank.htm,
+ .../jscripts/tiny_mce/plugins/paste/css/blank.css,
+ .../tiny_mce/plugins/paste/css/pasteword.css,
+ .../tiny_mce/plugins/paste/editor_plugin.js,
+ .../tiny_mce/plugins/paste/editor_plugin_src.js,
+ .../tiny_mce/plugins/paste/js/pastetext.js,
+ .../tiny_mce/plugins/paste/js/pasteword.js,
+ .../tiny_mce/plugins/paste/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/paste/pastetext.htm,
+ .../jscripts/tiny_mce/plugins/paste/pasteword.htm,
+ .../tiny_mce/plugins/preview/editor_plugin.js,
+ .../tiny_mce/plugins/preview/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/preview/example.html,
+ .../tiny_mce/plugins/preview/jscripts/embed.js,
+ .../tiny_mce/plugins/print/editor_plugin.js,
+ .../tiny_mce/plugins/print/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/safari/blank.htm,
+ .../tiny_mce/plugins/safari/editor_plugin.js,
+ .../tiny_mce/plugins/safari/editor_plugin_src.js,
+ .../tiny_mce/plugins/save/editor_plugin.js,
+ .../tiny_mce/plugins/save/editor_plugin_src.js,
+ .../plugins/searchreplace/css/searchreplace.css,
+ .../plugins/searchreplace/editor_plugin.js,
+ .../plugins/searchreplace/editor_plugin_src.js,
+ .../plugins/searchreplace/js/searchreplace.js,
+ .../tiny_mce/plugins/searchreplace/langs/en_dlg.js,
+ .../plugins/searchreplace/searchreplace.htm,
+ .../tiny_mce/plugins/spellchecker/css/content.css,
+ .../tiny_mce/plugins/spellchecker/editor_plugin.js,
+ .../plugins/spellchecker/editor_plugin_src.js,
+ .../tiny_mce/plugins/spellchecker/img/wline.gif,
+ .../jscripts/tiny_mce/plugins/style/css/props.css,
+ .../tiny_mce/plugins/style/editor_plugin.js,
+ .../tiny_mce/plugins/style/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/style/js/props.js,
+ .../tiny_mce/plugins/style/langs/en_dlg.js,
+ .../jscripts/tiny_mce/plugins/style/props.htm,
+ .../jscripts/tiny_mce/plugins/table/cell.htm,
+ .../jscripts/tiny_mce/plugins/table/css/cell.css,
+ .../jscripts/tiny_mce/plugins/table/css/row.css,
+ .../jscripts/tiny_mce/plugins/table/css/table.css,
+ .../tiny_mce/plugins/table/editor_plugin.js,
+ .../tiny_mce/plugins/table/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/table/js/cell.js,
+ .../tiny_mce/plugins/table/js/merge_cells.js,
+ .../jscripts/tiny_mce/plugins/table/js/row.js,
+ .../jscripts/tiny_mce/plugins/table/js/table.js,
+ .../tiny_mce/plugins/table/langs/en_dlg.js,
+ .../tiny_mce/plugins/table/merge_cells.htm,
+ .../jscripts/tiny_mce/plugins/table/row.htm,
+ .../jscripts/tiny_mce/plugins/table/table.htm,
+ .../jscripts/tiny_mce/plugins/template/blank.htm,
+ .../tiny_mce/plugins/template/css/template.css,
+ .../tiny_mce/plugins/template/editor_plugin.js,
+ .../tiny_mce/plugins/template/editor_plugin_src.js,
+ .../tiny_mce/plugins/template/js/template.js,
+ .../tiny_mce/plugins/template/langs/en_dlg.js,
+ .../tiny_mce/plugins/template/template.htm,
+ .../tiny_mce/plugins/visualchars/editor_plugin.js,
+ .../plugins/visualchars/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm,
+ .../tiny_mce/plugins/xhtmlxtras/acronym.htm,
+ .../tiny_mce/plugins/xhtmlxtras/attributes.htm,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm,
+ .../tiny_mce/plugins/xhtmlxtras/css/attributes.css,
+ .../tiny_mce/plugins/xhtmlxtras/css/popup.css,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/del.htm,
+ .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js,
+ .../plugins/xhtmlxtras/editor_plugin_src.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm,
+ .../tiny_mce/plugins/xhtmlxtras/js/abbr.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/acronym.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/attributes.js,
+ .../tiny_mce/plugins/xhtmlxtras/js/cite.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js,
+ .../plugins/xhtmlxtras/js/element_common.js,
+ .../jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js,
+ .../tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/about.htm,
+ .../jscripts/tiny_mce/themes/advanced/anchor.htm,
+ .../jscripts/tiny_mce/themes/advanced/charmap.htm,
+ .../tiny_mce/themes/advanced/color_picker.htm,
+ .../tiny_mce/themes/advanced/editor_template.js,
+ .../themes/advanced/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/advanced/image.htm,
+ .../tiny_mce/themes/advanced/img/colorpicker.jpg,
+ .../tiny_mce/themes/advanced/img/icons.gif,
+ .../jscripts/tiny_mce/themes/advanced/js/about.js,
+ .../jscripts/tiny_mce/themes/advanced/js/anchor.js,
+ .../tiny_mce/themes/advanced/js/charmap.js,
+ .../tiny_mce/themes/advanced/js/color_picker.js,
+ .../jscripts/tiny_mce/themes/advanced/js/image.js,
+ .../jscripts/tiny_mce/themes/advanced/js/link.js,
+ .../tiny_mce/themes/advanced/js/source_editor.js,
+ .../jscripts/tiny_mce/themes/advanced/langs/en.js,
+ .../tiny_mce/themes/advanced/langs/en_dlg.js,
+ .../jscripts/tiny_mce/themes/advanced/link.htm,
+ .../themes/advanced/skins/default/content.css,
+ .../themes/advanced/skins/default/dialog.css,
+ .../themes/advanced/skins/default/img/buttons.png,
+ .../themes/advanced/skins/default/img/items.gif,
+ .../advanced/skins/default/img/menu_arrow.gif,
+ .../advanced/skins/default/img/menu_check.gif,
+ .../themes/advanced/skins/default/img/progress.gif,
+ .../themes/advanced/skins/default/img/tabs.gif,
+ .../tiny_mce/themes/advanced/skins/default/ui.css,
+ .../themes/advanced/skins/o2k7/content.css,
+ .../tiny_mce/themes/advanced/skins/o2k7/dialog.css,
+ .../themes/advanced/skins/o2k7/img/button_bg.png,
+ .../advanced/skins/o2k7/img/button_bg_black.png,
+ .../advanced/skins/o2k7/img/button_bg_silver.png,
+ .../tiny_mce/themes/advanced/skins/o2k7/ui.css,
+ .../themes/advanced/skins/o2k7/ui_black.css,
+ .../themes/advanced/skins/o2k7/ui_silver.css,
+ .../tiny_mce/themes/advanced/source_editor.htm,
+ .../tiny_mce/themes/simple/editor_template.js,
+ .../tiny_mce/themes/simple/editor_template_src.js,
+ .../jscripts/tiny_mce/themes/simple/img/icons.gif,
+ .../jscripts/tiny_mce/themes/simple/langs/en.js,
+ .../themes/simple/skins/default/content.css,
+ .../tiny_mce/themes/simple/skins/default/ui.css,
+ .../tiny_mce/themes/simple/skins/o2k7/content.css,
+ .../themes/simple/skins/o2k7/img/button_bg.png,
+ .../tiny_mce/themes/simple/skins/o2k7/ui.css,
+ mod/tinymce/tinymce/jscripts/tiny_mce/tiny_mce.js,
+ .../tinymce/jscripts/tiny_mce/tiny_mce_popup.js,
+ .../jscripts/tiny_mce/utils/editable_selects.js,
+ .../tinymce/jscripts/tiny_mce/utils/form_utils.js,
+ .../tinymce/jscripts/tiny_mce/utils/mctabs.js,
+ .../tinymce/jscripts/tiny_mce/utils/validate.js,
+ mod/tinymce/views/default/embed/addcontentjs.php,
+ mod/tinymce/views/default/input/longtext.php,
+ mod/tinymce/views/default/tinymce/css.php,
+ mod/twitter/graphics/thewire_speech_bubble.gif,
+ mod/twitter/graphics/twitter.png, mod/twitter/languages/en.php,
+ mod/twitter/manifest.xml, mod/twitter/start.php,
+ mod/twitter/views/default/twitter/css.php,
+ mod/twitter/views/default/widgets/twitter/edit.php,
+ mod/twitter/views/default/widgets/twitter/view.php,
+ mod/twitterservice/languages/en.php, mod/twitterservice/manifest.xml,
+ mod/twitterservice/start.php, mod/twitterservice/vendors/twitter/license.txt,
+ mod/twitterservice/vendors/twitter/load.php,
+ mod/twitterservice/vendors/twitter/readme.txt,
+ mod/twitterservice/vendors/twitter/send.php,
+ .../vendors/twitter/twitter.class.php,
+ .../default/usersettings/twitterservice/edit.php,
+ mod/zaudio/audioplayer/audio-player.js, mod/zaudio/audioplayer/license.txt,
+ mod/zaudio/audioplayer/player.swf, mod/zaudio/manifest.xml,
+ mod/zaudio/readme.txt, mod/zaudio/start.php,
+ .../default/file/specialcontent/audio/mp3.php,
+ .../default/file/specialcontent/audio/mpeg.php,
+ .../default/file/specialcontent/audio/mpg.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php,
+ views/default/annotation/annotate.php,
+ views/default/annotation/generic_comment.php,
+ views/default/annotation/latest_comments.php,
+ views/default/canvas/default.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/one_column_with_sidebar.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/canvas_header/submenu_group.php,
+ views/default/comments/forms/edit.php, views/default/css.php,
+ views/default/css_ie.php, views/default/css_ie6.php,
+ views/default/entities/entity_list.php,
+ views/default/entities/entity_listing.php, views/default/friends/picker.php,
+ views/default/friends/river/create.php,
+ views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php, views/default/input/access.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php, views/default/js/initialise_elgg.php,
+ views/default/js/upload_js.php, views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/main_nav.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/topbar_tools.php,
+ .../notifications/settings/usersettings.php,
+ views/default/output/confirmlink.php, views/default/output/rss_view.php,
+ views/default/output/tags.php, views/default/output/url.php,
+ views/default/page_elements/breadcrumbs.php,
+ views/default/page_elements/content_header.php,
+ .../page_elements/content_header_member.php,
+ views/default/page_elements/contentwrapper.php,
+ views/default/page_elements/elgg_content.php,
+ views/default/page_elements/elgg_footer.php,
+ views/default/page_elements/elgg_header.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_contents.php,
+ views/default/page_elements/html_begin.php,
+ views/default/page_elements/html_end.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/spotlight.php,
+ views/default/page_elements/title.php, views/default/page_shells/default.php,
+ views/default/pageshells/pageshell.php, views/default/river/item/list.php,
+ views/default/river/item/wrapper.php, views/default/settings/system.php,
+ views/default/spotlight/default.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php, views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php: Pulled in the interface
+ changes.
+
+2010-03-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes file for 1.7 release.
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2010030101.sql,
+ version.php: Fixes #1562: Added a default value for entities.last_action in
+ the schema and as an upgraded. Bumped version number to 1.7 final.
+
+ * mod/search/search_hooks.php, mod/search/views/default/search/entity.php:
+ Updated the the default search entity view to check for users and groups and
+ properly display their profile icons.
+
+2010-03-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Fixing punctuation in upgrade strings.
+
+ * INSTALL.txt: Refs #1562: Updated requirements for Elgg.
+
+ * engine/lib/group.php: Fixes #1566: Rewriting calls to get_group_members()
+ to use 1.7's constant for site_guid.
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/tests/regression/trac_bugs.php: Fixes #1558: Applied Cash's patch.
+ Added unit tests to test for regressions for any bugs fixed in trac.
+
+ * engine/tests/objects/entities.php, engine/tests/objects/objects.php: Fixed
+ unit tests for exportable values after [3977].
+
+ * engine/lib/entities.php: Fixes #1563: Added time_updated and site_guid to
+ the export vals.
+
+ * mod/search/languages/en.php: Changed search language array variable name.
+
+2010-02-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Fixes #1540: Added site_guid to
+ get_user_access_collections().
+
+ * engine/lib/relationships.php: Refs #1553: Corrected profile link in
+ friending notification.
+
+ * engine/lib/tags.php: Fixes #1555: Added missing call to
+ elgg_get_registered_tag_metadata_names() and defined missing variable.
+
+ * engine/lib/actions.php: Added login to the list of actions not requiring a
+ security token.
+
+2010-02-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump.
+
+ * engine/lib/metadata.php, engine/tests/api/entity_getter_functions.php:
+ Fixes #1542: Pulled in Kevin's patch to add ability to sort by metadata.
+ Added unit tests for this.
+
+2010-02-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/tests/api/entity_getter_functions.php:
+ Refs #1543: Added support to have pass an array as a value in the
+ metadata_name_value_pair option of elgg_get_entities_from_metadata(). Added
+ unit tests for elgg_get_entities_from_metadata(). Cleaned up some
+ documentation for elgg_get_entities_from_metadata().
+
+2010-02-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/objects.php, engine/lib/users.php: Fixes
+ #1528: Correctly throwing exceptions for objects, groups, and users.
+
+2010-02-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: river plugin is defunct so does not
+ need to be enabled on install
+
+ * mod/diagnostics/actions/download.php, mod/diagnostics/start.php: Fixes
+ #1544: plugin hook for diagnostics now for entity "system"
+
+2010-02-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixes #1531: Correctly implemented dates for
+ friendly times. No more coding while watching the Olympics!
+
+2010-02-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/url.php: Fixes #1541: javascript now correctly
+ included in output/url view
+
+2010-02-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/xml/pageshells/pageshell.php: Fixes #1517 - let web server set
+ content length on xml files
+
+2010-02-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/elgglib.php, views/default/output/confirmlink.php,
+ views/default/output/url.php, views/default/page_elements/spotlight.php:
+ Deprecated elgg_validate_action_url() by elgg_add_action_tokens_to_url().
+ Updated elgg_deprecated_notice() to include the file & line of the caller.
+ Updated core to use elgg_add_action_tokens_to_url().
+
+2010-02-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/xml.php: Refs #1517: only encode <,>, and & for strings in xml
+
+2010-02-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, actions/admin/site/update_basic.php,
+ actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ actions/admin/user/resetpassword.php, actions/admin/user/unban.php,
+ actions/comments/add.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/remove.php,
+ actions/import/opendd.php, actions/login.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, actions/usersettings/save.php, actions/widgets/save.php:
+ Refs #1538: Removed action_gatekeeper() from action files in core.
+
+ * htaccess_dist: Fixes #1539: Removed line endings from htaccess_dist.
+
+2010-02-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, services/api/rest.php, services/api/rest_api.php:
+ Apache's MultiViews was matching the rest page handler incorrectly
+
+2010-02-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, languages/en.php: Refs #1531: Added full time and
+ dates to friendly time stamptes via acronym tags.
+
+ * mod/search/index.php, mod/search/search_hooks.php, mod/search/start.php:
+ Fixes #1523: Updated search to use ELGG_ENTITIES_NO_VALUE/ANY_VALUE and
+ removed some commented out code.
+
+2010-02-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixes #1421: Banning and unbanning users invalidates
+ the memcache entity.
+
+ * admin/user.php: Corrected fullview call in users admin section.
+
+ * views/default/js/initialise_elgg.php: Refs #1504: Removing revert option
+ from widget draggables to avoid fly away effect in IE 7.
+
+ * views/default/canvas/layouts/widgets.php: Fixed a bug in widget layouts
+ that caused the "edit page" link to not work if no widgets were defined.
+
+ * views/default/friends/picker.php: Fixes #1532: Added security tokens to
+ friend picker when in form mode.
+
+ * views/rss/pageshells/pageshell.php: Fixes #1535: Corrected double replace
+ for URL in RSS title view.
+
+ * engine/lib/access.php: Fixes #1519: Corrected site_guid in
+ create_access_collection().
+
+2010-02-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/entity_getter_functions.php: Getter API test: Moved the
+ setup and tear down into the construct and destruct methods. Fixed a few new
+ tests that were failing because of sorting by time.
+
+2010-02-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/user.php, dashboard/latest.php, engine/lib/activity.php,
+ engine/lib/admin.php, engine/lib/entities.php, engine/lib/export.php,
+ engine/lib/group.php, engine/lib/input.php, engine/lib/metadata.php,
+ engine/lib/notification.php, engine/lib/objects.php,
+ engine/lib/relationships.php, engine/lib/river2.php, engine/lib/sites.php,
+ engine/lib/users.php, index.php: Fixes #1488: Removed use of deprecated
+ functions in core.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/metadata.php,
+ engine/tests/api/entity_getter_functions.php: Refs #1523: elgg_get_entities()
+ uses the constants for defaults and conditionals. Added some tests to check
+ for no subtypes. Updated the documentation.
+
+ * engine/tests/api/entity_getter_functions.php, mod/diagnostics/index.php,
+ mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ mod/diagnostics/testreport.php, mod/diagnostics/unittester.php,
+ mod/diagnostics/views/default/diagnostics/test.php,
+ .../views/default/diagnostics/testresult.php: Fixes #1526: Big honking
+ warning added to unit tests. Getter test also deletes its subtypes now.
+
+ * mod/search/README.txt: Updated docs for search.
+
+ * engine/lib/actions.php: Fixes #1527: Logout doens't require an action
+ token. This is a temporary fix until #1509 is implemented.
+
+ * mod/search/search_hooks.php: Fixes #1499: User and group search default to
+ ignoring subtypes to return all entities.
+
+2010-02-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/index.php: Fixed incorrect variable calls in search.
+
+ * mod/search/search_hooks.php: Not using elgg_get_entities_from_metadata()
+ for tag search because of performance issues. Switched to custom WHERE /
+ JOINs with elgg_get_entities().
+
+ * engine/lib/elgglib.php: Removing embed extended view from core.
+
+2010-02-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, languages/en.php, mod/search/search_hooks.php,
+ views/default/output/tags.php: Cleaned up tag searching so you can search on
+ a specific tag. Useful in search so a tag in "Things I like" won't match a
+ tag in "Things I hate."
+
+2010-02-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Can't type hint for strings.
+
+ * CHANGES.txt, engine/lib/entities.php, engine/lib/tags.php,
+ mod/search/search_hooks.php: Closes #1506: Added
+ elgg_register_tag_metadata_name(), elgg_get_registered_tag_metadata_names(),
+ and ElggEntity::getTags(). Search on tags updated to use registered tag
+ names instead of hard-coded 'tags' metadata name.
+
+ * engine/lib/elgglib.php: Fixes #1510: Added elgg_get_file_list().
+ get_library_files() wraps to this function with a deprecation notice for any
+ plugin authors using it to auto-load files.
+
+ * engine/lib/api.php, engine/lib/elgglib.php, engine/lib/input.php,
+ engine/lib/mb_wrapper.php, engine/lib/pagehandler.php,
+ mod/search/views/default/search/listing.php: Fixes #1512: Using a helper
+ function for mb_parse_str() instead of wrapping it exactly.
+
+2010-02-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, languages/en.php: updated documentation on the REST
+ API user authentication
+
+2010-02-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/lib/elgglib.php, engine/lib/input.php,
+ engine/lib/mb_wrapper.php, engine/lib/pagehandler.php: Fixes #1501: Setting
+ ini for mbstring.internal_encoding to utf8 to work around a PHP bug. Replaced
+ calls to parse_str() with elgg_parse_str().
+
+ * views/default/navigation/pagination.php: Fixes #1507: $vars['baseurl']
+ used instead of undefined $baseurl in pagination view.
+
+2010-02-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: fixes #1505 - some lazy css was impacting opera for
+ checkboxes - overriding border and padding properties inherited from input
+ selector
+
+2010-02-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/url.php: Made the output/url view backward compatible
+ for the few plugins that used it.
+
+2010-02-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Remove version from default theme's css.
+
+2010-02-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/start.php: Fixes #1503, fixes #1474:
+ Library files are loaded using a hard-coded list to better deal with removed
+ files. Also, ~4% performance increase per page load on my server!
+
+ * mod/search/start.php: Correcting the corrected documentation.
+
+ * mod/search/start.php: Documentation correction in search.
+
+2010-02-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php, mod/crontrigger/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/garbagecollector/manifest.xml,
+ mod/htmlawed/manifest.xml, mod/logbrowser/manifest.xml,
+ mod/logrotate/manifest.xml, mod/search/manifest.xml,
+ mod/uservalidationbyemail/manifest.xml: Updated copyright for core plugin
+ manifests.
+
+ * engine/lib/access.php, engine/tests/api/entity_getter_functions.php: Fixes
+ #1496: delete_access_collection() invalidates the access collection cache
+ before attempting to delete. Removed a misplaced unset() in a unit test that
+ was causing test objects not to be properly deleted.
+
+2010-02-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/settings/system.php: finished the fix to #1492
+
+ * languages/en.php: more user friendly section title on user stats page
+
+ * languages/en.php: fixed punctuation issue on install instructions
+
+ * engine/lib/api.php, languages/en.php: tweaked some documentation on the
+ REST API
+
+2010-02-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Correcting documentation for
+ elgg_get_entities_from_metadata().
+
+2010-02-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/header.php: & replaced by &amp; in the header and
+ alt added to some header graphics
+
+ * CONTRIBUTORS.txt: updated
+
+2010-02-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/api/entity_getter_functions.php, engine/tests/suite.php: Refs
+ #1200: Added tests to test for false being returned with elgg_get_entities().
+ Disabled execution time during unit tests.
+
+ * actions/systemsettings/install.php, engine/lib/ping.php, languages/en.php,
+ views/failsafe/settings/system.php: Fixes #1492: Removed usage info
+ collecting from installation.
+
+ * engine/schema/mysql.sql: Fixes #1493: Updated schema to set auto_increment
+ IDs for access_collections to 3 to avoid overwriting default values with
+ group / shared access ACLs.
+
+ * views/default/css.php: Fixes #1491: Removed mistakingly assigned
+ input-password with input-textarea.
+
+2010-02-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/version.php: missing new on upgrade_details object creation
+
+ * engine/lib/elgglib.php: fixes #1486 - elgg_dump now works when sending to
+ server error log
+
+2010-02-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Fixes #1404: Added input-password rules in default
+ css.
+
+2010-02-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, languages/en.php: Fixes #1483: Reset password emails
+ forward to a confirmation page handler instead of directly to an action.
+
+ * engine/lib/pageowner.php: Fixes #1212: Removed unused code.
+
+ * engine/lib/elgglib.php: Fixes #1486: elgg_log() can now log arrays and
+ objects to error_log().
+
+ * engine/lib/xml-rpc.php: Fixes #1319: Applied patch for missing xml-rpc
+ <value> tag.
+
+ * CHANGES.txt, engine/lib/elgglib.php,
+ views/default/navigation/pagination.php, views/default/river/item/list.php:
+ Fixes #1481: Applie Mike's patch and created function
+ elgg_http_add_url_query_elements() to handle what the pagination view was
+ trying to do.
+
+2010-02-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: updated copyright to 2010
+
+2010-02-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/tests/api/entity_getter_functions.php: Refs #1200: Changed logic in
+ elgg_get_entity_type_subtype_where_sql() to return FALSE if there are no
+ valid subtypes passed. Ignores all invalid subtypes. Added (partial) tests
+ for elgg_get_entities() types and subtypes.
+
+2010-02-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * INSTALL.txt: updated install instructions to encourage more use of the
+ wiki instructions/troubleshooting and discourage setting data directory to
+ 777 as default
+
+ * views/rss/pageshells/pageshell.php: fixed a comment in rss pageshell
+
+2010-02-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: PHP complains about not casting the timestampt
+ to int for use in date().
+
+ * engine/lib/metadata.php: Added error checking to
+ clear_metadata_by_owner().
+
+ * engine/lib/entities.php: Fixed incorrect variable for subtype in
+ get_entity_dates().
+
+ * views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php: Fixes #1328: Removed rows and cols
+ from the installation textareas and added CSS to format width/height at 100%
+ to make it easier to read and select.
+
+ * engine/lib/elgglib.php: Fixes #340: add_menu() and make_register_object()
+ deprecated.
+
+ * engine/lib/languages.php: Fixes #1166. get_installed_translations() only
+ calculates completion if admin is logge din.
+
+ * CHANGES.txt, engine/lib/entities.php: Fixes #1406: get_entity_dates()
+ supports order by.
+
+ * engine/lib/database.php: Adding some \ns between the SQL error and the
+ query in the database exception.
+
+ * engine/lib/input.php: Fixes #1398: autop() doesn't call missing
+ clean_pre() function.
+
+ * CHANGES.txt, engine/lib/entities.php: Fixes #1376: added
+ ElggEntity::removeRelationship().
+
+ * engine/lib/elgglib.php: Fixes #1478: uh....how did that get in there?
+
+ * engine/lib/elgglib.php: Fixes: #1475. elgg_http_build_url() correctly
+ sets port number.
+
+ * engine/lib/filestore.php: Fixes #1314: Filestore opens read-only with rb
+ instead of r+b.
+
+ * actions/email/save.php: Refs #1290: Changed email addresses are checked in
+ action:email/save
+
+ * engine/lib/elgglib.php: Fixes #1261: Exceptions force an HTTP recache.
+
+ * CHANGES.txt, engine/lib/relationships.php: Fixes #1213:
+ delete_relationship() triggers delete:relationship hook.
+
+ * engine/lib/pageowner.php: Fixes #1211: page_owner() sets the page owner
+ after figuring it out.
+
+ * engine/lib/entities.php: Updated documentation for elgg_get_entities().
+
+ * CHANGES.txt, engine/lib/entities.php: Fixes #1325:
+ ElggEntities::countEntitiesFromRelationship() support inverse relationships.
+
+ * engine/lib/users.php, views/default/account/forms/login.php: Fixes #1473:
+ Simple patch to create a view for the registration page.
+
+ * engine/lib/annotations.php: Fixed incorrect deprecated warning.
+
+ * engine/lib/elgglib.php: Refs #1079: elgg_view() casts view to a string
+ before attempting to call views.
+
+ * engine/lib/users.php: Fixes #678. Friending appears in the river for
+ invited new users.
+
+ * engine/lib/entities.php: Put the can_write_to_container() plugin hook in
+ the right place after [3871].
+
+ * CHANGES.txt, engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/metadata.php, engine/lib/objects.php,
+ engine/lib/relationships.php, engine/lib/sites.php, engine/lib/users.php,
+ views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php: Add elgg_deprecated_notice() so we
+ don't have to re-write all the elgg_log() deprecated notices to
+ register_error()s. Updated current ones to use this.
+
+2010-01-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/listing.php: Removing var_dump().
+
+ * CHANGES.txt, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php,
+ mod/search/views/default/search/listing.php,
+ views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php: Deprecated old search functions and
+ views.
+
+ * CHANGES.txt, engine/lib/entities.php: Fixes #1164:
+ can_write_to_container() now sends default values through
+ container_permissions_check hook.
+
+ * mod/htmlawed/start.php: htmlawed no longer creates tags with extra spaces
+ (<p >).
+
+ * views/rss/pageshells/pageshell.php: Fixes #1289: Pragma: public header
+ added for RSS feeds.
+
+ * engine/lib/users.php: Fixes #804: A relationship is created between a new
+ user and the site it was created on.
+
+ * engine/lib/elgglib.php, views/default/navigation/pagination.php,
+ views/default/navigation/viewtype.php, views/default/river/item/list.php:
+ Fixes #959: Added elgg_http_remove_url_query_element() to remove a GET
+ element instead of using faulty regexp.
+
+2010-01-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Changed array_key_exists() to isset() in
+ elgg_validate_action_url().
+
+ * engine/lib/elgglib.php: Added checking for $query array in
+ elgg_validate_action_url().
+
+ * engine/lib/input.php: Setting a default value to avoid notices.
+
+ * mod/htmlawed/start.php, mod/htmlawed/vendors/htmLawed/htmLawed.php,
+ mod/htmlawed/vendors/htmLawed/htmLawedTest.php,
+ mod/htmlawed/vendors/htmLawed/htmLawed_README.htm,
+ mod/htmlawed/vendors/htmLawed/htmLawed_README.txt,
+ .../vendors/htmLawed/htmLawed_TESTCASE.txt: Fixes #1425, Fixes #1341:
+ Upgraded htmlawed to latest. Altered the htmlawed attribute filtering
+ function to return <attr="val"> for proper linking in parse_urls(). Added
+ background-color as a non-filtered style attribute.
+
+ * engine/lib/input.php: Refs #1425: Cleaned up regexp for parlse_urls().
+
+2010-01-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Fixes #1468: Cleaned up logic for enabling and
+ disabling plugins. Checking for arrays when metadata returns only a single
+ enabled plugin.
+
+ * admin/plugins.php, mod/diagnostics/index.php, mod/logbrowser/index.php:
+ Removed unneeded owner block icons from admin.
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2010012901.sql,
+ version.php: Added db migration 2010012901 that adds last_action column to
+ entities table. Bumped version number to 1.7b (2010012901).
+
+ * CHANGES.txt, engine/lib/relationships.php: Fixes #1472:
+ get_entity_relationships() supports inverse relationships.
+
+ * engine/lib/elgglib.php: Fixes #1470, Fixes #1471:
+ elgg_view_regenerate_simplecache() no longer triggers the pagesetup/system
+ hook. Fixes problems with creating the submenu.
+
+2010-01-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Corrected clear_plugin_setting() to only remove a
+ single plugin setting instead of all setting for a plugin. Added
+ clear_all_plugin_settings() to remove all settings for a plugin.
+
+2010-01-28 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: changed my email address to web site in contributors
+ file
+
+2010-01-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/useradd.php, engine/lib/users.php: Fixes #1049, Fixes #1435:
+ Admin-created users and first admin user are marked as validated to prevent
+ inaccurate "Please validate your account" messages and emails.
+
+2010-01-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/annotations.php, engine/lib/river2.php: Fixes
+ #1419: Added remove_from_river_by_annotation(). Deleting annotations now
+ deletes their river entry.
+
+ * CHANGES.txt: Updated changes.
+
+ * engine/lib/elgglib.php: Fixes #1465: Added unregister_event_handler() and
+ unregister_plugin_hook().
+
+ * engine/lib/sessions.php: Fixes #1464: A new session is created in logout()
+ after destorying the old session to display old $_SESSION['msg'] messages.
+
+2010-01-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes for the display name change.
+
+ * actions/user/name.php, languages/en.php,
+ views/default/user/settings/name.php: Display names are limited to 50 chars
+ and have HTML tags removed.
+
+ * README.txt: Bumped version number in README.
+
+ * views/default/css.php: Fixed a typo in css that broke everything in FF
+ 3.6.
+
+ * CHANGES.txt, engine/lib/plugins.php, languages/en.php: Fixes #1454:
+ Applied Cash's patch. Bad plugins are automatically disabled and a notice is
+ displayed instead of breaking the site.
+
+2010-01-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, engine/lib/input.php: Fixes #1450, Fixes #1461:
+ Using $_SERVER['REQUEST_URI'] to pull in GET params on apache servers.
+
+2010-01-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Correctly forwarding messages among multiple
+ forwards (action_gatekeeper() -> index -> dashboard would drop messages
+ generated in action_gatekeeper()).
+
+ * actions/systemsettings/install.php: Refs #1450, Refs #1461, Refs #1460:
+ Install now clears out views caches.
+
+ * mod/diagnostics/start.php: Masking dbpassword in dianostics file.
+
+ * engine/lib/actions.php: Fixes #1460, Fixes #1459: Tokens are not required
+ to disable a plugin or install. This allows users to disable plugins that
+ overwrite admin pages without tokens.
+
+ * views/failsafe/input/form.php, views/failsafe/input/securitytoken.php:
+ Refs #1459: Added missing security tokens for failsafe (installation) view.
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, actions/admin/user/ban.php,
+ actions/admin/user/delete.php, actions/admin/user/makeadmin.php,
+ actions/admin/user/removeadmin.php, actions/admin/user/resetpassword.php,
+ actions/admin/user/unban.php, actions/email/save.php,
+ actions/entities/delete.php, actions/register.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, actions/usersettings/save.php: Removing calls to
+ engine/start.php in action files.
+
+ * CODING.txt: Added best practices to CODING.txt.
+
+2010-01-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/object/default.php: Fixed missing ) causing a WSOD.
+
+ * views/default/admin/user_opt/search.php: Fixes #1455: Updated search URL
+ for admin user search. (The old one worked, but didn't limit to users.)
+
+2010-01-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../actions/email/confirm.php, mod/uservalidationbyemail/manifest.xml,
+ mod/uservalidationbyemail/start.php: Changed uservalidationbyemail to not use
+ an action and cleaned up some of its code.
+
+ * engine/lib/elgglib.php: Fixed a bug preventing messages and warnings from
+ passing during a forward().
+
+2010-01-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/basic_elements/welcome.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/welcome/logged_in.php: Updated views to use output/url with
+ action flag set.
+
+ * views/default/output/action_link.php, views/default/output/url.php:
+ Removed output/action_link view as it duplicated much of output/url. Improved
+ output/url view.
+
+ * engine/lib/metadata.php: Corrected a possible SQL insertion bug in
+ elgg_get_entity_metadata_where_sql().
+
+ * engine/lib/filestore.php: Fixing bug in resizing function that would
+ incorrectly attempt to crop a picture that was smaller than the target image.
+
+
+ * engine/lib/elgglib.php: Changed default declaration of $vars in
+ elgg_view() to array().
+
+ * views/default/object/default.php: Fixed a typo causing a WSOD.
+
+ * engine/lib/actions.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/basic_elements/welcome.php,
+ views/default/canvas/layouts/widgets.php, views/default/css.php,
+ views/default/object/default.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/spotlight.php,
+ views/default/welcome/logged_in.php: Fixes #750: All actions require
+ __elgg_ts and __elgg_token.
+
+ * engine/lib/elgglib.php: elgg_http_build_query() now supports ports.
+ Checking for __elgg_ts also in elgg_validate_action_url(). Fixed a spelling
+ mistake ;)
+
+ * views/default/output/action_link.php: Adding a view to generate action
+ links for single-click actions.
+
+2010-01-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/listing.php: Fixing bugs in search that
+ would break pagination.
+
+ * views/rss/navigation/pagination.php: Refs #1161: Added empty pagination
+ view for RSS feeds.
+
+ * engine/lib/filestore.php: Resetting cropping coords for images that can't
+ be cropped in filestore.
+
+ * engine/lib/filestore.php: Fixes #1445:
+ get_resized_image_from_existing_file() has an optional parameter to allow
+ upscaling if requested image is larger than original image.
+
+ * engine/lib/entities.php: Fixed documentation for time created and modified
+ params in elgg_get_entities().
+
+2010-01-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/search_hooks.php: Removing order by clause for now in search.
+
+ * CHANGES.txt: Updated CHANGES for #1414.
+
+2010-01-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/page_elements/searchbox.php: Stripping slashes on output
+ of original search query.
+
+ * mod/search/start.php: Allowing no table prefix in
+ search_get_search_where_sql()
+
+ * mod/search/start.php: Fixed incorrect order by for search sorting.
+
+ * mod/search/index.php, mod/search/search_hooks.php, mod/search/start.php:
+ Fixed an incorrect var name that caused a bug when hooking against a type but
+ not a subtype. Added first pass at results sorting.
+
+ * mod/search/README.txt, mod/search/index.php, mod/search/start.php,
+ mod/search/views/default/search/layout.php: Removed unnecessary view
+ directories. Added option of overriding the default layout for search
+ queries. Updated documentation reflecting those changes. Clarified some
+ points in the documentation.
+
+ * engine/lib/elgglib.php: Added checking and an ERROR log if elgg_view() is
+ passed a non-array $vars.
+
+2010-01-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: Updated contributors with entire MITRE team.
+
+2010-01-13 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Creating a helper function to return INI values in
+ bytes.
+
+2010-01-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixes #1414: Metadata set to a falsy value
+ (except NULL) returns TRUE for isset($obj->md).
+
+2010-01-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/metadata.php,
+ engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php,
+ engine/tests/objects/objects.php, engine/tests/objects/users.php: closes
+ #1145 - deprecated current "copy constructor" for all entities and
+ implemented a clone method. The clone copies over all metadata but not
+ annotations and private settings. It sets the guid to 0 so saving the cloned
+ entity creates a new database record. The ownership/access of metadata is set
+ during the save and will be the same as that of the entity.
+
+2010-01-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/rss/search/entity.php: Cleaned up RSS entity view for
+ search a bit.
+
+ * mod/search/index.php, mod/search/views/rss/search/entity.php,
+ mod/search/views/rss/search/listing.php: Added phpdoc header to index.php
+ Added RSS support to search. Nifty.
+
+2010-01-11 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/output/confirmlink.php: Always
+ generating action tokens with output/confirmlink. Includes a check for
+ actions already defining the tokens.
+
+2010-01-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/README.txt: Fixed a few spelling mistakes. Added descriptions
+ for the vars in 3.2
+
+ * engine/lib/relationships.php: Sanitising relationship in
+ elgg_get_entities_from_relationship();
+
+ * views/default/output/tags.php: Fixed tag output link for new search.
+
+ * mod/search/README.txt, mod/search/index.php, mod/search/start.php,
+ .../views/default/search/comments/entity.php,
+ .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/entity.php,
+ mod/search/views/default/search/listing.php: Pulling out entity views in
+ search. Adding dev documentation.
+
+2010-01-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fixes #1399: Case sensitivity was never in the
+ deprecated function, so no need to add it. Use the new functions if
+ required.
+
+ * engine/lib/metadata.php: Fixes #538. Applied Cash's patch. This is an old
+ one...jeepers.
+
+ * engine/lib/metadata.php: Fixes #1375: Metadata names and values are
+ properly escaped.
+
+2010-01-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #1400: Fixed a typo in checking the
+ site_guid. Can't duplicate #1400 now, so possible fix for that. Waiting for
+ other tests to close this one.
+
+ * languages/en.php: Updated language file to reflect default prefix change.
+
+ * views/failsafe/messages/sanitisation/settings.php: Changed default prefix
+ to 'elgg_' for table name readability.
+
+ * actions/systemsettings/install.php, engine/lib/input.php: Fixes #1172: URL
+ now checked for trailing slash upon installation.
+
+2010-01-06 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009102801.php: Fixing an upgrade issue relating from
+ invalid (non-existent) usernames
+
+2010-01-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2010010501.php, version.php: Added an upgrade to
+ enable the search plugin. Bumped internal version number.
+
+2010-01-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Set admin user's validation upon initial
+ registration. Fixes an incorrect error message if the first admin user enters
+ the wrong password.
+
+2009-12-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Closes #1424: Faulty database migrations will now
+ halt an upgrade.
+
+ * engine/lib/metadata.php: Removed debug data.
+
+ * engine/schema/upgrades/2009100701.sql: Removed lock tables from db utf8
+ migration because it fails on some (all?) servers.
+
+2009-12-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/access.php, views/default/input/button.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/tags.php, views/default/output/confirmlink.php,
+ views/default/page_elements/header.php: a little cleanup of documentation and
+ variable handling in input and output views
+
+ * entities/index.php: removed unused variable in entities index
+
+ * engine/lib/group.php: fixed #1087 - is_group_member() now returns boolean
+ values only
+
+ * engine/lib/entities.php: fixes #988 - subtype is now available on new
+ entities after being saved
+
+2009-12-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: fixed bug where array of messages passed to
+ system_messages caused execution to stop - also displaying only errors if
+ they exist rather than having success and error messages overlapping each
+ other
+
+ * engine/lib/users.php: fixes #1322 - "remember me" cookie code is cleared
+ when a user is banned
+
+ * views/default/page_elements/header.php,
+ views/failsafe/pageshells/pageshell.php: fixes #1193 - now specify charset in
+ both metatag and http header
+
+ * engine/lib/database.php: cleaned up logic on db query cache
+
+ * engine/lib/entities.php: fixed typo in list_entities()
+
+2009-12-18 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Clarified the documentation for
+ add_entity_relationship().
+
+2009-12-18 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/comments/add.php: add comment action now using get_loggedin_user()
+ rather than $_SESSION['user']
+
+ * views/default/input/form.php: added js to input/form
+
+ * engine/lib/actions.php, engine/lib/pagehandler.php: better parsing of
+ query for action and page handlers
+
+2009-12-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/mb_wrapper.php: perhaps this is what Brett intended with the
+ new mb_wrapper code
+
+ * views/default/input/button.php, views/default/input/form.php,
+ views/default/input/submit.php, views/default/input/text.php: fixed notices
+ caused by some input views
+
+ * engine/lib/database.php: fixed warning due to database query cache
+
+ * engine/lib/entities.php: when asking for a count of entities, we now
+ return an integer rather than a string
+
+ * engine/lib/elgglib.php: get_submenu was throwing out tons of notices -
+ this should be fixed now
+
+ * views/default/css.php: fixes #951 - using background-color rather than
+ background
+
+2009-12-16 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: better version of
+ get_resized_image_from_existing_file() - fixes #685 - more robust to errors,
+ and fixes a memory leak - tested with both profile photos and file plugin
+ photos - old installs will still have profile icons of the wrong size due to
+ #685
+
+ * engine/lib/input.php: added comments on get_input and set_input since they
+ do not handle nested arrays
+
+2009-12-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: Fixes #1413: New server test.
+
+2009-12-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: closes #1277 - display_tagcloud() now has same
+ parameters as get_tags()
+
+ * views/default/output/tagcloud.php: fixes #1197 - no division by zero
+ warning any longer
+
+ * views/default/account/forms/login.php,
+ views/default/account/forms/register.php: easier to extend login and
+ registration forms now
+
+ * CHANGES.txt: updated CHANGES.txt with info on river table
+
+ * engine/tests/services/api.php: fixed line endings on services api unit
+ tests
+
+ * languages/en.php: added some missing language strings
+
+2009-12-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: closes #1244 - checking whether file exists before
+ deleting it in cache
+
+ * views/default/friends/collectiontabs.php: closes #1226 - fixes eclipse
+ validation error
+
+ * languages/en.php, views/default/admin/user_opt/search.php: fixes #1230 -
+ spelling corrected
+
+ * engine/lib/access.php: using defines for ACCESS values - closes #1064
+
+ * mod/htmlawed/start.php: removes @ from include - closes #879
+
+ * actions/admin/user/ban.php: removes unused variables - closes #1129
+
+2009-12-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: minor tweak in comment - closes #1264
+
+ * views/default/css.php, views/default/page_elements/owner_block.php: fixes
+ #973 - pulls reported content and bookmark code out of core owner_block view
+ - left images in _graphics since themes probably depend on that and did not
+ want to break themes
+
+ * engine/lib/relationships.php: fixes #1323 and #1186 - PHP 5.3 requires
+ magic methods to be public
+
+2009-12-08 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/users.php,
+ engine/tests/objects/users.php: fixes #1305 - user and entity cache now
+ cleared on delete
+
+ * engine/lib/sessions.php, languages/en.php: gatekeeper functions now
+ display helpful messages - closes #1060
+
+ * engine/lib/group.php: fixes #1287 - users now removed from group acl when
+ leaving group - changed order of event and relationship removal
+
+ * .../canvas/layouts/two_column_right_sidebar.php, views/default/css.php:
+ fixes #537 - missing area3 added to two_column_right_sidebar - also added
+ enough css so that the login page works with right sidebar
+
+2009-12-07 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Adding alias ElggSession methods
+
+2009-12-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: fixes #1187
+
+ * actions/comments/add.php, languages/en.php: fixes #1018 - blank comments
+ are now rejected
+
+ * views/default/input/form.php, views/failsafe/input/form.php,
+ views/failsafe/messages/sanitisation/settings.php: fixes #1183 - correct case
+ for form method now
+
+ * engine/lib/elgglib.php: fixed issue where php notices were written to log
+ on any debug level and added a plugin hook so plugins can direct elgg_log
+ messages where they want
+
+ * actions/login.php: fixed warning on access of array index that did not
+ exist in session global
+
+ * engine/lib/access.php: removed code that wasn't doing anything in
+ access.php
+
+ * engine/lib/relationships.php: fixed typo in
+ get_entities_from_relationship()
+
+2009-12-05 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/start.php: adding more security to the user
+ validation by email code - before people could fake the validation with
+ knowledge of the code making it possible for bots to register and validate
+ without an email address
+
+ * engine/lib/annotations.php: get_entities_from_annotations was ignoring
+ group_guid - setting container_guid now
+
+ * mod/htmlawed/start.php: fixed trivial bug in htmlawed plugin. The ;
+ delimiter should only be used between sets of schemes (protocols). This is
+ due to some slightly lazy coding in htmlawed.
+
+ * engine/lib/sessions.php: if there is already a user in the session, we
+ don't need to set the code from the cookie
+
+ * engine/lib/plugins.php: fixed bug introduced in [3608]
+
+ * languages/en.php, views/default/annotation/annotate.php: fixed bug in
+ comment river view due to missing }
+
+2009-12-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: fixes #1273 - replaced previous hack with call to
+ getType
+
+ * engine/lib/api.php, engine/tests/services/api.php: fixes #1397 and updates
+ unit tests - comma was missing
+
+2009-12-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: fixes #1396 - thanks for reporting this
+
+2009-12-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/search_hooks.php: Stripping tags to remove HTML on title and
+ description for comment search.
+
+ * mod/search/search_hooks.php: Removed a line breaking description for
+ comments in search.
+
+ * mod/search/search_hooks.php: Comments' search hook now correctly trims
+ description and title.
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php: Removed pagination from top of
+ results.
+
+ * engine/lib/elgglib.php: Trimming the paths when detecting which nav item
+ to mark as selected.
+
+2009-12-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/listing.php: Search types without a
+ subtype now display properly.
+
+ * engine/lib/elgglib.php: Changed the way the sidebar nav "selected" class
+ is applied. Should yield more accurate results if the URIs aren't exactly
+ the same.
+
+ * CHANGES.txt: Removed duplicate changes entry.
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php: Changed avatar size to small in
+ search results. Fixed a bug so comment owners' avatars show up instead of
+ commented entity's owners' avatars.
+
+2009-12-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/usersettings.php, languages/en.php: closes #876 - profile
+ language strings moved to profile plugin
+
+2009-11-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/listing.php: Added pagination to comments
+ view.
+
+ * mod/search/search_hooks.php, mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/tags/listing.php: Removed tag search listing.
+ Added ability to provide extra info in searches as 'search_matched_extra'.
+ Allowing overrides for titles.
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php: If a search result returns a
+ user, make the icon be for the user and not the owner (which is no one)
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/tags/listing.php: Listings use profile/icon
+ view instead of calling icon directly.
+
+2009-11-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/entity_list.php: search results view
+ tweaked
+
+2009-11-24 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixing a bug resulting from get_loggedin_user()
+ return FALSE. This bug could throw a fatal error to non-loggedin users.
+
+ * engine/tests/test_skeleton.php: Adding documentation to the unit test
+ skeleton file.
+
+2009-11-24 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: entities can now have metadata of 0 and return
+ the correct type. Fixes #1192
+
+ * dashboard/latest.php: dashboard latest wasn't specifying fullview as false
+
+ * engine/lib/languages.php: fixes 1315 - language static now being set
+ correctly
+
+ * engine/lib/entities.php: fixes #935
+
+ * engine/lib/users.php: made the get user friends objects functions
+ consistent and added some missing documentation - no api usage changes
+
+2009-11-23 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, engine/lib/users.php,
+ engine/tests/objects/filestore.php: Deleting a user will remove all user
+ files. Fixes #607
+
+2009-11-22 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/remove.php: remove friend action, return user to the place
+ the action was triggered
+
+ * actions/friends/add.php: when friending another user, return to the page
+ you carried out the action
+
+2009-11-21 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/relationships.php: fixes #1374 - owner_guid wasn't being set
+ correctly in options array
+
+ * engine/lib/metadata.php: get_entities_from_metadata_multi() had bad option
+ keys - related to #1374.
+
+ * engine/lib/users.php: fixes #1380 - get_user_friends() was being called
+ with subtype of desired objects in get_user_friends_objects() - thanks for
+ the report
+
+2009-11-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed a bug with group by and order by in
+ elgg_get_entities. #ElggCampBA
+
+2009-11-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: updated some documentation on
+ register_page_handler(). This fixes #1373
+
+2009-11-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: updating the contributors file
+
+2009-11-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bump.
+
+2009-11-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/tags/listing.php: 'More' links on serarch
+ results moved, and link added to Tag results
+
+ * .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/tags/listing.php: Search UI cleaned up
+
+2009-11-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/views/default/search/listing.php: Fixed typo to display the
+ type of search.
+
+ * actions/systemsettings/install.php, views/default/site/default.php: Added
+ an INSTALLING constant when installing. Fixed a bug when trying to export a
+ site that causes the browser to redirect to the site's url, which caused the
+ installation process to skip past the "create your admin user" prompt when
+ "ping home" was checked.
+
+2009-11-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/start.php: Added a missing elgg_strlen() in
+ search_remove_ignored_words()
+
+ * CHANGES.txt: Updated changes file with search and user data storage info.
+
+
+2009-11-14 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: fixes #1169 as described on ticket
+
+ * CHANGES.txt, engine/lib/api.php: updated documentation of API functions -
+ perhaps ready for developer preview
+
+2009-11-13 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/jquery/jquery-ui-1.7.2.min.js: Including jQuery UI 1.7.2 in core.
+ The custom build did not contain all the features we would like to have.
+ Leaving the custom build in place for community additions.
+
+ * engine/lib/annotations.php: Properly ordering annotation objects returned
+ by Elgg methods.
+
+ * search/index.php: Creating a redirect page for legacy themes using search.
+
+
+2009-11-13 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/services/api.php: more test cases related to #1364.
+
+ * engine/lib/api.php, engine/tests/services/api.php: should fix #1364 and
+ added relevant unit test cases for this bug (yeah for unit tests)
+
+2009-11-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: fixed typo with handling web services request
+ parameters
+
+ * engine/lib/api.php: rest api parameters can now have default values
+
+2009-11-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/entities/entity_listing.php,
+ views/default/entities/gallery_listing.php: Fixes: #1356. Reverted
+ search_listing to entity_listing for theme support.
+
+2009-11-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, languages/en.php: added a nonce to hmac signature and
+ header so same call in same second does not get caught by replay check
+
+2009-11-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/mb_wrapper.php: Accidentally removed the eval with my debug
+ statements.
+
+ * engine/lib/mb_wrapper.php: Wrapped all multibyte functions that are
+ directly interchangable with non mb functions with elgg_*().
+
+2009-11-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: fixes #1286 - ElggPlugin get() wasn't handling "0"
+ and returning null instead
+
+2009-11-12 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009102801.php: Data migration: Disabled execution
+ time and clearing out caches to avoid OOM errors.
+
+2009-11-12 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river2.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2009091901.sql: fixes #1329 - schema for river is
+ fixed - was incomplete before
+
+2009-11-11 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: fixes #1339 - elgg_view_exists now handles view
+ extensions for non-default viewtypes (for one level of recursion)
+
+ * engine/lib/elgglib.php: get_views deprecated for elgg_get_views (just to
+ be consistent with views api)
+
+2009-11-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/page_elements/title.php, views/json/page_elements/title.php,
+ views/rss/page_elements/title.php: these viewtypes need an empty title view
+ or html shows up because they fallback on default view
+
+2009-11-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/start.php: Removing explicit MySQL 5.1-specific 'IN NATURAL
+ LANGUAGE MODE' option.
+
+2009-11-10 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009102801.php: Using php default functions instead of
+ ElggUser in upgrade script. Large Elgg sites could not handle the "select *
+ from users" query without hitting memory limit.
+
+2009-11-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/elgglib.php, engine/lib/usersettings.php,
+ mod/logbrowser/start.php, mod/search/start.php: elgg_extend_view() replaces
+ extend_view()
+
+ * engine/lib/elgglib.php: updated documentation of functions used in
+ creating the topbar tools dropdown menu
+
+2009-11-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/start.php, mod/search/views/default/search/css.php: Sorting
+ search contexts by longest related substring. Added more pretty highlight
+ colors.
+
+ * mod/search/start.php: Fixed displaying of ...s in search.
+
+ * mod/search/index.php: I hate you search.
+
+ * mod/search/index.php: Missed an htmlspecialchars().
+
+ * mod/search/index.php, mod/search/start.php: Removed unneeded url_encode()s
+ for links.
+
+ * mod/search/start.php: Underscores. grr.
+
+ * mod/search/start.php: Adjusted default context length to 500. Added url
+ decoding to needle string.
+
+ * mod/search/search_hooks.php, mod/search/start.php: Trying out the new
+ context grabbing function in search.
+
+2009-11-10 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/service_handler.php, engine/lib/api.php, htaccess_dist:
+ introducing a new web services handler
+
+ * engine/lib/notification.php: do not register notification rest api calls
+ by default since no other apis exposed not directly related to the api
+
+ * views/json/api/output.php: leaner json objects for web services api calls
+
+2009-11-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/search_hooks.php: For real this time.
+
+ * mod/search/search_hooks.php: Sanitising string on tag search.
+
+ * mod/search/search_hooks.php, mod/search/start.php: Sanitising strings to
+ avoid sql insertion hacks.
+
+ * mod/search/index.php, mod/search/search_hooks.php, mod/search/start.php,
+ .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php: Updated search to allow
+ filtering of results by clicking on submenu items. Fixes #1358: Using raw
+ mysql_query() / fetch() to get ft_min/max vars since they aren't set on some
+ versions of MySQL.
+
+ * engine/lib/entities.php: Ignoring empty owner_guids in elgg_get_entities.
+
+ * engine/lib/elgglib.php: Removed old code from get_submenu().
+
+ * CODING.txt: Added deprecation procedures to coding standards.
+
+2009-11-09 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: updated changes.txt
+
+ * engine/lib/api.php: REST api hmac signature encoding now compatible with
+ Amazon S3 and OAuth
+
+2009-11-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/search/comments/listing.php: Fixed the wrapper for
+ comment listing.
+
+ * mod/search/start.php: Uncommenting out the bulk of the search functions.
+
+ * mod/search/search_hooks.php, mod/search/start.php,
+ .../views/default/search/comments/listing.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/tags/listing.php: Added super-basic support
+ for searching comments.
+
+2009-11-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/lib/pam.php, engine/tests/services/api.php,
+ services/api/rest.php: combined the two different pams into one and fixed an
+ issue with hmac authentication
+
+2009-11-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/search/search_hooks.php: Reverted groups and users to LIKE instead of
+ MATCH AGAINST.
+
+ * engine/lib/group.php, engine/lib/objects.php, engine/lib/tags.php,
+ engine/lib/users.php, mod/search/index.php, mod/search/search_hooks.php,
+ mod/search/start.php, .../views/default/page_elements/searchbox.php,
+ mod/search/views/default/search/listing.php: Moved default search hooks into
+ search mod. Using MySQL's MATCH ... AGAINST instead of likes for most
+ searches. Changed 'tag' to 'q' while maintaining backward compatibility.
+
+2009-11-07 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: fixed bug in list_entities() wrapper function -
+ it was ignoring false values - there are probably similar problems in the
+ other new wrapper functions
+
+ * _graphics/icons/default/topbar.png: fixes #1324 - default topbar icon now
+ exists
+
+ * engine/lib/metastrings.php: fixes #1227 - this one has been causing nasty
+ problems for far too long
+
+2009-11-06 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: removed space which would break the schema
+ parsing routine for the next poor sucker who tried to add a table - not the
+ most robust code
+
+ * services/api/rest.php: strike previous - we need the password auth to get
+ the user token - will just need to document that pam_auth_pass does not work
+ with REST because the user credentials are not set
+
+ * engine/lib/pam.php, services/api/rest.php: removing username/password
+ authorization for REST by default - developers can add their own custom PAM
+ using the plugin hook if they require this
+
+2009-11-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Removed old group search hook.
+
+ * engine/lib/users.php: Removed old user search.
+
+ * engine/lib/group.php, engine/lib/tags.php, engine/lib/users.php: Added
+ search for group, tags, and users.
+
+ * engine/lib/entities.php: Added ability to pass 0 as a subtype meaning
+ "entities without a subtype".
+
+ * engine/lib/objects.php: Added default object search.
+
+ * engine/lib/metadata.php: Corrected documentation for
+ elgg_get_entities_from_metadata()
+
+ * actions/systemsettings/install.php: Enable search mod upon installation.
+
+ * mod/search/index.php, mod/search/start.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/startblurb.php,
+ mod/search/views/default/search/tags/listing.php: Updated search for FTS.
+
+2009-11-04 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/sessions.php: users now allowed to have multiple
+ sessions but not multiple remember me cookies (yet)
+
+2009-11-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/htmlawed/start.php: Updated htmlawed to allow the default TinyMCE
+ styles.
+
+2009-11-03 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php, engine/lib/plugins.php, engine/lib/xml-rpc.php,
+ engine/lib/xml.php: standardized xml.php and fixed output of booleans in xml
+ view
+
+2009-11-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes for deprecated functions.
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/metadata.php: Deprecated elgg_get_entities_from_annotations().
+
+ * engine/lib/access.php: Changed elgg_get_entities_from_access_id() to be
+ closer to how other functions work.
+
+ * mod/htmlawed/start.php: Updated htmlawed to disallow many style
+ attributes.
+
+2009-11-02 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/xml/pageshells/pageshell.php: setting xml version and encoding in
+ xml pageshell
+
+2009-10-30 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, engine/lib/access.php, engine/tests/objects/users.php:
+ Deprecating get_entities_from_access_id().
+
+2009-10-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: No longer using fullview for listing registered entities on
+ front page.
+
+2009-10-30 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Removing deprecated function call from
+ find_plugin_settings().
+
+2009-10-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/tests/objects/metadata.php: Namespaced
+ metadata keys for elgg_get_entities_from_metadata() so no clashes will happen
+ with annotations.
+
+2009-10-30 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updating 1.7 CHANGES file.
+
+2009-10-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes for the relationship functions.
+
+2009-10-30 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Cleaning up logic regarding view error notices.
+
+2009-10-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/lib/relationships.php: Deprecated
+ get_entities_from_relationships_and_meta().
+
+2009-10-29 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, engine/tests/objects/filestore.php: Fully
+ deprecating file matrix use with username. Plugins building the file matrix
+ with the username will still work, but a warning is logged.
+
+ * engine/tests/objects/metadata.php: Updating unit test to reflect
+ deprecated functions.
+
+2009-10-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Fixed incorrect wrapper for
+ get_entities_from_relationship() -> elgg_get_entities_from_relationship().
+
+2009-10-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Deprecated get_entities_from_relationship()
+
+ * engine/lib/metadata.php: Actually fixed the documentation for
+ elgg_get_entities_from_metadata().
+
+ * engine/lib/metadata.php: Cleaned up table prefix for
+ elgg_get_entity_metadata_where_sql(). Cleaned up some documentation.
+
+ * engine/lib/metadata.php: Updated documentation for
+ elgg_get_entity_metadata_where_sql()
+
+ * engine/schema/upgrades/2009100701.sql: Got rid of the silly conditional
+ comments in the db upgrade now that I know what they are.
+
+ * engine/schema/upgrades/2009100701.sql: Added table locking and disabling
+ keys for the UTF8 database upgrade.
+
+2009-10-28 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009102801.php, version.php: Creating an upgrade
+ script for new user filepath.
+
+2009-10-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/metadata.php: Deprecated
+ get_entities_from_metadata() and get_entities_from_metadata_multi().
+
+2009-10-27 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/objects/filestore.php: Removing local debug info from
+ filestore unit test.
+
+ * engine/lib/filestore.php, engine/tests/elgg_unit_test.php,
+ engine/tests/objects/filestore.php, engine/tests/objects/users.php: Modifying
+ user file locations to be based on guid. Previous implementations utilized
+ the owner's username to determine a file path matrix based on (up to) the
+ first five letters. To eliminate language and filesystem inconsistencies, the
+ matrix is now created from the entity's creation date and guid. This has the
+ added benefit of (potentially) allowing users to update their usernames.
+
+2009-10-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes for bug #1161 and deprecated
+ get_entities_from_metadata()
+
+ * engine/tests/objects/metadata.php: Fixed caching issue that caused
+ metadata test for get_entities_from_metadata() to fail.
+
+ * engine/lib/entities.php: Removed some commented out code.
+
+ * engine/lib/metadata.php: Fixed get_entities_from_metadata() wrapper when
+ passing case_sensitive = FALSE.
+
+ * engine/lib/elgglib.php: Fixes #1161: Views now default to 'default' if not
+ found.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/metadata.php:
+ Created elgg_get_entities_from_metadata() and made
+ get_entities_from_metadata(). Made elgg_get_entities() accept extra joins and
+ wheres in the options. Created a helper function
+ elgg_normalise_plural_options_array() to rewrite shortcut singular options to
+ plurals.
+
+2009-10-26 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php: Rewriting metastrings search query for
+ simplicity.
+
+2009-10-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updated changes to show deprecated get_entities().
+
+2009-10-25 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/tests/services/api.php, languages/en.php:
+ cleaned up the web services unit tests
+
+2009-10-25 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Corrected bug when passing container_guids or
+ owner_guids of 0. Changed the name of the $prefix to $table in sql helper
+ functions. Improved documentation.
+
+2009-10-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Created elgg_get_entities() and rewrote
+ get_entities() to pass to the new function. First go at removing
+ get_entities() calls in native functions.
+
+ * engine/lib/elgglib.php: Cleaned up some code in elgg_view().
+
+ * engine/lib/access.php: Slight code cleanup.
+
+2009-10-23 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, engine/tests/objects/users.php: Creating a unit test
+ for ElggUser
+
+2009-10-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/entities/entity_list.php,
+ views/default/entities/entity_listing.php: Standardized entity listing views.
+
+
+ * CODING.txt: Updated standards for method names.
+
+2009-10-22 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Refs #1330: Contributed autop() to Wordpress.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/search.php,
+ mod/search/index.php, mod/search/languages/en.php, mod/search/manifest.xml,
+ mod/search/start.php, .../views/default/page_elements/searchbox.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity_list.php,
+ mod/search/views/default/search/gallery.php,
+ .../views/default/search/gallery_listing.php,
+ mod/search/views/default/search/listing.php,
+ mod/search/views/default/search/startblurb.php, search/groups.php,
+ search/index.php, search/users.php, views/default/css.php,
+ views/default/entities/entity_list.php,
+ views/default/entities/entity_listing.php,
+ views/default/entities/gallery.php,
+ views/default/entities/gallery_listing.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/search/entity_list.php, views/default/search/gallery.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php,
+ views/default/search/startblurb.php: Pulling in MITRE's search core.
+ Fo'rizzle this time. Yo.
+
+2009-10-22 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt: Updating core changes file
+
+ * mod/diagnostics/index.php, mod/diagnostics/languages/en.php: Adding unit
+ testing to the GUI. Unit tests can be run from the core Diagnostics mod.
+
+2009-10-22 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/tests/services/api.php, languages/en.php: more
+ unit tests for REST api
+
+2009-10-21 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/tests/objects/metadata.php: Allowing entities to be retrieved by
+ case-insensitive search. Adding a new unit test for ElggMetadata.
+
+ * engine/lib/elgglib.php, engine/tests/suite.php: Reducing the output level
+ of log messages set to "DEBUG". Debug level messages will be logged at the
+ same level as warnings. Additionally, users will be notified when attempting
+ to run the test suite without first placing the site in debug mode.
+
+2009-10-20 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/tests/services/api.php, languages/en.php: more
+ unit tests for REST api
+
+ * CHANGES.txt: updated CHANGES.txt with services API changes
+
+2009-10-19 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Replacing a direct call to error_log() with new
+ elgg_log().
+
+ * CHANGES.txt, actions/admin/site/update_basic.php,
+ actions/systemsettings/install.php, engine/lib/elgglib.php, languages/en.php,
+ views/default/settings/system.php, views/failsafe/settings/system.php: Adding
+ debug options to admin site settings. Debugging errors and warnings to
+ screen. If notice level is enabled, output is sent to system log file.
+
+2009-10-19 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/tests/services/api.php, languages/en.php,
+ services/api/rest.php: first version of new REST api
+
+2009-10-17 cash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pam.php: updated documentation on PAMs as I will be fixing some
+ API PAM issues
+
+2009-10-16 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/group.php, engine/lib/languages.php,
+ engine/lib/memcache.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php, engine/start.php, engine/tests/suite.php,
+ views/default/messages/exceptions/exception.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/xml/messages/exceptions/exception.php: Rewriting core debug messages to
+ be more informative. Introducing the concept of levels for Elgg debugging:
+ notices, warnings and errors are displayed when the appropriate debugging
+ level is enabled. An additional level of "debug" exists to differentiate from
+ errors.
+
+2009-10-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/canvas/default.php,
+ views/foaf/page_elements/contentwrapper.php,
+ views/foaf/pageshells/pageshell.php, views/foaf/search/entity_list.php,
+ views/foaf/user/default.php, views/ical/canvas/default.php,
+ views/ical/export/entity.php, views/ical/object/default.php,
+ views/ical/pageshells/pageshell.php, views/ical/search/entity_list.php,
+ views/js/object/default.php, views/js/pageshells/pageshell.php,
+ views/js/user/default.php, views/json/api/output.php,
+ views/json/canvas/default.php, views/json/export/entity.php,
+ views/json/export/metadata.php, views/json/export/relationship.php,
+ views/json/group/default.php, views/json/messages/exceptions/exception.php,
+ views/json/object/default.php, views/json/page_elements/contentwrapper.php,
+ views/json/pageshells/pageshell.php, views/json/river/item/list.php,
+ views/json/search/entity_list.php, views/json/site/default.php,
+ views/json/user/default.php, views/opendd/canvas/default.php,
+ views/opendd/export/entity.php, views/opendd/export/metadata.php,
+ views/opendd/export/relationship.php, views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/search/entity_list.php, views/opendd/site/default.php,
+ views/opendd/user/default.php, views/php/api/output.php,
+ views/php/canvas/default.php, views/php/export/entity.php,
+ views/php/export/metadata.php, views/php/export/relationship.php,
+ views/php/group/default.php, views/php/messages/exceptions/exception.php,
+ views/php/object/default.php, views/php/pageshells/pageshell.php,
+ views/php/search/entity_list.php, views/php/site/default.php,
+ views/php/user/default.php, views/rss/annotation/default.php,
+ views/rss/canvas/default.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/page_elements/contentwrapper.php,
+ views/rss/pageshells/pageshell.php, views/rss/river/item/list.php,
+ views/rss/search/entity_list.php, views/rss/user/default.php,
+ views/xml/api/output.php, views/xml/messages/exceptions/exception.php,
+ views/xml/pageshells/pageshell.php, views/xml/xml-rpc/output.php: Finished
+ standardizing seconday views.
+
+ * views/failsafe/canvas/default.php, views/failsafe/input/access.php,
+ views/failsafe/input/button.php, views/failsafe/input/checkboxes.php,
+ views/failsafe/input/form.php, views/failsafe/input/hidden.php,
+ views/failsafe/input/longtext.php, views/failsafe/input/pulldown.php,
+ views/failsafe/input/reset.php, views/failsafe/input/submit.php,
+ views/failsafe/input/text.php, views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/list.php, views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php, views/failsafe/settings/install.php,
+ views/failsafe/settings/system.php: Standardized views/failsafe/*
+
+ * views/default/css.php, views/default/settings/install.php,
+ views/default/settings/system.php, views/default/settings/upgrading.php,
+ views/default/site/default.php, views/default/spotlight/default.php,
+ views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php,
+ views/default/upload/upload_form_content.php, views/default/user/default.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php, views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/usersettings/user.php, views/default/welcome.php,
+ views/default/welcome/logged_in.php, views/default/welcome/logged_out.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php:
+ Finish up standardizing views/default/*
+
+ * views/default/page_elements/contentwrapper.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_contents.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/spotlight.php,
+ views/default/page_elements/title.php,
+ views/default/pageshells/pageshell.php, views/default/river/dashboard.php,
+ views/default/river/item/list.php, views/default/river/item/noaccess.php,
+ views/default/river/item/wrapper.php,
+ views/default/river/relationship/friend/create.php,
+ views/default/river/wrapper.php, views/default/search/entity_list.php,
+ views/default/search/gallery.php, views/default/search/gallery_listing.php,
+ views/default/search/listing.php, views/default/search/startblurb.php: More
+ views cleanup.
+
+ * views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php,
+ views/default/graphics/icon.php, views/default/group/default.php,
+ views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php, views/default/input/access.php,
+ views/default/input/autocomplete.php, views/default/input/button.php,
+ views/default/input/calendar.php, views/default/input/captcha.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/form.php,
+ views/default/input/hidden.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/reset.php, views/default/input/securitytoken.php,
+ views/default/input/submit.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/input/urlshortener.php, views/default/input/userpicker.php,
+ views/default/js/initialise_elgg.php,
+ views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/navigation/viewtype.php,
+ .../notifications/settings/usersettings.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/object/plugin.php, views/default/object/widget.php,
+ views/default/output/calendar.php, views/default/output/checkboxes.php,
+ views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/email.php, views/default/output/iframe.php,
+ views/default/output/longtext.php, views/default/output/pulldown.php,
+ views/default/output/radio.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php: Standardizing views.`
+
+ * views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php, views/default/ajax/loader.php,
+ views/default/annotation/annotate.php,
+ views/default/annotation/generic_comment.php, views/default/api/output.php,
+ views/default/basic_elements/welcome.php, views/default/canvas/default.php,
+ views/default/canvas/layouts/edit_layout.php,
+ views/default/canvas/layouts/one_column.php,
+ views/default/canvas/layouts/sidebar_boxes.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ .../canvas/layouts/two_column_right_sidebar.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/canvas_header/submenu_group.php,
+ views/default/canvas_header/submenu_template.php,
+ views/default/comments/forms/edit.php, views/default/dashboard/blurb.php,
+ views/default/export/entity.php, views/default/export/metadata.php,
+ views/default/export/relationship.php, views/default/friends/collection.php,
+ views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/list.php,
+ views/default/friends/picker.php, views/default/friends/river/create.php:
+ Standardized more files.
+
+ * engine/tests/objects/objects.php, engine/tests/suite.php,
+ friends/index.php, friends/of.php, friends/pickercallback.php, index.php,
+ install.php, languages/en.php, search/groups.php, search/index.php,
+ search/users.php, services/api/rest.php, services/export/handler.php,
+ settings/index.php, settings/plugins.php, settings/statistics.php,
+ settings/user.php, simplecache/view.php, upgrade.php, version.php:
+ Standardized files
+
+2009-10-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/admin.php: Merged admin access override
+ hook with ignore access system override hook. get_sql_access_prefix() now
+ correctly uses elgg_check_access_overrides() instead of
+ elgg_get_ignore_access().
+
+ * friends/add.php, friends/collections.php, friends/edit.php: Standardized
+ files.
+
+ * entities/index.php, entities/list.php: Standardized files.
+
+ * engine/lib/widgets.php, engine/settings.example.php, engine/start.php:
+ Standardized files.
+
+ * engine/lib/calendar.php, engine/lib/configuration.php,
+ engine/lib/cron.php, engine/lib/exceptions.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/filestore.php, engine/lib/group.php,
+ engine/lib/input.php, engine/lib/install.php, engine/lib/languages.php,
+ engine/lib/location.php, engine/lib/mb_wrapper.php, engine/lib/memcache.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/opendd.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/ping.php, engine/lib/plugins.php, engine/lib/query.php,
+ engine/lib/relationships.php, engine/lib/river2.php, engine/lib/search.php,
+ engine/lib/sites.php, engine/lib/social.php, engine/lib/statistics.php,
+ engine/lib/system_log.php, engine/lib/tags.php, engine/lib/users.php,
+ engine/lib/usersettings.php, engine/lib/version.php, engine/lib/widgets.php:
+ Standardized gobs of files.
+
+2009-10-14 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Standardized engine/lib/cache.php
+
+ * engine/lib/api.php: Standardized engine/lib/api.php
+
+ * engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/pagehandler.php, engine/handlers/xml-rpc_handler.php:
+ Standardized engine/handlers/*
+
+ * dashboard/index.php, dashboard/latest.php: Standardized dashboard/*
+
+ * admin/index.php, admin/plugins.php, admin/site.php, admin/statistics.php,
+ admin/user.php: Standardized admin/*
+
+ * actions/email/save.php, actions/entities/delete.php,
+ actions/friends/add.php, actions/friends/addcollection.php,
+ actions/friends/deletecollection.php, actions/friends/editcollection.php,
+ actions/friends/remove.php, actions/import/opendd.php, actions/login.php,
+ actions/logout.php, .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/systemsettings/install.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ actions/user/spotlight.php, actions/useradd.php,
+ actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php: Standardized actions/*
+
+
+ * actions/comments/add.php, actions/comments/delete.php: Standardized.
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, actions/admin/site/update_basic.php,
+ actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ actions/admin/user/resetpassword.php, actions/admin/user/unban.php:
+ Standardized actions/admin/*
+
+ * account/forgotten_password.php, account/register.php: Standardized
+ account/*
+
+ * _css/css.php, _css/js.php: Standardized _css/*
+
+ * CHANGES.txt: Updated changes file for $is_admin deprecation.
+
+2009-10-13 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/objects/entities.php, engine/tests/objects/objects.php,
+ engine/tests/test_skeleton.php: Swallowing all Elgg notices within unit
+ tests. By default, SimpleTest converts PHP errors into exceptions. This is
+ restricted by adding a call to swallowErrors() within the tearDown() methods.
+ This has also been noted within the unit test skeleton.
+
+ * engine/lib/sites.php, engine/tests/objects/sites.php: Creating a generic
+ ElggSite unit test.
+
+2009-10-13 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/admin.php, engine/lib/entities.php,
+ engine/lib/users.php: Standardized users and entities. Fleshed out
+ elgg_set_ignore_access() and elgg_get_ignore_access()
+
+ * engine/lib/elgglib.php: Standardize elgglib.php
+
+ * engine/tests/suite.php: Test suite now requires admin for web-based tests.
+ Uses access overrides for cli-based tests.
+
+ * engine/lib/entities.php: Standardized entities.php.
+
+ * engine/lib/access.php: Fix typo in ElggAccess:get_ignore_access().
+
+ * engine/lib/access.php, engine/lib/admin.php, engine/lib/sessions.php:
+ First pass at removing $is_admin global.
+
+2009-10-12 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/objects/entities.php, engine/tests/objects/objects.php,
+ engine/tests/suite.php: Adding unit tests for the ElggObject class.
+ Restricting testing suite to only be run as a logged-in user. This will not
+ allow the tests to be run from the command line, but this is already the case
+ due to debug static.
+
+2009-10-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CHANGES.txt, CODING.txt: Added coding styles and changes documents.
+
+2009-10-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Standardized annotations.php.
+
+ * engine/lib/admin.php: Standardized admin.php
+
+ * engine/lib/activity.php: Standardized activity.
+
+ * engine/lib/actions.php: Standardized actions.php
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/search.php,
+ engine/schema/upgrades/2009093001.sql, mod/search/index.php,
+ mod/search/languages/en.php, mod/search/manifest.xml, mod/search/start.php,
+ .../views/default/page_elements/searchbox.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity_list.php,
+ mod/search/views/default/search/gallery.php,
+ mod/search/views/default/search/listing.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/search/entity_list.php, views/default/search/gallery.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php,
+ views/default/search/startblurb.php: Reverted back to previous copy removing
+ Justin's search because of views problems in plugins.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/search.php,
+ engine/schema/upgrades/2009093001.sql, mod/search/index.php,
+ mod/search/languages/en.php, mod/search/manifest.xml, mod/search/start.php,
+ .../views/default/page_elements/searchbox.php,
+ mod/search/views/default/search/css.php,
+ mod/search/views/default/search/entity_list.php,
+ mod/search/views/default/search/gallery.php,
+ mod/search/views/default/search/listing.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/search/entity_list.php, views/default/search/gallery.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php,
+ views/default/search/startblurb.php: Pulled in Justin's search changes from
+ github.
+
+2009-10-09 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/objects.php,
+ engine/tests/objects/entities.php, engine/tests/objects/objects.php,
+ engine/tests/test_skeleton.php: Creating an ElggObject unit test. Fixing
+ issues with the unit test plugin hooks, as well as infinite looping bugs
+ introduced by the unit test skeleton.
+
+2009-10-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/objects/entities.php: Adding unit test for ElggEntity
+ annotations.
+
+2009-10-08 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/sessions.php: Brought access.php and
+ sesssion.php up to code standards.
+
+2009-10-08 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/tests/core/entities.php,
+ engine/tests/objects/entities.php: Adding generic unit tests for ElggEntity.
+
+2009-10-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: database.php now more closely matches coding
+ standards.
+
+ * engine/lib/database.php, engine/schema/upgrades/2009100701.sql: Fixes
+ #1181: UTF8 now correctly stored in database.
+
+ * engine/lib/entities.php, engine/lib/notification.php,
+ engine/lib/users.php, engine/lib/version.php: Fixes #790: Removing unneeded
+ @s.
+
+2009-10-06 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/tests/core/entities.php,
+ engine/tests/elgg_unit_test.php, engine/tests/test_skeleton.php: Adding unit
+ test methods to the new Entities test.
+
+2009-10-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/diagnostics/start.php: Removed elgg_test entries.
+
+2009-10-06 nickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fixing a spacing issue with constructed SQL
+ query. Closes #1295.
+
+2009-10-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/testing.php: Removing old testing.php lib.
+
+2009-10-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/core/entities.php, engine/tests/entities.php,
+ engine/tests/suite.php, engine/tests/test_skeleton.php: Moved core tests into
+ tests/core. Fixed typo in skeleton and entities tests. Only run tests in
+ debug mode.
+
+2009-10-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/tests/entities.php, engine/tests/test_skeleton.php: Added more info
+ to the test. Added a test skeleton.
+
+ * engine/lib/entities.php: Added unit tests for entities.
+
+ * engine/tests/entities.php, engine/tests/suite.php: Added unit tests.
+
+ * engine/tests/elgg_unit_test.php, engine/tests/suite.php,
+ vendors/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE,
+ vendors/simpletest/LICENSE, vendors/simpletest/README,
+ vendors/simpletest/VERSION, vendors/simpletest/authentication.php,
+ vendors/simpletest/autorun.php, vendors/simpletest/browser.php,
+ vendors/simpletest/collector.php, vendors/simpletest/compatibility.php,
+ vendors/simpletest/cookies.php, vendors/simpletest/default_reporter.php,
+ vendors/simpletest/detached.php,
+ .../docs/en/authentication_documentation.html,
+ .../simpletest/docs/en/browser_documentation.html,
+ vendors/simpletest/docs/en/docs.css,
+ .../docs/en/expectation_documentation.html,
+ .../docs/en/form_testing_documentation.html,
+ .../docs/en/group_test_documentation.html,
+ vendors/simpletest/docs/en/index.html,
+ .../docs/en/mock_objects_documentation.html,
+ vendors/simpletest/docs/en/overview.html,
+ .../docs/en/partial_mocks_documentation.html,
+ .../simpletest/docs/en/reporter_documentation.html,
+ .../docs/en/unit_test_documentation.html,
+ .../docs/en/web_tester_documentation.html,
+ .../docs/fr/authentication_documentation.html,
+ .../simpletest/docs/fr/browser_documentation.html,
+ vendors/simpletest/docs/fr/docs.css,
+ .../docs/fr/expectation_documentation.html,
+ .../docs/fr/form_testing_documentation.html,
+ .../docs/fr/group_test_documentation.html,
+ vendors/simpletest/docs/fr/index.html,
+ .../docs/fr/mock_objects_documentation.html,
+ vendors/simpletest/docs/fr/overview.html,
+ .../docs/fr/partial_mocks_documentation.html,
+ .../simpletest/docs/fr/reporter_documentation.html,
+ .../docs/fr/unit_test_documentation.html,
+ .../docs/fr/web_tester_documentation.html, vendors/simpletest/dumper.php,
+ vendors/simpletest/eclipse.php, vendors/simpletest/encoding.php,
+ vendors/simpletest/errors.php, vendors/simpletest/exceptions.php,
+ vendors/simpletest/expectation.php,
+ vendors/simpletest/extensions/pear_test_case.php,
+ .../simpletest/extensions/phpunit_test_case.php,
+ vendors/simpletest/extensions/testdox.php,
+ vendors/simpletest/extensions/testdox/test.php, vendors/simpletest/form.php,
+ vendors/simpletest/frames.php, vendors/simpletest/http.php,
+ vendors/simpletest/invoker.php, vendors/simpletest/mock_objects.php,
+ vendors/simpletest/page.php, vendors/simpletest/parser.php,
+ vendors/simpletest/reflection_php4.php,
+ vendors/simpletest/reflection_php5.php, vendors/simpletest/remote.php,
+ vendors/simpletest/reporter.php, vendors/simpletest/scorer.php,
+ vendors/simpletest/selector.php, vendors/simpletest/shell_tester.php,
+ vendors/simpletest/simpletest.php, vendors/simpletest/socket.php,
+ vendors/simpletest/tag.php, vendors/simpletest/test/acceptance_test.php,
+ vendors/simpletest/test/adapter_test.php,
+ vendors/simpletest/test/all_tests.php,
+ vendors/simpletest/test/authentication_test.php,
+ vendors/simpletest/test/autorun_test.php,
+ vendors/simpletest/test/bad_test_suite.php,
+ vendors/simpletest/test/browser_test.php,
+ vendors/simpletest/test/collector_test.php,
+ vendors/simpletest/test/command_line_test.php,
+ vendors/simpletest/test/compatibility_test.php,
+ vendors/simpletest/test/cookies_test.php,
+ vendors/simpletest/test/detached_test.php,
+ vendors/simpletest/test/dumper_test.php,
+ vendors/simpletest/test/eclipse_test.php,
+ vendors/simpletest/test/encoding_test.php,
+ vendors/simpletest/test/errors_test.php,
+ vendors/simpletest/test/exceptions_test.php,
+ vendors/simpletest/test/expectation_test.php,
+ vendors/simpletest/test/form_test.php,
+ vendors/simpletest/test/frames_test.php,
+ vendors/simpletest/test/http_test.php,
+ vendors/simpletest/test/interfaces_test.php,
+ vendors/simpletest/test/live_test.php,
+ vendors/simpletest/test/mock_objects_test.php,
+ vendors/simpletest/test/page_test.php,
+ vendors/simpletest/test/parse_error_test.php,
+ vendors/simpletest/test/parser_test.php,
+ vendors/simpletest/test/reflection_php4_test.php,
+ vendors/simpletest/test/reflection_php5_test.php,
+ vendors/simpletest/test/remote_test.php,
+ vendors/simpletest/test/shell_test.php,
+ vendors/simpletest/test/shell_tester_test.php,
+ vendors/simpletest/test/simpletest_test.php,
+ vendors/simpletest/test/socket_test.php,
+ .../simpletest/test/support/empty_test_file.php,
+ vendors/simpletest/test/support/latin1_sample,
+ vendors/simpletest/test/support/spl_examples.php,
+ .../test/support/supplementary_upload_sample.txt,
+ vendors/simpletest/test/support/test1.php,
+ vendors/simpletest/test/support/upload_sample.txt,
+ vendors/simpletest/test/tag_test.php,
+ vendors/simpletest/test/test_with_parse_error.php,
+ vendors/simpletest/test/unit_tester_test.php,
+ vendors/simpletest/test/unit_tests.php, vendors/simpletest/test/url_test.php,
+ vendors/simpletest/test/user_agent_test.php,
+ vendors/simpletest/test/visual_test.php,
+ vendors/simpletest/test/web_tester_test.php,
+ vendors/simpletest/test/xml_test.php, vendors/simpletest/test_case.php,
+ vendors/simpletest/unit_tester.php, vendors/simpletest/url.php,
+ vendors/simpletest/user_agent.php, vendors/simpletest/web_tester.php,
+ vendors/simpletest/xml.php: Added simpletest and start of unit tests.
+
+2009-09-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php: Added autofocusing of the username
+ field on the login page.
+
+2009-09-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: new activity river - clipped overflow for long
+ urls/strings
+
+2009-09-23 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: Upped minChars to 2 for user picker.
+
+ * views/default/input/userpicker.php: Disabled matchContains in user picker.
+
+
+ * engine/lib/input.php: Updated the user picker to avoid possible mysql
+ injection attacks and to search only by leading chars.
+
+2009-09-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: collections picker - delete link given
+ classname and brackets removed from string
+
+2009-09-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/embed/addcontentjs.php, views/default/embed/js.php: Removing
+ embed view in favor of the correct views in the plugin.
+
+2009-09-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/comments/add.php, engine/lib/annotations.php,
+ engine/lib/river2.php, engine/schema/upgrades/2009091901.sql, version.php,
+ views/default/annotation/annotate.php: New river code added to allow user
+ comment to be pulled out and displayed
+
+2009-09-17 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: Updated user picker to return 25
+ results, text input to be 30 wide.
+
+2009-09-16 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Changed get_entities_from_access_collection() to
+ get_entities_from_access_id() to be more generic.
+
+ * engine/lib/extender.php: Fixes #1238: Added ElggExtender::getOwnerEntity()
+ and changed ElggExtender::getOwner() to return just the GUID. Also, this
+ fixes a bug with checking permissions on annotations.
+
+2009-09-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/index.php, friends/of.php: Fixes #1251: Correct strings applied.
+
+2009-09-10 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/sessions.php: Updated fixes for checking
+ for admin in get_access_sql_prefix()
+
+ * engine/lib/access.php: Checking against admin metadata instead of
+ $is_admin global in get_access_sql_suffix().
+
+ * engine/lib/access.php: Fixing a bug with when getting the sql suffix for
+ the non-loggedin user.
+
+2009-09-09 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Added "Only Friends" string for user picker.
+
+ * views/default/input/userpicker.php: Defaulted userpicker to all users.
+ Checkbox makes it only friends.
+
+2009-09-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: updating the version number in the readme
+
+2009-09-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/userpicker.php: Better jquery deleting of user entity
+ for user picker.
+
+ * languages/en.php, views/default/input/userpicker.php: Pulled out language
+ string to language file.
+
+ * views/default/css.php, views/default/input/userpicker.php: Added bolding
+ to term searc in user picker.
+
+ * engine/lib/input.php, views/default/css.php: Updated livesearch page
+ handler to use classes instead of hard coded css.
+
+ * views/default/css.php, views/default/input/userpicker.php: Added rough
+ version of a new user picker.
+
+ * admin/user.php, views/default/search/entity_list.php: Fixes #1207: Using
+ fullviews with proper list_entity params.
+
+2009-09-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt, version.php: Bumped version number.
+
+ * views/default/site/default.php: Fixed a potential security issue
+ concerning site views.
+
+2009-09-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Added strip_tags() to setting titles in
+ ElggEntity
+
+2009-09-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Patch submitted for ticket #886 rolled back
+ as it was causing #1205 -> #886 will need further investigating
+
+ * views/default/css.php, views/default/river/item/wrapper.php: activity
+ display toggle so site admins can choose avatars or the small icons
+
+2009-09-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/input.php: Adding additional hooks to
+ add/remove/update users for access_collections() Added autocomplete endpoint
+ in input_init()
+
+ * views/default/input/autocomplete.php: Cleaning up autocomplete view.
+
+ * vendors/jquery/jquery.autocomplete.min.js,
+ views/default/input/autocomplete.php: Added autocomplete view to core.
+
+2009-09-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: missing comma added
+
+ * views/default/search/entity_list.php: fullview hashed out for now as it
+ caused unexpected behaviour on admin user list view, needs more investigating
+
+2009-09-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: order by bug fixed in
+ get_entities_from_relationship
+
+2009-09-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: a simple function which returns a string version of
+ an entity's access level
+
+2009-08-31 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt, INSTALL.txt, README.txt, _css/css.php, _css/js.php,
+ account/register.php, actions/admin/plugins/disable.php,
+ actions/admin/plugins/disableall.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/reorder.php, actions/admin/site/update_basic.php,
+ actions/admin/user/ban.php, actions/comments/add.php,
+ actions/comments/delete.php, actions/email/save.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/editcollection.php, actions/friends/remove.php,
+ actions/login.php, actions/logout.php, actions/register.php,
+ actions/systemsettings/install.php, actions/user/default_access.php,
+ actions/user/requestnewpassword.php, actions/user/spotlight.php,
+ actions/useradd.php, actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php, admin/index.php,
+ admin/plugins.php, admin/site.php, admin/user.php, dashboard/index.php,
+ dashboard/latest.php, engine/handlers/action_handler.php,
+ engine/handlers/cron_handler.php, engine/handlers/pagehandler.php,
+ engine/handlers/xml-rpc_handler.php, engine/lib/access.php,
+ engine/lib/activity.php, engine/lib/admin.php, engine/lib/api.php,
+ engine/lib/configuration.php, engine/lib/database.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/extender.php,
+ engine/lib/input.php, engine/lib/install.php, engine/lib/languages.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/plugins.php, engine/lib/query.php, engine/lib/relationships.php,
+ engine/lib/river2.php, engine/lib/sessions.php, engine/lib/sites.php,
+ engine/lib/social.php, engine/lib/statistics.php, engine/lib/tags.php,
+ engine/lib/upgrades/2008101303.php, engine/lib/users.php,
+ engine/lib/version.php, engine/lib/widgets.php, engine/settings.example.php,
+ engine/start.php, entities/index.php, entities/list.php, friends/add.php,
+ friends/collections.php, friends/edit.php, friends/index.php, friends/of.php,
+ friends/pickercallback.php, index.php, install.php, languages/en.php,
+ mod/garbagecollector/languages/en.php, mod/logbrowser/index.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ .../views/default/logbrowser/adminlinks.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/object/logwrapper.php,
+ mod/uservalidationbyemail/start.php, settings/index.php,
+ simplecache/view.php, upgrade.php, vendors/calendarpopup/CalendarPopup.js,
+ vendors/jquery/jquery.form.js, version.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php, views/default/admin/main.php,
+ views/default/admin/plugins_opt/plugin.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php,
+ views/default/admin/user_opt/search.php, views/default/ajax/loader.php,
+ views/default/annotation/annotate.php,
+ views/default/annotation/generic_comment.php,
+ views/default/basic_elements/welcome.php, views/default/canvas/default.php,
+ views/default/canvas/layouts/edit_layout.php,
+ views/default/canvas/layouts/sidebar_boxes.php,
+ views/default/canvas_header/submenu_group.php,
+ views/default/canvas_header/submenu_template.php,
+ views/default/comments/forms/edit.php, views/default/dashboard/blurb.php,
+ views/default/embed/addcontentjs.php, views/default/embed/js.php,
+ views/default/friends/collection.php, views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/list.php,
+ views/default/friends/picker.php, views/default/friends/river/create.php,
+ views/default/friends/tablelistcountupdate.php,
+ views/default/input/access.php, views/default/input/calendar.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php, views/default/js/friendsPickerv1.php,
+ views/default/js/initialise_elgg.php, views/default/js/upload_js.php,
+ views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/viewtype.php,
+ .../notifications/settings/usersettings.php, views/default/object/widget.php,
+ views/default/output/calendar.php, views/default/output/checkboxes.php,
+ views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/email.php, views/default/output/longtext.php,
+ views/default/output/pulldown.php, views/default/output/radio.php,
+ views/default/output/tagcloud.php, views/default/output/tags.php,
+ views/default/output/text.php, views/default/output/url.php,
+ views/default/page_elements/contentwrapper.php,
+ views/default/page_elements/header_contents.php,
+ views/default/page_elements/owner_block.php,
+ views/default/river/item/list.php, views/default/river/item/noaccess.php,
+ views/default/river/item/wrapper.php, views/default/river/wrapper.php,
+ views/default/settings/install.php, views/default/settings/system.php,
+ views/default/settings/upgrading.php, views/default/spotlight/default.php,
+ views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php,
+ views/default/upload/upload_form_content.php, views/default/user/default.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php, views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ .../usersettings/statistics_opt/numentities.php, views/default/welcome.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php,
+ views/failsafe/canvas/default.php, views/failsafe/input/access.php,
+ views/failsafe/input/checkboxes.php, views/failsafe/input/longtext.php,
+ views/failsafe/input/pulldown.php, views/failsafe/input/text.php,
+ views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php, views/failsafe/messages/list.php,
+ views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/settings/install.php, views/failsafe/settings/system.php,
+ views/foaf/canvas/default.php, views/foaf/page_elements/contentwrapper.php,
+ views/foaf/pageshells/pageshell.php, views/foaf/user/default.php,
+ views/js/object/default.php, views/js/pageshells/pageshell.php,
+ views/js/user/default.php, views/json/api/output.php,
+ views/json/canvas/default.php, views/json/export/entity.php,
+ views/json/export/metadata.php, views/json/export/relationship.php,
+ views/json/messages/exceptions/exception.php,
+ views/json/page_elements/contentwrapper.php,
+ views/json/pageshells/pageshell.php, views/json/river/item/list.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/rss/annotation/default.php, views/rss/canvas/default.php,
+ views/rss/group/default.php, views/rss/object/default.php,
+ views/rss/page_elements/contentwrapper.php, views/rss/river/item/list.php,
+ views/rss/user/default.php, views/xml/messages/exceptions/exception.php: All
+ line endings are now Unix-style.
+
+2009-08-28 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/register.php, engine/lib/entities.php: Fixes #1196:
+ ElggEntity::disable() now accepts a 2nd arg for recursive. New users are not
+ recursively disabled for plugins that need to create entities owned by the
+ new user upon entity creation.
+
+2009-08-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/search.php: Fixes #1191: set_input() was never being called for
+ tag in search_page_handler().
+
+2009-08-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/annotation/annotate.php: a missing pipe added
+
+ * views/default/annotation/annotate.php: a snippet of a new comment on an
+ object will now appear in the activity river
+
+2009-08-26 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Added entity_owner_guid to get_annotations()
+
+2009-08-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: a simple solution to a css/js
+ loading bug. We need to come up with something better, long term.
+
+2009-08-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: new style added for page update action appearing in
+ the river
+
+2009-08-21 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Fixes #1180: Group join event triggered after
+ joining group. This trigger's return was never being tested so no overriding
+ could be done. If we decide to test the trigger to stop group joining,
+ groups_write_acl_plugin_hook() will need to be changed...
+
+2009-08-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/river/create.php: new friending river view applied
+
+2009-08-20 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump to 1.6.
+
+ * _css/css.php, _css/js.php, account/forgotten_password.php,
+ account/register.php, actions/admin/plugins/disable.php,
+ actions/admin/plugins/disableall.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/enableall.php, actions/admin/plugins/reorder.php,
+ actions/admin/site/update_basic.php, actions/admin/user/ban.php,
+ actions/admin/user/delete.php, actions/admin/user/makeadmin.php,
+ actions/admin/user/removeadmin.php, actions/admin/user/resetpassword.php,
+ actions/admin/user/unban.php, actions/comments/add.php,
+ actions/comments/delete.php, actions/email/save.php,
+ actions/entities/delete.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/editcollection.php, actions/friends/remove.php,
+ actions/import/opendd.php, actions/login.php, actions/logout.php,
+ .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/systemsettings/install.php,
+ actions/user/default_access.php, actions/user/language.php,
+ actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php, admin/index.php,
+ admin/plugins.php, admin/site.php, admin/statistics.php, admin/user.php,
+ dashboard/index.php, dashboard/latest.php,
+ engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/pagehandler.php, engine/handlers/xml-rpc_handler.php,
+ engine/lib/access.php, engine/lib/actions.php, engine/lib/activity.php,
+ engine/lib/admin.php, engine/lib/annotations.php, engine/lib/api.php,
+ engine/lib/cache.php, engine/lib/calendar.php, engine/lib/configuration.php,
+ engine/lib/cron.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/exceptions.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/filestore.php, engine/lib/group.php,
+ engine/lib/input.php, engine/lib/install.php, engine/lib/languages.php,
+ engine/lib/location.php, engine/lib/mb_wrapper.php, engine/lib/memcache.php,
+ engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/opendd.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/ping.php, engine/lib/plugins.php, engine/lib/query.php,
+ engine/lib/relationships.php, engine/lib/river2.php, engine/lib/search.php,
+ engine/lib/sessions.php, engine/lib/sites.php, engine/lib/social.php,
+ engine/lib/statistics.php, engine/lib/system_log.php, engine/lib/tags.php,
+ engine/lib/testing.php, engine/lib/users.php, engine/lib/usersettings.php,
+ engine/lib/version.php, engine/lib/widgets.php, engine/lib/xml-rpc.php,
+ engine/lib/xml.php, engine/schema/mysql.sql, engine/start.php,
+ entities/index.php, entities/list.php, friends/add.php,
+ friends/collections.php, friends/edit.php, friends/index.php, friends/of.php,
+ friends/pickercallback.php, index.php, install.php,
+ mod/crontrigger/start.php, mod/diagnostics/actions/download.php,
+ mod/diagnostics/index.php, mod/diagnostics/languages/en.php,
+ mod/diagnostics/start.php, mod/diagnostics/testreport.php,
+ mod/diagnostics/unittester.php,
+ .../views/default/diagnostics/forms/download.php,
+ .../views/default/diagnostics/runalltests.php,
+ mod/diagnostics/views/default/diagnostics/test.php,
+ .../views/default/diagnostics/testresult.php,
+ mod/garbagecollector/languages/en.php, mod/garbagecollector/start.php,
+ mod/htmlawed/start.php, mod/logbrowser/index.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/object/logwrapper.php,
+ mod/logrotate/languages/en.php, mod/logrotate/start.php,
+ .../actions/email/confirm.php, mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/start.php, search/groups.php, search/index.php,
+ search/users.php, services/api/rest.php, services/export/handler.php,
+ settings/index.php, settings/plugins.php, settings/statistics.php,
+ settings/user.php, simplecache/view.php, upgrade.php, version.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php, views/default/ajax/loader.php,
+ views/default/annotation/generic_comment.php, views/default/api/output.php,
+ views/default/basic_elements/welcome.php, views/default/canvas/default.php,
+ views/default/canvas/layouts/edit_layout.php,
+ views/default/canvas/layouts/one_column.php,
+ views/default/canvas/layouts/sidebar_boxes.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ .../canvas/layouts/two_column_right_sidebar.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/comments/forms/edit.php, views/default/css.php,
+ views/default/export/entity.php, views/default/export/metadata.php,
+ views/default/export/relationship.php, views/default/friends/collection.php,
+ views/default/friends/collections.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/list.php,
+ views/default/friends/picker.php, views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php,
+ views/default/graphics/icon.php, views/default/group/default.php,
+ views/default/input/access.php, views/default/input/button.php,
+ views/default/input/calendar.php, views/default/input/captcha.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/form.php,
+ views/default/input/hidden.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/plaintext.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/reset.php, views/default/input/securitytoken.php,
+ views/default/input/submit.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/input/urlshortener.php,
+ views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/navigation/viewtype.php,
+ .../notifications/settings/usersettings.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/object/plugin.php, views/default/object/widget.php,
+ views/default/output/calendar.php, views/default/output/checkboxes.php,
+ views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/email.php, views/default/output/iframe.php,
+ views/default/output/longtext.php, views/default/output/pulldown.php,
+ views/default/output/radio.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php, views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/page_elements/header_contents.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/spotlight.php,
+ views/default/page_elements/title.php,
+ views/default/pageshells/pageshell.php, views/default/river/dashboard.php,
+ views/default/river/item/wrapper.php,
+ views/default/river/relationship/friend/create.php,
+ views/default/river/wrapper.php, views/default/search/gallery.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php,
+ views/default/settings/install.php, views/default/settings/system.php,
+ views/default/site/default.php, views/default/spotlight/default.php,
+ views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php, views/default/user/default.php,
+ views/default/user/settings/default_access.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/welcome.php, views/default/welcome/logged_in.php,
+ views/default/welcome/logged_out.php, views/default/widgets/editwrapper.php,
+ views/default/widgets/wrapper.php, views/failsafe/canvas/default.php,
+ views/failsafe/input/access.php, views/failsafe/input/button.php,
+ views/failsafe/input/checkboxes.php, views/failsafe/input/form.php,
+ views/failsafe/input/hidden.php, views/failsafe/input/longtext.php,
+ views/failsafe/input/pulldown.php, views/failsafe/input/reset.php,
+ views/failsafe/input/submit.php, views/failsafe/input/text.php,
+ views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/list.php, views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php, views/failsafe/settings/install.php,
+ views/failsafe/settings/system.php, views/foaf/canvas/default.php,
+ views/foaf/pageshells/pageshell.php, views/foaf/user/default.php,
+ views/ical/canvas/default.php, views/ical/export/entity.php,
+ views/ical/object/default.php, views/ical/pageshells/pageshell.php,
+ views/ical/search/entity_list.php, views/js/object/default.php,
+ views/js/pageshells/pageshell.php, views/js/user/default.php,
+ views/json/api/output.php, views/json/canvas/default.php,
+ views/json/export/entity.php, views/json/export/metadata.php,
+ views/json/export/relationship.php, views/json/group/default.php,
+ views/json/messages/exceptions/exception.php, views/json/object/default.php,
+ views/json/pageshells/pageshell.php, views/json/search/entity_list.php,
+ views/json/site/default.php, views/json/user/default.php,
+ views/opendd/canvas/default.php, views/opendd/export/entity.php,
+ views/opendd/export/metadata.php, views/opendd/export/relationship.php,
+ views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/site/default.php, views/opendd/user/default.php,
+ views/php/api/output.php, views/php/canvas/default.php,
+ views/php/export/entity.php, views/php/export/metadata.php,
+ views/php/export/relationship.php, views/php/group/default.php,
+ views/php/messages/exceptions/exception.php, views/php/object/default.php,
+ views/php/pageshells/pageshell.php, views/php/search/entity_list.php,
+ views/php/site/default.php, views/php/user/default.php,
+ views/rss/annotation/default.php, views/rss/canvas/default.php,
+ views/rss/group/default.php, views/rss/object/default.php,
+ views/rss/pageshells/pageshell.php, views/rss/user/default.php,
+ views/xml/api/output.php, views/xml/messages/exceptions/exception.php,
+ views/xml/pageshells/pageshell.php, views/xml/xml-rpc/output.php: Whoa nelly
+ this is a big one: Removed license and copyright for files.
+
+2009-08-19 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * LICENCE.txt: Fixes #1176: Added date back to license.
+
+ * LICENCE.txt: Test
+
+2009-08-11 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixes #942: In register_user, replaced
+ sanitise_string() call with a simple trim(). Not a problem because all SQL
+ sanitation is handled elsewhere.
+
+ * engine/lib/annotations.php: Added timelower and timeupper to
+ get_annotations() and __get_annotations_calculate_x() and its helpers.
+
+2009-08-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/captcha/backgrounds/bg1.jpg, mod/captcha/backgrounds/bg2.jpg,
+ mod/captcha/backgrounds/bg3.jpg, mod/captcha/backgrounds/bg4.jpg,
+ mod/captcha/backgrounds/bg5.jpg, mod/captcha/captcha.php,
+ mod/captcha/fonts/1.ttf, mod/captcha/fonts/Liberation_serif_License.txt,
+ mod/captcha/languages/en.php, mod/captcha/manifest.xml,
+ mod/captcha/start.php, mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/delete.php,
+ mod/groups/actions/edit.php, mod/groups/actions/featured.php,
+ mod/groups/actions/forums/addpost.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletepost.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/editpost.php,
+ mod/groups/actions/forums/edittopic.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/actions/invite.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/addtopic.php, mod/groups/all.php,
+ mod/groups/discussions.php, mod/groups/edit.php, mod/groups/edittopic.php,
+ mod/groups/forum.php, mod/groups/graphics/defaultlarge.gif,
+ mod/groups/graphics/defaultmedium.gif, mod/groups/graphics/defaultsmall.gif,
+ mod/groups/graphics/defaulttiny.gif, mod/groups/graphics/icon.php,
+ mod/groups/groupprofile.php, mod/groups/index.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/manifest.xml,
+ mod/groups/membership.php, mod/groups/membershipreq.php, mod/groups/new.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/group/group.php,
+ .../views/default/groups/closedmembership.php,
+ mod/groups/views/default/groups/contentwrapper.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ mod/groups/views/default/groups/members.php,
+ .../views/default/groups/membershiprequests.php,
+ mod/groups/views/default/groups/profileitems.php,
+ mod/groups/views/default/groups/side_menu.php,
+ .../views/default/icon/group/default/large.php,
+ .../views/default/icon/group/default/medium.php,
+ .../views/default/icon/group/default/small.php,
+ .../views/default/icon/group/default/tiny.php,
+ .../views/default/object/groupforumtopic.php,
+ mod/groups/views/default/river/forum/create.php,
+ .../views/default/river/forum/topic/create.php,
+ mod/groups/views/default/river/group/create.php,
+ .../views/default/river/object/group/create.php,
+ .../river/object/groupforumtopic/annotate.php,
+ .../river/object/groupforumtopic/create.php,
+ .../river/object/groupforumtopic/update.php,
+ .../default/river/relationship/member/create.php,
+ mod/groups/views/default/settings/groups/edit.php,
+ mod/groups/views/default/sharing/invite.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ .../views/default/widgets/a_users_groups/view.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php,
+ mod/groups/views/rss/forum/topicposts.php,
+ mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/contentwrapper.php,
+ mod/groups/views/rss/groups/profileitems.php,
+ mod/notifications/actions/groupsave.php, mod/notifications/actions/save.php,
+ .../graphics/icon_notifications_email.gif, mod/notifications/groups.php,
+ mod/notifications/index.php, mod/notifications/languages/en.php,
+ mod/notifications/manifest.xml, mod/notifications/start.php,
+ .../views/default/notifications/css.php,
+ .../notifications/settings/usersettings.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/jsfuncs.php,
+ .../notifications/subscriptions/personal.php,
+ mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/actions/resetdefaultprofile.php, mod/profile/defaultprofile.php,
+ mod/profile/edit.php, mod/profile/editicon.php,
+ mod/profile/graphics/defaultlarge.gif,
+ mod/profile/graphics/defaultmaster.gif,
+ mod/profile/graphics/defaultmedium.gif,
+ mod/profile/graphics/defaultsmall.gif, mod/profile/graphics/defaulttiny.gif,
+ mod/profile/graphics/defaulttopbar.gif, mod/profile/icon.php,
+ mod/profile/icondirect.php, mod/profile/index.php,
+ mod/profile/javascript.php, mod/profile/manifest.xml, mod/profile/start.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ .../views/default/js/jquery.imgareaselect-0.8.js,
+ .../default/js/jquery.imgareaselect-0.8.min.js,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/adminwrapper.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/submenu.php,
+ mod/profile/views/default/profile/userdetails.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/index.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/manifest.xml, mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/reportedcontent/user_report.php,
+ mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ mod/riverdashboard/index.php, mod/riverdashboard/languages/en.php,
+ mod/riverdashboard/manifest.xml, mod/riverdashboard/start.php,
+ .../views/default/river/sitemessage/create.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php,
+ .../views/default/settings/riverdashboard/edit.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../views/json/riverdashboard/container.php,
+ .../views/rss/riverdashboard/container.php, mod/thewire/actions/add.php,
+ mod/thewire/actions/delete.php, mod/thewire/add.php,
+ mod/thewire/everyone.php, mod/thewire/graphics/river_icon_thewire.gif,
+ mod/thewire/graphics/thewire_speech_bubble.gif, mod/thewire/index.php,
+ mod/thewire/languages/en.php, mod/thewire/manifest.xml,
+ mod/thewire/readme.txt, mod/thewire/start.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ .../views/default/thewire/activity_view.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/thewire/views/default/thewire/notfound.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/thewire/scripts/counter.js,
+ mod/thewire/views/default/thewire/view.php,
+ mod/thewire/views/default/widgets/thewire/edit.php,
+ mod/thewire/views/default/widgets/thewire/view.php: removed all main plugins
+ from core - they now live in the plugins svn
+
+2009-08-05 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Added documentation to
+ list_entities_from_access_collection();
+
+2009-08-04 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed a security issues when simple cache is off.
+
+2009-08-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: small edit
+
+2009-08-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Added starttime and endtime for
+ get_entities_from_annotation().
+
+2009-07-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Refs #1089: Removed [B] flag from htaccess. This flag is
+ wildly inconsistent in functionality and support in Apache. Will have to
+ implement a solution in PHP.
+
+2009-07-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Added get/list_entities_from_access_collection().
+
+ * engine/lib/cache.php: Fixes #1151: Added is_dir() check before attempting
+ to create cache directory.
+
+2009-07-27 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Fixes #1148: Correctly comparing strings to
+ get OS.
+
+2009-07-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/css.php: small fix to force facebook and
+ twitter user icons to the right size in the recent members sidebar
+
+2009-07-24 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Fixes #1144: Added comma between order by fields.
+
+
+2009-07-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, version.php: Closes #1137: Setting a hidden variable
+ "returntoreferer" in a login form will now cause the action to use the
+ "referrer" address on a successful login. Version bump.
+
+ * mod/profile/views/default/profile/editicon.php: Minor bugfix on username
+
+2009-07-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * .../views/default/object/groupforumtopic.php: Closes #1131: htmlentities
+ in view around user text
+
+2009-07-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: readme tweak
+
+ * CONTRIBUTORS.txt: small tweak
+
+2009-07-15 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icondirect.php, simplecache/view.php: Forcing a new db connect
+ for simplecache/view.php and mod/profile/icondirect.php Will avoid bugs if a
+ previous connection has been created.
+
+2009-07-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Closes #1119: If post data not initially found then
+ input stream is used.
+
+2009-07-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: Removed #1100 hack
+
+2009-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: Closes #1100: Added a dummy
+ function to page shell to initialise jquery
+
+ * views/default/canvas/layouts/widgets.php: Closes #1113: Htmlentities made
+ UTF-8 and quotes safe.
+
+2009-07-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php, version.php: Closes #1111: Using substr
+ instead of parse_url.
+
+ * engine/lib/elgglib.php: Refs #427: Added $vars array to hook call.
+
+2009-07-07 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/htmlawed/start.php: Closes #956: Classes are removed by the HTML
+ filter.
+
+ * engine/lib/access.php, mod/groups/start.php: Refs #1099: Using write
+ access hook to allow group-only ACLs. Need to examine better solutions after
+ 1.7.
+
+2009-07-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/pulldown.php: Closes #1105: Value on input/pulldown
+ view now escaped.
+
+ * engine/lib/xml-rpc.php: Closes #1075: XML-RPC client behaving as per spec
+
+2009-07-06 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php, htaccess_dist: Refs #1089: Added [B] flag to
+ rewrite for tags. Won't work until apache 2.2.12. Cleaned up some query
+ code in pagehandler().
+
+2009-07-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/cropicon.php: Admin cropping of other user icons now
+ works as expected.
+
+ * mod/profile/start.php: Fixed doubling on icon edit (nb. this was not the
+ same issue as Refs #1100)
+
+ * mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php: Removed edit profile, added
+ links to own page.
+
+2009-07-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: small tweak to filestore
+
+2009-07-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/cropicon.php, mod/profile/actions/edit.php,
+ mod/profile/actions/iconupload.php, mod/profile/editicon.php,
+ mod/profile/manifest.xml, mod/profile/start.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/menu/links.php,
+ mod/profile/views/default/profile/userdetails.php, version.php: * Closes
+ #1104: Edit profile and edit icon links on pulldown menu for editable users.
+ * Closes #545: Admins are now able to edit profiles and icons of other users.
+ * CSRF protection added to icon upload and edit code. * Version bump.
+
+ * engine/lib/entities.php: Closes #742: Ability to retrieve master icon from
+ getIcon() interface.
+
+ * languages/en.php, mod/profile/views/default/profile/editicon.php: Closes
+ #1103: Profile text now has translation tag
+
+2009-07-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: added css rule for em tags to work properly with
+ htmlawed and tinyMCE editor
+
+2009-07-03 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/htmlawed/start.php: Allowing selected style attributes in htmlawed.
+
+2009-07-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Removing update client from initial
+ modules.
+
+ * actions/systemsettings/install.php: Refs #1086 & #1073: Filtering and
+ captcha have correct install defaults.
+
+2009-07-02 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Closes #859: Group forum thread-starters receive
+ same email as participants.
+
+2009-07-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: order by now works on get entities from metadata
+
+2009-07-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/htmlawed/start.php: Fixed a typo in htmlawed filtering.
+
+ * engine/lib/users.php: Refs #1058: Using validated metadata for new user
+ permission check. Correctly allows for enable() / disable(), but still not
+ ideal.
+
+2009-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009070101.php, mod/kses/manifest.xml,
+ mod/kses/start.php, mod/kses/vendors/kses/AUTHORS,
+ mod/kses/vendors/kses/COPYING, mod/kses/vendors/kses/ChangeLog,
+ mod/kses/vendors/kses/README, mod/kses/vendors/kses/TODO,
+ mod/kses/vendors/kses/docs/attribute-value-checks,
+ mod/kses/vendors/kses/docs/hooks,
+ mod/kses/vendors/kses/docs/stripping-everything,
+ mod/kses/vendors/kses/docs/supported-formats,
+ .../vendors/kses/docs/whitelisted-url-protocols,
+ mod/kses/vendors/kses/examples/filter.php,
+ mod/kses/vendors/kses/examples/test.php, mod/kses/vendors/kses/kses.php,
+ mod/kses/vendors/kses/oop/oop.kses.changelog.txt,
+ mod/kses/vendors/kses/oop/oop.simple.api.txt,
+ mod/kses/vendors/kses/oop/php4.class.kses.php,
+ mod/kses/vendors/kses/oop/php5.class.kses.php,
+ mod/kses/vendors/kses/oop/test.oop.kses.php, version.php: Refs #1086:
+ Deprecating kses and removing it from core. Version bump.
+
+2009-07-01 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/htmlawed/manifest.xml, mod/htmlawed/start.php,
+ mod/htmlawed/vendors/htmLawed/htmLawed.php,
+ mod/htmlawed/vendors/htmLawed/htmLawedTest.php,
+ mod/htmlawed/vendors/htmLawed/htmLawed_README.htm,
+ mod/htmlawed/vendors/htmLawed/htmLawed_README.txt,
+ .../vendors/htmLawed/htmLawed_TESTCASE.txt: Refs #1086: Added htmLawed plugin
+ as replacement for kses.
+
+2009-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Closes #1097: Results set by set_input are now also
+ filtered by get_input()
+
+ * engine/lib/annotations.php: Short circuit on delete annotations to avoid
+ error message
+
+ * engine/lib/metadata.php: Metadata delete now passing correct object, also
+ handles missing metadata entity.
+
+2009-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/jsfuncs.php,
+ .../views/default/js/jquery.imgareaselect-0.4.2.js,
+ .../default/js/jquery.imgareaselect-0.4.2.min.js,
+ .../views/default/js/jquery.imgareaselect-0.8.js,
+ .../default/js/jquery.imgareaselect-0.8.min.js,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/javascript.php,
+ vendors/jquery/jquery-1.2.6.pack.js, vendors/jquery/jquery-1.3.2.min.js,
+ vendors/jquery/jquery-ui-1.7.2.custom.min.js,
+ .../jquery/jquery-ui-personalized-1.5.3.packed.js,
+ vendors/jquery/jquery.form.js, views/default/embed/addcontentjs.php,
+ views/default/js/initialise_elgg.php, views/default/js/upload_js.php,
+ views/default/page_elements/header.php: update to jquery 1.3.2 and jqueryUI
+ 1.7.2 closes #941
+
+2009-06-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php: fixed wire reply button
+ (missing 'echo'), and tweaked river/dashboard reply link for the default
+ theme. Also fixed a typo in the admin area
+
+2009-06-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/groups.php, search/index.php, search/users.php: Refs #1086: Fixes
+ specific issues mentioned pending KSES fix / replacement
+
+2009-06-30 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, views/default/friends/collection.php,
+ views/default/output/confirmlink.php: Modified output/confirmlink view to
+ accept a class param. user_remove_friend() uses
+ remove_user_from_access_collection() instead of raw SQL. Deleting an access
+ collection prompts using output/confirmlink.
+
+2009-06-30 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/river/object/thewire/create.php: wire links will now
+ work in the activity river
+
+2009-06-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Fixed typo
+
+2009-06-29 brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php: Ref #1015: Correctly placed the end
+ div for access collection delete link.
+
+ * views/default/friends/collection.php: Closes #1015: Added a prompt before
+ deleting an access collection. Also cleaned up some hard vs soft tab issues.
+
+
+ * engine/lib/users.php: Closes #502: Removing unfriended users from access
+ lists upon unfriending.
+
+ * engine/lib/annotations.php: Closes #337: Added checking for metastrings in
+ __get_annotations_calculate_x()
+
+ * engine/lib/entities.php, engine/lib/relationships.php: Updated get_*()
+ functions ot return false if an invalid subtype is specified.
+
+2009-06-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009050801.php: Closes #1073: Captcha off by default
+
+2009-06-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river2.php: Access levels on add_to_river() will now respect
+ ACCESS_DEFAULT level.
+
+ * views/rss/pageshells/pageshell.php: Closes #1090: Removed xml:base from
+ RSS channel tag.
+
+2009-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/captcha/manifest.xml: Minor point of clarification
+
+2009-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: tweak to input box size
+
+2009-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * engine/lib/elgglib.php: Closes #427: Original view name passed to plugin
+ hook.
+
+ * engine/lib/filestore.php: Some tidying of file download manager functions.
+
+2009-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * actions/friends/add.php, actions/friends/remove.php,
+ mod/profile/views/default/profile/menu/actions.php: Action gatekeeper added
+ to add and remove friends.
+
+2009-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump.
+
+ * views/ical/canvas/default.php, views/ical/export/entity.php,
+ views/ical/object/default.php, views/ical/pageshells/pageshell.php,
+ views/ical/search/entity_list.php: Closes #581: First draft ICAL export views
+ for Notable calendar events.
+
+2009-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump.
+
+ * engine/lib/filestore.php: Closes #601: Provides default for new
+ ElggFilestore objects to remove warning message.
+
+2009-06-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php: * Translation 'reply'
+ fixed. * Now possible to reply to wire posts from within the river.
+
+ * engine/lib/annotations.php: Closes #719: More options on annotation count
+ functions.
+
+ * views/default/input/access.php, views/default/input/button.php,
+ views/default/input/checkboxes.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/hidden.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/plaintext.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Closes #540:
+ input/* views have internalid attribute.
+
+ * engine/lib/elgglib.php: Refs #964: Correct detection of type.
+
+ * version.php: Version bump
+
+ * engine/lib/system_log.php: Refs #328: Documentation tweak.
+
+ * engine/lib/elgglib.php: Refs #964: Tidied plugin hook into framework
+ function, changed hook to entity:annotate.
+
+2009-06-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, version.php: Marcus Povey 20090616: * Closes #964:
+ Introduces a plugin hook 'annotations:view', $entity_class
+ (object/user/group/site) called elgg_view_entity on FULL view. This lets you
+ return annotations to an entity and control the order in which they're
+ displayed. Existing views remain un-effected but should probably be
+ retrofitted. * Version bump.
+
+ * engine/lib/system_log.php: Bugfix to archive logs sql
+
+2009-06-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/urlshortener.php: URL shortener view.
+
+ * htaccess_dist: Actions rewrite rule will now match against numbers as well
+ as letters.
+
+ * version.php: Version bump
+
+ * mod/thewire/views/default/thewire/forms/add.php: Call out to a url
+ shortner if one is available, through the use of the input/urlshortner view.
+
+2009-06-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * engine/lib/filestore.php, engine/lib/users.php: Refs #1041: * Speculative
+ fix, extended blacklist of invalid characters for user signup * Mapping some
+ filestore matrix characters (notable '.') to a safe char
+
+ * engine/lib/filestore.php, languages/en.php: Refs #1041: Extra debug
+
+2009-06-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Block URL unsafe characters from username
+
+2009-06-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: File cache attempts to create directory if it is not
+ present.
+
+2009-06-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/mb_wrapper.php, mod/thewire/start.php: * Introducing substr
+ wrapper function * Wire strips tags (Closes #1045)
+
+2009-06-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/mb_wrapper.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, search/index.php, version.php: Closes #639: *
+ Metastrings can be searched either case sensitive or insensitive modes. *
+ Tags now have case lowered in a UTF8 safe way (requires mbstring support). *
+ Introducing mb_wrapper.php containing multibyte wrapper functions. * Version
+ bump. * Introduces #1043 for consideration.
+
+ * engine/lib/actions.php, engine/lib/pagehandler.php: Close #1040: Limited
+ explode on action and page handler.
+
+2009-06-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/checkboxes.php: Closes #1037: Removed double pasting
+
+2009-06-04 kevin <kevin@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/js/upload_js.php: Changed a variable name that IE did not
+ like.
+
+2009-06-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Closes #998 : Operator selection on get by
+ metadata multi
+
+2009-06-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Removed some error messages
+
+2009-05-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Option to suppress visible errors in token
+ validation code.
+
+2009-05-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/upload/upload_form_content.php: hashed out folders view
+
+2009-05-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: Closes #1035: Page handler now urldecodes
+ input, necessary as vars are extracted from request_uri and not $_REQUEST
+ (which is automatically decoded)
+
+ * engine/lib/group.php: Fixed some typos in group search
+
+ * languages/en.php: Group search language correction
+
+ * languages/en.php, search/groups.php: Group search language correction
+
+ * views/default/user/search/finishblurb.php: Refs #965: Correct some search
+ links.
+
+ * views/default/group/search/finishblurb.php,
+ views/default/user/search/finishblurb.php: Refs #965: Correct some search
+ links.
+
+ * engine/lib/entities.php, engine/lib/search.php, search/index.php,
+ version.php: Refs #965: Search now correctly using page handler to make it
+ easier to replace.
+
+ * views/default/page_elements/elgg_topbar.php: Refs #965: Topbar search now
+ pointing at correct url.
+
+ * languages/en.php, views/default/page_elements/elgg_topbar.php: Closes
+ #805: Top bar search now internationalised. Refs #965
+
+2009-05-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Delete event now
+ triggered on metadata and annotation delete
+
+ * version.php: Version bump
+
+ * engine/lib/sessions.php: Admin shortcut flag set on login as well as init
+
+2009-05-27 kevin <kevin@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Removed plugin-specific references from
+ file_display_thumbnail and file_add_to_folders.
+
+2009-05-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Refs #965: Allowing upgrades to be loaded from
+ other locations.
+
+ * engine/lib/group.php, engine/lib/users.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2009052201.sql, languages/en.php, search/groups.php,
+ version.php, views/default/group/search/finishblurb.php,
+ views/default/group/search/startblurb.php: Closes #1030: Group title and
+ description search added, refs #965
+
+ * engine/lib/users.php: Closes #1031: Restored wildcard as it didn't appear
+ that slow.
+
+2009-05-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/captcha/views/default/input/captcha.php: captcha layout tweak
+
+2009-05-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * engine/lib/database.php: Refs #1027: Introducing
+ $CONFIG->db_disable_query_cache which allows disabling of query cache for
+ implementation in CLI mode
+
+ * engine/lib/actions.php: Closes #1026: Removed "@" from include statement
+
+2009-05-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Closes #1025: Using the correct variable.
+
+2009-05-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * views/rss/annotation/default.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/pageshells/pageshell.php,
+ views/rss/user/default.php: Closes #646: GeoRSS support added to Locatable
+ objects with coordinates on RSS feeds
+
+ * views/rss/annotation/default.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/pageshells/pageshell.php,
+ views/rss/user/default.php: Closes #1024: Added call to views which allow
+ extensions to be made.
+
+ * views/rss/annotation/default.php, views/rss/group/default.php,
+ views/rss/object/default.php, views/rss/pageshells/pageshell.php: Making use
+ of the Dublin Core extensions to provide owner information in RSS feeds
+
+ * engine/lib/location.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2009051401.sql, version.php: Fixed geocode stuff +
+ version bump
+
+2009-05-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ mod/diagnostics/views/default/diagnostics/test.php,
+ .../views/default/diagnostics/testresult.php: Closes #1009: Diagnostics unit
+ test with example
+
+ * engine/lib/testing.php, mod/diagnostics/index.php,
+ mod/diagnostics/languages/en.php, mod/diagnostics/start.php,
+ mod/diagnostics/testreport.php, mod/diagnostics/unittester.php,
+ .../views/default/diagnostics/runalltests.php,
+ mod/diagnostics/views/default/diagnostics/test.php,
+ .../views/default/diagnostics/testresult.php: Refs #1009: Enhancements to
+ diagnostics tool to use the test framework.
+
+ * engine/lib/testing.php: Refs #1009: Changed the method tests are
+ performed.
+
+ * engine/lib/testing.php: Refs #1009: Simple test framework outline added.
+
+2009-05-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php: Closes #1003: Using more efficient query
+
+ * engine/lib/river.php, version.php: Removed deprecated river library +
+ version bump
+
+ * engine/lib/actions.php: Closes #749: Warning message on missing token.
+
+2009-05-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php: Closes #944: Changed owner check to a
+ canEdit check on the group.
+
+ * engine/lib/river.php: Deprecated old river code
+
+ * engine/lib/system_log.php, version.php: Closes #1010: Log event now called
+ on an event of its own, this permits plugins to add additional logging or
+ replace the logging method altogether. This is only possible now that the
+ old river code has been replaced.
+
+ * engine/lib/version.php: Refs #965 & #967: Event triggered on upgrade,
+ allowing easier integration with plugins.
+
+ * views/default/spotlight/default.php: Closes #1017: Div no longer closed
+ early.
+
+ * views/default/page_elements/elgg_topbar.php: Closes #1016: Image tag
+ closed
+
+ * version.php: Version bump
+
+ * mod/captcha/start.php: Captcha list can now be extended by other plugins
+
+2009-05-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/start.php: Hard limit to string lengths.
+
+ * mod/captcha/fonts/Liberation_serif_License.txt: Added font licence, refs
+ #1011
+
+ * actions/systemsettings/install.php, engine/lib/upgrades/2009050801.php,
+ mod/captcha/backgrounds/bg1.jpg, mod/captcha/backgrounds/bg2.jpg,
+ mod/captcha/backgrounds/bg3.jpg, mod/captcha/backgrounds/bg4.jpg,
+ mod/captcha/backgrounds/bg5.jpg, mod/captcha/captcha.php,
+ mod/captcha/fonts/1.ttf, mod/captcha/languages/en.php,
+ mod/captcha/manifest.xml, mod/captcha/start.php,
+ mod/captcha/views/default/captcha/css.php,
+ mod/captcha/views/default/input/captcha.php, version.php: Closes #1011: Added
+ basic captcha support.
+
+ * actions/systemsettings/install.php: System default plugins now accepts
+ array as well as CSV
+
+ * views/default/account/forms/forgotten_password.php: Refs #1011: Correctly
+ CSSed and now using captcha if available
+
+2009-05-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * views/default/account/forms/register.php, views/default/input/captcha.php:
+ Closes #983: Introducing input/captcha view, use wherever a captcha is
+ required - override with plugins and use the actions hook to do additional
+ validation!
+
+ * engine/lib/relationships.php: Refs #975: Get entities from metadata and
+ relationship now behaves as expected
+
+2009-05-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Closes #994: elgg_view_exists will now check to
+ see if a view exists by dint of being extended.
+
+ * engine/lib/access.php, engine/lib/elgglib.php: Removing spurious error log
+ messages
+
+ * mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php: Closes #725: Typo corrected.
+
+ * languages/en.php, mod/riverdashboard/languages/en.php,
+ .../views/default/riverdashboard/welcome.php,
+ views/default/basic_elements/welcome.php,
+ views/default/welcome/logged_in.php: Closes #950: Fixed missing translations.
+
+ * mod/riverdashboard/languages/en.php,
+ .../views/default/riverdashboard/welcome.php: Closes #1004: Welcome no longer
+ hard coded.
+
+ * version.php: Version bump
+
+ * engine/lib/entities.php: Closes #1007: Private data now removed on entity
+ deletion.
+
+ * engine/lib/users.php: Closes #1008: Fixed typo
+
+2009-05-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Closes #824: Test variable to prevent error
+ message in log.
+
+2009-05-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Closes #1002: Committed missing variable code
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: Test
+
+2009-04-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * UPGRADE.txt: Closes #1001: This is a test
+
+ * UPGRADE.txt: Refs #4: This is a test
+
+ * UPGRADE.txt:
+
+ * UPGRADE.txt:
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: TEst
+
+ * UPGRADE.txt: Test
+
+ * UPGRADE.txt: Removed test
+
+ * UPGRADE.txt: Test
+
+2009-04-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Closes #927: Minimum user length no longer hard
+ coded.
+
+ * engine/lib/relationships.php: Closes #975: Now possible to search by
+ metadata and relationship
+
+ * engine/lib/users.php: Closes #943: Event triggered when banning or
+ unbanning a user.
+
+2009-04-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * mod/groups/actions/edit.php,
+ mod/groups/views/default/forms/groups/edit.php: Added security token to group
+ edit form
+
+ * views/default/input/form.php, views/default/input/securitytoken.php:
+ Introducing input/securitytoken as an intermediate step for form conversion.
+
+ * mod/groups/actions/edit.php, mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/edit.php: Closes #969: Admin option to
+ allow the setting of certain access controls on a group
+
+ * actions/useradd.php, engine/lib/users.php: Closes #856: Admin created
+ users are no longer created as being owned by the admin
+
+2009-04-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: Refs #969: Added admin menu option for
+ enabling private groups
+
+ * mod/groups/views/default/settings/groups/edit.php: Refs #969: Added admin
+ menu option for enabling private groups
+
+ * engine/lib/group.php: Closes #980: group_gatekeeper() now has an admin
+ override if the admin is logged in
+
+ * simplecache/view.php: Closes #989: Forces regenerate on next refresh when
+ cache file is missing
+
+2009-04-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php, engine/lib/users.php:
+ Deleting correct data + using correct tables
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/metadata.php, engine/lib/users.php: Closes #957: Annotations and
+ metadata owned by a deleted user are now also deleted.
+
+ * languages/en.php, mod/groups/views/default/forum/topicposts.php,
+ .../views/default/object/groupforumtopic.php: Closes #957: Groups topics now
+ handle deleted users, I recommend that people look at what I've done and
+ handle deleted users in a similar way in their plugins.
+
+2009-04-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Belts and braces checking on isloggedin()
+
+2009-04-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/sidebar_boxes.php: an extra view to extend,
+ added to sidebar boxes
+
+2009-04-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/kses/manifest.xml: Refs #833: Added manifest
+
+ * actions/systemsettings/install.php, engine/lib/input.php,
+ engine/lib/upgrades/2009041701.php, mod/kses/start.php,
+ mod/kses/vendors/kses/AUTHORS, mod/kses/vendors/kses/COPYING,
+ mod/kses/vendors/kses/ChangeLog, mod/kses/vendors/kses/README,
+ mod/kses/vendors/kses/TODO,
+ mod/kses/vendors/kses/docs/attribute-value-checks,
+ mod/kses/vendors/kses/docs/hooks,
+ mod/kses/vendors/kses/docs/stripping-everything,
+ mod/kses/vendors/kses/docs/supported-formats,
+ .../vendors/kses/docs/whitelisted-url-protocols,
+ mod/kses/vendors/kses/examples/filter.php,
+ mod/kses/vendors/kses/examples/test.php, mod/kses/vendors/kses/kses.php,
+ mod/kses/vendors/kses/oop/oop.kses.changelog.txt,
+ mod/kses/vendors/kses/oop/oop.simple.api.txt,
+ mod/kses/vendors/kses/oop/php4.class.kses.php,
+ mod/kses/vendors/kses/oop/php5.class.kses.php,
+ mod/kses/vendors/kses/oop/test.oop.kses.php, vendors/kses/AUTHORS,
+ vendors/kses/COPYING, vendors/kses/ChangeLog, vendors/kses/README,
+ vendors/kses/TODO, vendors/kses/docs/attribute-value-checks,
+ vendors/kses/docs/hooks, vendors/kses/docs/stripping-everything,
+ vendors/kses/docs/supported-formats,
+ vendors/kses/docs/whitelisted-url-protocols,
+ vendors/kses/examples/filter.php, vendors/kses/examples/test.php,
+ vendors/kses/kses.php, vendors/kses/oop/oop.kses.changelog.txt,
+ vendors/kses/oop/oop.simple.api.txt, vendors/kses/oop/php4.class.kses.php,
+ vendors/kses/oop/php5.class.kses.php, vendors/kses/oop/test.oop.kses.php,
+ version.php: Closes #833: Kses now built as module
+
+ * engine/lib/input.php: Reverted last
+
+2009-04-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: small tweak to kses input, for now.
+
+2009-04-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Removed style on code
+
+ * engine/lib/input.php: Removed columns
+
+ * engine/lib/input.php: Slightly more draconian kses rules
+
+ * engine/lib/plugins.php: Closes #982: Object limit maximum raised.
+
+2009-04-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Moved old file mime type guesser back to files
+ plugin so that there are no conflicts
+
+2009-04-16 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Passed container_guid to any quota plugins and
+ removed duplicate function definition.
+
+ * engine/lib/filestore.php: Added file_get_general_file_type() function
+
+2009-04-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, version.php: Centralised mimetype function
+
+ * engine/lib/filestore.php, views/default/js/upload_js.php,
+ views/default/upload/upload_form_content.php: Rolled in Kevin's file store
+ enhancements and upload code.
+
+ * version.php: Version bump
+
+ * engine/lib/pageowner.php, languages/en.php: Error logged on page forward
+ due to missing page owner.
+
+2009-04-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/graphics/river_icon_thewire.gif,
+ .../views/default/thewire/activity_view.php: link to the wire added to bottom
+ of latest wire post box on riverdashboard page
+
+2009-04-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: small profile custom
+ fields tweak
+
+2009-04-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/start.php: The Wire incoming SMS now uses the default access
+ level.
+
+ * mod/thewire/start.php: Moving the wire to use $SESSION instead of
+ $_SESSION
+
+ * engine/lib/elgglib.php: Removing viewtype autoforward, because it broke
+ installs.
+
+2009-04-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/actionurl.php, views/default/output/confirmlink.php,
+ views/default/output/url.php: Rolled token into url and confirmlink
+
+ * engine/lib/tags.php: Closes #977: get_tags now functional for entities
+ without subtypes.
+
+2009-04-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/actionurl.php: Introducing actionurl.php (Refs #749)
+
+ * engine/lib/pageowner.php: Forward user if a page owner is inaccessible
+ (Refs #969)
+
+ * engine/lib/elgglib.php: Non-default view types now preserved when
+ forwarding.
+
+ * engine/lib/metadata.php: Closes #974: Owner_guid may now be an array
+
+2009-04-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, engine/lib/configuration.php,
+ engine/lib/elgglib.php, languages/en.php, views/default/settings/system.php:
+ Close #968: View path cache can now be turned on and off
+
+ * engine/lib/elgglib.php: Removed unused experimental cache functions
+
+ * actions/admin/plugins/reorder.php, engine/lib/plugins.php: Refs #946:
+ Improved documentation on enable/disable/reorder plugin commands
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, engine/lib/elgglib.php,
+ engine/lib/plugins.php, upgrade.php: Refs #968 & #946: Tidied filepath cache
+ stuff by placing them in function calls.
+
+ * mod/profile/views/default/profile/userdetails.php,
+ views/default/admin/main.php, views/default/admin/plugins.php,
+ views/default/admin/site.php, views/default/admin/user.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/messages/errors/error.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/messages/message.php,
+ views/default/usersettings/main.php, views/default/usersettings/plugins.php:
+ Refs #963: Autop changed to longtext on standard views
+
+ * engine/lib/database.php, version.php: Added callback support to
+ get_data_row()
+
+2009-04-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Closes #937: Added time constraints to the tag
+ retrieval query.
+
+2009-04-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: The inclusion of a new library merits a new internal version
+ number.
+
+2009-04-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php,
+ .../views/default/riverdashboard/newestmembers.php: Closes #932: Recent
+ members string no longer hard coded
+
+2009-04-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/jquery/jquery.form.js, views/default/page_elements/header.php:
+ jQuery Form plugin, welcome to Elgg Core.
+
+2009-04-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/object/thewire.php: Closes #949: Method in "via
+ {{Method}}" now wrapped in an elgg_echo
+
+ * engine/lib/plugins.php: Closes #945: enable/disable_plugin now updates
+ $ENABLED_PLUGINS_CACHE
+
+2009-03-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/manifest.xml, version.php: Version bump
+
+ * engine/lib/metadata.php, engine/lib/users.php,
+ mod/uservalidationbyemail/start.php: Closes #896: Error thrown if user not
+ validate. Metadata physically removed rather than simply blanked when
+ validation is requested. Note: update_metadata no longer seems to support
+ anonymous metadata which is likely to have knock on issues elsewhere...
+
+2009-03-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icondirect.php: Closes #916: Icondirect now using multibyte
+ safe str_split code from filestore.php
+
+ * version.php: Version bump
+
+ * engine/lib/database.php: Closes #875: Using db link
+
+ * engine/lib/notification.php: Closes #889: Decoding html entities from
+ messages before stripping tags
+
+ * engine/lib/elgglib.php: Closes #897: Memcache datalists correctly saved on
+ first load
+
+ * views/default/css.php: Closes #903: Large <pre> and <code> blocks no
+ longer break page shell
+
+ * mod/riverdashboard/index.php: Closes #899: River dash ajax now UTF-8
+
+ * views/default/page_elements/owner_block.php: Closes #914: Removed odd line
+
+2009-03-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php: Context can now be assigned by defining a
+ constant in the page.
+
+2009-03-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php: Refs #926: Private wire posts get bumped to
+ 'logged in'
+
+2009-03-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: small lang tweak
+
+ * languages/en.php, .../views/default/profile/editdefaultprofile.php: small
+ lang tweak
+
+2009-03-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/edittopic.php: Closes #930: addtopic -> edittopic
+
+2009-03-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/river_widget/view.php: small tweak
+
+ * .../views/default/river/object/thewire/create.php: river view tweak for
+ the wire
+
+2009-03-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Different assignment.
+
+ * engine/lib/users.php: Disposed of unnecessary $result variables.
+
+ * engine/lib/api.php: Closes #844: API parameter test logic improved
+
+ * engine/lib/languages.php: Closes #883: Using different operator logic so
+ that plugins can replace existing translation entries.
+
+ * mod/groups/actions/addtogroup.php: Closes #893: Using ->join() method
+ instead to ensure that event is triggered.
+
+2009-03-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt, version.php: Oh hai Elgg 1.5
+
+ * actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ .../actions/email/confirm.php, version.php: Closes #873: Mail/password
+ reset/confirm actions forward to wwwroot rather than ref. Version bump.
+
+ * engine/lib/elgglib.php: Fixes #877: Minor typo addressed. Note: This
+ function is currently not used.
+
+2009-03-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, version.php: Fixed typo in default
+ plugins init + version bump
+
+2009-03-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * engine/lib/notification.php: Provide a From email address workaround for
+ those with windows servers. See issue http://bugs.php.net/bug.php?id=28038
+
+2009-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Profile user icon URL fix.
+
+2009-03-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/objects.php,
+ engine/lib/sites.php, engine/lib/users.php, languages/en.php, version.php:
+ Closes 868: Fixes regression introduced in [3119]. Version number bumped.
+
+2009-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Added a clause that will detect if insert_data
+ returned 0 rather than false, and returns 'true' in this case. Fixes #867
+
+ * views/default/page_elements/header.php: Javascript loaded using a safer
+ URL scheme. Fixes #862
+
+2009-03-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, .../views/default/groups/group_sort_menu.php:
+ missing lang strings fixed
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/groups/grouplisting.php: missing strings added
+
+2009-03-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: left column sidebar background color changed for
+ consistency with other pages (props to Cash for spotting it)
+
+2009-03-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Minor api tweak
+
+2009-03-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Changing version number
+
+ * version.php: Elgg 1.5 RC2. Hi!
+
+2009-03-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Closes #823: Root cause was that the Headers decl requires
+ mod_headers to be installed (and Apache had a very unhelpful failure mode for
+ instances when it wasn't). The Header def has now been IfModuled out.
+ mod_headers is still recommended for correct functioning across proxies.
+
+2009-03-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: openID river rules removed
+
+2009-03-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Refs #823: Mod_deflate htaccess def now disabled by
+ default.
+
+ * mod/groups/actions/edit.php: Admins can now change group profile picture.
+
+2009-03-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Banned users always have default icons.
+
+ * mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php: Some
+ tweaks to river dashboard, including proper language usage.
+
+ * engine/lib/notification.php: Banned users no longer get notifications
+
+ * actions/register.php, engine/lib/users.php: User validation no longer
+ occurs on first install
+
+ * engine/lib/filestore.php: Icons are now correctly resized
+
+2009-03-09 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php, mod/groups/start.php,
+ mod/groups/views/default/forms/groups/edit.php: Groups now support
+ add_group_tool_option so that any group tool can be toggled on or off via the
+ group's edit form.
+
+ * engine/lib/group.php: Introducing the add_group_tool_option function.
+
+2009-03-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/crontrigger/manifest.xml, mod/diagnostics/manifest.xml,
+ mod/garbagecollector/manifest.xml, mod/groups/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/notifications/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/riverdashboard/manifest.xml,
+ mod/thewire/manifest.xml, mod/uservalidationbyemail/manifest.xml: Bumped
+ version numbers on bundled plugins
+
+2009-03-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: css river rule added for openID user updating
+ profile
+
+2009-03-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version bump
+
+ * mod/profile/views/default/profile/userdetails.php: Closes #851: Fixed
+ regression. It is now possible for an admin to edit another user's profile
+ consistent with 1.2
+
+ * _css/css.php, _css/js.php: Closes #844 & #845: Override is now no longer
+ forced on and so will now obey view cache settings.
+
+ * mod/groups/actions/invite.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/views/default/forms/groups/invite.php:
+ Closes #843: Introducing intermediary invite action to establish invite
+ relationship but ask a user to join
+
+ * version.php: Version bump
+
+ * engine/lib/users.php: Closes #841: User request for password changes now
+ functional.
+
+2009-03-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: one column canvas padding adding
+
+2009-03-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Very minor comment tweak
+
+ * engine/lib/group.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Reversed delete procedure on entities, parent now
+ checked first before sub deleted. Any stubs left over will be handled by the
+ garbage collector.
+
+2009-03-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: river icon added for openID friend, blockquote
+ style tweaked, elgg horizontal nav bar improved
+
+2009-03-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bumped version number corresponding to the change
+
+ * engine/lib/entities.php: Added garbage collector hook to clear up orphaned
+ sub table entities.
+
+ * mod/garbagecollector/start.php: Changed 'system','gc' to 'gc','system'
+
+2009-03-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Fixed icon overrides
+
+ * engine/lib/river2.php: If you don't have any friends, the river no longer
+ returns all on the 'friends' view. Fixes #839
+
+ * mod/profile/views/default/profile/listing.php: Removed banned listing
+
+ * mod/profile/index.php: Banned profiles are now hidden
+
+ * mod/profile/views/default/profile/userdetails.php: Fixed user profile ban
+ message
+
+2009-03-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version number bump
+
+ * engine/lib/languages.php: Closes #838: Missing set from static var.
+
+2009-03-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/json/riverdashboard/container.php,
+ views/json/river/item/list.php: Improved JSON version of the dashboard
+
+2009-03-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: missing river entry style added
+
+2009-03-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php: Online users list works properly
+
+ * languages/en.php, views/default/annotation/annotate.php: Fixed generic
+ river comment view
+
+ * mod/riverdashboard/languages/en.php: Corrected a poorly formatted text
+ string
+
+ * mod/thewire/manifest.xml: New manifest description for the wire.
+
+ * version.php: Elgg 1.5 RC1 is gearing up to leave the building.
+
+ * mod/apiadmin/actions/generate.php, mod/apiadmin/actions/revokekey.php,
+ mod/apiadmin/index.php, mod/apiadmin/languages/en.php,
+ mod/apiadmin/manifest.xml, mod/apiadmin/start.php,
+ .../views/default/apiadmin/forms/add_key.php,
+ mod/apiadmin/views/default/object/api_key.php,
+ mod/guidtool/actions/delete.php, mod/guidtool/export.php,
+ mod/guidtool/format_picker.php, mod/guidtool/import.php,
+ mod/guidtool/index.php, mod/guidtool/languages/en.php,
+ mod/guidtool/manifest.xml, mod/guidtool/start.php, mod/guidtool/view.php,
+ .../views/default/forms/guidtool/export.php,
+ .../views/default/forms/guidtool/format.php,
+ .../views/default/forms/guidtool/import.php,
+ mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php,
+ mod/guidtool/views/default/guidtool/profile.php,
+ .../views/default/object/guidtoolwrapper.php: Farewell APIadmin, farewell
+ GUIDtool. We'll see you over in the plugins repo.
+
+ * mod/thewire/actions/add.php: Wire posts now save as default access level
+
+ * mod/thewire/actions/add.php: Wire posts are now default access
+
+ * UPGRADE.txt: Improved upgrade text
+
+ * engine/lib/entities.php: Error in subtype detection
+
+2009-03-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/newestmembers.php: a small layout tweak
+
+2009-03-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, htaccess_dist: Fixed search RSS
+
+2009-03-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bumped version
+
+ * mod/crontrigger/start.php: Surpressing cron output
+
+2009-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: tiny rule added to make widget layout consistent
+ across all widgets
+
+2009-03-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Private items never trigger notifications
+
+ * engine/lib/entities.php: Access fix
+
+ * engine/lib/entities.php: Let's go with the most obvious application of
+ this.
+
+ * engine/lib/entities.php, engine/lib/river2.php: River access issues
+
+ * engine/lib/river2.php, languages/en.php,
+ views/default/river/item/noaccess.php: Stopgap for when you can no longer
+ view river items.
+
+ * views/default/input/button.php: Button src isn't always required.
+
+ * mod/notifications/languages/en.php: Text changes to hopefully make friends
+ notification settings a little less confusing
+
+ * CONTRIBUTORS.txt: Addition to the contributors file
+
+2009-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/thewire/css.php: css tweak
+
+2009-03-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/forms/guidtool/export.php,
+ .../views/default/forms/guidtool/import.php: GUIDtool now uses
+ input/plaintext
+
+ * engine/lib/access.php: Access modification - owners can always see their
+ own content
+
+ * views/foaf/user/default.php: Correction to FOAF URL
+
+ * views/foaf/user/default.php: FOAF URL fix
+
+ * views/foaf/page_elements/contentwrapper.php: FOAF contentwrapper
+
+2009-03-04 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Changed notification to use
+ has_access_to_entity to move all access control checks to a single mechanism
+
+2009-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/thewire/css.php: added rule to prevent character
+ remaing field focus on thewire individual page
+
+2009-03-04 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Added has_access_to_entity function
+
+ * engine/lib/access.php: Added the ability to optionally specify the user to
+ get_access_sql_suffix
+
+2009-03-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/group/default.php, views/rss/object/default.php,
+ views/rss/river/item/list.php: URL sanitation for RSS feeds
+
+ * mod/groups/views/default/groups/contentwrapper.php: Removing extra quotes
+
+ * views/json/page_elements/contentwrapper.php: JSON contentwrapper view
+
+ * engine/lib/elgglib.php, mod/groups/all.php, mod/groups/edit.php,
+ mod/groups/groupprofile.php,
+ mod/groups/views/default/groups/contentwrapper.php,
+ mod/groups/views/rss/groups/contentwrapper.php,
+ views/default/page_elements/contentwrapper.php,
+ views/rss/page_elements/contentwrapper.php: Added contentWrapper view
+
+2009-03-04 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/query.php: AccessControlQueryComponent::__toString changed to
+ use get_access_sql_suffix
+
+2009-03-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidtool/export.php, mod/guidtool/format_picker.php,
+ mod/guidtool/import.php, mod/guidtool/index.php,
+ mod/guidtool/languages/en.php, mod/guidtool/start.php: Moved GUID tool to
+ admin menu.
+
+2009-03-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/css.php: added a rule to prevent
+ characters remaining field on thewire receiving focus/highlighting
+
+2009-03-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/river/item/list.php: Title fix.
+
+ * engine/lib/elgglib.php, views/rss/river/item/list.php: Fixed river RSS
+ views
+
+2009-03-04 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Commented out a no longer needed line of code
+
+ * engine/lib/tags.php: get_tags now uses get_access_sql_suffix for access
+ control.
+
+2009-03-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/river/item/list.php: Ampersand fix
+
+ * engine/lib/elgglib.php, .../views/rss/riverdashboard/container.php,
+ views/rss/river/item/list.php: Improvements to elgg_view, plus river
+ dashboard RSS feed
+
+ * mod/groups/start.php: The 'manage join requests' link doesn't show up if
+ the current group doesn't have public membership.
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, mod/profile/icon.php, mod/profile/icondirect.php,
+ simplecache/view.php: Moving to a smaller chunk size.
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bumping version number
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icon.php: Profile icons come in chunks.
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, simplecache/view.php: Echoing the large output
+ buffer in chunks
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icon.php, mod/profile/icondirect.php, simplecache/view.php:
+ Splitting output into chunks.
+
+ * htaccess_dist: Improved .htaccess
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Stub for experimental view caching (disabled)
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, _css/js.php: Far future expires header
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Using faster array concatination
+
+ * views/default/input/button.php: Closes #832: Internal name now handled
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: $vars is once again populated with session data
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Removed utterly pointless lines
+
+ * engine/lib/languages.php: Current language now cached per process in
+ elgg_echo.
+
+ * engine/lib/plugins.php: Minor tweaks
+
+ * engine/lib/elgglib.php: Minor tweaks
+
+ * engine/lib/languages.php: Removed directory test to languages since it's
+ probably fair to assume that this isn't going to be the case
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * simplecache/view.php: Content length on the simplecache.
+
+2009-03-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: tiny amendment to owner-block icon spacing
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/js.php: JS override.
+
+ * simplecache/view.php: Fix for previous.
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Removing the stupidly slow array_merge from lang
+ load code
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, simplecache/view.php: A quiet little CSS override update.
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Made get_library_files non-recursive and removed
+ is_dir test... makes the func <1% of total execution time
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/objects.php,
+ engine/lib/sites.php, engine/lib/users.php: Removed calls to the deprecated
+ entity cache
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/crontrigger/start.php: Suppressing output on cron trigger
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: Getting rid of needless double-trimming.
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/disableall.php,
+ actions/admin/plugins/enable.php, actions/admin/plugins/enableall.php,
+ actions/admin/plugins/reorder.php, engine/lib/elgglib.php,
+ engine/lib/plugins.php, upgrade.php: Closes #831: Plugin view location is now
+ cached in a file in dataroot and is invalidated on upgrade and plugin
+ enable/disable/reorder. This means that views no longer have to be discovered
+ on boot - reducing file IO from crazy amounts to 1. This also helps make
+ adding new plugins a linear event.
+
+2009-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * simplecache/view.php: Eliminating the content-length header
+
+2009-03-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Refs #830: Minor tweak
+
+ * engine/lib/cache.php: Cache delete now functional
+
+2009-03-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Limitless queries now supported
+
+2009-03-02 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php, mod/groups/views/default/groups/forum_latest.php:
+ Changed group forums to default to enabled.
+
+ * engine/lib/access.php: Changed the order of the access dropdown so that it
+ is in order of increasing restriction (private, friends, logged-in, public).
+
+2009-03-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ .../views/default/object/groupforumtopic.php: discussion list updated for
+ long usernames, and clearing issues fixed for pc
+
+2009-03-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Corrected unnecessarily patriotic comments.
+
+2009-03-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Removing duplicate deletion code.
+
+2009-03-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php: Minor change to previous.
+
+ * engine/lib/install.php: A different table to check db existence against.
+
+2009-03-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/object/groupforumtopic.php: small tweak to change from
+ username to name on discussion
+
+2009-03-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: mac alignment fixed on delete
+ button
+
+ * mod/groups/views/default/groups/css.php,
+ .../views/default/object/groupforumtopic.php: delete discussion button layout
+ tweaked
+
+2009-03-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bump
+
+ * engine/lib/input.php, views/default/output/longtext.php: Closes #828:
+ Quite correct - rather tired - arrays are individually trimmed - non-arrays
+ are not. Closes #714: Input filtering now triggers on a plugin hook, this
+ allows plugins to provide other filtering methods than kses (Refs #561).
+
+2009-03-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/object/groupforumtopic.php: deleting discussions added
+
+2009-03-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Closes #828: Array input values now trimmed
+ individually.
+
+2009-03-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/languages/en.php: Wire lang string tweaked
+
+2009-03-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/icon_bookmarkthis.gif, _graphics/icon_reportthis.gif: owner
+ block icons background color corrected for new theme
+
+ * .../views/default/riverdashboard/css.php: reply and delete button removed
+ on latest post on riverdashboard
+
+ * mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forum/topicposts.php,
+ .../views/default/reportedcontent/form.php,
+ views/default/comments/forms/edit.php, views/default/css.php: input/longtext
+ and remove editor link layout improved
+
+2009-02-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Closes #665: Using a bit of preg callback magic to
+ do <wbr> encoding and href encoding in one pass.
+
+ * engine/lib/languages.php: Closes #824: $language is initialised
+
+2009-02-28 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/river_widget/edit.php: activity widget default
+ tweaked
+
+ * mod/thewire/languages/en.php: the wire lang tweaked
+
+ * mod/thewire/views/default/object/thewire.php: the wire now uses name
+ rather than username
+
+2009-02-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2009022701.php: Disabling updateclient on installs as
+ part of upgrade, this is because it is no longer included and can cause
+ problems.
+
+2009-02-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/object/groupforumtopic.php: autop removed on fetching
+ group description for list view (to remove extraneous <br />)
+
+ * mod/groups/views/default/groups/forum_latest.php: clearfloat fixed
+
+ * mod/groups/views/default/groups/css.php,
+ .../views/default/object/groupforumtopic.php: groups latest discussion list
+ view timestamp moved/formatted
+
+2009-02-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php: Removed email force from notification
+ emails
+
+2009-02-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: groups widgets layout made
+ consistent
+
+2009-02-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: enable/disable mods buttons layout tweaked
+
+2009-02-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php: Corrected capitalisation, added
+ better description to 'add message' link
+
+2009-02-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/footer_back.gif, _graphics/friends_picker_arrows.gif,
+ _graphics/icons/default/topbar.png, _graphics/owner_block_back.jpg,
+ _graphics/owner_block_menu_arrow.gif, _graphics/owner_block_menu_dot.gif,
+ _graphics/page_back_linen.gif, _graphics/page_back_linen_shadow.gif,
+ _graphics/skyscraper.gif, _graphics/spotlight_back.gif,
+ _graphics/thewire_speech_bubble.gif, _graphics/toolbar_arrow.png,
+ _graphics/toolbar_arrow_ie.gif, _graphics/tools_over.png,
+ mod/groups/graphics/defaultlarge.gif, mod/groups/graphics/defaultmedium.gif,
+ mod/groups/graphics/defaultsmall.gif, mod/groups/graphics/defaulttiny.gif,
+ mod/groups/views/default/groups/css.php,
+ mod/logbrowser/views/default/logbrowser/css.php,
+ .../views/default/notifications/css.php,
+ mod/profile/graphics/defaultlarge.gif, mod/profile/graphics/defaultlarge.jpg,
+ mod/profile/graphics/defaultmaster.gif,
+ mod/profile/graphics/defaultmaster.jpg,
+ mod/profile/graphics/defaultmedium.gif,
+ mod/profile/graphics/defaultmedium.jpg,
+ mod/profile/graphics/defaultsmall.gif, mod/profile/graphics/defaultsmall.jpg,
+ mod/profile/graphics/defaulttiny.gif, mod/profile/graphics/defaulttiny.jpg,
+ mod/profile/graphics/defaulttopbar.gif,
+ mod/profile/graphics/defaulttopbar.jpg,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php,
+ mod/profile/views/default/profile/css.php,
+ .../views/default/reportedcontent/css.php,
+ .../views/default/riverdashboard/css.php,
+ mod/thewire/graphics/thewire_speech_bubble.gif,
+ mod/thewire/views/default/thewire/css.php, views/default/css.php,
+ views/default/js/friendsPickerv1.php, views/default/js/initialise_elgg.php:
+ default theme changed
+
+2009-02-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Bumped version number
+
+2009-02-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/editpost.php,
+ mod/groups/views/default/forum/topicposts.php: forum post edit bug fixed
+
+2009-02-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Deflation is now turned off by default because a version of
+ a certain majority-share browser really doesn't like it.
+
+2009-02-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins.php: buttons moved
+
+ * views/default/admin/plugins.php: class names added to enable/disable
+ buttons
+
+2009-02-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disableall.php, actions/admin/plugins/enableall.php,
+ engine/lib/plugins.php, languages/en.php, views/default/admin/plugins.php:
+ Enable all / disable all functionality added
+
+2009-02-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/widgets/thewire/view.php: set a default num of
+ wire posts to appear on a widget
+
+2009-02-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php,
+ mod/groups/actions/groupskillrequest.php, mod/groups/languages/en.php,
+ mod/groups/membershipreq.php, mod/groups/start.php,
+ .../views/default/groups/membershiprequests.php: Join request management
+ added.
+
+2009-02-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/forms/guidtool/export.php,
+ mod/profile/views/default/profile/icon.php, views/default/input/access.php,
+ views/default/input/button.php, views/default/input/checkboxes.php,
+ views/default/input/email.php, views/default/input/hidden.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/plaintext.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/output/calendar.php, views/default/output/confirmlink.php,
+ views/default/output/email.php, views/default/output/pulldown.php,
+ views/default/output/tagcloud.php, views/default/output/tags.php,
+ views/default/output/text.php, views/default/output/url.php,
+ views/failsafe/input/button.php, views/failsafe/input/checkboxes.php,
+ views/failsafe/input/hidden.php, views/failsafe/input/text.php,
+ views/failsafe/messages/exceptions/exception.php: Closes #651: I agree,
+ changed to convert both quotes.
+
+2009-02-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Added 'accept' to the language list
+
+2009-02-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topicposts.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/riverdashboard/sitemessage.php, views/default/css.php,
+ views/default/js/initialise_elgg.php: generic reusable collapsible div added
+ (replacing manifest_file which is solely for admin plugins page)
+
+2009-02-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/jsfuncs.php,
+ .../notifications/subscriptions/personal.php: Fixed checkboxes on the
+ notification screen.
+
+ * views/default/admin/plugins_opt/plugin.php: Plugin descriptions are now
+ displayed on the tool menu, for better ease of use.
+
+2009-02-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, languages/en.php: Redirect to tools on first admin
+ login.
+
+2009-02-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/newestmembers.php: members box fixed for
+ IE6&7
+
+ * mod/thewire/views/default/object/thewire.php: thewire user icon layout
+ fixed for IE / cross-browser consistency
+
+2009-02-26 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/uservalidationbyemail/start.php: Event functions should return true to
+ prevent an event from being halted. Now this one does.
+
+2009-02-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/members.php,
+ .../views/default/object/groupforumtopic.php,
+ views/default/canvas/layouts/sidebar_boxes.php: markup fixing / cleanup / ie6
+ fixes
+
+2009-02-26 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/widgets.php: Fixes to container
+ permissions and widgets to allow default widgets to work with the Elgg
+ permissions system.
+
+2009-02-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: The search endpoint can now be told to go fetch a users'
+ friends.
+
+2009-02-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php:
+ enable/disable plugin actions now support arrays as parameters
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/join.php,
+ mod/groups/actions/joinrequest.php: Closes #801, Refs #277: Group
+ join/request logic altered.
+
+2009-02-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/thewire/profile_status.php: broken wire link fixed
+
+2009-02-26 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topicposts.php: Gave each edit box a unique
+ ID
+
+2009-02-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Small access tweak for sending notifications.
+
+ * mod/groups/start.php: Fixed duplicate notifications.
+
+ * mod/groups/start.php: Fixed the first-post forum topic notification error.
+ Fixes #816
+
+2009-02-26 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Added "enemies" code to get_access_sql_suffix. This
+ implements two features: a. a user can prevent another user from seeing any
+ of his content and b. a user can filter out all the content created by
+ another user. There is no interface for this yet, but adding one should be
+ easy with this core support.
+
+2009-02-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/object/thewire.php,
+ views/default/navigation/pagination.php: markup fixed for cross-browser
+ rendering consistency
+
+2009-02-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php: Fixed pagination when filtering.
+
+2009-02-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php: Closes #822: Action file existed however the action
+ was not registered (previously called directly)
+
+ * account/forgotten_password.php, account/register.php,
+ dashboard/latest.php, engine/lib/elgglib.php, entities/list.php,
+ friends/add.php, friends/collections.php, friends/edit.php,
+ friends/index.php, friends/of.php, index.php, install.php,
+ mod/notifications/groups.php, mod/notifications/index.php,
+ mod/reportedcontent/add.php, mod/riverdashboard/index.php: Closes #807:
+ Removed echo on page_draw()
+
+2009-02-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/views/default/groups/find.php:
+ Corrected bad form action for group tag and made search label a little more
+ specific.
+
+2009-02-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Refs #808: Bug was actually fixed by not using
+ empty... register_translations has to be in the wild otherwise install won't
+ load translation.
+
+ * engine/lib/languages.php: Closes #808: Removed register_translation from
+ the wild, now called on boot so that it is always after configuration_init
+
+2009-02-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/longtext.php: output/longtext now parses URLs.
+
+2009-02-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: small lang tweak
+
+2009-02-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/js.php: Fixed river pagination issue
+
+2009-02-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/languages/en.php: lang file replaced
+
+ * mod/riverdashboard/languages/en.php: missing lang string
+
+2009-02-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Architectural version number change
+
+2009-02-25 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/elgglib.php, languages/en.php: Added
+ friends access level
+
+ * actions/admin/site/update_basic.php, engine/lib/access.php,
+ engine/lib/users.php, languages/en.php, views/default/settings/system.php:
+ Introduces user default access.
+
+2009-02-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Closes #800: Fixes typo
+
+2009-02-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/forminternals.php,
+ views/default/friends/picker.php: Unicode character fix for friends picker.
+ Fixes #281
+
+ * mod/thewire/languages/en.php: SPG fix
+
+ * .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/groupsform.php,
+ .../notifications/subscriptions/personal.php: Removing the jumps on the
+ notification pickers.
+
+ * mod/groups/start.php: Removing the membership requests link for now.
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php,
+ mod/groups/views/default/groups/groupprofile.php: Removing an infinite loop
+ in groups.
+
+ * mod/groups/views/default/forms/groups/invite.php: The group invite friends
+ picker now correctly highlights friends' tabs
+
+ * engine/lib/metadata.php: Syntax improvements for the get_metadata
+ functions
+
+ * engine/lib/relationships.php: Fix for previous, including a change to
+ check_entity_relationships that actually returns the relationship object.
+
+ * engine/lib/relationships.php: Introducing the 'delete relationship' event.
+ Fixes #779
+
+ * mod/groups/languages/en.php: Defining grouptopic:blank; fixes #809
+
+ * engine/lib/notification.php: Notifications with nonexistent handlers no
+ longer throw an exception; they now write to the error log. Refs #754
+
+ * engine/lib/sessions.php: The session initialisation order is slightly
+ altered to allow for language setup on the index page. Fixes #803
+
+ * mod/groups/start.php: Group topics now have a friendlier URL. This will
+ help a lot for notifications.
+
+ * engine/lib/notification.php: Fixed error in notification procedure
+
+ * .../graphics/icon_notifications_web.gif: Removing web notification
+ graphic; will sit elsewhere.
+
+2009-02-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../graphics/icon_notifications_web.gif: web notification icon added
+
+2009-02-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/find.php: all groups search form
+
+2009-02-24 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/user/requestnewpassword.php,
+ mod/uservalidationbyemail/languages/en.php: Attempts by unvalidated users to
+ login or request new passwords now trigger plugin hooks (if available) or
+ trigger the user validation event by default. Thus, in the default case, the
+ user will be remailed a validation link. Addresses part of
+ http://trac.elgg.org/elgg/ticket/759 .
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icondirect.php: Removing a minor simplecache debug message
+ that accidentally made it in.
+
+ * mod/profile/icon.php, mod/profile/icondirect.php: Default icons are
+ preserved.
+
+2009-02-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/settings/riverdashboard/edit.php: you can now replace the
+ default dashboard with the new activity river, if required.
+
+2009-02-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/search/startblurb.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php: search results formatted
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, _css/js.php, upgrade.php: CSS, JS, upgrade are marked as
+ external pages.
+
+2009-02-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/groupprofile.php: groups:notfound:details
+ text string formatted
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/discussions.php, mod/groups/forum.php,
+ mod/groups/membership.php, mod/groups/topicposts.php: Group gatekeeper on
+ internal group pages.
+
+ * engine/lib/xml-rpc.php: Minor variable fix. Fixes #811
+
+2009-02-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/delete.php: when deleting a group you now go back to
+ your groups
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: A further architecture update version increment.
+
+2009-02-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/invite.php: invite friends to group
+ page modified
+
+2009-02-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/widgets.php: Added fixes to
+ create_entity and add_widgets to correctly handle containers.
+
+2009-02-24 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/thewire/profile_status.php: profile update wire tweaked
+
+2009-02-24 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, engine/lib/elgglib.php,
+ mod/profile/icondirect.php: Made icon views work properly for non-default
+ icons, and introduced elgg_view_enable_simplecache and
+ elgg_view_disable_simplecache functions.
+
+2009-02-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/thewire/profile_status.php: profile status update link
+ formatted
+
+2009-02-23 kevinjardine <kevinjardine@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, engine/lib/configuration.php,
+ languages/en.php, mod/profile/icondirect.php, simplecache/view.php,
+ views/default/settings/system.php: Added the ability to turn simplecache on
+ and off.
+
+2009-02-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/thewire/forms/add.php: post to wire from thewire
+ page styled
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: You should no longer get notified of your own topic
+ posts.
+
+ * engine/lib/elgglib.php: ACCESS_DEFAULT is now defined.
+
+2009-02-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/views/default/thewire/forms/add.php: a tweak to the wire
+
+ * mod/thewire/actions/add.php, mod/thewire/everyone.php,
+ mod/thewire/index.php, mod/thewire/languages/en.php, mod/thewire/start.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ .../views/default/thewire/profile_status.php: new wire work
+
+2009-02-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/profileitems.php: right_column changed from
+ class to id to match left_column
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php, mod/groups/views/rss/groups/profileitems.php:
+ Group RSS feed.
+
+ * mod/groups/views/rss/forum/topics.php: RSS fix for groups.
+
+ * engine/handlers/pagehandler.php: Removing the external definition from the
+ page handler again.
+
+ * engine/lib/annotations.php, mod/groups/start.php,
+ mod/groups/topicposts.php, mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/rss/forum/topicposts.php,
+ mod/groups/views/rss/forum/viewposts.php, views/rss/object/default.php: RSS
+ for group topics, including fixes for annotation getURL() override
+
+2009-02-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/page_elements/elgg_topbar.php: top toolbar menu id changed to
+ class. messages div slide action in some browsers removed.
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/pagehandler.php: Further external marker on the
+ pagehandler for walledgarden
+
+2009-02-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/editpost.php, mod/groups/start.php,
+ mod/groups/views/default/forum/topicposts.php: new group edit options on
+ discussion
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/xml-rpc_handler.php, index.php: Hook for better walled garden
+
+2009-02-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/editpost.php,
+ mod/groups/views/default/forum/topicposts.php: a couple more group comment
+ edit tweaks
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topicposts.php: Translating untranslated
+ string
+
+2009-02-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/editpost.php,
+ mod/groups/views/default/forum/topicposts.php: small edit comment bug fixed
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Slight version change to represent architectural changes.
+
+2009-02-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topics.php,
+ .../views/default/object/groupforumtopic.php: groups interface details
+ cleanup
+
+2009-02-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, mod/groups/groupprofile.php: Introducing
+ group_gatekeeper()
+
+ * mod/thewire/languages/en.php: New post wire string
+
+ * views/failsafe/input/access.php: Introducing the access control to the
+ failsafe view.
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/access.php, engine/lib/widgets.php, languages/en.php,
+ mod/profile/actions/edit.php, mod/profile/views/default/profile/edit.php,
+ views/default/input/access.php, views/default/settings/system.php,
+ views/failsafe/settings/system.php: Added site default access permissions.
+ Refs #744
+
+2009-02-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topicposts.php: superfluous <p> tags
+ removed
+
+2009-02-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: missing lang tweak
+
+ * mod/groups/views/default/forum/topics.php: new group discussion layout
+ tweaked to actually work
+
+ * mod/groups/actions/forums/addtopic.php, mod/groups/languages/en.php,
+ .../views/default/river/forum/topic/create.php: topic starting included in
+ river
+
+2009-02-22 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/forum.php, mod/groups/languages/en.php,
+ .../views/default/object/groupforumtopic.php: new group discussion layout
+
+ * mod/groups/languages/en.php: tweaks to the group discussion lang
+
+ * mod/groups/forum.php: group forum posts are now displayed based on last
+ action
+
+ * mod/groups/actions/forums/deletepost.php,
+ mod/groups/actions/forums/editpost.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/views/default/forum/topicposts.php: users
+ can now edit and delete their forum comments
+
+ * mod/groups/actions/join.php, mod/groups/languages/en.php,
+ mod/groups/views/default/river/group/create.php: new join group river view
+ added
+
+ * mod/groups/actions/forums/addpost.php,
+ mod/groups/views/default/river/forum/create.php: new river view added for
+ group forum posts
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php,
+ .../views/default/riverdashboard/container.php,
+ .../views/default/riverdashboard/js.php,
+ .../views/default/riverdashboard/nav.php: Riverdashboard now loads tabs via
+ jQuery AJAX.
+
+ * .../notifications/subscriptions/forminternals.php,
+ views/default/friends/forms/edit.php, views/default/friends/picker.php: The
+ friends picker now highlights tabs when creating a collection if a user is
+ present there. Also, the separate friends picker in the notification plugin
+ is also now internationalised.
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/a_users_groups/view.php: groups widget class
+ added
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Correction for previous.
+
+ * mod/groups/start.php: Forum topic notifications fix.
+
+ * engine/lib/notification.php: Notification messages can be suppressed
+ programmatically.
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/a_users_groups/view.php: group widget tweaked
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fixes an annoying problem in countAnnotations.
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php: group email tweak to
+ include lang
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/defaultprofile.php: custom profile fields admin panel
+ formatted
+
+ * .../views/default/thewire/profile_status.php: brackets added around
+ timestamp
+
+2009-02-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: isFriend() now retrieving userid correctly
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/thewire/profile_status.php: profile status view tweaked
+
+2009-02-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php: Closes #784: Action now checks that the
+ user is the logged in user's friend before invite.
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/usersettings/plugins_opt/plugin.php: configure tools page -
+ individual tools formatted
+
+ * .../views/default/widgets/river_widget/view.php: activity widget interface
+
+ * views/default/spotlight/default.php: formatted spotlight footer
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/listing.php: status moved on member
+ listings
+
+2009-02-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/membershipreq.php,
+ mod/groups/start.php: Placeholder for future work (refs #277)
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php: tweak to the add to wire action to make sure
+ forward takes the user to the correct place
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/grouplisting.php: group details
+ containerised
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Removing unnecessary mod_rewrite rule
+
+ * languages/en.php, views/default/friends/picker.php: The friends picker can
+ now be internationalized, also allows you to view users whose usernames don't
+ begin with a letter in the char array.
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/river_widget/edit.php: riverdash activity widget
+ edit panel formatted
+
+ * mod/thewire/views/default/widgets/thewire/view.php: empty <p> tags causing
+ issues removed
+
+ * mod/groups/views/default/forms/groups/edit.php: button floated and cleared
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/spotlight/default.php: Went in to decapitalise "intranet",
+ ended up making the text hopefully more immediate.
+
+2009-02-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/edit.php: delete group button moved
+ into own area
+
+ * mod/groups/views/default/forms/forums/addtopic.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/side_menu.php: group areas interfacing
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/plugins.php, admin/site.php, admin/statistics.php, admin/user.php,
+ views/default/page_elements/owner_block.php: Removed unnecessary owner
+ blocks.
+
+2009-02-20 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/spotlight/default.php: new spotlight contents
+
+2009-02-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/messages/exceptions/exception.php: Minor improvement to
+ exception message
+
+ * views/default/messages/exceptions/exception.php: Minor improvement to
+ exception message
+
+ * engine/lib/elgglib.php, views/default/messages/exceptions/exception.php:
+ Closes #487: Removed superfluous page_draw from exception view.
+
+2009-02-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, engine/lib/river2.php: Added some documentation to
+ the river functions.
+
+2009-02-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apiadmin/manifest.xml, mod/crontrigger/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/garbagecollector/manifest.xml,
+ mod/groups/manifest.xml, mod/guidtool/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/notifications/manifest.xml, mod/profile/manifest.xml,
+ mod/reportedcontent/manifest.xml, mod/thewire/manifest.xml,
+ mod/uservalidationbyemail/manifest.xml: Updated core module manifests to
+ contain today's build number. Refs #394
+
+ * mod/riverdashboard/manifest.xml: Closes #795: Added manifest to
+ riverdashboard
+
+ * mod/groups/languages/en.php: Closes #798: Fixing language definition which
+ somehow got clobbered. Nice spot!
+
+ * engine/lib/entities.php: Fixes warning messages on disable or delete for
+ times when an entity has no sub items.
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river2.php, .../views/default/widgets/river_widget/view.php,
+ views/default/river/item/list.php: Pagination is now optional on river lists;
+ is removed on the river widget
+
+ * engine/lib/river2.php: Friends river no longer shows your own stuff.
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/edit.php: missing wrapper added
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/forum.php: Added a title to group forum topics. Fixes #603
+
+ * mod/groups/membership.php: For now, the group membership page is
+ protected, although eventually this should get its own profile dropdown menu.
+ Fixes #605
+
+2009-02-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/profileitems.php: groups interface updated
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: An alternative template handler will now be sought
+ by elgg_view by default. Fixes #768
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/find.php,
+ mod/groups/views/default/groups/side_menu.php: all groups submenu tweaked
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php: A lighter way to detect if the db has been
+ installed. Fixes #791
+
+2009-02-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/featured.php: featured groups sidebar styled
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixed parameter errors in site-related functions.
+ Fixes #793
+
+ * mod/profile/icondirect.php: Better unicode patching for icons. Fixes #789
+
+2009-02-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Updated version number to today's build
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php: small tweak to popular groups
+
+ * mod/groups/all.php: it is now possible to list groups by most popular
+
+ * views/default/page_elements/header.php,
+ views/default/page_elements/header_contents.php,
+ views/default/pageshells/pageshell.php: the header has been split out so that
+ theme authors can target the header output without worrying about overwriting
+ the whole header file.
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Introduced get / list entities by
+ relationship count
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/thewire/actions/add.php, mod/thewire/actions/delete.php,
+ mod/thewire/add.php, mod/thewire/everyone.php,
+ mod/thewire/graphics/thewire_speech_bubble.gif, mod/thewire/index.php,
+ mod/thewire/languages/en.php, mod/thewire/manifest.xml,
+ mod/thewire/readme.txt, mod/thewire/start.php,
+ mod/thewire/views/default/object/thewire.php,
+ .../views/default/river/object/thewire/create.php,
+ .../views/default/thewire/activity_view.php,
+ mod/thewire/views/default/thewire/css.php,
+ mod/thewire/views/default/thewire/forms/add.php,
+ mod/thewire/views/default/thewire/notfound.php,
+ .../views/default/thewire/profile_status.php,
+ .../views/default/thewire/scripts/counter.js,
+ mod/thewire/views/default/thewire/view.php,
+ mod/thewire/views/default/widgets/thewire/edit.php,
+ mod/thewire/views/default/widgets/thewire/view.php: the wire has been moved
+ to core as it now powers profile status and status on member search
+
+ * mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php, mod/activity/manifest.xml,
+ mod/activity/opendd.php, mod/activity/start.php,
+ mod/activity/views/default/activity/css.php,
+ mod/activity/views/default/activity/dashboard.php,
+ mod/activity/views/default/activity/offset.php,
+ mod/activity/views/default/activity/wrapper.php,
+ .../views/default/settings/activity/edit.php,
+ mod/activity/views/opendd/activity/dashboard.php, mod/river/languages/en.php,
+ mod/river/manifest.xml, mod/river/start.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/edit.php,
+ .../default/widgets/river_widget_friends/view.php: old activity and river
+ removed
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist, .../views/default/apiadmin/forms/add_key.php,
+ mod/apiadmin/views/default/object/api_key.php,
+ .../views/default/diagnostics/forms/download.php,
+ mod/groups/actions/join.php, mod/profile/defaultprofile.php,
+ .../views/default/profile/editdefaultprofile.php,
+ .../views/default/profile/menu/adminlinks.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/object/default.php: Repointed actions/ to action/ in all views
+ and removed actions/* from the action handler.
+
+2009-02-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php: Removed some bad links on
+ actions
+
+ * engine/lib/languages.php: Fixed strange infinite loop on language loading.
+
+ * engine/lib/languages.php: Removed @ from register translation include_once
+
+ * engine/lib/plugins.php, languages/en.php,
+ views/default/admin/plugins_opt/plugin.php: Closes #394: May now specify
+ elgg_version in the manifest to specify a minimum version of elgg required.
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/canvas_header/submenu_template.php:
+ delete confirmation added to delete pages
+
+ * .../views/default/riverdashboard/sitemessage.php: input view changed on
+ site messages
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/edit.php: warning applied to group
+ deletion
+
+ * mod/groups/edit.php: title tweaked
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fix for user object counting with upper and lower
+ time limits.
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: missing lang file
+
+ * views/default/page_elements/owner_block.php: ownerblock tweak
+
+2009-02-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/users.php, languages/en.php:
+ Introducing archive functionality.
+
+2009-02-19 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/river/sitemessage/create.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php: new river widget
+
+2009-02-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_toolbar_logo.gif: updated elgg toolbar logo
+
+2009-02-18 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/featured.php: missing id applied
+
+ * mod/groups/actions/featured.php, mod/groups/all.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/grouplisting.php: admins can highlight
+ featured groups
+
+2009-02-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/find.php: sidebar forms styled
+
+2009-02-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/start.php: Closes #790: Removed @ before
+ include statements.
+
+2009-02-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/item/list.php: forward and back text added
+
+ * mod/profile/defaultprofile.php: reset button wrapped
+
+ * .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ views/default/river/item/list.php: pagination on river fixed / styled, and
+ site message styled
+
+2009-02-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Helping plugin developers by no longer suppressing
+ parsing errors in plugins.
+
+2009-02-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/start.php: Fix for previous
+
+ * mod/riverdashboard/start.php: Riverdashboard registers an init event
+ handler now .....
+
+2009-02-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php, mod/groups/views/default/groups/find.php: style
+ applied
+
+2009-02-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/all.php, mod/groups/views/default/groups/side_menu.php: more
+ more all groups tweak
+
+ * mod/groups/all.php, mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/groups/featured.php,
+ mod/groups/views/default/groups/find.php,
+ .../views/default/groups/group_sort_menu.php,
+ mod/groups/views/default/groups/grouplisting.php: new all groups view
+
+ * mod/profile/views/default/profile/userdetails.php: bug fixed in profile
+ status
+
+ * views/default/river/item/wrapper.php: river view altered
+
+2009-02-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/widgets/wrapper.php: Closes #763: A
+ message is now displayed for widgets belonging to disabled plugins explaining
+ what has happened.
+
+2009-02-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/css.php: css added to sep file
+
+2009-02-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/riverdashboard/welcome.php: welcome message tweaked
+
+ * mod/riverdashboard/actions/add.php, mod/riverdashboard/actions/delete.php,
+ mod/riverdashboard/languages/en.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/sitemessage.php: simple site message added
+
+ * mod/groups/views/default/groups/profileitems.php: removed a redundant view
+
+2009-02-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php, mod/groups/languages/en.php,
+ .../views/default/groups/closedmembership.php: Closes #786: Only basic
+ profile information provided to non-joined users of closed groups.
+
+2009-02-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/listing.php: entity passed to status
+ view
+
+2009-02-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/css.php,
+ .../views/default/riverdashboard/nav.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php, views/default/css.php,
+ views/default/friends/collectiontabs.php: interface updated, markup tweaked
+ etc
+
+2009-02-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/listing.php: new status view created
+ that can be extended
+
+2009-02-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/start.php: Added some very basic page load
+ profiling.
+
+ * engine/lib/elgglib.php: Closes #785: datalists now pulls all settings on
+ first item load.
+
+ * engine/start.php: Closes #783: Initial cache write on start now checks
+ whether elgg has been fully installed before proceeding.
+
+2009-02-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: new view added to allow
+ status plugins to extend and display as part of the profile block
+
+2009-02-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icondirect.php: Icondirect now falls back on the cached
+ default view
+
+ * mod/profile/start.php: Icon default views are now registered as cached
+
+ * views/default/input/plaintext.php: Introducing input/plaintext.
+
+2009-02-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/viewtype.php: loose page elements wrapped in
+ container div
+
+2009-02-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/start.php, upgrade.php: A little more
+ flexibility for the simplecache.
+
+2009-02-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Short circuit get entity on impossible values,
+ saving two db queries per page
+
+2009-02-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, _css/js.php, engine/lib/elgglib.php, engine/start.php,
+ simplecache/view.php, views/default/page_elements/header.php: Views
+ simplecache improvements.
+
+2009-02-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/footer.php: another view added for analytics
+ which plugins can extend
+
+ * views/default/page_elements/footer.php: footer links replaced by a view
+ which plugins can extend
+
+2009-02-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Removed select_default_memcache as this was not
+ used.
+
+ * engine/lib/languages.php, engine/lib/sessions.php, engine/start.php,
+ version.php: Closes #429: Language loading now no longer loads all possible
+ translations - only english + user's preferred language/site preference
+
+2009-02-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/usersettings.php, languages/en.php,
+ mod/profile/views/default/profile/userdetails.php,
+ views/default/friends/collections.php, views/default/friends/forms/edit.php,
+ views/default/friends/tablelist.php: theme updates
+
+2009-02-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/reorder.php: Simplecache improvements.
+
+ * _css/css.php, _css/js.php, engine/lib/elgglib.php, engine/start.php,
+ mod/profile/start.php, mod/profile/views/default/profile/metatags.php,
+ simplecache/view.php, upgrade.php, views/default/page_elements/header.php:
+ Committing the simplecache for views.
+
+2009-02-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collections.php: removed broken expand all link and
+ js
+
+2009-02-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/admin/plugins_opt/plugin.php: Closes #777:
+ Plugin version now displayed under "more info" link in plugin admin settings.
+
+2009-02-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: latest activity link removed as it will be
+ replaced by a full activity stream
+
+ * views/default/admin/statistics.php: removed redundant stats info
+
+2009-02-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/usersettings/form.php: user settings style brought in line
+ with other settings pages
+
+2009-02-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/forum_latest.php: removed the dropdown
+ menu from forum latest view on group profiles
+
+ * mod/groups/start.php: allow users to put a widget of their groups on their
+ dashboard as well as profile.
+
+ * mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/profileitems.php: group homepage forum view
+ tweaked
+
+2009-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Fixes #778. Thanks!
+
+2009-02-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/apiadmin/forms/add_key.php,
+ mod/apiadmin/views/default/object/api_key.php, mod/diagnostics/index.php,
+ .../views/default/diagnostics/forms/download.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/groupsform.php,
+ mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ views/default/admin/plugins.php, views/default/admin/site.php,
+ views/default/admin/statistics.php, views/default/admin/user.php,
+ views/default/usersettings/form.php, views/default/usersettings/plugins.php:
+ css classname cleanup, prep for v1.5 default theme
+
+2009-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river2.php, views/default/river/item/list.php: Simple river
+ pagination.
+
+2009-02-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php,
+ .../views/default/riverdashboard/newestmembers.php,
+ .../views/default/riverdashboard/sitemessage.php,
+ .../views/default/riverdashboard/welcome.php: new views for riverdashboard
+
+2009-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php, views/default/css.php,
+ views/default/js/initialise_elgg.php: Moved plugin settings so they're more
+ obvious.
+
+2009-02-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Fixed logic bug in login()
+
+ * engine/schema/upgrades/2009021301.sql, mod/groups/actions/edit.php,
+ mod/groups/languages/en.php, mod/groups/views/default/forms/groups/edit.php,
+ version.php: Closes #761, #718: Group permissions now made much much simpler.
+
+2009-02-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/comments/add.php, views/default/annotation/annotate.php: new
+ annotations activity view
+
+2009-02-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/edit.php,
+ .../views/default/forms/guidtool/format.php,
+ .../views/default/forms/guidtool/import.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/comments/forms/edit.php, views/default/export/entity.php: loose
+ text strings cleaned up, extra container divs added
+
+2009-02-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/index.php: changed the activity view
+
+2009-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/riverdashboard/languages/en.php,
+ .../views/default/riverdashboard/nav.php: Language updates to river dashboard
+
+ * mod/riverdashboard/index.php, .../views/default/riverdashboard/nav.php:
+ Added better content filtering for dashboard
+
+ * mod/riverdashboard/index.php, mod/riverdashboard/start.php,
+ .../views/default/riverdashboard/nav.php: New river dashboard.
+
+ * engine/lib/river2.php: Removing an erroneous system_message call.
+
+ * engine/lib/river2.php: Data sanitisation fix.
+
+2009-02-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/sidebar_boxes.php, views/default/css.php: new
+ layout canvas
+
+2009-02-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Added lazy database connections to delay
+ establishing the db link until actually required - will allow for future
+ lite/static content endpoints that bypass db connections and session
+ creation.
+
+ * engine/lib/elgglib.php: Closes #769: Added short circuit to quit function
+ if entity is null.
+
+ * engine/lib/elgglib.php: Closes #772: $value no longer being incorrectly
+ set when memcache is enabled.
+
+2009-02-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: A correction to the way attributes are set for
+ extenders.
+
+ * languages/en.php: New base translation word: publish
+
+ * engine/schema/mysql.sql: Schema fix
+
+ * engine/lib/entities.php: Clear river items on entity delete
+
+ * engine/lib/river2.php: A minor stabilisation change for river2
+
+ * engine/lib/river2.php: A minor stabilisation change for river2
+
+2009-02-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/kses/kses.php: Refs #561: Removed &amp encoding from kses but
+ retaining script input and entities.
+
+2009-02-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river2.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2009021201.sql, version.php,
+ views/default/river/item/list.php, views/default/river/item/wrapper.php:
+ Alternative river system trial. This is a test.
+
+2009-02-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Avoiding wsod for deleted users
+
+2009-02-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/views/default/activity/offset.php: div cleared after
+ pagination for theme compatability
+
+2009-02-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/activity.php:
+
+ * mod/groups/languages/en.php: Added some missing translations
+
+ * crontab.example: Added links to better documentation
+
+ * engine/lib/input.php: Closes #684: Scratching a particular itch of mine by
+ no longer hiding urls when converting them to active links. This issue has
+ caused many a headache. The url is now preserved but with a <wbr /> inserted
+ after every /, this lets long urls be wrapped without breaking the url.
+
+2009-02-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Removing wildcard from the beginning of 'like'
+ search for user/username
+
+2009-02-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/activity.php: Filtering on type,subtype and event
+
+ * engine/lib/activity.php, engine/lib/river.php, mod/activity/start.php:
+ Relocation of activity database queries to the core.
+
+2009-02-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/plugins.php, admin/plugins/index.php, admin/site.php,
+ admin/site/index.php, admin/statistics.php, admin/statistics/index.php,
+ admin/user.php, admin/user/index.php, engine/lib/admin.php: Cleaned up the
+ admin directory using a pagehandler.
+
+ * languages/en.php, settings/plugins.php: Minor confusion clearups
+
+ * views/default/output/calendar.php, views/default/output/confirmlink.php,
+ views/default/output/email.php, views/default/output/longtext.php,
+ views/default/output/pulldown.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php: Closes #756: htmlentities on all output forms
+
+ * mod/profile/views/default/profile/userdetails.php: XSS filtering on output
+
+ * engine/lib/input.php: Refs #561: Split filtering into separate function
+
+2009-02-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icondirect.php, mod/profile/start.php: Speedy icon bypass.
+
+2009-02-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/views/default/activity/dashboard.php: add a view to site wide
+ activity that can be extended by the wire
+
+2009-02-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Further changes to the notification
+ mechanism.
+
+2009-02-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Closes #757: Removed strtolower as it is not UTF8
+ safe. See http://www.phpwact.org/php/i18n/utf-8 for further discussion.
+
+ * views/default/input/access.php, views/default/input/email.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/pulldown.php: Refs
+ #756: htmlentities on all input views
+
+ * mod/activity/all.php, mod/activity/index.php: Marcus Povey
+ <marcus@elgg.com> * Pagination not displayed when no activity present *
+ OpenDD link for your activity now functioning
+
+2009-02-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/collections.php: Fixed 'all friends'
+ button.
+
+2009-02-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/edit_layout.php: new edit canvas layout
+
+2009-02-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php, mod/groups/views/default/forms/groups/edit.php:
+ Closes #752: Delete move to edit, making it less fatal. Probably needs
+ skinning.
+
+2009-02-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/notification.php,
+ mod/groups/start.php: A single notification is now sent out on forum topic
+ creation. This also contains an update to $entity->countAnnotations, which
+ no longer requires you to specify the annotation type.
+
+ * engine/lib/notification.php: Notification fix: you no longer get
+ notifications on your own content.
+
+ * mod/groups/languages/en.php, mod/groups/start.php: Introducing group forum
+ notifications
+
+2009-02-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #640: Entity disable now recursive
+
+ * mod/groups/actions/delete.php, mod/groups/languages/en.php,
+ mod/groups/start.php: Closes #282, Refs #640: Group deletion enabled. TODO:
+ Suggested enhancement #752
+
+2009-02-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Added the 'annotate' event on entities.
+
+ * .../notifications/subscriptions/collections.php: Minor display fix.
+
+ * mod/notifications/actions/save.php: Group notification settings now save
+ properly
+
+ * engine/lib/relationships.php: Added a new filter to delete relationship
+ functions
+
+2009-02-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #640, #282: Recursive deletion of owned and
+ contained entities.
+
+ * .../views/default/profile/menu/adminlinks.php: Closes #223: Admin options
+ now use output/confirmlink
+
+ * mod/guidtool/actions/delete.php, mod/guidtool/languages/en.php,
+ mod/guidtool/start.php, mod/guidtool/views/default/guidtool/listing.php: Refs
+ #492: Export and delete links next to entity
+
+2009-02-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Extra security for object notifications.
+
+ * mod/notifications/actions/groupsave.php,
+ mod/notifications/actions/save.php, mod/notifications/groups.php,
+ mod/notifications/languages/en.php, mod/notifications/start.php,
+ .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/groupsform.php: Group notifications, all
+ friends notification option
+
+2009-02-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Couple of extra words
+
+ * languages/en.php, views/default/output/confirmlink.php: Added default to
+ confirm link.
+
+2009-02-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/views/default/activity/css.php,
+ mod/activity/views/default/activity/offset.php: pagination on activity stream
+ added
+
+2009-02-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Closes #584: Removed exception, get_user will now
+ return false if GUID exists but is not a user. This probably makes more sense
+ as Exceptions should probably be reserved for major Ooopses. The error in
+ this bug was caused by this exception being thrown and not caught in the
+ access group handler. This may have been the cause of a number of group
+ related / permission related errors.
+
+ * engine/lib/users.php: Refs #584: Fixed error message.
+
+ * engine/lib/entities.php: Closes #720: setCalendarTimeAndDuration() now
+ saves end time correctly.
+
+2009-02-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/members.php: drop down menu removed from
+ members avatars on the group home page. You can change this back by removing
+ 'override' => 'true'
+
+ * mod/groups/languages/en.php,
+ .../views/default/river/object/group/create.php,
+ .../river/object/groupforumtopic/annotate.php,
+ .../river/object/groupforumtopic/create.php,
+ .../river/object/groupforumtopic/update.php,
+ .../default/river/relationship/member/create.php: new river views added to
+ groups
+
+ * mod/activity/views/default/activity/css.php,
+ .../river/user/default/profileiconupdate.php: profile icon added to change
+ river view and css added to activity
+
+ * mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php,
+ mod/activity/views/default/activity/offset.php: small additions to the
+ activity view
+
+ * mod/notifications/manifest.xml: manifest file added to notifications
+
+2009-02-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/languages/en.php,
+ .../notifications/subscriptions/collections.php: Language and UI changes for
+ the notifications plugin.
+
+2009-02-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/notifications/css.php: styles for notifications
+
+2009-02-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../notifications/subscriptions/collections.php: Javascript just about
+ beaten into submission. Viewers of the public SVN, I apologise for clogging
+ up the history view. Here's a joke by way of penance:
+
+ * mod/notifications/actions/save.php: Save action corrections
+
+ * .../notifications/subscriptions/collections.php: An attempt at fixing the
+ toggle issue
+
+ * .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/personal.php: Notification settings. Still
+ not right though ..
+
+ * .../notifications/subscriptions/collections.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/personal.php: More notification settings
+ work.
+
+ * .../notifications/subscriptions/collections.php: Notification icons work
+ properly when selecting / deselecting a friends collection.
+
+ * mod/notifications/languages/en.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/personal.php: Friends collections work
+
+2009-02-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/river_icons/river_icon_pages.gif,
+ _graphics/river_icons/river_icon_thewire.gif: icons for river added
+
+ * mod/activity/views/default/activity/css.php: updated activity css
+
+2009-02-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Added digits to pagehandler rewrite rule. Fixes #741
+
+ * mod/notifications/actions/save.php,
+ .../notifications/subscriptions/collections.php: Friends collections
+ preferences are saved
+
+ * mod/notifications/languages/en.php,
+ .../notifications/subscriptions/collections.php: Collections titles
+
+ * .../views/default/notifications/css.php,
+ .../notifications/subscriptions/collections.php: Access collections toggle
+ beginnings
+
+ * mod/notifications/actions/save.php, mod/notifications/languages/en.php,
+ mod/notifications/start.php, .../views/default/notifications/css.php,
+ .../notifications/settings/usersettings.php,
+ .../notifications/subscriptions/collections.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php,
+ .../notifications/subscriptions/personal.php: Further notification settings
+ changes.
+
+ * mod/notifications/actions/save.php,
+ .../graphics/icon_notifications_email.gif,
+ mod/notifications/languages/en.php, mod/notifications/start.php,
+ .../views/default/notifications/css.php,
+ .../default/notifications/subscriptions/form.php,
+ .../notifications/subscriptions/forminternals.php: Fitter, happier, more
+ productive notifications plugin.
+
+ * engine/lib/notification.php: Belts and braces with notifications
+
+ * engine/lib/access.php: Minor change to access SQL. Fixes #687
+
+ * htaccess_dist: Further htaccess change
+
+ * htaccess_dist: htaccess update
+
+ * mod/profile/start.php: Added profile updates to the notification handler
+
+2009-02-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/json/api/output.php: API results now JSON export properly. Refs #716
+
+ * views/json/canvas/default.php, views/json/export/entity.php,
+ views/json/export/metadata.php, views/json/export/relationship.php,
+ views/json/group/default.php, views/json/messages/exceptions/exception.php,
+ views/json/object/default.php, views/json/pageshells/pageshell.php,
+ views/json/search/entity_list.php, views/json/site/default.php,
+ views/json/user/default.php: JSON feeds now work. Fixes #716
+
+ * engine/lib/access.php, engine/lib/notification.php: Access improvements on
+ granular notifications
+
+ * languages/en.php: DB credentials are no longer unnecessarily revealed on
+ failure to connect. Fixes #723
+
+ * CONTRIBUTORS.txt: Contributors patch
+
+ * mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/languages/en.php:
+ Added plugin hook triggers to reportedcontent plugin. Fixes #725
+
+ * views/default/input/button.php: Added class to input/button. Fixes #618
+
+ * mod/groups/views/default/forum/viewposts.php: Added pagination to group
+ topic posts. Fixes #704
+
+ * entities/index.php: Added unique title tags to the entity browser. Fixes
+ #722
+
+ * CONTRIBUTORS.txt, htaccess_dist, views/default/output/tags.php: Tag URLs
+ now conform to the microformats specification. Fixes #729
+
+ * CONTRIBUTORS.txt: Minor changes to contrib file
+
+2009-02-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: tweaks to the contributors file
+
+2009-02-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/entities.php, engine/lib/group.php,
+ engine/lib/metadata.php, engine/lib/plugins.php, engine/lib/system_log.php,
+ engine/lib/tags.php, engine/lib/users.php, engine/lib/widgets.php,
+ engine/start.php, languages/en.php, mod/apiadmin/actions/generate.php,
+ mod/groups/actions/edit.php, mod/groups/views/default/forms/groups/edit.php,
+ mod/profile/actions/edit.php, mod/profile/views/default/profile/edit.php,
+ mod/reportedcontent/actions/add.php,
+ .../views/default/reportedcontent/form.php: Moves access permissions
+ references over to using the ACCESS_* constants defined in access.php. Refs
+ #687
+
+ * engine/lib/access.php, engine/lib/elgglib.php: Moved the access constant
+ definitions from access.php to elgglib.php, so they'll be loaded initially.
+
+ * engine/lib/users.php: When a new password is generated, the salt is now
+ regenerated first. Fixes #726.
+
+2009-02-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Corrected pagination limit error.
+
+ * engine/lib/elgglib.php, views/default/embed/addcontentjs.php,
+ views/default/embed/js.php: Elgg Javascript update content function
+
+2009-02-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: ticket #728 dealt with
+
+ * mod/groups/views/default/groups/members.php: changed the number of group
+ members to display on group frontpages from 9999 to 10 (This should become
+ configurable)
+
+ * engine/lib/entities.php: patch number #724 applied
+
+2009-02-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/useradd.php, languages/en.php: Users are now notified when an
+ account has been created for them on a site.
+
+2009-02-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed bug in get_entities allowing for multiple
+ subtypes.
+
+2009-02-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/forums/addtopic.php: removed redundant post
+ options
+
+2009-01-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Moving over to use file_exists to check for
+ default entity icons, which should be lighter to load and produce fewer
+ errors.
+
+2009-01-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php: Tentatively downgraded version requirement.
+
+2009-01-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: notify_user now traps exceptions and logs
+ them.
+
+2009-01-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Change to notification object registration
+ function.
+
+2009-01-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/friends/picker.php: friendspicker /
+ collections updated to work with more than 12+ friends per pane
+
+2009-01-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: tweak to banned user
+
+ * views/default/admin/statistics.php: small admin tweak
+
+2009-01-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Added container_guid to ElggEntity->save() and
+ update_entity() functions. Fixes #711
+
+ * engine/lib/elgglib.php: Moving actions into the boot event.
+
+2009-01-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Moved actions out of init files
+
+ * engine/lib/notification.php: Added object notifications plugin hook
+ override.
+
+ * engine/lib/annotations.php: Fixed pagination issue with count annotations
+ function.
+
+2009-01-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Fixes #709: get_language() now fails correctly.
+ @ben Why is this introduced? Surely this is the same as
+ get_current_language()?
+
+2009-01-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Fixing access controls on multi-metadata
+
+2009-01-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Refs #706: Copyright in readme
+
+ * views/default/admin/plugins_opt/plugin.php: Support for people who can't
+ spell
+
+ * _css/css.php, account/forgotten_password.php, account/register.php,
+ actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ actions/admin/plugins/reorder.php, actions/admin/site/update_basic.php,
+ actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ actions/admin/user/resetpassword.php, actions/admin/user/unban.php,
+ actions/comments/add.php, actions/comments/delete.php,
+ actions/email/save.php, actions/entities/delete.php, actions/friends/add.php,
+ actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/editcollection.php, actions/friends/remove.php,
+ actions/import/opendd.php, actions/login.php, actions/logout.php,
+ .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/systemsettings/install.php,
+ actions/user/language.php, actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, actions/usersettings/save.php, actions/widgets/add.php,
+ actions/widgets/reorder.php, actions/widgets/save.php, admin/index.php,
+ admin/plugins/index.php, admin/site/index.php, admin/statistics/index.php,
+ admin/user/index.php, dashboard/index.php, dashboard/latest.php,
+ engine/handlers/action_handler.php, engine/handlers/cron_handler.php,
+ engine/handlers/pagehandler.php, engine/handlers/xml-rpc_handler.php,
+ engine/lib/access.php, engine/lib/actions.php, engine/lib/admin.php,
+ engine/lib/annotations.php, engine/lib/api.php, engine/lib/cache.php,
+ engine/lib/calendar.php, engine/lib/configuration.php, engine/lib/cron.php,
+ engine/lib/database.php, engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/lib/exceptions.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/filestore.php, engine/lib/group.php, engine/lib/input.php,
+ engine/lib/install.php, engine/lib/languages.php, engine/lib/location.php,
+ engine/lib/memcache.php, engine/lib/metadata.php, engine/lib/metastrings.php,
+ engine/lib/notification.php, engine/lib/objects.php, engine/lib/opendd.php,
+ engine/lib/pagehandler.php, engine/lib/pageowner.php, engine/lib/pam.php,
+ engine/lib/ping.php, engine/lib/plugins.php, engine/lib/query.php,
+ engine/lib/relationships.php, engine/lib/river.php, engine/lib/sessions.php,
+ engine/lib/sites.php, engine/lib/social.php, engine/lib/statistics.php,
+ engine/lib/system_log.php, engine/lib/tags.php, engine/lib/users.php,
+ engine/lib/usersettings.php, engine/lib/version.php, engine/lib/widgets.php,
+ engine/lib/xml-rpc.php, engine/lib/xml.php, engine/schema/mysql.sql,
+ engine/start.php, entities/index.php, entities/list.php, friends/add.php,
+ friends/collections.php, friends/edit.php, friends/index.php, friends/of.php,
+ friends/pickercallback.php, htaccess_dist, index.php, install.php,
+ mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php, mod/activity/manifest.xml,
+ mod/activity/opendd.php, mod/activity/start.php,
+ mod/activity/views/default/activity/css.php,
+ mod/activity/views/default/activity/wrapper.php, mod/apiadmin/index.php,
+ mod/apiadmin/languages/en.php, mod/apiadmin/manifest.xml,
+ mod/apiadmin/start.php, mod/crontrigger/manifest.xml,
+ mod/crontrigger/start.php, mod/diagnostics/actions/download.php,
+ mod/diagnostics/index.php, mod/diagnostics/languages/en.php,
+ mod/diagnostics/manifest.xml, mod/diagnostics/start.php,
+ .../views/default/diagnostics/forms/download.php,
+ mod/garbagecollector/languages/en.php, mod/garbagecollector/manifest.xml,
+ mod/garbagecollector/start.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/edit.php, mod/groups/actions/forums/addpost.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletepost.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/actions/join.php,
+ mod/groups/actions/joinrequest.php, mod/groups/actions/leave.php,
+ mod/groups/addtopic.php, mod/groups/all.php, mod/groups/discussions.php,
+ mod/groups/edit.php, mod/groups/edittopic.php, mod/groups/forum.php,
+ mod/groups/graphics/icon.php, mod/groups/groupprofile.php,
+ mod/groups/index.php, mod/groups/invite.php, mod/groups/languages/en.php,
+ mod/groups/manifest.xml, mod/groups/membership.php, mod/groups/new.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/group/group.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ mod/groups/views/default/groups/members.php,
+ mod/groups/views/default/groups/profileitems.php,
+ .../views/default/object/groupforumtopic.php,
+ .../default/river/relationship/member/create.php,
+ mod/groups/views/default/sharing/invite.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php,
+ mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/profileitems.php, mod/guidtool/export.php,
+ mod/guidtool/format_picker.php, mod/guidtool/import.php,
+ mod/guidtool/index.php, mod/guidtool/languages/en.php,
+ mod/guidtool/manifest.xml, mod/guidtool/start.php, mod/guidtool/view.php,
+ .../views/default/forms/guidtool/export.php,
+ .../views/default/forms/guidtool/format.php,
+ .../views/default/forms/guidtool/import.php,
+ mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php,
+ mod/guidtool/views/default/guidtool/profile.php,
+ .../views/default/object/guidtoolwrapper.php, mod/logbrowser/index.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/manifest.xml,
+ mod/logbrowser/start.php, mod/logbrowser/views/default/object/logwrapper.php,
+ mod/logrotate/languages/en.php, mod/logrotate/manifest.xml,
+ mod/logrotate/start.php, mod/profile/actions/cropicon.php,
+ mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/edit.php, mod/profile/actions/editdefault.php,
+ mod/profile/actions/iconupload.php,
+ mod/profile/actions/resetdefaultprofile.php, mod/profile/defaultprofile.php,
+ mod/profile/edit.php, mod/profile/editicon.php, mod/profile/icon.php,
+ mod/profile/index.php, mod/profile/javascript.php, mod/profile/manifest.xml,
+ mod/profile/start.php, mod/profile/views/default/profile/edit.php,
+ .../views/default/profile/editdefaultprofile.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/submenu.php,
+ mod/profile/views/default/profile/userdetails.php,
+ mod/reportedcontent/actions/add.php, mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/index.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/manifest.xml, mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/form.php, mod/river/manifest.xml,
+ mod/river/start.php, .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/edit.php,
+ .../default/widgets/river_widget_friends/view.php,
+ .../actions/email/confirm.php, mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/manifest.xml, mod/uservalidationbyemail/start.php,
+ search/index.php, search/users.php, services/api/rest.php,
+ services/export/handler.php, settings/index.php, settings/plugins.php,
+ settings/statistics.php, settings/user.php, upgrade.php, version.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php, views/default/ajax/loader.php,
+ views/default/annotation/generic_comment.php, views/default/api/output.php,
+ views/default/basic_elements/welcome.php, views/default/canvas/default.php,
+ views/default/canvas/layouts/one_column.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ .../canvas/layouts/two_column_right_sidebar.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/comments/forms/edit.php, views/default/css.php,
+ views/default/export/entity.php, views/default/export/metadata.php,
+ views/default/export/relationship.php, views/default/friends/collection.php,
+ views/default/friends/collections.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/list.php,
+ views/default/friends/picker.php, views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php,
+ views/default/graphics/icon.php, views/default/group/default.php,
+ views/default/input/access.php, views/default/input/button.php,
+ views/default/input/calendar.php, views/default/input/checkboxes.php,
+ views/default/input/email.php, views/default/input/file.php,
+ views/default/input/form.php, views/default/input/hidden.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/reset.php, views/default/input/submit.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php, views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php,
+ views/default/navigation/pagination.php,
+ views/default/navigation/topbar_tools.php,
+ views/default/navigation/viewtype.php,
+ .../notifications/settings/usersettings.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/object/plugin.php, views/default/object/widget.php,
+ views/default/output/calendar.php, views/default/output/checkboxes.php,
+ views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/email.php, views/default/output/iframe.php,
+ views/default/output/longtext.php, views/default/output/pulldown.php,
+ views/default/output/radio.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/url.php, views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/owner_block.php,
+ views/default/page_elements/spotlight.php,
+ views/default/page_elements/title.php,
+ views/default/pageshells/pageshell.php, views/default/river/dashboard.php,
+ views/default/river/relationship/friend/create.php,
+ views/default/river/wrapper.php, views/default/search/gallery.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php,
+ views/default/settings/install.php, views/default/settings/system.php,
+ views/default/site/default.php, views/default/spotlight/default.php,
+ views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php, views/default/user/default.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/default/welcome.php, views/default/welcome/logged_in.php,
+ views/default/welcome/logged_out.php, views/default/widgets/editwrapper.php,
+ views/default/widgets/wrapper.php, views/failsafe/canvas/default.php,
+ views/failsafe/input/button.php, views/failsafe/input/checkboxes.php,
+ views/failsafe/input/form.php, views/failsafe/input/hidden.php,
+ views/failsafe/input/longtext.php, views/failsafe/input/pulldown.php,
+ views/failsafe/input/reset.php, views/failsafe/input/submit.php,
+ views/failsafe/input/text.php, views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/list.php, views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php, views/failsafe/settings/install.php,
+ views/failsafe/settings/system.php, views/foaf/canvas/default.php,
+ views/foaf/pageshells/pageshell.php, views/foaf/user/default.php,
+ views/js/object/default.php, views/js/pageshells/pageshell.php,
+ views/js/user/default.php, views/json/api/output.php,
+ views/json/canvas/default.php, views/json/export/entity.php,
+ views/json/export/metadata.php, views/json/export/relationship.php,
+ views/json/group/default.php, views/json/messages/exceptions/exception.php,
+ views/json/object/default.php, views/json/pageshells/pageshell.php,
+ views/json/search/entity_list.php, views/json/site/default.php,
+ views/json/user/default.php, views/opendd/canvas/default.php,
+ views/opendd/export/entity.php, views/opendd/export/metadata.php,
+ views/opendd/export/relationship.php, views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/site/default.php, views/opendd/user/default.php,
+ views/php/api/output.php, views/php/canvas/default.php,
+ views/php/export/entity.php, views/php/export/metadata.php,
+ views/php/export/relationship.php, views/php/group/default.php,
+ views/php/messages/exceptions/exception.php, views/php/object/default.php,
+ views/php/pageshells/pageshell.php, views/php/search/entity_list.php,
+ views/php/site/default.php, views/php/user/default.php,
+ views/rss/annotation/default.php, views/rss/canvas/default.php,
+ views/rss/group/default.php, views/rss/object/default.php,
+ views/rss/pageshells/pageshell.php, views/rss/user/default.php,
+ views/xml/api/output.php, views/xml/messages/exceptions/exception.php,
+ views/xml/pageshells/pageshell.php, views/xml/xml-rpc/output.php: Refs #706
+
+2009-01-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/notifications/languages/en.php, mod/notifications/start.php: Menu
+ heading changes
+
+ * mod/notifications/actions/save.php: Added save action for the notification
+ subscriptions.
+
+ * mod/notifications/index.php, mod/notifications/languages/en.php,
+ mod/notifications/start.php,
+ .../default/notifications/subscriptions/form.php: Added notification
+ subscriptions page.
+
+ * engine/lib/languages.php: Moved current language detection out into the
+ function get_language();
+
+2009-01-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/js/initialise_elgg.php,
+ views/default/navigation/topbar_tools.php: new cross-browser js toolbar menu
+
+2009-01-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Refs #562: Configuration flag to disable database
+ sessions.
+
+ * languages/en.php: Fixes missing translations
+
+ * version.php: Bumped version to today
+
+2009-01-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../default/usersettings/statistics_opt/online.php: Closes #702: Correct
+ parameters fed to get_system_log
+
+2009-01-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ .../jquery/jquery-easing-compatibility.1.2.pack.js,
+ vendors/jquery/jquery-easing.1.2.pack.js,
+ .../jquery/jquery-ui-personalized-1.5.3.packed.js,
+ .../jquery/jquery-ui-personalized-1.5.packed.js,
+ vendors/jquery/jquery.easing.1.3.packed.js,
+ views/default/js/friendsPickerv1.php, views/default/js/initialise_elgg.php,
+ views/default/page_elements/header.php: jquery framework and avatar menu
+ updated
+
+2009-01-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: A further change to ensure notification
+ messages don't get changed for every method if one method needs to make a
+ change.
+
+ * engine/lib/notification.php: Slight change to notifications.
+
+ * engine/lib/notification.php: Added more granular notification hook
+
+2009-01-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/metadata.php: Closes #701: Blank tags
+ not returned by string_to_tag_array
+
+2009-01-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Granular notification: a start
+
+2009-01-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Relationships no longer double added
+
+2009-01-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Closes #700: If a plugin doesn't physically exist
+ then it is deleted.
+
+ * views/default/usersettings/plugins_opt/plugin.php: User settings
+ translated
+
+ * views/default/admin/plugins_opt/plugin.php,
+ views/default/usersettings/plugins_opt/plugin.php: Reverted.
+
+ * views/default/admin/plugins_opt/plugin.php,
+ views/default/usersettings/plugins_opt/plugin.php: Tools menus now elgg_echo
+ folder name
+
+2009-01-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Introducing a function that orders by sums of
+ an annotation AND limits by a metadata value
+
+2009-01-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php, mod/activity/manifest.xml,
+ mod/activity/opendd.php, mod/activity/start.php,
+ mod/activity/views/default/activity/css.php,
+ mod/activity/views/default/activity/dashboard.php,
+ mod/activity/views/default/activity/wrapper.php,
+ .../views/default/settings/activity/edit.php,
+ mod/activity/views/opendd/activity/dashboard.php: Added Activity stream back
+ in
+
+ * engine/lib/users.php: Closes #699: get_user_by_username now using access
+ controls. Will no longer throw exception when accessing disabled users.
+
+2009-01-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Added toggling for the annotation sum list
+ functions.
+
+ * engine/lib/annotations.php: Added to and fixed the list by annotation
+ count functions.
+
+ * engine/lib/annotations.php: Fix for previous
+
+ * engine/lib/annotations.php: Added the missing 'group by' clause to the get
+ annotations by sum SQL query.
+
+2009-01-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Added user to user settings
+
+ * engine/lib/plugins.php: Refs #697: Now using plugin hook so one can do
+ live validation of values
+
+ * engine/lib/widgets.php: Closes #698: Typo corrected - nice spot!
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ engine/lib/plugins.php: Closes #697: Events triggered when plugin settings
+ are updated.
+
+2009-01-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fix for previous.
+
+ * engine/lib/annotations.php: Added annotation sum functions
+
+2009-01-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php: Closes #691: Should have been
+ is_memcache_available()
+
+2009-01-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/save.php, actions/user/language.php, actions/user/name.php:
+ Closes #689: Email now only changed if it is different than the one
+ registered, also a number of other settings changed in this way.
+
+ * actions/widgets/add.php, actions/widgets/reorder.php: Widget save errors
+ now use correct message box
+
+2009-01-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: Elgg version info now present in
+ headers.
+
+ * mod/crontrigger/manifest.xml, mod/crontrigger/start.php: Closes #672: Poor
+ mans cron plugin enabled. This triggers events according to page load.
+
+ * engine/lib/elgglib.php:
+
+ * engine/lib/elgglib.php: Added shutdown, system event. Refs #672
+
+ * mod/groups/actions/forums/edittopic.php: Editing post no longer takes
+ ownership
+
+ * actions/email/save.php: Refs #641: Email changer now prevents changing to
+ the same as another user.
+
+2009-01-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php, languages/en.php: Closes #669: Logins rate
+ limited. Accounts are limited to 5 fails in a 5 minute period, meaning an
+ attacker can try one password per minute.
+
+2009-01-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php: Comment correction.
+
+ * engine/lib/elgglib.php: Fix for template handler override.
+
+2009-01-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Closes #676: Entity subtables now deleted on failed
+ connections.
+
+2009-01-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Better trigger_plugin_hook documentation.
+
+2009-01-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/resetpassword.php, engine/lib/users.php: Closes #675:
+ Salt changed during password reset
+
+ * engine/lib/sessions.php:
+
+2009-01-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Tag updates.
+
+2009-01-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: Added rel="nofollow" rss and
+ opendd links in ownerblock
+
+2009-01-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/makeadmin.php, actions/admin/user/removeadmin.php,
+ languages/en.php, .../views/default/profile/menu/adminlinks.php: Closes #240:
+ It is now possible to downgrade an admin user.
+
+ * engine/lib/users.php: Closes #560: Pagination parameters added.
+
+ * mod/groups/languages/en.php, .../views/default/object/groupforumtopic.php:
+ Closes #544: Logged out view now shows correct dates, also tidied up some
+ translation issues.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php: Minor variable name and
+ comment change.
+
+ * actions/admin/user/unban.php, engine/lib/api.php, engine/lib/sessions.php,
+ engine/lib/users.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2009010901.sql, languages/en.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/listing.php,
+ .../views/default/profile/menu/adminlinks.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/userdetails.php, version.php: Closes #668:
+ Banning now works through a flag in the users_entity table. Database upgrade
+ required. * Added ElggUser::isBanned(); * Added 'banned' column to
+ users_entity * Modified ban() and unban() * Modified pam functions to check
+ $user->isBanned() * Modified login() to check $user->isBanned() * Modified
+ sessions_init() to check isBanned() and destroy session accordingly *
+ Modified profile views to highlight banned users and prevent menus for
+ non-admin users.
+
+2009-01-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php: Closes #588: Don't remember adding this
+ check... but anyway, double entries regression fixed.
+
+ * engine/lib/entities.php: Minor error message improvement
+
+ * engine/lib/entities.php: Added extra belts and braces check (minor)
+
+ * engine/lib/entities.php: Added extra belts and braces check (minor)
+
+ * engine/lib/users.php: Refs #668: Building on [2546] and providing ban and
+ unban functions. Later these will be replaced with "banning" functions.
+
+ * mod/groups/views/default/forms/groups/edit.php: Closes #664: Defaults
+ added to radio buttons
+
+ * engine/lib/statistics.php: Limit max display of active users to 10.
+
+ * actions/admin/user/ban.php, engine/lib/users.php: Refs #668, #640: Cleaner
+ interface provided for banning.
+
+ * actions/admin/user/ban.php, engine/lib/entities.php, engine/lib/users.php:
+ Refs #640: Renamed and moved entities.php:disable_entities to
+ user.php:disable_user_entities
+
+ * engine/lib/entities.php: Delete replaced by disable in disable_entity
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2009010801.sql,
+ version.php: Closes #666: Added some extra indexes
+
+ * languages/en.php, mod/uservalidationbyemail/languages/en.php: Closes #546:
+ Translation moved
+
+ * engine/lib/annotations.php: Closes #663: Added access checks on entity on
+ get_entities_from_annotation and count functions.
+
+ * engine/lib/metadata.php: Closes #667: Minor tweak, an e should be an m
+
+2009-01-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php,
+ .../default/widgets/group_members_widget/view.php: Closes #410: Pagination
+ parameter now passed in relationship list view.
+
+ * engine/lib/access.php, mod/groups/groupprofile.php,
+ mod/groups/languages/en.php: Closes #286: Group access restrictions issue
+ fixed, modified from patch supplied with #315
+
+ * views/failsafe/settings/system.php: Refs #622: Missing command from
+ failsafe view
+
+ * mod/groups/views/default/groups/forum_latest.php: Closes #660: Minor text
+ tweak
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ languages/en.php, views/default/account/forms/login.php,
+ views/default/settings/system.php: Closes #662: https on login.
+
+2009-01-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Closes #587: The area of code in
+ question hasn't been coded as defencively as it could have been.
+
+ * engine/lib/annotations.php: Fixes #648: Copy and paste error corrected.
+
+2009-01-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: * Added addRelationship to ElggEntity... bit of
+ an omission!
+
+ * htaccess_dist: Closes #656: Disabled mod_deflate for all actions so that
+ active downloads will no longer be double compressed.
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php,
+ engine/lib/sites.php: Fixes #655, Refs #628: Install now working with correct
+ event chain (#628).
+
+2009-01-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/add.php: Closes #649: Added checking to report when friend
+ add fails.
+
+2009-01-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: bug #634 fixed
+
+ * mod/groups/views/default/groups/forum_latest.php: lang tweak in group
+ forums
+
+ * mod/groups/actions/edit.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/forum_latest.php: groups owners can choose if
+ they want pages/files/forum enabled or not. Still a little more to do, this
+ is just the beginning code.
+
+ * mod/groups/languages/en.php: missing group lang items added
+
+2008-12-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php, engine/settings.example.php: Closes #579:
+ Allows configurable option $CONFIG->broken_mta = true. If set, this uses "\n"
+ instead of "\r\n" in email headers.
+
+2008-12-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Closes #643: Confirmed bug, applied fix as
+ suggested.
+
+ * views/default/page_elements/owner_block.php: Closes #633: User name in
+ owner block is now link. This may require additional skinning.
+
+ * engine/lib/plugins.php: Closes #608: Placing a file called "disabled" in
+ mod now disables all plugins, allowing easier recovery of an elgg site with
+ screwed up modules.
+
+ * views/default/input/button.php: Closes #519: Typo. Well spotted.
+
+ * languages/en.php: Closes #500
+
+ * mod/reportedcontent/languages/en.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php: Closes #504
+
+2008-12-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Closes #396: Form should probably not be permitted
+ on input.
+
+2008-12-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Closes #628: Event change now terminates on false.
+ Nice spot :)
+
+2008-12-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/updateclient/index.php, mod/updateclient/languages/en.php,
+ mod/updateclient/manifest.xml, mod/updateclient/start.php,
+ .../views/default/settings/updateclient/edit.php: Removed upgrade client
+ since it doesn't really matter.
+
+ * README.txt, version.php: Ticked up version number
+
+2008-12-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008120501.sql: Fixes #615
+
+2008-12-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php: Fixes to user banning (action side).
+
+ * engine/lib/elgglib.php: Fixes to user banning.
+
+2008-12-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Prototype view caching
+
+ * engine/lib/notification.php: Closes #597: GUID must now be non-zero for
+ messages to be sent
+
+2008-12-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: unused rule removed #583
+
+2008-12-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008111901.sql,
+ engine/schema/upgrades/2008120501.sql, version.php: Closes #611: Made name
+ field longer
+
+2008-12-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Closes #421 : Catches the DB Exception, so
+ hopefully this will prevent the error from showing up in the future :)
+
+ * languages/en.php, views/default/friends/collectiontabs.php: Closes #501
+
+ * engine/lib/users.php, mod/uservalidationbyemail/start.php: Closes #609
+
+ * engine/schema/upgrades/2008112002.sql: Fixed update script
+
+ * htaccess_dist: ETag support
+
+2008-12-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/forum_latest.php: latest group discussion
+ bug fixed
+
+2008-12-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/location.php: Some location tweaks
+
+ * engine/lib/users.php: Closes #550: Code metadata now moved to private
+ storage
+
+ * mod/groups/membership.php: Closes #604
+
+2008-11-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/radio.php: Improved radio button value retention
+
+ * views/default/input/checkboxes.php: Improved checkbox value retention
+
+2008-11-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/metatags.php: FOAF header added to
+ profile
+
+ * views/foaf/user/default.php: Foaf ident on mailbox for friends
+
+ * engine/schema/upgrades/2008112601.sql: Closes #571: Widgets now use
+ private store for settings
+
+ * engine/lib/entities.php, engine/lib/widgets.php: Closes #571: Widgets now
+ use private store for settings
+
+ * engine/lib/opendd.php:
+
+2008-11-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/location.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008112501.sql, version.php: Hook for future geocoding
+ library added.
+
+ * engine/schema/mysql.sql:
+
+2008-11-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Closes #580: Fixed tagging trim and strtolower
+
+2008-11-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/calendar.php: Refs #452: Basic entity listing functions. Needs
+ canvas.
+
+ * engine/lib/users.php: Closes #554: Validation procedure now correctly
+ screening for ascii space
+
+2008-11-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php:
+
+ * engine/lib/sessions.php: Added site secret to fingerprint to make it
+ harder to guess
+
+ * engine/lib/sessions.php, engine/lib/users.php: Fixes #548: Introducing
+ set_last_login($user_guid). Called from login(), but call from any
+ authentication code where appropriate.
+
+ * engine/lib/calendar.php, engine/lib/entities.php: Refs #452: Calendar
+ interface on entities
+
+ * engine/lib/entities.php: Introducing get_entities_from_private_setting();
+
+2008-11-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php, mod/groups/topicposts.php, upgrade.php: No need to
+ trigger the init event on upgrade.
+
+2008-11-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/upgrades/2008112001.sql,
+ engine/schema/upgrades/2008112002.sql, version.php: Refs #569, #570, #571:
+ Update script for both users and plugins plugin settings
+
+ * engine/schema/upgrades/2008111901.sql,
+ engine/schema/upgrades/2008112001.sql, version.php: Migrate plugin settings
+ from plugin to new settigns store.
+
+ * engine/lib/entities.php, engine/lib/plugins.php: Refs #571. Fixes #569,
+ #570: * Plugin functions set to use private data store. * Fixed some db
+ queries * Modified plugin class overriding get/set functions
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008111901.sql: Refs #569,
+ #570, #571: Minor database schema errors corrected
+
+ * engine/lib/entities.php: Refs #569, #570, #571: Corrected and optimised
+ insert query
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008111901.sql: Refs #569,
+ #570, #571: Minor database schema errors corrected
+
+ * engine/lib/entities.php: Refs #569, #570, #571: dbprefix not prefix;
+
+ * engine/lib/entities.php: Refs #569, #570, #571: Added
+ remove_all_private_settings()
+
+ * engine/lib/entities.php: Refs #569, #570, #571: Added
+ get_all_private_settings();
+
+ * engine/lib/metadata.php: Fixes #531: Access permissions enforced
+
+2008-11-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/group.php, engine/lib/objects.php, engine/lib/relationships.php,
+ engine/lib/sites.php, engine/lib/users.php, views/default/export/entity.php,
+ views/json/export/entity.php, views/json/export/metadata.php,
+ views/json/export/relationship.php, views/php/export/entity.php,
+ views/php/export/metadata.php, views/php/export/relationship.php: Fixes #568:
+ Exportable code now inclusive not exclusive. * Added extra function
+ Exportable interface * OpenDD export modified * PHP & JSON export views
+ modified * Default export view will still show all data if you are logged in
+ as admin (since this view is used by the guidtool)
+
+2008-11-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/upgrades/2008111901.sql: Introducing the new private
+ settings table.
+
+2008-11-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/calendar.php: Added get notable enities on relationship
+
+ * engine/lib/calendar.php: Added get notable enities on metadata
+
+ * engine/lib/calendar.php: Added get notable enities
+
+2008-11-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Closes #557
+
+2008-11-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * dashboard/index.php, engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/entities.php, engine/lib/extender.php, engine/lib/filestore.php,
+ engine/lib/group.php, engine/lib/languages.php, engine/lib/metadata.php,
+ engine/lib/notification.php, engine/lib/plugins.php, engine/lib/sessions.php,
+ engine/lib/tags.php, engine/lib/users.php, engine/lib/usersettings.php: *
+ Introducing get_loggedin_user() and get_loggedin_userid() * ACLs now using
+ get_loggedin_user* * Some logic cleaned up * Some "Undefined..." messages
+ cleaned up
+
+ * views/default/search/entity_list.php:
+
+ * views/default/search/entity_list.php: Removed some "Undefined" messages
+
+ * engine/lib/elgglib.php: Removed some "Undefined" messages
+
+ * views/default/input/access.php, views/default/input/button.php,
+ views/default/input/submit.php: Removed some "Undefined" messages
+
+ * mod/profile/views/default/profile/userdetails.php: Removed some
+ "Undefined" messages
+
+ * views/default/canvas/layouts/widgets.php: Removed some "Undefined"
+ messages
+
+ * engine/lib/elgglib.php: "Undefined" messages tidied up
+
+ * engine/lib/metastrings.php: "Undefined" messages tidied up
+
+ * engine/lib/river.php: "Undefined" messages tidied up
+
+ * engine/lib/sessions.php:
+
+ * engine/lib/sessions.php: * Candidate for initial ElggSession magic class *
+ Session now properly cleared on init and logout - this has knock on effect
+ that you can no longer assume that $_SESSION['id'] or 'guid' will be integer,
+ making it necessary to cast.
+
+ * engine/lib/admin.php: Minor tidying of code
+
+2008-11-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Experimental ElggCache
+
+2008-11-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php:
+
+ * engine/lib/cache.php: No longer blanks all caches when clearing
+
+ * engine/lib/cache.php: Closes #543
+
+2008-11-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Ifdef expires
+
+ * htaccess_dist: Minor tweaks to mod_gzip config. Note that gzip can't
+ compress some things due to the way that the apache 1.3 stack works
+
+ * htaccess_dist: Simplified GZIP
+
+ * htaccess_dist: Mod deflate support added
+
+ * htaccess_dist: Turned on mod_gzip if available
+
+ * htaccess_dist: Added default expiry
+
+ * mod/groups/graphics/icon.php: Expires header added to group icons
+
+2008-11-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icon.php: Content length on images
+
+ * mod/groups/graphics/icon.php: Content length on images
+
+ * _css/css.php, engine/lib/elgglib.php: Content length headers on JS and css
+
+ * engine/lib/elgglib.php: Javascript now correctly marked as cacheable
+
+ * _css/css.php: Fixes #541: CSS Now not being cached. Error is being caused
+ somewhere in the elgg framework which prevents pragma caching from working...
+ not sure what
+
+ * languages/en.php: Refs #520
+
+ * languages/en.php, views/default/friends/collections.php: Closes #501
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/groups/forum_latest.php: Closes #507
+
+ * engine/lib/memcache.php: Tidied.
+
+2008-11-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Profiling now showing queries executed before
+ debug flag being set
+
+ * engine/lib/metadata.php: Refs #529: Experimental memcaching for metadata
+
+ * engine/lib/elgglib.php: Fixed datalists error
+
+ * engine/lib/elgglib.php: Refs #529: Experimental memcaching on datalists
+
+ * engine/start.php: Removing unnecessary call to datalists
+
+ * index.php: Fixes #530
+
+ * engine/lib/metastrings.php: Refs #529: Experimental caching of metastrings
+
+ * engine/lib/entities.php: Refs #529: Experimental object level caching
+
+2008-11-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Reverted limited caching back to array since
+ caching objects don't work so well for these.
+
+ * engine/lib/elgglib.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008110601.sql, version.php: datalists now has primary
+ key, datalist set function optimised
+
+ * engine/lib/elgglib.php: Not possible to get any more, so tell them so
+
+ * engine/lib/users.php: Last action query update delayed to avoid
+ invalidating query cache unnecessarily.
+
+ * engine/lib/database.php: * Database functions optimised and centralised a
+ bit * Caching now caches queries which return no data * Introducing
+ execute_delayed_query family for executing queries AFTER the page has loaded.
+
+ * engine/lib/cache.php: isset fixes
+
+ * engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/relationships.php: Some tidying of objects and opendd export
+
+ * engine/lib/cache.php, engine/lib/memcache.php: Added test to see if
+ memcache is available.
+
+ * engine/lib/cache.php, engine/lib/memcache.php: Class hierachy changed to
+ separate shared memory caching
+
+2008-11-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php:
+
+ * engine/lib/river.php: Minor extension to river
+
+ * engine/lib/memcache.php: Minor tweak
+
+ * engine/lib/river.php: Slight rejig in the way the river works
+
+ * engine/lib/elgglib.php: Extends elgg_view_tree to support other view
+ types.
+
+ * engine/lib/cache.php: Added "add" method to cache only if it doesn't exist
+ already.
+
+ * engine/lib/database.php: Revert use of memcache for database query cache
+
+ * engine/lib/memcache.php: Changed default timeout
+
+2008-11-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/memcache.php: Removed cache clearing for now.
+
+ * engine/lib/database.php, engine/lib/memcache.php: More tweaks
+
+ * engine/lib/memcache.php: Experimental memcache support
+
+ * engine/lib/memcache.php, languages/en.php: Closes #516: Experimental
+ memcache support
+
+ * engine/settings.example.php: Installation notes
+
+ * languages/en.php: Refs #514: Memcache error messages
+
+ * engine/settings.example.php: Refs #514: Memcache settings
+
+ * engine/lib/cache.php: Refs #514 : Using memcache if available
+
+ * engine/settings.example.php: Refs #514
+
+ * engine/lib/memcache.php: First draft memcache object. No testing yet
+ carried out, submitted 'cos I'm moving computers.
+
+ * engine/lib/cache.php:
+
+ * engine/lib/cache.php, engine/lib/database.php, engine/lib/entities.php:
+ Moved caching to function so it can be easily replaced
+
+2008-11-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Refs #514: Entity and subtype caching
+
+ * engine/lib/cache.php: Minor tweaks
+
+ * engine/lib/cache.php: back to private
+
+ * engine/lib/cache.php: Initialisation correct
+
+ * engine/lib/database.php: Database using new memory cache object
+
+ * engine/lib/api.php, engine/lib/cache.php: * ElggCache interface improved *
+ ElggStaticVariableCache introduced as a placeholder for more advanced
+ caching.
+
+ * engine/lib/database.php: Experimental database query caching, please
+ report problems asap.
+
+ * engine/lib/calendar.php: Stub added refs #452
+
+ * engine/lib/database.php: Experimental database query caching, please
+ report problems asap.
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008110301.sql,
+ version.php: Some missing keys added.
+
+ * engine/lib/access.php, engine/lib/annotations.php,
+ engine/lib/configuration.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/group.php, engine/lib/objects.php,
+ engine/lib/query.php, engine/lib/relationships.php, engine/lib/sites.php,
+ engine/lib/users.php: Minor tweaks 'cos case does matter...
+
+2008-11-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/object/groupforumtopic.php: Minor style fix.
+
+ * mod/groups/discussions.php, .../views/default/object/groupforumtopic.php:
+ Latest discussion fix
+
+2008-10-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Closes #378: Fixed incorrect relationship direction.
+
+ * engine/lib/notification.php: Closes #446: * Errant \r\n and \r chars
+ coverted to \n. * newlines stripped from subject headers. * Lines starting
+ with From are changed to >From
+
+ * engine/handlers/cron_handler.php, mod/garbagecollector/start.php: Changed
+ cron to use output buffering (letting you simply echo rather than needing to
+ pass variables around)
+
+ * mod/groups/views/default/forms/groups/edit.php: Closes #461: Localisations
+ added
+
+ * mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php: Refs #494: GUID listed
+
+ * mod/garbagecollector/start.php: Added system, gc plugin hook to garbage
+ collector
+
+ * engine/lib/notification.php: Closes #488: This is indeed a typo... well
+ spotted :)
+
+ * engine/lib/database.php, engine/lib/metastrings.php,
+ mod/garbagecollector/start.php: Closes #493: Moved database queries out of
+ module and in to core in line with best practice.
+
+2008-10-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/groupprofile.php: Closes #486
+
+2008-10-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * README.txt: Version number fail.
+
+ * version.php: Elgg 1.1 final.
+
+ * version.php: Further version update
+
+ * README.txt: Version number change in the readme file.
+
+2008-10-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: profile block layout issue in IE7 fixed
+
+2008-10-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Version number change
+
+ * languages/en.php: A better description of the RESTful API
+
+2008-10-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Reverted database access permission caching.
+
+2008-10-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: Group topic error message
+
+ * _graphics/upgrader.gif, upgrade.php, views/default/settings/upgrading.php:
+ Replacement upgrade notifier
+
+ * INSTALL.txt, UPGRADE.txt: Slight update to crontab instructions
+
+ * mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php, mod/activity/manifest.xml,
+ mod/activity/start.php, mod/activity/views/default/activity/dashboard.php,
+ mod/activity/views/default/activity/wrapper.php,
+ .../views/default/settings/activity/edit.php: Farewell, activity, we hardly
+ knew ye.
+
+2008-10-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * INSTALL.txt, UPGRADE.txt: Modification to install and upgrade text files
+ to include details about the crontab
+
+2008-10-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/settings/upgrading.php: Added upgrading screen
+
+ * _graphics/upgrader.gif, languages/en.php, upgrade.php: Visual upgrader.
+
+2008-10-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/manifest.xml, mod/apiadmin/manifest.xml,
+ mod/diagnostics/manifest.xml, mod/garbagecollector/manifest.xml,
+ mod/groups/manifest.xml, mod/guidtool/manifest.xml,
+ mod/logbrowser/manifest.xml, mod/logrotate/manifest.xml,
+ mod/profile/manifest.xml, mod/river/manifest.xml,
+ mod/updateclient/manifest.xml, mod/uservalidationbyemail/manifest.xml:
+ manifest files sync'ed
+
+2008-10-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php, views/default/css.php: persistent
+ login checkbox styled
+
+2008-10-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Menu link text change, to be more descriptive
+
+2008-10-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php, mod/profile/views/default/profile/userdetails.php:
+ Hide 'about me' on custom profiles
+
+2008-10-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Annotation pagination is now corrected where more
+ than 10 items are being displayed at once.
+
+2008-10-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js, javascript/initialise_elgg.js: remove js,
+ moved into views
+
+ * javascript/initialise_elgg.js, views/default/css.php,
+ views/default/js/initialise_elgg.php: updates for v1.1, css cleanup, removal
+ of redundant classes, redundant js removed
+
+2008-10-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php, mod/logrotate/start.php: Logrotate and archive
+ containing offset. Table still created as $now but containing < $now-period.
+
+2008-10-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/garbagecollector/languages/en.php, mod/garbagecollector/manifest.xml,
+ mod/garbagecollector/start.php,
+ .../default/settings/garbagecollector/edit.php: Introducing the Elgg garbage
+ collector.
+
+2008-10-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: layout bug when not group owner
+
+2008-10-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/toolbox.php: Removed the toolbox.
+
+ * views/default/page_elements/header.php: Removed needless comment
+
+2008-10-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: added additional styles for code, pre, blockquote,
+ dl, dt etc
+
+2008-10-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php: Views are now more
+ granular.
+
+2008-10-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, languages/en.php,
+ views/default/account/forms/login.php: Closes #306
+
+2008-10-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/messages/list.php: messages in failsafe mode moved to
+ inline ones - so they don't obscure text below
+
+2008-10-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../river/annotation/generic_comment/create.php: Hoiking out the generic
+ comment view again. Needs to be rethought.
+
+ * languages/en.php, .../river/annotation/generic_comment/create.php:
+ Committed a generic comment view.
+
+2008-10-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/social.php, languages/en.php: Closes #440
+
+ * engine/lib/access.php: Flags to prevent queries being run multiple times.
+
+ * engine/lib/access.php: Removed spurious notice
+
+ * languages/en.php, views/default/admin/plugins_opt/plugin.php: Closes #476:
+ Well spotted.
+
+2008-10-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: additional dicv added to
+ owner block for theme purposes
+
+2008-10-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * crontab.example:
+
+ * mod/groups/languages/fr.php, mod/groups/languages/it.php,
+ mod/groups/languages/ru.php, mod/groups/languages/th.php,
+ mod/groups/languages/zh.php: REMOVED LANGUAGE FILES FROM CORE. This is due to
+ a stupid and frustrating legal reason.
+
+ * languages/de.php, languages/es.php, languages/fr.php, languages/it.php,
+ languages/ru.php, languages/th.php, languages/zh.php,
+ mod/activity/languages/ru.php, mod/apiadmin/languages/ru.php,
+ mod/diagnostics/languages/fr.php, mod/diagnostics/languages/it.php,
+ mod/diagnostics/languages/ru.php, mod/diagnostics/languages/th.php,
+ mod/diagnostics/languages/zh.php, mod/guidtool/languages/it.php,
+ mod/guidtool/languages/ru.php, mod/guidtool/languages/th.php,
+ mod/guidtool/languages/zh.php, mod/logbrowser/languages/fr.php,
+ mod/logbrowser/languages/it.php, mod/logbrowser/languages/ru.php,
+ mod/logbrowser/languages/th.php, mod/logbrowser/languages/zh.php,
+ mod/reportedcontent/languages/fr.php, mod/reportedcontent/languages/it.php,
+ mod/reportedcontent/languages/ru.php, mod/reportedcontent/languages/th.php,
+ mod/reportedcontent/languages/zh.php, mod/river/languages/fr.php,
+ mod/river/languages/it.php, mod/river/languages/ru.php,
+ mod/river/languages/th.php, mod/river/languages/zh.php,
+ mod/updateclient/languages/fr.php, mod/updateclient/languages/it.php,
+ mod/updateclient/languages/ru.php, mod/updateclient/languages/th.php,
+ mod/updateclient/languages/zh.php,
+ mod/uservalidationbyemail/languages/ru.php: REMOVED LANGUAGE FILES FROM CORE.
+ This is due to a stupid and tedious legal reason.
+
+ * mod/logrotate/languages/en.php, mod/logrotate/manifest.xml,
+ mod/logrotate/start.php, .../views/default/settings/logrotate/edit.php:
+ Closes #215: Log rotation added.
+
+2008-10-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/leave.php, mod/groups/start.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ .../views/default/object/groupforumtopic.php: Removing WSOD errors in groups
+
+2008-10-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php: Refs #215: Minor tweak to logic
+
+2008-10-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Hopefully slightly friendlier token mismatch errors.
+
+2008-10-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php: Refs #215: System hook for archiving log. Cron
+ yet to be added.
+
+ * .../views/default/profile/menu/adminlinks.php: Closes #448: Functionality
+ was present, but was lacking interface. Interface provided.
+
+ * views/default/object/default.php: Closes #460: Good spot, thanks for the
+ contribution!
+
+ * languages/en.php: Closes #473: Good spot
+
+2008-10-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/register.php, actions/register.php, engine/lib/users.php,
+ views/default/account/forms/register.php: The friend invite infrastructure is
+ now secure.
+
+2008-10-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/languages/ru.php:
+
+ * mod/activity/languages/ru.php: Closes #469: Thankyou for the translation!
+
+2008-10-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/register.php, register.php: Further additions to the registration
+ form.
+
+ * views/default/account/forms/register.php: Added friend guid handling to
+ the registration form.
+
+ * engine/lib/users.php: Added the ability to add a user to a user's friends
+ list on registration.
+
+ * actions/register.php: Added the ability to add a user to a user's friends
+ list on registration.
+
+ * engine/lib/entities.php: Revert.
+
+ * engine/lib/entities.php: Improvements for container overrides.
+
+2008-10-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/radio.php: Fix for input/radio where keys aren't
+ specified
+
+2008-10-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/usersettings/plugins_opt/plugin.php: Minor tweaks to tools
+ settings
+
+ * languages/en.php: Added reply
+
+2008-10-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Small language additions for open and close.
+
+2008-10-22 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/shout_speech_bubble.gif: removed and added to thewire plugin
+
+2008-10-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cron.php: Better default forward
+
+2008-10-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: Fixed typo! Well spotted,
+ @notomodungwa
+
+2008-10-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * crontab.example, engine/lib/cron.php: Increasing sub-hour cron granularity
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008102101.sql: Removed
+ unnecessary column
+
+ * engine/lib/sessions.php: Closes #453 and #463: Completed work. Sessions
+ now stored in database.
+
+ * engine/lib/sessions.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008102101.sql: Semi-working session code. Still won't
+ permit logging in, commented out until there is time to fix. Problem seems
+ to be based around the action_gatekeeper() and the values set for the
+ __elgg_session. Removing this component from the key causes the token to be
+ valid. My feeling is that the session is not being saved or loaded
+ correctly.
+
+2008-10-21 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php: #458 fixed - IE7 conditional
+ statement bug
+
+2008-10-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008102101.sql, version.php: Database session code.
+ IMPORTANT NOTE: The trigger for this is commented out, so old session code
+ is used. There are serious problems with using the new code since it causes a
+ chicken and egg problem with the upgrade script.
+
+ * engine/lib/group.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Closes #457: Now returns $guid on success, false on
+ fail
+
+ * engine/lib/sites.php, languages/en.php: Added safety rail to prevent
+ disabling/deleting of currently viewed site.
+
+2008-10-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/checkboxes.php: Output/checkboxes now defers to
+ output/tags rather than output/text; much more sensible.
+
+ * engine/lib/input.php: The input filter now deals with two-dimensional
+ input arrays.
+
+2008-10-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apiadmin/views/default/object/api_key.php:
+
+ * mod/apiadmin/views/default/object/api_key.php: Minor tweaks to avoid
+ breaking non-admin css
+
+2008-10-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Important fix for deleted plugins.
+
+2008-10-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/checkboxes.php, views/default/output/radio.php:
+ Default output fields for radio and checkboxes
+
+ * search/users.php: Fixed double layout issue
+
+2008-10-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/usersettings.php, languages/en.php, settings/index.php,
+ settings/plugins.php, settings/statistics.php, settings/statistics/index.php,
+ settings/user.php, settings/user/index.php, views/default/object/plugin.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php: Closes #335: Marcus Povey
+ : * Per user tools settings now present again (only displays if there are
+ settings present AND the plugin is enabled - needs skinning accordingly) *
+ Re-jigged the settings code to behave like a proper page handler. * Minor
+ tweak to language
+
+ * engine/lib/system_log.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008101701.sql, version.php: Changes to access any
+ system log code. Introducing owner guid on items which is necessary for
+ access control. Requires upgrade.php to be run
+
+2008-10-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php, views/default/css.php:
+ activity stream basic style applied, and plugin reorder links adjusted
+
+2008-10-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: widget gallery more info spacing fixed
+
+2008-10-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Minor language tweak.
+
+ * actions/admin/plugins/reorder.php, admin/plugins/index.php,
+ engine/lib/plugins.php, languages/en.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php: You can now reorder plugins.
+
+2008-10-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php: gap in user menu removed
+
+2008-10-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/activity/all.php, mod/activity/friends.php, mod/activity/index.php,
+ mod/activity/languages/en.php, mod/activity/manifest.xml,
+ mod/activity/start.php, mod/activity/views/default/activity/dashboard.php,
+ mod/activity/views/default/activity/wrapper.php,
+ .../views/default/settings/activity/edit.php: Initial activity view. Missing
+ functionality: comments, tabs and drill down ability.
+
+2008-10-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php: Improved online users stats so that more than
+ 10 get displayed
+
+2008-10-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Moving internal function out of elgg_view_tree()
+ since this caused problems
+
+ * engine/lib/configuration.php: Closes #438
+
+ * engine/lib/river.php:
+
+ * engine/lib/river.php, engine/lib/system_log.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008101601.sql, version.php: Closes #442: Requires
+ schema upgrade. Side effect - friends activity rivers will be blanked.
+
+ * engine/lib/river.php: River performance tweak
+
+2008-10-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/ru.php: Committing groups translation
+
+ * .../notifications/settings/usersettings.php: Notification methods now
+ better translated
+
+ * languages/ru.php: Closes #433: Merged changes from trac and email
+ submissions. Thanks for all submissions!
+
+ * languages/ru.php: Initial core russian translation
+
+ * mod/apiadmin/languages/ru.php, mod/diagnostics/languages/ru.php,
+ mod/guidtool/languages/ru.php, mod/logbrowser/languages/ru.php,
+ mod/reportedcontent/languages/ru.php, mod/river/languages/ru.php,
+ mod/updateclient/languages/ru.php,
+ mod/uservalidationbyemail/languages/ru.php: Refs #433: Russian translations
+ for core plugins
+
+2008-10-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: view link added to en.php
+
+2008-10-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/social.php: Removed an annoying variable cast that was
+ destroying everything.
+
+ * engine/lib/social.php: The word blacklist for filter_string is now loaded
+ on init.
+
+2008-10-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Edit profile form modified
+
+2008-10-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php:
+
+ * mod/profile/actions/deletedefaultprofileitem.php,
+ mod/profile/actions/editdefault.php,
+ mod/profile/actions/resetdefaultprofile.php, mod/profile/defaultprofile.php,
+ mod/profile/start.php, .../views/default/profile/editdefaultprofile.php:
+ Closes #235: Simple profile editor in place
+
+2008-10-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/friends_picker_arrow_left.gif,
+ _graphics/friends_picker_arrow_right.gif,
+ _graphics/friends_picker_arrows.gif, _graphics/gallery_back_icon.gif,
+ _graphics/gallery_back_icon_on.gif, views/default/css.php: Friends picker
+ arrows combined into one resource, and updated with hover effect. Redundant
+ image gallery icons removed.
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php:
+
+ * engine/lib/elgglib.php: Catching error on datalists
+
+2008-10-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/avatar_menu_arrow.gif, _graphics/avatar_menu_arrow_hover.gif,
+ _graphics/avatar_menu_arrow_open.gif, _graphics/avatar_menu_arrows.gif,
+ mod/profile/views/default/profile/css.php: Avatar user menu arrows updated to
+ use one image rather than 3
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Closes #412
+
+ * engine/lib/river.php: Refs #431: Belts and braces added to river view
+
+2008-10-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/useradd.php: Adjusted spacing on add user form
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Refs #432: Typo
+
+ * mod/groups/start.php: Closes #432: Hook added as profile
+
+ * mod/profile/start.php: Minor commenting
+
+2008-10-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * INSTALL.txt, UPGRADE.txt: Updated the install and upgrade text.
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/zh.php: Refs #424: reportedcontent
+
+ * mod/groups/languages/zh.php, mod/guidtool/languages/zh.php,
+ mod/river/languages/zh.php: Refs #424: guidtool, groups, river
+
+ * mod/diagnostics/languages/zh.php, mod/logbrowser/languages/zh.php,
+ mod/updateclient/languages/zh.php: Refs #424: Diagnostics, logbrowser,
+ updateclient
+
+ * languages/zh.php: Refs #424: Core translations added.
+
+ * UPGRADE.txt, engine/lib/version.php, upgrade.php: Closes #430
+
+2008-10-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/graphics/defaultlarge.gif,
+ mod/groups/graphics/defaultmedium.gif, mod/groups/graphics/defaultsmall.gif,
+ mod/groups/graphics/defaulttiny.gif,
+ .../views/default/icon/group/default/large.php,
+ .../views/default/icon/group/default/medium.php,
+ .../views/default/icon/group/default/small.php,
+ .../views/default/icon/group/default/tiny.php,
+ mod/profile/graphics/defaultlarge.jpg,
+ mod/profile/graphics/defaultmedium.jpg,
+ mod/profile/graphics/defaultsmall.jpg, mod/profile/graphics/defaulttiny.jpg,
+ mod/profile/graphics/defaulttopbar.jpg: Groups updated to use new icon method
+ and new groups icons added. Profile updated with new default avatars
+
+2008-10-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2008101303.php, version.php: Fixed the previous user
+ login issue.
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Introducing get_current_language(). Refs #235
+
+ * mod/profile/start.php: Refs #235: Added hooks for future admin interface
+
+ * mod/profile/start.php:
+
+2008-10-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/annotation/generic_comment.php: default message styled
+
+2008-10-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Refs #235: Now possible for plugins to change
+ default profile (plugin hook 'profile:fields', 'profile'.
+
+2008-10-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: widget more info tooltip improvements
+
+ * views/default/canvas/layouts/widgets.php: further fixes to the widget
+ gallery to use css-based images
+
+ * views/default/canvas/layouts/widgets.php, views/default/css.php: Updated
+ widget picker gallery to use classes for images rather than hard-coded
+ resources.
+
+2008-10-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php: user avatar menu method
+ adjusted to avoid hard-coded image resources
+
+2008-10-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php: system message strings moved to
+ elgg_echo
+
+2008-10-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, mod/profile/icon.php,
+ .../views/default/icon/user/default/large.php,
+ .../views/default/icon/user/default/master.php,
+ .../views/default/icon/user/default/medium.php,
+ .../views/default/icon/user/default/small.php,
+ .../views/default/icon/user/default/tiny.php,
+ .../views/default/icon/user/default/topbar.php: Default icon overrides.
+
+ * engine/lib/entities.php, mod/profile/icon.php: Simple hook to allow for
+ default user and entity icons.
+
+2008-10-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php:
+
+ * engine/lib/entities.php, mod/groups/graphics/defaultlarge.jpg,
+ mod/groups/graphics/defaultmedium.jpg, mod/groups/graphics/defaultsmall.jpg,
+ mod/groups/graphics/defaulttiny.jpg, mod/groups/start.php,
+ mod/groups/views/default/groups/icon.php: Closes #417 & #418
+
+ * engine/lib/filestore.php, mod/profile/start.php: Minor optimisations.
+ Introducing exists() on filestores
+
+ * _graphics/icons/default/topbar.png, engine/lib/entities.php,
+ mod/profile/icon.php, mod/profile/start.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/icon.php,
+ views/default/page_elements/elgg_topbar.php: Closes #301: Profile icons now
+ use getIcon() API. Overrides now possible: For themes to override, create a
+ plugin hook listening to 'entity:icon:url' and object 'user'. In the hook
+ return a different url. To replace default user icons in a plugin one might
+ create a hook: function profile_usericon_hook($hook, $entity_type,
+ $returnvalue, $params) { if ((!$returnvalue) && ($params['entity'] instanceof
+ ElggUser)) { // return your default graphic here. } } And set it to priority
+ 900 (lower priority than the code that displays a pretty icon for users but
+ higher than the default object display code in entities.php)
+
+ * engine/lib/users.php: Allowing '.' in username, refs #415
+
+ * views/rss/pageshells/pageshell.php: Fixes #413: Rss feeds with GET query
+ strings now functioning. Thanks for your patch, nice spot!
+
+ * languages/en.php: Fixes #415
+
+2008-10-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/ajax/loader.php, views/default/css.php: ajax loader updated
+ to use an image from _graphics rather than a hard-coded image resource (to
+ make theming possible).
+
+2008-10-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php: Removing pagination from online users.
+
+2008-10-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Removed debug
+
+ * engine/lib/entities.php: Minor tweaks to the getIcon code: * Default now
+ running on priority 1000 * Renamed default hook to a better name Marcus Povey
+
+2008-10-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php,
+ .../views/default/widgets/a_users_groups/view.php: Removed pagination for the
+ groups widget
+
+2008-10-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql, engine/schema/upgrades/2008100601.sql: Bugfixes
+ to river script
+
+ * engine/schema/mysql.sql: Added river key to main schema
+
+2008-10-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/messages/list.php: updated failsafe message divs
+ dimensions
+
+2008-10-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/upgrades/2008100601.php, engine/lib/upgrades/2008100701.php:
+ Changed the name. Refs #409
+
+ * engine/lib/database.php, engine/lib/upgrades/2008100601.php,
+ engine/lib/version.php, languages/en.php, version.php: Closes #409: PHP
+ update script to update core added
+
+ * mod/uservalidationbyemail/start.php: removed debug
+
+ * mod/groups/languages/th.php: Removing BOM
+
+ * mod/updateclient/languages/th.php: Thai language pack
+
+ * mod/river/languages/th.php: Thai language pack
+
+ * mod/reportedcontent/languages/th.php: Thai language pack
+
+ * mod/logbrowser/languages/th.php: Thai language pack
+
+ * mod/guidtool/languages/th.php: Thai language pack
+
+ * mod/groups/languages/th.php: Thai language pack
+
+ * mod/diagnostics/languages/th.php: Thai language pack
+
+ * languages/th.php: Closes #406: Thanks for your submission
+
+2008-10-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, mod/profile/start.php: Introduced a way to either
+ tether metadata access to entities, or to make them independent - in either
+ case, explicitly.
+
+2008-10-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php:
+
+ * engine/lib/river.php: Deleted old gumpf refs #402 and #407
+
+ * engine/lib/river.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008100601.sql,
+ .../default/river/ElggRelationship/create.php,
+ .../default/river/relationship/member/create.php,
+ .../default/river/ElggUser/profileiconupdate.php,
+ .../views/default/river/ElggUser/profileupdate.php,
+ .../river/user/default/profileiconupdate.php,
+ .../default/river/user/default/profileupdate.php,
+ views/default/river/ElggRelationship/create.php,
+ views/default/river/relationship/friend/create.php: Closes #402 and #407 :
+ Right! Finally nailed this fscking issue to the wall (hopefully). Modified
+ system log to hold extra information about the class being stored, this lets
+ us pull only the required rows from the event log. This drastically
+ simplifies and speeds up the query. Requires: Database upgrade. Outstanding
+ issues: Query is using filesort despite using correct index. Still much
+ faster than the last method!
+
+ * engine/lib/elgglib.php: Removed unnecessary debug
+
+2008-10-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/metadata.php,
+ views/default/search/entity_list.php: You can now remove pagination from a
+ list
+
+ * search/users.php: User browsing is revamped.
+
+ * engine/lib/users.php: List_user_friends_objects now lets you hide the
+ toggle to gallery view
+
+2008-10-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/index.php: Refs #402 and #407: Extra fields added to
+ system_log
+
+ * engine/lib/extender.php, engine/lib/relationships.php,
+ engine/lib/system_log.php, engine/schema/mysql.sql,
+ engine/schema/upgrades/2008100601.sql, version.php: Refs #402 and #407: Extra
+ fields added to system_log
+
+2008-10-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Minor fix for previous.
+
+ * engine/lib/elgglib.php: Introducing elgg_view_tree, for getting an array
+ of views
+
+ * engine/lib/elgglib.php, views/default/js/friendsPickerv1.php,
+ views/default/js/initialise_elgg.php, views/default/page_elements/header.php:
+ Elgg Javascript now goes through the views system
+
+ * engine/lib/access.php: A massive speed increase for access permissions. :)
+
+2008-10-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Closes #405: If -> else if. Nice spot.
+
+2008-10-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/comments/forms/edit.php: removed ratings hook from comments.
+ It will now go into plugins.
+
+2008-10-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php: updated messaging system with
+ 'click to dismiss' and moved it's position to not overlap the top toolbar
+
+2008-10-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Closes #399
+
+ * engine/lib/version.php: Fixes #401
+
+ * languages/en.php, mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/start.php: Refs #311: Modified message slightly
+
+ * actions/register.php, engine/lib/users.php, .../actions/email/confirm.php,
+ mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/start.php: Fixes #311, closes #345: Validation now
+ called via event 'user', 'validate'. Email validation now a plugin.
+
+2008-10-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/messages/errors/list.php,
+ views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/messages/list.php: updated messages system
+
+2008-10-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Removed old validation code
+
+ * languages/en.php: Refs #311 : Removing old email confirmation code.
+
+ * actions/email/confirm.php: Refs #311 : Removing old email confirmation
+ code.
+
+ * engine/lib/install.php: Fixing whitescreen on settings file creation
+
+ * mod/uservalidationbyemail/languages/en.php,
+ mod/uservalidationbyemail/manifest.xml, mod/uservalidationbyemail/start.php:
+ Refs #311: Saving stub prior to relocation...
+
+ * actions/systemsettings/install.php: Refs #311: Enable email validation
+ module by default
+
+ * engine/lib/users.php: Refs #311
+
+ * engine/lib/sessions.php: Refs #311
+
+ * actions/register.php: Refs #311
+
+ * actions/email/save.php: Refs #311
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php:
+ Closes #398
+
+ * engine/lib/install.php, engine/settings.example.php: Fixing installer
+ issue.
+
+2008-10-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Fitter, happier group links
+
+ * engine/lib/admin.php: Added an admin override for container permissions
+ checking.
+
+ * mod/groups/start.php: Improved group menu items.
+
+2008-10-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * crontab.example, engine/handlers/cron_handler.php, engine/lib/cron.php,
+ htaccess_dist, languages/en.php: Improved cron support
+
+ * engine/lib/metadata.php: Closes #379
+
+ * engine/lib/metadata.php: Closes #389
+
+ * engine/lib/database.php, engine/lib/install.php: Fixes #395
+
+2008-09-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Minor tweaks
+
+ * engine/lib/actions.php: Changed to plugin hook
+
+ * engine/lib/actions.php: Closes #390: Triggers an event 'action', $action
+ before action is included. This is rather kludgy and we need to rethink this
+ a bit.
+
+ * engine/lib/plugins.php: Actually, bad idea...
+
+ * engine/lib/plugins.php: Events now triggered on plugin enable/disable
+
+ * actions/friends/remove.php, engine/lib/configuration.php,
+ engine/lib/users.php: Closes #388: Additionally the site check in
+ configuration_init() should be instanceof. Nice spot, thanks.
+
+2008-09-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php: Messages/error notification system
+ updated with dismiss button, longer delay, and sticky/fixed position (at top
+ of viewport).
+
+2008-09-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/version.php: Install now works again
+
+2008-09-30 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/comments/forms/edit.php: ratings hook added to comments
+ block
+
+2008-09-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added IP address tools, todo check licence.
+
+ * engine/lib/notification.php, languages/en.php: Set the notification
+ settings
+
+ * engine/lib/notification.php, languages/en.php: Notifications get
+ notification stuff in API form.
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ languages/en.php, views/default/settings/system.php,
+ views/failsafe/settings/system.php: Closes #383 & #384
+
+ * engine/lib/notification.php: Closes #369: For entities which are not users
+ the ->email field is used, failing that it tries to work out an address from
+ ->url and lastly from $CONFIG->site_guid. Closes #382: Fix applied as
+ suggested.
+
+2008-09-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: get_input can now be properly overridden by
+ set_input. Fixes #324
+
+2008-09-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php:
+
+ * engine/lib/api.php:
+
+ * engine/lib/api.php: Debug
+
+ * engine/lib/api.php, engine/lib/sessions.php, services/api/rest.php:
+ Committing what I have at the end of the day, api still not 100%
+
+ * engine/lib/cache.php: Caching support fixed.
+
+ * engine/lib/api.php: Fixing auth_token code
+
+ * engine/lib/pam.php: Fixed issue with pam handler, now if required method
+ throws an exception the authentication short circuits with false.
+
+2008-09-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Clear annotations now clears annotations
+ properly when no name is specified. Fixes #357
+
+ * engine/lib/annotations.php: Count annotations now fails properly if a
+ metastring is not found. Fixes #377
+
+2008-09-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Make statisics nicer
+
+ * mod/apiadmin/languages/en.php: Make statisics nicer
+
+ * engine/lib/api.php: view now set by endpoint
+
+ * engine/lib/widgets.php: Closes #326: add_widget uses the specified
+ $user_guid as $widget->owner_guid
+
+2008-09-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php:
+
+ * languages/en.php: Closes #360: Will now install on 5.1.6 or greater with a
+ warning, 5.2 with now warning.
+
+ * engine/lib/install.php: Closes #360: Will now install on 5.1.6 or greater
+ with a warning, 5.2 with now warning.
+
+ * mod/updateclient/start.php: Modified pinger to use new style endpoint
+ format. Note, this will require ping.elgg.org to be upgraded come next
+ release!
+
+ * engine/lib/ping.php: Modified pinger to use new style endpoint format.
+ Note, this will require ping.elgg.org to be upgraded come next release!
+
+ * engine/lib/ping.php, mod/diagnostics/start.php,
+ mod/updateclient/start.php, views/default/admin/statistics_opt/basic.php:
+ Closes 374: Using get_version function instead of including the version file.
+
+ * engine/lib/api.php, languages/en.php: Minor improvements to failure mode.
+
+ * engine/lib/api.php: auth_token api call now functional
+
+ * services/api/rest.php: Addapted to be called from pagehandler
+
+ * engine/lib/api.php:
+
+2008-09-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Returning cache control back to access permissions.
+
+2008-09-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apiadmin/actions/generate.php, mod/apiadmin/actions/revokekey.php,
+ mod/apiadmin/views/default/object/api_key.php: Added action_gatekeeper() code
+
+ * engine/lib/api.php:
+
+ * engine/lib/api.php: Added endpoint page handler.
+
+ * mod/apiadmin/actions/generate.php, mod/apiadmin/actions/revokekey.php,
+ mod/apiadmin/index.php, mod/apiadmin/languages/en.php,
+ mod/apiadmin/manifest.xml, mod/apiadmin/start.php,
+ .../views/default/apiadmin/forms/add_key.php,
+ mod/apiadmin/views/default/object/api_key.php: Introducing API key
+ administration panel
+
+ * engine/lib/api.php: Create keypair code added
+
+ * engine/lib/api.php: Added create_api_user
+
+ * engine/lib/api.php: Added remove_api_user function
+
+ * engine/lib/api.php: Will now handle banned users
+
+2008-09-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/metadata.php: Metadata permissions now
+ work as advertised, but had to remove caching in the process. Will attempt to
+ re-enable it shortly.
+
+2008-09-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/user/settings/name.php: Closes #362: Nice spot. Cause was
+ an omission of the user being edited being passed. No security issues
+ introduced by having this user set, since editing user must still pass a
+ canEdit() in the action itself.
+
+2008-09-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, engine/lib/version.php,
+ engine/schema/upgrades/2008092301.sql, languages/en.php, version.php: The
+ database schema will now automatically update itself on upgrade.
+
+ * engine/lib/api.php, engine/start.php: The cache library is now loaded
+ before the main library boot.
+
+2008-09-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Belts and braces
+
+2008-09-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/upgrades/2008092301.sql: Database upgrade script from 1.0 to
+ latest schema.
+
+2008-09-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: API improvement. Authentication via token now logs
+ user in for that session.
+
+ * mod/profile/index.php: Closes #367: Widgets only displayed for found
+ profiles.
+
+2008-09-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Apparently non-p connections are better in many
+ cases, see http://www.slideshare.net/techdude/how-to-kill-mysql-performance
+
+ * languages/it.php: Closes #363
+
+2008-09-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/index.php, friends/of.php: Closes #358 and #359. Well spotted.
+
+ * languages/fr.php: Closes #356: Thanks for the contribution!
+
+2008-09-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: API explanations added to language file
+
+ * engine/lib/access.php: Access permissions now cached correctly.
+
+ * engine/lib/plugins.php: Optimised plugin query.
+
+ * engine/lib/metadata.php: Short circuit added for missing values.
+
+ * engine/lib/plugins.php: Removed old gunk
+
+ * engine/lib/api.php: Load cache php
+
+ * engine/lib/api.php: Changed caching to memory.
+
+ * engine/schema/mysql.sql: Added hmac cache of hmacs we have seen before
+ (MEMORY TABLE)
+
+ * engine/schema/mysql.sql: Added hmac cache of hmacs we have seen before
+ (MEMORY TABLE)
+
+ * engine/lib/api.php: Some api improvements: * User tokens setable * List
+ api no longer requires token
+
+ * engine/schema/mysql.sql: Changed users_apisessions to use memory, since
+ there is no reason to store this forever.
+
+ * languages/de.php: Added german core from Elgg development group
+
+ * engine/lib/system_log.php: System log now using delayed writes.
+
+2008-09-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Marcus Povey: * Some missing indexes added to
+ database. * Removed privileged path table since this is no longer used.
+
+ * engine/lib/elgglib.php: Removed privileged path code since this is no
+ longer used
+
+ * engine/lib/entities.php: Closes #346: More granularity on enable/disable.
+
+ * mod/reportedcontent/languages/it.php: Italian language patch
+
+ * mod/updateclient/languages/it.php: Italian language patch
+
+ * mod/river/languages/it.php: Italian language patch
+
+ * mod/logbrowser/languages/it.php: Italian language patch
+
+ * mod/guidtool/languages/it.php: Italian language patch
+
+ * mod/groups/languages/it.php: Italian language patch
+
+ * mod/diagnostics/languages/it.php: Italian language patch
+
+2008-09-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/userdetails.php: Basic XFN support
+
+2008-09-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php: Added missing translation
+
+2008-09-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: Closes #349: We need to improve
+ detect_extender_valuetype
+
+ * languages/it.php: Closes #348: Thanks for the patch!
+
+ * languages/it.php: Closes #339 : Italian alpha core language pack applied.
+ Thanks for the contribution!
+
+ * engine/lib/languages.php: Improved language completeness algorithm.
+
+2008-09-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/fr.php: Closes #342: Thanks for the updates!
+
+ * engine/lib/languages.php: Minor tweak: Only shows percentage on things
+ less than 100% complete
+
+ * engine/lib/languages.php: Some language helper tools.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Closes #338: You're
+ quite right, this is was an error on our part. Nice spot!
+
+ * engine/lib/languages.php, languages/en.php: Introducing: Admin only
+ translation "completeness" helper.
+
+2008-09-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/es.php: Preliminary spanish translation
+
+ * engine/lib/xml-rpc.php: Refs #172: Removed line endings on spec.
+
+ * mod/diagnostics/languages/fr.php, mod/groups/languages/fr.php,
+ mod/logbrowser/languages/fr.php, mod/reportedcontent/languages/fr.php,
+ mod/river/languages/fr.php, mod/updateclient/languages/fr.php: Closes #298:
+ Thankyou for your contribution!
+
+ * languages/fr.php: Closes #300: Thanks for the translation!
+
+ * languages/en.php, mod/groups/actions/forums/edittopic.php,
+ mod/groups/languages/en.php: Closes #320: Filled in missing translations
+
+2008-09-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/checkboxes.php, views/default/input/radio.php,
+ .../notifications/settings/usersettings.php: Fixes 334: Radio buttons were
+ part of the problem, label and option were the wrong way round (compare with
+ input/checkboxes). Second part of the problem was actually with
+ views/default/notifications/settings/usersettings.php, where the value of the
+ field was incorrectly being extracted from the settings array. Thanks for
+ the spot!
+
+2008-09-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ views/default/admin/plugins_opt/plugin.php: Closes #327: Thanks for the
+ pointer. In the end I modified the fix from the patch you sent, it still uses
+ get but the generated token should make a CSRF attack much harder.
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/resetpassword.php,
+ actions/admin/user/unban.php, .../views/default/profile/menu/adminlinks.php:
+ Fixes #332: Added tokens and action_gatekeeper()
+
+ * engine/lib/database.php: Fixes #330: I implemented the changes you
+ suggested (except for quotes around the table name). What problems did you
+ encounter?
+
+ * mod/reportedcontent/languages/en.php: Refs #331: Trying this again...
+
+ * mod/reportedcontent/languages/en.php,
+ views/default/page_elements/owner_block.php: Closes 331: Removed fixed string
+ in translation. Thanks for the spot!
+
+2008-09-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Set default db to UTF 8... for what it's worth.
+
+2008-09-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Closes #305
+
+ * actions/admin/site/update_basic.php: Fixes #244
+
+ * views/default/settings/system.php: Fixes the regression introduced by
+ [2023]
+
+ * engine/lib/actions.php, engine/lib/sessions.php: Additional per-session
+ random token, additional randomness protection against CSRF. Report problems.
+
+2008-08-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, engine/lib/sessions.php: Some session
+ fingerprinting code. Requires user agent to be consistent across requests.
+
+ * engine/lib/sessions.php: Regenerates session ID on user login. This helps
+ prevent some hijacking attacks.
+
+ * engine/lib/sessions.php: Minor tweak, logout now calls session_destroy()
+
+2008-08-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php, engine/start.php: Closes #313, Fixes #274:
+ Resolved strange OSX language file browsing, including speculative windows
+ fix. Thanks for the patch!
+
+2008-08-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/canvas/layouts/widgets.php,
+ views/default/navigation/toolbox.php,
+ views/default/navigation/topbar_tools.php: Closes #304: Thanks for the patch!
+
+ * languages/en.php: Fixes #275: Thanks for the report!
+
+ * engine/lib/statistics.php, languages/en.php,
+ views/default/admin/statistics_opt/basic.php: Minor tweak to basic stats to
+ clarify number of users in the system.
+
+2008-08-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, engine/lib/users.php, languages/en.php: Closes
+ #254: If mb_string is installed then internationalised usernames are
+ supported in file system. Because of this I have raised mbstring from
+ recommended to a (non-fatal) core requirement. Because of the lack of a
+ unicode ctype_alnum function the validation occurs at username input. Because
+ of this I have improved the user registration code: This code now validates
+ for special chars etc in the username. I have also introduced the following
+ new plugin hooks (which are run after primary validation) which provide
+ plugins with the ability to add other requirements (extra security etc).
+ 'registeruser:validate:password' 'registeruser:validate:username'
+ 'registeruser:validate:email' Marcus Povey 25/8/08
+
+2008-08-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php: Committing kses fix
+
+2008-08-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Fixed ping error. Fixes #269
+
+ * engine/lib/elgglib.php, engine/lib/input.php: Fixed input for people with
+ magic quotes on.
+
+2008-08-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Actually fixes #269
+
+ * actions/systemsettings/install.php: Fixes #269
+
+2008-08-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added plugin hook to elgg_view.
+
+2008-08-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Prelude to release
+
+ * engine/lib/elgglib.php: Fixes #280
+
+ * engine/lib/sessions.php: Blanking session code on initialisation fail
+
+2008-08-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/dashboard.php: Closes #253: Patch provided by
+ edfactor. Thanks for your contribution!
+
+2008-08-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/failsafe/pageshells/pageshell.php: install process password box
+ added
+
+ * views/failsafe/messages/errors/list.php,
+ views/failsafe/pageshells/pageshell.php: increased the size of the input
+ boxes on the install pages to faciliate url checking
+
+2008-08-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Making it case insensitive...
+
+2008-08-20 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/avatar_mini.gif: removed unused image
+
+2008-08-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/input.php, languages/en.php: Refs #273: Extra sanity checking on
+ install
+
+2008-08-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Language change
+
+ * languages/en.php, views/default/settings/system.php,
+ views/failsafe/settings/system.php: Installation clarity fixes
+
+2008-08-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Refs #272: Speculative fix. Added PORT support to
+ current_page_url(). Please test to see if this solves your problem...
+
+ * version.php: Oopsy, wrong package number
+
+ * version.php: Raising point number pre-package
+
+2008-08-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Revised rewrite rules.
+
+2008-08-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Refs #266: Error given if no database has been
+ set up.
+
+ * engine/lib/database.php, engine/lib/elgglib.php, engine/lib/install.php,
+ install.php, languages/en.php,
+ views/failsafe/messages/exceptions/exception.php: Refs #256: Basic
+ installation parameters checked. Fixes #266: If the install flag isn't set
+ then elgg_view will no longer attempt to load data from the database.
+
+ * engine/lib/elgglib.php: Refs #265: If $CONFIG->view not blank then it
+ overrides the session even if the session is set.
+
+ * engine/schema/mysql.sql: Fixes #260: Done. Nice spot.
+
+2008-08-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Small access fix
+
+ * CONTRIBUTORS.txt: And again.
+
+ * CONTRIBUTORS.txt: Minor contributor file fix.
+
+ * engine/lib/access.php: Corrected minor friend collection issue
+
+2008-08-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * CONTRIBUTORS.txt: changed bens twitter account url
+
+2008-08-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php: Moving the disable_entities call
+
+ * engine/lib/elgglib.php: More submenu corrections
+
+ * actions/admin/user/ban.php: Banning a user disables their entities
+
+ * engine/lib/entities.php, engine/lib/users.php: Removing a user disables
+ their entities
+
+2008-08-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Updated for release
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed the submenu
+
+2008-08-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/graphics/defaultmaster.jpg: default image for cropper tool
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php: The top tool menu is now
+ alphabetically sorted.
+
+ * engine/lib/elgglib.php: Submenu items are now sorted.
+
+ * mod/groups/start.php: Renamed groups submenus
+
+ * mod/groups/languages/en.php: Added a missing translation string to groups.
+
+ * mod/groups/start.php: Corrected the 'your groups' link
+
+2008-08-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/spotlight/default.php: spotlight tweaks
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/picker.php: Removed the context menu in the friends
+ picker.
+
+2008-08-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: force tinyMCE editor initial width for safari
+
+ * views/default/page_elements/footer.php: footer updated to fit more links
+
+ * _graphics/spotlight_back.gif, views/default/css.php: Opera fixes and new
+ spotlight back
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * dashboard/index.php, dashboard/latest.php, engine/lib/elgglib.php,
+ languages/en.php, views/default/dashboard/blurb.php: Wired in latest
+ activity, so new users aren't as lonely as they otherwise might be.
+
+2008-08-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ .../views/default/object/groupforumtopic.php: groups listing icon changed
+ from tiny to small latest discussion listing info block styled up
+
+2008-08-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/footer.php: footer tweak
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php: Ensuring that tags are saved correctly in
+ profile
+
+2008-08-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php, views/default/css.php: avatar
+ menu fixes for IE
+
+ * mod/groups/views/default/groups/css.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/javascript.php: avatar menu fix for IE
+ groups and profile pages
+
+2008-08-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * INSTALL.txt: Updated installation instructions
+
+2008-08-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/javascript.php: avatar menu in IE, z-index
+ bug work-around
+
+ * mod/profile/views/default/profile/javascript.php, views/default/css.php:
+ tools menu removed dynamic z-index
+
+2008-08-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/userdetails.php: Removed avatar context
+ menu from large profile picture
+
+ * mod/logbrowser/start.php, .../views/default/logbrowser/adminlinks.php,
+ mod/profile/start.php, .../views/default/profile/menu/adminlinks.php,
+ .../views/default/profile/menu/adminwrapper.php: Admin links are now
+ consolidated
+
+ * engine/lib/users.php: Removing gallery on search user list function
+
+2008-08-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: menu selected item ie6 fix
+
+2008-08-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/spotlight/default.php: a little content added to the
+ spotlight
+
+ * .../views/default/reportedcontent/listing.php: reported content tweak
+
+2008-08-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php, mod/profile/start.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/metatags.php: Individual profile items can
+ now have access restrictions; also made the profile JS more cache friendly
+
+2008-08-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/listing.php, views/default/css.php:
+ reported content updates
+
+ * views/default/css.php: tools settings updated
+
+2008-08-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: lang string missing
+
+2008-08-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: groups widget fixed for ie6
+
+2008-08-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/diagnostics/languages/en.php, mod/diagnostics/start.php: Globals and
+ PHP info added to diagnostics
+
+2008-08-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php: further tweaks on admin
+ settings
+
+ * views/default/admin/plugins_opt/plugin.php: plugin settings moved to
+ hidden dropdown
+
+2008-08-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Code also useless
+
+ * engine/lib/entities.php: Salt free diet
+
+2008-08-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php, views/default/css.php: avatar
+ menu fixed in admin area, admin area h3's fixed
+
+2008-08-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/owner_block_menu_dot.gif, views/default/css.php: owner block
+ menu
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Correction for the search list users by name
+ function.
+
+ * mod/reportedcontent/languages/en.php: A rookie error.
+
+2008-08-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/joinrequest.php:
+ Closes #234: Please use brackets defensively; The statement: if ($user =
+ get_entity($foo) && $group = get_entity($bar)) Will not do what you expect
+ it to do!
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, languages/en.php, search/users.php,
+ views/default/user/search/finishblurb.php: Added proper search for users by
+ name
+
+ * mod/groups/views/rss/forum/topics.php,
+ mod/groups/views/rss/forum/viewposts.php,
+ mod/groups/views/rss/groups/profileitems.php: RSS views for forums
+
+ * views/rss/group/default.php: Group default RSS view
+
+2008-08-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: sidebar arrow position fixed for ie 6 & 7
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, mod/profile/icon.php, mod/profile/javascript.php,
+ views/default/friends/picker.php, views/default/page_elements/header.php:
+ Caching enhancements
+
+2008-08-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: screwed up profile page on ie6 fixed
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php: Added a language entry for reported
+ items (again)
+
+2008-08-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/membership.php: gallery view removed from group lists
+
+ * mod/reportedcontent/index.php: reportedcontent bug sorted
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forms/groups/invite.php: Ensured that all friends
+ come through for group invite
+
+ * mod/groups/views/default/forms/groups/invite.php: Ensured that all friends
+ come through for group invite
+
+ * views/default/page_elements/owner_block.php: Owner block defaults to
+ current logged in user.
+
+ * engine/lib/input.php: Improved the kses whitelist
+
+2008-08-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install.php, views/failsafe/canvas/default.php,
+ views/failsafe/input/button.php, views/failsafe/input/checkboxes.php,
+ views/failsafe/input/form.php, views/failsafe/input/hidden.php,
+ views/failsafe/input/longtext.php, views/failsafe/input/pulldown.php,
+ views/failsafe/input/reset.php, views/failsafe/input/submit.php,
+ views/failsafe/input/text.php, views/failsafe/messages/messages/list.php,
+ views/failsafe/messages/messages/message.php,
+ views/failsafe/pageshells/pageshell.php, views/failsafe/settings/install.php,
+ views/failsafe/settings/system.php: Closes #224: Install now using failsafe
+ views. Please test from scratch (including blanking setup) and make sure it
+ works for you!
+
+2008-08-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/membership.php: groups view tweaked
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php, views/default/navigation/pagination.php,
+ views/default/widgets/wrapper.php: Removed pagination in widgets
+
+ * engine/lib/relationships.php: Added the ability to hide the gallery view
+ on list_entities_from_relationships
+
+ * languages/en.php: Language addition to make it clearer that you need to
+ validate before you can log in.
+
+2008-08-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: group lang bug fixed
+
+ * mod/reportedcontent/actions/add.php,
+ mod/reportedcontent/actions/archive.php,
+ mod/reportedcontent/actions/delete.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/start.php, .../views/default/reportedcontent/css.php,
+ .../views/default/reportedcontent/listing.php: reported content updated
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php: Added a language entry for reported
+ items
+
+2008-08-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: owner block head - divider
+ line method changed to work in ie6
+
+ * views/default/css.php: owner block fixes and blog post tweaks
+
+2008-08-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php, mod/profile/views/default/profile/listing.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/input/checkboxes.php, views/default/search/entity_list.php:
+ Refs #249
+
+2008-08-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, index.php: The front page now only shows content
+ and groups.
+
+2008-08-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/edit.php, views/default/page_elements/owner_block.php: Refs
+ #249
+
+2008-08-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/reportedcontent/languages/en.php,
+ .../views/default/reportedcontent/listing.php: reported content tweaks
+
+2008-08-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/userdetails.php, views/default/css.php: IE
+ 6 & 7 profile page avatar menu and submenu fixed, toolbar new msg icon
+ position,
+
+2008-08-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: owner block changes
+
+2008-08-14 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/reportedcontent/listing.php: reportedcontent list tweaks
+
+2008-08-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed an issue with the submenu.
+
+2008-08-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Fixes #245: Tags now stripped from email
+ messages.
+
+2008-08-14 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/diagnostics/index.php, mod/logbrowser/index.php,
+ mod/reportedcontent/index.php: more owner blocks added
+
+ * admin/plugins/index.php, admin/site/index.php, admin/statistics/index.php,
+ admin/user/index.php: owner block added to admin pages
+
+2008-08-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: collections, friends picker, status, search items
+ updated for IE6
+
+ * views/default/friends/picker.php, views/default/friends/tablelist.php:
+ friends picker table bug fixed and spacing adjusted on collections
+
+2008-08-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Redefined the default submenu item group to 'a',
+ so most usually it will appear on top
+
+ * mod/groups/start.php, views/default/canvas_header/submenu_group.php,
+ views/default/page_elements/owner_block.php: Further submenu clustering
+
+ * engine/lib/elgglib.php, views/default/canvas_header/submenu_group.php:
+ Added the facility to group submenus
+
+2008-08-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js, views/default/css.php: friends picker
+ modified for IE 6
+
+ * _graphics/friends_picker_arrow_left.gif,
+ _graphics/friends_picker_arrow_right.gif: new picker arrows
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/confirm.php, actions/register.php, engine/lib/entities.php,
+ engine/lib/users.php: Closes #227 and #243: Hopefully this has the fscking
+ thing nailed to the wall. Please report any problems, especially is they
+ relate to access permissions (granted when you shouldn't or denied when you
+ should)
+
+ * mod/diagnostics/languages/en.php, mod/diagnostics/start.php: Added session
+ to diagnostics.
+
+ * engine/lib/sessions.php: Fixing some session blanking problems.
+
+ * actions/email/confirm.php, actions/register.php, engine/lib/entities.php,
+ engine/lib/users.php: Reverted changes so users can now register again.
+ There are critical issues with enable/disable. Primarily: 1) A number of
+ functions do not use the access controls, these throw an exception when
+ accessing a disabled entity. 2) #243 does not seem possible.
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: owner block fixed for safari
+ and ie6
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, languages/en.php: Correct menus being used
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/members.php, views/default/css.php: numerous
+ polishing and rendering fixes to groups
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php:
+
+ * actions/admin/user/unban.php, engine/lib/admin.php,
+ engine/lib/entities.php, languages/en.php,
+ .../views/default/profile/menu/adminlinks.php: Refs #237: Added option, now
+ just needs a search listing banned users. Depends #243
+
+ * actions/email/confirm.php, actions/register.php, engine/lib/entities.php:
+ Closes #227. Depends on #243 to work.
+
+ * engine/lib/access.php: Refs #237, #46 and #227: Added override code.
+
+ * engine/lib/entities.php: Actually closes #46
+
+ * views/default/admin/plugins_opt/plugin.php: placeholder for settings
+ toggle
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: login and register boxes fixed
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: Now only displays 'report
+ this' when plugin is enabled.
+
+2008-08-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: Sturdier enhancement for the
+ owner block.
+
+ * index.php, languages/en.php, mod/pages/actions/pages/delete.php,
+ mod/pages/actions/pages/edit.php, mod/pages/actions/pages/editwelcome.php,
+ mod/pages/edit.php, mod/pages/history.php, mod/pages/images/application.png,
+ mod/pages/images/code.png, mod/pages/images/css.png, mod/pages/images/db.png,
+ mod/pages/images/directory.png, mod/pages/images/doc.png,
+ mod/pages/images/file.gif, mod/pages/images/file.png,
+ mod/pages/images/film.png, mod/pages/images/flash.png,
+ mod/pages/images/folder-closed.gif, mod/pages/images/folder.gif,
+ mod/pages/images/folder_open.png, mod/pages/images/html.png,
+ mod/pages/images/java.png, mod/pages/images/linux.png,
+ mod/pages/images/minus.gif, mod/pages/images/music.png,
+ mod/pages/images/pdf.png, mod/pages/images/php.png,
+ mod/pages/images/picture.png, mod/pages/images/plus.gif,
+ mod/pages/images/ppt.png, mod/pages/images/psd.png,
+ mod/pages/images/ruby.png, mod/pages/images/script.png,
+ mod/pages/images/spinner.gif, mod/pages/images/treeview-black-line.gif,
+ mod/pages/images/treeview-black.gif,
+ mod/pages/images/treeview-default-line.gif,
+ mod/pages/images/treeview-default.gif,
+ mod/pages/images/treeview-famfamfam-line.gif,
+ mod/pages/images/treeview-famfamfam.gif,
+ mod/pages/images/treeview-gray-line.gif, mod/pages/images/treeview-gray.gif,
+ mod/pages/images/treeview-red-line.gif, mod/pages/images/treeview-red.gif,
+ mod/pages/images/txt.png, mod/pages/images/xls.png, mod/pages/images/zip.png,
+ mod/pages/index.php, mod/pages/javascript/jquery.treeview.async.js,
+ mod/pages/javascript/jquery.treeview.js, mod/pages/languages/en.php,
+ mod/pages/manifest.xml, mod/pages/new.php, mod/pages/pagesTree.php,
+ mod/pages/start.php, mod/pages/view.php,
+ mod/pages/views/default/annotation/icon.php,
+ mod/pages/views/default/annotation/page.php,
+ mod/pages/views/default/forms/pages/edit.php,
+ .../views/default/forms/pages/editwelcome.php,
+ mod/pages/views/default/object/page.php,
+ mod/pages/views/default/object/page_top.php,
+ mod/pages/views/default/pages/breadcrumbs.php,
+ mod/pages/views/default/pages/css.php,
+ .../views/default/pages/groupprofile_pages.php,
+ mod/pages/views/default/pages/menu.php,
+ mod/pages/views/default/pages/metatags.php,
+ mod/pages/views/default/pages/pagegallery.php,
+ mod/pages/views/default/pages/pagelisting.php,
+ mod/pages/views/default/pages/pageprofile.php,
+ .../views/default/pages/sidebar/sidebarthis.php,
+ mod/pages/views/default/pages/sidebar/starter.php,
+ mod/pages/views/default/pages/sidebar/tree.php,
+ mod/pages/views/default/pages/sidebar/wrapper.php,
+ mod/pages/views/default/pages/welcome.php, mod/pages/welcome.php,
+ mod/pages/world.php: Added a new latest activity title to the front page
+
+ * views/default/page_elements/owner_block.php: The owner block now doesn't
+ display at all if there's no page owner
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php, views/default/css.php: front page
+ login box
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php: Banned now gives a reason why user disabled.
+
+ * engine/lib/entities.php: Added a reason for disabled objects.
+
+ * engine/lib/entities.php: Closes #46: Method for activating an entity. No
+ hookup yet.
+
+ * engine/lib/access.php: Refs #237, #46 and #227: Added active only override
+ to get_access_sql_suffix
+
+2008-08-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/add.php, mod/blog/actions/delete.php,
+ mod/blog/actions/edit.php, mod/blog/add.php, mod/blog/edit.php,
+ mod/blog/everyone.php, mod/blog/friends.php, mod/blog/index.php,
+ mod/blog/languages/en.php, mod/blog/manifest.xml, mod/blog/read.php,
+ mod/blog/start.php, mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/gallery.php,
+ mod/blog/views/default/blog/listing.php,
+ mod/blog/views/default/blog/menu.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/view.php, mod/blog/views/default/object/blog.php,
+ mod/blog/views/default/river/blog/annotate.php,
+ mod/blog/views/default/river/blog/create.php,
+ mod/blog/views/default/river/blog/update.php: This shouldn't be here!
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/delete.php, engine/lib/group.php,
+ engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php: Fixes
+ #241: Changed order, delete user using object's delete method rather than the
+ low level function
+
+2008-08-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: Removed page handler default errors
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: widget boxes fixed for IE
+
+2008-08-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Added a page handler for the dashboard
+
+2008-08-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/useradd.php, engine/lib/sessions.php: Fixes #238: Problem was
+ caused by authenticate not having the user email validated flag set.
+ Introduced new flag ->admin_created to distinguish between the two types.
+
+2008-08-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php: A warning fix for the dashboard
+ layout.
+
+ * views/default/input/button.php, views/default/input/form.php: Some safety
+ fixes for the new form views
+
+ * engine/lib/elgglib.php: Only log warnings in debug mode.
+
+ * mod/blog/actions/add.php, mod/blog/actions/delete.php,
+ mod/blog/actions/edit.php, mod/blog/add.php, mod/blog/edit.php,
+ mod/blog/everyone.php, mod/blog/friends.php, mod/blog/index.php,
+ mod/blog/languages/en.php, mod/blog/manifest.xml, mod/blog/read.php,
+ mod/blog/start.php, mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/gallery.php,
+ mod/blog/views/default/blog/listing.php,
+ mod/blog/views/default/blog/menu.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/view.php, mod/blog/views/default/object/blog.php,
+ mod/blog/views/default/river/blog/annotate.php,
+ mod/blog/views/default/river/blog/create.php,
+ mod/blog/views/default/river/blog/update.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ .../canvas/layouts/two_column_right_sidebar.php,
+ views/default/input/form.php: Removing some messages
+
+ * engine/lib/pagehandler.php: Removing an error log entry in the page
+ handler function
+
+ * engine/lib/elgglib.php: Fixed select class issue for submenus
+
+ * search/index.php: Reinstated search label.
+
+ * mod/logbrowser/start.php, mod/profile/start.php: Admin links on profile
+ pages and in user context menus appear at the bottom.
+
+ * mod/profile/views/default/profile/userdetails.php: The profile edit button
+ is now wired up so that admins can edit any user.
+
+ * engine/lib/access.php, engine/lib/admin.php: Admins now see all!
+
+2008-08-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: extra float clear for ie6
+
+ * _graphics/icon_gallery.gif: new gallery icon
+
+ * _graphics/blockquote.png, _graphics/dummy_river_icon.gif,
+ _graphics/footer_logo.gif: removed images not used
+
+ * _graphics/icon_bookmarkthis.gif, _graphics/icon_reportthis.gif,
+ views/default/css.php: owner block additional icons
+
+2008-08-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/reportedcontent/listing.php: small tweak to reported
+ content
+
+ * mod/reportedcontent/actions/add.php, mod/reportedcontent/add.php,
+ mod/reportedcontent/index.php, mod/reportedcontent/languages/en.php,
+ mod/reportedcontent/manifest.xml, mod/reportedcontent/start.php,
+ .../views/default/reportedcontent/form.php,
+ .../views/default/reportedcontent/listing.php,
+ .../views/default/reportedcontent/user_report.php: report content added as a
+ core plugin. Still needs a couple of bits wired up.
+
+ * views/default/page_elements/owner_block.php: owner block tweaked to add
+ report this
+
+2008-08-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Removed superadmin access controls. You can't call
+ get_entity from within get_access_sql_suffix and get_access_array as it
+ causes an infinite loop. The only safe way to do this is via a plugin hook.
+
+ * actions/systemsettings/install.php: Refs #232: Diagnostics now on by
+ default on new installs.
+
+ * mod/diagnostics/actions/download.php, mod/diagnostics/index.php,
+ mod/diagnostics/languages/en.php, mod/diagnostics/manifest.xml,
+ mod/diagnostics/start.php, .../views/default/diagnostics/forms/download.php:
+ Closes #232: Produces a basic report plus checksums of all files in md5sum
+ format. To add extra information to this report add a plugin hook listening
+ to: 'diagnostics:report' And append to $returnvalue which is a simple text
+ buffer.
+
+2008-08-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: sidebar menu additions
+
+ * _graphics/icons/default/large.png, _graphics/icons/default/medium.png,
+ _graphics/icons/default/small.png, _graphics/icons/default/tiny.png: new
+ default entity icons
+
+2008-08-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Further access additions for admins.
+
+ * engine/lib/access.php: Admins can now see private data.
+
+ * mod/groups/views/default/forms/groups/invite.php: Group invites now uses
+ the friends picker.
+
+2008-08-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/owner_block.php: bookmark this and report this
+ (still to be wired up) added to the owner block
+
+2008-08-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/register.php, actions/useradd.php, engine/lib/users.php: Closes
+ #229: Admin signup now using different view + no password validation for
+ admin signup
+
+ * actions/register.php, engine/lib/exceptions.php, engine/lib/users.php,
+ languages/en.php, views/default/account/forms/register.php: Refs #229 :
+ Register now has more granular messages, dupe email checkiong, sanitisation +
+ fill in the blanks failure mode! (yay)
+
+2008-08-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/members.php, views/default/css.php: groups
+ pages interface fixes/cleanup
+
+2008-08-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Improved front page.
+
+ * mod/groups/start.php: Groups now links to a better place when you're
+ logged out.
+
+2008-08-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Slight tweak to rewrite rules.
+
+ * actions/systemsettings/install.php: Forward not gatekeeper
+
+2008-08-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: pagination display tweaked
+
+2008-08-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/views/default/logbrowser/css.php, views/default/css.php:
+ settings and admin pages cleaned
+
+2008-08-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, index.php, views/default/welcome/logged_out.php:
+ Added latest content to the front page
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/form.php: Logic error
+
+ * actions/friends/deletecollection.php: Refs #228: Will now error if
+ collection can not be deleted
+
+2008-08-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php:
+
+ * javascript/initialise_elgg.js: toggle more info button for admin panel
+ added
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/form.php: Added ability to disable security
+ enhancements on form (for certain cases)
+
+2008-08-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, search/index.php: Clearer titles for search
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/forms/edit.php:
+
+ * actions/friends/addcollection.php, views/default/friends/forms/edit.php:
+ Refs #210 & #211: Friends form moved to action_gatekeeper code.
+
+2008-08-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: Improved search submenu items
+
+ * languages/en.php: A clearer registration message.
+
+ * engine/lib/notification.php: Downgraded UTF support in the email
+ notification function to optional
+
+2008-08-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins_opt/plugin.php: plugin admin layout tweaks
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, languages/en.php: Minor bugfix to
+ actions_gatekeeper()
+
+ * engine/schema/mysql.sql: Usernames now unique
+
+2008-08-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/settings/system.php: further admin layout tweak
+
+ * views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php: further admin layout tweaks
+
+ * .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php: user settings tweaks
+
+ * .../notifications/settings/usersettings.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php: user settings tweaked
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/comments/add.php, views/default/comments/forms/edit.php: Refs #210
+ & #211 : Updated comments form
+
+ * actions/widgets/save.php, views/default/widgets/editwrapper.php: Refs #210
+ & #211 : Widgets edit now using action_gatekeeper
+
+ * views/default/input/form.php: Minor modifications to form.
+
+2008-08-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/grouplisting.php,
+ mod/profile/views/default/profile/listing.php: Added class to user and group
+ details
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ actions/usersettings/save.php, views/default/settings/system.php,
+ views/default/usersettings/form.php: Refs #210 & #211 : Some more core
+ settings / admin pages moved to use admin_gatekeeper. Install script action
+ now also refuses to be run if the site has already been installed.
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ views/default/object/plugin.php: Refs #210 & #211 : Plugins settings
+ converted.
+
+2008-08-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/toolbar_messages_icon.gif, views/default/css.php,
+ views/default/welcome/logged_in.php, views/default/welcome/logged_out.php:
+ toolbar messages icon rollover state added. Logged in/out front page wrapped
+ in paragraph tags
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/basic_elements/login.php: Removed basic_elements/login ...
+ didn't seem to be used and is duped by main login.
+
+ * actions/register.php, actions/useradd.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php: Refs #210 & #211
+
+2008-08-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/users.php,
+ search/index.php: Added a search submenu.
+
+2008-08-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/user/requestnewpassword.php, languages/en.php:
+ Refs #210 & #211
+
+2008-08-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/widgets/a_users_groups/view.php: group profile widget
+ tweaked
+
+2008-08-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Closes #223
+
+2008-08-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: top toolbar elements fixed for ie
+
+ * views/default/css.php, views/default/navigation/pagination.php: pagination
+ overlap in ie fixed
+
+ * javascript/friendsPickerv1.js, views/default/css.php:
+
+ * views/default/css.php:
+
+2008-08-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php,
+ .../views/default/widgets/a_users_groups/edit.php,
+ .../views/default/widgets/a_users_groups/view.php: a simple widget that
+ displays a users groups on their profile
+
+ * mod/groups/views/default/groups/grouplisting.php: group listings now
+ include the brief description
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/users.php,
+ mod/groups/actions/forums/addtopic.php, mod/groups/addtopic.php,
+ mod/groups/topicposts.php: Major access fix.
+
+ * engine/lib/entities.php, engine/lib/group.php: Solved write issues in
+ groups for non-admin users.
+
+ * README.txt: Slight readme update.
+
+ * CONTRIBUTORS.txt, account/forgotten_password.php,
+ actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ actions/admin/site/update_basic.php, actions/admin/user/ban.php,
+ actions/admin/user/delete.php, actions/admin/user/makeadmin.php,
+ actions/admin/user/resetpassword.php, actions/email/save.php,
+ actions/entities/delete.php, actions/import/opendd.php,
+ .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/user/language.php, actions/user/name.php, actions/user/password.php,
+ actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ actions/useradd.php, admin/plugins/index.php, admin/site/index.php,
+ admin/statistics/index.php, admin/user/index.php,
+ engine/handlers/cron_handler.php, engine/handlers/xml-rpc_handler.php,
+ engine/lib/admin.php, engine/lib/annotations.php, engine/lib/api.php,
+ engine/lib/cache.php, engine/lib/entities.php, engine/lib/exceptions.php,
+ engine/lib/export.php, engine/lib/extender.php, engine/lib/filestore.php,
+ engine/lib/group.php, engine/lib/input.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, engine/lib/notification.php,
+ engine/lib/opendd.php, engine/lib/pam.php, engine/lib/ping.php,
+ engine/lib/plugins.php, engine/lib/query.php, engine/lib/relationships.php,
+ engine/lib/river.php, engine/lib/sites.php, engine/lib/statistics.php,
+ engine/lib/system_log.php, engine/lib/tags.php, engine/lib/usersettings.php,
+ engine/lib/xml-rpc.php, engine/lib/xml.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/edit.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/groups/all.php, mod/groups/discussions.php,
+ mod/groups/edit.php, mod/groups/graphics/icon.php,
+ mod/groups/groupprofile.php, mod/groups/index.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/membership.php, mod/groups/new.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/group/group.php,
+ mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/icon.php,
+ .../default/river/ElggRelationship/create.php,
+ mod/groups/views/default/sharing/invite.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php, mod/guidtool/export.php,
+ mod/guidtool/format_picker.php, mod/guidtool/import.php,
+ mod/guidtool/index.php, mod/guidtool/languages/en.php,
+ mod/guidtool/start.php, mod/guidtool/view.php,
+ .../views/default/forms/guidtool/export.php,
+ .../views/default/forms/guidtool/format.php,
+ .../views/default/forms/guidtool/import.php,
+ mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php,
+ mod/guidtool/views/default/guidtool/profile.php,
+ .../views/default/object/guidtoolwrapper.php, mod/logbrowser/index.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ mod/logbrowser/views/default/object/logwrapper.php,
+ mod/profile/actions/cropicon.php, mod/profile/actions/edit.php,
+ mod/profile/actions/iconupload.php, mod/profile/edit.php,
+ mod/profile/editicon.php, mod/profile/icon.php, mod/profile/index.php,
+ mod/profile/javascript.php, mod/profile/start.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/userdetails.php, mod/river/start.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/edit.php,
+ .../default/widgets/river_widget_friends/view.php,
+ mod/updateclient/languages/en.php, mod/updateclient/start.php,
+ .../views/default/settings/updateclient/edit.php, services/api/rest.php,
+ services/export/handler.php, settings/statistics/index.php,
+ settings/user/index.php, views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/useradd.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/admin/plugins.php,
+ views/default/admin/plugins_opt/plugin.php, views/default/admin/site.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php, views/default/api/output.php,
+ views/default/comments/forms/edit.php, views/default/export/entity.php,
+ views/default/export/metadata.php, views/default/export/relationship.php,
+ views/default/graphics/icon.php, views/default/group/default.php,
+ views/default/input/button.php, views/default/input/form.php,
+ views/default/input/hidden.php, views/default/input/reset.php,
+ views/default/input/submit.php, .../notifications/settings/usersettings.php,
+ views/default/object/default.php, views/default/object/object.php,
+ views/default/object/plugin.php, views/default/output/iframe.php,
+ views/default/river/ElggRelationship/create.php,
+ views/default/river/dashboard.php, views/default/site/default.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php,
+ views/failsafe/pageshells/pageshell.php, views/foaf/pageshells/pageshell.php,
+ views/json/api/output.php, views/json/canvas/default.php,
+ views/json/export/entity.php, views/json/export/metadata.php,
+ views/json/export/relationship.php, views/json/group/default.php,
+ views/json/messages/exceptions/exception.php, views/json/object/default.php,
+ views/json/pageshells/pageshell.php, views/json/search/entity_list.php,
+ views/json/site/default.php, views/json/user/default.php,
+ views/opendd/canvas/default.php, views/opendd/export/entity.php,
+ views/opendd/export/metadata.php, views/opendd/export/relationship.php,
+ views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/site/default.php, views/opendd/user/default.php,
+ views/php/api/output.php, views/php/canvas/default.php,
+ views/php/export/entity.php, views/php/export/metadata.php,
+ views/php/export/relationship.php, views/php/group/default.php,
+ views/php/messages/exceptions/exception.php, views/php/object/default.php,
+ views/php/pageshells/pageshell.php, views/php/search/entity_list.php,
+ views/php/site/default.php, views/php/user/default.php,
+ views/xml/api/output.php, views/xml/messages/exceptions/exception.php,
+ views/xml/pageshells/pageshell.php, views/xml/xml-rpc/output.php: Adjusted
+ contributors file.
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/forms/guidtool/export.php,
+ mod/profile/views/default/profile/icon.php,
+ views/default/canvas/layouts/widgets.php, views/default/input/button.php,
+ views/default/messages/exceptions/exception.php,
+ views/failsafe/messages/exceptions/exception.php: Remaining htmlentities
+ calls converted to utf-8
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * INSTALL.txt: Small formatting correction to the install file.
+
+ * CONTRIBUTORS.txt, INSTALL.txt, README.txt: Added content to stub files
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/confirm.php, engine/lib/notification.php,
+ engine/lib/users.php, languages/en.php: Closes #221: Body and subject now
+ internationalised.
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: The title no longer causes a WSOD
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/checkboxes.php, views/default/input/hidden.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Refs #206:
+ Hopefully the last of it. Please remember to use htmlentities($foo, null,
+ 'UTF-8'); whenever using htmlentities!
+
+2008-08-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php:
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/icon.php: Refs #206: A better solution
+
+ * mod/profile/views/default/profile/icon.php: Refs #206; Icons title now
+ displayed correctly
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/canvas/layouts/widgets.php: Added extra
+ translation strings to the widget canvas
+
+2008-08-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/navigation/pagination.php: pagination
+ "..." fixed
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/addtopic.php, mod/groups/discussions.php,
+ mod/groups/edittopic.php, mod/groups/topicposts.php: Removing some wsod
+ issues
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php, views/default/page_elements/header.php,
+ views/default/pageshells/pageshell.php: Refs #206: Character encoding on both
+ widget and main page now UTF-8
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Group forums should work
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, views/default/input/form.php: Closes #220: Removed
+ action from hash. Timestamp should make this unpredictable enough.
+
+ * views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php, views/default/input/access.php,
+ views/default/input/button.php, views/default/input/checkboxes.php,
+ views/default/input/email.php, views/default/input/file.php,
+ views/default/input/longtext.php, views/default/input/password.php,
+ views/default/input/pulldown.php, views/default/input/radio.php,
+ views/default/input/reset.php, views/default/input/submit.php,
+ views/default/input/tags.php, views/default/input/text.php,
+ views/default/input/url.php: Refs #211: Two forms converted + extra
+ functionality to input views
+
+ * engine/lib/dummy.php: Removed dummy
+
+2008-08-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/css.php: continuation of cleanup on groups
+
+2008-08-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Friendly titles no longer have more than one
+ hyphen in a row
+
+2008-08-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php,
+ mod/groups/views/default/groups/forum_latest.php: latest discussions widget
+
+2008-08-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: Put minor fix back
+
+2008-08-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: lang tweak on groups
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php, engine/lib/sessions.php: Removed ElggDummy live
+ code for now.
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/css.php: groups css added
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/statistics.php: Elgg.org -> elgg.com
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/members.php: Group forum additions
+
+ * mod/groups/languages/en.php: Small grammar correction
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/deletepost.php, mod/groups/start.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/groups/forum_latest.php: more group tweaks
+
+2008-08-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js: updated, cleaned-up, credited, and tweaked
+ friends picker
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/group.php, engine/lib/objects.php,
+ engine/lib/sites.php, engine/lib/users.php: Centralised set and get magic
+ functions to the tlc. Added isset and unset magic methods. Report any
+ problems!
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php: Slight change to group vocabulary.
+
+ * mod/groups/topicposts.php,
+ mod/groups/views/default/groups/groupprofile.php: Wired up group member count
+ and fixed topic page title
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/addpost.php: group tweak
+
+ * .../views/default/object/groupforumtopic.php: changed the latest
+ discussion view
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: removed print_r
+
+ * engine/lib/dummy.php, engine/lib/pageowner.php, engine/lib/sessions.php,
+ views/default/page_elements/title.php: Refs #174: Introducing the ElggDummy
+ class which returns false for all methods and set variables called on it.
+ This is what the logged out $_SESSION['user'] is set to and is also what
+ page_owner_entity will return if page_owner is invalid. This means that
+ calls to things like $_SESSION['user']->getGUID() are now safe and will no
+ longer cause a parsing error. Please report any issues.
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Adjusted list_entities_from_annotations to
+ hide the gallery view by default
+
+ * .../views/default/object/groupforumtopic.php: Minor language change to
+ group topics
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/discussions.php, mod/groups/languages/en.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ .../views/default/object/groupforumtopic.php: more group profile work
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/index.php, mod/groups/languages/en.php,
+ mod/groups/membership.php, mod/groups/start.php: Added a 'member of' groups
+ page and made it default
+
+ * engine/lib/access.php, mod/groups/start.php, mod/profile/start.php: Fixed
+ access permissions wrt groups
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php: new tools menu added -
+ latest discussion
+
+ * mod/groups/languages/en.php,
+ mod/groups/views/default/groups/forum_latest.php: forum latest for group
+ profile page
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Removed an extra sanitise_string call in
+ update_annotations
+
+2008-08-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/forums/addpost.php,
+ mod/groups/actions/forums/addtopic.php,
+ mod/groups/actions/forums/deletetopic.php,
+ mod/groups/actions/forums/edittopic.php, mod/groups/addtopic.php,
+ mod/groups/edittopic.php, mod/groups/forum.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/topicposts.php,
+ mod/groups/views/default/forms/forums/addpost.php,
+ mod/groups/views/default/forms/forums/addtopic.php,
+ .../views/default/forms/forums/edittopic.php,
+ mod/groups/views/default/forum/topicposts.php,
+ mod/groups/views/default/forum/topics.php,
+ mod/groups/views/default/forum/viewposts.php,
+ mod/groups/views/default/groups/forum_latest.php,
+ mod/groups/views/default/groups/profileitems.php: groups now have forums
+
+2008-08-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/toolbar_arrow_ie.gif, views/default/css.php,
+ views/default/navigation/topbar_tools.php: new dropdown toolbar menu that
+ works corss platform. Widget page layout fixed for ie6 & 7
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Refs #210: Will trigger a plugin hook
+ 'action_gatekeeper:permissions:check'.
+
+ * views/default/page_elements/title.php: Refs #174: Checking that session
+ user exists before calling methods on it
+
+ * install.php: Install site secret
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/languages/en.php, mod/logbrowser/start.php,
+ .../views/default/logbrowser/adminlinks.php: Added explore log option to user
+ context menu, albeit in the wrong place.
+
+ * languages/en.php, views/default/admin/statistics.php: Direct link from
+ statistics through to elgg.org
+
+ * languages/en.php: Adjusted statistics message
+
+ * languages/en.php, views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php: Updated admin statistics
+
+ * engine/lib/system_log.php: You can now filter by ID.
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/graphics/icon.php: Minor tweaks to the default icon
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/views/default/object/logwrapper.php: Easy drilldown into
+ logs
+
+ * engine/lib/system_log.php: System log functions now allow searching.
+
+ * mod/logbrowser/index.php, mod/logbrowser/languages/en.php,
+ mod/logbrowser/start.php, mod/logbrowser/views/default/logbrowser/css.php,
+ mod/logbrowser/views/default/logbrowser/form.php,
+ mod/logbrowser/views/default/object/logwrapper.php: The log browser is now
+ searchable.
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, languages/en.php: Closes #218
+
+2008-08-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/index.php, mod/logbrowser/start.php,
+ .../views/default/logbrowser/gallery.php,
+ .../views/default/logbrowser/listing.php,
+ mod/logbrowser/views/default/object/logwrapper.php: Initial changes to log
+ browser
+
+2008-08-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/form.php: Todo has been done
+
+2008-08-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: collections, pages nav and numerous other fixes
+
+ * views/default/css.php: breadcrumbs sorted
+
+ * mod/groups/views/default/groups/groupprofile.php, views/default/css.php:
+ groups styles and group owner layout changed
+
+2008-08-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: title block tweaked
+
+2008-08-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/owner_block_menu_arrow.gif, views/default/css.php: owner block
+ menu 'selected' style added
+
+2008-08-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/profileitems.php: group profile layout
+ tweaked
+
+2008-08-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Edited container-related permissions.
+
+2008-08-06 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/profileitems.php: group profile tweak
+
+ * mod/groups/groupprofile.php: group profile tweak
+
+ * mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/members.php,
+ mod/groups/views/default/groups/profileitems.php: group profile layout
+ tweaked
+
+2008-08-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/opendd.php, .../views/default/forms/guidtool/import.php:
+ Example of usage (Refs #210), also refs #211.
+
+ * views/default/messages/exceptions/exception.php: Tidied up exception
+
+ * engine/lib/actions.php, languages/en.php, views/default/input/button.php,
+ views/default/input/form.php: Refs #210 and #211
+
+2008-08-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/page_elements/footer.php: footer
+ links update, changes to gallery view
+
+2008-08-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/button.php: Images and security fixes
+
+ * views/default/input/button.php, views/default/input/reset.php,
+ views/default/input/submit.php: Closes #212
+
+2008-08-06 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/navigation/topbar_tools.php: tool menu
+ slide effect removed, language file changed for dashboatrd instructions
+
+2008-08-06 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/hidden.php: Closes #209
+
+ * views/default/input/form.php: Closes #208
+
+ * account/forgotten_password.php: Fixes #207: Thanks for your report eike!
+
+2008-08-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: river additions
+
+ * views/default/css.php: toolbar fixes and register box positioning fixed
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/sessions.php: Tweaked the way
+ forwarding works.
+
+ * engine/lib/access.php, engine/lib/group.php, mod/groups/start.php: Fixed
+ group-specific access controls, and site-specific access controls
+
+2008-08-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/river_icons/river_icon_bookmarks.gif,
+ _graphics/river_icons/river_icon_shares.gif,
+ _graphics/river_icons/river_icon_status.gif,
+ _graphics/toolbar_messages_icon.gif, views/default/css.php: numerous fixes to
+ messageboard, status, river icons,
+
+2008-08-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Log though will now not store a url relating to an
+ action... it is now possible to log in again if you are logged out! :D
+
+ * engine/lib/river.php, engine/lib/system_log.php: Fixes #121 and #143.
+ Please confirm.
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/logbrowser/index.php, mod/logbrowser/start.php: The log browser is now
+ a part of the admin panel.
+
+ * engine/lib/widgets.php: Fixed an issue where the third widget column drops
+ widgets.
+
+ * views/default/canvas/layouts/widgets.php: Widget layout update
+
+2008-08-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php: Fixes #204
+
+ * actions/login.php, engine/lib/elgglib.php: Closes #196: Stores last
+ forwarded page in session, this is used by logon to forward page to correct
+ location. Also fixed current_page_url() which was introducing a superfluous
+ "/" before $_SERVER['REQUEST_URI']
+
+2008-08-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/toolbar_messages_icon.gif, views/default/css.php,
+ views/default/page_elements/elgg_topbar.php: topbar with message count and
+ icon
+
+2008-08-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php: largest avatar size changed from 600
+ to 550
+
+ * mod/profile/editicon.php: icon crop area layout tweaked
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Tagging issue on unsaved entities: solved.
+
+2008-08-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Speculative fix for metadata issue.
+
+ * engine/lib/entities.php: Actually fixes #202
+
+ * engine/lib/elgglib.php, engine/lib/entities.php: Fixes #202 : Listen to
+ plugin hook 'entity:icon:url', which passes parameters: 'entity' The entity
+ 'viewtype' The view (eg 'default') 'size' The size (eg, large, tiny etc) You
+ should return a url for the object's icon if you can.. otherwise return
+ nothing at all.
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Fixed accidental group link error
+
+ * views/default/account/forms/login.php: Removed an annoying notify error
+
+2008-08-05 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidtool/views/default/guidtool/listing.php: Using correct entity for
+ icon.
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install.php: The install script uses the one column layout
+
+2008-08-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/groupprofile.php: more group profile
+ layout tweaks
+
+ * mod/groups/views/default/groups/groupprofile.php: group profile tweaked
+
+2008-08-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php:
+
+2008-08-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/edit.php, mod/groups/index.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/groups/grouplinks.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/menu/actions.php,
+ .../views/default/groups/menu/adminlinks.php,
+ mod/groups/views/default/groups/menu/links.php,
+ .../views/default/groups/menu/ownerlinks.php: Moved group links to the
+ sidebar
+
+2008-08-05 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/powered_by_elgg_badge_drk_bckgnd.gif,
+ _graphics/powered_by_elgg_badge_light_bckgnd.gif,
+ views/default/page_elements/footer.php: powered by badge in footer
+
+2008-08-05 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php, mod/groups/views/default/groups/items.php,
+ mod/groups/views/default/groups/profileitems.php: group profile view tweaked
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/index.php, admin/plugins/index.php, admin/site/index.php,
+ admin/statistics/index.php, admin/user/index.php, engine/lib/admin.php,
+ engine/lib/entities.php, views/default/account/forms/useradd.php,
+ views/default/admin/user_opt/adduser.php,
+ views/default/admin/user_opt/search.php: Further changes to the admin panel
+
+2008-08-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/views/default/groups/items.php: groups profile page layout
+ tweak
+
+ * mod/groups/edit.php, mod/groups/groupprofile.php,
+ mod/groups/languages/en.php, mod/groups/views/default/groups/items.php,
+ mod/groups/views/default/groups/members.php: new group profile views
+
+2008-08-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php: Minor improvement to guid
+ tool
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * settings/index.php, settings/statistics/index.php,
+ settings/user/index.php, .../notifications/settings/usersettings.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php: User changes to settings
+
+ * engine/lib/users.php, engine/lib/usersettings.php, languages/en.php,
+ mod/profile/languages/en.php, mod/profile/start.php, settings/index.php,
+ settings/plugins/index.php, settings/statistics/index.php,
+ settings/user/index.php, .../notifications/settings/usersettings.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php,
+ views/default/usersettings/statistics.php,
+ .../usersettings/statistics_opt/numentities.php,
+ .../default/usersettings/statistics_opt/online.php: User settings
+
+2008-08-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/xml-rpc.php: Error message bugfix
+
+ * mod/guidtool/index.php, mod/guidtool/languages/en.php,
+ mod/guidtool/start.php: Adapted to use new menus.
+
+ * services/export/handler.php: Handler output made a little more pretty.
+
+ * mod/guidtool/export.php, mod/guidtool/format_picker.php,
+ mod/guidtool/import.php, mod/guidtool/index.php, mod/guidtool/view.php,
+ mod/logbrowser/index.php: Using the new view
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed the container_guid override.
+
+2008-08-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/navigation/topbar_tools.php,
+ views/default/page_elements/footer.php: updates to toolbar menu fixes, error
+ messages, owner block
+
+2008-08-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/entities/delete.php, languages/en.php,
+ views/default/group/default.php, views/default/object/default.php,
+ views/default/site/default.php: Fixes #199
+
+ * engine/lib/xml-rpc.php: XML-RPC helper functions suggested by Misja
+
+2008-08-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: search layout tweaked
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/metadata.php, search/index.php,
+ views/default/search/entity_list.php: Hidden viewtype toggle on search.
+
+ * views/default/page_elements/owner_block.php: Added owner_block/extend to
+ the owner block
+
+2008-08-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * LICENCE.txt: Refs #197: Added placeholders & gpl 2 licence.
+
+ * engine/lib/sessions.php, engine/lib/users.php, engine/schema/mysql.sql:
+ Closes #193: Added salt field to database and new users will be generated
+ with salted passwords. Existing users remain unchanged and should still be
+ able to log in. Requires a schema change and the following code run against
+ the database: alter table elggusers_entity add column salt varchar(8)
+ NOT NULL default '' after password;
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../canvas/layouts/narrow_right_sidebar.php,
+ views/default/canvas/layouts/two_column.php: Removed old, no-longer-necessary
+ canvas areas.
+
+2008-08-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * account/forgotten_password.php, account/register.php,
+ actions/systemsettings/install.php, languages/en.php,
+ views/default/account/forms/forgotten_password.php,
+ views/default/account/forms/login.php: Closes #195 & #191
+
+2008-08-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Altered pagination so that it
+ does display if we already have an offset.
+
+2008-08-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/edit.php: profile edit layout altered
+
+ * views/default/page_elements/title.php: tweaked the old title block - we no
+ longer need the user avatar now we have the owner block.
+
+ * mod/groups/all.php, mod/groups/groupprofile.php, mod/groups/index.php,
+ mod/groups/invite.php, mod/groups/languages/en.php, mod/groups/new.php,
+ mod/groups/start.php: some work on groups to make them work with the new
+ layout
+
+ * mod/profile/languages/en.php, mod/profile/start.php,
+ views/default/page_elements/owner_block.php: brief description added to the
+ owner block and profile
+
+ * views/default/navigation/pagination.php: pagination now only displays if
+ there is content to paginate through
+
+2008-08-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: minor interface fixes
+
+2008-08-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/annotation/default.php: Default annotation RSS view.
+
+2008-08-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/icon_odd.gif, _graphics/icon_rss.gif,
+ _graphics/owner_block_back.jpg,
+ mod/profile/views/default/profile/userdetails.php, views/default/css.php:
+ more interface fixes and improvements. Icons and background added to owner
+ block
+
+2008-08-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/canvas/default.php, views/foaf/friends/list.php,
+ views/foaf/search/entity_list.php, views/foaf/user/default.php: Fixed FOAF
+ view
+
+ * friends/index.php, friends/of.php,
+ mod/profile/views/default/user/default.php, views/default/user/default.php,
+ views/rss/user/default.php: Fixed RSS and OpenDD feeds for users
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/json/canvas/default.php, views/json/group/default.php,
+ views/json/object/default.php, views/json/search/entity_list.php,
+ views/json/site/default.php, views/json/user/default.php,
+ views/php/canvas/default.php, views/php/group/default.php,
+ views/php/object/default.php, views/php/search/entity_list.php,
+ views/php/site/default.php, views/php/user/default.php: PHP and JSON entity
+ list views... which should work.
+
+2008-08-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixed erroneous friends link issue
+
+ * views/default/page_elements/header.php,
+ views/default/page_elements/owner_block.php,
+ views/opendd/search/entity_list.php: Fixed OpenDD feeds
+
+ * languages/en.php, views/default/page_elements/owner_block.php: RSS and
+ OpenDD feeds autolink in owner block
+
+ * actions/user/spotlight.php, engine/lib/users.php,
+ views/default/page_elements/spotlight.php: Spotlight state persists.
+
+2008-08-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: friends picker modified, minor fixes and css
+ cleanup / re-sort
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/user/passwordreset.php, actions/user/requestnewpassword.php,
+ engine/lib/users.php, languages/en.php: Refs #191: Actions for resetting
+ passwords, but no front end as yet. To request a password reset access
+ http://..../actions/user/requestnewpassword/?username=username
+
+2008-08-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php, views/default/css.php: river
+ updated, widget layout fixed, page block tweaked,
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php: GUIDTool now displays some
+ generic information about entities where available.
+
+2008-08-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/reorder.php, engine/lib/widgets.php, entities/index.php,
+ views/default/canvas/layouts/widgets.php: Widgets now work in three columns
+
+ * engine/lib/elgglib.php: Introducing the new pagesetup event.
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Message changes, refs #190
+
+ * mod/guidtool/start.php: Guidtool only available to admins
+
+ * engine/lib/entities.php, engine/lib/users.php: Changed so that
+ validated_email flag written as null user. Refs #190. Also confirms fix and
+ closes #104.
+
+2008-08-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/metadata.php: The metadata permissions
+ check now passes along (optionally) the specific piece of metadata. Refs #104
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Closes #190. Note however that logins will be
+ broken until #104 has been resolved!
+
+ * actions/import/opendd.php, engine/lib/input.php: Fixes #194
+
+ * actions/import/opendd.php: Refs #194
+
+2008-08-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, entities/index.php,
+ .../canvas/layouts/two_column_left_sidebar.php,
+ views/default/page_elements/owner_block.php: Introducing the consistent owner
+ block
+
+2008-08-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Fixed what I presume was an error: namely it was
+ using $site instead of $guid in get_entity
+
+2008-07-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php: delete collection action - div
+ prevented from showing
+
+2008-07-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/deletecollection.php, languages/en.php: Collections now
+ delete successfully
+
+2008-07-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collections.php: temporarily allow h2 click to
+ propagate through to delete button
+
+2008-07-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/opendd.php: Bugfix
+
+2008-07-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/pickercallback.php, views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/tablelist.php,
+ views/default/friends/tablelistcountupdate.php: Counts now update when you
+ save a friends collection
+
+ * engine/lib/access.php, views/default/friends/picker.php: More updates for
+ collections - save now works properly.
+
+ * actions/friends/editcollection.php: Removing the reference to the
+ collection name for now
+
+ * actions/friends/editcollection.php, engine/lib/access.php,
+ friends/pickercallback.php, languages/en.php,
+ views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php,
+ views/default/friends/forms/collectionfields.php,
+ views/default/friends/forms/edit.php, views/default/friends/picker.php:
+ Picker saves correctly!
+
+2008-07-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/iframe.php: Added iframe output
+
+ * mod/guidtool/export.php, mod/guidtool/format_picker.php,
+ mod/guidtool/import.php, mod/guidtool/index.php,
+ mod/guidtool/languages/en.php, mod/guidtool/start.php, mod/guidtool/view.php,
+ .../views/default/forms/guidtool/export.php,
+ .../views/default/forms/guidtool/format.php,
+ mod/guidtool/views/default/guidtool/gallery.php,
+ mod/guidtool/views/default/guidtool/listing.php,
+ mod/guidtool/views/default/guidtool/profile.php,
+ .../views/default/object/guidtoolwrapper.php: Guid tool for import, export
+ and browsing.
+
+ * views/default/graphics/icon.php: Refs #151: graphics/icon view
+
+2008-07-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/footer_logo.gif, views/default/canvas/layouts/widgets.php,
+ views/default/css.php, views/default/navigation/pagination.php,
+ views/default/page_elements/footer.php: footer logo added, widget gallery
+ instructions changed, pagination block styles added to all pagination
+
+2008-07-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/addcollection.php, actions/friends/deletecollection.php,
+ actions/friends/editcollection.php, engine/lib/users.php, friends/add.php,
+ friends/collections.php, friends/edit.php, languages/en.php,
+ views/default/friends/forms/edit.php: Friends collections are now fully part
+ of the main core
+
+2008-07-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/icons/default/large.png, _graphics/icons/default/medium.png,
+ _graphics/icons/default/small.png, _graphics/icons/default/tiny.png,
+ engine/lib/elgglib.php, engine/lib/entities.php: Closes #151: Introducing
+ getIcon($size)
+
+ * mod/logbrowser/graphics/defaultlarge.jpg,
+ mod/logbrowser/graphics/defaultmedium.jpg,
+ mod/logbrowser/graphics/defaultsmall.jpg,
+ mod/logbrowser/graphics/defaulttiny.jpg,
+ .../views/default/logbrowser/gallery.php,
+ mod/logbrowser/views/default/logbrowser/icon.php,
+ .../views/default/logbrowser/listing.php: Logbrowser now using getIcon for
+ graphics
+
+ * mod/logbrowser/index.php: Title added
+
+ * engine/lib/elgglib.php: Introducing elgg_get_view_location()
+
+2008-07-31 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/toolbar_arrow.png, views/default/css.php: arrow icon added to
+ dropdown menu
+
+ * views/default/css.php, views/default/friends/picker.php: save and cancel
+ buttons added to collections
+
+2008-07-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/pickercallback.php, javascript/friendsPickerv1.js,
+ views/default/friends/collection.php, views/default/friends/collections.php,
+ views/default/friends/collectiontabs.php, views/default/friends/picker.php:
+ Hurrah! Made the friendspickers work
+
+2008-07-31 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidtool/import.php, mod/guidtool/index.php,
+ mod/guidtool/languages/en.php, mod/guidtool/manifest.xml,
+ mod/guidtool/start.php, .../views/default/forms/guidtool/import.php: Added
+ guidtool and switching to desktop.
+
+2008-07-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php: Friends picker tab initialisation
+ updates
+
+2008-07-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/picker.php, views/default/friends/tablelist.php:
+ small change to collection members display - as a table
+
+ * javascript/friendsPickerv1.js, views/default/friends/collectiontabs.php:
+ minor fixes from earlier today - re-instating the a-z slider, and correctly
+ switching the picker tabs
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php: Removing the members from the
+ collections content
+
+ * views/default/friends/picker.php: Picker works better on ajax load.
+
+ * views/default/friends/collectiontabs.php: Added specific numbering to tab
+ classes for the picker
+
+ * views/default/friends/picker.php: Removing js on picker load
+
+ * views/default/friends/collection.php, views/default/friends/picker.php:
+ Collections open blank (for now)
+
+ * views/default/friends/collectiontabs.php: Committing in loads
+
+2008-07-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collectiontabs.php: pete's collectiontabs code
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/odd.php, actions/import/opendd.php, engine/lib/export.php,
+ services/export/handler.php, views/odd/canvas/default.php,
+ views/odd/export/entity.php, views/odd/export/metadata.php,
+ views/odd/export/relationship.php, views/odd/group/default.php,
+ views/odd/messages/exceptions/exception.php, views/odd/object/default.php,
+ views/odd/pageshells/pageshell.php, views/odd/site/default.php,
+ views/odd/user/default.php, views/opendd/canvas/default.php,
+ views/opendd/export/entity.php, views/opendd/export/metadata.php,
+ views/opendd/export/relationship.php, views/opendd/group/default.php,
+ views/opendd/messages/exceptions/exception.php,
+ views/opendd/object/default.php, views/opendd/pageshells/pageshell.php,
+ views/opendd/site/default.php, views/opendd/user/default.php: Closes #189:
+ ODD -> OpenDD
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php, views/default/friends/picker.php:
+ AJAX improvements to picker
+
+ * engine/lib/elgglib.php, views/default/navigation/pagination.php: Lists of
+ comments etc no longer display "none found" if there aren't any.
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/odd.php: Forward to referer
+
+ * services/export/handler.php:
+
+ * actions/import/odd.php: Admin gatekeeper
+
+2008-07-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_toolbar_logout.gif, _graphics/elgg_toolbar_logout_over.gif,
+ _graphics/icon_customise_remove.png, views/default/css.php,
+ views/default/friends/collection.php: toolbar logout icon changed to work as
+ a single image resource (for caching purposes), delete icon on collections
+ changed to work as a single image rollover
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/export/entity.php: Minor improvements to
+ default entity view.
+
+ * views/default/export/metadata.php, views/default/export/relationship.php:
+ Improved views
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/pickercallback.php, views/default/friends/picker.php,
+ views/default/friends/tablelist.php: Added friends picker callback
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php, engine/lib/relationships.php: Refs #186: Get URL
+ for relationships
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php,
+ views/default/friends/collectiontabs.php, views/default/friends/picker.php:
+ Moved collection tabs out of the main picker view
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: Refs #186
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php: Introducing url handlers for extenders.
+
+ * engine/lib/export.php: Changed export uuid, refs #186
+
+ * htaccess_dist: Changed export rewrite rules.
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/collection.php, views/default/friends/picker.php,
+ views/default/friends/tablelist.php: Added friends collections members list
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Using guid_to_uuid
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/tablelist.php: Added the tablelist view
+
+2008-07-30 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js, views/default/css.php,
+ views/default/friends/collection.php, views/default/friends/picker.php: the
+ beginnings of the tabbed friends picker
+
+2008-07-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php: Extender getURL() support (no overide as of yet)
+
+ * mod/opendd/actions/opendd/feed/delete.php,
+ mod/opendd/actions/opendd/feed/subscribe.php, mod/opendd/edit.php,
+ mod/opendd/feeds.php, mod/opendd/graphics/defaultlarge.jpg,
+ mod/opendd/graphics/defaultmedium.jpg, mod/opendd/graphics/defaultsmall.jpg,
+ mod/opendd/graphics/defaulttiny.jpg, mod/opendd/index.php,
+ mod/opendd/languages/en.php, mod/opendd/manage.php, mod/opendd/manifest.xml,
+ mod/opendd/start.php, mod/opendd/viewfeed.php,
+ .../views/default/forms/opendd/subscribe.php,
+ mod/opendd/views/default/object/oddentity.php,
+ mod/opendd/views/default/object/oddfeed.php,
+ mod/opendd/views/default/object/oddmetadata.php,
+ .../views/default/object/oddrelationship.php,
+ mod/opendd/views/default/opendd/css.php,
+ mod/opendd/views/default/opendd/gallery.php,
+ mod/opendd/views/default/opendd/icon.php,
+ mod/opendd/views/default/opendd/link_logo.php,
+ mod/opendd/views/default/opendd/links.php,
+ mod/opendd/views/default/opendd/listing.php,
+ mod/opendd/views/default/opendd/metatags.php,
+ mod/opendd/views/default/opendd/profile.php,
+ mod/opendd/views/default/output/uuid.php,
+ .../widgets/opendd_friends_elsewhere/edit.php,
+ .../widgets/opendd_friends_elsewhere/view.php, mod/opendd/viewuuid.php: Moved
+ OpenDD out of the central repo.
+
+ * mod/logbrowser/index.php: Logbrowser using admin gatekeeper.
+
+2008-07-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/widgets.php: Widget state cookie is now removed on widget
+ delete.
+
+2008-07-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js, views/default/canvas/layouts/widgets.php,
+ views/default/widgets/wrapper.php: individual widgets state now saved in
+ cookies
+
+2008-07-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Default view added to export, for completeness
+
+ * engine/lib/system_log.php:
+
+ * views/odd/group/default.php, views/odd/site/default.php: OpenDD default
+ views on entities
+
+ * views/default/export/entity.php: Improvements to export view
+
+ * views/default/object/default.php, views/default/site/default.php: Added
+ some default views.
+
+ * .../views/default/logbrowser/gallery.php: And in gallery view
+
+ * .../views/default/logbrowser/listing.php: Handle anonymous events.
+
+ * actions/systemsettings/install.php,
+ mod/logbrowser/graphics/defaultlarge.jpg,
+ mod/logbrowser/graphics/defaultmedium.jpg,
+ mod/logbrowser/graphics/defaultsmall.jpg,
+ mod/logbrowser/graphics/defaulttiny.jpg, mod/logbrowser/index.php,
+ mod/logbrowser/languages/en.php, mod/logbrowser/manifest.xml,
+ mod/logbrowser/start.php, .../views/default/logbrowser/gallery.php,
+ mod/logbrowser/views/default/logbrowser/icon.php,
+ .../views/default/logbrowser/listing.php,
+ mod/logbrowser/views/default/object/logwrapper.php: Added basic log browser.
+ updateclient & logbrowser are switched on by default in new installs.
+
+ * engine/lib/system_log.php: Fixed count
+
+ * engine/lib/system_log.php: Typo
+
+ * engine/lib/system_log.php: Added some useful helper functions.
+
+ * engine/lib/system_log.php: Count support added
+
+2008-07-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php, views/default/css.php: final
+ changes to widgets - all ready to wire up now
+
+2008-07-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/opendd/start.php: Typo
+
+ * actions/register.php, languages/en.php,
+ views/default/account/forms/login.php: Registration disabled option (no admin
+ screen yet), closes #184
+
+2008-07-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * dashboard/index.php: dashboard widget tweak
+
+ * views/default/canvas/layouts/widgets.php: tweak to the profile widget
+ picker
+
+2008-07-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/updateclient/languages/en.php, mod/updateclient/start.php,
+ .../views/default/settings/updateclient/edit.php: Update client gets updates
+
+ * engine/lib/admin.php: Admin notify method added, view 'admin_message' for
+ this.
+
+2008-07-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/canvas/layouts/widgets.php: widget layout
+ help context sensitive.
+
+2008-07-29 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php: Only on install
+
+ * mod/updateclient/languages/en.php, mod/updateclient/start.php: Update
+ client
+
+2008-07-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/updateclient/languages/en.php,
+ .../views/default/settings/updateclient/edit.php: Added configuration to
+ client.
+
+ * views/default/admin/plugins_opt/plugin.php: Minor look and feel tweaks
+
+ * mod/updateclient/index.php, mod/updateclient/languages/en.php,
+ mod/updateclient/manifest.xml, mod/updateclient/start.php,
+ .../views/default/settings/updateclient/edit.php: Adding updateclient
+ (non-functional) and now switching back to base station.
+
+2008-07-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php: new start page layout/style
+
+ * views/default/css.php: fixes to toolbar and owner box ie 6 issues
+
+ * views/default/css.php: top toolbar styled up, and owner block items
+
+ * _graphics/tools_over.png, javascript/initialise_elgg.js, languages/en.php,
+ views/default/canvas/layouts/widgets.php, views/default/css.php,
+ views/default/navigation/topbar_tools.php: new 3 column widget gallery (needs
+ wiring up), profile page profile box alignment sorted, topbar menu tweaked
+ and image added,
+
+2008-07-28 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/start.php: Fixes #182
+
+2008-07-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php,
+ views/default/canvas/layouts/widgets.php, views/default/css.php: profile and
+ dashboard pages altered for 3 widget columns
+
+2008-07-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/footer.php: fixed a small footer error
+
+ * views/default/page_elements/footer.php: wired up the footer menu links
+
+ * views/default/pageshells/pageshell.php: the spotlight is now only
+ available for logged in users.
+
+2008-07-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js, views/default/css.php,
+ views/default/friends/picker.php: friends picker fixed for new page layout,
+ and hopefully I've fixed the load issue too
+
+2008-07-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php,
+ views/default/canvas/layouts/widgets.php, views/default/css.php,
+ views/default/page_elements/elgg_topbar.php,
+ views/default/pageshells/pageshell.php: canvas layout updates, ie6&7 layout
+ fixes, new 3-column widget view
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/ping.php: Some notes
+
+ * engine/lib/ping.php: Using correct ping address
+
+ * engine/lib/entities.php: User test negative non-fatal on permissions check
+
+ * engine/lib/entities.php: Actually fetching the user
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * friends/index.php, friends/of.php: friends pages altered
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/opendd/views/default/output/uuid.php: Introducing UUID view
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php, entities/list.php: changed list and entity canvas
+ layout
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/ping.php: Main pinging mechanism now functional
+
+ * engine/lib/ping.php: Temp disabled
+
+ * engine/schema/mysql.sql: Fixing access collections table
+
+2008-07-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/one_column.php, views/default/css.php,
+ views/default/page_elements/title.php: more canvas layout additions, and page
+ owner block added to sidebar
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../canvas/layouts/two_column_left_sidebar.php: tweak to the two_column
+ left to add the owner block
+
+2008-07-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php: menu fix
+
+ * views/default/css.php: new canvas layouts
+
+ * .../canvas/layouts/two_column_left_sidebar.php,
+ .../canvas/layouts/two_column_right_sidebar.php: new canvas layouts
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/ping.php: Sends url with version (to retrieve site if already
+ loaded)
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php: bug in tools fixed
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/ping.php: Set to ping ping.elgg.org
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/ping.php, languages/en.php, views/default/settings/system.php:
+ Ping now configurable.
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php: tools added to topbar
+
+ * views/default/pageshells/pageshell.php: removed toolbox from main content
+ area
+
+2008-07-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: minor tweak
+
+ * views/default/navigation/topbar_tools.php,
+ views/default/page_elements/elgg_topbar.php: tools menu item fixed and jquery
+ animation added
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/settings/system.php: Moving to laptop
+
+2008-07-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, views/default/friends/collection.php,
+ views/default/friends/picker.php: Improved friend picker.
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, engine/lib/configuration.php:
+ sitedescription now loaded into config and displayed
+
+2008-07-25 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topbar_tools.php,
+ views/default/page_elements/elgg_topbar.php: added tools to the topbar
+
+2008-07-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ languages/en.php, views/default/settings/system.php: Now possible to specify
+ a site description.
+
+ * engine/lib/ping.php:
+
+ * views/default/output/url.php: Fixed another oopsy
+
+ * engine/lib/api.php:
+
+ * engine/lib/entities.php: Support multiple metadata values on entities,
+ closes #179
+
+2008-07-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/ping.php:
+
+ * engine/lib/api.php: API Client bugfixes
+
+ * engine/lib/api.php:
+
+2008-07-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/friendsPickerv1.js, views/default/friends/picker.php: Tabs on
+ the friend picker now work.
+
+2008-07-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Fixing oopsy...
+
+2008-07-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/friends/picker.php: Fixed the friends picker.
+
+ * views/default/friends/picker.php: The picker now selects the
+ friendspickerN variable correctly.
+
+ * engine/lib/access.php, engine/lib/relationships.php,
+ engine/schema/mysql.sql, languages/en.php,
+ views/default/friends/collection.php, views/default/friends/collections.php,
+ views/default/friends/picker.php: Introducing the (still issue-packed) friend
+ picker.
+
+2008-07-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Allowing multiple
+
+ * views/default/output/url.php: Support HTTPS
+
+ * engine/lib/api.php: Api tweaks refs #149
+
+ * engine/lib/ping.php: New site pinger, refs #149
+
+ * engine/lib/entities.php: Correctly exporting site and container as opendd
+
+2008-07-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, services/api/rest.php: Updated to use pam for auth
+ token. Added anonymous function support.
+
+ * engine/lib/pam.php: PAM now supports 'required' and 'sufficient'
+
+2008-07-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/friends_picker_arrow_left.gif,
+ _graphics/friends_picker_arrow_right.gif, javascript/friendsPickerv1.js,
+ .../jquery/jquery-easing-compatibility.1.2.pack.js,
+ vendors/jquery/jquery-easing.1.2.pack.js, views/default/css.php,
+ views/default/page_elements/header.php: new files for friends picker
+
+2008-07-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Fixed typo
+
+ * engine/lib/api.php, languages/en.php: API client added to code & changed
+ order of expose_function
+
+ * engine/lib/entities.php, engine/lib/group.php: Moving canWriteToContainer
+
+2008-07-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/footer_logo.gif, views/default/page_elements/footer.php: removal
+ of the official elgg logo from the footer, this is not GPL.
+
+2008-07-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/groupprofile.php: The group profile now sets page ownership to
+ the group
+
+ * mod/groups/views/default/groups/grouplinks.php: Slight modification to
+ group links.
+
+ * engine/lib/objects.php: Yet more container refactoring.
+
+2008-07-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/access.php, views/default/input/checkboxes.php,
+ views/default/input/file.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Disabled support
+ added to forms.
+
+2008-07-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/metadata.php,
+ engine/lib/relationships.php: More owner_guid to container_guid transfer
+
+ * engine/lib/metadata.php, engine/lib/tags.php: Updated further functions to
+ work from container_guids rather than owner_guids
+
+ * mod/groups/start.php, mod/groups/views/default/groups/icon.php,
+ mod/profile/views/default/profile/icon.php: Icons now handle elegantly if you
+ try and display a non-ElggUser entity.
+
+ * engine/lib/group.php, engine/lib/pageowner.php,
+ mod/groups/languages/en.php: Groups now have usernames of a sort
+
+ * engine/lib/elgglib.php, engine/lib/group.php, engine/lib/users.php:
+ Introducing the Friendable interface
+
+ * mod/profile/views/default/user/default.php,
+ mod/profile/views/default/user/user.php: Moved the default user view from
+ user/user to user/default.
+
+2008-07-22 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php:
+
+ * engine/lib/entities.php: Saving cached annotations
+
+2008-07-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/new.php: Typo
+
+ * mod/opendd/edit.php, mod/opendd/feeds.php, mod/opendd/index.php,
+ mod/opendd/manage.php, mod/opendd/viewfeed.php, mod/opendd/viewuuid.php:
+ OpenDD using elgg_view_title
+
+ * engine/lib/entities.php: Exporting full profile
+
+ * mod/groups/all.php, mod/groups/edit.php, mod/groups/groupprofile.php,
+ mod/groups/index.php, mod/groups/invite.php, mod/groups/new.php: Groups using
+ elgg_view_title
+
+ * engine/lib/access.php: Fixes #175
+
+2008-07-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fix for can_write_to_container
+
+ * engine/lib/entities.php: Fixed the can_write_to_container function when
+ you're logged out.
+
+ * engine/lib/entities.php, engine/lib/users.php: Further fixes.
+
+ * engine/lib/entities.php: Fix for previous.
+
+ * engine/lib/entities.php: Container_guid is set intelligently for
+ get_entities when owner_guid is set.
+
+ * engine/lib/users.php: Slight fix to previous.
+
+ * engine/lib/users.php: Altered the get_user_friends_objects functions to
+ work with containers.
+
+ * engine/lib/entities.php, engine/lib/group.php: Moved
+ can_write_to_container into elgglib
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/lib/entities.php, engine/lib/group.php, engine/lib/objects.php,
+ engine/lib/pageowner.php, engine/lib/users.php, engine/schema/mysql.sql,
+ mod/groups/actions/addtogroup.php, views/default/page_elements/title.php:
+ Moved container_guid to entities, modified a bunch of functions.
+
+ * engine/lib/plugins.php: Standardised plugin loading
+
+2008-07-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, mod/groups/languages/en.php, mod/groups/start.php:
+ Closes #166
+
+2008-07-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Slight change to write access permissions function
+
+ * engine/lib/access.php: Reinstating plugin hooks for access collections.
+
+ * engine/lib/input.php, mod/profile/views/default/profile/userdetails.php,
+ views/default/admin/main.php, views/default/admin/plugins.php,
+ views/default/admin/site.php, views/default/admin/statistics.php,
+ views/default/admin/user.php, views/default/messages/errors/error.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/messages/message.php,
+ views/default/output/longtext.php, views/default/settings/install.php,
+ views/default/usersettings/main.php, views/default/usersettings/plugins.php,
+ views/default/usersettings/statistics.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/odd/messages/exceptions/exception.php, views/rss/object/default.php,
+ views/rss/user/default.php, views/xml/messages/exceptions/exception.php:
+ Added the autop function, replaced any references to nl2br
+
+ * engine/lib/access.php, engine/schema/mysql.sql: Fixed a bug with the
+ revamped access collections
+
+ * engine/lib/pageowner.php, engine/lib/plugins.php: Improvements to
+ get_context
+
+ * engine/lib/access.php: Fix for access collections
+
+ * views/default/input/text.php: Short text values are now properly escaped
+ in the input/text view.
+
+ * engine/schema/mysql.sql: Added auto increment initial val. Fixes #171
+
+2008-07-18 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: new functions added to access in order to allow
+ collections to be created
+
+2008-07-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: access_collections now auto_increment
+
+2008-07-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: access groups renamed to access collections
+
+2008-07-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: access_groups -> access_collections
+
+ * engine/lib/access.php: Fix to previous
+
+ * engine/lib/access.php: New access control hooks
+
+2008-07-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, mod/groups/groupprofile.php,
+ mod/groups/start.php: Closes #165 & #167
+
+ * services/export/handler.php:
+
+2008-07-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Added new access group control functions
+
+2008-07-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Fixes #164: Seems there is something erroniously
+ setting 'guid' to something in logged in systems (or alternatively this is
+ just a session problem on my system) either way I have modified isloggedin to
+ check both guid and id... which seems to work.
+
+ * engine/lib/entities.php, engine/lib/extender.php,
+ services/export/handler.php: Closes #160
+
+2008-07-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fixed get_entities_by_annotation
+
+ * engine/lib/annotations.php: Introducing list_entities_from_annotations
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, mod/opendd/viewuuid.php,
+ views/default/friends/list.php, views/default/search/entity_list.php,
+ views/js/object/default.php, views/js/user/default.php: Fixed numerous
+ occurrances of elgg_view_entity being called incorrectly. Fixes #163
+
+2008-07-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php: Fixed the single entity viewer
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/index.php: Fixes #162
+
+ * mod/opendd/viewuuid.php: Closes #161
+
+2008-07-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/add.php, actions/friends/remove.php: Add and remove friend
+ actions now use try / catch
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/extender.php: Closes #155: Introduces
+ 'volatile' type of metadata in odd feeds.
+
+ * engine/lib/elgglib.php: Closes #157: Introducing elgg_[get|set]_viewtype()
+
+ * engine/lib/river.php: Reversed ben's changes
+
+2008-07-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Fix for river items when the item is an annotation,
+ not an entity in itself
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Closes #158: Renamed $location to $view_location
+ within elgg_view. This seems to be a successful workaround.
+
+2008-07-16 misja <misja@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/xml-rpc_handler.php: Set the view with set_input rather
+ than via the session
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php: Closes #156 & #139
+
+2008-07-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: The friends river now grabs more friends ...
+
+2008-07-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/joinrequest.php: Fixes #154
+
+ * engine/lib/metadata.php, mod/groups/actions/join.php: Closes #116: Groups
+ join clears invite flags http://trac.elgg.org/elgg/ticket/116
+
+ * mod/profile/actions/edit.php, mod/profile/actions/iconupload.php,
+ mod/profile/languages/en.php,
+ .../default/river/ElggUser/profileiconupdate.php,
+ .../views/default/river/ElggUser/profileupdate.php,
+ .../views/default/river/ElggUser/update.php: Closes #152 and as a bonus you
+ get a river notification for icon upload as well. Aren't I nice?
+
+2008-07-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: river blog updated - added
+
+2008-07-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/opendd/start.php: Fixes #147
+
+ * mod/opendd/start.php:
+
+ * mod/opendd/start.php: Closes #150
+
+ * mod/opendd/start.php, .../widgets/opendd_friends_elsewhere/view.php,
+ mod/opendd/viewuuid.php: Closes #145: Override getURL on imported entities.
+
+2008-07-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: You can now override entity URLs with the
+ setURL($string) method.
+
+2008-07-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/edit.php,
+ mod/groups/actions/joinrequest.php, mod/groups/languages/en.php,
+ mod/groups/start.php, mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/groupgallery.php,
+ mod/groups/views/default/groups/grouplisting.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ .../default/river/ElggRelationship/create.php: Fixes #144
+
+2008-07-15 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/javascript.php: javascript menu dropdown IE
+ bug fixed for friends widget, still an issue with friends of
+
+2008-07-15 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/ElggRelationship/create.php,
+ views/default/river/wrapper.php,
+ views/json/messages/exceptions/exception.php,
+ views/php/messages/exceptions/exception.php,
+ views/xml/messages/exceptions/exception.php: Closes #140
+
+ * engine/lib/extender.php, mod/opendd/languages/en.php,
+ mod/opendd/manage.php, mod/opendd/start.php, mod/opendd/viewfeed.php,
+ .../widgets/opendd_friends_elsewhere/edit.php,
+ .../widgets/opendd_friends_elsewhere/view.php: Closes #135: First version of
+ the OpenDD friends elsewhere feed.
+
+ * engine/lib/river.php, .../default/river/ElggRelationship/create.php,
+ .../views/default/river/ElggUser/update.php: Using ElggRiverStatement. Plugin
+ writers update your views! Refs #135.
+
+ * engine/lib/entities.php: Moved temp array caching stuff to the correct
+ functions.
+
+ * engine/lib/entities.php: Entity metadata can now be saved using
+ setMetaData() interface even if guid not specified.
+
+2008-07-15 misja <misja@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/handlers/xml-rpc_handler.php, engine/lib/xml-rpc.php: Remove rogue
+ print_r() statement, rightly set the xml view and fix incorrect xml-rpc view
+ call.
+
+ * engine/lib/xml-rpc.php: Fix uninitialized XML-RPC handler value
+
+ * engine/lib/xml-rpc.php: Fixed registering of XML-RPC handlers
+
+2008-07-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: Time_created should be time_updated.
+
+ * engine/lib/opendd.php: Refs #139: Using UTF-8 encoding as a speculative
+ fix. Test and confirm.
+
+2008-07-14 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updated toolabr logout for old IE 6's
+
+ * views/default/css.php: updates to log out, pagination, search box
+
+2008-07-14 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: Introducing oddmetadata_to_elggextender(), a
+ function used for import but functionised to let you use it from elsewhere.
+
+2008-07-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Introducing oddentity_to_elggentity(), a function
+ used for import but functionised to let you use it from elsewhere.
+
+2008-07-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: and again
+
+ * views/default/css.php: river_forums_update added
+
+2008-07-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: new date and time lang
+
+2008-07-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/search/entity_list.php,
+ views/rss/search/entity_list.php: The lists now go through the
+ search/entity_list view.
+
+2008-07-11 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php: Added getNumElements()
+
+ * engine/lib/entities.php: Fixes #137: annotate and getAnnotations now
+ functions for unsaved entities. Maths functions non-functional at present.
+ Refs #135.
+
+ * engine/lib/entities.php: Added Group entity support to import.
+
+ * languages/en.php, services/export/handler.php: Better errors for attempt
+ to access a GUID you can't
+
+ * views/odd/messages/exceptions/exception.php: Exceptions in OpenDD export
+ now appear as comments for debugging.
+
+ * engine/lib/relationships.php, services/export/handler.php: relationships
+ are addressable and have working UUIDs, refs #132
+
+ * actions/comments/add.php, actions/comments/delete.php,
+ actions/email/confirm.php, actions/email/save.php, actions/friends/add.php,
+ actions/friends/remove.php, actions/import/odd.php, actions/login.php,
+ actions/logout.php, .../notifications/settings/usersettings/save.php,
+ actions/plugins/settings/save.php, actions/plugins/usersettings/save.php,
+ actions/register.php, actions/user/language.php, actions/user/name.php,
+ actions/user/password.php, actions/useradd.php, actions/widgets/save.php,
+ languages/en.php: Using register_error on errors rather than system_message.
+ Also, fixed widget save to handle arrays (Refs #135)
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php,
+ actions/admin/user/makeadmin.php, actions/admin/user/resetpassword.php: Using
+ register_error on errors rather than system_message
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ mod/groups/actions/addtogroup.php, mod/groups/actions/edit.php,
+ mod/groups/actions/join.php, mod/groups/actions/joinrequest.php,
+ mod/groups/actions/leave.php, mod/opendd/actions/opendd/feed/delete.php,
+ mod/opendd/actions/opendd/feed/subscribe.php: Using register_error on errors
+ rather than system_message
+
+2008-07-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: defaut font reset to verdana
+
+ * views/default/css.php: full list of pc names for Lucida Sans added
+
+2008-07-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/two_column.php, views/default/css.php: two
+ column layout fix
+
+ * views/default/canvas/layouts/two_column.php, views/default/css.php: two
+ column canvas layout fixed
+
+2008-07-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/page_elements/title.php:
+ elgg_view_title can now suppress the submenu
+
+2008-07-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_toolbar_logout_over.gif, views/default/css.php,
+ views/default/page_elements/elgg_topbar.php: elgg topbar logout re-done with
+ rollover
+
+2008-07-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/admin/plugins.php: Killed pagination on the plugin admin
+ page
+
+ * engine/lib/elgglib.php: Added a plugin hook for counting comments.
+
+2008-07-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/widgets.php: Working with multiple values in array
+
+2008-07-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/elgg_bookmarklet.gif: bookmarklet graphic
+
+2008-07-10 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixes #134: Using else between statements to
+ ensure that they are only ever triggered once. Please confirm that there are
+ no other issues attached.
+
+2008-07-10 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ .../views/default/profile/menu/adminlinks.php, views/default/css.php: avatar
+ submenu altered and messages div coloured up
+
+2008-07-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/messages/errors/list.php,
+ views/default/messages/messages/list.php: Error messages now have a different
+ div name
+
+ * views/default/page_elements/title.php: The submenu div doesn't appear if
+ there is no submenu.
+
+ * engine/lib/plugins.php: Fixed issue with get_plugin_name and pagehandlers.
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/comments/forms/edit.php: Fixed
+ comments!
+
+ * engine/lib/elgglib.php: Fixed submenu tab contexts
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Blocking some information from export, closes
+ #130
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: Updated the edit icon form
+ view
+
+ * mod/profile/editicon.php: Restoring old edit icon page
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, mod/opendd/actions/opendd/feed/delete.php,
+ mod/opendd/actions/opendd/feed/subscribe.php, mod/opendd/edit.php,
+ mod/opendd/feeds.php, mod/opendd/graphics/defaultlarge.jpg,
+ mod/opendd/graphics/defaultmedium.jpg, mod/opendd/graphics/defaultsmall.jpg,
+ mod/opendd/graphics/defaulttiny.jpg, mod/opendd/index.php,
+ mod/opendd/languages/en.php, mod/opendd/manage.php, mod/opendd/manifest.xml,
+ mod/opendd/start.php, mod/opendd/viewfeed.php,
+ .../views/default/forms/opendd/subscribe.php,
+ mod/opendd/views/default/object/oddentity.php,
+ mod/opendd/views/default/object/oddfeed.php,
+ mod/opendd/views/default/object/oddmetadata.php,
+ .../views/default/object/oddrelationship.php,
+ mod/opendd/views/default/opendd/css.php,
+ mod/opendd/views/default/opendd/gallery.php,
+ mod/opendd/views/default/opendd/icon.php,
+ mod/opendd/views/default/opendd/link_logo.php,
+ mod/opendd/views/default/opendd/links.php,
+ mod/opendd/views/default/opendd/listing.php,
+ mod/opendd/views/default/opendd/metatags.php,
+ mod/opendd/views/default/opendd/profile.php: Closes #81: OpenDD aggregator
+ http://trac.elgg.org/elgg/ticket/81
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Further profile text fix
+
+ * mod/profile/languages/en.php, mod/profile/start.php: Added profile submenu
+
+ * engine/lib/elgglib.php: Fixed minor profile tab issue
+
+2008-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: mini avatar in page title area fixed
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/user/index.php: The user administator page now results in an RSS
+ feed
+
+ * engine/lib/elgglib.php, views/default/canvas_header/submenu_template.php,
+ views/default/page_elements/title.php: Introducing the submenu
+
+2008-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: edit profile button moved
+
+2008-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: profile edit link moved
+
+ * friends/of.php: friends of title
+
+ * friends/index.php, friends/of.php: titles on friend list pages
+
+2008-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: css for page tabs submenu
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/rss/pageshells/pageshell.php: RSS feeds live again when you're
+ logged out!
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Fixed opendd metadata .htaccess rules
+
+ * engine/lib/elgglib.php, engine/lib/entities.php: Refs #81: Subtype can be
+ returned on a non-saved entity.
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added a comment hook so that other plugins can
+ handle comments instead
+
+ * vendors/kses/kses.php: Removed a kses warning.
+
+ * views/default/comments/forms/edit.php: The comment form only appears if
+ you are logged in.
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Removed toggle since it broke the handler
+ prototype
+
+2008-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: new view added to the canvas title
+ view.
+
+2008-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/page_elements/elgg_topbar.php: topbar
+ altered for messages and links style
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/object/object.php: Closes #129: Placeholder object default
+ view
+
+2008-07-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/editicon.php, mod/profile/languages/en.php,
+ views/default/css.php: new avatar crop page and instructions
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/languages/en.php, mod/groups/start.php,
+ .../default/widgets/group_entities_widget/edit.php,
+ .../default/widgets/group_entities_widget/view.php: Refs #129, #109 & #106
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Plugins can now override the front page
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Introducing list_entities_groups()
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: The relationship listing function wasn't
+ taking offsets properly.
+
+ * views/default/navigation/pagination.php: Further pagination change.
+
+2008-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: new topbar
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Further pagination change.
+
+ * views/default/navigation/pagination.php: Slightly more descriptive
+ pagination.
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Modified rewrite rules for page handler to support - and _
+
+2008-07-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php, vendors/kses/AUTHORS, vendors/kses/COPYING,
+ vendors/kses/ChangeLog, vendors/kses/README, vendors/kses/TODO,
+ vendors/kses/docs/attribute-value-checks, vendors/kses/docs/hooks,
+ vendors/kses/docs/stripping-everything, vendors/kses/docs/supported-formats,
+ vendors/kses/docs/whitelisted-url-protocols,
+ vendors/kses/examples/filter.php, vendors/kses/examples/test.php,
+ vendors/kses/kses.php, vendors/kses/oop/oop.kses.changelog.txt,
+ vendors/kses/oop/oop.simple.api.txt, vendors/kses/oop/php4.class.kses.php,
+ vendors/kses/oop/php5.class.kses.php, vendors/kses/oop/test.oop.kses.php:
+ Elgg 1.0, meet kses. Kses, Elgg 1.0.
+
+2008-07-09 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php: Minor tweak to OpenDD library
+
+2008-07-09 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/editicon.php, mod/profile/languages/en.php,
+ mod/profile/views/default/profile/editicon.php: new profile avatar page
+
+2008-07-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/gallery.php: users gallery view sorted
+
+2008-07-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Closes #128
+
+2008-07-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: new canvas title
+
+2008-07-08 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/river_icons/river_icon_friends.gif, views/default/css.php: river
+ icon for friends
+
+2008-07-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/vendors/calendarpopup/CalendarPopup.js,
+ engine/vendors/jquery/jquery.js, vendors/calendarpopup/CalendarPopup.js,
+ views/default/input/calendar.php: Moved the calendar popup, erased the
+ duplicate jQuery
+
+ * actions/comments/add.php, engine/lib/notification.php, languages/en.php:
+ Introducing notifications on generic comments.
+
+ * entities/list.php: Rough and ready entity list page
+
+2008-07-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: reverted the new title
+
+ * views/default/page_elements/title.php: title tweaks
+
+2008-07-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: OpenDD autodiscovery header
+
+2008-07-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: moved generic comments css from plugin to core
+
+2008-07-08 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Closes #125: get_entities_by_latest_annotation
+ function
+
+2008-07-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/widgets.php, views/default/output/tags.php: widget are now
+ logged in by default, tag output tweaked
+
+2008-07-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/metastrings.php, mod/profile/actions/iconupload.php: Removing
+ annoying warning messages
+
+2008-07-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php: Users online, not user's ...
+
+ * actions/admin/user/makeadmin.php, engine/lib/admin.php,
+ engine/lib/entities.php, engine/lib/metadata.php, engine/lib/sessions.php,
+ engine/lib/users.php, views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php: Administration tweaks; fixed
+ users online functions, as well as last_action functions, and the 'make
+ admin' functionality
+
+ * views/default/page_elements/title.php: Removed the 'your' prefix from
+ titles
+
+ * engine/lib/pageowner.php: page_owner() now works off owner_guid, not
+ owner_id
+
+ * languages/en.php: Added the word 'all' to the vocabulary
+
+2008-07-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/title.php: changes to the title view
+
+2008-07-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/wrapper.php: Relationship river items are now
+ correctly wrapped in divs
+
+ * mod/profile/graphics/defaulttopbar.jpg, mod/profile/graphics/topbar.jpg:
+ Default topbar graphic should now be included
+
+2008-07-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/graphics/topbar.jpg: default avatar added for topbar
+
+2008-07-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/metadata.php: Introducing
+ canEditMetadata
+
+2008-07-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Closes #107, this has been superceded by groups
+ functionality (#106).
+
+ * engine/lib/notification.php: Option to hide sender.
+
+2008-07-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/gallery_back_icon.gif, _graphics/gallery_back_icon_on.gif:
+ gallery overview icons
+
+ * _graphics/icon_tag.gif: piccy for tags
+
+ * views/default/css.php: tags icon and files update
+
+2008-07-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/tags.php: class wrapped around tag string.
+
+2008-07-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Closes #123
+
+2008-07-07 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/comments/forms/edit.php: removed the title from generic
+ comments
+
+2008-07-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Fixes #122
+
+2008-07-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/search/gallery.php: updated file
+ gallery
+
+2008-07-07 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php: Decode on import
+
+ * engine/lib/group.php, mod/groups/actions/edit.php,
+ mod/groups/actions/join.php, mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/edit.php,
+ mod/groups/views/default/groups/menu/actions.php: Closes #120
+
+2008-07-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed friendly_time
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/edit.php, mod/groups/languages/en.php,
+ mod/groups/views/default/forms/groups/edit.php: Closes #109: Group icons can
+ be set. Fixed recreate group on edit.
+
+ * mod/groups/graphics/defaultlarge.jpg,
+ mod/groups/graphics/defaultmedium.jpg, mod/groups/graphics/defaultsmall.jpg,
+ mod/groups/graphics/defaulttiny.jpg, mod/groups/graphics/icon.php,
+ mod/groups/views/default/groups/icon.php: Refs #109: Default graphics set.
+ Custom graphics must be in groups/{$GROUP_GUID}{$size}.jpg
+
+2008-07-04 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: changes to the icon
+ editing page.
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../views/default/profile/menu/adminlinks.php: Removed blank space on menu
+
+2008-07-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/menu/actions.php: REmoved duplicate
+ admin links
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php: Fixes #119
+
+ * languages/en.php, mod/groups/actions/addtogroup.php,
+ mod/groups/actions/edit.php, mod/groups/edit.php, mod/groups/invite.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ mod/groups/views/default/forms/groups/invite.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/icon.php,
+ mod/groups/views/default/groups/menu/actions.php,
+ mod/groups/views/default/sharing/invite.php: Refs #109: Invite support added
+
+2008-07-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updates for friends widget
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Fixed regression
+
+2008-07-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js: updated js
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/pageowner.php,
+ mod/groups/languages/en.php, mod/groups/start.php,
+ .../default/widgets/group_members_widget/edit.php,
+ .../default/widgets/group_members_widget/view.php: Refs #109: Group members
+ widget.
+
+ * mod/groups/groupprofile.php, mod/groups/languages/en.php,
+ mod/groups/start.php: Refs #109 : Widget support
+
+ * mod/groups/groupprofile.php, mod/groups/start.php,
+ mod/groups/views/default/groups/grouplinks.php,
+ mod/groups/views/default/groups/groupprofile.php,
+ mod/groups/views/default/groups/menu/actions.php,
+ .../views/default/groups/menu/ownerlinks.php: Refs #109 - Basic profile
+ layout
+
+ * mod/groups/languages/en.php,
+ .../default/river/ElggRelationship/create.php: Refs #109: River functionality
+
+2008-07-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updates to river(ie fixes), and sharing
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/ElggRelationship/create.php: Using entities rather
+ than object
+
+2008-07-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, languages/en.php, search/index.php,
+ views/default/search/startblurb.php,
+ views/default/user/search/finishblurb.php,
+ views/default/user/search/startblurb.php: First pass on user search
+
+2008-07-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: more river updates
+
+2008-07-04 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/groups/actions/addtogroup.php: Refs #109 : Private group membership
+ full exchange.
+
+ * engine/lib/notification.php: Unnecessary sanitise string causing issues on
+ some subjects
+
+ * mod/groups/actions/addtogroup.php, mod/groups/actions/joinrequest.php,
+ mod/groups/languages/en.php, mod/groups/start.php: Join requests on closed
+ groups, full loop. Refs #109
+
+2008-07-04 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: more river icon fixes
+
+2008-07-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/graphics/defaultlarge.jpg,
+ mod/profile/graphics/defaultmedium.jpg,
+ mod/profile/graphics/defaultsmall.jpg, mod/profile/graphics/defaulttiny.jpg:
+ new default avatar (your's was good Ben - just changed the blue a wee bit)
+
+ * _graphics/river_icons/river_icon_blog.gif,
+ _graphics/river_icons/river_icon_comment.gif,
+ _graphics/river_icons/river_icon_feed.gif,
+ _graphics/river_icons/river_icon_files.gif,
+ _graphics/river_icons/river_icon_forum.gif,
+ _graphics/river_icons/river_icon_messageboard.gif,
+ _graphics/river_icons/river_icon_plugin.gif,
+ .../river_icons/river_icon_privatemessage.gif,
+ _graphics/river_icons/river_icon_profile.gif,
+ _graphics/river_icons/river_icon_shares.gif,
+ _graphics/river_icons/river_icon_status.gif: icons for the river
+
+2008-07-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Refs #109
+
+2008-07-03 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: river icons added
+
+2008-07-03 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/spotlight/default.php: content added to the spotlight
+
+2008-07-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/wrapper.php: Fixed a subtype bug in the river item
+ wrapper.
+
+2008-07-03 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: It would help if I added the functions to the right
+ scope. Oops! Refs #106
+
+ * engine/lib/opendd.php: Fixes #113
+
+ * admin/user/index.php: Fixes #111
+
+ * views/default/input/access.php: Extended access to support options
+ override
+
+ * engine/lib/elgglib.php: Collection to group, refs #106
+
+2008-07-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/userdetails.php,
+ .../canvas/layouts/narrow_right_sidebar.php, views/default/css.php: profile,
+ forum and canvas updated
+
+ * views/default/css.php: status widget updates
+
+ * views/default/css.php: generic comments moved/cleaned
+
+2008-07-02 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Typo on database table
+
+2008-07-02 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ views/default/canvas/layouts/one_column.php, views/default/css.php: profile
+ menu, single view layout, and comments all updated
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/userdetails.php: avatar menu fixed for
+ non-200px wide avatars
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * dashboard/index.php, languages/en.php,
+ views/default/canvas/layouts/widgets.php: Default text for the dashboard.
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/start.php: Closes #112
+
+ * .../views/default/profile/menu/adminlinks.php,
+ mod/profile/views/default/profile/userdetails.php: Closes #112
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php: The widget layout now uses areas
+ 3 and 4 as the column content if there aren't any widgets
+
+ * views/default/canvas/layouts/widgets.php: The widget layout now uses areas
+ 3 and 4 as the column content if there aren't any widgets
+
+2008-07-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: created settings link
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/menu/actions.php,
+ mod/profile/views/default/profile/userdetails.php: Admin menus to the
+ contextual menu
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Closes #110
+
+ * actions/systemsettings/install.php: NEW - #109: Groups core plugin
+ http://trac.elgg.org/elgg/ticket/109
+
+ * actions/systemsettings/install.php: Refs #109: Groups plugin active by
+ default
+
+ * engine/lib/users.php: Closes #108
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/javascript.php,
+ views/default/widgets/wrapper.php: Fixed avatar menu on widgets
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Fixed notification subject
+
+2008-07-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: small tweak to topbar
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php: lines in avatar menu
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Correction to get_river_entities
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/page_elements/elgg_topbar.php: mini
+ avatar style and position and link
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Membership functions, and introducing
+ can_write_to_container, and its hook group_permission_check. Refs #106.
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/reset.css: unnecessary file
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Limits properly propagate to the pagination views.
+
+ * mod/profile/views/default/profile/gallery.php: Sanitising the profile
+ gallery view for now
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/pageshells/pageshell.php: pageshell /
+ logged out modification
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/search/gallery.php: Gallery view now displays 3 per row
+
+2008-07-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: further topbar tweak
+
+ * views/default/page_elements/elgg_topbar.php: topbar tweaks
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php,
+ views/default/account/forms/register.php,
+ views/default/account/forms/useradd.php,
+ views/default/canvas/layouts/one_column.php, views/default/css.php: login
+ front door tidied up
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Entity loader support for ElggGroup, refs #106
+
+ * engine/lib/group.php: Bugfix, refs #106
+
+2008-07-01 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/elgg_topbar.php: top_bar icon
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/manifest.xml: Licence in manifest
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/dashboard/index.php, mod/dashboard/manifest.xml,
+ mod/dashboard/start.php, mod/dashboard/views/default/dashboard/welcome.php:
+ No need to have the dashboard plugin. Dashboard is part of core.
+
+ * mod/profile/actions/cropicon.php, mod/profile/actions/iconupload.php,
+ mod/profile/icon.php, mod/profile/views/default/profile/icon.php: Toolbar ->
+ topbar in profile icons
+
+ * mod/profile/actions/cropicon.php, mod/profile/actions/iconupload.php,
+ mod/profile/icon.php, mod/profile/views/default/profile/icon.php: Added
+ toolbar size for the icons
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php, engine/lib/objects.php, languages/en.php: Group
+ class, refs #106
+
+ * engine/schema/mysql.sql: Added groups, refs #106
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Fix for the schema
+
+ * views/default/search/gallery.php: Gallery should probably only be three
+ squares wide for now.
+
+ * views/default/css.php: Small fix for gallery view users
+
+ * mod/profile/views/default/profile/gallery.php: Small fix for gallery view
+ users
+
+ * mod/profile/views/default/profile/gallery.php,
+ mod/profile/views/default/user/user.php,
+ views/default/search/gallery_listing.php, views/default/search/listing.php:
+ Gallery view for users
+
+ * views/default/css.php: CSS additions
+
+2008-07-01 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topmenu.php: previous top menu removed - replaced
+ by new elgg_topbar view
+
+ * _graphics/avatar_mini.gif, _graphics/elgg_toolbar_logo.gif,
+ _graphics/elgg_toolbar_logout.gif, _graphics/toptoolbar_background.gif,
+ views/default/css.php, views/default/page_elements/elgg_topbar.php,
+ views/default/page_elements/header.php: topbar menu
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: The $entity_guid on get_annotations can now be
+ an array.
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Added object in container search, refs #106.
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: get_annotations can now optionally take an
+ array as owner_guid
+
+ * actions/login.php: Users are now logged into the dashboard.
+
+ * engine/lib/elgglib.php, views/default/navigation/gallery.php,
+ views/default/search/gallery.php: Moved navigation/gallery to search/gallery,
+ which makes more sense.
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/group.php: Refs #106: Group prototype class
+
+ * engine/lib/entities.php: Added site_guid to internal db fields
+
+2008-07-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/widgets/wrapper.php: Widgets now load after the main page
+
+2008-07-01 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Refs #106: Added schema
+
+2008-06-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/widgets.php, views/default/canvas/layouts/widgets.php: Added
+ the ability to control widget contexts
+
+2008-06-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/makeadmin.php, languages/en.php,
+ mod/profile/views/default/profile/userdetails.php: Closes #105: Make admin
+ option http://trac.elgg.org/elgg/ticket/105
+
+ * actions/useradd.php, engine/lib/users.php, languages/en.php,
+ views/default/account/forms/useradd.php,
+ views/default/admin/user_opt/adduser.php: Added some user code - needs div
+ hiding
+
+2008-06-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php: Fixed entity page
+
+2008-06-30 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed minor cache counting issue
+
+ * engine/lib/plugins.php, languages/en.php: Refs #102 - Speculative fix
+
+2008-06-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php, views/default/widgets/wrapper.php: Partial fix for
+ constantly-shrinking widgets bug.
+
+2008-06-29 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/footer_logo.gif, views/default/css.php,
+ views/default/page_elements/footer.php: page footer added and msg div fixed
+ for IE
+
+ * _graphics/page_back_linen.gif, _graphics/page_back_linen_shadow.gif,
+ views/default/css.php: new page style, new floating msg box, other fixes &
+ cleanup
+
+2008-06-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/listing.php: changed the friends list
+ view order
+
+2008-06-28 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: more listings items cleanup
+
+ * views/default/css.php: fixed several listing item spacing issues
+
+ * views/default/canvas/layouts/widgets.php, views/default/css.php: cancel
+ button added to widget gallery
+
+2008-06-28 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/listing.php: added user status to the
+ friends view
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: Sanitising search
+
+ * engine/lib/widgets.php: Fixed widget saving
+
+2008-06-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js, views/default/canvas/layouts/widgets.php,
+ views/default/css.php: new widget gallery
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php:
+
+ * engine/lib/entities.php: Caching (most) subtype queries, drastically
+ reduces database queries in most use cases, refs #101
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Introducing friendly_title
+
+ * languages/en.php: Some more translations for comments
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php:
+
+ * engine/lib/metastrings.php: Metastrings now keeps a record of strings it
+ knows aren't present and so removes the need to futher look for them. Refs
+ #101
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Bug fix for previous.
+
+ * engine/lib/elgglib.php: Introducing elgg_count_comments
+
+ * views/default/annotation/generic_comment.php,
+ views/default/comments/forms/edit.php, views/default/css.php: Tweaks to
+ generic comment CSS
+
+ * actions/comments/add.php, actions/comments/delete.php,
+ engine/lib/elgglib.php, languages/en.php,
+ views/default/annotation/generic_comment.php,
+ views/default/comments/forms/edit.php: Brought generic comments into Elgg
+ core
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Using persistent db connections. This should
+ speed up pages with numerous small DB calls. Please report any issues asap.
+ Refs #101
+
+ * engine/lib/metastrings.php: Minor textual changes
+
+ * engine/lib/users.php: Added mapping to cache username => guid & code =>
+ guid. Refs #101.
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/icon.php: Icon menus now work when
+ you're logged out.
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Removed explains since these weren't much use
+
+ * engine/lib/install.php: Db installed flag on config, Refs #101
+
+ * engine/lib/elgglib.php: Caching datalists. Refs #101
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Fixed the contextual nubbin on search indices
+ (really)
+
+ * views/default/css.php: Fixed the contextual nubbin on search indices
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Short circuited query if could not possibly
+ return a value. Refs #101
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Forced search result icon sizes to be 40px
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Refs #101 - DB Profiling in debug mode
+ (recommended usage means putting $CONFIG->debug = true in settings.php)
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: Search now sets context appropriately
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Removed debug warning
+
+2008-06-27 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/metadata.php,
+ engine/lib/relationships.php, engine/lib/sites.php, engine/lib/users.php,
+ friends/index.php, friends/of.php, search/index.php: Added a 'display full
+ view' parameter to all of the listings functions
+
+ * engine/lib/elgglib.php, mod/profile/views/default/profile/listing.php,
+ views/default/search/listing.php: Introducing elgg_view_listing
+
+ * mod/profile/views/default/profile/icon.php: Minor fix to the icon code
+
+ * mod/profile/views/default/profile/icon.php: Fix to icon links, so they
+ display actions too
+
+ * mod/profile/views/default/profile/listing.php, views/default/css.php:
+ Added search listing styles
+
+ * mod/profile/views/default/profile/icon.php: Fix to previous
+
+ * mod/profile/views/default/profile/icon.php: Further contextual menu work
+
+ * mod/profile/javascript.php, mod/profile/profile.js,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/javascript.php,
+ mod/profile/views/default/profile/metatags.php,
+ views/default/navigation/topmenu.php: Initial inclusion of profile icon
+ navigation
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Fixes #100 - User not having any notification
+ method no longer a hard error.
+
+2008-06-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php: tweak to profile language
+
+2008-06-27 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/avatar_menu_arrow.gif, _graphics/avatar_menu_arrow_hover.gif,
+ _graphics/avatar_menu_arrow_open.gif, mod/profile/profile.js,
+ mod/profile/views/default/profile/css.php, views/default/css.php: avatar
+ contextual menus
+
+2008-06-27 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php: Refs #86 - Better debug
+
+ * engine/lib/metastrings.php: Closes #86
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, .../notifications/settings/usersettings.php,
+ views/default/settings/system.php, views/default/user/settings/language.php:
+ Closes #98
+
+ * views/default/input/pulldown.php: Pulldown menu view now supports passing
+ values as well as options as an associative array "value" => "option text"
+ called $vars['options_values']
+
+2008-06-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/listing.php,
+ mod/profile/views/default/user/user.php: Improved profile listings
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Added get_installed_translations() to return an
+ array of available translations together with native language translation of
+ the text. Refs #98
+
+ * languages/en.php: Added ISo-639 language codes, refs #98
+
+2008-06-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: Tweaked the title CSS now that it's going to appear
+ inline within canvases.
+
+ * engine/lib/river.php: Widget river items are now of the form
+ river/widget/handler/event.
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/resetpassword.php, engine/lib/admin.php,
+ engine/lib/users.php, languages/en.php,
+ mod/profile/views/default/profile/userdetails.php: Closes #16:
+ Administration: Reset password functionality on user admin screen
+ http://trac.elgg.org/elgg/ticket/16
+
+2008-06-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/save.php, .../notifications/settings/usersettings/save.php,
+ actions/user/language.php, actions/user/name.php, actions/user/password.php,
+ actions/usersettings/save.php, engine/lib/notification.php,
+ engine/lib/users.php, settings/user/index.php,
+ .../notifications/settings/usersettings.php,
+ views/default/user/settings/email.php,
+ views/default/user/settings/language.php,
+ views/default/user/settings/name.php,
+ views/default/user/settings/password.php,
+ views/default/usersettings/form.php: Unified user settings form
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/register.php: Closes #96: Administration: Add
+ user (with optional admin flag) http://trac.elgg.org/elgg/ticket/96
+
+ * views/default/admin/user_opt/adduser.php: Refs #96: Administration: Add
+ user (with optional admin flag) http://trac.elgg.org/elgg/ticket/96
+
+ * actions/register.php, languages/en.php,
+ views/default/account/forms/register.php, views/default/admin/user.php,
+ views/default/admin/user_opt/adduser.php: Refs #96: Administration: Add user
+ (with optional admin flag) http://trac.elgg.org/elgg/ticket/96
+
+ * actions/user/language.php, engine/lib/languages.php, engine/lib/users.php,
+ languages/en.php, views/default/user/settings/language.php: Closes #92:
+ Settings: Set user language http://trac.elgg.org/elgg/ticket/92
+
+2008-06-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/checkboxes.php: Checkboxes now work happily with
+ arrays.
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/user/name.php, actions/user/password.php, engine/lib/sessions.php,
+ engine/lib/users.php, languages/en.php,
+ views/default/user/settings/password.php: Fixes #91 and #97
+
+ * actions/email/save.php, actions/user/name.php,
+ engine/lib/notification.php, engine/lib/users.php, languages/en.php,
+ views/default/notifications/settings/email.php,
+ views/default/user/settings/email.php, views/default/user/settings/name.php:
+ Closes #90: Settings: Change name http://trac.elgg.org/elgg/ticket/90
+
+2008-06-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php: Layout update for the single entity view.
+
+2008-06-26 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Fixes #95 - Now keying off system log entries so
+ that whenever a user does something that triggers an event they are boosted.
+
+ * views/default/admin/statistics_opt/basic.php: Fixes #94
+
+ * actions/email/save.php, engine/lib/notification.php, languages/en.php,
+ views/default/notifications/settings/email.php: Closes #89: Provide
+ functionality for a user to set their email address in user settings
+ http://trac.elgg.org/elgg/ticket/89
+
+2008-06-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/confirm.php, actions/register.php,
+ engine/lib/notification.php, engine/lib/sites.php, engine/lib/users.php,
+ languages/en.php: Closes #79: Email confirmation on registration & email
+ change http://trac.elgg.org/elgg/ticket/79
+
+2008-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: river icon additions
+
+ * javascript/initialise_elgg.js, views/default/css.php: widget gallery
+ tooltip positioning and layer issue fixed
+
+2008-06-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, search/index.php: Search and metadata functions
+ now support multiple user GUIDs
+
+2008-06-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/email/confirm.php, engine/lib/users.php, languages/en.php: Refs
+ #79
+
+2008-06-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Small ownership tweak to get_tags
+
+ * search/index.php: The search page now takes more options.
+
+2008-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/shout_speech_bubble.gif: shouts bubble
+
+2008-06-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: get_tags can now take an array as owner_guid.
+
+ * engine/lib/filestore.php: Fixes for filestore.
+
+ * engine/lib/filestore.php: Added grabFile() to the filestore, for much more
+ efficient file reading.
+
+ * engine/lib/river.php, engine/lib/system_log.php: Made the friends river
+ entities functions loads more efficient.
+
+2008-06-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Fixes #87 & #88
+
+ * engine/lib/notification.php, engine/lib/relationships.php,
+ languages/en.php: Refs #78: Email notifications on friending, comments
+ http://trac.elgg.org/elgg/ticket/78
+
+2008-06-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, views/default/river/wrapper.php: The river now
+ passes entities to each river view as $vars['entity']
+
+ * engine/lib/annotations.php: Adding an annotation triggers an 'annotate'
+ event
+
+2008-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/spotlight_back.gif, _graphics/temp_spotlight.gif,
+ views/default/css.php, views/default/spotlight/default.php: default spotlight
+
+2008-06-25 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php, engine/lib/sites.php, languages/en.php: Fixes
+ #84: Method for retrieving preferences for a user and notifying accordingly
+ http://trac.elgg.org/elgg/ticket/84
+
+2008-06-25 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updated staus box
+
+ * views/default/css.php: moved message styles into plugin
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: messaging styles
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Removed the circular delete mechanism that was
+ plaguing ElggFile
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/ajax/loader.php: centred loader gif
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Caching the show_db_tables function
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php, views/default/css.php:
+ profile box fixes
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Serious memory optimisation for the photo resize
+ functions
+
+2008-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/odd/canvas/default.php, views/odd/object/default.php,
+ views/odd/user/default.php: Refs #82 - oops... forgot to add these...
+
+ * .../notifications/settings/usersettings/save.php,
+ engine/lib/notification.php, languages/en.php,
+ .../notifications/settings/usersettings.php: Closes #83 - API & Interface for
+ selecting notification methods
+
+ * actions/plugins/settings/save.php, actions/plugins/usersettings/save.php:
+ Added gatekeeper
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php, engine/lib/sites.php: Removing more notices.
+
+ * engine/lib/entities.php: Removing an annoying notice
+
+ * engine/lib/elgglib.php: Minor fix to elgg_view_entity where ElggEntities
+ are subclassed
+
+2008-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/edit.php: Fixes #69 - Clicking on profile "edit" causes crash.
+ I have retrieved the user again from $_SESSION['id'] since
+ $_SESSION['user'] is not being set. This may point to a larger problem since
+ the $_SESSION looks far from complete.
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Fix for previous river functionality
+
+ * engine/lib/river.php: Minor formatting fix
+
+ * views/default/admin/plugins.php: Update plugins list so 50 display on a
+ page
+
+ * engine/lib/river.php: A fix to the river function.
+
+2008-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php, views/odd/export/entity.php,
+ views/odd/export/metadata.php, views/odd/export/relationship.php,
+ views/odd/pageshells/pageshell.php: Closes #82: OpenDD feeds in the same vein
+ as RSS http://trac.elgg.org/elgg/ticket/82
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/widgets/editwrapper.php: Fix to edit wrapper saving
+
+ * views/default/pageshells/pageshell.php: Removing title from pageshell
+ outright
+
+ * views/default/page_elements/title.php,
+ views/default/widgets/editwrapper.php: Introducing elgg_view_title
+
+ * engine/lib/elgglib.php: Introducing elgg_view_title
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updated
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/save.php, views/default/widgets/editwrapper.php: Save
+ widget improvements.
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/userdetails.php,
+ mod/profile/views/default/user/user.php,
+ .../canvas/layouts/narrow_right_sidebar.php,
+ views/default/canvas/layouts/two_column.php,
+ views/default/canvas/layouts/widgets.php, views/default/css.php,
+ views/default/pageshells/pageshell.php: updated profile box
+
+2008-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/plugins/usersettings/save.php, engine/lib/plugins.php,
+ languages/en.php, settings/plugins/index.php,
+ views/default/object/plugin.php, views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php: Refs #76: User settings
+ page (to Elgg Classic standard)
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: River views now run off subtypes
+
+ * views/default/ajax/loader.php: Introducing the AJAX loader
+
+ * _graphics/ajax-loader.gif, _graphics/ajax_loader.gif,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php:
+ Widgets now reload properly
+
+2008-06-24 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/ajax-loader.gif: ajax loader gif
+
+2008-06-24 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php, languages/en.php,
+ .../default/usersettings/statistics_opt/online.php: Refs #76: User settings
+ page (to Elgg Classic standard)
+
+2008-06-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/cropicon.php,
+ views/default/canvas/layouts/widgets.php: Widget fixes
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/cropicon.php: Added mission crop icon action
+
+2008-06-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: container box fixes
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: No need to duplicate
+ the user's name.
+
+ * engine/lib/filestore.php, mod/profile/actions/iconupload.php,
+ mod/profile/languages/en.php, mod/profile/start.php,
+ mod/profile/views/default/profile/editicon.php: Image cropping works!
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php: rearranged the main
+ profile area
+
+ * mod/profile/views/default/profile/userdetails.php: moved the about me
+ below the other profile info
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/widgets/editwrapper.php: Some tweaks to
+ the 'saving' box
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php, languages/en.php, settings/index.php,
+ settings/plugins/index.php, settings/statistics/index.php,
+ settings/user/index.php, usersettings/index.php,
+ usersettings/plugins/index.php, usersettings/statistics/index.php,
+ usersettings/user/index.php, views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ .../usersettings/statistics_opt/numentities.php: Refs #76: User settings page
+ (to Elgg Classic standard). Committing some work before shutting down for the
+ day.
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: small bug fix on icon
+ cropper
+
+2008-06-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/dummy_river_icon.gif, views/default/css.php: river updates
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/river/dashboard.php: Removed extra divs.
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: more icon cropper tweaks,
+ form added
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * entities/index.php, views/default/widgets/editwrapper.php,
+ views/default/widgets/wrapper.php: Widgets now save on a per-widget basis.
+ TODO: get the collapsing widgets to work once they've saved ..
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php:
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: coordinates in for the
+ icon cropper
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php: Widgets are now loaded as
+ separate JS scripts
+
+ * engine/lib/elgglib.php, views/js/object/default.php,
+ views/js/pageshells/pageshell.php, views/js/user/default.php: You can now get
+ a Javascript version of any entity
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php, engine/lib/usersettings.php, engine/start.php,
+ languages/en.php, usersettings/index.php, usersettings/plugins/index.php,
+ usersettings/statistics/index.php, usersettings/user/index.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php,
+ views/default/admin/main_opt/statistics.php,
+ views/default/admin/main_opt/user.php, views/default/object/plugin.php,
+ views/default/usersettings/main.php,
+ views/default/usersettings/main_opt/plugins.php,
+ views/default/usersettings/main_opt/statistics.php,
+ views/default/usersettings/main_opt/user.php,
+ views/default/usersettings/plugins.php,
+ views/default/usersettings/plugins_opt/plugin.php,
+ views/default/usersettings/statistics.php,
+ views/default/usersettings/user.php: Refs #76: User settings page (to Elgg
+ Classic standard). Committing some work before shutting down for the day.
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/editicon.php: added coordinates to the
+ icon cropper
+
+ * .../views/default/profile/hoverover/actions.php,
+ .../views/default/profile/hoverover/links.php,
+ mod/profile/views/default/profile/menu/actions.php,
+ mod/profile/views/default/profile/menu/links.php,
+ .../views/default/profile/menu/linksownpage.php,
+ mod/profile/views/default/profile/profilelinks.php: new profile links system.
+
+2008-06-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php, views/default/css.php: css
+ updates
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php,
+ .../views/default/js/jquery.imgareaselect-0.4.2.js,
+ .../default/js/jquery.imgareaselect-0.4.2.min.js,
+ mod/profile/views/default/profile/editicon.php: beginnings of the icon
+ cropper tool
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * settings/index.php, settings/plugins/index.php: Refs #76: User settings
+ page (to Elgg Classic standard)
+
+ * settings/plugins/index.php: Refs #76: User settings page (to Elgg Classic
+ standard)
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php: Fix to icon upload
+
+ * views/default/css.php, views/default/page_elements/header.php,
+ views/default/pageshells/pageshell.php: Page title is now displayed at the
+ top of the canvas.
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * settings/index.php:
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/icon.php, mod/profile/views/default/profile/icon.php: Added
+ master icon size (part 2)
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php: Forwards to
+ http_referer
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php: Added master icon size
+
+2008-06-23 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php:
+ Forwards to http_referer
+
+ * views/default/admin/plugins.php: Pagination on admin page
+
+ * engine/handlers/cron_handler.php, htaccess_dist: Closes #77 - Cron
+ endpoint and event
+
+ * languages/en.php: Refs #75
+
+ * views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/online.php: Refs #75
+
+2008-06-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: Update for pagination, to allow
+ it to properly take a word other than 'offset' as the word to work from.
+
+2008-06-23 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/pagination.php: greater than, less than
+ pagination symbol changed
+
+2008-06-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/messages/messages/list.php: system messages now fade out
+ after 3 seconds.
+
+2008-06-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ views/default/navigation/pagination.php: Introducing the annotation listing
+ functions.
+
+ * engine/lib/elgglib.php, engine/lib/metastrings.php: Introducing
+ elgg_view_annotation
+
+2008-06-22 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/profilelinks.php,
+ mod/profile/views/default/profile/userdetails.php: added a new profile links
+ view
+
+2008-06-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php: Fixes #72
+
+2008-06-21 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/spotlight/default.php: tweaks to the
+ spotlight
+
+ * mod/profile/views/default/profile/userdetails.php: a further temp tweak to
+ the profile layout
+
+ * mod/profile/views/default/profile/userdetails.php,
+ views/default/canvas/layouts/widgets.php: a couple of small, temp, profile
+ layout tweaks.
+
+2008-06-21 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Plugin init only called on sanitised installs where
+ installation is complete.
+
+2008-06-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/page_elements/spotlight.php: Improvements
+ to spotlight
+
+ * views/default/page_elements/spotlight.php,
+ views/default/spotlight/default.php: Plugins can set their own context
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Added licence example
+
+2008-06-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php, mod/profile/edit.php,
+ mod/profile/views/default/profile/edit.php: Fixed profile, and allowed admins
+ to edit other profiles
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php: Fixes #71
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php: Additional
+ fixes to #70
+
+2008-06-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php:
+ Changed the engine reference in the action
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php:
+
+ * actions/plugins/settings/save.php, engine/lib/plugins.php,
+ languages/en.php, views/default/admin/plugins_opt/plugin.php,
+ views/default/object/plugin.php: Closes #66: Per site plugin settings
+ configuration panel. Use the same technique as edit pages on widgets, i.e.
+ 1) Create a new view in your plugins view/default called
+ settings/PLUGINNAME/edit Where PLUGINNAME is the plugin directory, eg
+ "river" or "profile". 2) Place your edit code in edit.php, fields should
+ save to params[fieldname]. 3) The view will be passed $vars['entity'] which
+ holds any configuration values already set in the metadata. Note. Settings
+ are PER SITE.
+
+ * .../views/default/widgets/river_widget/edit.php,
+ .../default/widgets/river_widget_friends/edit.php: Using a different test to
+ handle metadata better
+
+ * languages/en.php, mod/river/manifest.xml,
+ views/default/admin/plugins_opt/plugin.php: Closes #67 : Added new displayed
+ field "licence"
+
+2008-06-20 misja <misja@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/dashboard/manifest.xml, mod/profile/manifest.xml: Adding manifest
+ files to plugins
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/plugins/disable.php, actions/admin/plugins/enable.php,
+ admin/plugins/index.php, engine/lib/plugins.php, languages/en.php,
+ views/default/admin/plugins.php, views/default/admin/plugins_opt/plugin.php,
+ views/default/object/plugin.php: Closes #20: Plugin management and config
+ panel http://trac.elgg.org/elgg/ticket/20
+
+ * actions/admin/site/update_basic.php: Added admin gatekeeper
+
+2008-06-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/profile/edit.php,
+ views/default/canvas/layouts/widgets.php: Widget gallery updates -
+ internationalised and more
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Further fixes #59
+
+ * mod/river/languages/en.php, mod/river/manifest.xml, mod/river/start.php:
+ Using new manifest code (via manifest.xml)
+
+ * engine/lib/plugins.php: Bypass plugin loading disable code
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php, engine/start.php: Closes
+ #60: Enable/disable plugins on a site by site basis
+ http://trac.elgg.org/elgg/ticket/60
+
+ * engine/lib/elgglib.php: Bugfixes on privileged code execution.
+
+ * engine/lib/database.php: Removed database gatekeepers to avoid chicken and
+ egg problems with privileged codeblock execution, and because it is too
+ problematic.
+
+ * engine/lib/plugins.php: Actually closes #60: Enable/disable plugins on a
+ site by site basis http://trac.elgg.org/elgg/ticket/60
+
+ * engine/lib/metadata.php, engine/lib/plugins.php: Closes #60:
+ Enable/disable plugins on a site by site basis
+
+2008-06-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: update_data now returns true on a successful
+ update.
+
+ * mod/profile/views/default/profile/userdetails.php: Let's use a slightly
+ smaller image on the main profile page ..
+
+ * mod/profile/graphics/defaultlarge.jpg,
+ mod/profile/graphics/defaultmedium.jpg,
+ mod/profile/graphics/defaultsmall.jpg, mod/profile/graphics/defaulttiny.jpg:
+ New default profile pics
+
+2008-06-20 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/plugins.php: Refs #61 - Added ability to find settings for
+ plugins other than the one you are in.
+
+ * engine/lib/plugins.php: Closes #61: Enable plugins to store site specific
+ configurations
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/canvas/default.php,
+ views/default/page_elements/header.php, views/foaf/pageshells/pageshell.php,
+ views/rss/canvas/default.php, views/rss/object/default.php,
+ views/rss/pageshells/pageshell.php, views/rss/user/default.php: Automatic RSS
+ feeds!
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Re-enabled database gatekeepers, please report
+ problems. Refs #3, #45
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/widgettest/start.php, .../views/default/widgets/widgettest/edit.php,
+ .../views/default/widgets/widgettest/view.php: Removing widgettest, which has
+ done its job.
+
+ * mod/river/languages/en.php, mod/river/start.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/view.php,
+ views/default/widgets/wrapper.php: Put titles back in their correct place for
+ widgets.
+
+ * engine/lib/system_log.php: System_log no longer adds double entries.
+
+ * engine/lib/river.php, views/default/river/wrapper.php: Minor improvement
+ to previous - river items now are wrapped in a number of divs that make sense
+ according to what they refer to
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/river/languages/en.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/edit.php,
+ .../default/widgets/river_widget_friends/view.php: Fixes #50
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php, .../views/default/river/ElggUser/update.php,
+ views/default/river/wrapper.php: Modified river functions to use a common
+ wrapper
+
+ * mod/profile/languages/en.php, .../views/default/river/ElggUser/update.php:
+ Profile updates now show up in the river.
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php:
+
+ * engine/lib/plugins.php, languages/en.php, mod/river/languages/en.php,
+ mod/river/start.php: Closes #59: Plugin manifest. See
+ register_plugin_manifest() & register_plugin_manifest_basic(). Ref #20.
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/profile.js, mod/profile/views/default/profile/metatags.php:
+ Removing the hoverover menu. Refs #58
+
+ * mod/profile/views/default/profile/css.php: CSS update for hoverover
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php, engine/lib/users.php,
+ views/default/admin/statistics_opt/online.php: Fixes #55 : "Users online now"
+ function
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/topmenu.php: Wired up search
+
+ * mod/profile/views/default/profile/hoverover.php,
+ .../views/default/profile/hoverover/actions.php,
+ .../views/default/profile/hoverover/links.php: Sorting hoverover links into
+ actions and plain links
+
+ * mod/profile/views/default/profile/hoverover.php: Whoops! Replacing
+ 'bwerdmuller' with $vars['entity']->username
+
+ * mod/profile/profile.js, mod/profile/start.php,
+ mod/profile/views/default/profile/css.php,
+ mod/profile/views/default/profile/hoverover.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/profile/menu.php,
+ mod/profile/views/default/profile/metatags.php,
+ mod/profile/views/default/user/user.php: Added a hover-over menu, which can
+ be added to by plugins.
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Ref #57
+
+ * engine/lib/river.php, languages/en.php, mod/river/start.php,
+ .../views/default/widgets/river_widget/edit.php,
+ .../views/default/widgets/river_widget/view.php,
+ .../default/widgets/river_widget_friends/edit.php,
+ .../default/widgets/river_widget_friends/view.php,
+ views/default/river/dashboard.php: Fixed #50: River widgets
+ http://trac.elgg.org/elgg/ticket/50
+
+ * mod/profile/views/default/profile/userdetails.php: Fixes #56
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php, friends/index.php, friends/of.php: The
+ friends pages now use listing functions; also fixed a minor bug in the
+ get_entities_from_relationship function.
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: *actually* fixes #48: Elgg_view_river wrapper
+ function http://trac.elgg.org/elgg/ticket/48
+
+ * engine/lib/river.php: Fixes #48: Elgg_view_river wrapper function
+ http://trac.elgg.org/elgg/ticket/48
+
+2008-06-19 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js, views/default/canvas/layouts/widgets.php,
+ views/default/css.php: final amends to popups
+
+2008-06-19 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Fixes #54 - 'Enabled' functionality needs to be
+ added to metadata, refs #53
+
+2008-06-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Minor change to the navigation placement on list
+ view.
+
+ * engine/schema/mysql.sql: Added 'enabled' field to annotations. Refs #51
+
+2008-06-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js, views/default/canvas/layouts/widgets.php,
+ views/default/css.php: widget description popups added
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Hopefully fixed default wwwroot. refs #51 -
+ Misja, if this works for you, could you please close the ticket?
+
+2008-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php,
+ engine/lib/entities.php: Fixes #15: Ban user functionality
+
+ * engine/lib/access.php, engine/schema/mysql.sql: Fixes #12: Active variable
+ on entities table. Update db schema.
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * dashboard/index.php: Introducing the dashboard!
+
+ * engine/lib/entities.php, engine/lib/languages.php, engine/lib/sites.php,
+ engine/lib/users.php, engine/lib/widgets.php: Removing some error notices
+
+2008-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Speculative fix for mac install
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/widgets/editwrapper.php: Better access
+ control labels.
+
+ * engine/lib/database.php: Re-commented out callpath_gatekeeper. refs #37
+
+2008-06-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: added default class for submit buttons
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/reorder.php, languages/en.php: Corrected widget panel save
+ messages.
+
+ * actions/widgets/reorder.php, engine/lib/widgets.php,
+ views/default/canvas/layouts/widgets.php, views/default/input/access.php:
+ Added widget handling.
+
+2008-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/user/index.php, views/default/admin/user_opt/search.php: Minor tweak
+ to make compatible with search form
+
+ * engine/lib/sites.php: Fixes #43: Site full text search over name,
+ description and url
+
+ * engine/lib/objects.php: Fixes #42: Object full text search on description
+
+ * admin/user/index.php, engine/lib/users.php, views/default/admin/user.php:
+ Further fixes to #41 with admin panel support
+
+ * admin/user/index.php, engine/lib/users.php, engine/schema/mysql.sql: Fixes
+ #41: User full text search. See caveats in function search_for_user()
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, views/default/navigation/pagination.php: Interface
+ tweak when no results are found.
+
+ * views/default/canvas/layouts/widgets.php: Descriptions are now registered
+ in widgets as a hidden field.
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/metadata.php,
+ engine/lib/relationships.php, engine/lib/sites.php, engine/lib/users.php,
+ languages/en.php, search/index.php, views/default/navigation/pagination.php:
+ Added generic listing and pagination functions
+
+2008-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/elgglib.php, languages/en.php, views/default/settings/system.php:
+ Fixes #18: Set default view type in admin http://trac.elgg.org/elgg/ticket/18
+
+2008-06-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js, views/default/canvas/layouts/widgets.php:
+ widget drag n drop
+
+2008-06-18 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/configuration.php, languages/en.php,
+ views/default/input/checkboxes.php, views/default/settings/system.php: Fixes
+ #17 - Debug mode toggle. Introduced unset_config() which is also called
+ automatically by set_config(). Also modified the view input/checkboxes to set
+ values on the checkbox.
+
+ * actions/admin/site/update_basic.php, actions/systemsettings/install.php,
+ engine/lib/configuration.php, languages/en.php,
+ views/default/settings/system.php: Fixes #19: Default language selector
+ http://trac.elgg.org/elgg/ticket/19
+
+2008-06-18 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/account/forms/login.php,
+ views/default/account/forms/register.php, views/default/css.php: tweaked
+ login boxes n buttons
+
+2008-06-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/widgets.php: Added GUIDs and handlers to the
+ widget panel
+
+2008-06-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../canvas/layouts/narrow_right_sidebar.php, views/default/css.php:
+ updated page layout
+
+2008-06-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, languages/en.php: Fixes #24 - Added a funky
+ display function called friendly_time($timestamp).
+
+ * engine/start.php: Fixed #36 - CSS now works on the install page.
+
+ * engine/lib/sessions.php: isloggedin() doesn't touch the session if we're
+ not fully installed yet.
+
+2008-06-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * install.php: - To use main site config Marcus Povey
+
+ * install.php: CLOSED - #36: CSS broken on initial install page.
+ http://trac.elgg.org/elgg/ticket/36
+
+ * engine/lib/elgglib.php, engine/lib/input.php, engine/lib/install.php,
+ engine/settings.example.php, engine/start.php, htaccess_dist,
+ languages/en.php, views/default/messages/sanitisation/htaccess.php,
+ views/default/messages/sanitisation/settings.php,
+ views/failsafe/messages/errors/error.php,
+ views/failsafe/messages/errors/list.php,
+ views/failsafe/messages/exceptions/exception.php,
+ views/failsafe/messages/list.php,
+ views/failsafe/messages/sanitisation/htaccess.php,
+ views/failsafe/messages/sanitisation/settings.php,
+ views/failsafe/pageshells/pageshell.php: CLOSED - #34: Install process must
+ be completely graphical http://trac.elgg.org/elgg/ticket/34
+
+2008-06-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Fixed #37. It turns out callpath_gatekeeper
+ worked fine; PHP 5.2 with the Zend Optimizer 3.2 does not, which was borking
+ our OSX MAMP installation. We're going to need a great big red warning box
+ for people installing on a Mac, alerting them to the fact that they'll need
+ to switch off the Optimizer.
+
+2008-06-17 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: updated css
+
+2008-06-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Removed references to callpath_gatekeeper.
+
+ * engine/lib/database.php: Disabling the gatekeeper for now. Reopened #3
+
+ * engine/start.php: We need actions to work when the installation hasn't
+ been settled. Refs #3
+
+2008-06-17 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, views/default/river/ElggRelationship/create.php,
+ views/default/river/ElggUser/login.php,
+ views/default/river/ElggUser/logout.php, views/default/river/dashboard.php,
+ views/default/river/shell.php: CLOSED - #35: Create specific river views for
+ dashboard http://trac.elgg.org/elgg/ticket/35
+
+2008-06-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php: is_installed now returns a much more
+ representative result. Refs #3
+
+ * engine/lib/filestore.php, mod/profile/actions/iconupload.php,
+ mod/profile/languages/en.php: Fixed #33 - all profile icons except for the
+ largest size are cropped to squares. Additionally, the image resampling
+ functions now take an extra boolean parameter to specify squareness (or not).
+
+2008-06-17 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/index.php, admin/plugins/index.php, admin/site/index.php,
+ admin/statistics/index.php, admin/user/index.php: pushed the admin panel
+ through the correct canvas area
+
+ * mod/apitest/index.php, mod/apitest/start.php,
+ mod/apitest/views/default/apitest/configform.php,
+ mod/apitest/views/default/apitest/main.php, mod/exporttest/index.php,
+ mod/exporttest/start.php, mod/exporttest/views/default/exporttest/main.php,
+ .../views/default/exporttest/outputxml.php, mod/guidbrowser/index.php,
+ mod/guidbrowser/languages/en.php, mod/guidbrowser/start.php,
+ .../views/default/guidbrowser/browser.php,
+ .../views/default/guidbrowser/entity.php,
+ .../views/default/guidbrowser/entity_full.php,
+ .../views/default/guidbrowser/newentity.php,
+ .../views/default/guidbrowser/prevnext.php: removed guid exporter, exporttest
+ and apitest from core and put them into the plugins folder
+
+2008-06-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php, engine/lib/plugins.php,
+ views/default/navigation/toolbox.php: Sticky menu items, but also, much more
+ intelligent context detection. Plugin authors need not bother with
+ set_context() any more - the context should be set automatically. This is
+ overruled by page handling settings, if set, which use the first element of
+ the URL to determine context. Fixes #32
+
+ * engine/lib/plugins.php: More intelligent context detection. Refs #32
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php, mod/profile/start.php,
+ views/default/navigation/toolbox.php: Registers contexts for each menu item.
+ Refs #32
+
+2008-06-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: CLOSED - #30: $CONFIG is not populated from
+ elggconfig or datalists http://trac.elgg.org/elgg/ticket/30
+
+2008-06-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/userdetails.php: updated profile interface
+
+ * views/default/css.php: updated css
+
+2008-06-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: CLOSED - #26: Lengthing metadata fields
+ http://trac.elgg.org/elgg/ticket/26
+
+2008-06-16 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * .../canvas/layouts/narrow_right_sidebar.php,
+ views/default/canvas/layouts/one_column.php,
+ views/default/canvas/layouts/two_column.php,
+ views/default/canvas/layouts/widgets.php: new canvas area added
+
+2008-06-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: CLOSED - #5: Boolean metadata values
+ http://trac.elgg.org/elgg/ticket/5
+
+ * engine/lib/xml-rpc.php: - Minor tweak to exception report. Marcus Povey
+
+ * engine/handlers/xml-rpc_handler.php, engine/lib/xml-rpc.php,
+ htaccess_dist, languages/en.php, views/xml/xml-rpc/output.php: CLOSED - #14:
+ XML-RPC handler http://trac.elgg.org/elgg/ticket/14
+
+2008-06-16 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js: updated interface js to fix submit button
+ bug
+
+2008-06-16 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/xml/pageshells/pageshell.php: Added Content-Length to XML pageshell
+ for compatibility with most XML based formats.
+
+ * engine/lib/sessions.php: CLOSED - #27: Standard login system to go through
+ PAM http://trac.elgg.org/elgg/ticket/27
+
+2008-06-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php: Search once again displays results. Fixes #28
+
+ * views/default/widgets/wrapper.php: Widget edit controls now only appear if
+ you can edit the widget in question.
+
+2008-06-15 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/widgets/wrapper.php: small tweak to the widget wrapper
+
+2008-06-13 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _graphics/icon_customise_drag.gif, _graphics/icon_customise_info.gif,
+ _graphics/icon_customise_remove.gif, javascript/initialise_elgg.js,
+ .../jquery/jquery-ui-personalized-1.5.packed.js,
+ views/default/canvas/layouts/widgets.php, views/default/css.php,
+ views/default/navigation/toolbox.php, views/default/page_elements/header.php:
+ updated and new stuff pertaining to the customise panel, new jquery also
+
+2008-06-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/profile/userdetails.php:
+
+ * views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php: - Fixed basic statistics
+ Marcus Povey
+
+ * actions/admin/user/ban.php:
+
+2008-06-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: added $order to docs
+
+2008-06-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed typo
+
+2008-06-13 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/entities.php: getAnnotations now
+ has an extra param $order
+
+2008-06-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Metadata now inherits its parent entity's
+ permissions
+
+ * engine/lib/widgets.php: using_widgets();
+
+ * views/default/input/access.php, views/default/widgets/editwrapper.php:
+ Added access controls to widgets and fixed the access control input
+
+2008-06-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/user/ban.php, actions/admin/user/delete.php,
+ languages/en.php, mod/profile/views/default/profile/userdetails.php,
+ views/default/admin/user.php: ASSIGNED - # 2: Administration panel
+ http://trac.elgg.org/elgg/ticket/2 - Added ban template and delete
+
+2008-06-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php: Fixed
+ update/insert issue on all top-level entities
+
+ * views/default/canvas/layouts/widgets.php: Added the stub for Pete's widget
+ reorderer
+
+ * engine/lib/widgets.php: Widget fix
+
+2008-06-13 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * admin/user/index.php: - Some thoughts Marcus Povey
+
+ * engine/lib/database.php, engine/lib/entities.php, languages/en.php,
+ .../views/default/guidbrowser/entity_full.php: Marcus Povey: CLOSED - # 9:
+ FilePluginFile not found http://trac.elgg.org/ticket/9
+
+ * admin/user/index.php, languages/en.php, views/default/admin/site.php,
+ views/default/admin/statistics_opt/online.php, views/default/admin/user.php,
+ views/default/admin/user_opt/search.php: - User search box Marcus Povey
+
+2008-06-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/statistics.php,
+ views/default/admin/statistics.php,
+ views/default/admin/statistics_opt/basic.php,
+ views/default/admin/statistics_opt/numentities.php,
+ views/default/admin/statistics_opt/online.php: - Moved statistics to their
+ own component views. Yay. Marcus Povey
+
+2008-06-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apitest/index.php, mod/exporttest/index.php,
+ mod/guidbrowser/index.php: put remaining core plugins through the canvas
+ views
+
+ * mod/profile/edit.php, mod/profile/editicon.php: piped remaining profile
+ pages through the canvas system
+
+ * views/default/editmenu.php, views/default/pageshell.php: removing some old
+ views
+
+2008-06-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/widgets/add.php, actions/widgets/save.php, engine/lib/widgets.php,
+ mod/profile/index.php, mod/profile/start.php, mod/widgettest/start.php,
+ .../views/default/widgets/widgettest/edit.php,
+ .../views/default/widgets/widgettest/view.php,
+ views/default/canvas/layouts/widgets.php, views/default/widgets/wrapper.php:
+ Widgets, including a test widget plugin
+
+ * views/default/canvas/layouts/widgets.php: The widget canvas layout now
+ automatically grabs widgets.
+
+ * engine/lib/elgglib.php: We only have one pageshell.
+
+ * engine/lib/widgets.php: Extra helpful widgets functions
+
+ * actions/widgets/save.php, engine/lib/widgets.php, languages/en.php,
+ views/default/widgets/editwrapper.php: Widget API changes, as well as edit
+ and action infrastructure
+
+2008-06-12 marcus <marcus@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/statistics.php:
+
+2008-06-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/object/widget.php: Added a simple widget alias so widgets
+ display automatically.
+
+ * views/default/canvas/layouts/one_column.php,
+ views/default/canvas/layouts/two_column.php,
+ views/default/canvas/layouts/widgets.php,
+ views/default/widgets/editwrapper.php, views/default/widgets/wrapper.php:
+ Widget wrapper, widget views
+
+2008-06-12 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/pageshells/pageshell.php: logic for not displaying toolbar
+ when non-logged
+
+ * views/default/welcome/logged_in.php: updated welcome pages
+
+ * views/default/page_elements/spotlight.php: new view for page spotlight
+
+ * views/default/welcome/logged_out.php: toolbar switched off for non-logged
+ users
+
+ * _graphics/skyscraper.gif: placeholder skyscaper ad for non logged-in pages
+
+ * views/default/canvas/layouts/one_column.php,
+ views/default/canvas/layouts/two_column.php, views/default/css.php,
+ views/default/pageshells/pageshell.php: new layout using canvas view
+
+2008-06-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Further documentation fixes.
+
+ * engine/lib/entities.php: Some extra entity documentation
+
+2008-06-12 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/statistics.php,
+ views/default/admin/site.php, views/default/admin/statistics.php: Marcus
+ Povey <marcus@dushka.co.uk> * Added stub for statistics * Added stub
+ statistics library
+
+2008-06-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/widgets.php: Added use_widgets function to register a context
+ for widget use.
+
+ * engine/lib/widgets.php: Added widgets library to core.
+
+2008-06-12 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/pageshells/pageshell_loggedout.php,
+ views/default/pageshells/pageshell_sidebar.php: removed old pageshells
+
+2008-06-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/admin.php, engine/lib/entities.php: Edit permissions changes
+ for admins
+
+2008-06-11 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * javascript/initialise_elgg.js: new subdirectory added to house the init js
+ for the page - feel free to move elsewhere
+
+ * views/default/css.php, views/default/navigation/toolbox.php,
+ views/default/navigation/topmenu.php, views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/pageshells/pageshell.php: latest interface stuff
+
+ * _graphics/footer_back.gif, _graphics/spacer.gif,
+ _graphics/temp_spotlight.gif: new images added
+
+ * _graphics/pagebackground.gif, _graphics/pagebackground.jpg: old images
+ removed
+
+2008-06-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/admin/site/update_basic.php: Marcus Povey <marcus@dushka.co.uk> *
+ Removed debug
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Default of
+ can_edit_entity trigger plugin hook set to true.
+
+ * actions/admin/site/update_basic.php, engine/lib/admin.php,
+ engine/lib/entities.php, engine/lib/sites.php, languages/en.php,
+ views/default/admin/site.php: Marcus Povey <marcus@dushka.co.uk> * Basic site
+ admin
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * All queries
+ echoed in debug mode
+
+ * views/default/admin/plugins.php: Marcus Povey <marcus@dushka.co.uk> *
+ Comments
+
+ * engine/lib/admin.php: Marcus Povey <marcus@dushka.co.uk> * Documentation
+
+ * admin/index.php, admin/plugins/index.php, admin/site/index.php,
+ admin/user/index.php, engine/lib/admin.php, engine/lib/elgglib.php,
+ languages/en.php, views/default/admin/main.php,
+ views/default/admin/main_opt/plugins.php,
+ views/default/admin/main_opt/site.php, views/default/admin/main_opt/user.php,
+ views/default/admin/plugins.php, views/default/admin/site.php,
+ views/default/admin/user.php: Marcus Povey <marcus@dushka.co.uk> * Initial
+ administration panel
+
+ * engine/lib/admin.php, engine/lib/elgglib.php:
+
+ * engine/lib/sessions.php: Marcus Povey <marcus@dushka.co.uk> * actions with
+ admin only support
+
+ * engine/lib/actions.php: Marcus Povey <marcus@dushka.co.uk> * actions with
+ admin only support
+
+ * admin/index.php, admin/plugins/index.php, admin/settings/index.php,
+ admin/users/index.php, engine/lib/admin.php: Marcus Povey
+ <marcus@dushka.co.uk> * Starting admin and relocating to the garden...
+
+2008-06-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php, mod/profile/icon.php,
+ mod/profile/views/default/profile/icon.php: Fixed icon cache issue.
+
+2008-06-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Marcus Povey <marcus@dushka.co.uk> * Introducing
+ admin_gatekeeper()
+
+2008-06-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, languages/en.php: Marcus Povey
+ <marcus@dushka.co.uk> * Debug added to site installation
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Spelling
+ error
+
+2008-06-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/output/tags.php: Sorting out tag links.
+
+ * engine/schema/mysql.sql: Added an explicit conversion to MyISAM in the db
+ tables when a FULLTEXT key is used.
+
+2008-06-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php:
+
+ * engine/lib/languages.php:
+
+2008-06-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: A better fix for language pack loading ...
+
+ * mod/profile/languages/en.php: Fixed a bad header in profile
+
+ * engine/lib/languages.php: Fix for language pack loading.
+
+2008-06-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Marcus Povey <marcus@dushka.co.uk> * Modified
+ elgg_echo to return $message_key if no translations found, meaning you will
+ always get _something_ from the command and will serve to prompt people for
+ missing translations.
+
+2008-06-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Error text change.
+
+ * engine/start.php: Languages are now loaded before the main engine starts.
+
+ * engine/lib/actions.php, engine/lib/configuration.php,
+ engine/lib/database.php, engine/lib/elgglib.php, engine/lib/entities.php,
+ engine/lib/export.php, engine/lib/filestore.php, engine/lib/install.php,
+ engine/lib/languages.php, engine/lib/notification.php,
+ engine/lib/objects.php, engine/lib/sessions.php, engine/lib/sites.php,
+ engine/lib/system_log.php, engine/lib/users.php, engine/start.php,
+ mod/apitest/start.php, mod/dashboard/start.php, mod/exporttest/start.php,
+ mod/guidbrowser/start.php, mod/profile/start.php: register_event_handler and
+ trigger_event have been renamed to register_elgg_event_handler and
+ trigger_elgg_event respectively.
+
+2008-06-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, languages/en.php: Marcus Povey
+ <marcus@dushka.co.uk> * Debug added to db connect
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Bugfix on
+ filestore
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Removed
+ debug
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Bugfixed
+ canEdit and isFullyLoaded
+
+2008-06-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Caching complete
+
+ * engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php:
+
+ * engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php: Marcus
+ Povey <marcus@dushka.co.uk> * Added the code to the correct method. Doh!
+
+ * engine/lib/entities.php, engine/lib/users.php:
+
+ * engine/lib/users.php:
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php:
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Added table
+ counter
+
+2008-06-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Annoying typo bugfix
+
+ * views/default/page_elements/header.php: Moving the location of metatags so
+ that we can add jQuery plugins after jQuery gets loaded.
+
+2008-06-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php:
+
+2008-06-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Fixed class instanceof errors
+
+2008-06-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php, engine/lib/users.php: Marcus Povey
+ <marcus@dushka.co.uk> * Reverted caching error
+
+ * engine/lib/entities.php, engine/lib/sites.php, engine/lib/users.php:
+ Marcus Povey <marcus@dushka.co.uk> * Added caching to entities. Please report
+ any problems.
+
+2008-06-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/users.php: Interim fix for user saving
+
+2008-06-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/messages/exceptions/exception.php: Marcus Povey
+ <marcus@dushka.co.uk> * Updated to show improved debug in debug mode.
+
+ * views/default/messages/exceptions/exception.php: Marcus Povey
+ <marcus@dushka.co.uk> * Updated to show improved debug in debug mode.
+
+2008-06-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Fixed previously-introduced entity save issue.
+
+ * engine/lib/entities.php: There are line breaks in my query. Hrm.
+
+ * engine/lib/entities.php: Fixed issue on save
+
+2008-06-06 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, languages/en.php: Marcus Povey <marcus@dushka.co.uk> *
+ More internationalisation
+
+ * languages/en.php, services/api/rest.php: Marcus Povey
+ <marcus@dushka.co.uk> * More internationalisation
+
+ * languages/en.php, services/export/handler.php: Marcus Povey
+ <marcus@dushka.co.uk> * More internationalisation
+
+ * languages/en.php, views/default/export/entity.php: Marcus Povey
+ <marcus@dushka.co.uk> * More internationalisation
+
+ * engine/lib/query.php, languages/en.php: Marcus Povey <marcus@dushka.co.uk>
+ * More internationalisation
+
+ * actions/register.php: Marcus Povey <marcus@dushka.co.uk> * Blank passwords
+ and blank second password no longer permitted
+
+ * engine/lib/entities.php, engine/lib/extender.php,
+ engine/lib/relationships.php, engine/lib/river.php,
+ engine/lib/system_log.php: Marcus Povey <marcus@dushka.co.uk> * Limit to
+ specific users and/or relationships
+
+2008-06-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php, engine/lib/users.php, mod/profile/start.php:
+ Fixes for metadata and for the run order.
+
+2008-06-05 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php:
+
+ * engine/lib/river.php: Marcus Povey <marcus@dushka.co.uk> * River now
+ passes performed_by_guid user as an object to sub views
+
+ * engine/lib/system_log.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * System log performs the id of the user who performed
+ a given action (or 0 if no user was logged in). Update your DB schema.
+
+ * views/default/river/shell.php:
+
+ * views/default/river/ElggUser/login.php,
+ views/default/river/ElggUser/logout.php:
+
+ * views/default/river/shell.php:
+
+ * languages/en.php, views/default/river/ElggUser/login.php,
+ views/default/river/ElggUser/logout.php, views/default/river/shell.php:
+ Marcus Povey <marcus@dushka.co.uk> * Some basic river code
+
+ * mod/profile/index.php, views/default/river/ElggUser/login.php,
+ views/default/river/ElggUser/logout.php, views/default/river/shell.php:
+ Marcus Povey <marcus@dushka.co.uk> *
+
+2008-06-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php, engine/settings.example.php: Removing assorted
+ errors which will allow for excellent river operation
+
+2008-06-05 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php:
+
+2008-06-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/filestore.php,
+ views/default/pageshells/pageshell.php: Further cleanup
+
+ * views/default/page_elements/header.php, views/default/pageshell.php:
+ Further sitename fix.
+
+2008-06-05 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, engine/lib/notification.php, languages/en.php:
+ Marcus Povey <marcus@dushka.co.uk> * More text internationalised
+
+2008-06-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Fixed a foreach bug.
+
+ * views/default/page_elements/header.php: Returned the site name to the
+ header.
+
+2008-06-05 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/cache.php, engine/lib/database.php,
+ engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/export.php,
+ engine/lib/extender.php, engine/lib/filestore.php, engine/lib/metadata.php,
+ engine/lib/objects.php, engine/lib/plugins.php, engine/lib/relationships.php,
+ engine/lib/sites.php, engine/lib/users.php, languages/en.php: Marcus Povey
+ <marcus@dushka.co.uk> * Partial internationalisation of exceptions
+
+2008-06-05 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/systemsettings/install.php, engine/lib/elgglib.php, install.php,
+ views/default/account/forms/register.php, views/default/settings/system.php:
+ Installation and initial account creation should now be stable.
+
+2008-06-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: A more elegant event passthrough mechanism.
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php,
+ engine/lib/languages.php, engine/lib/sessions.php, engine/lib/sites.php:
+ Fixed the installation labels issue!
+
+2008-06-04 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/query.php: Marcus Povey <marcus@dushka.co.uk> * Documentation
+ added to query.
+
+2008-06-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, engine/lib/install.php, engine/lib/sessions.php,
+ engine/lib/users.php, views/default/account/forms/login.php: Fixed actions
+ issues
+
+ * engine/lib/elgglib.php: Fixed the callpath_gatekeeper on Windows machines.
+
+2008-06-04 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/query.php:
+
+ * engine/lib/system_log.php:
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> * Belts
+ and braces
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> * Supports
+ multiple delivery methods as an array
+
+ * engine/lib/system_log.php: Marcus Povey <marcus@dushka.co.uk> * Minor
+ documentation
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> *
+ Documentation
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Minor
+ documentation
+
+ * engine/lib/query.php:
+
+ * engine/lib/query.php: Marcus Povey <marcus@dushka.co.uk> * More
+ documentation added
+
+ * engine/lib/database.php, engine/lib/query.php: Marcus Povey
+ <marcus@dushka.co.uk> * Moved Query object et al to their own file
+
+2008-06-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Minor doc
+ tweak
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ documentation
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Removed
+ superfluous event
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Debug
+ removed
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/metadata.php, engine/lib/relationships.php: Marcus Povey
+ <marcus@dushka.co.uk> * Fixed annotations not returning anything * Access
+ control on db now disabled when run from privileged code block.
+
+ * engine/lib/access.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ restricted mode
+
+2008-06-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: Added the metatags element into
+ the page header.
+
+2008-06-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php: Marcus Povey <marcus@dushka.co.uk> * Removed and
+ because you can always add it.
+
+ * engine/lib/access.php: Marcus Povey <marcus@dushka.co.uk> * Added access
+ control shorthand function. REPLACE THIS WHEN QUERY OBJECT COMPLETE
+
+ * engine/lib/database.php:
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed set
+ ommission
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Path check no
+ longer an event, forces path check
+
+ * engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php: Marcus
+ Povey <marcus@dushka.co.uk> * Update and creates now handled separately, with
+ the appropriate events triggered.
+
+ * action_handler.php, pagehandler.php: Marcus Povey <marcus@dushka.co.uk> *
+ Moved handlers to engine/handlers/ to avoid them running foul of the
+ callpath_gatekeeper.. UPDATE YOUR .htaccess!
+
+ * engine/handlers/action_handler.php, engine/handlers/pagehandler.php,
+ htaccess_dist: Marcus Povey <marcus@dushka.co.uk> * Moved handlers to
+ engine/handlers/ to avoid them running foul of the callpath_gatekeeper..
+ UPDATE YOUR .htaccess!
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Minor bugfix
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Missing $CONFIG from insert_data
+
+ * engine/lib/elgglib.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Privileged path check to privileged function
+ execution. ... i really don't like this exception stuff. I think it would be
+ better to say that you can't access stuff you can't access.
+
+2008-05-30 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Removed debug
+
+ * engine/lib/database.php, engine/lib/elgglib.php: Marcus Povey
+ <marcus@dushka.co.uk> * Bugfix on gatekeeper and forcing data functions to
+ privileged only
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Renamed
+ limited to strict
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Improved
+ callpath_gatekeeper
+
+2008-05-29 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/export/entity.php: Marcus Povey <marcus@dushka.co.uk> * Removed
+ foaf/export since this has been superceded.
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Turns out i
+ needed reflection afterall.
+
+2008-05-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/friends/list.php, views/foaf/pageshells/pageshell.php: Added
+ FOAF
+
+ * views/default/canvas/layouts/one_column.php: Correcting one column font
+ size issue
+
+2008-05-29 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Introducing
+ callpath_gatekeeper
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Simplified
+ call_gatekeeper()
+
+ * engine/lib/elgglib.php:
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Introducing
+ call_gatekeeper()
+
+2008-05-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/friends/add.php, actions/friends/remove.php,
+ engine/lib/social.php, engine/lib/users.php, friends/index.php,
+ friends/of.php, languages/en.php, mod/profile/views/default/profile/menu.php,
+ mod/profile/views/default/profile/userdetails.php,
+ mod/profile/views/default/user/user.php, views/default/friends/list.php:
+ Added friends pages and related functionality
+
+2008-05-29 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php:
+
+2008-05-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/user/user.php: Slight change to the user view in
+ profiles, to facilitate the friends page
+
+2008-05-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Import now
+ does simple checks for failure
+
+ * engine/lib/opendd.php: Marcus Povey <marcus@dushka.co.uk> * Sanity checks
+ added to OpenDD import
+
+ * mod/exporttest/views/default/exporttest/main.php:
+
+2008-05-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Query fixes for previous.
+
+ * engine/lib/tags.php: Adding support for db prefixes to previous
+
+2008-05-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/odd.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ gatekeeper
+
+ * mod/exporttest/views/default/exporttest/main.php: Marcus Povey
+ <marcus@dushka.co.uk> * export test import set to use new import action
+
+2008-05-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php, views/default/output/tagcloud.php: Added new tagcloud
+ functions
+
+2008-05-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/import/odd.php, languages/en.php: Marcus Povey
+ <marcus@dushka.co.uk> * Importing ODD action added
+
+2008-05-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * search/index.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php: Subtypes and object types for search.
+
+2008-05-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Minor doc
+ update
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Minor doc
+ update
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed Where,
+ WhereStatic and WhereSet
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ order/limit
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed tables
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ spacing issue
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Throws
+ exception if fields are missing on a select query
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ $CONFIG->prefix now $CONFIG->dbprefix * Exception thrown on missing tables
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Fixed ACL
+ where "where" is missing * Added catch for exceptions
+
+2008-05-28 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/one_column.php: small tweak to the canvas
+ view - this is temp
+
+2008-05-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: A further fix for previous.
+
+ * engine/lib/sessions.php: Solidifying the login() function so that the
+ session data is always consistent.
+
+ * actions/login.php, engine/lib/sessions.php: Revamped the login functions
+ to separate login from authentication.
+
+ * engine/lib/sessions.php: login() can now be extended by other
+ authentication methods. TODO: wrap this up with the PAM functionality.
+
+ * engine/lib/sessions.php: Adding login and logout events.
+
+2008-05-27 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Fixed DB
+ code
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ incorrect event trigger code - problem caused by incorrect is_array clause on
+ event trigger functions
+
+2008-05-27 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/input.php, engine/lib/social.php: create a new social library
+ in the engine. Moved string parsing for links to input.php and removed
+ converting strings to tags from the shouts plugin and added them to the
+ social library.
+
+2008-05-27 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Marcus Povey <marcus@dushka.co.uk> * Offset
+ incremented each pass, will no longer get stuck in the infinite loop
+
+ * engine/lib/system_log.php: Marcus Povey <marcus@dushka.co.uk> *
+ Restrictions checked
+
+ * engine/lib/river.php: Marcus Povey <marcus@dushka.co.uk> * Views looked
+ for now river/$CLASSNAME/$EVENT
+
+2008-05-26 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: new fixed width
+
+ * views/default/css.php: fixed width page
+
+ * vendors/jquery/init.js, vendors/jquery/jquery-1.2.4a.js,
+ vendors/jquery/jquery-1.2.6.pack.js, vendors/jquery/jquery.js,
+ vendors/jquery/ui.base.js, vendors/jquery/ui.draggable.js,
+ vendors/jquery/ui.droppable.js, vendors/jquery/ui.sortable.js: new jquery,
+ removed old
+
+ * _graphics/footer.gif, _graphics/header.gif, _graphics/sidebar-bottom.gif,
+ _graphics/sidebar-top.gif: removed old graphics
+
+ * _graphics/pagebackground.gif, _graphics/pagebackground.jpg: pics needed
+
+ * views/default/css.php, views/default/navigation/toolbox.php,
+ views/default/page_elements/header.php, views/default/reset.css: simple
+ default theme as a starting point
+
+2008-05-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/canvas/layouts/one_column.php: added a new canvas area to
+ views, this is for plugins to layout their content.
+
+2008-05-26 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fix for elgg_view_layout
+
+ * engine/lib/elgglib.php: Added layout manager to elgglib
+
+2008-05-26 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: added some relationship helper functions for
+ relationship type 'attached'
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Slight tweak to the entities
+ getEntitiesFromRelationship method. We need inverse relationships!
+
+ * views/default/pageshells/pageshell.php: Sticking the sidebar somewhere for
+ now
+
+ * engine/lib/access.php, languages/en.php: Added a plugin hook and
+ translations for previous.
+
+ * engine/lib/access.php, views/default/input/access.php: Introducing a
+ visual widget for inputting access permissions.
+
+2008-05-23 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/pageshells/pageshell.php: reverted
+ back to a simple layout for now
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/views/default/user/user.php: Similar profile fix to previous
+
+2008-05-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/extender.php, engine/lib/metadata.php,
+ engine/lib/relationships.php, engine/lib/river.php,
+ engine/lib/system_log.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Support for river entries
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/languages/en.php, mod/profile/views/default/profile/edit.php:
+ You can now edit your profile again ..
+
+2008-05-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * View debug
+ messages now echoed to system log instead of to the screen. * Minor doc fix
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Removing double sanitise_string on save metadata
+
+2008-05-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Added
+ access_id
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Removing conflict over 'event' keyword in views
+
+ * engine/lib/elgglib.php: ... and again ...
+
+2008-05-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/system_log.php:
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fix for previous
+
+ * mod/profile/actions/iconupload.php, mod/profile/icon.php,
+ mod/profile/views/default/profile/icon.php: Introducing the 'tiny' profile
+ icon size
+
+2008-05-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/extender.php,
+ engine/lib/relationships.php, engine/lib/system_log.php, engine/start.php:
+ Marcus Povey <marcus@dushka.co.uk> * System log event code
+
+2008-05-23 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Similar tweak as for events, but with plugin hooks
+
+ * engine/lib/elgglib.php: trigger_event now passes the actual event details
+ on 'all'
+
+ * engine/lib/entities.php: An improvement to the clearMetadata method on
+ ElggEntities - specify a name and it only clears metadata of that type.
+
+2008-05-22 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Marcus Povey <marcus@dushka.co.uk> * Added system log to
+ prerequisite loader
+
+ * engine/lib/system_log.php: Marcus Povey <marcus@dushka.co.uk> * Can now
+ run
+
+ * engine/lib/river.php, engine/lib/system_log.php: Marcus Povey
+ <marcus@dushka.co.uk> * Moving back to desktop
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Added
+ system_log table
+
+2008-05-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Removing duplicate metastring issue
+
+2008-05-22 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * undid
+ previous as it was a dumb idea
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> *
+ Clarification: Trigger event can only be passed a context related to a
+ ElggEntity
+
+2008-05-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Rearranging events: stage 1
+
+2008-05-22 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/river.php: Marcus Povey <marcus@dushka.co.uk> * River stub for
+ the pub.
+
+2008-05-22 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pagehandler.php: The context is now set automatically when the
+ page handler is in use.
+
+ * engine/lib/pageowner.php: Plugins can now set context
+
+2008-05-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: And again
+
+ * engine/lib/entities.php: Minor fix for setting metadata
+
+2008-05-21 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Marcus Povey <marcus@dushka.co.uk> * Tag cloud for
+ files
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Introducing
+ find_metadata as a counterpart to get_entities_from_metadata
+
+2008-05-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/relationships.php: Entities now clear
+ all associated relationships on delete
+
+ * engine/lib/relationships.php: Added function to remove all entity
+ relationships of a particular kind associated with an entity
+
+ * engine/lib/access.php: Creating the constants ACCESS_PUBLIC,
+ ACCESS_PRIVATE, ACCESS_LOGGED_IN
+
+2008-05-21 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/tags.php: Marcus Povey <marcus@dushka.co.uk> * Added tag cloud
+ functions
+
+2008-05-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/iconupload.php, mod/profile/icon.php: Assorted profile
+ icon fixes
+
+ * engine/lib/entities.php: Metadata can now be added to before an entity is
+ saved. It will be added to the db on save.
+
+ * views/default/pageshells/pageshell.php: Allowing for further extension to
+ the sidebar
+
+ * engine/lib/elgglib.php, views/default/pageshells/pageshell.php: Added
+ easier sidebar population
+
+2008-05-20 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Introducing
+ get_resized_image_from_existing_file * Consolidated
+ get_resized_image_from_uploaded_file to use it
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ get_subtype_id now shortcircuits returning unmodified $subtype if $subtype is
+ ""
+
+ * engine/lib/objects.php, engine/lib/sites.php, engine/lib/users.php: Marcus
+ Povey <marcus@dushka.co.uk> * Fixed direct load by guid issue
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ strange regression in get_entities, now returns all stuff even if subtype is
+ blank.
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Revised
+ matrix generation on filestore
+
+2008-05-20 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Removing a PHP notice
+
+2008-05-20 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/atom.php, engine/lib/export.php, engine/lib/opendd.php,
+ views/atom/export/entity.php, views/atom/export/metadata.php,
+ views/atom/export/relationship.php, views/atom/pageshells/pageshell.php:
+ Marcus Povey <marcus@dushka.co.uk> * reverted previous
+
+ * engine/lib/atom.php, engine/lib/export.php, engine/lib/opendd.php,
+ views/atom/export/entity.php, views/atom/export/metadata.php,
+ views/atom/export/relationship.php, views/atom/pageshells/pageshell.php:
+ Marcus Povey <marcus@dushka.co.uk> * Committed abortive Atom wrapper... we
+ need to support different import/export
+
+ * engine/start.php: Marcus Povey <marcus@dushka.co.uk> * Debug mode now
+ lists libraries loaded
+
+ * services/export/handler.php: Marcus Povey <marcus@dushka.co.uk> *
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Introducing:
+ current_page_url()
+
+2008-05-19 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php, engine/start.php,
+ views/default/pageshells/pageshell.php: Fixing the install process, step 1.
+
+ * engine/lib/sessions.php: Session init now fails if the db hasn't been
+ installed.
+
+ * engine/start.php: Elgg will now enter light mode (no plugins are loaded,
+ system init doesn't happen) if the parameter lightmode = "true"
+
+2008-05-16 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * services/export/handler.php: Marcus Povey <marcus@dushka.co.uk> * Minor
+ clarification
+
+ * endpoints/rest.php, mod/apitest/start.php, services/api/rest.php: Marcus
+ Povey <marcus@dushka.co.uk> * Refactored API under services
+
+ * export/handler.php, htaccess_dist, services/export/handler.php: Marcus
+ Povey <marcus@dushka.co.uk> * Refactored export to services/export for future
+ expansion of other rest style endpoints
+
+2008-05-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/pageshells/pageshell.php: Removed the double body issue to
+ prevent confusion
+
+ * admin/index.php, admin/plugins/index.php, admin/settings/index.php,
+ admin/users/index.php, languages/en.php, mod/blog/actions/add.php,
+ mod/blog/actions/comments/add.php, mod/blog/actions/comments/delete.php,
+ mod/blog/actions/delete.php, mod/blog/actions/edit.php, mod/blog/add.php,
+ mod/blog/edit.php, mod/blog/everyone.php, mod/blog/index.php,
+ mod/blog/languages/en.php, mod/blog/read.php, mod/blog/start.php,
+ mod/blog/views/default/blog/css.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/blog/notfound.php,
+ mod/blog/views/default/blog/view.php,
+ mod/blog/views/default/object/blog-comment.php,
+ mod/blog/views/default/object/blog-comments.php,
+ mod/blog/views/default/object/blog.php, mod/file/actions/download.php,
+ mod/file/actions/upload.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/languages/en.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/file/file.php, mod/file/views/default/file/footer.php,
+ mod/file/views/default/file/icon.php, mod/file/views/default/file/upload.php,
+ mod/file/world.php, mod/tasklist/index.php, mod/tasklist/start.php,
+ mod/tasklist/views/default/tasklist/item.php,
+ mod/tasklist/views/default/tasklist/main.php,
+ mod/tasklist/views/default/tasklist/newtask.php,
+ views/default/admin/main.php, views/default/editmenu.php,
+ views/default/navigation/topmenu.php: Moving some stuff into the plugins
+ repo, where it belongs.
+
+ * engine/lib/users.php: Introducing getFriendsObjects to ElggUser
+
+2008-05-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Debug mode
+ causes queries that return no data to issue a warning
+
+ * engine/lib/opendd.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ ommission: setPublished
+
+2008-05-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/opendd.php: Added version
+
+ * engine/lib/opendd.php: Marcus Povey <marcus@dushka.co.uk> * Including XML
+ so it stands as a standalone lib
+
+ * engine/lib/export.php, engine/lib/opendd.php: Marcus Povey
+ <marcus@dushka.co.uk> * Moved ODD stuff to its own lib [untested]
+
+ * views/json/pageshells/pageshell.php: Marcus Povey <marcus@dushka.co.uk> *
+ Being "strictly correct" by returning application/json for json content type.
+
+2008-05-09 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * vendors/jquery/init.js, vendors/jquery/jquery-1.2.4a.js,
+ vendors/jquery/ui.base.js, vendors/jquery/ui.draggable.js,
+ vendors/jquery/ui.droppable.js, vendors/jquery/ui.sortable.js: jquery
+ framework
+
+ * views/default/css.php, views/default/navigation/topmenu.php,
+ views/default/page_elements/header.php,
+ views/default/pageshells/pageshell.php: drag n drop interface test
+
+2008-05-08 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Moved shortcut so that subtype of "" doesn't cause fail.
+
+2008-05-07 pete <pete@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php:
+
+ * views/default/css.php, views/default/navigation/toolbox.php,
+ views/default/pageshells/pageshell.php,
+ views/default/pageshells/pageshell_sidebar.php: new toolbar menu
+
+2008-05-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Removed a debug message
+
+ * engine/lib/entities.php: A fix for get_entities, which was borking if the
+ subtype of object specified didn't exist.
+
+ * engine/lib/configuration.php, engine/lib/sessions.php,
+ engine/lib/sites.php: Configuration prerequisites are now loaded on boot time
+ rathr than init
+
+ * engine/lib/filestore.php: The filestore is no longer so greedy about its
+ init function, and therefore gets the correct filestore location
+
+ * engine/lib/configuration.php: A small validation check
+
+2008-05-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: reversed my last tweak, another solution will
+ be required
+
+2008-05-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php, views/default/navigation/topmenu.php: Adding a user
+ icon to the top menu
+
+2008-05-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: small tweak to get annotations
+
+2008-05-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Minor bug fix in configuration
+
+ * engine/start.php: Update to start.php to fix bug on installation
+
+ * actions/systemsettings/install.php: Corrected an issue with actions.
+
+ * actions/systemsettings/install.php: Fixed a bug where the site was private
+ unless you were logged out ...
+
+ * actions/systemsettings/install.php, engine/lib/configuration.php,
+ engine/lib/database.php, engine/lib/entities.php, engine/lib/install.php,
+ engine/lib/languages.php, engine/lib/metadata.php,
+ engine/lib/relationships.php, engine/lib/users.php, engine/start.php,
+ install.php, languages/en.php, views/default/navigation/toolbox.php,
+ views/default/pageshells/pageshell_sidebar.php,
+ views/default/settings/install.php, views/default/settings/system.php: The
+ system now uses the site GUID to get and set entity data. Also, installation
+ is a great deal more visual.
+
+2008-05-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> * Now
+ registers email handler (oops)
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/foaf/export/entity.php: Marcus Povey <marcus@dushka.co.uk> * FOAF
+ view uses correctly formatted UUID
+
+ * views/foaf/export/entity.php, views/foaf/pageshells/pageshell.php: Marcus
+ Povey <marcus@dushka.co.uk> * Added prototype FOAF view
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Establishing $CONFIG->site
+
+ * engine/lib/install.php: Further changes to the site install procedure.
+
+ * engine/lib/elgglib.php, engine/lib/install.php, engine/lib/sites.php,
+ engine/schema/mysql.sql: Major site config changes
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/actions/upload.php: Marcus Povey <marcus@dushka.co.uk> * Uploads
+ and downloads now work.
+
+ * engine/lib/filestore.php:
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Schema update for configuration
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Bugfixing
+ my sillyness
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php: Fixed a bug in countAnnotations
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php:
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Bugfix
+
+ * mod/file/actions/download.php, mod/file/languages/en.php: Marcus Povey
+ <marcus@dushka.co.uk> * Download support
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Added tell
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Added eof
+ functionality to datastore
+
+ * mod/file/actions/download.php, mod/file/start.php,
+ mod/file/views/default/file/file.php: Marcus Povey <marcus@dushka.co.uk> *
+ Download page added
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Docs for previous
+
+ * engine/lib/actions.php: Added GET variable processing to the action
+ handler.
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/start.php, mod/file/views/default/file/file.php: Marcus Povey
+ <marcus@dushka.co.uk> * Name tweaks
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Get and set per-site configuration values
+ from the database
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/actions/upload.php: Marcus Povey <marcus@dushka.co.uk> * Minor
+ tweak
+
+ * mod/file/actions/upload.php: Marcus Povey <marcus@dushka.co.uk> * Error
+ handling
+
+ * mod/file/actions/upload.php: Marcus Povey <marcus@dushka.co.uk> * Save to
+ get the GUID
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX: Typo
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: $CONFIG->dbprefix, not $CONFIG->prefix
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php, mod/file/upload.php: Marcus Povey
+ <marcus@dushka.co.uk> * Bugfix: uses the correct filename
+
+2008-05-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Introducing gatekeeper();
+
+ * engine/lib/elgglib.php: Introducing run_function_once($functionname,
+ $timelastupdatedcheck).
+
+2008-05-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/actions/upload.php, mod/file/index.php, mod/file/start.php,
+ mod/file/views/default/file/file.php, mod/file/views/default/file/icon.php:
+ Marcus Povey <marcus@dushka.co.uk> * Using mime types
+
+ * engine/lib/database.php, engine/lib/entities.php: Marcus Povey
+ <marcus@dushka.co.uk> * Fixed regression on custom class loader
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Now
+ registers ElggFile for 'object' & 'file'
+
+2008-04-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Fix for previous fix for previous fix
+
+ * engine/lib/entities.php: Slight correction to the count entities from
+ relationship alias in ElggEntity
+
+ * engine/lib/relationships.php: Fix for previous fix
+
+ * engine/lib/relationships.php: Fix for previous
+
+ * engine/lib/entities.php, engine/lib/relationships.php: Fixing some
+ functions relating to relationships
+
+2008-04-30 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Minor tweak:
+ removed $ns references from ODD __toString()
+
+ * engine/lib/export.php, engine/lib/relationships.php: Marcus Povey
+ <marcus@dushka.co.uk> * Changed "verb" to "type" in relationship, as
+ described in ODD spec 0.5
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> * Removed
+ get_notifications... you should provide a list of guid's yourself
+
+ * mod/file/views/default/file/footer.php: Marcus Povey <marcus@dushka.co.uk>
+ * Simple footer
+
+2008-04-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: get_entities returns false if the subtype name
+ couldn't be found.
+
+2008-04-30 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/file/actions/upload.php, mod/file/friends.php, mod/file/index.php,
+ mod/file/languages/en.php, mod/file/start.php, mod/file/upload.php,
+ mod/file/views/default/file/file.php, mod/file/views/default/file/footer.php,
+ mod/file/views/default/file/upload.php, mod/file/world.php: Marcus Povey
+ <marcus@dushka.co.uk> * First draft file upload
+
+2008-04-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/relationships.php: Introducing
+ getEntitiesFromRelationship and countEntitiesFromRelationship methods on
+ ElggEntity
+
+ * mod/blog/views/default/object/blog.php: Fixed a (presumably transient)
+ comments issue in blogs.
+
+ * mod/blog/views/default/object/blog.php: Temporary style fix
+
+ * mod/blog/views/default/object/blog.php: Updating blog view to involve
+ icons
+
+2008-04-30 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> *
+ ElggDiskFilestore now uses matrix formed from username, and supports paths.
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> *
+
+2008-04-30 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Resizing images now resamples them for better
+ clarity.
+
+ * mod/profile/actions/iconupload.php: Better error reporting on previous.
+
+ * mod/profile/actions/iconupload.php: Fixed profile resizing issue
+
+ * engine/lib/filestore.php: Previous now returns false.
+
+ * engine/lib/filestore.php: Fixed image resizing issue, corrected function
+ to create a jpeg using output buffering rather than a temporary file
+
+2008-04-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/page_elements/header.php: added jquery to the main pageshell
+ header
+
+ * vendors/jquery/jquery.js: Uploaded the latest jquery into core.
+
+2008-04-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/profile/actions/iconupload.php,
+ mod/profile/editicon.php, mod/profile/graphics/defaultlarge.jpg,
+ mod/profile/graphics/defaultmedium.jpg,
+ mod/profile/graphics/defaultsmall.jpg, mod/profile/icon.php,
+ mod/profile/languages/en.php, mod/profile/start.php,
+ mod/profile/views/default/profile/editicon.php,
+ mod/profile/views/default/profile/icon.php,
+ mod/profile/views/default/user/user.php: Introducing profile icons.
+
+ * engine/lib/filestore.php: Fix for make_file_matrix
+
+ * engine/lib/filestore.php: Filenames fix
+
+ * engine/lib/filestore.php: Non-invasive fix for previous.
+
+ * engine/lib/filestore.php: Introducing get_uploaded_file and
+ get_resized_image_from_uploaded_file.
+
+ * engine/lib/extender.php: Sledgehammer tactics on can_edit_extender
+
+ * engine/lib/extender.php: Attempt at an extender canEdit fix
+
+ * engine/lib/annotations.php: Fixed typo
+
+ * engine/lib/extender.php: Added getEntity() to ElggExtender
+
+ * engine/lib/annotations.php: Fixed a minor SQL error in annotation sum
+ functions
+
+ * engine/lib/annotations.php: Minor fix involving ratings and get
+ annotations
+
+2008-04-29 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Import functionality works, removed update but no change error on update
+
+ * engine/lib/extender.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Missing name
+
+ * engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Fixed bug in
+ getOwner override
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ incorrect if condition logic
+
+2008-04-29 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/calendar.php: small tweak to the calendar input
+
+2008-04-29 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/input/calendar.php: Replacing strip_string with
+ sanitise_string in the calendar input
+
+2008-04-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/notification.php: Marcus Povey <marcus@dushka.co.uk> * Notify
+ and email notify added (not tested) ... still unsure about get_notify_list,
+ attempted a number of options ... not sure if this is as simple as it could
+ be
+
+2008-04-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/vendors/calendarpopup/CalendarPopup.js,
+ views/default/input/calendar.php, views/default/output/calendar.php: Calendar
+ popup input for dates
+
+ * views/default/output/tags.php: Removing undefined index notice
+
+ * views/default/welcome.php: Removed annoying reference to $vars['name'] in
+ the welcome view
+
+ * mod/profile/actions/edit.php, mod/profile/languages/en.php,
+ mod/profile/start.php, mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/user/user.php: The profile now has fields set in
+ start.php. TODO: make those user editable, once we have the admin panel ...
+
+ * views/default/output/tags.php: The tag output view can now use
+ $vars['value'], bringing it in line with all the others
+
+ * views/default/input/email.php, views/default/output/email.php: Email
+ address input and output fields
+
+2008-04-25 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php: Marcus Povey <marcus@dushka.co.uk> * Removed minor
+ config stuff
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Crude
+ deleteall method added
+
+ * htaccess_dist: Marcus Povey <marcus@dushka.co.uk> * JSON & PHP export
+ rewrite rules
+
+ * views/json/export/entity.php, views/json/export/metadata.php,
+ views/json/export/relationship.php, views/php/export/entity.php,
+ views/php/export/metadata.php, views/php/export/relationship.php: Marcus
+ Povey <marcus@dushka.co.uk> * JSON & PHP Export modes
+
+ * engine/lib/extender.php, engine/lib/relationships.php: Marcus Povey
+ <marcus@dushka.co.uk> * Metadata and relationships can now be accessed as
+ arrays
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Objects can
+ be accessed as arrays
+
+2008-04-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Adding get_entities_from_metadata_multi
+
+2008-04-25 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * export/handler.php, htaccess_dist, odd/handler.php: Marcus Povey
+ <marcus@dushka.co.uk> * Renamed /odd to /export since the handler can now do
+ so much more...
+
+2008-04-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/editmenu.php: Editmenu stub view
+
+2008-04-25 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Marcus Povey <marcus@dushka.co.uk> * Using ODD view by
+ default
+
+ * odd/handler.php, views/default/export/entity.php,
+ views/default/export/metadata.php, views/default/export/relationship.php,
+ views/odd/export/entity.php, views/odd/export/metadata.php,
+ views/odd/export/relationship.php, views/odd/pageshells/pageshell.php: Marcus
+ Povey <marcus@dushka.co.uk> * Updated ODD handler, now uses views * Normal
+ and ODD view for all data items... cute eh? :)
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Using common
+ attribute type var to determine ODD export type for uuid generation, now
+ attributes can support a uuid
+
+ * .../views/default/guidbrowser/entity_full.php: Marcus Povey
+ <marcus@dushka.co.uk> * Uses guid_one as well
+
+ * odd/handler.php: Marcus Povey <marcus@dushka.co.uk> * Removed session
+ debug
+
+ * action.php, engine/lib/api.php, engine/lib/elgglib.php,
+ views/default/api/output.php, views/json/api/output.php,
+ views/json/pageshells/pageshell.php, views/php/api/output.php,
+ views/php/pageshells/pageshell.php, views/xml/api/output.php,
+ views/xml/pageshells/pageshell.php: Marcus Povey <marcus@dushka.co.uk> *
+
+ * endpoints/rest.php: Marcus Povey <marcus@dushka.co.uk> * API converted to
+ use views system
+
+2008-04-25 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fix to the debug messages for elgg_view
+
+2008-04-25 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/export.php: Marcus Povey
+ <marcus@dushka.co.uk> * Removed all namespacing code
+
+2008-04-24 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Namespace
+ support added to export
+
+2008-04-24 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * version.php: Minor edit to the version number spec
+
+ * engine/lib/elgglib.php, engine/lib/version.php, engine/schema/mysql.sql,
+ version.php: The beginnings of a db upgrade system. See lib/version.php,
+ /version.php and the datalist functions in elgglib.php.
+
+2008-04-24 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Removed header
+ object
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Unhandled
+ elements issue a warning on import
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Removed ODD
+ header element
+
+ * engine/lib/entities.php:
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/extender.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Generated now published * Metadata and annotations
+ use time from db * Attributes use time from entity
+
+2008-04-23 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Improved
+ documentation
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Filesize
+ support added, now possible to get all file contents with
+ $file->read($file->size());
+
+2008-04-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/profile/actions/edit.php, mod/profile/edit.php, mod/profile/index.php,
+ mod/profile/languages/en.php, mod/profile/start.php,
+ mod/profile/views/default/profile/edit.php,
+ mod/profile/views/default/user/user.php: Introduced profile plugin
+
+ * engine/lib/entities.php, engine/lib/metadata.php, engine/lib/users.php:
+ Fixed user GUID and multiple metadata bugs
+
+ * engine/lib/sessions.php: Session init now gets priority
+
+ * engine/lib/metadata.php: Improving the metadata search in cases where
+ users have multiple tags with the same text
+
+ * mod/blog/start.php: Added doc for blog URL function
+
+ * engine/lib/entities.php: Minor update to the default entity URLs
+
+ * engine/lib/elgglib.php: Fixed an inconsistency in elgg_view_entity
+
+2008-04-21 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php:
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Numerous
+ bugs fixed
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * No longer
+ saves file automatically, this gives you the option as to how to handle files
+ - either as proper objects or adhoc file handles which still use the
+ filestore code.
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Save and
+ Load (read/write) work * TODO: Loaded can not be loaded via name, only
+ guid... correct?
+
+2008-04-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: can_edit_entity now always returns false if the
+ user is logged out
+
+2008-04-21 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Marcus Povey <marcus@dushka.co.uk> * Removed tiny
+ debug output
+
+2008-04-21 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php: Fix for lingering sessions with nonexistent users
+
+ * engine/schema/mysql.sql: Removing extraneous character from schema
+
+ * engine/schema/mysql.sql: Added site_guid to the entities table
+
+2008-04-18 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/filestore.php: Marcus Povey <marcus@dushka.co.uk> * Unfinished
+ filestore code
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * Cleaned up doc
+
+2008-04-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: If you feed an entity a metadata array, it
+ assumes multiple values are allowed
+
+ * views/default/input/tags.php: Updated input tag field to take in strings
+ as well as arrays
+
+ * mod/blog/views/default/object/blog.php: Link fix
+
+ * htaccess_dist: Minor page handler mod_rewrite fix
+
+2008-04-18 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/exporttest/index.php, mod/guidbrowser/index.php: Marcus Povey
+ <marcus@dushka.co.uk> * Hardcoded sessions no longer necessary now that login
+ works
+
+2008-04-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/views/default/object/blog-comment.php,
+ mod/blog/views/default/object/blog.php,
+ views/default/account/forms/register.php: Removing references to action.php
+
+ * action_handler.php: Searunner?!
+
+2008-04-18 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * action_handler.php, htaccess_dist: Marcus Povey <marcus@dushka.co.uk> *
+ Fixed broken actions code on linux
+
+2008-04-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Removing previous
+
+2008-04-18 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Fixed ODD mod-rewrite rules
+
+2008-04-18 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Action debug
+
+ * htaccess_dist, mod/blog/start.php: Fix for page handler bugs
+
+2008-04-17 misja <misja@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Misja Hoebe <misja@curverider.co.uk> Clean up svn cruft
+
+2008-04-16 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, search/index.php: Introducing search
+
+ * engine/lib/elgglib.php, mod/blog/views/default/object/blog.php: No need
+ for elgg_view_entity to separately load the owner entity
+
+ * engine/lib/entities.php, mod/blog/start.php: ElggEntity->getOwnerUser() ->
+ ElggEntity->getOwnerEntity()
+
+ * mod/blog/start.php, mod/blog/views/default/object/blog.php: URL handling
+ for the blog plugin
+
+ * engine/lib/entities.php: Added the getURL and getOwnerUser methods to
+ ElggEntity (gets the URL to display the current entity and the ElggUser
+ entity that represents the owner respectively)
+
+ * engine/lib/entities.php, engine/lib/users.php, entities/index.php,
+ languages/en.php: Generic entity view system
+
+ * mod/blog/start.php, mod/blog/views/default/object/blog.php: Blog plugin
+ now serves as a fancy URL example
+
+ * views/default/messages/errors/list.php, views/default/messages/list.php,
+ views/default/messages/messages/list.php: Fixing the message views
+
+ * engine/lib/input.php, engine/lib/pagehandler.php: Added better GET query
+ variable handling into the page handler mix
+
+2008-04-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * _css/css.php, _graphics/blockquote.png, _graphics/footer.gif,
+ _graphics/header.gif, _graphics/sidebar-bottom.gif,
+ _graphics/sidebar-top.gif, css/css.php, engine/lib/pagehandler.php,
+ graphics/blockquote.png, graphics/footer.gif, graphics/header.gif,
+ graphics/sidebar-bottom.gif, graphics/sidebar-top.gif, htaccess_dist,
+ pagehandler.php, views/default/css.php,
+ views/default/page_elements/header.php: Natty page handling functions. See
+ engine/lib/pagehandler.php
+
+2008-04-15 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: Marcus Povey <marcus@dushka.co.uk> * Hopefully correct
+ mod-rewrite rules
+
+2008-04-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, engine/lib/entities.php, engine/lib/users.php:
+ get_entities now allows for arrays of GUIDs to be supplied as an owner, and
+ can be asked to count entities rather than return them; as a result,
+ get_user_friends_objects and count_* functionality is also now available
+
+2008-04-15 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * odd/handler.php: Marcus Povey <marcus@dushka.co.uk> * ODD handler added,
+ still needs modrewrite rules to be specified.
+
+2008-04-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/comments/delete.php, mod/blog/languages/en.php,
+ mod/blog/start.php, mod/blog/views/default/object/blog-comment.php,
+ mod/blog/views/default/object/blog-comments.php,
+ mod/blog/views/default/object/blog.php: Blog plugin improvements, including
+ delete on comments
+
+ * languages/en.php: A couple of additions to the language file
+
+ * views/default/input/checkboxes.php, views/default/input/file.php,
+ views/default/input/gender.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Cleaning up input
+ field views
+
+ * views/default/output/confirmlink.php, views/default/output/date.php,
+ views/default/output/file.php, views/default/output/gender.php,
+ views/default/output/longtext.php, views/default/output/pulldown.php,
+ views/default/output/tagcloud.php, views/default/output/tags.php,
+ views/default/output/text.php, views/default/output/timestamp.php,
+ views/default/output/url.php: Tidied up output views
+
+2008-04-15 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Removed
+ canedit shortcut
+
+ * engine/lib/relationships.php: Marcus Povey <marcus@dushka.co.uk> *
+ Modified to not throw exception on missing verb conversion
+
+ * engine/lib/relationships.php: Marcus Povey <marcus@dushka.co.uk> *
+ Relationship import
+
+2008-04-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/extender.php: Improvement to canEdit() for extenders, which
+ takes into account the canEdit() status of entities the extender is attached
+ to
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metastrings.php: Removing the multiple slash problem on
+ metastrings in extenders
+
+2008-04-15 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/relationships.php: Marcus Povey <marcus@dushka.co.uk> *
+ Relationships export
+
+ * engine/lib/xml.php: Marcus Povey <marcus@dushka.co.uk> * Improved XML to
+ array code
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Minor tweaks
+
+ * engine/lib/extender.php: Marcus Povey <marcus@dushka.co.uk> * Extender
+ import support. * Removed Importable interface on extender, its easier to
+ just use the entity object interface.
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Blocking
+ create and update dates from ODD export, since these don't make sense to
+ export.
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ optional set multiple on metadata
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Belts and
+ braces
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Entity
+ import.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Using common detect_extender_valuetype function
+
+2008-04-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Undone last as
+ it was a bad idea.
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Exception
+ thrown on unrecognised import tag.
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Import
+ functions now deal in ODD!
+
+ * engine/lib/export.php, engine/lib/xml.php: Marcus Povey
+ <marcus@dushka.co.uk> * XML Import processor
+
+ * engine/lib/relationships.php: Marcus Povey <marcus@dushka.co.uk> *
+ Relationships export
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Relationships
+ export
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * ODD
+ relationship verb -> relationship mapping functions
+
+ * mod/guidbrowser/index.php, mod/guidbrowser/start.php,
+ .../views/default/guidbrowser/entity_full.php: Marcus Povey
+ <marcus@dushka.co.uk> * Relationships added to GUID browser
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> *
+ Relationships table brought in line with code... oops
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/extender.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * ODD Annotation and Metadata export
+
+2008-04-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Added owner
+ uuid to type
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ subclass
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Comment tweak
+
+ * engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/export.php, engine/lib/extender.php, engine/lib/metadata.php,
+ engine/lib/relationships.php: Marcus Povey <marcus@dushka.co.uk> * Entity ODD
+ export
+
+ * engine/lib/xml.php: Marcus Povey <marcus@dushka.co.uk> * Moved XML stuff
+ to xml.php
+
+ * engine/lib/exceptions.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ DataFormatException
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Minor tweak
+
+2008-04-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php, engine/lib/api.php, engine/lib/pam.php: Marcus Povey
+ <marcus@dushka.co.uk> * Created PAM library * API moved to use new PAM
+ functions
+
+2008-04-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apitest/index.php, mod/apitest/start.php,
+ mod/apitest/views/default/apitest/configform.php,
+ mod/apitest/views/default/apitest/main.php: Marcus Povey
+ <marcus@dushka.co.uk> * Package header added
+
+ * mod/tasklist/index.php, mod/tasklist/start.php,
+ mod/tasklist/views/default/tasklist/item.php,
+ mod/tasklist/views/default/tasklist/main.php,
+ mod/tasklist/views/default/tasklist/newtask.php: Marcus Povey
+ <marcus@dushka.co.uk> * Package header added
+
+ * mod/exporttest/index.php, mod/exporttest/start.php,
+ mod/exporttest/views/default/exporttest/main.php,
+ .../views/default/exporttest/outputxml.php: Marcus Povey
+ <marcus@dushka.co.uk> * Package header added
+
+ * mod/guidbrowser/languages/en.php, mod/guidbrowser/start.php,
+ .../views/default/guidbrowser/browser.php,
+ .../views/default/guidbrowser/entity.php,
+ .../views/default/guidbrowser/entity_full.php,
+ .../views/default/guidbrowser/newentity.php,
+ .../views/default/guidbrowser/prevnext.php: Marcus Povey
+ <marcus@dushka.co.uk> * Package header added
+
+2008-04-09 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/start.php: Fixed some bugs including a
+ load order patch from Rolando, and an update issue
+
+ * engine/lib/pam.php: Empty PAM include file
+
+2008-04-08 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Simplified extender types, now only supports integer
+ and text - types deamed not to be necessary (yet), also simplifies import and
+ export. * Types better detected.
+
+2008-04-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/users.php, engine/start.php:
+ Incorporating setup fixes from Rolando
+
+2008-04-08 misja <misja@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php, engine/lib/cache.php, engine/lib/database.php: Misja
+ Hoebe <misja@curverider.co.uk> More doctag fixes
+
+ * endpoints/rest.php, engine/lib/annotations.php, engine/lib/entities.php,
+ engine/lib/exceptions.php, engine/lib/export.php, engine/lib/extender.php,
+ engine/lib/metadata.php, engine/lib/objects.php, engine/lib/plugins.php,
+ engine/lib/relationships.php, engine/lib/sites.php, engine/lib/users.php:
+ Misja Hoebe <misja@curverider.co.uk> More docstring fixes
+
+ * action.php, engine/lib/annotations.php, engine/lib/sites.php,
+ engine/lib/users.php: Misja Hoebe <misja@curverider.co.uk> Fixing doctags
+
+2008-04-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Further annotation /
+ metadata fixes
+
+ * views/default/output/tags.php: Improved tag display
+
+ * engine/lib/annotations.php: Fixing undeclared error
+
+ * mod/blog/actions/delete.php, mod/blog/actions/edit.php,
+ mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/object/blog.php: CRUD for blog posts
+
+ * engine/lib/sites.php, engine/lib/users.php: Same bugfix for sites and
+ users
+
+ * engine/lib/elgglib.php, engine/lib/entities.php, engine/lib/objects.php:
+ Further adventures in getting things to delete correctly
+
+ * engine/lib/annotations.php, engine/lib/elgglib.php,
+ engine/lib/entities.php: Further delete and event trigger fixes
+
+ * engine/lib/entities.php: Triggering events on create, update and delete
+ actions on entities
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php: Properly extensible canEdit functionality for
+ metadata, annotations, and anything else that supports the ElggExtender
+ interface
+
+ * engine/lib/entities.php, engine/lib/metadata.php: Much better handling for
+ deleting entities and metadata
+
+2008-04-04 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/edit.php, mod/blog/edit.php, mod/blog/start.php,
+ mod/blog/views/default/blog/forms/edit.php,
+ mod/blog/views/default/object/blog.php: Blog edit updates
+
+ * views/default/input/tags.php: Updated the tags input field
+
+ * languages/en.php: Adding 'edit' to the language file
+
+ * engine/lib/entities.php: Added $entity->canEdit() (true|false)
+
+ * mod/blog/everyone.php, mod/blog/index.php, mod/blog/languages/en.php,
+ mod/blog/start.php: Introducing the all blog posts page.
+
+ * views/default/output/tags.php: Tweaking the output/tags view
+
+ * engine/lib/entities.php, engine/lib/metadata.php: Added better support for
+ arrays of metadata
+
+ * mod/blog/actions/add.php, mod/blog/views/default/object/blog.php: Added
+ tags to the blog plugin
+
+ * mod/blog/read.php, mod/blog/views/default/blog/notfound.php: Further blog
+ enhancements
+
+2008-04-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/relationships.php: Marcus Povey
+ <marcus@dushka.co.uk> * Relationship related code moved to relationships.php
+ * Added ElggRelationship class as wrapper (to help with import and export) *
+ Import and Export relationship code added (NOT TESTED)
+
+ * mod/exporttest/index.php:
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Minor text
+ change
+
+2008-04-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/actions/comments/add.php, mod/blog/languages/en.php,
+ mod/blog/start.php, mod/blog/views/default/object/blog-comment.php,
+ mod/blog/views/default/object/blog-comments.php,
+ mod/blog/views/default/object/blog.php: Added comments to blog
+
+ * engine/lib/database.php: Added query display to database exceptions
+
+ * engine/lib/sessions.php: Fixed session initialisation issue
+
+2008-04-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/lib/extender.php, engine/lib/metadata.php:
+ Marcus Povey <marcus@dushka.co.uk> * Annotations and metadata now imported
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Bugfixes
+
+ * mod/guidbrowser/index.php, mod/guidbrowser/start.php,
+ .../views/default/guidbrowser/browser.php,
+ .../views/default/guidbrowser/entity.php,
+ .../views/default/guidbrowser/entity_full.php,
+ .../views/default/guidbrowser/navbar.php,
+ .../views/default/guidbrowser/prevnext.php: Marcus Povey
+ <marcus@dushka.co.uk> * Basic guid browser
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ Iterator interface to override foreach behaviour
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/sites.php,
+ engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Exception thrown
+ if load fails
+
+2008-04-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/languages/en.php, mod/blog/read.php,
+ mod/blog/views/default/blog/css.php, mod/blog/views/default/object/blog.php:
+ Blog: extended comment form, etc.
+
+ * engine/lib/elgglib.php: Slight fix for previous
+
+ * engine/lib/elgglib.php: Update for elgg_view_entity
+
+ * engine/lib/database.php: Slight get_data revert
+
+ * views/default/page_elements/header.php: Changing, once again, the way
+ titles work
+
+ * engine/lib/pageowner.php: Pages can now manually override the page owner
+
+ * mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/css.php, mod/blog/views/default/object/blog.php:
+ Adding name and posted date to blog entries
+
+ * mod/blog/index.php, mod/blog/views/default/blog/view.php,
+ mod/blog/views/default/object/blog.php: Blog update: you can post and view
+ blog entries.
+
+ * engine/lib/elgglib.php: Improved elgg_view_entity
+
+2008-04-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Cut and
+ paste is a killer
+
+ * engine/lib/plugins.php: Marcus Povey <marcus@dushka.co.uk> * Fixed
+ language autoload
+
+2008-04-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/guidbrowser/index.php, mod/guidbrowser/languages/en.php,
+ mod/guidbrowser/start.php, .../views/default/guidbrowser/entity.php,
+ .../views/default/guidbrowser/entity_full.php,
+ .../views/default/guidbrowser/navbar.php,
+ .../views/default/guidbrowser/newentity.php: Marcus Povey
+ <marcus@dushka.co.uk> * End of day
+
+2008-04-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php, engine/lib/entities.php, engine/lib/users.php:
+ Assorted entity fixes
+
+ * engine/lib/plugins.php: Plugins now autoregister translations
+
+ * engine/lib/entities.php: Small fix for get_entities
+
+ * mod/blog/actions/add.php, mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/forms/edit.php: Blog posting
+
+2008-04-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Access id
+ better handled
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Subtype is
+ converted to its exportable string version
+
+2008-04-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php: Removed some unnecessary debug junk
+
+ * engine/lib/actions.php: Fixed action registration for plugins
+
+2008-04-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/exporttest/index.php: Marcus Povey <marcus@dushka.co.uk> * Minor tweak
+ to actually get the command from it all
+
+2008-04-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Modified page_draw to behave correctly depending
+ on sessions
+
+ * languages/en.php: Language updates
+
+ * action.php: Removing debug issue
+
+ * action.php: Debug message in actions
+
+ * views/default/account/forms/register.php: Changing the destination of the
+ register form
+
+ * views/default/css.php, views/default/page_elements/header.php: Separating
+ sitename and title in the header
+
+ * views/default/css.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php: Let's make the
+ classes for input elements consistent
+
+ * views/default/pageshells/pageshell.php: Reinstating the side menu
+
+2008-04-02 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * graphics/blockquote.png, graphics/footer.gif, graphics/header.gif,
+ graphics/sidebar-bottom.gif, graphics/sidebar-top.gif, views/default/css.php,
+ views/default/page_elements/footer.php,
+ views/default/pageshells/pageshell.php: basic skin added
+
+2008-04-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * BUGFIX: User creation * User import functionality
+ working
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Offset/limit
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Value to
+ value_id
+
+ * mod/exporttest/views/default/exporttest/main.php: Marcus Povey
+ <marcus@dushka.co.uk> * Now using method=post
+
+ * engine/lib/entities.php, mod/tasklist/start.php: Marcus Povey
+ <marcus@dushka.co.uk> * REMOVED DEBUG * WARNING!!! THERE IS A PHP BUG ON
+ UBUNTU/APACHE2/PHP5 that will prevent metadata from functioning. Values
+ appear to get unset. No fix known.
+
+ * engine/lib/entities.php:
+
+ * mod/tasklist/start.php:
+
+ * mod/tasklist/start.php:
+
+ * mod/tasklist/start.php:
+
+ * engine/lib/entities.php, engine/lib/metadata.php:
+
+ * engine/lib/entities.php:
+
+ * engine/lib/entities.php:
+
+ * engine/lib/entities.php:
+
+ * mod/tasklist/start.php: debug
+
+ * engine/lib/entities.php: removed debug
+
+ * engine/lib/entities.php: debug
+
+ * engine/lib/entities.php: debug
+
+ * engine/lib/metadata.php: debug
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Entity type/ subtype functional
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> *
+ get_metadata_byname better handles single/multiple return values
+
+ * mod/tasklist/start.php, mod/tasklist/views/default/tasklist/newtask.php:
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> *
+ get_metadata_byname better handles single/multiple return values
+
+2008-04-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/blog/index.php: Slight change to blogs
+
+2008-04-02 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: debug
+
+ * engine/lib/metadata.php: removed debug
+
+ * engine/lib/metadata.php: debug
+
+ * mod/tasklist/index.php, mod/tasklist/start.php: test
+
+2008-04-02 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * htaccess_dist: htaccess dist
+
+ * engine/lib/users.php: Small fix
+
+ * engine/lib/pageowner.php: Smaller version of previous
+
+ * engine/lib/pageowner.php: Introducing page_owner_entity
+
+ * engine/lib/friends.php: Removing the friends module (it's unnecessary)
+
+ * engine/lib/pageowner.php: Fix to previous
+
+ * engine/lib/pageowner.php: Reverting page_owner
+
+2008-04-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * End of day...
+
+ * engine/lib/annotations.php, engine/lib/extender.php,
+ engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Moved common
+ functionality of metadata and annotations into superclass.
+
+2008-04-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * languages/en.php, mod/blog/add.php, mod/blog/edit.php, mod/blog/index.php,
+ mod/blog/languages/en.php, mod/blog/start.php,
+ mod/blog/views/default/blog/forms/edit.php: Further adventures in blogging;
+ saving for now
+
+ * mod/blog/index.php, mod/blog/languages/en.php, mod/blog/start.php,
+ views/default/welcome/logged_in.php: Blog mod and welcome screen updates
+
+ * engine/lib/pageowner.php: Update to docs for previous
+
+ * engine/lib/pageowner.php, engine/lib/users.php: page_owner() now returns
+ an ElggUser or false
+
+ * views/default/navigation/toolbox.php: Modified toolbox to display menu
+ items correctly
+
+ * engine/lib/elgglib.php: Fixed the menu item function
+
+2008-04-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Marcus Povey <marcus@dushka.co.uk> * Removed debug
+
+2008-04-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/languages.php: Added the register_languages function, for
+ easier loading of language files from plugins
+
+ * actions/register.php, engine/lib/entities.php, engine/lib/sessions.php,
+ engine/lib/users.php: Registration, login, logout work. Victory!
+
+ * views/default/account/forms/register.php: Registration form update
+
+ * engine/lib/users.php: Updated the registration function
+
+ * languages/en.php, register.php, views/default/account/forms/login.php,
+ views/default/account/forms/register.php, views/default/login.php,
+ views/default/welcome/logged_out.php: Further adventures in registration
+
+2008-04-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Some UUID
+ functions
+
+2008-04-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/logout.php, actions/register.php,
+ engine/lib/entities.php, engine/lib/users.php, languages/en.php,
+ views/default/login.php: User registration gubbins
+
+2008-04-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Used wrong
+ function decl
+
+ * mod/exporttest/index.php,
+ mod/exporttest/views/default/exporttest/main.php: Marcus Povey
+ <marcus@dushka.co.uk> * Added import block
+
+ * engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Moved import to
+ ElggEntity
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Moved import
+ to ElggEntity
+
+2008-04-01 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php, languages/en.php,
+ views/default/navigation/topmenu.php, views/default/page_elements/header.php,
+ views/default/welcome.php, views/default/welcome/logged_in.php,
+ views/default/welcome/logged_out.php: Fixed some session stuff, modified a
+ few views
+
+2008-04-01 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Moved import
+ to ElggEntity
+
+ * engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * Moved import to
+ ElggEntity
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Entities
+ owner_guid exported as owner_uuid
+
+2008-03-31 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Tidied up
+ comments
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Somewhat more
+ robust import logic
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Owner guid converted to a uuid
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Initial xml
+ import.
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Export of
+ entities now includes uuid
+
+2008-03-31 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/test/graphics/elgg.powered.png, mod/test/graphics/leaf.jpg,
+ mod/test/graphics/logo.png, mod/test/graphics/orange_small.png,
+ mod/test/graphics/purplecrayon.gif, mod/test/index.php, mod/test/start.php,
+ mod/test/views/default/css.php, mod/test/views/default/menu.php,
+ mod/test/views/default/pageshells/pageshell.php,
+ mod/test/views/default/testplugin/pageshell.php: Removing the mod/test
+ plugin. It doesn't need to be here...
+
+2008-03-31 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php: Marcus Povey <marcus@dushka.co.uk> *
+ Reverted regression
+
+2008-03-29 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * No such entity
+ error thrown if invalid guid given for export
+
+2008-03-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/api.php, engine/lib/entities.php,
+ engine/lib/export.php, engine/lib/metadata.php, index.php: Marcus Povey
+ <marcus@dushka.co.uk> * Metadata and Annotations now exported.
+
+ * engine/start.php: Marcus Povey <marcus@dushka.co.uk> * Preloads export
+ library - todo: do this better!
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> *
+
+ * mod/exporttest/index.php, mod/exporttest/start.php,
+ mod/exporttest/views/default/exporttest/main.php,
+ .../views/default/exporttest/outputxml.php: Marcus Povey
+ <marcus@dushka.co.uk> * Export test
+
+ * engine/lib/entities.php, engine/lib/export.php: Marcus Povey
+ <marcus@dushka.co.uk> * Export functionality for ElggEntity and children
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Whitespace
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Using export()
+ instead of toStdClass()
+
+2008-03-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Corresponding fix for register_plugin_hook
+
+ * engine/lib/elgglib.php: Fix for trigger_plugin_hook
+
+ * engine/lib/configuration.php: Autoconfiguration update .. again
+
+ * engine/lib/elgglib.php: Some extra params for elgg_view_entity
+
+ * engine/lib/elgglib.php: Added elgg_view_entity(ElggEntity $entity) to
+ intelligently display entities
+
+2008-03-28 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Moved XML
+ serialisation functions to export.php
+
+2008-03-28 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added custom return values to trigger_plugin_hook
+
+ * engine/lib/elgglib.php: Some extra documentation
+
+ * engine/lib/elgglib.php: Plugin hooks
+
+2008-03-27 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/export.php: Marcus Povey <marcus@dushka.co.uk> * Sketch
+ import/export functions added, pending event handling functions
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Array
+ support added
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Add / update
+ meta from array
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Multiple
+ meta tag support (requires db schema change)
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Removed sql
+ restriction to allow multiple tag entries
+
+2008-03-26 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/apitest/index.php, mod/apitest/start.php,
+ mod/apitest/views/default/apitest/configform.php,
+ mod/apitest/views/default/apitest/main.php: Marcus Povey
+ <marcus@dushka.co.uk> * Basic API testrig
+
+2008-03-25 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Subtype subclass instantiation
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * IO Exception if
+ cache directory doesn't exist
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Removed debug.
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Array support
+ added to api
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Call method now
+ specified in api
+
+2008-03-22 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Whitespace
+ removed
+
+2008-03-21 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Tweak for
+ unrecognised output format handling
+
+2008-03-20 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/tasklist/index.php: Marcus Povey <marcus@dushka.co.uk> * tags
+
+ * engine/lib/annotations.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Annotations now using metastrings table for name_ids
+ * Stupid amounts of whitespace removed
+
+ * engine/lib/entities.php, engine/lib/metadata.php, engine/schema/mysql.sql:
+ Marcus Povey <marcus@dushka.co.uk> * Metadata now using metastrings *
+ Entities will now throw an exception when creation is attempted with no owner
+
+ * mod/tasklist/index.php, mod/tasklist/views/default/tasklist/newtask.php:
+ Marcus Povey <marcus@dushka.co.uk> * Tags
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * a/cvs/csv ...
+ oops
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * Age checking on
+ cache.
+
+2008-03-19 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Exports working
+ system.api.list
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Removed warning
+ when calling undeclaired functions
+
+ * endpoints/rest.php: Marcus Povey <marcus@dushka.co.uk> * Added some
+ default values - these should be removed!
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Using simple
+ cache for replay protection... still need to clear cache of old files etc.
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * Cache no longer
+ using matrix directory due to issues with mkdir.
+
+ * endpoints/rest.php: Marcus Povey <marcus@dushka.co.uk> * Added expose and
+ call functions.
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Added expose and
+ call functions.
+
+ * endpoints/rest.php, engine/lib/api.php, index.php: Marcus Povey
+ <marcus@dushka.co.uk> * API now uses PAM
+
+2008-03-18 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php, engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk>
+ * API now supporting pluggable output format
+
+ * mod/tasklist/index.php, mod/tasklist/start.php,
+ mod/tasklist/views/default/tasklist/item.php,
+ mod/tasklist/views/default/tasklist/main.php,
+ mod/tasklist/views/default/tasklist/newtask.php: Marcus Povey
+ <marcus@dushka.co.uk> * Added VERY simple tasklist plugin.
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Final tweaks
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Moved order
+ and limit the right way
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Get Metadata
+ now actually works
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Modified to better deal with metastrings table
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Value to
+ value_id
+
+2008-03-17 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Marcus Povey <marcus@dushka.co.uk> * getOwner now
+ consistent with class hierachy
+
+ * engine/lib/objects.php, engine/lib/users.php: Marcus Povey
+ <marcus@dushka.co.uk> * getOwner now consistent with class hierachy
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Fixed sql
+ error on clear annotaitons
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * limit/offset
+ the wrong way round
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * guid not
+ needed in subtype since this is just a label.
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ Added config
+
+ * engine/lib/sessions.php, engine/lib/users.php: Marcus Povey
+ <marcus@dushka.co.uk> * Some minor tweaks
+
+ * engine/lib/configuration.php: Marcus Povey <marcus@dushka.co.uk> *
+ Reverted regression caused by previous revision
+
+2008-03-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sessions.php, engine/lib/users.php: Session functionality,
+ hello again!
+
+2008-03-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/languages.php: Marcus Povey
+ <marcus@dushka.co.uk> * Removed error outputs * Fixed languages
+
+ * engine/lib/access.php: Marcus Povey <marcus@dushka.co.uk> * Made site test
+ conditional to remove debug message
+
+2008-03-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: A quick syntax fix for objects
+
+2008-03-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/entities.php: Marcus Povey
+ <marcus@dushka.co.uk> * Get and set annotations seem to be working
+
+ * engine/lib/annotations.php, engine/lib/entities.php: Marcus Povey
+ <marcus@dushka.co.uk> * Get annotations
+
+2008-03-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php, engine/lib/usersnew.php: Whoops, that should be
+ users.php
+
+ * engine/lib/usersnew.php: Removed a needless comment
+
+ * engine/lib/usersnew.php: New users module
+
+ * engine/lib/entities.php, engine/lib/objects.php, engine/lib/users.php:
+ Adding a couple of extra functions, deleting the old users module
+
+2008-03-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/entities.php: Marcus Povey
+ <marcus@dushka.co.uk> * Annotations added
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ average calcs
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Removed debug
+
+ * engine/lib/entities.php, engine/lib/metadata.php, index.php: Marcus Povey
+ <marcus@dushka.co.uk> * Metadata code
+
+2008-03-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Added new objects class
+
+ * engine/lib/entities.php, engine/lib/objects.php: Removing old objects
+ class
+
+2008-03-14 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metastrings.php: Marcus Povey <marcus@dushka.co.uk> *
+ Metastrings modified for new schema
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Belts and
+ braces
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Belts and
+ braces
+
+2008-03-13 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Use
+ $CONFIG->debug = true to enable query profiling
+
+ * engine/lib/entities.php, engine/lib/sites.php: Marcus Povey
+ <marcus@dushka.co.uk> * Finally got sites to load :)
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Undone
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Owner ID
+ detected if not specified.
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Now saves
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Access
+ control fields ok
+
+ * engine/lib/access.php: Marcus Povey <marcus@dushka.co.uk> * Access using
+ new schema
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Added access
+ groups
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Fixed insert
+ SQL
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Types
+ initialised for first time creation
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Bugfix:
+ getMetaData
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Bugfix:
+ setMetaData
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Made URL
+ unique
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Commented out
+ sites_init - this needs to be rewritten!
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Added ElggSite
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ relationship code
+
+ * engine/lib/entities.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Removed site_guid references, since this should be
+ handled by relationships
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Ooops...
+ forgot access controls
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Changed a
+ couple of table names
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ delete_entity
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Initial
+ framework of ElggEntity code
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * A little bit
+ of extra info.
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Made subtype
+ a unique key
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * New database
+ schema. THIS IS A FLAG DAY!
+
+2008-03-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Added the ability to set an alternative template
+ handler
+
+2008-03-12 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Multiple
+ searches.
+
+ * engine/lib/annotations.php:
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, engine/lib/sites.php, index.php: Marcus Povey
+ <marcus@dushka.co.uk> * Subtyping on annotations and metadata
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * BUGFIX:
+ get_data now catches mysql_errors
+
+2008-03-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/actions.php, mod/test/start.php: Actions fix
+
+ * engine/lib/actions.php, engine/lib/objects.php, languages/en.php,
+ mod/test/index.php, mod/test/start.php,
+ mod/test/views/default/testplugin/pageshell.php: Language updates
+
+2008-03-12 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/entities.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ get_entity_subtypes function
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * object_*
+ changed to entity_* in metadata and annotations
+
+2008-03-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Fixing incorrect primary key
+
+ * engine/schema/mysql.sql, mod/test/index.php: Fixing incorrect primary key
+
+ * engine/lib/access.php, engine/lib/objects.php, mod/test/index.php: Updates
+ to both objects (in order to be able to resave type properly) and access (to
+ add useful constants)
+
+2008-03-12 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * object_*
+ changed to entity_* in metadata and annotations
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * object_* changed to entity_*
+
+2008-03-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/test/views/default/css.php,
+ mod/test/views/default/pageshells/pageshell.php: tweak to ben's elgg 0.2
+ theme plugin
+
+2008-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * mod/test/graphics/elgg.powered.png, mod/test/graphics/leaf.jpg,
+ mod/test/graphics/logo.png, mod/test/graphics/orange_small.png,
+ mod/test/graphics/purplecrayon.gif, mod/test/views/default/css.php,
+ mod/test/views/default/menu.php,
+ mod/test/views/default/pageshells/pageshell.php,
+ views/default/navigation/toolbox.php: Adding a friendly old template to the
+ test plugin
+
+2008-03-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * File cache
+ outline
+
+2008-03-11 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/css.php: css tweak
+
+ * index.php, mod/dashboard/views/default/dashboard/welcome.php: index page
+ changes so it now logs you into the dashboard
+
+ * mod/dashboard/index.php, mod/dashboard/start.php,
+ mod/dashboard/views/default/dashboard/welcome.php, views/default/css.php,
+ views/default/navigation/topmenu.php: css, dashboard and topmenu tweaks
+
+2008-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php, mod/test/index.php: Fixes
+ for previous
+
+ * engine/lib/elgglib.php, engine/lib/plugins.php, mod/test/index.php,
+ mod/test/start.php: God bless 'em! Plugins now autoregister their own views.
+
+2008-03-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Removed subtypes until problems with tag system are
+ sorted out.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Added orderby and limits
+
+2008-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Page_draw echoes
+
+2008-03-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/cache.php: Marcus Povey <marcus@dushka.co.uk> * ElggCache
+ superclass
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Value type
+ added
+
+2008-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: user_info() ftw
+
+2008-03-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk> * Added api to list
+ apis
+
+2008-03-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/pageowner.php, engine/lib/users.php: Et voila: page ownership!
+
+ * engine/lib/elgglib.php, views/default/pageshell.php,
+ views/default/pageshells/pageshell.php: The pageshell now correctly passes
+ elements to the header, footer etc.
+
+ * mod/test/index.php: Minor test plugin fix
+
+ * engine/lib/elgglib.php, views/default/navigation/toolbox.php: Menu items
+ fix
+
+ * mod/test/start.php: Initial test plugin menu items
+
+ * views/default/navigation/toolbox.php: Toolbox navigation edit
+
+ * engine/lib/elgglib.php: Registers and menu items
+
+2008-03-11 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php, engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk>
+ * Site id specified
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Removed log
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/metastrings.php, engine/schema/mysql.sql: Marcus Povey
+ <marcus@dushka.co.uk> * Added metadata/metastrings tag stuff. Lorks.
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Fixed db
+ problems
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Removed
+ count based on this conversation: [10:05:38] … basically, if you add an
+ item, you need to create a tag entry in the metastrings table (as discussed
+ yesterday) [10:05:56] … if you then delete the item, that leaves a tag
+ [10:06:07] … if you want to delete the tag when nothing references it
+ [10:06:11] … it needs a counter [10:06:29] … which means for every add
+ and delete query you need to check for and sometimes update this counter
+ [10:06:36] … making three queries for every one [10:06:47] … but if you
+ don't do that the meta strings table grows over time [10:06:54] … making it
+ space inefficient [10:07:03] … so, which do you do? [10:10:31] … ?
+ [10:10:43] … i'd be tempted to not delete [10:10:58] … because the
+ multiple queries will be a pain for everyone all the time [10:11:05] … and
+ storage costs are cheap [10:11:32] Ben Werdmuller: I would be very tempted to
+ do the same [10:11:35] … so let's do that :) [10:11:36] Marcus Povey: maybe
+ we could write an admin script to clean up or something [10:11:45] Ben
+ Werdmuller: exactly, we could clean up on a cron if people really want
+ [10:11:59] … but for now, let's just go with the growing tag cloud
+
+2008-03-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/logout.php, engine/lib/languages.php,
+ languages/en.php, views/default/login.php,
+ views/default/navigation/topmenu.php, views/default/page_elements/footer.php,
+ views/default/welcome.php: More language integration
+
+ * actions/login.php, actions/logout.php, engine/lib/languages.php,
+ languages/en.php: Languages! There's a little more to do, but ...
+
+2008-03-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Added count
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Changed
+ metadata database to use metastrings as described (all values in metadata are
+ now storing data only once)
+
+ * endpoints/rest.php, engine/lib/api.php: Marcus Povey <marcus@dushka.co.uk>
+ * First draft api
+
+2008-03-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Updated ref to get_objects
+
+ * engine/lib/sites.php: Fixing access permissions error on site update
+
+ * engine/lib/objects.php: Updated objects with metadata and annotations
+
+2008-03-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php, engine/lib/api.php, engine/lib/users.php,
+ engine/schema/mysql.sql, index.php: Marcus Povey <marcus@dushka.co.uk> *
+ Tokens and execute code added to api
+
+2008-03-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/navigation/toolbox.php,
+ views/default/navigation/topmenu.php, views/default/page_elements/header.php:
+ top level navigation added
+
+ * views/default/text/about.php, views/default/text/privacy_view.php,
+ views/default/text/tos_view.php: changes to the text pages
+
+ * engine/lib/elgglib.php, views/default/basic_elements/login.php,
+ views/default/basic_elements/welcome.php, views/default/css.php,
+ views/default/input/checkboxes.php, views/default/input/file.php,
+ views/default/input/gender.php, views/default/input/longtext.php,
+ views/default/input/password.php, views/default/input/pulldown.php,
+ views/default/input/radio.php, views/default/input/tags.php,
+ views/default/input/text.php, views/default/input/url.php,
+ views/default/navigation/toolbox.php, views/default/navigation/topmenu.php,
+ views/default/output/date.php, views/default/output/file.php,
+ views/default/output/gender.php, views/default/output/longtext.php,
+ views/default/output/pulldown.php, views/default/output/tagcloud.php,
+ views/default/output/tags.php, views/default/output/text.php,
+ views/default/output/timestamp.php, views/default/output/url.php,
+ views/default/page_elements/footer.php,
+ views/default/page_elements/header.php,
+ views/default/pageshells/pageshell.php,
+ views/default/pageshells/pageshell_loggedout.php,
+ views/default/pageshells/pageshell_sidebar.php, views/default/text/about.php,
+ views/default/text/privacy_view.php, views/default/text/tos_view.php: some
+ new views
+
+2008-03-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, engine/lib/users.php: Adding metadata and annotations
+ for users.
+
+2008-03-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Erp
+
+2008-03-10 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * views/default/welcome.php: logout bug fix
+
+2008-03-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php:
+
+ * engine/lib/annotations.php, engine/lib/sites.php: Marcus Povey
+ <marcus@dushka.co.uk> * Simple maths functions added
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Site objects
+
+2008-03-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, actions/logout.php, engine/lib/actions.php,
+ engine/lib/elgglib.php, engine/lib/users.php,
+ views/default/messages/list.php, views/default/messages/messages/list.php,
+ views/default/pageshell.php: Messages and actions: fixed!
+
+2008-03-10 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Remove site
+ metadata
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Get user sites
+
+2008-03-10 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * actions/login.php, views/default/login.php: Fixing the login form
+
+2008-03-09 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * index.php: Marcus Povey <marcus@dushka.co.uk> * Commented out my testing
+
+ * engine/lib/annotations.php:
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Fixed copy
+ constructor
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Will now
+ return objects via metadata
+
+ * engine/schema/mysql.sql:
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Corrected
+ database fault
+
+2008-03-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/settings.example.php: add url field to settings
+
+ * views/default/css.php: css tweak
+
+ * actions/login.php, actions/logout.php, engine/lib/users.php, index.php,
+ views/default/css.php, views/default/login.php, views/default/pageshell.php,
+ views/default/welcome.php: crude login and logout functionality
+
+2008-03-08 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ get_objects_from_metadatas (untested)
+
+2008-03-08 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php, mod/test/index.php: Configuration fix
+
+2008-03-08 dave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/vendors/jquery/jquery.js: jquery added to core
+
+2008-03-07 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Add name and
+ value to get_metadatas
+
+2008-03-07 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/users.php: Log in and logout
+
+ * mod/test/start.php, mod/test/views/default/testplugin/pageshell.php: Test
+ plugin
+
+ * engine/lib/elgglib.php: Event API fix
+
+ * engine/lib/plugins.php, engine/start.php: Some extra plugins stuff
+
+ * engine/lib/users.php: Grabbing the ElggUser and sticking it in the session
+ as appropriate
+
+ * engine/lib/friends.php, engine/lib/users.php, engine/schema/mysql.sql,
+ index.php: Users and friends
+
+ * engine/lib/sites.php: Fix for ElggSites
+
+2008-03-07 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * endpoints/rest.php, engine/lib/api.php, engine/schema/mysql.sql: Marcus
+ Povey <marcus@dushka.co.uk> * Initial work on API
+
+2008-03-06 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/sites.php: Marcus Povey
+ <marcus@dushka.co.uk> * Added delete annotations, fixed error on annotation
+ search (missing params)
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Delete site
+ implemented
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Count added
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Casting done
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Updated
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Added
+ count to annotations
+
+ * engine/lib/objects.php: Marcus Povey <marcus@dushka.co.uk> * Casting takes
+ advantage of constructor
+
+ * engine/lib/annotations.php, engine/lib/metadata.php, engine/lib/sites.php,
+ index.php: Marcus Povey <marcus@dushka.co.uk> * Initial annotations and
+ metadata get/sets functional, combined with site test
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Can
+ retrieve annotations
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Metadata
+ creates and updates
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Meta now
+ updates if item already exists (if the user has permission)
+
+2008-03-06 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Objects are now cast to ElggObjects on get
+
+2008-03-06 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Marcus Povey
+ <marcus@dushka.co.uk> * Cleared up typo
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * User ID
+ detected if not provided
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Very
+ crude type detection for annotation tags, defaults to 'tag'
+
+ * engine/lib/sites.php: Marcus Povey <marcus@dushka.co.uk> * Implemented
+ update site
+
+ * engine/lib/annotations.php: Marcus Povey <marcus@dushka.co.uk> * Ability
+ to change owner
+
+ * engine/lib/metadata.php: Marcus Povey <marcus@dushka.co.uk> * Ability to
+ change owner
+
+ * engine/lib/annotations.php, engine/lib/metadata.php,
+ engine/lib/objects.php: Marcus Povey <marcus@dushka.co.uk> * Fixed get/sets
+
+ * engine/lib/objects.php: Fixed ElggObject attributes.
+
+ * engine/schema/mysql.sql:
+
+ * engine/schema/mysql.sql: Marcus Povey <marcus@dushka.co.uk> * Removed
+ write access id on sites since it seemed superfluous
+
+2008-03-05 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/annotations.php, engine/lib/metadata.php, engine/lib/sites.php,
+ index.php: End of day
+
+ * engine/lib/database.php: Marcus Povey <marcus@dushka.co.uk> * Sanitise
+ trims as well
+
+ * engine/lib/exceptions.php: Marcus Povey <marcus@dushka.co.uk> * A couple
+ more exceptions
+
+ * engine/lib/elgglib.php: Marcus Povey <marcus@dushka.co.uk> * Exceptions
+ that are handled by the default elgg error handler are now echoed to the
+ error log.
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Minor tweaks
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Switching to desktop
+
+ * engine/lib/annotations.php, engine/lib/metadata.php: Types forced on
+ $object->value
+
+ * engine/lib/metadata.php: Added metadata object and methods
+
+ * engine/schema/mysql.sql: Added owner id to metadata
+
+ * engine/lib/annotations.php, engine/lib/sites.php: Changed
+ mysql_real_escape_string to sanitise_string
+
+ * engine/lib/annotations.php: Get annotations
+
+2008-03-04 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/metadata.php: Commit so i can switch to the laptop...
+
+ * engine/lib/annotations.php: initial annotations library added (untested)
+
+ * engine/schema/mysql.sql: Added metadata and annotations, removed
+ superfluous tables.
+
+ * engine/lib/sites.php:
+
+ * engine/lib/sites.php: Get site prototype
+
+ * engine/lib/sites.php: Save
+
+ * engine/lib/sites.php: Added a basic ElggSite outline
+
+2008-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Further additions to the ElggObject, according to
+ spec
+
+2008-03-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/schema/mysql.sql: new site db
+
+ * engine/lib/database.php: Fixed get_tables so install works correctly
+
+ * engine/lib/configuration.php: Fixed wwwroot
+
+2008-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Extending stdClass is silly
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php: Removed some notices
+
+ * engine/lib/database.php: Fixed install issue
+
+2008-03-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: removed echo
+
+2008-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/configuration.php, engine/lib/database.php,
+ engine/schema/mysql.sql, engine/settings.example.php, engine/start.php:
+ Installation issues: fixed
+
+2008-03-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed short circuit comparison
+
+2008-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Some further fixes
+
+ * engine/lib/elgglib.php: Views directory fix
+
+2008-03-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Fixed file exist error
+
+ * engine/lib/elgglib.php: Removed test to see if .htaccess exists, this test
+ doesn't work on my machine. Reason unknown.
+
+ * engine/lib/database.php: Candidate for deletion
+
+2008-03-03 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Added callbacks to get_data
+
+ * engine/lib/objects.php, index.php: Some misc changes
+
+2008-03-03 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Database errors now distinct from "no data",
+ errors are hard fails
+
+2008-02-17 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/objects.php: Further metadata and ElggObject updates.
+
+ * engine/lib/objects.php: Added most of an ElggObject class
+
+ * engine/lib/objects.php: Full object and object metadata CRUD functionality
+
+2008-02-15 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/access.php, engine/lib/database.php, engine/lib/objects.php,
+ engine/lib/sites.php, engine/lib/users.php, engine/schema/mysql.sql,
+ index.php: All kinds of object and database stuff
+
+ * engine/schema/mysql.sql, engine/start.php, install.php: Added the concept
+ of a site_id to msot of the database tables. Also some extra installation
+ stuff.
+
+ * views/default/css.php: Added a CSS file
+
+ * engine/lib/actions.php, engine/lib/database.php, engine/lib/elgglib.php,
+ engine/lib/plugins.php, engine/schema/mysql.sql, engine/settings.example.php:
+ Adding more plugin-related fun
+
+ * engine/lib/configuration.php, views/default/pageshell.php: Various
+ configuration things
+
+ * engine/lib/configuration.php, engine/lib/elgglib.php,
+ engine/lib/plugins.php, engine/start.php: Simple plugin mechanism
+
+ * engine/lib/elgglib.php: Correction to previous
+
+ * engine/lib/elgglib.php: Plugins can now extend views.
+
+ * css/css.php: Importing the dynamic CSS file
+
+2008-02-14 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/install.php, install.php, views/default/pageshell.php: Some
+ further installation tweaks
+
+ * engine/lib/database.php, engine/lib/elgglib.php, install.php: A simple
+ beginning to an install script
+
+ * action.php, htaccess_dist, index.php, views/default/pageshell.php: Changes
+ to site structure
+
+ * engine/lib/actions.php, engine/lib/elgglib.php, engine/schema/mysql.sql,
+ engine/settings.example.php, index.php,
+ views/default/messages/sanitisation/htaccess.php: Actions, .htaccess, and the
+ database schema
+
+2008-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/database.php: Added more context to the database function notes
+
+ * engine/lib/database.php, engine/start.php: Added some fancy database
+ connection gubbins. If you give it loads of read or write dbs to pick from,
+ Elgg will choose one at random for each category!
+
+ * engine/lib/elgglib.php, engine/start.php, views/default/pageshell.php:
+ Messages and exceptions, working merrily together. Aww.
+
+ * views/default/messages/messages/list.php,
+ views/default/messages/messages/message.php: Standard messages are now
+ displayed.
+
+ * engine/lib/elgglib.php, engine/start.php,
+ views/default/messages/errors/exception.php,
+ views/default/messages/exceptions/exception.php,
+ views/default/messages/list.php, views/default/pageshell.php: Further message
+ handling in the template
+
+ * engine/lib/elgglib.php, engine/lib/input.php, engine/start.php,
+ views/default/messages/errors/exception.php: Exception handling
+
+2008-02-13 icewing <icewing@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php: Moving on to explodenew
+
+ * engine/lib/exceptions.php: Updates
+
+ * engine/lib/input.php: Added input method
+
+ * engine/start.php: Start now reporting errors using exceptions...
+
+ * engine/lib/exceptions.php: Added installation exception
+
+ * engine/start.php: Loads now
+
+ * engine/lib/elgglib.php: Ooops...
+
+ * engine/start.php: Loading exceptions
+
+ * engine/lib/elgglib.php: Added error handler stuff.
+
+ * engine/lib/exceptions.php: Added exceptions
+
+ * engine/start.php: Added CVS exclude to start.php
+
+2008-02-13 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/start.php, views/default/messages/sanitisation/settings.php: A
+ slightly better no-settings error. It's probably a good idea to eventually
+ allow people to edit settings.php directly if they have the access defined.
+
+ * engine/start.php: Let's be a little more friendly.
+
+ * engine/start.php, views/default/messages/errors/error.php,
+ views/default/messages/errors/list.php, views/default/pageshell.php: Some
+ error reporting and initial (very, very basic) templating
+
+ * engine/lib/elgglib.php: A little reoirganisation in elgglib
+
+2008-02-12 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/lib/elgglib.php: Adding priority and a little more description to
+ the events API.
+
+ * engine/lib/elgglib.php, engine/start.php: Adding the events API
+
+ * engine/lib/elgglib.php, engine/start.php: Sanitisation
+
+ * engine/lib/elgglib.php, engine/start.php,
+ views/default/messages/sanitisation/settings.php: Introducing views and some
+ sanitisation
+
+ * engine/lib/elgglib.php, engine/start.php, index.php: The engine starter
+ now functions appropriately
+
+2008-02-11 ben <ben@36083f99-b078-4883-b0ff-0f9b5a30f544>
+
+ * engine/settings.example.php, engine/start.functions.php, engine/start.php:
+ Some more bootstrapping.
diff --git a/INSTALL.txt b/INSTALL.txt
new file mode 100644
index 000000000..f4ecbffe1
--- /dev/null
+++ b/INSTALL.txt
@@ -0,0 +1,113 @@
+The latest version of the installation instructions is available at:
+[http://docs.elgg.org/wiki/Installation]
+
+Installation Troubleshooting is available at:
+[http://docs.elgg.org/wiki/Troubleshooting]
+
+
+ELGG INSTALLATION INSTRUCTIONS
+
+TECHNICAL REQUIREMENTS
+
+Elgg runs on a combination of the Apache web server, MySQL database
+system and the PHP interpreted scripting language. This is the most
+popular web server environment in the world. (Elgg can also run on
+other web servers such a nginx and IIS, but requires further configuration).
+
+Due to Elgg's advanced functionality, there are some extra
+configuration requirements:
+
+ * The Apache web server needs to be installed with the following
+ modules:
+ o mod_rewrite
+ o PHP
+ * MySQL 5+.
+ * PHP 5.2+ needs to be installed as an Apache module
+ with the following libraries:
+ o GD (for graphics processing such as avatar cropping)
+ o Multibyte String support (for internationalization)
+
+It is recommended that you increase the memory available to PHP
+threads beyond the standard 8 or 12M, and increase the maximum
+uploaded filesize (which defaults to 2M). In both cases, this can be
+found in your php.ini.
+
+
+INSTALLING ELGG
+
+Before you begin, make sure you have read Elgg's technical
+requirements. If you discover problems after following these
+instructions, check out the troubleshooting page at
+[http://docs.elgg.org/wiki/Troubleshooting].
+
+
+1. Upload Elgg
+
+Unzip Elgg and upload it to your site's document root.
+
+
+2. Create a data folder
+
+Elgg needs a special folder to store uploaded files, including
+profile icons and photos. You will need to create this for it.
+
+We recommend that this folder is called data, and is stored outside
+of your document root. For example, if Elgg is installed in
+/home/elgg/html/, you might create it in /home/elgg/data.
+
+Once this folder has been created, you'll need to make sure that your
+web server has permission to write to it. This shouldn't be a problem
+on Windows-based servers, but if your server runs Linux or a UNIX variant,
+you'll need to figure out what user Apache runs under. For Debian-based
+distros, it is usually www-data and for RedHat, it is often apache. If you
+cannot figure out what the ownership and permissions should be, you can
+set the permissions for world access (though not recommended):
+
+chmod 777 /home/elgg/data/
+
+If you use a graphical client to upload files, you can usually set
+this by right or shift-clicking on the folder and selecting
+'properties'.
+
+
+3. Create a database
+
+Using your database administration tool of choice (if you're unsure
+about this, ask your system administrator), create a new database for
+Elgg. Make sure you know the username and password necessary to
+access this.
+
+
+4. Visit your Elgg site
+
+Once you've performed these steps, visit your Elgg site in your web
+browser. Elgg will take you through the rest of the installation
+process from there.
+
+
+A note on settings.php and .htaccess
+
+The Elgg installer will try and create two files for you:
+
+ * engine/settings.php, which contains the database settings for
+ your installation
+ * .htaccess, which allows Elgg to generate dynamic URLs
+
+If your web server does not have permission to create these files, you
+will need to either
+
+1. Change the permissions on the directory where you are installing
+ Elgg and the engine directory and try again. Remember to change the
+ permissions back to the original values after installation is complete.
+
+2. Copy engine/settings.example.php to engine/settings.php, open
+ it up in a text editor and fill in your database details. Then
+ copy /htaccess_dist to /.htaccess
+
+
+
+The latest version of this document is available at:
+[http://docs.elgg.org/wiki/Installation]
+
+Installation Troubleshooting is available at:
+[http://docs.elgg.org/wiki/Troubleshooting]
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 000000000..f833d881e
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS \ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..a1b3e1cbf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+Lorea
+=====
+
+(Re-)Taking the Networks!
+
+The [lorea](https://lorea.org) code aims at providing individuals and teams with privacy-aware, security-conscious, and user-controlled-data collaborative tools over the Web, and around it.
+
+The main application is based on [Elgg](http://elgg.org), a PHP-based social networking platform. Lorea extends it with plugins to provide better privacy features, including strong encryption, *OStatus-based federation* with other Lorea/Elgg installations and OStatus-compliant projects, etc.
+
+It also integrates other popular technologies such as [DokuWiki](http://www.dokuwiki.org), [Etherpad](http://etherpad.org), [XMPP](http://xmpp.org), etc., and provides *GPG-encrypted mailing-lists* to groups.
+
+### Installation
+
+Our code is divided in two git repositories: elgg and lorea-plugins. You can get it using the following commands.
+
+<pre>
+$ git clone git://gitorious.org/lorea/elgg.git
+$ cd elgg
+$ git remote add lorea-plugins git://gitorious.org/lorea/lorea-plugins.git
+$ git pull lorea-plugins master
+</pre>
+
+You can update the code to the latest release using:
+
+<pre>
+$ git pull origin master
+$ git pull lorea-plugins master
+</pre>
diff --git a/UPGRADE.txt b/UPGRADE.txt
new file mode 100644
index 000000000..e9610fe39
--- /dev/null
+++ b/UPGRADE.txt
@@ -0,0 +1,71 @@
+Elgg Upgrade Instructions
+=========================
+
+Note: Upgrades are one way--You cannot downgrade once you run the upgrade
+ script. Always back up your database, code, and data directory
+ before upgrading!
+
+
+Upgrading from Elgg 1.7 to 1.8.
+----------------------------------------------------
+
+1. Back up your Elgg database, code, and data directory.
+
+2. Download the latest version of Elgg from http://elgg.org/.
+
+3. Identify and save any changes to core files. Pay special attention to
+ the views and actions directories. You should put these changes in plugins
+ once you have installed Elgg 1.8.
+
+3. Delete the following directories in the Elgg root on your server:
+ * _css
+ * account
+ * actions
+ * admin
+ * dashboard
+ * entities
+ * friends
+ * search
+ * settings
+ * simplecache
+ * views
+
+4. Delete the following core plugins from the Elgg mod directory. Most of these
+ plugins are deprecated and no longer supported by Elgg's core developers.
+ Others have been significantly changed and need to be replaced by new versions.
+ If you modified these plugins, you will need to upgrade the plugin to work
+ in Elgg 1.8.
+ * captcha
+ * crontrigger
+ * default_widgets
+ * friends
+ * riverdashboard
+ * twitter_service
+ * profile
+
+5. Upload and overwrite your existing Elgg files with the Elgg 1.8 files.
+
+6. Copy htaccess_dist to .htaccess, replacing your existing version. Any
+ modifications to the original .htaccess should be moved to the new
+ .htaccess file.
+
+7. Visit http://your-elgg-site/upgrade.php
+
+
+Upgrading to the latest release
+-----------------------------------------
+
+1. Back up your Elgg database, code, and data directory.
+
+2. Download the latest version of Elgg from http://elgg.org/.
+
+3. Upload and overwrite your existing Elgg files. Any modifications should
+ have been written within plugins so that they are not lost. If this is
+ not the case, take care to maintain your modifications. If you have
+ modified core files, Elgg may not work correctly.
+
+4. Copy htaccess_dist to .htaccess, replacing your existing version. Any
+ modifications to the original .htaccess should be moved to the new
+ .htaccess file.
+
+5. Visit http://your-elgg-site/upgrade.php
diff --git a/_graphics/SPRITES_LICENSE.TXT b/_graphics/SPRITES_LICENSE.TXT
new file mode 100644
index 000000000..61b0daf3a
--- /dev/null
+++ b/_graphics/SPRITES_LICENSE.TXT
@@ -0,0 +1,9 @@
+The Sprites are copyright © GentleFace http://www.gentleface.com/
+
+They are licensed under Creative Commons
+Attribution-NonCommercial-NoDerivs 3.0 Unported (CC BY-NC-ND 3.0) with special
+permission to distribute and use with the Elgg open source framework. For uses
+outside of Elgg, please see the license and/or contact the author at
+design@gentleface.com
+
+http://creativecommons.org/licenses/by-nc-nd/3.0/ \ No newline at end of file
diff --git a/_graphics/admin_sprites.png b/_graphics/admin_sprites.png
new file mode 100644
index 000000000..82a66f5b2
--- /dev/null
+++ b/_graphics/admin_sprites.png
Binary files differ
diff --git a/_graphics/ajax_loader.gif b/_graphics/ajax_loader.gif
new file mode 100644
index 000000000..b55e148bb
--- /dev/null
+++ b/_graphics/ajax_loader.gif
Binary files differ
diff --git a/_graphics/ajax_loader_bw.gif b/_graphics/ajax_loader_bw.gif
new file mode 100644
index 000000000..e195e1fd8
--- /dev/null
+++ b/_graphics/ajax_loader_bw.gif
Binary files differ
diff --git a/_graphics/button_background.gif b/_graphics/button_background.gif
new file mode 100644
index 000000000..99eac3ecd
--- /dev/null
+++ b/_graphics/button_background.gif
Binary files differ
diff --git a/_graphics/button_graduation.png b/_graphics/button_graduation.png
new file mode 100644
index 000000000..4ca37bbdc
--- /dev/null
+++ b/_graphics/button_graduation.png
Binary files differ
diff --git a/_graphics/elgg_logo.png b/_graphics/elgg_logo.png
new file mode 100644
index 000000000..7a7e01f06
--- /dev/null
+++ b/_graphics/elgg_logo.png
Binary files differ
diff --git a/_graphics/elgg_sprites.png b/_graphics/elgg_sprites.png
new file mode 100644
index 000000000..02b452d94
--- /dev/null
+++ b/_graphics/elgg_sprites.png
Binary files differ
diff --git a/_graphics/elgg_toolbar_logo.gif b/_graphics/elgg_toolbar_logo.gif
new file mode 100644
index 000000000..a7c03a918
--- /dev/null
+++ b/_graphics/elgg_toolbar_logo.gif
Binary files differ
diff --git a/_graphics/favicon.ico b/_graphics/favicon.ico
new file mode 100644
index 000000000..9e1ecc699
--- /dev/null
+++ b/_graphics/favicon.ico
Binary files differ
diff --git a/_graphics/friendspicker.png b/_graphics/friendspicker.png
new file mode 100644
index 000000000..78b540397
--- /dev/null
+++ b/_graphics/friendspicker.png
Binary files differ
diff --git a/_graphics/header_shadow.png b/_graphics/header_shadow.png
new file mode 100644
index 000000000..4c07b814a
--- /dev/null
+++ b/_graphics/header_shadow.png
Binary files differ
diff --git a/_graphics/icons/default/large.png b/_graphics/icons/default/large.png
new file mode 100644
index 000000000..1c1b208a3
--- /dev/null
+++ b/_graphics/icons/default/large.png
Binary files differ
diff --git a/_graphics/icons/default/medium.png b/_graphics/icons/default/medium.png
new file mode 100644
index 000000000..aef97cb08
--- /dev/null
+++ b/_graphics/icons/default/medium.png
Binary files differ
diff --git a/_graphics/icons/default/small.png b/_graphics/icons/default/small.png
new file mode 100644
index 000000000..ae33fd096
--- /dev/null
+++ b/_graphics/icons/default/small.png
Binary files differ
diff --git a/_graphics/icons/default/tiny.png b/_graphics/icons/default/tiny.png
new file mode 100644
index 000000000..a8ffe5153
--- /dev/null
+++ b/_graphics/icons/default/tiny.png
Binary files differ
diff --git a/_graphics/icons/default/topbar.png b/_graphics/icons/default/topbar.png
new file mode 100644
index 000000000..149dfea7f
--- /dev/null
+++ b/_graphics/icons/default/topbar.png
Binary files differ
diff --git a/_graphics/icons/user/defaultlarge.gif b/_graphics/icons/user/defaultlarge.gif
new file mode 100644
index 000000000..6ea3bd4cd
--- /dev/null
+++ b/_graphics/icons/user/defaultlarge.gif
Binary files differ
diff --git a/_graphics/icons/user/defaultmaster.gif b/_graphics/icons/user/defaultmaster.gif
new file mode 100644
index 000000000..5bfd67a2d
--- /dev/null
+++ b/_graphics/icons/user/defaultmaster.gif
Binary files differ
diff --git a/_graphics/icons/user/defaultmedium.gif b/_graphics/icons/user/defaultmedium.gif
new file mode 100644
index 000000000..c6b2e6a6d
--- /dev/null
+++ b/_graphics/icons/user/defaultmedium.gif
Binary files differ
diff --git a/_graphics/icons/user/defaultsmall.gif b/_graphics/icons/user/defaultsmall.gif
new file mode 100644
index 000000000..661d72f04
--- /dev/null
+++ b/_graphics/icons/user/defaultsmall.gif
Binary files differ
diff --git a/_graphics/icons/user/defaulttiny.gif b/_graphics/icons/user/defaulttiny.gif
new file mode 100644
index 000000000..1775346bc
--- /dev/null
+++ b/_graphics/icons/user/defaulttiny.gif
Binary files differ
diff --git a/_graphics/icons/user/defaulttopbar.gif b/_graphics/icons/user/defaulttopbar.gif
new file mode 100644
index 000000000..c3616aeb5
--- /dev/null
+++ b/_graphics/icons/user/defaulttopbar.gif
Binary files differ
diff --git a/_graphics/powered_by_elgg_badge_drk_bckgnd.gif b/_graphics/powered_by_elgg_badge_drk_bckgnd.gif
new file mode 100644
index 000000000..5c2ddc4fc
--- /dev/null
+++ b/_graphics/powered_by_elgg_badge_drk_bckgnd.gif
Binary files differ
diff --git a/_graphics/powered_by_elgg_badge_light_bckgnd.gif b/_graphics/powered_by_elgg_badge_light_bckgnd.gif
new file mode 100644
index 000000000..6367ef302
--- /dev/null
+++ b/_graphics/powered_by_elgg_badge_light_bckgnd.gif
Binary files differ
diff --git a/_graphics/sidebar_background.gif b/_graphics/sidebar_background.gif
new file mode 100644
index 000000000..868012bb1
--- /dev/null
+++ b/_graphics/sidebar_background.gif
Binary files differ
diff --git a/_graphics/spacer.gif b/_graphics/spacer.gif
new file mode 100644
index 000000000..5bfd67a2d
--- /dev/null
+++ b/_graphics/spacer.gif
Binary files differ
diff --git a/_graphics/toptoolbar_background.gif b/_graphics/toptoolbar_background.gif
new file mode 100644
index 000000000..1b1166e7b
--- /dev/null
+++ b/_graphics/toptoolbar_background.gif
Binary files differ
diff --git a/_graphics/two_sidebar_background.gif b/_graphics/two_sidebar_background.gif
new file mode 100644
index 000000000..947f5cf46
--- /dev/null
+++ b/_graphics/two_sidebar_background.gif
Binary files differ
diff --git a/_graphics/walled_garden/one_column_bottom.png b/_graphics/walled_garden/one_column_bottom.png
new file mode 100644
index 000000000..bd2296896
--- /dev/null
+++ b/_graphics/walled_garden/one_column_bottom.png
Binary files differ
diff --git a/_graphics/walled_garden/one_column_middle.png b/_graphics/walled_garden/one_column_middle.png
new file mode 100644
index 000000000..f53abc123
--- /dev/null
+++ b/_graphics/walled_garden/one_column_middle.png
Binary files differ
diff --git a/_graphics/walled_garden/one_column_top.png b/_graphics/walled_garden/one_column_top.png
new file mode 100644
index 000000000..dc8de438a
--- /dev/null
+++ b/_graphics/walled_garden/one_column_top.png
Binary files differ
diff --git a/_graphics/walled_garden/two_column_bottom.png b/_graphics/walled_garden/two_column_bottom.png
new file mode 100644
index 000000000..21e076991
--- /dev/null
+++ b/_graphics/walled_garden/two_column_bottom.png
Binary files differ
diff --git a/_graphics/walled_garden/two_column_middle.png b/_graphics/walled_garden/two_column_middle.png
new file mode 100644
index 000000000..9a93f19a9
--- /dev/null
+++ b/_graphics/walled_garden/two_column_middle.png
Binary files differ
diff --git a/_graphics/walled_garden/two_column_top.png b/_graphics/walled_garden/two_column_top.png
new file mode 100644
index 000000000..cd71a4262
--- /dev/null
+++ b/_graphics/walled_garden/two_column_top.png
Binary files differ
diff --git a/actions/admin/delete_admin_notice.php b/actions/admin/delete_admin_notice.php
new file mode 100644
index 000000000..a9c3b8758
--- /dev/null
+++ b/actions/admin/delete_admin_notice.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Removes an admin notice.
+ */
+
+$guid = get_input('guid');
+$notice = get_entity($guid);
+
+if (!(elgg_instanceof($notice, 'object', 'admin_notice') && $notice->delete())) {
+ register_error(elgg_echo("admin:notices:could_not_delete"));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/menu/save.php b/actions/admin/menu/save.php
new file mode 100644
index 000000000..66ce71082
--- /dev/null
+++ b/actions/admin/menu/save.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Save menu items.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+// featured menu items
+$featured_names = get_input('featured_menu_names', array());
+$featured_names = array_unique($featured_names);
+if (in_array(' ', $featured_names)) {
+ unset($featured_names[array_search(' ', $featured_names)]);
+}
+elgg_save_config('site_featured_menu_names', $featured_names);
+
+// custom menu items
+$custom_menu_titles = get_input('custom_menu_titles', array());
+$custom_menu_urls = get_input('custom_menu_urls', array());
+$num_menu_items = count($custom_menu_titles);
+$custom_menu_items = array();
+for ($i = 0; $i < $num_menu_items; $i++) {
+ if (trim($custom_menu_urls[$i]) && trim($custom_menu_titles[$i])) {
+ $url = $custom_menu_urls[$i];
+ $title = $custom_menu_titles[$i];
+ $custom_menu_items[$title] = $url;
+ }
+}
+elgg_save_config('site_custom_menu_items', $custom_menu_items);
+
+
+system_message(elgg_echo('admin:menu_items:saved'));
+
+forward(REFERER);
diff --git a/actions/admin/plugins/activate.php b/actions/admin/plugins/activate.php
new file mode 100644
index 000000000..5234a4ca5
--- /dev/null
+++ b/actions/admin/plugins/activate.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Activate a plugin or plugins.
+ *
+ * Plugins to be activated are passed via $_REQUEST['plugin_guids'] as GUIDs.
+ * After activating the plugin(s), the views cache and simplecache are invalidated.
+ *
+ * @uses mixed $_GET['plugin_guids'] The GUIDs of the plugin to activate. Can be an array.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Plugins
+ */
+
+$plugin_guids = get_input('plugin_guids');
+
+if (!is_array($plugin_guids)) {
+ $plugin_guids = array($plugin_guids);
+}
+
+$activated_guids = array();
+foreach ($plugin_guids as $guid) {
+ $plugin = get_entity($guid);
+
+ if (!($plugin instanceof ElggPlugin)) {
+ register_error(elgg_echo('admin:plugins:activate:no', array($guid)));
+ continue;
+ }
+
+ if ($plugin->activate()) {
+ $activated_guids[] = $guid;
+ } else {
+ $msg = $plugin->getError();
+ $string = ($msg) ? 'admin:plugins:activate:no_with_msg' : 'admin:plugins:activate:no';
+ register_error(elgg_echo($string, array($plugin->getFriendlyName(), $plugin->getError())));
+ }
+}
+
+// don't regenerate the simplecache because the plugin won't be
+// loaded until next run. Just invalidate and let it regenerate as needed
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+if (count($activated_guids) === 1) {
+ $url = 'admin/plugins';
+ $query = (string)parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY);
+ if ($query) {
+ $url .= "?$query";
+ }
+ $plugin = get_entity($plugin_guids[0]);
+ $id = $css_id = preg_replace('/[^a-z0-9-]/i', '-', $plugin->getID());
+ forward("$url#$id");
+} else {
+ // forward to top of page with a failure so remove any #foo
+ $url = $_SERVER['HTTP_REFERER'];
+ if (strpos($url, '#')) {
+ $url = substr(0, strpos($url, '#'));
+ }
+ forward($url);
+} \ No newline at end of file
diff --git a/actions/admin/plugins/activate_all.php b/actions/admin/plugins/activate_all.php
new file mode 100644
index 000000000..4514ccbdf
--- /dev/null
+++ b/actions/admin/plugins/activate_all.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Activates all specified installed and inactive plugins.
+ *
+ * All specified plugins in the mod/ directory are that aren't active are activated and the views
+ * cache and simplecache are invalidated.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Plugins
+ */
+
+$guids = get_input('guids');
+$guids = explode(',', $guids);
+
+foreach ($guids as $guid) {
+ $plugin = get_entity($guid);
+ if (!$plugin->isActive()) {
+ if ($plugin->activate()) {
+ //system_message(elgg_echo('admin:plugins:activate:yes', array($plugin->getManifest()->getName())));
+ } else {
+ $msg = $plugin->getError();
+ $string = ($msg) ? 'admin:plugins:activate:no_with_msg' : 'admin:plugins:activate:no';
+ register_error(elgg_echo($string, array($plugin->getFriendlyName(), $plugin->getError())));
+ }
+ }
+}
+
+// don't regenerate the simplecache because the plugin won't be
+// loaded until next run. Just invalidate and let it regnerate as needed
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/plugins/deactivate.php b/actions/admin/plugins/deactivate.php
new file mode 100644
index 000000000..354f4717d
--- /dev/null
+++ b/actions/admin/plugins/deactivate.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Deactivate a plugin or plugins.
+ *
+ * Plugins to be deactivated are passed via $_REQUEST['plugin_guids'] as GUIDs.
+ * After deactivating the plugin(s), the views cache and simplecache are invalidated.
+ *
+ * @uses mixed $_GET['plugin_guids'] The GUIDs of the plugin to deactivate. Can be an array.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Plugins
+ */
+
+$plugin_guids = get_input('plugin_guids');
+
+if (!is_array($plugin_guids)) {
+ $plugin_guids = array($plugin_guids);
+}
+
+foreach ($plugin_guids as $guid) {
+ $plugin = get_entity($guid);
+
+ if (!($plugin instanceof ElggPlugin)) {
+ register_error(elgg_echo('admin:plugins:deactivate:no', array($guid)));
+ continue;
+ }
+
+ if ($plugin->deactivate()) {
+ //system_message(elgg_echo('admin:plugins:deactivate:yes', array($plugin->getManifest()->getName())));
+ } else {
+ $msg = $plugin->getError();
+ $string = ($msg) ? 'admin:plugins:deactivate:no_with_msg' : 'admin:plugins:deactivate:no';
+ register_error(elgg_echo($string, array($plugin->getFriendlyName(), $plugin->getError())));
+ }
+}
+
+// don't regenerate the simplecache because the plugin won't be
+// loaded until next run. Just invalidate and let it regnerate as needed
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+if (count($plugin_guids) == 1) {
+ $url = 'admin/plugins';
+ $query = (string)parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY);
+ if ($query) {
+ $url .= "?$query";
+ }
+ $plugin = get_entity($plugin_guids[0]);
+ $id = preg_replace('/[^a-z0-9-]/i', '-', $plugin->getID());
+ forward("$url#$id");
+} else {
+ forward(REFERER);
+}
diff --git a/actions/admin/plugins/deactivate_all.php b/actions/admin/plugins/deactivate_all.php
new file mode 100644
index 000000000..8b347a633
--- /dev/null
+++ b/actions/admin/plugins/deactivate_all.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Disable all specified installed plugins.
+ *
+ * Specified plugins in the mod/ directory are disabled and the views cache and simplecache
+ * are reset.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Plugins
+ */
+
+$guids = get_input('guids');
+$guids = explode(',', $guids);
+
+foreach ($guids as $guid) {
+ $plugin = get_entity($guid);
+ if ($plugin->isActive()) {
+ if ($plugin->deactivate()) {
+ //system_message(elgg_echo('admin:plugins:activate:yes', array($plugin->getManifest()->getName())));
+ } else {
+ $msg = $plugin->getError();
+ $string = ($msg) ? 'admin:plugins:deactivate:no_with_msg' : 'admin:plugins:deactivate:no';
+ register_error(elgg_echo($string, array($plugin->getFriendlyName(), $plugin->getError())));
+ }
+ }
+}
+
+// don't regenerate the simplecache because the plugin won't be
+// loaded until next run. Just invalidate and let it regnerate as needed
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+forward(REFERER);
diff --git a/actions/admin/plugins/set_priority.php b/actions/admin/plugins/set_priority.php
new file mode 100644
index 000000000..edd735371
--- /dev/null
+++ b/actions/admin/plugins/set_priority.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Changes the load priority of a plugin.
+ *
+ * Plugin priority affects view, action, and page handler
+ * overriding as well as the order of view extensions. Plugins with higher
+ * priority are loaded after and override plugins with lower priorities.
+ *
+ * NOTE: When viewing the plugin admin page, plugins LOWER on the page
+ * have HIGHER priority and will override views, etc from plugins above them.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Plugins
+ */
+
+$plugin_guid = get_input('plugin_guid');
+$priority = get_input('priority');
+
+$plugin = get_entity($plugin_guid);
+
+if (!($plugin instanceof ElggPlugin)) {
+ register_error(elgg_echo('admin:plugins:set_priority:no', array($plugin_guid)));
+ forward(REFERER);
+}
+
+if ($plugin->setPriority($priority)) {
+ //system_message(elgg_echo('admin:plugins:set_priority:yes', array($plugin->getManifest()->getName())));
+} else {
+ $msg = $plugin->getError();
+ $string = ($msg) ? 'admin:plugins:set_priority:no_with_msg' : 'admin:plugins:set_priority:no';
+ register_error(elgg_echo($string, array($plugin->getFriendlyName(), $plugin->getError())));
+}
+
+// don't regenerate the simplecache because the plugin won't be
+// loaded until next run. Just invalidate and let it regnerate as needed
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/site/flush_cache.php b/actions/admin/site/flush_cache.php
new file mode 100644
index 000000000..ebb8296c7
--- /dev/null
+++ b/actions/admin/site/flush_cache.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Flush all the caches
+ */
+
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+system_message(elgg_echo('admin:cache:flushed'));
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/site/regenerate_secret.php b/actions/admin/site/regenerate_secret.php
new file mode 100644
index 000000000..3112fb5f3
--- /dev/null
+++ b/actions/admin/site/regenerate_secret.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Generate a new site secret
+ */
+
+init_site_secret();
+elgg_reset_system_cache();
+
+system_message(elgg_echo('admin:site:secret_regenerated'));
+
+forward(REFERER);
diff --git a/actions/admin/site/unlock_upgrade.php b/actions/admin/site/unlock_upgrade.php
new file mode 100644
index 000000000..b625b1d26
--- /dev/null
+++ b/actions/admin/site/unlock_upgrade.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Unlocks the upgrade script
+ */
+
+if (_elgg_upgrade_is_locked()) {
+ _elgg_upgrade_unlock();
+}
+system_message(elgg_echo('upgrade:unlock:success'));
+forward(REFERER);
diff --git a/actions/admin/site/update_advanced.php b/actions/admin/site/update_advanced.php
new file mode 100644
index 000000000..4888b0a8d
--- /dev/null
+++ b/actions/admin/site/update_advanced.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Updates the advanced settings for the primary site object.
+ *
+ * Options are saved among metadata on the site object, entries
+ * in the datalist table, and entries in the config table.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Site
+ */
+
+if ($site = elgg_get_site_entity()) {
+ if (!($site instanceof ElggSite)) {
+ throw new InstallationException(elgg_echo('InvalidParameterException:NonElggSite'));
+ }
+
+ $site->url = rtrim(get_input('wwwroot', '', false), '/') . '/';
+
+ datalist_set('path', sanitise_filepath(get_input('path', '', false)));
+ $dataroot = sanitise_filepath(get_input('dataroot', '', false));
+
+ // check for relative paths
+ if (stripos(PHP_OS, 'win') === 0) {
+ if (strpos($dataroot, ':') !== 1) {
+ $msg = elgg_echo('admin:configuration:dataroot:relative_path', array($dataroot));
+ register_error($msg);
+ forward(REFERER);
+ }
+ } else {
+ if (strpos($dataroot, '/') !== 0) {
+ $msg = elgg_echo('admin:configuration:dataroot:relative_path', array($dataroot));
+ register_error($msg);
+ forward(REFERER);
+ }
+ }
+
+ datalist_set('dataroot', $dataroot);
+
+ if (get_input('simplecache_enabled')) {
+ elgg_enable_simplecache();
+ } else {
+ elgg_disable_simplecache();
+ }
+
+ if (get_input('system_cache_enabled')) {
+ elgg_enable_system_cache();
+ } else {
+ elgg_disable_system_cache();
+ }
+
+ set_config('default_access', get_input('default_access', ACCESS_PRIVATE), $site->getGUID());
+
+ $user_default_access = (get_input('allow_user_default_access')) ? 1 : 0;
+ set_config('allow_user_default_access', $user_default_access, $site->getGUID());
+
+ $debug = get_input('debug');
+ if ($debug) {
+ set_config('debug', $debug, $site->getGUID());
+ } else {
+ unset_config('debug', $site->getGUID());
+ }
+
+ // allow new user registration?
+ if (get_input('allow_registration', FALSE)) {
+ set_config('allow_registration', TRUE, $site->getGUID());
+ } else {
+ set_config('allow_registration', FALSE, $site->getGUID());
+ }
+
+ // setup walled garden
+ if (get_input('walled_garden', FALSE)) {
+ set_config('walled_garden', TRUE, $site->getGUID());
+ } else {
+ set_config('walled_garden', FALSE, $site->getGUID());
+ }
+
+ $https_login = get_input('https_login');
+ if ($https_login) {
+ set_config('https_login', 1, $site->getGUID());
+ } else {
+ unset_config('https_login', $site->getGUID());
+ }
+
+ $api = get_input('api');
+ if ($api) {
+ unset_config('disable_api', $site->getGUID());
+ } else {
+ set_config('disable_api', 'disabled', $site->getGUID());
+ }
+
+ if ($site->save()) {
+ system_message(elgg_echo("admin:configuration:success"));
+ } else {
+ register_error(elgg_echo("admin:configuration:fail"));
+ }
+
+ forward(REFERER);
+} \ No newline at end of file
diff --git a/actions/admin/site/update_basic.php b/actions/admin/site/update_basic.php
new file mode 100644
index 000000000..9765182cc
--- /dev/null
+++ b/actions/admin/site/update_basic.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Updates the basic settings for the primary site object.
+ *
+ * Basic site settings are saved as metadata on the site object,
+ * with the exception of the default language, which is saved in
+ * the config table.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.Site
+ */
+
+if ($site = elgg_get_site_entity()) {
+ if (!($site instanceof ElggSite)) {
+ throw new InstallationException(elgg_echo('InvalidParameterException:NonElggSite'));
+ }
+
+ $site->description = get_input('sitedescription');
+ $site->name = strip_tags(get_input('sitename'));
+ $site->email = get_input('siteemail');
+ $site->save();
+
+ set_config('language', get_input('language'), $site->getGUID());
+}
+
+system_message(elgg_echo('admin:configuration:success'));
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/user/ban.php b/actions/admin/user/ban.php
new file mode 100644
index 000000000..209ece2a0
--- /dev/null
+++ b/actions/admin/user/ban.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Bans a user.
+ *
+ * User entities are banned by setting the 'banned' column
+ * to 'yes' in the users_entity table.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if ($guid == elgg_get_logged_in_user_guid()) {
+ register_error(elgg_echo('admin:user:self:ban:no'));
+ forward(REFERER);
+}
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ if ($user->ban('banned')) {
+ system_message(elgg_echo('admin:user:ban:yes'));
+ } else {
+ register_error(elgg_echo('admin:user:ban:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:ban:no'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/user/delete.php b/actions/admin/user/delete.php
new file mode 100644
index 000000000..7cfbd0925
--- /dev/null
+++ b/actions/admin/user/delete.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Delete a user.
+ *
+ * The user will be deleted recursively, meaning all entities
+ * owned or contained by the user will also be removed.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+// Get the user
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if ($guid == elgg_get_logged_in_user_guid()) {
+ register_error(elgg_echo('admin:user:self:delete:no'));
+ forward(REFERER);
+}
+
+$name = $user->name;
+$username = $user->username;
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ if ($user->delete()) {
+ system_message(elgg_echo('admin:user:delete:yes', array($name)));
+ } else {
+ register_error(elgg_echo('admin:user:delete:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:delete:no'));
+}
+
+// forward to user administration if on a user's page as it no longer exists
+$forward = REFERER;
+if (strpos($_SERVER['HTTP_REFERER'], $username) != FALSE) {
+ $forward = "admin/users/newest";
+}
+
+forward($forward);
diff --git a/actions/admin/user/makeadmin.php b/actions/admin/user/makeadmin.php
new file mode 100644
index 000000000..54b0b7070
--- /dev/null
+++ b/actions/admin/user/makeadmin.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Grants admin privileges to a user.
+ *
+ * In >=1.7.1, admin is flagged by setting the admin
+ * column in the users_entity table.
+ *
+ * In <1.7.1, admin is a piece of metadata on the user object.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ if ($user->makeAdmin()) {
+ system_message(elgg_echo('admin:user:makeadmin:yes'));
+ } else {
+ register_error(elgg_echo('admin:user:makeadmin:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:makeadmin:no'));
+}
+
+forward(REFERER);
diff --git a/actions/admin/user/removeadmin.php b/actions/admin/user/removeadmin.php
new file mode 100644
index 000000000..8cebc7078
--- /dev/null
+++ b/actions/admin/user/removeadmin.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Revokes admin privileges from a user.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if ($guid == elgg_get_logged_in_user_guid()) {
+ register_error(elgg_echo('admin:user:self:removeadmin:no'));
+ forward(REFERER);
+}
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ if ($user->removeAdmin()) {
+ system_message(elgg_echo('admin:user:removeadmin:yes'));
+ } else {
+ register_error(elgg_echo('admin:user:removeadmin:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:removeadmin:no'));
+}
+
+forward(REFERER);
diff --git a/actions/admin/user/resetpassword.php b/actions/admin/user/resetpassword.php
new file mode 100644
index 000000000..d019a7f55
--- /dev/null
+++ b/actions/admin/user/resetpassword.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Reset a user's password.
+ *
+ * This is an admin action that generates a new salt and password
+ * for a user, then emails the password to the user's registered
+ * email address.
+ *
+ * NOTE: This is different to the "reset password" link users
+ * can use in that it does not first email the user asking if
+ * they want to have their password reset.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ $password = generate_random_cleartext_password();
+
+ // Always reset the salt before generating the user password.
+ $user->salt = generate_random_cleartext_password();
+ $user->password = generate_user_password($user, $password);
+
+ if ($user->save()) {
+ system_message(elgg_echo('admin:user:resetpassword:yes'));
+
+ notify_user($user->guid,
+ elgg_get_site_entity()->guid,
+ elgg_echo('email:resetpassword:subject'),
+ elgg_echo('email:resetpassword:body', array($user->username, $password)),
+ NULL,
+ 'email');
+ } else {
+ register_error(elgg_echo('admin:user:resetpassword:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:resetpassword:no'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/admin/user/unban.php b/actions/admin/user/unban.php
new file mode 100644
index 000000000..7a772a0d3
--- /dev/null
+++ b/actions/admin/user/unban.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Unbans a user.
+ *
+ * @package Elgg.Core
+ * @subpackage Administration.User
+ */
+
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$guid = get_input('guid');
+$user = get_entity($guid);
+
+if (($user instanceof ElggUser) && ($user->canEdit())) {
+ if ($user->unban()) {
+ system_message(elgg_echo('admin:user:unban:yes'));
+ } else {
+ register_error(elgg_echo('admin:user:unban:no'));
+ }
+} else {
+ register_error(elgg_echo('admin:user:unban:no'));
+}
+
+access_show_hidden_entities($access_status);
+
+forward(REFERER);
diff --git a/actions/avatar/crop.php b/actions/avatar/crop.php
new file mode 100644
index 000000000..b9a80f331
--- /dev/null
+++ b/actions/avatar/crop.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Avatar crop action
+ *
+ */
+
+$guid = get_input('guid');
+$owner = get_entity($guid);
+
+if (!$owner || !($owner instanceof ElggUser) || !$owner->canEdit()) {
+ register_error(elgg_echo('avatar:crop:fail'));
+ forward(REFERER);
+}
+
+$x1 = (int) get_input('x1', 0);
+$y1 = (int) get_input('y1', 0);
+$x2 = (int) get_input('x2', 0);
+$y2 = (int) get_input('y2', 0);
+
+$filehandler = new ElggFile();
+$filehandler->owner_guid = $owner->getGUID();
+$filehandler->setFilename("profile/" . $owner->guid . "master" . ".jpg");
+$filename = $filehandler->getFilenameOnFilestore();
+
+// ensuring the avatar image exists in the first place
+if (!file_exists($filename)) {
+ register_error(elgg_echo('avatar:crop:fail'));
+ forward(REFERER);
+}
+
+$icon_sizes = elgg_get_config('icon_sizes');
+unset($icon_sizes['master']);
+
+// get the images and save their file handlers into an array
+// so we can do clean up if one fails.
+$files = array();
+foreach ($icon_sizes as $name => $size_info) {
+ $resized = get_resized_image_from_existing_file($filename, $size_info['w'], $size_info['h'], $size_info['square'], $x1, $y1, $x2, $y2, $size_info['upscale']);
+
+ if ($resized) {
+ //@todo Make these actual entities. See exts #348.
+ $file = new ElggFile();
+ $file->owner_guid = $guid;
+ $file->setFilename("profile/{$guid}{$name}.jpg");
+ $file->open('write');
+ $file->write($resized);
+ $file->close();
+ $files[] = $file;
+ } else {
+ // cleanup on fail
+ foreach ($files as $file) {
+ $file->delete();
+ }
+
+ register_error(elgg_echo('avatar:resize:fail'));
+ forward(REFERER);
+ }
+}
+
+$owner->icontime = time();
+
+$owner->x1 = $x1;
+$owner->x2 = $x2;
+$owner->y1 = $y1;
+$owner->y2 = $y2;
+
+system_message(elgg_echo('avatar:crop:success'));
+$view = 'river/user/default/profileiconupdate';
+elgg_delete_river(array('subject_guid' => $owner->guid, 'view' => $view));
+add_to_river($view, 'update', $owner->guid, $owner->guid);
+
+forward(REFERER);
diff --git a/actions/avatar/remove.php b/actions/avatar/remove.php
new file mode 100644
index 000000000..9cb40a760
--- /dev/null
+++ b/actions/avatar/remove.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Avatar remove action
+ */
+
+$user_guid = get_input('guid');
+$user = get_user($user_guid);
+
+if (!$user || !$user->canEdit()) {
+ register_error(elgg_echo('avatar:remove:fail'));
+ forward(REFERER);
+}
+
+// Delete all icons from diskspace
+$icon_sizes = elgg_get_config('icon_sizes');
+foreach ($icon_sizes as $name => $size_info) {
+ $file = new ElggFile();
+ $file->owner_guid = $user_guid;
+ $file->setFilename("profile/{$user_guid}{$name}.jpg");
+ $filepath = $file->getFilenameOnFilestore();
+ if (!$file->delete()) {
+ elgg_log("Avatar file remove failed. Remove $filepath manually, please.", 'WARNING');
+ }
+}
+
+// Remove crop coords
+unset($user->x1);
+unset($user->x2);
+unset($user->y1);
+unset($user->y2);
+
+// Remove icon
+unset($user->icontime);
+
+system_message(elgg_echo('avatar:remove:success'));
+forward(REFERER);
diff --git a/actions/avatar/upload.php b/actions/avatar/upload.php
new file mode 100644
index 000000000..0752615e0
--- /dev/null
+++ b/actions/avatar/upload.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Avatar upload action
+ */
+
+$guid = get_input('guid');
+$owner = get_entity($guid);
+
+if (!$owner || !($owner instanceof ElggUser) || !$owner->canEdit()) {
+ register_error(elgg_echo('avatar:upload:fail'));
+ forward(REFERER);
+}
+
+if ($_FILES['avatar']['error'] != 0) {
+ register_error(elgg_echo('avatar:upload:fail'));
+ forward(REFERER);
+}
+
+$icon_sizes = elgg_get_config('icon_sizes');
+
+// get the images and save their file handlers into an array
+// so we can do clean up if one fails.
+$files = array();
+foreach ($icon_sizes as $name => $size_info) {
+ $resized = get_resized_image_from_uploaded_file('avatar', $size_info['w'], $size_info['h'], $size_info['square'], $size_info['upscale']);
+
+ if ($resized) {
+ //@todo Make these actual entities. See exts #348.
+ $file = new ElggFile();
+ $file->owner_guid = $guid;
+ $file->setFilename("profile/{$guid}{$name}.jpg");
+ $file->open('write');
+ $file->write($resized);
+ $file->close();
+ $files[] = $file;
+ } else {
+ // cleanup on fail
+ foreach ($files as $file) {
+ $file->delete();
+ }
+
+ register_error(elgg_echo('avatar:resize:fail'));
+ forward(REFERER);
+ }
+}
+
+// reset crop coordinates
+$owner->x1 = 0;
+$owner->x2 = 0;
+$owner->y1 = 0;
+$owner->y2 = 0;
+
+$owner->icontime = time();
+if (elgg_trigger_event('profileiconupdate', $owner->type, $owner)) {
+ system_message(elgg_echo("avatar:upload:success"));
+
+ $view = 'river/user/default/profileiconupdate';
+ elgg_delete_river(array('subject_guid' => $owner->guid, 'view' => $view));
+ add_to_river($view, 'update', $owner->guid, $owner->guid);
+}
+
+forward(REFERER);
diff --git a/actions/comments/add.php b/actions/comments/add.php
new file mode 100644
index 000000000..5bd741413
--- /dev/null
+++ b/actions/comments/add.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Elgg add comment action
+ *
+ * @package Elgg.Core
+ * @subpackage Comments
+ */
+
+$entity_guid = (int) get_input('entity_guid');
+$comment_text = get_input('generic_comment');
+
+if (empty($comment_text)) {
+ register_error(elgg_echo("generic_comment:blank"));
+ forward(REFERER);
+}
+
+// Let's see if we can get an entity with the specified GUID
+$entity = get_entity($entity_guid);
+if (!$entity) {
+ register_error(elgg_echo("generic_comment:notfound"));
+ forward(REFERER);
+}
+
+$user = elgg_get_logged_in_user_entity();
+
+$annotation = create_annotation($entity->guid,
+ 'generic_comment',
+ $comment_text,
+ "",
+ $user->guid,
+ $entity->access_id);
+
+// tell user annotation posted
+if (!$annotation) {
+ register_error(elgg_echo("generic_comment:failure"));
+ forward(REFERER);
+}
+
+// notify if poster wasn't owner
+if ($entity->owner_guid != $user->guid) {
+
+ notify_user($entity->owner_guid,
+ $user->guid,
+ elgg_echo('generic_comment:email:subject'),
+ elgg_echo('generic_comment:email:body', array(
+ $entity->title,
+ $user->name,
+ $comment_text,
+ $entity->getURL(),
+ $user->name,
+ $user->getURL()
+ ))
+ );
+}
+
+system_message(elgg_echo("generic_comment:posted"));
+
+//add to river
+add_to_river('river/annotation/generic_comment/create', 'comment', $user->guid, $entity->guid, "", 0, $annotation);
+
+// Forward to the page the action occurred on
+forward(REFERER);
diff --git a/actions/comments/delete.php b/actions/comments/delete.php
new file mode 100644
index 000000000..c6b481da4
--- /dev/null
+++ b/actions/comments/delete.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Elgg delete comment action
+ *
+ * @package Elgg
+ */
+
+// Make sure we can get the comment in question
+$annotation_id = (int) get_input('annotation_id');
+$comment = elgg_get_annotation_from_id($annotation_id);
+if ($comment && $comment->canEdit()) {
+ $comment->delete();
+ system_message(elgg_echo("generic_comment:deleted"));
+} else {
+ register_error(elgg_echo("generic_comment:notdeleted"));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/entities/delete.php b/actions/entities/delete.php
new file mode 100644
index 000000000..251e1f01c
--- /dev/null
+++ b/actions/entities/delete.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Default entity delete action
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$guid = get_input('guid');
+$entity = get_entity($guid);
+
+if (($entity) && ($entity->canEdit())) {
+ if ($entity->delete()) {
+ system_message(elgg_echo('entity:delete:success', array($guid)));
+ } else {
+ register_error(elgg_echo('entity:delete:fail', array($guid)));
+ }
+} else {
+ register_error(elgg_echo('entity:delete:fail', array($guid)));
+}
+
+forward(REFERER);
diff --git a/actions/friends/add.php b/actions/friends/add.php
new file mode 100644
index 000000000..d1800ee14
--- /dev/null
+++ b/actions/friends/add.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Elgg add friend action
+ *
+ * @package Elgg.Core
+ * @subpackage Friends.Management
+ */
+
+// Get the GUID of the user to friend
+$friend_guid = get_input('friend');
+$friend = get_entity($friend_guid);
+if (!$friend) {
+ register_error(elgg_echo('error:missing_data'));
+ forward(REFERER);
+}
+
+$errors = false;
+
+// Get the user
+try {
+ if (!elgg_get_logged_in_user_entity()->addFriend($friend_guid)) {
+ $errors = true;
+ }
+} catch (Exception $e) {
+ register_error(elgg_echo("friends:add:failure", array($friend->name)));
+ $errors = true;
+}
+if (!$errors) {
+ // add to river
+ add_to_river('river/relationship/friend/create', 'friend', elgg_get_logged_in_user_guid(), $friend_guid);
+ system_message(elgg_echo("friends:add:successful", array($friend->name)));
+}
+
+// Forward back to the page you friended the user on
+forward(REFERER);
diff --git a/actions/friends/collections/add.php b/actions/friends/collections/add.php
new file mode 100644
index 000000000..e63a149f7
--- /dev/null
+++ b/actions/friends/collections/add.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Elgg collection add page
+ *
+ * @package Elgg.Core
+ * @subpackage Friends.Collections
+ */
+
+$collection_name = htmlspecialchars(get_input('collection_name', '', false), ENT_QUOTES, 'UTF-8');
+$friends = get_input('friends_collection');
+
+if (!$collection_name) {
+ register_error(elgg_echo("friends:nocollectionname"));
+ forward(REFERER);
+}
+
+$id = create_access_collection($collection_name);
+
+if ($id) {
+ $result = update_access_collection($id, $friends);
+ if ($result) {
+ system_message(elgg_echo("friends:collectionadded"));
+ forward("collections/" . elgg_get_logged_in_user_entity()->username);
+ } else {
+ register_error(elgg_echo("friends:nocollectionname"));
+ forward(REFERER);
+ }
+} else {
+ register_error(elgg_echo("friends:nocollectionname"));
+ forward(REFERER);
+} \ No newline at end of file
diff --git a/actions/friends/collections/delete.php b/actions/friends/collections/delete.php
new file mode 100644
index 000000000..ff8f1fb55
--- /dev/null
+++ b/actions/friends/collections/delete.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Elgg friends: delete collection action
+ *
+ * @package Elgg.Core
+ * @subpackage Friends.Collections
+ */
+
+$collection_id = (int) get_input('collection');
+
+// check the ACL exists and we can edit
+if (!can_edit_access_collection($collection_id)) {
+ register_error(elgg_echo("friends:collectiondeletefailed"));
+ forward(REFERER);
+}
+
+if (delete_access_collection($collection_id)) {
+ system_message(elgg_echo("friends:collectiondeleted"));
+} else {
+ register_error(elgg_echo("friends:collectiondeletefailed"));
+}
+
+forward(REFERER);
diff --git a/actions/friends/collections/edit.php b/actions/friends/collections/edit.php
new file mode 100644
index 000000000..9eb5e1eab
--- /dev/null
+++ b/actions/friends/collections/edit.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Friends collection edit action
+ *
+ * @package Elgg.Core
+ * @subpackage Friends.Collections
+ */
+
+$collection_id = get_input('collection_id');
+$friends = get_input('friend');
+
+// check it exists and we can edit
+if (!can_edit_access_collection($collection_id)) {
+ system_message(elgg_echo('friends:collection:edit_failed'));
+}
+
+if (update_access_collection($collection_id, $friends)) {
+ system_message(elgg_echo('friends:collections:edited'));
+} else {
+ system_message(elgg_echo('friends:collection:edit_failed'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/friends/remove.php b/actions/friends/remove.php
new file mode 100644
index 000000000..d69d18f31
--- /dev/null
+++ b/actions/friends/remove.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Elgg remove friend action
+ *
+ * @package Elgg.Core
+ * @subpackage Friends.Management
+ */
+
+// Get the GUID of the user to friend
+$friend_guid = get_input('friend');
+$friend = get_entity($friend_guid);
+$errors = false;
+
+// Get the user
+try{
+ if ($friend instanceof ElggUser) {
+ elgg_get_logged_in_user_entity()->removeFriend($friend_guid);
+ } else {
+ register_error(elgg_echo("friends:remove:failure", array($friend->name)));
+ $errors = true;
+ }
+} catch (Exception $e) {
+ register_error(elgg_echo("friends:remove:failure", array($friend->name)));
+ $errors = true;
+}
+
+if (!$errors) {
+ system_message(elgg_echo("friends:remove:successful", array($friend->name)));
+}
+
+// Forward back to the page you made the friend on
+forward(REFERER);
diff --git a/actions/import/opendd.php b/actions/import/opendd.php
new file mode 100644
index 000000000..e63607145
--- /dev/null
+++ b/actions/import/opendd.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Elgg OpenDD import action.
+ *
+ * This action accepts data to import (in OpenDD format) and performs and import. It accepts
+ * data as $data.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$data = get_input('data', '', false);
+
+$return = import($data);
+
+if ($return) {
+ system_message(elgg_echo('importsuccess'));
+} else {
+ register_error(elgg_echo('importfail'));
+}
+
+forward(REFERER);
diff --git a/actions/login.php b/actions/login.php
new file mode 100644
index 000000000..bd7f91299
--- /dev/null
+++ b/actions/login.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Elgg login action
+ *
+ * @package Elgg.Core
+ * @subpackage User.Authentication
+ */
+
+// set forward url
+if (!empty($_SESSION['last_forward_from'])) {
+ $forward_url = $_SESSION['last_forward_from'];
+} elseif (get_input('returntoreferer')) {
+ $forward_url = REFERER;
+} else {
+ // forward to main index page
+ $forward_url = '';
+}
+
+$username = get_input('username');
+$password = get_input('password', null, false);
+$persistent = (bool) get_input("persistent");
+$result = false;
+
+if (empty($username) || empty($password)) {
+ register_error(elgg_echo('login:empty'));
+ forward();
+}
+
+// check if logging in with email address
+if (strpos($username, '@') !== false && ($users = get_user_by_email($username))) {
+ $username = $users[0]->username;
+}
+
+$result = elgg_authenticate($username, $password);
+if ($result !== true) {
+ register_error($result);
+ forward(REFERER);
+}
+
+$user = get_user_by_username($username);
+if (!$user) {
+ register_error(elgg_echo('login:baduser'));
+ forward(REFERER);
+}
+
+try {
+ login($user, $persistent);
+ // re-register at least the core language file for users with language other than site default
+ register_translations(dirname(dirname(__FILE__)) . "/languages/");
+} catch (LoginException $e) {
+ register_error($e->getMessage());
+ forward(REFERER);
+}
+
+// elgg_echo() caches the language and does not provide a way to change the language.
+// @todo we need to use the config object to store this so that the current language
+// can be changed. Refs #4171
+if ($user->language) {
+ $message = elgg_echo('loginok', array(), $user->language);
+} else {
+ $message = elgg_echo('loginok');
+}
+
+if (isset($_SESSION['last_forward_from'])) {
+ unset($_SESSION['last_forward_from']);
+}
+
+system_message($message);
+forward($forward_url);
diff --git a/actions/logout.php b/actions/logout.php
new file mode 100644
index 000000000..c48a26b15
--- /dev/null
+++ b/actions/logout.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Elgg logout action
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+// Log out
+$result = logout();
+
+// Set the system_message as appropriate
+if ($result) {
+ system_message(elgg_echo('logoutok'));
+ forward();
+} else {
+ register_error(elgg_echo('logouterror'));
+} \ No newline at end of file
diff --git a/actions/notifications/settings/usersettings/save.php b/actions/notifications/settings/usersettings/save.php
new file mode 100644
index 000000000..455a444e1
--- /dev/null
+++ b/actions/notifications/settings/usersettings/save.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Elgg notifications user preference save acion.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$method = get_input('method');
+
+$current_settings = get_user_notification_settings();
+
+$result = false;
+foreach ($method as $k => $v) {
+ // check if setting has changed and skip if not
+ if ($current_settings->$k == ($v == 'yes')) {
+ continue;
+ }
+
+ $result = set_user_notification_setting(elgg_get_logged_in_user_guid(), $k, ($v == 'yes') ? true : false);
+
+ if (!$result) {
+ register_error(elgg_echo('notifications:usersettings:save:fail'));
+ }
+}
+
+if ($result) {
+ system_message(elgg_echo('notifications:usersettings:save:ok'));
+}
diff --git a/actions/plugins/settings/save.php b/actions/plugins/settings/save.php
new file mode 100644
index 000000000..581a2f9ec
--- /dev/null
+++ b/actions/plugins/settings/save.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Saves global plugin settings.
+ *
+ * This action can be overriden for a specific plugin by creating the
+ * <plugin_id>/settings/save action in that plugin.
+ *
+ * @uses array $_REQUEST['params'] A set of key/value pairs to save to the ElggPlugin entity
+ * @uses int $_REQUEST['plugin_id'] The ID of the plugin
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins.Settings
+ */
+
+$params = get_input('params');
+$plugin_id = get_input('plugin_id');
+$plugin = elgg_get_plugin_from_id($plugin_id);
+
+if (!($plugin instanceof ElggPlugin)) {
+ register_error(elgg_echo('plugins:settings:save:fail', array($plugin_id)));
+ forward(REFERER);
+}
+
+$plugin_name = $plugin->getManifest()->getName();
+
+$result = false;
+
+// allow a plugin to override the save action for their settings
+if (elgg_action_exists("$plugin_id/settings/save")) {
+ action("$plugin_id/settings/save");
+} else {
+ foreach ($params as $k => $v) {
+ $result = $plugin->setSetting($k, $v);
+ if (!$result) {
+ register_error(elgg_echo('plugins:settings:save:fail', array($plugin_name)));
+ forward(REFERER);
+ exit;
+ }
+ }
+}
+
+system_message(elgg_echo('plugins:settings:save:ok', array($plugin_name)));
+forward(REFERER); \ No newline at end of file
diff --git a/actions/plugins/usersettings/save.php b/actions/plugins/usersettings/save.php
new file mode 100644
index 000000000..f6b8ab0b6
--- /dev/null
+++ b/actions/plugins/usersettings/save.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Saves user-specific plugin settings.
+ *
+ * This action can be overriden for a specific plugin by creating the
+ * <plugin_id>/usersettings/save action in that plugin.
+ *
+ * @uses array $_REQUEST['params'] A set of key/value pairs to save to the ElggPlugin entity
+ * @uses int $_REQUEST['plugin_id'] The id of the plugin
+ * @uses int $_REQUEST['user_guid'] The GUID of the user to save settings for.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins.Settings
+ */
+
+$params = get_input('params');
+$plugin_id = get_input('plugin_id');
+$user_guid = get_input('user_guid', elgg_get_logged_in_user_guid());
+$plugin = elgg_get_plugin_from_id($plugin_id);
+$user = get_entity($user_guid);
+
+if (!($plugin instanceof ElggPlugin)) {
+ register_error(elgg_echo('plugins:usersettings:save:fail', array($plugin_id)));
+ forward(REFERER);
+}
+
+if (!($user instanceof ElggUser)) {
+ register_error(elgg_echo('plugins:usersettings:save:fail', array($plugin_id)));
+ forward(REFERER);
+}
+
+$plugin_name = $plugin->getManifest()->getName();
+
+// make sure we're admin or the user
+if (!$user->canEdit()) {
+ register_error(elgg_echo('plugins:usersettings:save:fail', array($plugin_name)));
+ forward(REFERER);
+}
+
+$result = false;
+
+if (elgg_action_exists("$plugin_id/usersettings/save")) {
+ action("$plugin_id/usersettings/save");
+} else {
+ foreach ($params as $k => $v) {
+ // Save
+ $result = $plugin->setUserSetting($k, $v, $user->guid);
+
+ // Error?
+ if (!$result) {
+ register_error(elgg_echo('plugins:usersettings:save:fail', array($plugin_name)));
+ forward(REFERER);
+ }
+ }
+}
+
+system_message(elgg_echo('plugins:usersettings:save:ok', array($plugin_name)));
+forward(REFERER);
diff --git a/actions/profile/edit.php b/actions/profile/edit.php
new file mode 100644
index 000000000..e1f066e82
--- /dev/null
+++ b/actions/profile/edit.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Elgg profile edit action
+ *
+ */
+
+elgg_make_sticky_form('profile:edit');
+
+$guid = get_input('guid');
+$owner = get_entity($guid);
+
+if (!$owner || !($owner instanceof ElggUser) || !$owner->canEdit()) {
+ register_error(elgg_echo('profile:edit:fail'));
+ forward(REFERER);
+}
+
+// grab the defined profile field names and their load the values from POST.
+// each field can have its own access, so sort that too.
+$input = array();
+$accesslevel = get_input('accesslevel');
+
+if (!is_array($accesslevel)) {
+ $accesslevel = array();
+}
+
+/**
+ * wrapper for recursive array walk decoding
+ */
+function profile_array_decoder(&$v) {
+ $v = _elgg_html_decode($v);
+}
+
+$profile_fields = elgg_get_config('profile_fields');
+foreach ($profile_fields as $shortname => $valuetype) {
+ // the decoding is a stop gap to prevent &amp;&amp; showing up in profile fields
+ // because it is escaped on both input (get_input()) and output (view:output/text). see #561 and #1405.
+ // must decode in utf8 or string corruption occurs. see #1567.
+ $value = get_input($shortname);
+ if (is_array($value)) {
+ array_walk_recursive($value, 'profile_array_decoder');
+ } else {
+ $value = _elgg_html_decode($value);
+ }
+
+ // limit to reasonable sizes
+ // @todo - throwing away changes due to this is dumb!
+ if (!is_array($value) && $valuetype != 'longtext' && elgg_strlen($value) > 250) {
+ $error = elgg_echo('profile:field_too_long', array(elgg_echo("profile:{$shortname}")));
+ register_error($error);
+ forward(REFERER);
+ }
+
+ if ($value && $valuetype == 'url' && !preg_match('~^https?\://~i', $value)) {
+ $value = "http://$value";
+ }
+
+ if ($valuetype == 'tags') {
+ $value = string_to_tag_array($value);
+ }
+
+ $input[$shortname] = $value;
+}
+
+// display name is handled separately
+$name = strip_tags(get_input('name'));
+if ($name) {
+ if (elgg_strlen($name) > 50) {
+ register_error(elgg_echo('user:name:fail'));
+ } elseif ($owner->name != $name) {
+ $owner->name = $name;
+ $owner->save();
+ }
+}
+
+// go through custom fields
+if (sizeof($input) > 0) {
+ foreach ($input as $shortname => $value) {
+ $options = array(
+ 'guid' => $owner->guid,
+ 'metadata_name' => $shortname,
+ 'limit' => false
+ );
+ elgg_delete_metadata($options);
+
+ if (!is_null($value) && ($value !== '')) {
+ // only create metadata for non empty values (0 is allowed) to prevent metadata records with empty string values #4858
+
+ if (isset($accesslevel[$shortname])) {
+ $access_id = (int) $accesslevel[$shortname];
+ } else {
+ // this should never be executed since the access level should always be set
+ $access_id = ACCESS_DEFAULT;
+ }
+ if (is_array($value)) {
+ $i = 0;
+ foreach ($value as $interval) {
+ $i++;
+ $multiple = ($i > 1) ? TRUE : FALSE;
+ create_metadata($owner->guid, $shortname, $interval, 'text', $owner->guid, $access_id, $multiple);
+ }
+ } else {
+ create_metadata($owner->getGUID(), $shortname, $value, 'text', $owner->getGUID(), $access_id);
+ }
+ }
+ }
+
+ $owner->save();
+
+ // Notify of profile update
+ elgg_trigger_event('profileupdate', $owner->type, $owner);
+
+ elgg_clear_sticky_form('profile:edit');
+ system_message(elgg_echo("profile:saved"));
+}
+
+forward($owner->getUrl());
diff --git a/actions/profile/fields/add.php b/actions/profile/fields/add.php
new file mode 100644
index 000000000..fce783092
--- /dev/null
+++ b/actions/profile/fields/add.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Elgg profile plugin edit default profile action
+ *
+ */
+
+$label = get_input('label');
+$type = get_input('type');
+
+$fieldlist = elgg_get_config('profile_custom_fields');
+if (!$fieldlist) {
+ $fieldlist = '';
+ $id = 1;
+} else {
+ $fieldlistarray = explode(',', $fieldlist);
+ foreach ($fieldlistarray as $key => $value) {
+ $fieldlistarray[$key] = (int)$value;
+ }
+ $id = max($fieldlistarray) + 1;
+}
+
+if (($label) && ($type)) {
+ if (!empty($fieldlist)) {
+ $fieldlist .= ',';
+ }
+ $fieldlist .= "$id";
+
+ if (elgg_save_config("admin_defined_profile_$id", $label) &&
+ elgg_save_config("admin_defined_profile_type_$id", $type) &&
+ elgg_save_config('profile_custom_fields', $fieldlist)) {
+
+ system_message(elgg_echo('profile:editdefault:success'));
+ } else {
+ register_error(elgg_echo('profile:editdefault:fail'));
+ }
+} else {
+ register_error(elgg_echo('profile:editdefault:fail'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/profile/fields/delete.php b/actions/profile/fields/delete.php
new file mode 100644
index 000000000..9879feb3f
--- /dev/null
+++ b/actions/profile/fields/delete.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Elgg profile plugin edit default profile action removal
+ *
+ */
+
+$id = get_input('id');
+
+$fieldlist = elgg_get_config('profile_custom_fields');
+if (!$fieldlist) {
+ $fieldlist = '';
+}
+
+$fieldlist = str_replace("{$id},", "", $fieldlist);
+$fieldlist = str_replace(",{$id}", "", $fieldlist);
+$fieldlist = str_replace("{$id}", "", $fieldlist);
+
+if ($id &&
+ unset_config("admin_defined_profile_$id") &&
+ unset_config("admin_defined_profile_type_$id") &&
+ elgg_save_config('profile_custom_fields', $fieldlist)) {
+
+ system_message(elgg_echo('profile:editdefault:delete:success'));
+} else {
+ register_error(elgg_echo('profile:editdefault:delete:fail'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/profile/fields/edit.php b/actions/profile/fields/edit.php
new file mode 100644
index 000000000..5fc84ff11
--- /dev/null
+++ b/actions/profile/fields/edit.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Edit a custom profile field
+ */
+
+$id = get_input('id');
+$label = get_input('label');
+
+if (!elgg_get_config("admin_defined_profile_$id")) {
+ register_error(elgg_echo('profile:editdefault:fail'));
+ forward(REFERER);
+}
+
+if (elgg_save_config("admin_defined_profile_$id", $label)) {
+ system_message(elgg_echo('profile:editdefault:success'));
+} else {
+ register_error(elgg_echo('profile:editdefault:fail'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/profile/fields/reorder.php b/actions/profile/fields/reorder.php
new file mode 100644
index 000000000..27c716749
--- /dev/null
+++ b/actions/profile/fields/reorder.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg profile plugin reorder fields
+ *
+ */
+
+$ordering = get_input('fieldorder');
+
+$result = elgg_save_config('profile_custom_fields', $ordering);
+
+// called by ajax so we exit
+exit;
diff --git a/actions/profile/fields/reset.php b/actions/profile/fields/reset.php
new file mode 100644
index 000000000..19efae479
--- /dev/null
+++ b/actions/profile/fields/reset.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Reset profile fields action
+ *
+ */
+
+$fieldlist = elgg_get_config('profile_custom_fields');
+if ($fieldlist) {
+ $fieldlistarray = explode(',', $fieldlist);
+ foreach ($fieldlistarray as $listitem) {
+ unset_config("admin_defined_profile_{$listitem}");
+ unset_config("admin_defined_profile_type_{$listitem}");
+ }
+}
+
+unset_config('profile_custom_fields');
+
+system_message(elgg_echo('profile:defaultprofile:reset'));
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/register.php b/actions/register.php
new file mode 100644
index 000000000..73926232c
--- /dev/null
+++ b/actions/register.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Elgg registration action
+ *
+ * @package Elgg.Core
+ * @subpackage User.Account
+ */
+
+elgg_make_sticky_form('register');
+
+// Get variables
+$username = get_input('username');
+$password = get_input('password', null, false);
+$password2 = get_input('password2', null, false);
+$email = get_input('email');
+$name = get_input('name');
+$friend_guid = (int) get_input('friend_guid', 0);
+$invitecode = get_input('invitecode');
+
+if (elgg_get_config('allow_registration')) {
+ try {
+ if (trim($password) == "" || trim($password2) == "") {
+ throw new RegistrationException(elgg_echo('RegistrationException:EmptyPassword'));
+ }
+
+ if (strcmp($password, $password2) != 0) {
+ throw new RegistrationException(elgg_echo('RegistrationException:PasswordMismatch'));
+ }
+
+ $guid = register_user($username, $password, $name, $email, false, $friend_guid, $invitecode);
+
+ if ($guid) {
+ $new_user = get_entity($guid);
+
+ // allow plugins to respond to self registration
+ // note: To catch all new users, even those created by an admin,
+ // register for the create, user event instead.
+ // only passing vars that aren't in ElggUser.
+ $params = array(
+ 'user' => $new_user,
+ 'password' => $password,
+ 'friend_guid' => $friend_guid,
+ 'invitecode' => $invitecode
+ );
+
+ // @todo should registration be allowed no matter what the plugins return?
+ if (!elgg_trigger_plugin_hook('register', 'user', $params, TRUE)) {
+ $ia = elgg_set_ignore_access(true);
+ $new_user->delete();
+ elgg_set_ignore_access($ia);
+ // @todo this is a generic messages. We could have plugins
+ // throw a RegistrationException, but that is very odd
+ // for the plugin hooks system.
+ throw new RegistrationException(elgg_echo('registerbad'));
+ }
+
+ elgg_clear_sticky_form('register');
+ system_message(elgg_echo("registerok", array(elgg_get_site_entity()->name)));
+
+ // if exception thrown, this probably means there is a validation
+ // plugin that has disabled the user
+ try {
+ login($new_user);
+ } catch (LoginException $e) {
+ // do nothing
+ }
+
+ // Forward on success, assume everything else is an error...
+ forward();
+ } else {
+ register_error(elgg_echo("registerbad"));
+ }
+ } catch (RegistrationException $r) {
+ register_error($r->getMessage());
+ }
+} else {
+ register_error(elgg_echo('registerdisabled'));
+}
+
+forward(REFERER);
diff --git a/actions/river/delete.php b/actions/river/delete.php
new file mode 100644
index 000000000..0d8297932
--- /dev/null
+++ b/actions/river/delete.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * River item delete action
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$id = get_input('id', false);
+
+if ($id !== false && elgg_is_admin_logged_in()) {
+ if (elgg_delete_river(array('id' => $id))) {
+ system_message(elgg_echo('river:delete:success'));
+ } else {
+ register_error(elgg_echo('river:delete:fail'));
+ }
+} else {
+ register_error(elgg_echo('river:delete:fail'));
+}
+
+forward(REFERER);
diff --git a/actions/security/refreshtoken.php b/actions/security/refreshtoken.php
new file mode 100644
index 000000000..74a72c4af
--- /dev/null
+++ b/actions/security/refreshtoken.php
@@ -0,0 +1,5 @@
+<?php
+$ts = time();
+$token = generate_action_token($ts);
+
+echo json_encode(array('__elgg_ts' => $ts, '__elgg_token' => $token)); \ No newline at end of file
diff --git a/actions/user/passwordreset.php b/actions/user/passwordreset.php
new file mode 100644
index 000000000..201d6abcf
--- /dev/null
+++ b/actions/user/passwordreset.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Action to reset a password and send success email.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$user_guid = get_input('u');
+$code = get_input('c');
+
+if (execute_new_password_request($user_guid, $code)) {
+ system_message(elgg_echo('user:password:success'));
+} else {
+ register_error(elgg_echo('user:password:fail'));
+}
+
+forward();
+exit;
diff --git a/actions/user/requestnewpassword.php b/actions/user/requestnewpassword.php
new file mode 100644
index 000000000..f1d4fa43c
--- /dev/null
+++ b/actions/user/requestnewpassword.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Action to request a new password.
+ *
+ * @package Elgg.Core
+ * @subpackage User.Account
+ */
+
+$username = get_input('username');
+
+// allow email addresses
+if (strpos($username, '@') !== false && ($users = get_user_by_email($username))) {
+ $username = $users[0]->username;
+}
+
+$user = get_user_by_username($username);
+if ($user) {
+ if (send_new_password_request($user->guid)) {
+ system_message(elgg_echo('user:password:resetreq:success'));
+ } else {
+ register_error(elgg_echo('user:password:resetreq:fail'));
+ }
+} else {
+ register_error(elgg_echo('user:username:notfound', array($username)));
+}
+
+forward();
diff --git a/actions/user/spotlight.php b/actions/user/spotlight.php
new file mode 100644
index 000000000..202dde387
--- /dev/null
+++ b/actions/user/spotlight.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Close or open spotlight.
+ *
+ * @package Elgg.Core
+ * @subpackage Spotlight
+ * @todo This is deprecated in 1.8
+ */
+
+$closed = get_input('closed', 'true');
+if ($closed != 'true') {
+ $closed = false;
+} else {
+ $closed = true;
+}
+
+elgg_get_logged_in_user_entity()->spotlightclosed = $closed;
+// exit as this action is called through Ajax
+exit; \ No newline at end of file
diff --git a/actions/useradd.php b/actions/useradd.php
new file mode 100644
index 000000000..17459021b
--- /dev/null
+++ b/actions/useradd.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Elgg add action
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+elgg_make_sticky_form('useradd');
+
+// Get variables
+$username = get_input('username');
+$password = get_input('password', null, false);
+$password2 = get_input('password2', null, false);
+$email = get_input('email');
+$name = get_input('name');
+
+$admin = get_input('admin');
+if (is_array($admin)) {
+ $admin = $admin[0];
+}
+
+// no blank fields
+if ($username == '' || $password == '' || $password2 == '' || $email == '' || $name == '') {
+ register_error(elgg_echo('register:fields'));
+ forward(REFERER);
+}
+
+if (strcmp($password, $password2) != 0) {
+ register_error(elgg_echo('RegistrationException:PasswordMismatch'));
+ forward(REFERER);
+}
+
+// For now, just try and register the user
+try {
+ $guid = register_user($username, $password, $name, $email, TRUE);
+
+ if ($guid) {
+ $new_user = get_entity($guid);
+ if ($new_user && $admin && elgg_is_admin_logged_in()) {
+ $new_user->makeAdmin();
+ }
+
+ elgg_clear_sticky_form('useradd');
+
+ $new_user->admin_created = TRUE;
+ // @todo ugh, saving a guid as metadata!
+ $new_user->created_by_guid = elgg_get_logged_in_user_guid();
+
+ $subject = elgg_echo('useradd:subject');
+ $body = elgg_echo('useradd:body', array(
+ $name,
+ elgg_get_site_entity()->name,
+ elgg_get_site_entity()->url,
+ $username,
+ $password,
+ ));
+
+ notify_user($new_user->guid, elgg_get_site_entity()->guid, $subject, $body);
+
+ system_message(elgg_echo("adduser:ok", array(elgg_get_site_entity()->name)));
+ } else {
+ register_error(elgg_echo("adduser:bad"));
+ }
+} catch (RegistrationException $r) {
+ register_error($r->getMessage());
+}
+
+forward(REFERER);
diff --git a/actions/usersettings/save.php b/actions/usersettings/save.php
new file mode 100644
index 000000000..eb6cdbd5d
--- /dev/null
+++ b/actions/usersettings/save.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Aggregate action for saving settings
+ *
+ * @package Elgg.Core
+ * @subpackage UserSettings
+ */
+
+elgg_trigger_plugin_hook('usersettings:save', 'user');
+
+forward(REFERER);
diff --git a/actions/widgets/add.php b/actions/widgets/add.php
new file mode 100644
index 000000000..d7b2f291c
--- /dev/null
+++ b/actions/widgets/add.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Elgg widget add action
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ */
+
+$owner_guid = get_input('owner_guid');
+$handler = get_input('handler');
+$context = get_input('context');
+$show_access = (bool)get_input('show_access', true);
+$column = get_input('column', 1);
+$default_widgets = get_input('default_widgets', 0);
+
+elgg_push_context($context);
+if ($default_widgets) {
+ elgg_push_context('default_widgets');
+}
+elgg_push_context('widgets');
+
+if (!empty($owner_guid)) {
+ $owner = get_entity($owner_guid);
+ if ($owner && $owner->canEdit()) {
+ $guid = elgg_create_widget($owner->getGUID(), $handler, $context);
+ if ($guid) {
+ $widget = get_entity($guid);
+
+ // position the widget
+ $widget->move($column, 0);
+
+ // send widget html for insertion
+ echo elgg_view_entity($widget, array('show_access' => $show_access));
+
+ //system_message(elgg_echo('widgets:add:success'));
+ forward(REFERER);
+ }
+ }
+}
+
+register_error(elgg_echo('widgets:add:failure'));
+forward(REFERER);
diff --git a/actions/widgets/delete.php b/actions/widgets/delete.php
new file mode 100644
index 000000000..47920013d
--- /dev/null
+++ b/actions/widgets/delete.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Elgg widget delete action
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ */
+
+$widget_guid = get_input('widget_guid');
+$owner_guid = get_input('owner_guid', elgg_get_logged_in_user_guid());
+
+$widget = get_entity($widget_guid);
+$owner = get_entity($owner_guid);
+
+if ($widget && $owner->canEdit() && $widget->delete()) {
+ forward(REFERER);
+}
+
+register_error(elgg_echo('widgets:remove:failure'));
+forward(REFERER);
diff --git a/actions/widgets/move.php b/actions/widgets/move.php
new file mode 100644
index 000000000..eab650c9c
--- /dev/null
+++ b/actions/widgets/move.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Elgg widget move action
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ */
+
+$widget_guid = get_input('widget_guid');
+$column = get_input('column', 1);
+$position = get_input('position');
+$owner_guid = get_input('owner_guid', elgg_get_logged_in_user_guid());
+
+$widget = get_entity($widget_guid);
+$owner = get_entity($owner_guid);
+
+
+if ($widget && $owner->canEdit()) {
+ $widget->move($column, $position);
+ forward(REFERER);
+}
+
+register_error(elgg_echo('widgets:move:failure'));
+forward(REFERER); \ No newline at end of file
diff --git a/actions/widgets/reorder.php b/actions/widgets/reorder.php
new file mode 100644
index 000000000..e43a0ba73
--- /dev/null
+++ b/actions/widgets/reorder.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Elgg widget reorder action
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ */
+
+$owner = get_input('owner');
+$context = get_input('context');
+
+$maincontent = get_input('debugField1');
+$sidebar = get_input('debugField2');
+$rightbar = get_input('debugField3');
+
+$result = reorder_widgets_from_panel($maincontent, $sidebar, $rightbar, $context, $owner);
+
+if ($result) {
+ system_message(elgg_echo('widgets:panel:save:success'));
+} else {
+ register_error(elgg_echo('widgets:panel:save:failure'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/widgets/save.php b/actions/widgets/save.php
new file mode 100644
index 000000000..e15deab77
--- /dev/null
+++ b/actions/widgets/save.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Elgg save widget settings action
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ *
+ * @uses int $_REQUEST['guid'] The guid of the widget to save
+ * @uses array $_REQUEST['params'] An array of params to set on the widget.
+ * @uses int $_REQUEST['default_widgets'] Flag for if these settings are for default wigets.
+ * @uses string $_REQUEST['context'] An optional context of the widget. Used to return
+ * the correct output if widget content changes
+ * depending on context.
+ *
+ */
+
+elgg_set_context('widgets');
+
+$guid = get_input('guid');
+$params = get_input('params');
+$default_widgets = get_input('default_widgets', 0);
+$context = get_input('context');
+
+$widget = get_entity($guid);
+if ($widget && $widget->saveSettings($params)) {
+ elgg_set_page_owner_guid($widget->getContainerGUID());
+ if ($context) {
+ elgg_push_context($context);
+ }
+
+ if (!$default_widgets) {
+ if (elgg_view_exists("widgets/$widget->handler/content")) {
+ $view = "widgets/$widget->handler/content";
+ } else {
+ elgg_deprecated_notice("widgets use content as the display view", 1.8);
+ $view = "widgets/$widget->handler/view";
+ }
+ echo elgg_view($view, array('entity' => $widget));
+ }
+} else {
+ register_error(elgg_echo('widgets:save:failure'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/actions/widgets/upgrade.php b/actions/widgets/upgrade.php
new file mode 100644
index 000000000..0a5cf8d48
--- /dev/null
+++ b/actions/widgets/upgrade.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Upgrade default widgets for Elgg 1.8
+ *
+ * Pre-1.8, default widgets were stored as metadata on a defaultwidgets object.
+ * Now they are stored as widget objects owned by the site.
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets.Management
+ */
+
+$object = elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => 'moddefaultwidgets',
+ 'limit' => 1,
+));
+
+if (!$object) {
+ forward(REFERER);
+}
+
+$object = $object[0];
+
+$site = elgg_get_site_entity();
+
+$ia = elgg_set_ignore_access(true);
+foreach (array('profile', 'dashboard') as $context) {
+ if (isset($object->$context)) {
+ elgg_push_context($context);
+ elgg_push_context('default_widgets');
+ elgg_push_context('widgets');
+
+ // deserialize the widget information
+ list($left, $middle, $right) = split('%%', $object->$context);
+ $left_widgets = split('::', $left);
+ $middle_widgets = split('::', $middle);
+ $right_widgets = split('::', $right);
+
+ // 1st column is right column in default theme
+ $widgets = array(
+ 1 => array_reverse($right_widgets),
+ 2 => array_reverse($middle_widgets),
+ 3 => array_reverse($left_widgets),
+ );
+
+ foreach ($widgets as $column => $column_widgets) {
+ foreach ($column_widgets as $handler) {
+ $guid = elgg_create_widget($site->getGUID(), $handler, $context);
+ if ($guid) {
+ $widget = get_entity($guid);
+ $widget->move($column, 0);
+ }
+ }
+ }
+
+ elgg_pop_context();
+ elgg_pop_context();
+ elgg_pop_context();
+ }
+}
+elgg_set_ignore_access($ia);
+
+$object->delete();
+system_message(elgg_echo('upgrade:core'));
+forward(REFERER);
diff --git a/documentation/coding_standards/best_practices.txt b/documentation/coding_standards/best_practices.txt
new file mode 100644
index 000000000..df04aa845
--- /dev/null
+++ b/documentation/coding_standards/best_practices.txt
@@ -0,0 +1,60 @@
+*** CODING BEST PRACTICES ***
+
+The following best practices make code easier to read, easier to maintain,
+and easier to debug. Consistent use of these guidelines means less guess
+work for developers, which means happier, more productive developers.
+
+* Adhere to "Don't Repeat Yourself" (DRY) principles of code design and
+ organization. If you are copy-and-pasting code YOU ARE DOING SOMETHING WRONG.
+ If you find a block of code that you want to use multiple times, make a
+ function. If you find views that are identical except for a single value,
+ pull it out into a generic view that takes an option.
+
+* Whitespace is free. Don't be afraid to use it to separate blocks of code.
+ Use a single space to separate function params and string concatenation.
+
+* Use self-documenting variable names. $group_guids is better than $array.
+
+* Use "positive" variable names. Prefer `$enable = true` to `$disable = false`.
+
+* Functions returning an array should return an empty array instead of FALSE
+ on no results.
+
+* Functions not throwing an exception on error should return FALSE upon
+ failure.
+
+* Functions returning only boolean should be prefaced with is_ or has_ (eg,
+ elgg_is_logged_in(), elgg_has_access_to_entity()).
+
+* Ternary syntax is acceptable for single-line, non-embedded statements.
+
+* Use comments effectively. Good comments describe the "why." Good code
+ describes the "how." Ex:
+ Not a very useful comment:
+
+ // increment $i only when the entity is marked as active.
+ foreach($entities as $entity) {
+ if ($entity->active == TRUE) {
+ $i++;
+ }
+ }
+
+ Useful comment:
+
+ // find the next index for inserting a new active entity.
+ foreach($entities as $entity) {
+ if ($entity->active == TRUE) {
+ $i++;
+ }
+ }
+
+* Use commit messages effectively. Be concise and meaningful. Ex:
+ Not meaningful:
+ Small fix to groups.
+
+ Meaningful:
+ Fixes #1234: Added missing ) that caused a WSOD on group profile page
+ when logged out.
+
+* Commit effectively: Err on the side of atomic commits. One revision with
+ many changes is scary.
diff --git a/documentation/coding_standards/css_coding_standards.txt b/documentation/coding_standards/css_coding_standards.txt
new file mode 100644
index 000000000..195ca345b
--- /dev/null
+++ b/documentation/coding_standards/css_coding_standards.txt
@@ -0,0 +1,67 @@
+*** CSS CODING STANDARDS ***
+
+* Use shorthand where possible:
+ Bad:
+ background-color: #333333;
+ background-image: url(...);
+ background-repeat: repeat-x;
+ background-position: left 10px;
+ padding: 2px 9px 2px 9px;
+
+ Good:
+ background: #333 url(...) repeat-x left 10px;
+ padding: 2px 9px;
+
+* Use hyphens as separators in classes/ids, not underscores:
+ Bad:
+ .example_class
+
+ Good:
+ .example-class
+
+* One property per line
+ Bad:
+ color: white;font-size: smaller;
+
+ Good:
+ color: white;
+ font-size: smaller;
+
+* Property declarations should be spaced like so: `property: value;`
+ Bad:
+ color:value;
+ color :value;
+ color : value;
+
+ Good:
+ color: value;
+
+* Group vendor-prefixes for the same property together:
+* Longest vendor-prefixed version first:
+* Always include non-vendor-prefixed version:
+* Put an extra newline between vendor-prefixed groups and other properties:
+ Bad:
+ -moz-border-radius: 5px;
+ border: 1px solid #999999;
+ -webkit-border-radius: 5px;
+ width: auto;
+
+ Good:
+ border: 1px solid #999999;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ width: auto;
+
+* Group declarations of subproperties:
+ Bad:
+ background-color: white;
+ color: #0054A7;
+ background-position: 2px -257px;
+
+ Good:
+ background-color: white;
+ background-position: 2px -257px;
+ color: #0054A7;
diff --git a/documentation/coding_standards/deprecation.txt b/documentation/coding_standards/deprecation.txt
new file mode 100644
index 000000000..370090138
--- /dev/null
+++ b/documentation/coding_standards/deprecation.txt
@@ -0,0 +1,36 @@
+*** DEPRECATING APIs ***
+
+Occasionally, functions and classes must be deprecated in favor of newer
+replacements. Since 3rd party plugin authors rely on a consistent API,
+backward compatibility must be maintained, but will not be maintained
+indefinitely as plugin authors are expected to properly update their
+plugins. In order to maintain backward compatibility, deprecated APIs will
+follow these guidelines:
+
+* Incompatible API changes cannot occur between bugfix versions
+ (1.6.0 - 1.6.1).
+
+* API changes between minor versions (1.6 - 1.7) must maintain backward
+ compatibility for at least 2 minor versions. (1.7 and 1.8. See
+ procedures, below.)
+
+* Bugfixes that change the API cannot be included in bugfix versions.
+
+* API changes between major versions (1.0 - 2.0) can occur without regard to
+ backward compatibility.
+
+The procedure for deprecating an API is as follows:
+
+* The first minor version (1.7) with a deprecated API must include a wrapper
+ function/class (or otherwise appropriate means) to maintain backward
+ compatibility, including any bugs in the original function/class.
+ This compatibility layer uses elgg_deprecated_notice('...', 1.7) to log
+ that the function is deprecated.
+
+* The second minor version (1.8) maintains the backward compatibility
+ layer, but elgg_deprecated_notice() will produce a visible warning.
+
+* The third minor version (1.9) removes the compatibility layer. Any use of
+ the deprecated API should be corrected before this.
+
+The general timeline for two minor releases is 8 to 12 months.
diff --git a/documentation/coding_standards/html_best_practices.txt b/documentation/coding_standards/html_best_practices.txt
new file mode 100644
index 000000000..ac2338a77
--- /dev/null
+++ b/documentation/coding_standards/html_best_practices.txt
@@ -0,0 +1 @@
+*** HTML BEST PRACTICES ***
diff --git a/documentation/coding_standards/javascript_best_practices.txt b/documentation/coding_standards/javascript_best_practices.txt
new file mode 100644
index 000000000..9ec1d0a19
--- /dev/null
+++ b/documentation/coding_standards/javascript_best_practices.txt
@@ -0,0 +1 @@
+*** JAVASCRIPT BEST PRACTICES ***
diff --git a/documentation/coding_standards/javascript_coding_standards.txt b/documentation/coding_standards/javascript_coding_standards.txt
new file mode 100644
index 000000000..9939e80ab
--- /dev/null
+++ b/documentation/coding_standards/javascript_coding_standards.txt
@@ -0,0 +1,13 @@
+*** JAVASCRIPT CODING STANDARDS ***
+
+* Same formatting standards as PHP.
+
+* All functions should be in the elgg namespace.
+
+* Function expressions should end with a semi-colon:
+
+ elgg.ui.toggles = function(event) {
+ event.preventDefault();
+ $(target).slideToggle('medium');
+ };
+
diff --git a/documentation/coding_standards/php_best_practices.txt b/documentation/coding_standards/php_best_practices.txt
new file mode 100644
index 000000000..9e4c63483
--- /dev/null
+++ b/documentation/coding_standards/php_best_practices.txt
@@ -0,0 +1 @@
+*** PHP BEST PRACTICES ***
diff --git a/documentation/coding_standards/php_coding_standards.txt b/documentation/coding_standards/php_coding_standards.txt
new file mode 100644
index 000000000..b7adc5dd9
--- /dev/null
+++ b/documentation/coding_standards/php_coding_standards.txt
@@ -0,0 +1,55 @@
+*** PHP CODING STANDARDS ***
+
+These are the coding standards for Elgg. All core development and bundled
+plugins are required to be in this format. Plugin developers are strongly
+encouraged to adopt these standards.
+
+* Unix line endings.
+
+* Hard tabs, 4 character tab spacing.
+
+* No PHP shortcut tags ( <? or <?= or <% ).
+
+* PHPDoc comments on functions and classes (all methods; declared properties
+ when appropriate).
+
+* Mandatory wrapped {}s around any code blocks.
+ Bad:
+ if (true)
+ foreach($arr as $elem)
+ echo $elem;
+
+ Good:
+ if (true) {
+ foreach ($arr as $elem) {
+ echo $elem;
+ }
+ }
+
+* Name standalone functions using underscore_character().
+
+* Name classes using CamelCase() and methods using lowerCamelCase().
+
+* Name globals and constants in ALL_CAPS (ACCESS_FRIENDS, $CONFIG).
+
+* Use underscores / camel case to separate standard English words in
+ functions, classes, and methods. (get_default_site(), ElggUser->isLoggedIn()).
+
+* Space functions like_this($required, $optional = TRUE).
+
+* Space keywords and constructs like this: if (FALSE) { ... }.
+
+* Correctly use spaces, quotes, and {}s in strings:
+ Bad (hard to read, misuse of quotes and {}s):
+ echo 'Hello, '.$name."! How is your {$time_of_day}?";
+
+ Good:
+ echo "Hello, $name! How is your $time_of_day?";
+
+* Line lengths should be reasonable. If you are writing lines over 100
+ characters on a line, please revise the code.
+
+* Use // or /* */ when commenting.
+
+* No closing PHP tag (?>) at EOF unless after a heredoc. (Avoids problems with
+ trailing whitespace. Required after heredoc by PHP.)
diff --git a/documentation/examples/actions/basic.php b/documentation/examples/actions/basic.php
new file mode 100644
index 000000000..926e11b79
--- /dev/null
+++ b/documentation/examples/actions/basic.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Demonstrates adding an annotation through an action
+ *
+ * This action adds a rating annotation to an entity. If this was coming from
+ * a five-star rating tool, the rating would be a number between 0 and 5. The
+ * GUID of the entity being rating is also submitted to the action.
+ */
+
+$rating = get_input('rating');
+$guid = get_input('guid');
+
+$entity = get_entity($guid);
+if (!$entity) {
+ register_error(elgg_echo('rating:failure'));
+ forward(REFERER);
+}
+
+$entity->annotate('rating', $rating);
+
+system_message(elgg_echo('rating:success'));
+forward(REFERER);
diff --git a/documentation/examples/crontab.example b/documentation/examples/crontab.example
new file mode 100644
index 000000000..f25f5cb07
--- /dev/null
+++ b/documentation/examples/crontab.example
@@ -0,0 +1,28 @@
+# Crontab example.
+#
+# This file is an example of triggering Elgg cron events. It hits a URL to
+# trigger the events. For testing, you can simulate the cronjob by loading the
+# URL in a browser.
+#
+# See http://docs.elgg.org/wiki/Cron for more information
+#
+# @author Marcus Povey
+
+# Location of GET (see: http://docs.elgg.org/wiki/What_is_get)
+GET='/usr/bin/GET'
+
+# Location of your site (don't forget the trailing slash!)
+ELGG='http://www.example.com/'
+
+# The crontab
+# Don't edit below this line unless you know what you are doing
+@reboot $GET ${ELGG}cron/reboot/
+* * * * * $GET ${ELGG}cron/minute/
+*/5 * * * * $GET ${ELGG}cron/fiveminute/
+15,30,45,59 * * * * $GET ${ELGG}cron/fifteenmin/
+30,59 * * * * $GET ${ELGG}cron/halfhour/
+@hourly $GET ${ELGG}cron/hourly/
+@daily $GET ${ELGG}cron/daily/
+@weekly $GET ${ELGG}cron/weekly/
+@monthly $GET ${ELGG}cron/monthly/
+@yearly $GET ${ELGG}cron/yearly/
diff --git a/documentation/examples/events/advanced.php b/documentation/examples/events/advanced.php
new file mode 100644
index 000000000..73edea9da
--- /dev/null
+++ b/documentation/examples/events/advanced.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * This snippets demonstrates how returning false changes the normal operation
+ * of Elgg.
+ */
+
+elgg_register_event_handler('create', 'object', 'example_event_handler');
+
+function example_event_handler($event, $type, $object) {
+ // Don't allow any non-admin users to create objects
+ // Returning false from this function will halt the creation of the object.
+ return elgg_is_admin_logged_in();
+}
diff --git a/documentation/examples/events/all.php b/documentation/examples/events/all.php
new file mode 100644
index 000000000..0ad02c1d4
--- /dev/null
+++ b/documentation/examples/events/all.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * If you register an 'all' string for the event name, the handler function will
+ * be called for all events with that name, regardless of event type. The same
+ * can be done for the event type argument. Registering 'all' for both
+ * argyuments results in a handler being called for every event.
+ */
+
+elgg_register_event_handler('all', 'object', 'example_event_handler');
+
+// This function will be called for any event of type 'object'
+function example_event_handler($event, $type, $object) {
+ // check what sort of object is passed
+ if ($object instanceof ElggObject) {
+ $subtype = $object->getSubtype();
+
+ switch ($subtype) {
+ case 'blog':
+ case 'thewire':
+ case 'pages':
+ // prevent these object subtypes from being saved or changed
+ return false;
+ default:
+ return true;
+ }
+
+ }
+
+ return true;
+}
diff --git a/documentation/examples/events/basic.php b/documentation/examples/events/basic.php
new file mode 100644
index 000000000..ca2762344
--- /dev/null
+++ b/documentation/examples/events/basic.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * This snippet demonstrates how to register for an event. It dumps the
+ * parameters that the handler receives to the screen. The third argument
+ * of the handler function is an object that is related to the event. For
+ * the 'init', 'system' eveny, it is null.
+ */
+
+elgg_register_event_handler('init', 'system', 'example_event_handler');
+
+function example_event_handler($event, $type, $object) {
+ var_dump($event);
+ var_dump($type);
+ var_dump($object);
+
+ return true;
+}
diff --git a/documentation/examples/events/trigger.php b/documentation/examples/events/trigger.php
new file mode 100644
index 000000000..6ce3a76f0
--- /dev/null
+++ b/documentation/examples/events/trigger.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * These two snippets demonstrates triggering an event and how to register for
+ * that event.
+ */
+
+$object = new ElggObject();
+elgg_trigger_event('test', 'example', $object);
+
+// elsewhere a handler could be registered by saying
+elgg_register_event_handler('test', 'example', 'example_event_handler');
diff --git a/documentation/examples/hooks/advanced.php b/documentation/examples/hooks/advanced.php
new file mode 100644
index 000000000..ca036c46a
--- /dev/null
+++ b/documentation/examples/hooks/advanced.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * This snippet demonstrates how to change the value of a hook. The content
+ * passed into the hook is 'This is some Sample Content.'. After the two hook
+ * handlers are done, the new content is 'This is some $@mple Content.'.
+ */
+
+// the output:page hook is triggered by elgg_view_page().
+elgg_register_plugin_hook_handler('output', 'page', 'example_plugin_hook_handler', 600);
+elgg_register_plugin_hook_handler('output', 'page', 'example_plugin_hook_handler_2', 601);
+
+function example_plugin_hook_handler($hook, $type, $value, $params) {
+ // change a to @
+ $value = str_replace('a', '@', $value);
+
+ return $value;
+}
+
+function example_plugin_hook_handler_2($hook, $type, $value, $params) {
+ // change S to $
+ $value = str_replace('S', '$', $value);
+
+ return $value;
+}
+
+$content = 'This is some Sample Content.';
+
+echo elgg_view_page('Title', $content);
diff --git a/documentation/examples/hooks/all.php b/documentation/examples/hooks/all.php
new file mode 100644
index 000000000..76b562335
--- /dev/null
+++ b/documentation/examples/hooks/all.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * This snippet demonstrates how to register for multiple hooks with the same
+ * type.
+ */
+
+elgg_register_plugin_hook_handler('all', 'system', 'example_plugin_hook_handler');
+
+// This function will be called for any hook of type 'system'
+function example_plugin_hook_handler($hook, $type, $value, $params) {
+ // logic here.
+}
diff --git a/documentation/examples/hooks/basic.php b/documentation/examples/hooks/basic.php
new file mode 100644
index 000000000..734d9e884
--- /dev/null
+++ b/documentation/examples/hooks/basic.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * The handler for a plugin hook receives information about the hook (name and
+ * type), the current value for the hook, and parameters related to the hook.
+ */
+
+elgg_register_plugin_hook_handler('forward', '404', 'example_plugin_hook_handler');
+
+function example_plugin_hook_handler($hook, $type, $value, $params) {
+ var_dump($hook);
+ var_dump($type);
+ var_dump($value);
+ var_dump($params);
+
+ // we are not changing $value so return null
+ return null;
+}
diff --git a/documentation/examples/hooks/trigger.php b/documentation/examples/hooks/trigger.php
new file mode 100644
index 000000000..4216fd6c0
--- /dev/null
+++ b/documentation/examples/hooks/trigger.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * The current value for the hook is passed into the trigger function. Handlers
+ * can change this value. In this snippet, we check if the value of true was
+ * changed by the handler functions.
+ */
+
+$result = elgg_trigger_plugin_hook('get_status', 'example', null, true);
+
+if ($result) {
+ var_dump('Plugin hook says ok!');
+} else {
+ var_dump('Plugin hook says no.');
+}
diff --git a/documentation/examples/plugins/README.txt b/documentation/examples/plugins/README.txt
new file mode 100644
index 000000000..704f56598
--- /dev/null
+++ b/documentation/examples/plugins/README.txt
@@ -0,0 +1,5 @@
+Plugin Skeleton
+=========================
+This directory includes a plugin skeleton to be used as the starting point when
+creating a new plugin. Just create a new directory in /mod/ and copy the files
+and directories into it. Then update the manifest and start coding. \ No newline at end of file
diff --git a/documentation/examples/plugins/actions/.gitignore b/documentation/examples/plugins/actions/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/documentation/examples/plugins/actions/.gitignore
diff --git a/documentation/examples/plugins/languages/en.php b/documentation/examples/plugins/languages/en.php
new file mode 100644
index 000000000..35f838560
--- /dev/null
+++ b/documentation/examples/plugins/languages/en.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * The core language file is in /languages/en.php and each plugin has its
+ * language files in a languages directory. To change a string, copy the
+ * mapping into this file.
+ *
+ * For example, to change the blog Tools menu item
+ * from "Blog" to "Rantings", copy this pair:
+ * 'blog' => "Blog",
+ * into the $mapping array so that it looks like:
+ * 'blog' => "Rantings",
+ *
+ * Follow this pattern for any other string you want to change. Make sure this
+ * plugin is lower in the plugin list than any plugin that it is modifying.
+ *
+ * If you want to add languages other than English, name the file according to
+ * the language's ISO 639-1 code: http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+ */
+
+$mapping = array(
+ 'string:here' => 'Display string here',
+);
+
+add_translation('en', $mapping);
diff --git a/documentation/examples/plugins/manifest.xml b/documentation/examples/plugins/manifest.xml
new file mode 100644
index 000000000..e31624432
--- /dev/null
+++ b/documentation/examples/plugins/manifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>My Plugin</name>
+ <author>My Name</author>
+ <version>1.0</version>
+ <description>This is a description of my plugin and its features.</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>(C) My Name or Company 2012</copyright>
+ <license>GNU General Public License version 2</license>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+
+ <category>communication</category>
+
+</plugin_manifest>
diff --git a/documentation/examples/plugins/start.php b/documentation/examples/plugins/start.php
new file mode 100644
index 000000000..3af50ce38
--- /dev/null
+++ b/documentation/examples/plugins/start.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Describe plugin here
+ */
+
+elgg_register_event_handler('init', 'system', 'my_plugin_init');
+
+function my_plugin_init() {
+ // Rename this function based on the name of your plugin and update the
+ // elgg_register_event_handler() call accordingly
+
+ // Register a script to handle (usually) a POST request (an action)
+ $base_dir = elgg_get_plugins_path() . 'my_plugin/actions/my_plugin';
+ elgg_register_action('my_plugin', "$base_dir/my_action.php");
+
+ // Extend the main CSS file
+ elgg_extend_view('css/elgg', 'my_plugin/css');
+
+ // Add a menu item to the main site menu
+ $item = new ElggMenuItem('my_plugin', elgg_echo('my_plugin:menu'), 'my_url');
+ elgg_register_menu_item('site', $item);
+}
diff --git a/documentation/examples/plugins/views/default/.gitignore b/documentation/examples/plugins/views/default/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/documentation/examples/plugins/views/default/.gitignore
diff --git a/documentation/info/config.php b/documentation/info/config.php
new file mode 100644
index 000000000..b45428477
--- /dev/null
+++ b/documentation/info/config.php
@@ -0,0 +1,430 @@
+<?php
+/**
+ * Stub info for $CONFIG global options.
+ *
+ * @tip Plugins should never use the $CONFIG array directly.
+ *
+ * @package Elgg.Core
+ * @subpackage Configuration
+ */
+
+/**
+ * Event information for the events subsystem.
+ *
+ * Events are added with {@link elgg_register_event_handler()} and
+ * can be removed in >= 1.8 with {@link elgg_unregister_event_handler()}.
+ *
+ * Events are stored as a multidimensional array in the format:
+ * <code>
+ * $CONFIG->events[str $event_name][str $event_type][int priority] = str callback_function
+ * </code>
+ *
+ * @global array $CONFIG->events
+ * @name $CONFIG->events
+ * @see events()
+ * @see elgg_register_event_handler()
+ * @see elgg_unregister_event_handler()
+ * @see elgg_trigger_event()
+ */
+$CONFIG->events;
+
+/**
+ * Plugin Hook information for the plugin hooks subsystem.
+ *
+ * Hooks are added with {@link elgg_register_plugin_hook_handler()} and
+ * can be removed in >= 1.8 with {@link elgg_unregister_plugin_hook_handler()}.
+ *
+ * Hooks are stored as a multidimensional array in the format:
+ * <code>
+ * $CONFIG->hooks[str $hook_name][str $hook_type][int priority] = str callback_function
+ * </code>
+ *
+ * @global array $CONFIG->hooks
+ * @see elgg_register_plugin_hook_handler()
+ * @see elgg_unregister_plugin_hook_handler()
+ * @see elgg_trigger_plugin_hook()
+ */
+$CONFIG->hooks;
+
+/**
+ * Paths to scan for autoloading languages.
+ *
+ * Languages are automatically loaded for the site or
+ * user's default language. Plugins can extend or override strings.
+ * language_paths is an array of paths to scan for PHP files matching
+ * the default language. The order of paths is determined by the plugin load order,
+ * with later entries overriding earlier. Language files within these paths are
+ * named as the two-letter ISO 639-1 country codes for the language they represent.
+ *
+ * Language paths are stored as array keys in the format:
+ * <code>
+ * $CONFIG->language_paths[str $language_path] = true
+ * </code>
+ *
+ * @link http://en.wikipedia.org/wiki/ISO_639-1
+ * @see register_language()
+ * @global array $CONFIG->language_paths
+ */
+$CONFIG->language_paths;
+
+
+/**
+ * String translations for the current language.
+ *
+ * Elgg uses a key-based system for string internationalization, which
+ * is accessed with {@link elgg_echo()}.
+ *
+ * Translations are stored as an array in the following format:
+ * <code>
+ * $CONFIG->translations[str $language_code][str $string_key] = str 'Translated Language String';
+ * </code>
+ *
+ * @see register_translation()
+ * @see elgg_echo()
+ * @global array $CONFIG->translations
+ */
+$CONFIG->translations;
+
+/**
+ * Stores input used by {@link set_input()} and {@link get_input()}.
+ *
+ * @global array $CONFIG->input
+ */
+$CONFIG->input;
+
+/**
+ * An array of metadata names to be used as tags.
+ *
+ * Because tags are simply names of meatdata, This is used
+ * in search to prevent data exposure by searching on
+ * arbitrary metadata.
+ *
+ * @global array $CONFIG->registered_tag_metadata_names
+ */
+$CONFIG->registered_tag_metadata_names;
+
+/**
+ * An associative array of page handlers and their function names.
+ *
+ * Page handlers must be registered by {@link elgg_register_page_handler()} and
+ * will be dispatched by {@link engine/handlers/pagehandler.php} to the
+ * proper function.
+ *
+ * @global array $CONFIG->pagehandler
+ */
+$CONFIG->pagehandler;
+
+/**
+ * An object holding valid widgets and their configurations.
+ *
+ * This object stores the valid context for widgets, and the handlers
+ * registered, as well as a description of the widget.
+ *
+ * Widgets are added with {@link add_widget_type()}.
+ *
+ * @global stdClass $CONFIG->widgets
+ */
+$CONFIG->widgets;
+
+/**
+ * The full path where Elgg is installed.
+ *
+ * @global string $CONFIG->path;
+ */
+$CONFIG->path;
+
+/**
+ * The full path for core views.
+ *
+ * @global string $CONFIG->viewpath
+ */
+$CONFIG->viewpath;
+
+/**
+ * The full path where plugins are stored.
+ *
+ * @global string $CONFIG->pluginspath
+ */
+$CONFIG->pluginspath;
+
+/**
+ * The full URL where Elgg is installed
+ *
+ * @global string $CONFIG->wwwroot
+ */
+$CONFIG->wwwroot;
+
+/**
+ * The full URL where Elgg is installed
+ *
+ * @global string $CONFIG->wwwroot
+ */
+$CONFIG->url;
+
+/**
+ * The name of the site as defined in the config table.
+ *
+ * @global string $CONFIG->sitename
+ */
+$CONFIG->sitename;
+
+/**
+ * The current language for either the site or the user.
+ *
+ * @global $CONFIG->language
+ */
+$CONFIG->language;
+
+/**
+ * Is the site fully installed
+ *
+ * @global bool $CONFIG->installed
+ */
+$CONFIG->installed;
+
+/**
+ * The guid of the current site object.
+ *
+ * @global int $CONFIG->site_id
+ */
+$CONFIG->site_id;
+
+/**
+ * The guid of the current site object.
+ *
+ * @global int $CONFIG->site_id
+ */
+$CONFIG->site_guid;
+
+/**
+ * The current site object.
+ *
+ * @global ElggSite $CONFIG->site
+ */
+$CONFIG->site;
+
+/**
+ * The full path to the data directory.
+ *
+ * @global string $CONFIG->dataroot
+ */
+$CONFIG->dataroot;
+
+/**
+ * Is simplecache enabled?
+ *
+ * @global string $CONFIG->simplecache_enabled
+ */
+$CONFIG->simplecache_enabled;
+
+/**
+ * Is the system cache enabled
+ *
+ * @global string $CONFIG->system_cache_enabled
+ */
+$CONFIG->system_cache_enabled;
+
+/**
+ * The site description from the current site object.
+ *
+ * @global string $CONFIG->sitedescription
+ */
+$CONFIG->sitedescription;
+
+/**
+ * The site email from the current site object.
+ *
+ * @global string $CONFIG->siteemail
+ */
+$CONFIG->siteemail;
+
+/**
+ * The current view type
+ *
+ * View types determin the location of view files that are used to draw pages.
+ * They are set system-wide by the $_REQUEST['view']. If a view type is manually
+ * set in settings.php or through a function hooking to the {@elgg_hook
+ *
+ * @warning This is the current view type used to determine where to load views.
+ * Don't confuse this with the current view.
+ *
+ * @global string $CONFIG->view
+ */
+$CONFIG->view;
+
+/**
+ * Default access as defined in the config table for the current site.
+ *
+ * @global string $CONFIG->default_access
+ */
+$CONFIG->default_access;
+
+/**
+ * Is registration enabled?
+ *
+ * @global bool $CONFIG->allow_registration
+ */
+$CONFIG->allow_registration;
+
+/**
+ * Is current site in walled garden mode?
+ *
+ * @global bool $CONFIG->walled_garden
+ */
+$CONFIG->walled_garden;
+
+/**
+ * Are users allow to enter their own default access levels
+ *
+ * @global bool $CONFIG->allow_user_default_access
+ */
+$CONFIG->allow_user_default_access;
+
+/**
+ * A list of feature URLs for the main site menu.
+ *
+ * These links are added via the admin interface.
+ *
+ * @global string $CONFIG->menu_items_featured_urls
+ */
+$CONFIG->menu_items_featured_urls;
+
+/**
+ * The custom menu items entered in the administration.
+ *
+ * @global string $CONFIG->menu_items_custom_items
+ */
+$CONFIG->menu_items_custom_items;
+
+/**
+ * A list of registered actions, their file locations, and access permissions.
+ *
+ * @global array $CONFIG->actions
+ */
+$CONFIG->actions;
+
+/**
+ * Holds information about views.
+ *
+ * @global object $CONFIG->views
+ */
+$CONFIG->views;
+
+/**
+ * A list of views to cache in the simple cache.
+ *
+ * @global object $CONFIG->views->simplecache
+ */
+$CONFIG->views->simplecache;
+
+/**
+ * A list of views and the top level views directory to search for the view in.
+ *
+ * @note Views are stored as the key and the top level view location is stored as the value.
+ * The current viewtype {@link $CONFIG->view} is used to determin which directory under the entry
+ * in $CONFIG->views->location to search. View names are automatically appened a '.php' extension.
+ *
+ * @global object $CONFIG->views->locations
+ */
+$CONFIG->views->locations;
+
+
+/**
+ * A list of valid view types as discovered.
+ *
+ * @global array $CONFIG->view_types
+ */
+$CONFIG->view_types;
+
+/**
+ * A list of plugins and their load order
+ *
+ * @global string $CONFIG->pluginlistcache
+ */
+$CONFIG->pluginlistcache;
+
+/**
+ * Holds URL handler information for ElggExtender objects.
+ *
+ * @global array $CONFIG->extender_url_handler
+ */
+$CONFIG->extender_url_handler;
+
+/**
+ * A list of registered entities and subtypes. Used in search.
+ *
+ * @global array $CONFIG->registered_entities
+ */
+$CONFIG->registered_entities;
+
+/**
+ * A list of URL handlers for {@link ElggEntity::getURL()}
+ *
+ * @global array $CONFIG->entity_url_handler
+ */
+$CONFIG->entity_url_handler;
+
+/**
+ * A list of entity types and subtypes that have metadata whose access permission
+ * can be changed independently of the main object. {@link register_metadata_as_indepenent()}
+ *
+ * @global string $CONFIG->independents
+ */
+$CONFIG->independents;
+
+/**
+ * Holds items for all submenus.
+ *
+ * @global string $CONFIG->submenu_items
+ */
+$CONFIG->submenu_items;
+
+/**
+ * Holds the service handlers as registered by {@register_service_handler()}
+ *
+ * @global array $CONFIG->servicehandler
+ */
+$CONFIG->servicehandler;
+
+/**
+ * A list of stop works for search. Not currently used.
+ *
+ * @global array $CONFIG->wordblacklist
+ * @todo currently unused.
+ */
+$CONFIG->wordblacklist;
+
+/**
+ * A list of menu contexts for menus registered with {@link add_menu()}. Not currently used.
+ *
+ * @global array $CONFIG->menucontexts
+ */
+$CONFIG->menucontexts;
+
+/**
+ * A list of registers and their children added via {@add_to_register()}. Used only for menus.
+ *
+ * @global string $CONFIG->registers
+ */
+$CONFIG->registers;
+
+/**
+ * A list of objects that can emit notifications. {@link register_notification_object()}
+ *
+ * @global array $CONFIG->register_objects
+ */
+$CONFIG->register_objects;
+
+/**
+ * Holds available group tools options. Added with {@link add_group_tool_option()}
+ *
+ * @global array $CONFIG->group_tool_options
+ */
+$CONFIG->group_tool_options;
+
+/**
+ * The last cache time for the current viewtype. Used in the generation of CSS and JS links.
+ *
+ * @global string $CONFIG->lastcache
+ */
+$CONFIG->lastcache; \ No newline at end of file
diff --git a/documentation/info/manifest.xml b/documentation/info/manifest.xml
new file mode 100644
index 000000000..4fd4be8ce
--- /dev/null
+++ b/documentation/info/manifest.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>My Plugin</name>
+ <author>Elgg</author>
+ <version>1.0</version>
+ <blurb>A concise description.</blurb>
+ <description>This is a longer, more interesting description of my plugin, its features, and other important information.</description>
+ <website>http://www.elgg.org/</website>
+ <repository>https://github.com/Elgg/Elgg</repository>
+ <bugtracker>https://github.com/Elgg/Elgg/issues</bugtracker>
+ <donations>http://elgg.org/supporter.php</donations>
+ <copyright>(C) Elgg 2011</copyright>
+ <license>GNU General Public License version 2</license>
+
+ <requires>
+ <type>elgg_version</type>
+ <version>2009030802</version>
+ </requires>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+
+ <screenshot>
+ <description>An example screenshot</description>
+ <path>graphics/plugin_ss1.png</path>
+ </screenshot>
+
+ <screenshot>
+ <description>Another screenshot</description>
+ <path>graphics/plugin_ss2.png</path>
+ </screenshot>
+
+ <category>admin</category>
+ <category>api</category>
+
+ <requires>
+ <type>php_extension</type>
+ <name>gd</name>
+ </requires>
+
+ <requires>
+ <type>php_ini</type>
+ <name>short_open_tag</name>
+ <value>off</value>
+ </requires>
+
+ <requires>
+ <type>php_extension</type>
+ <name>made_up</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>fake_plugin</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>profile</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.3</version>
+ <comparison>lt</comparison>
+ </requires>
+
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>blog</plugin>
+ </requires>
+
+ <conflicts>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.0</version>
+ </conflicts>
+
+ <provides>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.3</version>
+ </provides>
+
+ <provides>
+ <type>php_extension</type>
+ <name>curl</name>
+ <version>1.0</version>
+ </provides>
+
+</plugin_manifest>
diff --git a/engine/classes/APIException.php b/engine/classes/APIException.php
new file mode 100644
index 000000000..b6e1c347b
--- /dev/null
+++ b/engine/classes/APIException.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * API Exception Stub
+ *
+ * Generic parent class for API exceptions.
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class APIException extends Exception {}
diff --git a/engine/classes/CallException.php b/engine/classes/CallException.php
new file mode 100644
index 000000000..22b8f14f5
--- /dev/null
+++ b/engine/classes/CallException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Call Exception Stub
+ *
+ * Generic parent class for Call exceptions
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class CallException extends Exception {}
diff --git a/engine/classes/ClassException.php b/engine/classes/ClassException.php
new file mode 100644
index 000000000..7544f0ec9
--- /dev/null
+++ b/engine/classes/ClassException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Class Exception
+ *
+ * A generic parent class for Class exceptions
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class ClassException extends Exception {}
diff --git a/engine/classes/ClassNotFoundException.php b/engine/classes/ClassNotFoundException.php
new file mode 100644
index 000000000..6a9bcd327
--- /dev/null
+++ b/engine/classes/ClassNotFoundException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Class not found
+ *
+ * Thrown when trying to load a class that doesn't exist.
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions
+ */
+class ClassNotFoundException extends ClassException {}
diff --git a/engine/classes/ConfigurationException.php b/engine/classes/ConfigurationException.php
new file mode 100644
index 000000000..3ace5dd4b
--- /dev/null
+++ b/engine/classes/ConfigurationException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Configuration exception
+ *
+ * A generic parent class for Configuration exceptions
+ *
+ * @package Elgg
+ * @subpackage Exceptions.Stub
+ */
+class ConfigurationException extends Exception {}
diff --git a/engine/classes/CronException.php b/engine/classes/CronException.php
new file mode 100644
index 000000000..86370ef31
--- /dev/null
+++ b/engine/classes/CronException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Cron exception
+ *
+ * A generic parent class for cron exceptions
+ *
+ * @package Elgg
+ * @subpackage Exceptions.Stub
+ */
+class CronException extends Exception {}
diff --git a/engine/classes/DataFormatException.php b/engine/classes/DataFormatException.php
new file mode 100644
index 000000000..0f28a0902
--- /dev/null
+++ b/engine/classes/DataFormatException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Data format exception
+ * An exception thrown when there is a problem in the format of some data.
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class DataFormatException extends Exception {}
diff --git a/engine/classes/DatabaseException.php b/engine/classes/DatabaseException.php
new file mode 100644
index 000000000..6c8f57d7d
--- /dev/null
+++ b/engine/classes/DatabaseException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Database Exception
+ *
+ * A generic parent class for database exceptions
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class DatabaseException extends Exception {}
diff --git a/engine/classes/ElggAccess.php b/engine/classes/ElggAccess.php
new file mode 100644
index 000000000..0aed477fc
--- /dev/null
+++ b/engine/classes/ElggAccess.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Class used to determine if access is being ignored.
+ *
+ * @package Elgg.Core
+ * @subpackage Access
+ * @access private
+ * @see elgg_get_ignore_access()
+ *
+ * @todo I don't remember why this was required beyond scope concerns.
+ */
+class ElggAccess {
+ /**
+ * Bypass Elgg's access control if true.
+ * @var bool
+ */
+ private $ignore_access;
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Get current ignore access setting.
+ *
+ * @return bool
+ * @deprecated 1.8 Use ElggAccess::getIgnoreAccess()
+ */
+ public function get_ignore_access() {
+ elgg_deprecated_notice('ElggAccess::get_ignore_access() is deprecated by ElggAccess::getIgnoreAccess()', 1.8);
+ return $this->getIgnoreAccess();
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Get current ignore access setting.
+ *
+ * @return bool
+ */
+ public function getIgnoreAccess() {
+ return $this->ignore_access;
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Set ignore access.
+ *
+ * @param bool $ignore Ignore access
+ *
+ * @return bool Previous setting
+ *
+ * @deprecated 1.8 Use ElggAccess:setIgnoreAccess()
+ */
+ public function set_ignore_access($ignore = true) {
+ elgg_deprecated_notice('ElggAccess::set_ignore_access() is deprecated by ElggAccess::setIgnoreAccess()', 1.8);
+ return $this->setIgnoreAccess($ignore);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Set ignore access.
+ *
+ * @param bool $ignore Ignore access
+ *
+ * @return bool Previous setting
+ */
+ public function setIgnoreAccess($ignore = true) {
+ $prev = $this->ignore_access;
+ $this->ignore_access = $ignore;
+
+ return $prev;
+ }
+}
diff --git a/engine/classes/ElggAnnotation.php b/engine/classes/ElggAnnotation.php
new file mode 100644
index 000000000..175e7049d
--- /dev/null
+++ b/engine/classes/ElggAnnotation.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Elgg Annotations
+ *
+ * Annotations allow you to attach bits of information to entities.
+ * They are essentially the same as metadata, but with additional
+ * helper functions.
+ *
+ * @internal Annotations are stored in the annotations table.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Annotations
+ * @link http://docs.elgg.org/DataModel/Annotations
+ *
+ * @property string $value_type
+ * @property string $enabled
+ */
+class ElggAnnotation extends ElggExtender {
+
+ /**
+ * (non-PHPdoc)
+ *
+ * @see ElggData::initializeAttributes()
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = 'annotation';
+ }
+
+ /**
+ * Construct a new annotation object
+ *
+ * @param mixed $id The annotation ID or a database row as stdClass object
+ */
+ function __construct($id = null) {
+ $this->initializeAttributes();
+
+ if (!empty($id)) {
+ // Create from db row
+ if ($id instanceof stdClass) {
+ $annotation = $id;
+
+ $objarray = (array) $annotation;
+ foreach ($objarray as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else {
+ // get an ElggAnnotation object and copy its attributes
+ $annotation = elgg_get_annotation_from_id($id);
+ $this->attributes = $annotation->attributes;
+ }
+ }
+ }
+
+ /**
+ * Save this instance
+ *
+ * @return int an object id
+ *
+ * @throws IOException
+ */
+ function save() {
+ if ($this->id > 0) {
+ return update_annotation($this->id, $this->name, $this->value, $this->value_type,
+ $this->owner_guid, $this->access_id);
+ } else {
+ $this->id = create_annotation($this->entity_guid, $this->name, $this->value,
+ $this->value_type, $this->owner_guid, $this->access_id);
+
+ if (!$this->id) {
+ throw new IOException(elgg_echo('IOException:UnableToSaveNew', array(get_class())));
+ }
+ return $this->id;
+ }
+ }
+
+ /**
+ * Delete the annotation.
+ *
+ * @return bool
+ */
+ function delete() {
+ elgg_delete_river(array('annotation_id' => $this->id));
+ return elgg_delete_metastring_based_object_by_id($this->id, 'annotations');
+ }
+
+ /**
+ * Disable the annotation.
+ *
+ * @return bool
+ * @since 1.8
+ */
+ function disable() {
+ return elgg_set_metastring_based_object_enabled_by_id($this->id, 'no', 'annotations');
+ }
+
+ /**
+ * Enable the annotation.
+ *
+ * @return bool
+ * @since 1.8
+ */
+ function enable() {
+ return elgg_set_metastring_based_object_enabled_by_id($this->id, 'yes', 'annotations');
+ }
+
+ /**
+ * Get a url for this annotation.
+ *
+ * @return string
+ */
+ public function getURL() {
+ return get_annotation_url($this->id);
+ }
+
+ // SYSTEM LOG INTERFACE
+
+ /**
+ * For a given ID, return the object associated with it.
+ * This is used by the river functionality primarily.
+ * This is useful for checking access permissions etc on objects.
+ *
+ * @param int $id An annotation ID.
+ *
+ * @return ElggAnnotation
+ */
+ public function getObjectFromID($id) {
+ return elgg_get_annotation_from_id($id);
+ }
+}
diff --git a/engine/classes/ElggAttributeLoader.php b/engine/classes/ElggAttributeLoader.php
new file mode 100644
index 000000000..ffc80b02d
--- /dev/null
+++ b/engine/classes/ElggAttributeLoader.php
@@ -0,0 +1,248 @@
+<?php
+
+/**
+ * Loads ElggEntity attributes from DB or validates those passed in via constructor
+ *
+ * @access private
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel
+ */
+class ElggAttributeLoader {
+
+ /**
+ * @var array names of attributes in all entities
+ */
+ protected static $primary_attr_names = array(
+ 'guid',
+ 'type',
+ 'subtype',
+ 'owner_guid',
+ 'container_guid',
+ 'site_guid',
+ 'access_id',
+ 'time_created',
+ 'time_updated',
+ 'last_action',
+ 'enabled',
+ );
+
+ /**
+ * @var array names of secondary attributes required for the entity
+ */
+ protected $secondary_attr_names = array();
+
+ /**
+ * @var string entity type (not class) required for fetched primaries
+ */
+ protected $required_type;
+
+ /**
+ * @var array
+ */
+ protected $initialized_attributes;
+
+ /**
+ * @var string class of object being loaded
+ */
+ protected $class;
+
+ /**
+ * @var bool should access control be considered when fetching entity?
+ */
+ public $requires_access_control = true;
+
+ /**
+ * @var callable function used to load attributes from {prefix}entities table
+ */
+ public $primary_loader = 'get_entity_as_row';
+
+ /**
+ * @var callable function used to load attributes from secondary table
+ */
+ public $secondary_loader = '';
+
+ /**
+ * @var callable function used to load all necessary attributes
+ */
+ public $full_loader = '';
+
+ /**
+ * Constructor
+ *
+ * @param string $class class of object being loaded
+ * @param string $required_type entity type this is being used to populate
+ * @param array $initialized_attrs attributes after initializeAttributes() has been run
+ * @throws InvalidArgumentException
+ */
+ public function __construct($class, $required_type, array $initialized_attrs) {
+ if (!is_string($class)) {
+ throw new InvalidArgumentException('$class must be a class name.');
+ }
+ $this->class = $class;
+
+ if (!is_string($required_type)) {
+ throw new InvalidArgumentException('$requiredType must be a system entity type.');
+ }
+ $this->required_type = $required_type;
+
+ $this->initialized_attributes = $initialized_attrs;
+ unset($initialized_attrs['tables_split'], $initialized_attrs['tables_loaded']);
+ $all_attr_names = array_keys($initialized_attrs);
+ $this->secondary_attr_names = array_diff($all_attr_names, self::$primary_attr_names);
+ }
+
+ /**
+ * Get primary attributes missing that are missing
+ *
+ * @param stdClass $row Database row
+ * @return array
+ */
+ protected function isMissingPrimaries($row) {
+ return array_diff(self::$primary_attr_names, array_keys($row)) !== array();
+ }
+
+ /**
+ * Get secondary attributes that are missing
+ *
+ * @param stdClass $row Database row
+ * @return array
+ */
+ protected function isMissingSecondaries($row) {
+ return array_diff($this->secondary_attr_names, array_keys($row)) !== array();
+ }
+
+ /**
+ * Check that the type is correct
+ *
+ * @param stdClass $row Database row
+ * @return void
+ * @throws InvalidClassException
+ */
+ protected function checkType($row) {
+ if ($row['type'] !== $this->required_type) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($row['guid'], $this->class));
+ throw new InvalidClassException($msg);
+ }
+ }
+
+ /**
+ * Get all required attributes for the entity, validating any that are passed in. Returns empty array
+ * if can't be loaded (Check $failure_reason).
+ *
+ * This function splits loading between "primary" attributes (those in {prefix}entities table) and
+ * "secondary" attributes (e.g. those in {prefix}objects_entity), but can load all at once if a
+ * combined loader is available.
+ *
+ * @param mixed $row a row loaded from DB (array or stdClass) or a GUID
+ * @return array will be empty if failed to load all attributes (access control or entity doesn't exist)
+ *
+ * @throws InvalidArgumentException|LogicException|IncompleteEntityException
+ */
+ public function getRequiredAttributes($row) {
+ if (!is_array($row) && !($row instanceof stdClass)) {
+ // assume row is the GUID
+ $row = array('guid' => $row);
+ }
+ $row = (array) $row;
+ if (empty($row['guid'])) {
+ throw new InvalidArgumentException('$row must be or contain a GUID');
+ }
+
+ // these must be present to support isFullyLoaded()
+ foreach (array('tables_split', 'tables_loaded') as $key) {
+ if (isset($this->initialized_attributes[$key])) {
+ $row[$key] = $this->initialized_attributes[$key];
+ }
+ }
+
+ $was_missing_primaries = $this->isMissingPrimaries($row);
+ $was_missing_secondaries = $this->isMissingSecondaries($row);
+
+ // some types have a function to load all attributes at once, it should be faster
+ if (($was_missing_primaries || $was_missing_secondaries) && is_callable($this->full_loader)) {
+ $fetched = (array) call_user_func($this->full_loader, $row['guid']);
+ if (!$fetched) {
+ return array();
+ }
+ $row = array_merge($row, $fetched);
+ $this->checkType($row);
+ } else {
+ if ($was_missing_primaries) {
+ if (!is_callable($this->primary_loader)) {
+ throw new LogicException('Primary attribute loader must be callable');
+ }
+ if ($this->requires_access_control) {
+ $fetched = (array) call_user_func($this->primary_loader, $row['guid']);
+ } else {
+ $ignoring_access = elgg_set_ignore_access();
+ $fetched = (array) call_user_func($this->primary_loader, $row['guid']);
+ elgg_set_ignore_access($ignoring_access);
+ }
+ if (!$fetched) {
+ return array();
+ }
+ $row = array_merge($row, $fetched);
+ }
+
+ // We must test type before trying to load the secondaries so that InvalidClassException
+ // gets thrown. Otherwise the secondary loader will fail and return false.
+ $this->checkType($row);
+
+ if ($was_missing_secondaries) {
+ if (!is_callable($this->secondary_loader)) {
+ throw new LogicException('Secondary attribute loader must be callable');
+ }
+ $fetched = (array) call_user_func($this->secondary_loader, $row['guid']);
+ if (!$fetched) {
+ if ($row['type'] === 'site') {
+ // A special case is needed for sites: When vanilla ElggEntities are created and
+ // saved, these are stored w/ type "site", but with no sites_entity row. These
+ // are probably only created in the unit tests.
+ // @todo Don't save vanilla ElggEntities with type "site"
+
+ $row = $this->filterAddedColumns($row);
+ $row['guid'] = (int) $row['guid'];
+ return $row;
+ }
+ throw new IncompleteEntityException("Secondary loader failed to return row for {$row['guid']}");
+ }
+ $row = array_merge($row, $fetched);
+ }
+ }
+
+ $row = $this->filterAddedColumns($row);
+
+ // Note: If there are still missing attributes, we're running on a 1.7 or earlier schema. We let
+ // this pass so the upgrades can run.
+
+ // guid needs to be an int https://github.com/elgg/elgg/issues/4111
+ $row['guid'] = (int) $row['guid'];
+
+ return $row;
+ }
+
+ /**
+ * Filter out keys returned by the query which should not appear in the entity's attributes
+ *
+ * @param array $row All columns from the query
+ * @return array Columns acceptable for the entity's attributes
+ */
+ protected function filterAddedColumns($row) {
+ // make an array with keys as acceptable attribute names
+ $acceptable_attrs = self::$primary_attr_names;
+ array_splice($acceptable_attrs, count($acceptable_attrs), 0, $this->secondary_attr_names);
+ $acceptable_attrs = array_combine($acceptable_attrs, $acceptable_attrs);
+
+ // @todo remove these when #4584 is in place
+ $acceptable_attrs['tables_split'] = true;
+ $acceptable_attrs['tables_loaded'] = true;
+
+ foreach ($row as $key => $val) {
+ if (!isset($acceptable_attrs[$key])) {
+ unset($row[$key]);
+ }
+ }
+ return $row;
+ }
+}
diff --git a/engine/classes/ElggAutoP.php b/engine/classes/ElggAutoP.php
new file mode 100644
index 000000000..05842d1b2
--- /dev/null
+++ b/engine/classes/ElggAutoP.php
@@ -0,0 +1,336 @@
+<?php
+
+/**
+ * Create wrapper P and BR elements in HTML depending on newlines. Useful when
+ * users use newlines to signal line and paragraph breaks. In all cases output
+ * should be well-formed markup.
+ *
+ * In DIV elements, Ps are only added when there would be at
+ * least two of them.
+ *
+ * @package Elgg.Core
+ * @subpackage Output
+ */
+class ElggAutoP {
+
+ public $encoding = 'UTF-8';
+
+ /**
+ * @var DOMDocument
+ */
+ protected $_doc = null;
+
+ /**
+ * @var DOMXPath
+ */
+ protected $_xpath = null;
+
+ protected $_blocks = 'address article area aside blockquote caption col colgroup dd
+ details div dl dt fieldset figure figcaption footer form h1 h2 h3 h4 h5 h6 header
+ hr hgroup legend map math menu nav noscript p pre section select style summary
+ table tbody td tfoot th thead tr ul ol option li';
+
+ /**
+ * @var array
+ */
+ protected $_inlines = 'a abbr audio b button canvas caption cite code command datalist
+ del dfn em embed i iframe img input ins kbd keygen label map mark meter object
+ output progress q rp rt ruby s samp script select small source span strong style
+ sub sup textarea time var video wbr';
+
+ /**
+ * Descend into these elements to add Ps
+ *
+ * @var array
+ */
+ protected $_descendList = 'article aside blockquote body details div footer form
+ header section';
+
+ /**
+ * Add Ps inside these elements
+ *
+ * @var array
+ */
+ protected $_alterList = 'article aside blockquote body details div footer header
+ section';
+
+ /** @var string */
+ protected $_unique = '';
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ $this->_blocks = preg_split('@\\s+@', $this->_blocks);
+ $this->_descendList = preg_split('@\\s+@', $this->_descendList);
+ $this->_alterList = preg_split('@\\s+@', $this->_alterList);
+ $this->_inlines = preg_split('@\\s+@', $this->_inlines);
+ $this->_unique = md5(__FILE__);
+ }
+
+ /**
+ * Intance of class for singleton pattern.
+ * @var ElggAutoP
+ */
+ private static $instance;
+
+ /**
+ * Singleton pattern.
+ * @return ElggAutoP
+ */
+ public static function getInstance() {
+ $className = __CLASS__;
+ if (!(self::$instance instanceof $className)) {
+ self::$instance = new $className();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Create wrapper P and BR elements in HTML depending on newlines. Useful when
+ * users use newlines to signal line and paragraph breaks. In all cases output
+ * should be well-formed markup.
+ *
+ * In DIV, LI, TD, and TH elements, Ps are only added when their would be at
+ * least two of them.
+ *
+ * @param string $html snippet
+ * @return string|false output or false if parse error occurred
+ */
+ public function process($html) {
+ // normalize whitespace
+ $html = str_replace(array("\r\n", "\r"), "\n", $html);
+
+ // allows preserving entities untouched
+ $html = str_replace('&', $this->_unique . 'AMP', $html);
+
+ $this->_doc = new DOMDocument();
+
+ // parse to DOM, suppressing loadHTML warnings
+ // http://www.php.net/manual/en/domdocument.loadhtml.php#95463
+ libxml_use_internal_errors(true);
+
+ // Do not load entities. May be unnecessary, better safe than sorry
+ $disable_load_entities = libxml_disable_entity_loader(true);
+
+ if (!$this->_doc->loadHTML("<html><meta http-equiv='content-type' "
+ . "content='text/html; charset={$this->encoding}'><body>{$html}</body>"
+ . "</html>")) {
+
+ libxml_disable_entity_loader($disable_load_entities);
+ return false;
+ }
+
+ libxml_disable_entity_loader($disable_load_entities);
+
+ $this->_xpath = new DOMXPath($this->_doc);
+ // start processing recursively at the BODY element
+ $nodeList = $this->_xpath->query('//body[1]');
+ $this->addParagraphs($nodeList->item(0));
+
+ // serialize back to HTML
+ $html = $this->_doc->saveHTML();
+
+ // Note: we create <autop> elements, which will later be converted to paragraphs
+
+ // split AUTOPs into multiples at /\n\n+/
+ $html = preg_replace('/(' . $this->_unique . 'NL){2,}/', '</autop><autop>', $html);
+ $html = str_replace(array($this->_unique . 'BR', $this->_unique . 'NL', '<br>'),
+ '<br />',
+ $html);
+ $html = str_replace('<br /></autop>', '</autop>', $html);
+
+ // re-parse so we can handle new AUTOP elements
+
+ // Do not load entities. May be unnecessary, better safe than sorry
+ $disable_load_entities = libxml_disable_entity_loader(true);
+
+ if (!$this->_doc->loadHTML($html)) {
+ libxml_disable_entity_loader($disable_load_entities);
+ return false;
+ }
+
+ libxml_disable_entity_loader($disable_load_entities);
+
+ // must re-create XPath object after DOM load
+ $this->_xpath = new DOMXPath($this->_doc);
+
+ // strip AUTOPs that only have comments/whitespace
+ foreach ($this->_xpath->query('//autop') as $autop) {
+ /* @var DOMElement $autop */
+ $hasContent = false;
+ if (trim($autop->textContent) !== '') {
+ $hasContent = true;
+ } else {
+ foreach ($autop->childNodes as $node) {
+ if ($node->nodeType === XML_ELEMENT_NODE) {
+ $hasContent = true;
+ break;
+ }
+ }
+ }
+ if (!$hasContent) {
+ // mark to be later replaced w/ preg_replace (faster than moving nodes out)
+ $autop->setAttribute("r", "1");
+ }
+ }
+
+ // If a DIV contains a single AUTOP, remove it
+ foreach ($this->_xpath->query('//div') as $el) {
+ /* @var DOMElement $el */
+ $autops = $this->_xpath->query('./autop', $el);
+ if ($autops->length === 1) {
+ $firstAutop = $autops->item(0);
+ /* @var DOMElement $firstAutop */
+ $firstAutop->setAttribute("r", "1");
+ }
+ }
+
+ $html = $this->_doc->saveHTML();
+
+ // trim to the contents of BODY
+ $bodyStart = strpos($html, '<body>');
+ $bodyEnd = strpos($html, '</body>', $bodyStart + 6);
+ $html = substr($html, $bodyStart + 6, $bodyEnd - $bodyStart - 6);
+
+ // strip AUTOPs that should be removed
+ $html = preg_replace('@<autop r="1">(.*?)</autop>@', '\\1', $html);
+
+ // commit to converting AUTOPs to Ps
+ $html = str_replace('<autop>', "\n<p>", $html);
+ $html = str_replace('</autop>', "</p>\n", $html);
+
+ $html = str_replace('<br>', '<br />', $html);
+ $html = str_replace($this->_unique . 'AMP', '&', $html);
+ return $html;
+ }
+
+ /**
+ * Add P and BR elements as necessary
+ *
+ * @param DOMElement $el DOM element
+ * @return void
+ */
+ protected function addParagraphs(DOMElement $el) {
+ // no need to call recursively, just queue up
+ $elsToProcess = array($el);
+ $inlinesToProcess = array();
+ while ($el = array_shift($elsToProcess)) {
+ // if true, we can alter all child nodes, if not, we'll just call
+ // addParagraphs on each element in the descendInto list
+ $alterInline = in_array($el->nodeName, $this->_alterList);
+
+ // inside affected elements, we want to trim leading whitespace from
+ // the first text node
+ $ltrimFirstTextNode = true;
+
+ // should we open a new AUTOP element to move inline elements into?
+ $openP = true;
+ $autop = null;
+
+ // after BR, ignore a newline
+ $isFollowingBr = false;
+
+ $node = $el->firstChild;
+ while (null !== $node) {
+ if ($alterInline) {
+ if ($openP) {
+ $openP = false;
+ // create a P to move inline content into (this may be removed later)
+ $autop = $el->insertBefore($this->_doc->createElement('autop'), $node);
+ }
+ }
+
+ $isElement = ($node->nodeType === XML_ELEMENT_NODE);
+ if ($isElement) {
+ $isBlock = in_array($node->nodeName, $this->_blocks);
+ } else {
+ $isBlock = false;
+ }
+
+ if ($alterInline) {
+ $isText = ($node->nodeType === XML_TEXT_NODE);
+ $isLastInline = (! $node->nextSibling
+ || ($node->nextSibling->nodeType === XML_ELEMENT_NODE
+ && in_array($node->nextSibling->nodeName, $this->_blocks)));
+ if ($isElement) {
+ $isFollowingBr = ($node->nodeName === 'br');
+ }
+
+ if ($isText) {
+ $nodeText = $node->nodeValue;
+ if ($ltrimFirstTextNode) {
+ $nodeText = ltrim($nodeText);
+ $ltrimFirstTextNode = false;
+ }
+ if ($isFollowingBr && preg_match('@^[ \\t]*\\n[ \\t]*@', $nodeText, $m)) {
+ // if a user ends a line with <br>, don't add a second BR
+ $nodeText = substr($nodeText, strlen($m[0]));
+ }
+ if ($isLastInline) {
+ $nodeText = rtrim($nodeText);
+ }
+ $nodeText = str_replace("\n", $this->_unique . 'NL', $nodeText);
+ $tmpNode = $node;
+ $node = $node->nextSibling; // move loop to next node
+
+ // alter node in place, then move into AUTOP
+ $tmpNode->nodeValue = $nodeText;
+ $autop->appendChild($tmpNode);
+
+ continue;
+ }
+ }
+ if ($isBlock || ! $node->nextSibling) {
+ if ($isBlock) {
+ if (in_array($node->nodeName, $this->_descendList)) {
+ $elsToProcess[] = $node;
+ //$this->addParagraphs($node);
+ }
+ }
+ $openP = true;
+ $ltrimFirstTextNode = true;
+ }
+ if ($alterInline) {
+ if (! $isBlock) {
+ $tmpNode = $node;
+ if ($isElement && false !== strpos($tmpNode->textContent, "\n")) {
+ $inlinesToProcess[] = $tmpNode;
+ }
+ $node = $node->nextSibling;
+ $autop->appendChild($tmpNode);
+ continue;
+ }
+ }
+
+ $node = $node->nextSibling;
+ }
+ }
+
+ // handle inline nodes
+ // no need to recurse, just queue up
+ while ($el = array_shift($inlinesToProcess)) {
+ $ignoreLeadingNewline = false;
+ foreach ($el->childNodes as $node) {
+ if ($node->nodeType === XML_ELEMENT_NODE) {
+ if ($node->nodeValue === 'BR') {
+ $ignoreLeadingNewline = true;
+ } else {
+ $ignoreLeadingNewline = false;
+ if (false !== strpos($node->textContent, "\n")) {
+ $inlinesToProcess[] = $node;
+ }
+ }
+ continue;
+ } elseif ($node->nodeType === XML_TEXT_NODE) {
+ $text = $node->nodeValue;
+ if ($text[0] === "\n" && $ignoreLeadingNewline) {
+ $text = substr($text, 1);
+ $ignoreLeadingNewline = false;
+ }
+ $node->nodeValue = str_replace("\n", $this->_unique . 'BR', $text);
+ }
+ }
+ }
+ }
+}
diff --git a/engine/classes/ElggBatch.php b/engine/classes/ElggBatch.php
new file mode 100644
index 000000000..d810ea066
--- /dev/null
+++ b/engine/classes/ElggBatch.php
@@ -0,0 +1,433 @@
+<?php
+/**
+ * Efficiently run operations on batches of results for any function
+ * that supports an options array.
+ *
+ * This is usually used with elgg_get_entities() and friends,
+ * elgg_get_annotations(), and elgg_get_metadata().
+ *
+ * If you pass a valid PHP callback, all results will be run through that
+ * callback. You can still foreach() through the result set after. Valid
+ * PHP callbacks can be a string, an array, or a closure.
+ * {@link http://php.net/manual/en/language.pseudo-types.php}
+ *
+ * The callback function must accept 3 arguments: an entity, the getter
+ * used, and the options used.
+ *
+ * Results from the callback are stored in callbackResult. If the callback
+ * returns only booleans, callbackResults will be the combined result of
+ * all calls. If no entities are processed, callbackResults will be null.
+ *
+ * If the callback returns anything else, callbackresult will be an indexed
+ * array of whatever the callback returns. If returning error handling
+ * information, you should include enough information to determine which
+ * result you're referring to.
+ *
+ * Don't combine returning bools and returning something else.
+ *
+ * Note that returning false will not stop the foreach.
+ *
+ * @warning If your callback or foreach loop deletes or disable entities
+ * you MUST call setIncrementOffset(false) or set that when instantiating.
+ * This forces the offset to stay what it was in the $options array.
+ *
+ * @example
+ * <code>
+ * // using foreach
+ * $batch = new ElggBatch('elgg_get_entities', array());
+ * $batch->setIncrementOffset(false);
+ *
+ * foreach ($batch as $entity) {
+ * $entity->disable();
+ * }
+ *
+ * // using both a callback
+ * $callback = function($result, $getter, $options) {
+ * var_dump("Looking at annotation id: $result->id");
+ * return true;
+ * }
+ *
+ * $batch = new ElggBatch('elgg_get_annotations', array('guid' => 2), $callback);
+ * </code>
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel
+ * @link http://docs.elgg.org/DataModel/ElggBatch
+ * @since 1.8
+ */
+class ElggBatch
+ implements Iterator {
+
+ /**
+ * The objects to interator over.
+ *
+ * @var array
+ */
+ private $results = array();
+
+ /**
+ * The function used to get results.
+ *
+ * @var mixed A string, array, or closure, or lamda function
+ */
+ private $getter = null;
+
+ /**
+ * The number of results to grab at a time.
+ *
+ * @var int
+ */
+ private $chunkSize = 25;
+
+ /**
+ * A callback function to pass results through.
+ *
+ * @var mixed A string, array, or closure, or lamda function
+ */
+ private $callback = null;
+
+ /**
+ * Start after this many results.
+ *
+ * @var int
+ */
+ private $offset = 0;
+
+ /**
+ * Stop after this many results.
+ *
+ * @var int
+ */
+ private $limit = 0;
+
+ /**
+ * Number of processed results.
+ *
+ * @var int
+ */
+ private $retrievedResults = 0;
+
+ /**
+ * The index of the current result within the current chunk
+ *
+ * @var int
+ */
+ private $resultIndex = 0;
+
+ /**
+ * The index of the current chunk
+ *
+ * @var int
+ */
+ private $chunkIndex = 0;
+
+ /**
+ * The number of results iterated through
+ *
+ * @var int
+ */
+ private $processedResults = 0;
+
+ /**
+ * Is the getter a valid callback
+ *
+ * @var bool
+ */
+ private $validGetter = null;
+
+ /**
+ * The result of running all entities through the callback function.
+ *
+ * @var mixed
+ */
+ public $callbackResult = null;
+
+ /**
+ * If false, offset will not be incremented. This is used for callbacks/loops that delete.
+ *
+ * @var bool
+ */
+ private $incrementOffset = true;
+
+ /**
+ * Entities that could not be instantiated during a fetch
+ *
+ * @var stdClass[]
+ */
+ private $incompleteEntities = array();
+
+ /**
+ * Total number of incomplete entities fetched
+ *
+ * @var int
+ */
+ private $totalIncompletes = 0;
+
+ /**
+ * Batches operations on any elgg_get_*() or compatible function that supports
+ * an options array.
+ *
+ * Instead of returning all objects in memory, it goes through $chunk_size
+ * objects, then requests more from the server. This avoids OOM errors.
+ *
+ * @param string $getter The function used to get objects. Usually
+ * an elgg_get_*() function, but can be any valid PHP callback.
+ * @param array $options The options array to pass to the getter function. If limit is
+ * not set, 10 is used as the default. In most cases that is not
+ * what you want.
+ * @param mixed $callback An optional callback function that all results will be passed
+ * to upon load. The callback needs to accept $result, $getter,
+ * $options.
+ * @param int $chunk_size The number of entities to pull in before requesting more.
+ * You have to balance this between running out of memory in PHP
+ * and hitting the db server too often.
+ * @param bool $inc_offset Increment the offset on each fetch. This must be false for
+ * callbacks that delete rows. You can set this after the
+ * object is created with {@see ElggBatch::setIncrementOffset()}.
+ */
+ public function __construct($getter, $options, $callback = null, $chunk_size = 25,
+ $inc_offset = true) {
+
+ $this->getter = $getter;
+ $this->options = $options;
+ $this->callback = $callback;
+ $this->chunkSize = $chunk_size;
+ $this->setIncrementOffset($inc_offset);
+
+ if ($this->chunkSize <= 0) {
+ $this->chunkSize = 25;
+ }
+
+ // store these so we can compare later
+ $this->offset = elgg_extract('offset', $options, 0);
+ $this->limit = elgg_extract('limit', $options, 10);
+
+ // if passed a callback, create a new ElggBatch with the same options
+ // and pass each to the callback.
+ if ($callback && is_callable($callback)) {
+ $batch = new ElggBatch($getter, $options, null, $chunk_size, $inc_offset);
+
+ $all_results = null;
+
+ foreach ($batch as $result) {
+ if (is_string($callback)) {
+ $result = $callback($result, $getter, $options);
+ } else {
+ $result = call_user_func_array($callback, array($result, $getter, $options));
+ }
+
+ if (!isset($all_results)) {
+ if ($result === true || $result === false || $result === null) {
+ $all_results = $result;
+ } else {
+ $all_results = array();
+ }
+ }
+
+ if (($result === true || $result === false || $result === null) && !is_array($all_results)) {
+ $all_results = $result && $all_results;
+ } else {
+ $all_results[] = $result;
+ }
+ }
+
+ $this->callbackResult = $all_results;
+ }
+ }
+
+ /**
+ * Tell the process that an entity was incomplete during a fetch
+ *
+ * @param stdClass $row
+ *
+ * @access private
+ */
+ public function reportIncompleteEntity(stdClass $row) {
+ $this->incompleteEntities[] = $row;
+ }
+
+ /**
+ * Fetches the next chunk of results
+ *
+ * @return bool
+ */
+ private function getNextResultsChunk() {
+
+ // always reset results.
+ $this->results = array();
+
+ if (!isset($this->validGetter)) {
+ $this->validGetter = is_callable($this->getter);
+ }
+
+ if (!$this->validGetter) {
+ return false;
+ }
+
+ $limit = $this->chunkSize;
+
+ // if someone passed limit = 0 they want everything.
+ if ($this->limit != 0) {
+ if ($this->retrievedResults >= $this->limit) {
+ return false;
+ }
+
+ // if original limit < chunk size, set limit to original limit
+ // else if the number of results we'll fetch if greater than the original limit
+ if ($this->limit < $this->chunkSize) {
+ $limit = $this->limit;
+ } elseif ($this->retrievedResults + $this->chunkSize > $this->limit) {
+ // set the limit to the number of results remaining in the original limit
+ $limit = $this->limit - $this->retrievedResults;
+ }
+ }
+
+ if ($this->incrementOffset) {
+ $offset = $this->offset + $this->retrievedResults;
+ } else {
+ $offset = $this->offset + $this->totalIncompletes;
+ }
+
+ $current_options = array(
+ 'limit' => $limit,
+ 'offset' => $offset,
+ '__ElggBatch' => $this,
+ );
+
+ $options = array_merge($this->options, $current_options);
+
+ $this->incompleteEntities = array();
+ $this->results = call_user_func_array($this->getter, array($options));
+
+ $num_results = count($this->results);
+ $num_incomplete = count($this->incompleteEntities);
+
+ $this->totalIncompletes += $num_incomplete;
+
+ if ($this->incompleteEntities) {
+ // pad the front of the results with nulls representing the incompletes
+ array_splice($this->results, 0, 0, array_pad(array(), $num_incomplete, null));
+ // ...and skip past them
+ reset($this->results);
+ for ($i = 0; $i < $num_incomplete; $i++) {
+ next($this->results);
+ }
+ }
+
+ if ($this->results) {
+ $this->chunkIndex++;
+
+ // let the system know we've jumped past the nulls
+ $this->resultIndex = $num_incomplete;
+
+ $this->retrievedResults += ($num_results + $num_incomplete);
+ if ($num_results == 0) {
+ // This fetch was *all* incompletes! We need to fetch until we can either
+ // offer at least one row to iterate over, or give up.
+ return $this->getNextResultsChunk();
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Increment the offset from the original options array? Setting to
+ * false is required for callbacks that delete rows.
+ *
+ * @param bool $increment Set to false when deleting data
+ * @return void
+ */
+ public function setIncrementOffset($increment = true) {
+ $this->incrementOffset = (bool) $increment;
+ }
+
+ /**
+ * Implements Iterator
+ */
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::rewind()
+ * @return void
+ */
+ public function rewind() {
+ $this->resultIndex = 0;
+ $this->retrievedResults = 0;
+ $this->processedResults = 0;
+
+ // only grab results if we haven't yet or we're crossing chunks
+ if ($this->chunkIndex == 0 || $this->limit > $this->chunkSize) {
+ $this->chunkIndex = 0;
+ $this->getNextResultsChunk();
+ }
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::current()
+ * @return mixed
+ */
+ public function current() {
+ return current($this->results);
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::key()
+ * @return int
+ */
+ public function key() {
+ return $this->processedResults;
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::next()
+ * @return mixed
+ */
+ public function next() {
+ // if we'll be at the end.
+ if (($this->processedResults + 1) >= $this->limit && $this->limit > 0) {
+ $this->results = array();
+ return false;
+ }
+
+ // if we'll need new results.
+ if (($this->resultIndex + 1) >= $this->chunkSize) {
+ if (!$this->getNextResultsChunk()) {
+ $this->results = array();
+ return false;
+ }
+
+ $result = current($this->results);
+ } else {
+ // the function above resets the indexes, so only inc if not
+ // getting new set
+ $this->resultIndex++;
+ $result = next($this->results);
+ }
+
+ $this->processedResults++;
+ return $result;
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::valid()
+ * @return bool
+ */
+ public function valid() {
+ if (!is_array($this->results)) {
+ return false;
+ }
+ $key = key($this->results);
+ return ($key !== NULL && $key !== FALSE);
+ }
+}
diff --git a/engine/classes/ElggCache.php b/engine/classes/ElggCache.php
new file mode 100644
index 000000000..909eab39b
--- /dev/null
+++ b/engine/classes/ElggCache.php
@@ -0,0 +1,247 @@
+<?php
+/**
+ * ElggCache The elgg cache superclass.
+ * This defines the interface for a cache (wherever that cache is stored).
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+abstract class ElggCache implements ArrayAccess {
+ /**
+ * Variables for the cache object.
+ *
+ * @var array
+ */
+ private $variables;
+
+ /**
+ * Set the constructor.
+ */
+ function __construct() {
+ $this->variables = array();
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Set a cache variable.
+ *
+ * @param string $variable Name
+ * @param string $value Value
+ *
+ * @return void
+ *
+ * @deprecated 1.8 Use ElggCache:setVariable()
+ */
+ public function set_variable($variable, $value) {
+ elgg_deprecated_notice('ElggCache::set_variable() is deprecated by ElggCache::setVariable()', 1.8);
+ $this->setVariable($variable, $value);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Set a cache variable.
+ *
+ * @param string $variable Name
+ * @param string $value Value
+ *
+ * @return void
+ */
+ public function setVariable($variable, $value) {
+ if (!is_array($this->variables)) {
+ $this->variables = array();
+ }
+
+ $this->variables[$variable] = $value;
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Get variables for this cache.
+ *
+ * @param string $variable Name
+ *
+ * @return mixed The value or null;
+ *
+ * @deprecated 1.8 Use ElggCache::getVariable()
+ */
+ public function get_variable($variable) {
+ elgg_deprecated_notice('ElggCache::get_variable() is deprecated by ElggCache::getVariable()', 1.8);
+ return $this->getVariable($variable);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Get variables for this cache.
+ *
+ * @param string $variable Name
+ *
+ * @return mixed The variable or null;
+ */
+ public function getVariable($variable) {
+ if (isset($this->variables[$variable])) {
+ return $this->variables[$variable];
+ }
+
+ return null;
+ }
+
+ /**
+ * Class member get overloading, returning key using $this->load defaults.
+ *
+ * @param string $key Name
+ *
+ * @return mixed
+ */
+ function __get($key) {
+ return $this->load($key);
+ }
+
+ /**
+ * Class member set overloading, setting a key using $this->save defaults.
+ *
+ * @param string $key Name
+ * @param mixed $value Value
+ *
+ * @return mixed
+ */
+ function __set($key, $value) {
+ return $this->save($key, $value);
+ }
+
+ /**
+ * Supporting isset, using $this->load() with default values.
+ *
+ * @param string $key The name of the attribute or metadata.
+ *
+ * @return bool
+ */
+ function __isset($key) {
+ return (bool)$this->load($key);
+ }
+
+ /**
+ * Supporting unsetting of magic attributes.
+ *
+ * @param string $key The name of the attribute or metadata.
+ *
+ * @return bool
+ */
+ function __unset($key) {
+ return $this->delete($key);
+ }
+
+ /**
+ * Save data in a cache.
+ *
+ * @param string $key Name
+ * @param string $data Value
+ *
+ * @return bool
+ */
+ abstract public function save($key, $data);
+
+ /**
+ * Load data from the cache using a given key.
+ *
+ * @todo $offset is a horrible variable name because it creates confusion
+ * with the ArrayAccess methods
+ *
+ * @param string $key Name
+ * @param int $offset Offset
+ * @param int $limit Limit
+ *
+ * @return mixed The stored data or false.
+ */
+ abstract public function load($key, $offset = 0, $limit = null);
+
+ /**
+ * Invalidate a key
+ *
+ * @param string $key Name
+ *
+ * @return bool
+ */
+ abstract public function delete($key);
+
+ /**
+ * Clear out all the contents of the cache.
+ *
+ * @return bool
+ */
+ abstract public function clear();
+
+ /**
+ * Add a key only if it doesn't already exist.
+ * Implemented simply here, if you extend this class and your caching engine
+ * provides a better way then override this accordingly.
+ *
+ * @param string $key Name
+ * @param string $data Value
+ *
+ * @return bool
+ */
+ public function add($key, $data) {
+ if (!isset($this[$key])) {
+ return $this->save($key, $data);
+ }
+
+ return false;
+ }
+
+ // ARRAY ACCESS INTERFACE //////////////////////////////////////////////////////////
+
+ /**
+ * Assigns a value for the specified key
+ *
+ * @see ArrayAccess::offsetSet()
+ *
+ * @param mixed $key The key (offset) to assign the value to.
+ * @param mixed $value The value to set.
+ *
+ * @return void
+ */
+ function offsetSet($key, $value) {
+ $this->save($key, $value);
+ }
+
+ /**
+ * Get the value for specified key
+ *
+ * @see ArrayAccess::offsetGet()
+ *
+ * @param mixed $key The key (offset) to retrieve.
+ *
+ * @return mixed
+ */
+ function offsetGet($key) {
+ return $this->load($key);
+ }
+
+ /**
+ * Unsets a key.
+ *
+ * @see ArrayAccess::offsetUnset()
+ *
+ * @param mixed $key The key (offset) to unset.
+ *
+ * @return void
+ */
+ function offsetUnset($key) {
+ if (isset($this->$key)) {
+ unset($this->$key);
+ }
+ }
+
+ /**
+ * Does key exist
+ *
+ * @see ArrayAccess::offsetExists()
+ *
+ * @param mixed $key A key (offset) to check for.
+ *
+ * @return bool
+ */
+ function offsetExists($key) {
+ return isset($this->$key);
+ }
+}
diff --git a/engine/classes/ElggCrypto.php b/engine/classes/ElggCrypto.php
new file mode 100644
index 000000000..317d371e4
--- /dev/null
+++ b/engine/classes/ElggCrypto.php
@@ -0,0 +1,208 @@
+<?php
+/**
+ * ElggCrypto
+ *
+ * @package Elgg.Core
+ * @subpackage Crypto
+ *
+ * @access private
+ */
+class ElggCrypto {
+
+ /**
+ * Character set for temp passwords (no risk of embedded profanity/glyphs that look similar)
+ */
+ const CHARS_PASSWORD = 'bcdfghjklmnpqrstvwxyz2346789';
+
+ /**
+ * Generate a string of highly randomized bytes (over the full 8-bit range).
+ *
+ * @param int $length Number of bytes needed
+ * @return string Random bytes
+ *
+ * @author George Argyros <argyros.george@gmail.com>
+ * @copyright 2012, George Argyros. All rights reserved.
+ * @license Modified BSD
+ * @link https://github.com/GeorgeArgyros/Secure-random-bytes-in-PHP/blob/master/srand.php Original
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the <organization> nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL GEORGE ARGYROS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ public function getRandomBytes($length) {
+ /**
+ * Our primary choice for a cryptographic strong randomness function is
+ * openssl_random_pseudo_bytes.
+ */
+ $SSLstr = '4'; // http://xkcd.com/221/
+ if (function_exists('openssl_random_pseudo_bytes')
+ && (version_compare(PHP_VERSION, '5.3.4') >= 0 || substr(PHP_OS, 0, 3) !== 'WIN')) {
+ $SSLstr = openssl_random_pseudo_bytes($length, $strong);
+ if ($strong) {
+ return $SSLstr;
+ }
+ }
+
+ /**
+ * If mcrypt extension is available then we use it to gather entropy from
+ * the operating system's PRNG. This is better than reading /dev/urandom
+ * directly since it avoids reading larger blocks of data than needed.
+ * Older versions of mcrypt_create_iv may be broken or take too much time
+ * to finish so we only use this function with PHP 5.3.7 and above.
+ * @see https://bugs.php.net/bug.php?id=55169
+ */
+ if (function_exists('mcrypt_create_iv')
+ && (version_compare(PHP_VERSION, '5.3.7') >= 0 || substr(PHP_OS, 0, 3) !== 'WIN')) {
+ $str = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
+ if ($str !== false) {
+ return $str;
+ }
+ }
+
+ /**
+ * No build-in crypto randomness function found. We collect any entropy
+ * available in the PHP core PRNGs along with some filesystem info and memory
+ * stats. To make this data cryptographically strong we add data either from
+ * /dev/urandom or if its unavailable, we gather entropy by measuring the
+ * time needed to compute a number of SHA-1 hashes.
+ */
+ $str = '';
+ $bits_per_round = 2; // bits of entropy collected in each clock drift round
+ $msec_per_round = 400; // expected running time of each round in microseconds
+ $hash_len = 20; // SHA-1 Hash length
+ $total = $length; // total bytes of entropy to collect
+
+ $handle = @fopen('/dev/urandom', 'rb');
+ if ($handle && function_exists('stream_set_read_buffer')) {
+ @stream_set_read_buffer($handle, 0);
+ }
+
+ do {
+ $bytes = ($total > $hash_len) ? $hash_len : $total;
+ $total -= $bytes;
+
+ //collect any entropy available from the PHP system and filesystem
+ $entropy = rand() . uniqid(mt_rand(), true) . $SSLstr;
+ $entropy .= implode('', @fstat(@fopen(__FILE__, 'r')));
+ $entropy .= memory_get_usage() . getmypid();
+ $entropy .= serialize($_ENV) . serialize($_SERVER);
+ if (function_exists('posix_times')) {
+ $entropy .= serialize(posix_times());
+ }
+ if (function_exists('zend_thread_id')) {
+ $entropy .= zend_thread_id();
+ }
+
+ if ($handle) {
+ $entropy .= @fread($handle, $bytes);
+ } else {
+ // Measure the time that the operations will take on average
+ for ($i = 0; $i < 3; $i++) {
+ $c1 = microtime(true);
+ $var = sha1(mt_rand());
+ for ($j = 0; $j < 50; $j++) {
+ $var = sha1($var);
+ }
+ $c2 = microtime(true);
+ $entropy .= $c1 . $c2;
+ }
+
+ // Based on the above measurement determine the total rounds
+ // in order to bound the total running time.
+ $rounds = (int) ($msec_per_round * 50 / (int) (($c2 - $c1) * 1000000));
+
+ // Take the additional measurements. On average we can expect
+ // at least $bits_per_round bits of entropy from each measurement.
+ $iter = $bytes * (int) (ceil(8 / $bits_per_round));
+
+ for ($i = 0; $i < $iter; $i++) {
+ $c1 = microtime();
+ $var = sha1(mt_rand());
+ for ($j = 0; $j < $rounds; $j++) {
+ $var = sha1($var);
+ }
+ $c2 = microtime();
+ $entropy .= $c1 . $c2;
+ }
+ }
+
+ // We assume sha1 is a deterministic extractor for the $entropy variable.
+ $str .= sha1($entropy, true);
+
+ } while ($length > strlen($str));
+
+ if ($handle) {
+ @fclose($handle);
+ }
+
+ return substr($str, 0, $length);
+ }
+
+ /**
+ * Generate a random string of specified length.
+ *
+ * Uses supplied character list for generating the new string.
+ * If no character list provided - uses Base64 URL character set.
+ *
+ * @param int $length Desired length of the string
+ * @param string|null $chars Characters to be chosen from randomly. If not given, the Base64 URL
+ * charset will be used.
+ *
+ * @return string The random string
+ *
+ * @throws InvalidArgumentException
+ *
+ * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ *
+ * @see https://github.com/zendframework/zf2/blob/master/library/Zend/Math/Rand.php#L179
+ */
+ public static function getRandomString($length, $chars = null) {
+ if ($length < 1) {
+ throw new InvalidArgumentException('Length should be >= 1');
+ }
+
+ if (empty($chars)) {
+ $numBytes = ceil($length * 0.75);
+ $bytes = self::getRandomBytes($numBytes);
+ $string = substr(rtrim(base64_encode($bytes), '='), 0, $length);
+
+ // Base64 URL
+ return strtr($string, '+/', '-_');
+ }
+
+ $listLen = strlen($chars);
+
+ if ($listLen == 1) {
+ return str_repeat($chars, $length);
+ }
+
+ $bytes = self::getRandomBytes($length);
+ $pos = 0;
+ $result = '';
+ for ($i = 0; $i < $length; $i++) {
+ $pos = ($pos + ord($bytes[$i])) % $listLen;
+ $result .= $chars[$pos];
+ }
+
+ return $result;
+ }
+}
diff --git a/engine/classes/ElggData.php b/engine/classes/ElggData.php
new file mode 100644
index 000000000..4f843cde4
--- /dev/null
+++ b/engine/classes/ElggData.php
@@ -0,0 +1,309 @@
+<?php
+/**
+ * A generic class that contains shared code b/w
+ * ElggExtender, ElggEntity, and ElggRelationship
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel
+ *
+ * @property int $owner_guid
+ * @property int $time_created
+ */
+abstract class ElggData implements
+ Loggable, // Can events related to this object class be logged
+ Iterator, // Override foreach behaviour
+ ArrayAccess, // Override for array access
+ Exportable
+{
+
+ /**
+ * The main attributes of an entity.
+ * Holds attributes to save to database
+ * This contains the site's main properties (id, etc)
+ * Blank entries for all database fields should be created by the constructor.
+ * Subclasses should add to this in their constructors.
+ * Any field not appearing in this will be viewed as a
+ */
+ protected $attributes = array();
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Initialise the attributes array.
+ *
+ * This is vital to distinguish between metadata and base parameters.
+ *
+ * @param bool $pre18_api Compatibility for subclassing in 1.7 -> 1.8 change.
+ * Passing true (default) emits a deprecation notice.
+ * Passing false returns false. Core constructors always pass false.
+ * Does nothing either way since attributes are initialized by the time
+ * this is called.
+ * @return void
+ * @deprecated 1.8 Use initializeAttributes()
+ */
+ protected function initialise_attributes($pre18_api = true) {
+ if ($pre18_api) {
+ elgg_deprecated_notice('initialise_attributes() is deprecated by initializeAttributes()', 1.8);
+ }
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Initialize the attributes array.
+ *
+ * This is vital to distinguish between metadata and base parameters.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ // Create attributes array if not already created
+ if (!is_array($this->attributes)) {
+ $this->attributes = array();
+ }
+
+ $this->attributes['time_created'] = NULL;
+ }
+
+ /**
+ * Return an attribute or a piece of metadata.
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ public function __get($name) {
+ return $this->get($name);
+ }
+
+ /**
+ * Set an attribute or a piece of metadata.
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return mixed
+ */
+ public function __set($name, $value) {
+ return $this->set($name, $value);
+ }
+
+ /**
+ * Test if property is set either as an attribute or metadata.
+ *
+ * @tip Use isset($entity->property)
+ *
+ * @param string $name The name of the attribute or metadata.
+ *
+ * @return bool
+ */
+ function __isset($name) {
+ return $this->$name !== NULL;
+ }
+
+ /**
+ * Fetch the specified attribute
+ *
+ * @param string $name The attribute to fetch
+ *
+ * @return mixed The attribute, if it exists. Otherwise, null.
+ */
+ abstract protected function get($name);
+
+ /**
+ * Set the specified attribute
+ *
+ * @param string $name The attribute to set
+ * @param mixed $value The value to set it to
+ *
+ * @return bool The success of your set function?
+ */
+ abstract protected function set($name, $value);
+
+ /**
+ * Get a URL for this object
+ *
+ * @return string
+ */
+ abstract public function getURL();
+
+ /**
+ * Save this data to the appropriate database table.
+ *
+ * @return bool
+ */
+ abstract public function save();
+
+ /**
+ * Delete this data.
+ *
+ * @return bool
+ */
+ abstract public function delete();
+
+ /**
+ * Returns the UNIX epoch time that this entity was created
+ *
+ * @return int UNIX epoch time
+ */
+ public function getTimeCreated() {
+ return $this->time_created;
+ }
+
+ /*
+ * SYSTEM LOG INTERFACE
+ */
+
+ /**
+ * Return the class name of the object.
+ *
+ * @return string
+ */
+ public function getClassName() {
+ return get_class($this);
+ }
+
+ /**
+ * Return the GUID of the owner of this object.
+ *
+ * @return int
+ * @deprecated 1.8 Use getOwnerGUID() instead
+ */
+ public function getObjectOwnerGUID() {
+ elgg_deprecated_notice("getObjectOwnerGUID() was deprecated. Use getOwnerGUID().", 1.8);
+ return $this->owner_guid;
+ }
+
+ /*
+ * ITERATOR INTERFACE
+ */
+
+ /*
+ * This lets an entity's attributes be displayed using foreach as a normal array.
+ * Example: http://www.sitepoint.com/print/php5-standard-library
+ */
+ protected $valid = FALSE;
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::rewind()
+ *
+ * @return void
+ */
+ public function rewind() {
+ $this->valid = (FALSE !== reset($this->attributes));
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::current()
+ *
+ * @return mixed
+ */
+ public function current() {
+ return current($this->attributes);
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::key()
+ *
+ * @return string
+ */
+ public function key() {
+ return key($this->attributes);
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::next()
+ *
+ * @return void
+ */
+ public function next() {
+ $this->valid = (FALSE !== next($this->attributes));
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::valid()
+ *
+ * @return bool
+ */
+ public function valid() {
+ return $this->valid;
+ }
+
+ /*
+ * ARRAY ACCESS INTERFACE
+ */
+
+ /*
+ * This lets an entity's attributes be accessed like an associative array.
+ * Example: http://www.sitepoint.com/print/php5-standard-library
+ */
+
+ /**
+ * Array access interface
+ *
+ * @see ArrayAccess::offsetSet()
+ *
+ * @param mixed $key Name
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ public function offsetSet($key, $value) {
+ if (array_key_exists($key, $this->attributes)) {
+ $this->attributes[$key] = $value;
+ }
+ }
+
+ /**
+ * Array access interface
+ *
+ * @see ArrayAccess::offsetGet()
+ *
+ * @param mixed $key Name
+ *
+ * @return mixed
+ */
+ public function offsetGet($key) {
+ if (array_key_exists($key, $this->attributes)) {
+ return $this->attributes[$key];
+ }
+ return null;
+ }
+
+ /**
+ * Array access interface
+ *
+ * @see ArrayAccess::offsetUnset()
+ *
+ * @param mixed $key Name
+ *
+ * @return void
+ */
+ public function offsetUnset($key) {
+ if (array_key_exists($key, $this->attributes)) {
+ // Full unsetting is dangerous for our objects
+ $this->attributes[$key] = "";
+ }
+ }
+
+ /**
+ * Array access interface
+ *
+ * @see ArrayAccess::offsetExists()
+ *
+ * @param int $offset Offset
+ *
+ * @return int
+ */
+ public function offsetExists($offset) {
+ return array_key_exists($offset, $this->attributes);
+ }
+}
diff --git a/engine/classes/ElggDiskFilestore.php b/engine/classes/ElggDiskFilestore.php
new file mode 100644
index 000000000..6e2354012
--- /dev/null
+++ b/engine/classes/ElggDiskFilestore.php
@@ -0,0 +1,417 @@
+<?php
+/**
+ * A filestore that uses disk as storage.
+ *
+ * @warning This should be used by a wrapper class
+ * like {@link ElggFile}.
+ *
+ * @package Elgg.Core
+ * @subpackage FileStore.Disk
+ * @link http://docs.elgg.org/DataModel/FileStore/Disk
+ */
+class ElggDiskFilestore extends ElggFilestore {
+ /**
+ * Directory root.
+ */
+ private $dir_root;
+
+ /**
+ * Default depth of file directory matrix
+ */
+ private $matrix_depth = 5;
+
+ /**
+ * Construct a disk filestore using the given directory root.
+ *
+ * @param string $directory_root Root directory, must end in "/"
+ */
+ public function __construct($directory_root = "") {
+ global $CONFIG;
+
+ if ($directory_root) {
+ $this->dir_root = $directory_root;
+ } else {
+ $this->dir_root = $CONFIG->dataroot;
+ }
+ }
+
+ /**
+ * Open a file for reading, writing, or both.
+ *
+ * @note All files are opened binary safe.
+ * @warning This will try to create the a directory if it doesn't exist,
+ * even in read-only mode.
+ *
+ * @param ElggFile $file The file to open
+ * @param string $mode read, write, or append.
+ *
+ * @throws InvalidParameterException
+ * @return resource File pointer resource
+ * @todo This really shouldn't try to create directories if not writing.
+ */
+ public function open(ElggFile $file, $mode) {
+ $fullname = $this->getFilenameOnFilestore($file);
+
+ // Split into path and name
+ $ls = strrpos($fullname, "/");
+ if ($ls === false) {
+ $ls = 0;
+ }
+
+ $path = substr($fullname, 0, $ls);
+ $name = substr($fullname, $ls);
+ // @todo $name is unused, remove it or do we need to fix something?
+
+ // Try and create the directory
+ try {
+ $this->makeDirectoryRoot($path);
+ } catch (Exception $e) {
+
+ }
+
+ if (($mode != 'write') && (!file_exists($fullname))) {
+ return false;
+ }
+
+ switch ($mode) {
+ case "read" :
+ $mode = "rb";
+ break;
+ case "write" :
+ $mode = "w+b";
+ break;
+ case "append" :
+ $mode = "a+b";
+ break;
+ default:
+ $msg = elgg_echo('InvalidParameterException:UnrecognisedFileMode', array($mode));
+ throw new InvalidParameterException($msg);
+ }
+
+ return fopen($fullname, $mode);
+
+ }
+
+ /**
+ * Write data to a file.
+ *
+ * @param resource $f File pointer resource
+ * @param mixed $data The data to write.
+ *
+ * @return bool
+ */
+ public function write($f, $data) {
+ return fwrite($f, $data);
+ }
+
+ /**
+ * Read data from a file.
+ *
+ * @param resource $f File pointer resource
+ * @param int $length The number of bytes to read
+ * @param int $offset The number of bytes to start after
+ *
+ * @return mixed Contents of file or false on fail.
+ */
+ public function read($f, $length, $offset = 0) {
+ if ($offset) {
+ $this->seek($f, $offset);
+ }
+
+ return fread($f, $length);
+ }
+
+ /**
+ * Close a file pointer
+ *
+ * @param resource $f A file pointer resource
+ *
+ * @return bool
+ */
+ public function close($f) {
+ return fclose($f);
+ }
+
+ /**
+ * Delete an ElggFile file.
+ *
+ * @param ElggFile $file File to delete
+ *
+ * @return bool
+ */
+ public function delete(ElggFile $file) {
+ $filename = $this->getFilenameOnFilestore($file);
+ if (file_exists($filename)) {
+ return unlink($filename);
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Seek to the specified position.
+ *
+ * @param resource $f File resource
+ * @param int $position Position in bytes
+ *
+ * @return bool
+ */
+ public function seek($f, $position) {
+ return fseek($f, $position);
+ }
+
+ /**
+ * Return the current location of the internal pointer
+ *
+ * @param resource $f File pointer resource
+ *
+ * @return int|false
+ */
+ public function tell($f) {
+ return ftell($f);
+ }
+
+ /**
+ * Tests for end of file on a file pointer
+ *
+ * @param resource $f File pointer resource
+ *
+ * @return bool
+ */
+ public function eof($f) {
+ return feof($f);
+ }
+
+ /**
+ * Returns the file size of an ElggFile file.
+ *
+ * @param ElggFile $file File object
+ *
+ * @return int The file size
+ */
+ public function getFileSize(ElggFile $file) {
+ return filesize($this->getFilenameOnFilestore($file));
+ }
+
+ /**
+ * Get the filename as saved on disk for an ElggFile object
+ *
+ * Returns an empty string if no filename set
+ *
+ * @param ElggFile $file File object
+ *
+ * @return string The full path of where the file is stored
+ * @throws InvalidParameterException
+ */
+ public function getFilenameOnFilestore(ElggFile $file) {
+ $owner_guid = $file->getOwnerGuid();
+ if (!$owner_guid) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ if (!$owner_guid) {
+ $msg = elgg_echo('InvalidParameterException:MissingOwner',
+ array($file->getFilename(), $file->guid));
+ throw new InvalidParameterException($msg);
+ }
+
+ $filename = $file->getFilename();
+ if (!$filename) {
+ return '';
+ }
+
+ return $this->dir_root . $this->makeFileMatrix($owner_guid) . $filename;
+ }
+
+ /**
+ * Returns the contents of the ElggFile file.
+ *
+ * @param ElggFile $file File object
+ *
+ * @return string
+ */
+ public function grabFile(ElggFile $file) {
+ return file_get_contents($file->getFilenameOnFilestore());
+ }
+
+ /**
+ * Tests if an ElggFile file exists.
+ *
+ * @param ElggFile $file File object
+ *
+ * @return bool
+ */
+ public function exists(ElggFile $file) {
+ if (!$file->getFilename()) {
+ return false;
+ }
+ return file_exists($this->getFilenameOnFilestore($file));
+ }
+
+ /**
+ * Returns the size of all data stored under a directory in the disk store.
+ *
+ * @param string $prefix Optional/ The prefix to check under.
+ * @param string $container_guid The guid of the entity whose data you want to check.
+ *
+ * @return int|false
+ */
+ public function getSize($prefix = '', $container_guid) {
+ if ($container_guid) {
+ return get_dir_size($this->dir_root . $this->makeFileMatrix($container_guid) . $prefix);
+ } else {
+ return false;
+ }
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Create a directory $dirroot
+ *
+ * @param string $dirroot The full path of the directory to create
+ *
+ * @throws IOException
+ * @return true
+ * @deprecated 1.8 Use ElggDiskFilestore::makeDirectoryRoot()
+ */
+ protected function make_directory_root($dirroot) {
+ elgg_deprecated_notice('ElggDiskFilestore::make_directory_root() is deprecated by ::makeDirectoryRoot()', 1.8);
+
+ return $this->makeDirectoryRoot($dirroot);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Create a directory $dirroot
+ *
+ * @param string $dirroot The full path of the directory to create
+ *
+ * @throws IOException
+ * @return true
+ */
+ protected function makeDirectoryRoot($dirroot) {
+ if (!file_exists($dirroot)) {
+ if (!@mkdir($dirroot, 0700, true)) {
+ throw new IOException(elgg_echo('IOException:CouldNotMake', array($dirroot)));
+ }
+ }
+
+ return true;
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Multibyte string tokeniser.
+ *
+ * Splits a string into an array. Will fail safely if mbstring is
+ * not installed.
+ *
+ * @param string $string String
+ * @param string $charset The charset, defaults to UTF8
+ *
+ * @return array
+ * @deprecated 1.8 Files are stored by date and guid; no need for this.
+ */
+ private function mb_str_split($string, $charset = 'UTF8') {
+ elgg_deprecated_notice('ElggDiskFilestore::mb_str_split() is deprecated.', 1.8);
+
+ if (is_callable('mb_substr')) {
+ $length = mb_strlen($string);
+ $array = array();
+
+ while ($length) {
+ $array[] = mb_substr($string, 0, 1, $charset);
+ $string = mb_substr($string, 1, $length, $charset);
+
+ $length = mb_strlen($string);
+ }
+
+ return $array;
+ } else {
+ return str_split($string);
+ }
+ }
+ // @codingStandardsIgnoreEnd
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Construct a file path matrix for an entity.
+ *
+ * @param int $identifier The guide of the entity to store the data under.
+ *
+ * @return string The path where the entity's data will be stored.
+ * @deprecated 1.8 Use ElggDiskFilestore::makeFileMatrix()
+ */
+ protected function make_file_matrix($identifier) {
+ elgg_deprecated_notice('ElggDiskFilestore::make_file_matrix() is deprecated by ::makeFileMatrix()', 1.8);
+
+ return $this->makeFileMatrix($identifier);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Construct a file path matrix for an entity.
+ *
+ * @param int $guid The guide of the entity to store the data under.
+ *
+ * @return string The path where the entity's data will be stored.
+ */
+ protected function makeFileMatrix($guid) {
+ $entity = get_entity($guid);
+
+ if (!($entity instanceof ElggEntity) || !$entity->time_created) {
+ return false;
+ }
+
+ $time_created = date('Y/m/d', $entity->time_created);
+
+ return "$time_created/$entity->guid/";
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Construct a filename matrix.
+ *
+ * Generates a matrix using the entity's creation time and
+ * unique guid.
+ *
+ * File path matrixes are:
+ * YYYY/MM/DD/guid/
+ *
+ * @param int $guid The entity to contrust a matrix for
+ *
+ * @return string The
+ */
+ protected function user_file_matrix($guid) {
+ elgg_deprecated_notice('ElggDiskFilestore::user_file_matrix() is deprecated by ::makeFileMatrix()', 1.8);
+
+ return $this->makeFileMatrix($guid);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Returns a list of attributes to save to the database when saving
+ * the ElggFile object using this file store.
+ *
+ * @return array
+ */
+ public function getParameters() {
+ return array("dir_root" => $this->dir_root);
+ }
+
+ /**
+ * Sets parameters that should be saved to database.
+ *
+ * @param array $parameters Set parameters to save to DB for this filestore.
+ *
+ * @return bool
+ */
+ public function setParameters(array $parameters) {
+ if (isset($parameters['dir_root'])) {
+ $this->dir_root = $parameters['dir_root'];
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/engine/classes/ElggEntity.php b/engine/classes/ElggEntity.php
new file mode 100644
index 000000000..a563f6fad
--- /dev/null
+++ b/engine/classes/ElggEntity.php
@@ -0,0 +1,1770 @@
+<?php
+/**
+ * The parent class for all Elgg Entities.
+ *
+ * An ElggEntity is one of the basic data models in Elgg. It is the primary
+ * means of storing and retrieving data from the database. An ElggEntity
+ * represents one row of the entities table.
+ *
+ * The ElggEntity class handles CRUD operations for the entities table.
+ * ElggEntity should always be extended by another class to handle CRUD
+ * operations on the type-specific table.
+ *
+ * ElggEntity uses magic methods for get and set, so any property that isn't
+ * declared will be assumed to be metadata and written to the database
+ * as metadata on the object. All children classes must declare which
+ * properties are columns of the type table or they will be assumed
+ * to be metadata. See ElggObject::initialise_entities() for examples.
+ *
+ * Core supports 4 types of entities: ElggObject, ElggUser, ElggGroup, and
+ * ElggSite.
+ *
+ * @tip Most plugin authors will want to extend the ElggObject class
+ * instead of this class.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Entities
+ *
+ * @property string $type object, user, group, or site (read-only after save)
+ * @property string $subtype Further clarifies the nature of the entity (read-only after save)
+ * @property int $guid The unique identifier for this entity (read only)
+ * @property int $owner_guid The GUID of the creator of this entity
+ * @property int $container_guid The GUID of the entity containing this entity
+ * @property int $site_guid The GUID of the website this entity is associated with
+ * @property int $access_id Specifies the visibility level of this entity
+ * @property int $time_created A UNIX timestamp of when the entity was created (read-only, set on first save)
+ * @property int $time_updated A UNIX timestamp of when the entity was last updated (automatically updated on save)
+ * @property-read string $enabled
+ */
+abstract class ElggEntity extends ElggData implements
+ Notable, // Calendar interface
+ Locatable, // Geocoding interface
+ Importable // Allow import of data
+{
+
+ /**
+ * If set, overrides the value of getURL()
+ */
+ protected $url_override;
+
+ /**
+ * Icon override, overrides the value of getIcon().
+ */
+ protected $icon_override;
+
+ /**
+ * Holds metadata until entity is saved. Once the entity is saved,
+ * metadata are written immediately to the database.
+ */
+ protected $temp_metadata = array();
+
+ /**
+ * Holds annotations until entity is saved. Once the entity is saved,
+ * annotations are written immediately to the database.
+ */
+ protected $temp_annotations = array();
+
+ /**
+ * Holds private settings until entity is saved. Once the entity is saved,
+ * private settings are written immediately to the database.
+ */
+ protected $temp_private_settings = array();
+
+ /**
+ * Volatile data structure for this object, allows for storage of data
+ * in-memory that isn't sync'd back to the metadata table.
+ */
+ protected $volatile = array();
+
+ /**
+ * Initialize the attributes array.
+ *
+ * This is vital to distinguish between metadata and base parameters.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['guid'] = NULL;
+ $this->attributes['type'] = NULL;
+ $this->attributes['subtype'] = NULL;
+
+ $this->attributes['owner_guid'] = elgg_get_logged_in_user_guid();
+ $this->attributes['container_guid'] = elgg_get_logged_in_user_guid();
+
+ $this->attributes['site_guid'] = NULL;
+ $this->attributes['access_id'] = ACCESS_PRIVATE;
+ $this->attributes['time_created'] = NULL;
+ $this->attributes['time_updated'] = NULL;
+ $this->attributes['last_action'] = NULL;
+ $this->attributes['enabled'] = "yes";
+
+ // There now follows a bit of a hack
+ /* Problem: To speed things up, some objects are split over several tables,
+ * this means that it requires n number of database reads to fully populate
+ * an entity. This causes problems for caching and create events
+ * since it is not possible to tell whether a subclassed entity is complete.
+ *
+ * Solution: We have two counters, one 'tables_split' which tells whatever is
+ * interested how many tables are going to need to be searched in order to fully
+ * populate this object, and 'tables_loaded' which is how many have been
+ * loaded thus far.
+ *
+ * If the two are the same then this object is complete.
+ *
+ * Use: isFullyLoaded() to check
+ */
+ $this->attributes['tables_split'] = 1;
+ $this->attributes['tables_loaded'] = 0;
+ }
+
+ /**
+ * Clone an entity
+ *
+ * Resets the guid so that the entity can be saved as a distinct entity from
+ * the original. Creation time will be set when this new entity is saved.
+ * The owner and container guids come from the original entity. The clone
+ * method copies metadata but does not copy annotations or private settings.
+ *
+ * @note metadata will have its owner and access id set when the entity is saved
+ * and it will be the same as that of the entity.
+ *
+ * @return void
+ */
+ public function __clone() {
+ $orig_entity = get_entity($this->guid);
+ if (!$orig_entity) {
+ elgg_log("Failed to clone entity with GUID $this->guid", "ERROR");
+ return;
+ }
+
+ $metadata_array = elgg_get_metadata(array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ ));
+
+ $this->attributes['guid'] = "";
+
+ $this->attributes['subtype'] = $orig_entity->getSubtype();
+
+ // copy metadata over to new entity - slightly convoluted due to
+ // handling of metadata arrays
+ if (is_array($metadata_array)) {
+ // create list of metadata names
+ $metadata_names = array();
+ foreach ($metadata_array as $metadata) {
+ $metadata_names[] = $metadata['name'];
+ }
+ // arrays are stored with multiple enties per name
+ $metadata_names = array_unique($metadata_names);
+
+ // move the metadata over
+ foreach ($metadata_names as $name) {
+ $this->set($name, $orig_entity->$name);
+ }
+ }
+ }
+
+ /**
+ * Return the value of a property.
+ *
+ * If $name is defined in $this->attributes that value is returned, otherwise it will
+ * pull from the entity's metadata.
+ *
+ * Q: Why are we not using __get overload here?
+ * A: Because overload operators cause problems during subclassing, so we put the code here and
+ * create overloads in subclasses.
+ *
+ * @todo What problems are these?
+ *
+ * @warning Subtype is returned as an id rather than the subtype string. Use getSubtype()
+ * to get the subtype string.
+ *
+ * @param string $name Name
+ *
+ * @return mixed Returns the value of a given value, or null.
+ */
+ public function get($name) {
+ // See if its in our base attributes
+ if (array_key_exists($name, $this->attributes)) {
+ return $this->attributes[$name];
+ }
+
+ // No, so see if its in the meta data for this entity
+ $meta = $this->getMetaData($name);
+
+ // getMetaData returns NULL if $name is not found
+ return $meta;
+ }
+
+ /**
+ * Sets the value of a property.
+ *
+ * If $name is defined in $this->attributes that value is set, otherwise it is
+ * saved as metadata.
+ *
+ * @warning Metadata set this way will inherit the entity's owner and access ID. If you want
+ * to set metadata with a different owner, use create_metadata().
+ *
+ * @warning It is important that your class populates $this->attributes with keys
+ * for all base attributes, anything not in their gets set as METADATA.
+ *
+ * Q: Why are we not using __set overload here?
+ * A: Because overload operators cause problems during subclassing, so we put the code here and
+ * create overloads in subclasses.
+ *
+ * @todo What problems?
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return bool
+ */
+ public function set($name, $value) {
+ if (array_key_exists($name, $this->attributes)) {
+ // Certain properties should not be manually changed!
+ switch ($name) {
+ case 'guid':
+ case 'time_updated':
+ case 'last_action':
+ return FALSE;
+ break;
+ default:
+ $this->attributes[$name] = $value;
+ break;
+ }
+ } else {
+ return $this->setMetaData($name, $value);
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Return the value of a piece of metadata.
+ *
+ * @param string $name Name
+ *
+ * @return mixed The value, or NULL if not found.
+ */
+ public function getMetaData($name) {
+ $guid = $this->getGUID();
+
+ if (! $guid) {
+ if (isset($this->temp_metadata[$name])) {
+ // md is returned as an array only if more than 1 entry
+ if (count($this->temp_metadata[$name]) == 1) {
+ return $this->temp_metadata[$name][0];
+ } else {
+ return $this->temp_metadata[$name];
+ }
+ } else {
+ return null;
+ }
+ }
+
+ // upon first cache miss, just load/cache all the metadata and retry.
+ // if this works, the rest of this function may not be needed!
+ $cache = elgg_get_metadata_cache();
+ if ($cache->isKnown($guid, $name)) {
+ return $cache->load($guid, $name);
+ } else {
+ $cache->populateFromEntities(array($guid));
+ // in case ignore_access was on, we have to check again...
+ if ($cache->isKnown($guid, $name)) {
+ return $cache->load($guid, $name);
+ }
+ }
+
+ $md = elgg_get_metadata(array(
+ 'guid' => $guid,
+ 'metadata_name' => $name,
+ 'limit' => 0,
+ ));
+
+ $value = null;
+
+ if ($md && !is_array($md)) {
+ $value = $md->value;
+ } elseif (count($md) == 1) {
+ $value = $md[0]->value;
+ } else if ($md && is_array($md)) {
+ $value = metadata_array_to_values($md);
+ }
+
+ $cache->save($guid, $name, $value);
+
+ return $value;
+ }
+
+ /**
+ * Unset a property from metadata or attribute.
+ *
+ * @warning If you use this to unset an attribute, you must save the object!
+ *
+ * @param string $name The name of the attribute or metadata.
+ *
+ * @return void
+ */
+ function __unset($name) {
+ if (array_key_exists($name, $this->attributes)) {
+ $this->attributes[$name] = "";
+ } else {
+ $this->deleteMetadata($name);
+ }
+ }
+
+ /**
+ * Set a piece of metadata.
+ *
+ * Plugin authors should use the magic methods or create_metadata().
+ *
+ * @warning The metadata will inherit the parent entity's owner and access ID.
+ * If you want to write metadata with a different owner, use create_metadata().
+ *
+ * @access private
+ *
+ * @param string $name Name of the metadata
+ * @param mixed $value Value of the metadata (doesn't support assoc arrays)
+ * @param string $value_type Types supported: integer and string. Will auto-identify if not set
+ * @param bool $multiple Allow multiple values for a single name (doesn't support assoc arrays)
+ *
+ * @return bool
+ */
+ public function setMetaData($name, $value, $value_type = null, $multiple = false) {
+
+ // normalize value to an array that we will loop over
+ // remove indexes if value already an array.
+ if (is_array($value)) {
+ $value = array_values($value);
+ } else {
+ $value = array($value);
+ }
+
+ // saved entity. persist md to db.
+ if ($this->guid) {
+ // if overwriting, delete first.
+ if (!$multiple) {
+ $options = array(
+ 'guid' => $this->getGUID(),
+ 'metadata_name' => $name,
+ 'limit' => 0
+ );
+ // @todo in 1.9 make this return false if can't add metadata
+ // https://github.com/elgg/elgg/issues/4520
+ //
+ // need to remove access restrictions right now to delete
+ // because this is the expected behavior
+ $ia = elgg_set_ignore_access(true);
+ if (false === elgg_delete_metadata($options)) {
+ return false;
+ }
+ elgg_set_ignore_access($ia);
+ }
+
+ // add new md
+ $result = true;
+ foreach ($value as $value_tmp) {
+ // at this point $value should be appended because it was cleared above if needed.
+ $md_id = create_metadata($this->getGUID(), $name, $value_tmp, $value_type,
+ $this->getOwnerGUID(), $this->getAccessId(), true);
+ if (!$md_id) {
+ return false;
+ }
+ }
+
+ return $result;
+ } else {
+ // unsaved entity. store in temp array
+ // returning single entries instead of an array of 1 element is decided in
+ // getMetaData(), just like pulling from the db.
+ //
+ // if overwrite, delete first
+ if (!$multiple || !isset($this->temp_metadata[$name])) {
+ $this->temp_metadata[$name] = array();
+ }
+
+ // add new md
+ $this->temp_metadata[$name] = array_merge($this->temp_metadata[$name], $value);
+ return true;
+ }
+ }
+
+ /**
+ * Deletes all metadata on this object (metadata.entity_guid = $this->guid).
+ * If you pass a name, only metadata matching that name will be deleted.
+ *
+ * @warning Calling this with no $name will clear all metadata on the entity.
+ *
+ * @param null|string $name The name of the metadata to remove.
+ * @return bool
+ * @since 1.8
+ */
+ public function deleteMetadata($name = null) {
+
+ if (!$this->guid) {
+ return false;
+ }
+
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['metadata_name'] = $name;
+ }
+
+ return elgg_delete_metadata($options);
+ }
+
+ /**
+ * Deletes all metadata owned by this object (metadata.owner_guid = $this->guid).
+ * If you pass a name, only metadata matching that name will be deleted.
+ *
+ * @param null|string $name The name of metadata to delete.
+ * @return bool
+ * @since 1.8
+ */
+ public function deleteOwnedMetadata($name = null) {
+ // access is turned off for this because they might
+ // no longer have access to an entity they created metadata on.
+ $ia = elgg_set_ignore_access(true);
+ $options = array(
+ 'metadata_owner_guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['metadata_name'] = $name;
+ }
+
+ $r = elgg_delete_metadata($options);
+ elgg_set_ignore_access($ia);
+ return $r;
+ }
+
+ /**
+ * Remove metadata
+ *
+ * @warning Calling this with no or empty arguments will clear all metadata on the entity.
+ *
+ * @param string $name The name of the metadata to clear
+ * @return mixed bool
+ * @deprecated 1.8 Use deleteMetadata()
+ */
+ public function clearMetaData($name = '') {
+ elgg_deprecated_notice('ElggEntity->clearMetadata() is deprecated by ->deleteMetadata()', 1.8);
+ return $this->deleteMetadata($name);
+ }
+
+ /**
+ * Disables metadata for this entity, optionally based on name.
+ *
+ * @param string $name An options name of metadata to disable.
+ * @return bool
+ * @since 1.8
+ */
+ public function disableMetadata($name = '') {
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['metadata_name'] = $name;
+ }
+
+ return elgg_disable_metadata($options);
+ }
+
+ /**
+ * Enables metadata for this entity, optionally based on name.
+ *
+ * @warning Before calling this, you must use {@link access_show_hidden_entities()}
+ *
+ * @param string $name An options name of metadata to enable.
+ * @return bool
+ * @since 1.8
+ */
+ public function enableMetadata($name = '') {
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['metadata_name'] = $name;
+ }
+
+ return elgg_enable_metadata($options);
+ }
+
+ /**
+ * Get a piece of volatile (non-persisted) data on this entity.
+ *
+ * @param string $name The name of the volatile data
+ *
+ * @return mixed The value or NULL if not found.
+ */
+ public function getVolatileData($name) {
+ if (!is_array($this->volatile)) {
+ $this->volatile = array();
+ }
+
+ if (array_key_exists($name, $this->volatile)) {
+ return $this->volatile[$name];
+ } else {
+ return NULL;
+ }
+ }
+
+ /**
+ * Set a piece of volatile (non-persisted) data on this entity
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ public function setVolatileData($name, $value) {
+ if (!is_array($this->volatile)) {
+ $this->volatile = array();
+ }
+
+ $this->volatile[$name] = $value;
+ }
+
+ /**
+ * Remove all relationships to and from this entity.
+ *
+ * @return true
+ * @todo This should actually return if it worked.
+ * @see ElggEntity::addRelationship()
+ * @see ElggEntity::removeRelationship()
+ */
+ public function deleteRelationships() {
+ remove_entity_relationships($this->getGUID());
+ remove_entity_relationships($this->getGUID(), "", true);
+ return true;
+ }
+
+ /**
+ * Remove all relationships to and from this entity.
+ *
+ * @return bool
+ * @see ElggEntity::addRelationship()
+ * @see ElggEntity::removeRelationship()
+ * @deprecated 1.8 Use ->deleteRelationship()
+ */
+ public function clearRelationships() {
+ elgg_deprecated_notice('ElggEntity->clearRelationships() is deprecated by ->deleteRelationships()', 1.8);
+ return $this->deleteRelationships();
+ }
+
+ /**
+ * Add a relationship between this an another entity.
+ *
+ * @tip Read the relationship like "$guid is a $relationship of this entity."
+ *
+ * @param int $guid Entity to link to.
+ * @param string $relationship The type of relationship.
+ *
+ * @return bool
+ * @see ElggEntity::removeRelationship()
+ * @see ElggEntity::clearRelationships()
+ */
+ public function addRelationship($guid, $relationship) {
+ return add_entity_relationship($this->getGUID(), $relationship, $guid);
+ }
+
+ /**
+ * Remove a relationship
+ *
+ * @param int $guid GUID of the entity to make a relationship with
+ * @param str $relationship Name of relationship
+ *
+ * @return bool
+ * @see ElggEntity::addRelationship()
+ * @see ElggEntity::clearRelationships()
+ */
+ public function removeRelationship($guid, $relationship) {
+ return remove_entity_relationship($this->getGUID(), $relationship, $guid);
+ }
+
+ /**
+ * Adds a private setting to this entity.
+ *
+ * Private settings are similar to metadata but will not
+ * be searched and there are fewer helper functions for them.
+ *
+ * @param string $name Name of private setting
+ * @param mixed $value Value of private setting
+ *
+ * @return bool
+ */
+ function setPrivateSetting($name, $value) {
+ if ((int) $this->guid > 0) {
+ return set_private_setting($this->getGUID(), $name, $value);
+ } else {
+ $this->temp_private_settings[$name] = $value;
+ return true;
+ }
+ }
+
+ /**
+ * Returns a private setting value
+ *
+ * @param string $name Name of the private setting
+ *
+ * @return mixed
+ */
+ function getPrivateSetting($name) {
+ if ((int) ($this->guid) > 0) {
+ return get_private_setting($this->getGUID(), $name);
+ } else {
+ if (isset($this->temp_private_settings[$name])) {
+ return $this->temp_private_settings[$name];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Removes private setting
+ *
+ * @param string $name Name of the private setting
+ *
+ * @return bool
+ */
+ function removePrivateSetting($name) {
+ return remove_private_setting($this->getGUID(), $name);
+ }
+
+ /**
+ * Deletes all annotations on this object (annotations.entity_guid = $this->guid).
+ * If you pass a name, only annotations matching that name will be deleted.
+ *
+ * @warning Calling this with no or empty arguments will clear all annotations on the entity.
+ *
+ * @param null|string $name The annotations name to remove.
+ * @return bool
+ * @since 1.8
+ */
+ public function deleteAnnotations($name = null) {
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ return elgg_delete_annotations($options);
+ }
+
+ /**
+ * Deletes all annotations owned by this object (annotations.owner_guid = $this->guid).
+ * If you pass a name, only annotations matching that name will be deleted.
+ *
+ * @param null|string $name The name of annotations to delete.
+ * @return bool
+ * @since 1.8
+ */
+ public function deleteOwnedAnnotations($name = null) {
+ // access is turned off for this because they might
+ // no longer have access to an entity they created annotations on.
+ $ia = elgg_set_ignore_access(true);
+ $options = array(
+ 'annotation_owner_guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ $r = elgg_delete_annotations($options);
+ elgg_set_ignore_access($ia);
+ return $r;
+ }
+
+ /**
+ * Disables annotations for this entity, optionally based on name.
+ *
+ * @param string $name An options name of annotations to disable.
+ * @return bool
+ * @since 1.8
+ */
+ public function disableAnnotations($name = '') {
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ return elgg_disable_annotations($options);
+ }
+
+ /**
+ * Enables annotations for this entity, optionally based on name.
+ *
+ * @warning Before calling this, you must use {@link access_show_hidden_entities()}
+ *
+ * @param string $name An options name of annotations to enable.
+ * @return bool
+ * @since 1.8
+ */
+ public function enableAnnotations($name = '') {
+ $options = array(
+ 'guid' => $this->guid,
+ 'limit' => 0
+ );
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ return elgg_enable_annotations($options);
+ }
+
+ /**
+ * Helper function to return annotation calculation results
+ *
+ * @param string $name The annotation name.
+ * @param string $calculation A valid MySQL function to run its values through
+ * @return mixed
+ */
+ private function getAnnotationCalculation($name, $calculation) {
+ $options = array(
+ 'guid' => $this->getGUID(),
+ 'annotation_name' => $name,
+ 'annotation_calculation' => $calculation
+ );
+
+ return elgg_get_annotations($options);
+ }
+
+ /**
+ * Adds an annotation to an entity.
+ *
+ * @warning By default, annotations are private.
+ *
+ * @warning Annotating an unsaved entity more than once with the same name
+ * will only save the last annotation.
+ *
+ * @param string $name Annotation name
+ * @param mixed $value Annotation value
+ * @param int $access_id Access ID
+ * @param int $owner_id GUID of the annotation owner
+ * @param string $vartype The type of annotation value
+ *
+ * @return bool
+ */
+ function annotate($name, $value, $access_id = ACCESS_PRIVATE, $owner_id = 0, $vartype = "") {
+ if ((int) $this->guid > 0) {
+ return create_annotation($this->getGUID(), $name, $value, $vartype, $owner_id, $access_id);
+ } else {
+ $this->temp_annotations[$name] = $value;
+ }
+ return true;
+ }
+
+ /**
+ * Returns an array of annotations.
+ *
+ * @param string $name Annotation name
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order Order by time: asc or desc
+ *
+ * @return array
+ */
+ function getAnnotations($name, $limit = 50, $offset = 0, $order = "asc") {
+ if ((int) ($this->guid) > 0) {
+
+ $options = array(
+ 'guid' => $this->guid,
+ 'annotation_name' => $name,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ );
+
+ if ($order != 'asc') {
+ $options['reverse_order_by'] = true;
+ }
+
+ return elgg_get_annotations($options);
+ } else if (isset($this->temp_annotations[$name])) {
+ return array($this->temp_annotations[$name]);
+ } else {
+ return array();
+ }
+ }
+
+ /**
+ * Remove an annotation or all annotations for this entity.
+ *
+ * @warning Calling this method with no or an empty argument will remove
+ * all annotations on the entity.
+ *
+ * @param string $name Annotation name
+ * @return bool
+ * @deprecated 1.8 Use ->deleteAnnotations()
+ */
+ function clearAnnotations($name = "") {
+ elgg_deprecated_notice('ElggEntity->clearAnnotations() is deprecated by ->deleteAnnotations()', 1.8);
+ return $this->deleteAnnotations($name);
+ }
+
+ /**
+ * Count annotations.
+ *
+ * @param string $name The type of annotation.
+ *
+ * @return int
+ */
+ function countAnnotations($name = "") {
+ return $this->getAnnotationCalculation($name, 'count');
+ }
+
+ /**
+ * Get the average of an integer type annotation.
+ *
+ * @param string $name Annotation name
+ *
+ * @return int
+ */
+ function getAnnotationsAvg($name) {
+ return $this->getAnnotationCalculation($name, 'avg');
+ }
+
+ /**
+ * Get the sum of integer type annotations of a given name.
+ *
+ * @param string $name Annotation name
+ *
+ * @return int
+ */
+ function getAnnotationsSum($name) {
+ return $this->getAnnotationCalculation($name, 'sum');
+ }
+
+ /**
+ * Get the minimum of integer type annotations of given name.
+ *
+ * @param string $name Annotation name
+ *
+ * @return int
+ */
+ function getAnnotationsMin($name) {
+ return $this->getAnnotationCalculation($name, 'min');
+ }
+
+ /**
+ * Get the maximum of integer type annotations of a given name.
+ *
+ * @param string $name Annotation name
+ *
+ * @return int
+ */
+ function getAnnotationsMax($name) {
+ return $this->getAnnotationCalculation($name, 'max');
+ }
+
+ /**
+ * Count the number of comments attached to this entity.
+ *
+ * @return int Number of comments
+ * @since 1.8.0
+ */
+ function countComments() {
+ $params = array('entity' => $this);
+ $num = elgg_trigger_plugin_hook('comments:count', $this->getType(), $params);
+
+ if (is_int($num)) {
+ return $num;
+ } else {
+ return $this->getAnnotationCalculation('generic_comment', 'count');
+ }
+ }
+
+ /**
+ * Gets an array of entities with a relationship to this entity.
+ *
+ * @param string $relationship Relationship type (eg "friends")
+ * @param bool $inverse Is this an inverse relationship?
+ * @param int $limit Number of elements to return
+ * @param int $offset Indexing offset
+ *
+ * @return array|false An array of entities or false on failure
+ */
+ function getEntitiesFromRelationship($relationship, $inverse = false, $limit = 50, $offset = 0) {
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => $relationship,
+ 'relationship_guid' => $this->getGUID(),
+ 'inverse_relationship' => $inverse,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+ }
+
+ /**
+ * Gets the number of of entities from a specific relationship type
+ *
+ * @param string $relationship Relationship type (eg "friends")
+ * @param bool $inverse_relationship Invert relationship
+ *
+ * @return int|false The number of entities or false on failure
+ */
+ function countEntitiesFromRelationship($relationship, $inverse_relationship = FALSE) {
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => $relationship,
+ 'relationship_guid' => $this->getGUID(),
+ 'inverse_relationship' => $inverse_relationship,
+ 'count' => TRUE
+ ));
+ }
+
+ /**
+ * Can a user edit this entity.
+ *
+ * @param int $user_guid The user GUID, optionally (default: logged in user)
+ *
+ * @return bool
+ */
+ function canEdit($user_guid = 0) {
+ return can_edit_entity($this->getGUID(), $user_guid);
+ }
+
+ /**
+ * Can a user edit metadata on this entity
+ *
+ * @param ElggMetadata $metadata The piece of metadata to specifically check
+ * @param int $user_guid The user GUID, optionally (default: logged in user)
+ *
+ * @return bool
+ */
+ function canEditMetadata($metadata = null, $user_guid = 0) {
+ return can_edit_entity_metadata($this->getGUID(), $user_guid, $metadata);
+ }
+
+ /**
+ * Can a user add an entity to this container
+ *
+ * @param int $user_guid The user.
+ * @param string $type The type of entity we're looking to write
+ * @param string $subtype The subtype of the entity we're looking to write
+ *
+ * @return bool
+ */
+ public function canWriteToContainer($user_guid = 0, $type = 'all', $subtype = 'all') {
+ return can_write_to_container($user_guid, $this->guid, $type, $subtype);
+ }
+
+ /**
+ * Can a user comment on an entity?
+ *
+ * @tip Can be overridden by registering for the permissions_check:comment,
+ * <entity type> plugin hook.
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ *
+ * @return bool
+ */
+ public function canComment($user_guid = 0) {
+ if ($user_guid == 0) {
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+ $user = get_entity($user_guid);
+
+ // By default, we don't take a position of whether commenting is allowed
+ // because it is handled by the subclasses of ElggEntity
+ $params = array('entity' => $this, 'user' => $user);
+ return elgg_trigger_plugin_hook('permissions_check:comment', $this->type, $params, null);
+ }
+
+ /**
+ * Can a user annotate an entity?
+ *
+ * @tip Can be overridden by registering for the permissions_check:annotate,
+ * <entity type> plugin hook.
+ *
+ * @tip If you want logged out users to annotate an object, do not call
+ * canAnnotate(). It's easier than using the plugin hook.
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @param string $annotation_name The name of the annotation (default is unspecified)
+ *
+ * @return bool
+ */
+ public function canAnnotate($user_guid = 0, $annotation_name = '') {
+ if ($user_guid == 0) {
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+ $user = get_entity($user_guid);
+
+ $return = true;
+ if (!$user) {
+ $return = false;
+ }
+
+ $params = array(
+ 'entity' => $this,
+ 'user' => $user,
+ 'annotation_name' => $annotation_name,
+ );
+ return elgg_trigger_plugin_hook('permissions_check:annotate', $this->type, $params, $return);
+ }
+
+ /**
+ * Returns the access_id.
+ *
+ * @return int The access ID
+ */
+ public function getAccessID() {
+ return $this->get('access_id');
+ }
+
+ /**
+ * Returns the guid.
+ *
+ * @return int|null GUID
+ */
+ public function getGUID() {
+ return $this->get('guid');
+ }
+
+ /**
+ * Returns the entity type
+ *
+ * @return string Entity type
+ */
+ public function getType() {
+ return $this->get('type');
+ }
+
+ /**
+ * Returns the entity subtype string
+ *
+ * @note This returns a string. If you want the id, use ElggEntity::subtype.
+ *
+ * @return string The entity subtype
+ */
+ public function getSubtype() {
+ // If this object hasn't been saved, then return the subtype string.
+ if (!((int) $this->guid > 0)) {
+ return $this->get('subtype');
+ }
+
+ return get_subtype_from_id($this->get('subtype'));
+ }
+
+ /**
+ * Get the guid of the entity's owner.
+ *
+ * @return int The owner GUID
+ */
+ public function getOwnerGUID() {
+ return $this->owner_guid;
+ }
+
+ /**
+ * Return the guid of the entity's owner.
+ *
+ * @return int The owner GUID
+ * @deprecated 1.8 Use getOwnerGUID()
+ */
+ public function getOwner() {
+ elgg_deprecated_notice("ElggEntity::getOwner deprecated for ElggEntity::getOwnerGUID", 1.8);
+ return $this->getOwnerGUID();
+ }
+
+ /**
+ * Gets the ElggEntity that owns this entity.
+ *
+ * @return ElggEntity The owning entity
+ */
+ public function getOwnerEntity() {
+ return get_entity($this->owner_guid);
+ }
+
+ /**
+ * Set the container for this object.
+ *
+ * @param int $container_guid The ID of the container.
+ *
+ * @return bool
+ */
+ public function setContainerGUID($container_guid) {
+ $container_guid = (int)$container_guid;
+
+ return $this->set('container_guid', $container_guid);
+ }
+
+ /**
+ * Set the container for this object.
+ *
+ * @param int $container_guid The ID of the container.
+ *
+ * @return bool
+ * @deprecated 1.8 use setContainerGUID()
+ */
+ public function setContainer($container_guid) {
+ elgg_deprecated_notice("ElggObject::setContainer deprecated for ElggEntity::setContainerGUID", 1.8);
+ $container_guid = (int)$container_guid;
+
+ return $this->set('container_guid', $container_guid);
+ }
+
+ /**
+ * Gets the container GUID for this entity.
+ *
+ * @return int
+ */
+ public function getContainerGUID() {
+ return $this->get('container_guid');
+ }
+
+ /**
+ * Gets the container GUID for this entity.
+ *
+ * @return int
+ * @deprecated 1.8 Use getContainerGUID()
+ */
+ public function getContainer() {
+ elgg_deprecated_notice("ElggObject::getContainer deprecated for ElggEntity::getContainerGUID", 1.8);
+ return $this->get('container_guid');
+ }
+
+ /**
+ * Get the container entity for this object.
+ *
+ * @return ElggEntity
+ * @since 1.8.0
+ */
+ public function getContainerEntity() {
+ return get_entity($this->getContainerGUID());
+ }
+
+ /**
+ * Returns the UNIX epoch time that this entity was last updated
+ *
+ * @return int UNIX epoch time
+ */
+ public function getTimeUpdated() {
+ return $this->get('time_updated');
+ }
+
+ /**
+ * Returns the URL for this entity
+ *
+ * @return string The URL
+ * @see register_entity_url_handler()
+ * @see ElggEntity::setURL()
+ */
+ public function getURL() {
+ if (!empty($this->url_override)) {
+ return $this->url_override;
+ }
+ return get_entity_url($this->getGUID());
+ }
+
+ /**
+ * Overrides the URL returned by getURL()
+ *
+ * @warning This override exists only for the life of the object.
+ *
+ * @param string $url The new item URL
+ *
+ * @return string The URL
+ */
+ public function setURL($url) {
+ $this->url_override = $url;
+ return $url;
+ }
+
+ /**
+ * Get the URL for this entity's icon
+ *
+ * Plugins can register for the 'entity:icon:url', <type> plugin hook
+ * to customize the icon for an entity.
+ *
+ * @param string $size Size of the icon: tiny, small, medium, large
+ *
+ * @return string The URL
+ * @since 1.8.0
+ */
+ public function getIconURL($size = 'medium') {
+ $size = elgg_strtolower($size);
+
+ if (isset($this->icon_override[$size])) {
+ elgg_deprecated_notice("icon_override on an individual entity is deprecated", 1.8);
+ return $this->icon_override[$size];
+ }
+
+ $type = $this->getType();
+ $params = array(
+ 'entity' => $this,
+ 'size' => $size,
+ );
+
+ $url = elgg_trigger_plugin_hook('entity:icon:url', $type, $params, null);
+ if ($url == null) {
+ $url = "_graphics/icons/default/$size.png";
+ }
+
+ return elgg_normalize_url($url);
+ }
+
+ /**
+ * Returns a URL for the entity's icon.
+ *
+ * @param string $size Either 'large', 'medium', 'small' or 'tiny'
+ *
+ * @return string The url or false if no url could be worked out.
+ * @deprecated Use getIconURL()
+ */
+ public function getIcon($size = 'medium') {
+ elgg_deprecated_notice("getIcon() deprecated by getIconURL()", 1.8);
+ return $this->getIconURL($size);
+ }
+
+ /**
+ * Set an icon override for an icon and size.
+ *
+ * @warning This override exists only for the life of the object.
+ *
+ * @param string $url The url of the icon.
+ * @param string $size The size its for.
+ *
+ * @return bool
+ * @deprecated 1.8 See getIconURL() for the plugin hook to use
+ */
+ public function setIcon($url, $size = 'medium') {
+ elgg_deprecated_notice("icon_override on an individual entity is deprecated", 1.8);
+
+ $url = sanitise_string($url);
+ $size = sanitise_string($size);
+
+ if (!$this->icon_override) {
+ $this->icon_override = array();
+ }
+ $this->icon_override[$size] = $url;
+
+ return true;
+ }
+
+ /**
+ * Tests to see whether the object has been fully loaded.
+ *
+ * @return bool
+ */
+ public function isFullyLoaded() {
+ return ! ($this->attributes['tables_loaded'] < $this->attributes['tables_split']);
+ }
+
+ /**
+ * Save an entity.
+ *
+ * @return bool|int
+ * @throws IOException
+ */
+ public function save() {
+ $guid = $this->getGUID();
+ if ($guid > 0) {
+
+ // See #5600. This ensures the lower level can_edit_entity() check will use a
+ // fresh entity from the DB so it sees the persisted owner_guid
+ _elgg_disable_caching_for_entity($guid);
+
+ $ret = update_entity(
+ $guid,
+ $this->get('owner_guid'),
+ $this->get('access_id'),
+ $this->get('container_guid'),
+ $this->get('time_created')
+ );
+
+ _elgg_enable_caching_for_entity($guid);
+ _elgg_cache_entity($this);
+
+ return $ret;
+ } else {
+ // Create a new entity (nb: using attribute array directly
+ // 'cos set function does something special!)
+ $this->attributes['guid'] = create_entity($this->attributes['type'],
+ $this->attributes['subtype'], $this->attributes['owner_guid'],
+ $this->attributes['access_id'], $this->attributes['site_guid'],
+ $this->attributes['container_guid']);
+
+ if (!$this->attributes['guid']) {
+ throw new IOException(elgg_echo('IOException:BaseEntitySaveFailed'));
+ }
+
+ // Save any unsaved metadata
+ // @todo How to capture extra information (access id etc)
+ if (sizeof($this->temp_metadata) > 0) {
+ foreach ($this->temp_metadata as $name => $value) {
+ $this->$name = $value;
+ unset($this->temp_metadata[$name]);
+ }
+ }
+
+ // Save any unsaved annotations.
+ if (sizeof($this->temp_annotations) > 0) {
+ foreach ($this->temp_annotations as $name => $value) {
+ $this->annotate($name, $value);
+ unset($this->temp_annotations[$name]);
+ }
+ }
+
+ // Save any unsaved private settings.
+ if (sizeof($this->temp_private_settings) > 0) {
+ foreach ($this->temp_private_settings as $name => $value) {
+ $this->setPrivateSetting($name, $value);
+ unset($this->temp_private_settings[$name]);
+ }
+ }
+
+ // set the subtype to id now rather than a string
+ $this->attributes['subtype'] = get_subtype_id($this->attributes['type'],
+ $this->attributes['subtype']);
+
+ _elgg_cache_entity($this);
+
+ return $this->attributes['guid'];
+ }
+ }
+
+ /**
+ * Loads attributes from the entities table into the object.
+ *
+ * @param mixed $guid GUID of entity or stdClass object from entities table
+ *
+ * @return bool
+ */
+ protected function load($guid) {
+ if ($guid instanceof stdClass) {
+ $row = $guid;
+ } else {
+ $row = get_entity_as_row($guid);
+ }
+
+ if ($row) {
+ // Create the array if necessary - all subclasses should test before creating
+ if (!is_array($this->attributes)) {
+ $this->attributes = array();
+ }
+
+ // Now put these into the attributes array as core values
+ $objarray = (array) $row;
+ foreach ($objarray as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+
+ // Increment the portion counter
+ if (!$this->isFullyLoaded()) {
+ $this->attributes['tables_loaded']++;
+ }
+
+ // guid needs to be an int https://github.com/elgg/elgg/issues/4111
+ $this->attributes['guid'] = (int)$this->attributes['guid'];
+
+ // Cache object handle
+ if ($this->attributes['guid']) {
+ _elgg_cache_entity($this);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Disable this entity.
+ *
+ * Disabled entities are not returned by getter functions.
+ * To enable an entity, use {@link enable_entity()}.
+ *
+ * Recursively disabling an entity will disable all entities
+ * owned or contained by the parent entity.
+ *
+ * @internal Disabling an entity sets the 'enabled' column to 'no'.
+ *
+ * @param string $reason Optional reason
+ * @param bool $recursive Recursively disable all contained entities?
+ *
+ * @return bool
+ * @see enable_entity()
+ * @see ElggEntity::enable()
+ */
+ public function disable($reason = "", $recursive = true) {
+ if ($r = disable_entity($this->get('guid'), $reason, $recursive)) {
+ $this->attributes['enabled'] = 'no';
+ }
+
+ return $r;
+ }
+
+ /**
+ * Enable an entity
+ *
+ * @warning Disabled entities can't be loaded unless
+ * {@link access_show_hidden_entities(true)} has been called.
+ *
+ * @see enable_entity()
+ * @see access_show_hiden_entities()
+ * @return bool
+ */
+ public function enable() {
+ if ($r = enable_entity($this->get('guid'))) {
+ $this->attributes['enabled'] = 'yes';
+ }
+
+ return $r;
+ }
+
+ /**
+ * Is this entity enabled?
+ *
+ * @return boolean
+ */
+ public function isEnabled() {
+ if ($this->enabled == 'yes') {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Delete this entity.
+ *
+ * @param bool $recursive Whether to delete all the entities contained by this entity
+ *
+ * @return bool
+ */
+ public function delete($recursive = true) {
+ return delete_entity($this->get('guid'), $recursive);
+ }
+
+ /*
+ * LOCATABLE INTERFACE
+ */
+
+ /**
+ * Gets the 'location' metadata for the entity
+ *
+ * @return string The location
+ */
+ public function getLocation() {
+ return $this->location;
+ }
+
+ /**
+ * Sets the 'location' metadata for the entity
+ *
+ * @todo Unimplemented
+ *
+ * @param string $location String representation of the location
+ *
+ * @return bool
+ */
+ public function setLocation($location) {
+ $this->location = $location;
+ return true;
+ }
+
+ /**
+ * Set latitude and longitude metadata tags for a given entity.
+ *
+ * @param float $lat Latitude
+ * @param float $long Longitude
+ *
+ * @return bool
+ * @todo Unimplemented
+ */
+ public function setLatLong($lat, $long) {
+ $this->set('geo:lat', $lat);
+ $this->set('geo:long', $long);
+
+ return true;
+ }
+
+ /**
+ * Return the entity's latitude.
+ *
+ * @return float
+ * @todo Unimplemented
+ */
+ public function getLatitude() {
+ return (float)$this->get('geo:lat');
+ }
+
+ /**
+ * Return the entity's longitude
+ *
+ * @return float
+ */
+ public function getLongitude() {
+ return (float)$this->get('geo:long');
+ }
+
+ /*
+ * NOTABLE INTERFACE
+ */
+
+ /**
+ * Set the time and duration of an object
+ *
+ * @param int $hour If ommitted, now is assumed.
+ * @param int $minute If ommitted, now is assumed.
+ * @param int $second If ommitted, now is assumed.
+ * @param int $day If ommitted, now is assumed.
+ * @param int $month If ommitted, now is assumed.
+ * @param int $year If ommitted, now is assumed.
+ * @param int $duration Duration of event, remainder of the day is assumed.
+ *
+ * @return true
+ * @todo Unimplemented
+ */
+ public function setCalendarTimeAndDuration($hour = NULL, $minute = NULL, $second = NULL,
+ $day = NULL, $month = NULL, $year = NULL, $duration = NULL) {
+
+ $start = mktime($hour, $minute, $second, $month, $day, $year);
+ $end = $start + abs($duration);
+ if (!$duration) {
+ $end = get_day_end($day, $month, $year);
+ }
+
+ $this->calendar_start = $start;
+ $this->calendar_end = $end;
+
+ return true;
+ }
+
+ /**
+ * Returns the start timestamp.
+ *
+ * @return int
+ * @todo Unimplemented
+ */
+ public function getCalendarStartTime() {
+ return (int)$this->calendar_start;
+ }
+
+ /**
+ * Returns the end timestamp.
+ *
+ * @todo Unimplemented
+ *
+ * @return int
+ */
+ public function getCalendarEndTime() {
+ return (int)$this->calendar_end;
+ }
+
+ /*
+ * EXPORTABLE INTERFACE
+ */
+
+ /**
+ * Returns an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array(
+ 'guid',
+ 'type',
+ 'subtype',
+ 'time_created',
+ 'time_updated',
+ 'container_guid',
+ 'owner_guid',
+ 'site_guid'
+ );
+ }
+
+ /**
+ * Export this class into an array of ODD Elements containing all necessary fields.
+ * Override if you wish to return more information than can be found in
+ * $this->attributes (shouldn't happen)
+ *
+ * @return array
+ */
+ public function export() {
+ $tmp = array();
+
+ // Generate uuid
+ $uuid = guid_to_uuid($this->getGUID());
+
+ // Create entity
+ $odd = new ODDEntity(
+ $uuid,
+ $this->attributes['type'],
+ get_subtype_from_id($this->attributes['subtype'])
+ );
+
+ $tmp[] = $odd;
+
+ $exportable_values = $this->getExportableValues();
+
+ // Now add its attributes
+ foreach ($this->attributes as $k => $v) {
+ $meta = NULL;
+
+ if (in_array($k, $exportable_values)) {
+ switch ($k) {
+ case 'guid': // Dont use guid in OpenDD
+ case 'type': // Type and subtype already taken care of
+ case 'subtype':
+ break;
+
+ case 'time_created': // Created = published
+ $odd->setAttribute('published', date("r", $v));
+ break;
+
+ case 'site_guid': // Container
+ $k = 'site_uuid';
+ $v = guid_to_uuid($v);
+ $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
+ break;
+
+ case 'container_guid': // Container
+ $k = 'container_uuid';
+ $v = guid_to_uuid($v);
+ $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
+ break;
+
+ case 'owner_guid': // Convert owner guid to uuid, this will be stored in metadata
+ $k = 'owner_uuid';
+ $v = guid_to_uuid($v);
+ $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
+ break;
+
+ default:
+ $meta = new ODDMetaData($uuid . "attr/$k/", $uuid, $k, $v);
+ }
+
+ // set the time of any metadata created
+ if ($meta) {
+ $meta->setAttribute('published', date("r", $this->time_created));
+ $tmp[] = $meta;
+ }
+ }
+ }
+
+ // Now we do something a bit special.
+ /*
+ * This provides a rendered view of the entity to foreign sites.
+ */
+
+ elgg_set_viewtype('default');
+ $view = elgg_view_entity($this, array('full_view' => true));
+ elgg_set_viewtype();
+
+ $tmp[] = new ODDMetaData($uuid . "volatile/renderedentity/", $uuid,
+ 'renderedentity', $view, 'volatile');
+
+ return $tmp;
+ }
+
+ /*
+ * IMPORTABLE INTERFACE
+ */
+
+ /**
+ * Import data from an parsed ODD xml data array.
+ *
+ * @param ODD $data XML data
+ *
+ * @return true
+ *
+ * @throws InvalidParameterException
+ */
+ public function import(ODD $data) {
+ if (!($data instanceof ODDEntity)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnexpectedODDClass'));
+ }
+
+ // Set type and subtype
+ $this->attributes['type'] = $data->getAttribute('class');
+ $this->attributes['subtype'] = $data->getAttribute('subclass');
+
+ // Set owner
+ $this->attributes['owner_guid'] = elgg_get_logged_in_user_guid(); // Import as belonging to importer.
+
+ // Set time
+ $this->attributes['time_created'] = strtotime($data->getAttribute('published'));
+ $this->attributes['time_updated'] = time();
+
+ return true;
+ }
+
+ /*
+ * SYSTEM LOG INTERFACE
+ */
+
+ /**
+ * Return an identification for the object for storage in the system log.
+ * This id must be an integer.
+ *
+ * @return int
+ */
+ public function getSystemLogID() {
+ return $this->getGUID();
+ }
+
+ /**
+ * For a given ID, return the object associated with it.
+ * This is used by the river functionality primarily.
+ *
+ * This is useful for checking access permissions etc on objects.
+ *
+ * @param int $id GUID.
+ *
+ * @todo How is this any different or more useful than get_entity($guid)
+ * or new ElggEntity($guid)?
+ *
+ * @return int GUID
+ */
+ public function getObjectFromID($id) {
+ return get_entity($id);
+ }
+
+ /**
+ * Returns tags for this entity.
+ *
+ * @warning Tags must be registered by {@link elgg_register_tag_metadata_name()}.
+ *
+ * @param array $tag_names Optionally restrict by tag metadata names.
+ *
+ * @return array
+ */
+ public function getTags($tag_names = NULL) {
+ if ($tag_names && !is_array($tag_names)) {
+ $tag_names = array($tag_names);
+ }
+
+ $valid_tags = elgg_get_registered_tag_metadata_names();
+ $entity_tags = array();
+
+ foreach ($valid_tags as $tag_name) {
+ if (is_array($tag_names) && !in_array($tag_name, $tag_names)) {
+ continue;
+ }
+
+ if ($tags = $this->$tag_name) {
+ // if a single tag, metadata returns a string.
+ // if multiple tags, metadata returns an array.
+ if (is_array($tags)) {
+ $entity_tags = array_merge($entity_tags, $tags);
+ } else {
+ $entity_tags[] = $tags;
+ }
+ }
+ }
+
+ return $entity_tags;
+ }
+}
diff --git a/engine/classes/ElggExtender.php b/engine/classes/ElggExtender.php
new file mode 100644
index 000000000..25aba354f
--- /dev/null
+++ b/engine/classes/ElggExtender.php
@@ -0,0 +1,214 @@
+<?php
+/**
+ * The base class for ElggEntity extenders.
+ *
+ * Extenders allow you to attach extended information to an
+ * ElggEntity. Core supports two: ElggAnnotation and ElggMetadata.
+ *
+ * Saving the extender data to database is handled by the child class.
+ *
+ * @tip Plugin authors would probably want to extend either ElggAnnotation
+ * or ElggMetadata instead of this class.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Extender
+ * @link http://docs.elgg.org/DataModel/Extenders
+ * @see ElggAnnotation
+ * @see ElggMetadata
+ *
+ * @property string $type annotation or metadata (read-only after save)
+ * @property int $id The unique identifier (read-only)
+ * @property int $entity_guid The GUID of the entity that this extender describes
+ * @property int $access_id Specifies the visibility level of this extender
+ * @property string $name The name of this extender
+ * @property mixed $value The value of the extender (int or string)
+ * @property int $time_created A UNIX timestamp of when the extender was created (read-only, set on first save)
+ */
+abstract class ElggExtender extends ElggData {
+
+ /**
+ * (non-PHPdoc)
+ *
+ * @see ElggData::initializeAttributes()
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = NULL;
+ }
+
+ /**
+ * Returns an attribute
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ protected function get($name) {
+ if (array_key_exists($name, $this->attributes)) {
+ // Sanitise value if necessary
+ if ($name == 'value') {
+ switch ($this->attributes['value_type']) {
+ case 'integer' :
+ return (int)$this->attributes['value'];
+ break;
+
+ //case 'tag' :
+ //case 'file' :
+ case 'text' :
+ return ($this->attributes['value']);
+ break;
+
+ default :
+ $msg = elgg_echo('InstallationException:TypeNotSupported', array(
+ $this->attributes['value_type']));
+
+ throw new InstallationException($msg);
+ break;
+ }
+ }
+
+ return $this->attributes[$name];
+ }
+ return null;
+ }
+
+ /**
+ * Set an attribute
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ * @param string $value_type Value type
+ *
+ * @return boolean
+ */
+ protected function set($name, $value, $value_type = "") {
+ $this->attributes[$name] = $value;
+ if ($name == 'value') {
+ $this->attributes['value_type'] = detect_extender_valuetype($value, $value_type);
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the GUID of the extender's owner entity.
+ *
+ * @return int The owner GUID
+ */
+ public function getOwnerGUID() {
+ return $this->owner_guid;
+ }
+
+ /**
+ * Return the guid of the entity's owner.
+ *
+ * @return int The owner GUID
+ * @deprecated 1.8 Use getOwnerGUID
+ */
+ public function getOwner() {
+ elgg_deprecated_notice("ElggExtender::getOwner deprecated for ElggExtender::getOwnerGUID", 1.8);
+ return $this->getOwnerGUID();
+ }
+
+ /**
+ * Get the entity that owns this extender
+ *
+ * @return ElggEntity
+ */
+ public function getOwnerEntity() {
+ return get_entity($this->owner_guid);
+ }
+
+ /**
+ * Get the entity this describes.
+ *
+ * @return ElggEntity The entity
+ */
+ public function getEntity() {
+ return get_entity($this->entity_guid);
+ }
+
+ /**
+ * Returns if a user can edit this extended data.
+ *
+ * @param int $user_guid The GUID of the user (defaults to currently logged in user)
+ *
+ * @return bool
+ */
+ public function canEdit($user_guid = 0) {
+ return can_edit_extender($this->id, $this->type, $user_guid);
+ }
+
+ /*
+ * EXPORTABLE INTERFACE
+ */
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array(
+ 'id',
+ 'entity_guid',
+ 'name',
+ 'value',
+ 'value_type',
+ 'owner_guid',
+ 'type',
+ );
+ }
+
+ /**
+ * Export this object
+ *
+ * @return array
+ */
+ public function export() {
+ $uuid = get_uuid_from_object($this);
+
+ $meta = new ODDMetaData($uuid, guid_to_uuid($this->entity_guid), $this->attributes['name'],
+ $this->attributes['value'], $this->attributes['type'], guid_to_uuid($this->owner_guid));
+ $meta->setAttribute('published', date("r", $this->time_created));
+
+ return $meta;
+ }
+
+ /*
+ * SYSTEM LOG INTERFACE
+ */
+
+ /**
+ * Return an identification for the object for storage in the system log.
+ * This id must be an integer.
+ *
+ * @return int
+ */
+ public function getSystemLogID() {
+ return $this->id;
+ }
+
+ /**
+ * Return a type of extension.
+ *
+ * @return string
+ */
+ public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * Return a subtype. For metadata & annotations this is the 'name' and
+ * for relationship this is the relationship type.
+ *
+ * @return string
+ */
+ public function getSubtype() {
+ return $this->name;
+ }
+
+}
diff --git a/engine/classes/ElggFile.php b/engine/classes/ElggFile.php
new file mode 100644
index 000000000..23080834b
--- /dev/null
+++ b/engine/classes/ElggFile.php
@@ -0,0 +1,440 @@
+<?php
+
+/**
+ * This class represents a physical file.
+ *
+ * Create a new ElggFile object and specify a filename, and optionally a
+ * FileStore (if one isn't specified then the default is assumed.)
+ *
+ * Open the file using the appropriate mode, and you will be able to
+ * read and write to the file.
+ *
+ * Optionally, you can also call the file's save() method, this will
+ * turn the file into an entity in the system and permit you to do
+ * things like attach tags to the file etc. This is not done automatically
+ * since there are many occasions where you may want access to file data
+ * on datastores using the ElggFile interface but do not want to create
+ * an Entity reference to it in the system (temporary files for example).
+ *
+ * @class ElggFile
+ * @package Elgg.Core
+ * @subpackage DataModel.File
+ */
+class ElggFile extends ElggObject {
+ /** Filestore */
+ private $filestore;
+
+ /** File handle used to identify this file in a filestore. Created by open. */
+ private $handle;
+
+ /**
+ * Set subtype to 'file'.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['subtype'] = "file";
+ }
+
+ /**
+ * Loads an ElggFile entity.
+ *
+ * @param int $guid GUID of the ElggFile object
+ */
+ public function __construct($guid = null) {
+ parent::__construct($guid);
+
+ // Set default filestore
+ $this->filestore = $this->getFilestore();
+ }
+
+ /**
+ * Set the filename of this file.
+ *
+ * @param string $name The filename.
+ *
+ * @return void
+ */
+ public function setFilename($name) {
+ $this->filename = $name;
+ }
+
+ /**
+ * Return the filename.
+ *
+ * @return string
+ */
+ public function getFilename() {
+ return $this->filename;
+ }
+
+ /**
+ * Return the filename of this file as it is/will be stored on the
+ * filestore, which may be different to the filename.
+ *
+ * @return string
+ */
+ public function getFilenameOnFilestore() {
+ return $this->filestore->getFilenameOnFilestore($this);
+ }
+
+ /**
+ * Return the size of the filestore associated with this file
+ *
+ * @param string $prefix Storage prefix
+ * @param int $container_guid The container GUID of the checked filestore
+ *
+ * @return int
+ */
+ public function getFilestoreSize($prefix = '', $container_guid = 0) {
+ if (!$container_guid) {
+ $container_guid = $this->container_guid;
+ }
+ $fs = $this->getFilestore();
+ // @todo add getSize() to ElggFilestore
+ return $fs->getSize($prefix, $container_guid);
+ }
+
+ /**
+ * Get the mime type of the file.
+ *
+ * @return string
+ */
+ public function getMimeType() {
+ if ($this->mimetype) {
+ return $this->mimetype;
+ }
+
+ // @todo Guess mimetype if not here
+ }
+
+ /**
+ * Set the mime type of the file.
+ *
+ * @param string $mimetype The mimetype
+ *
+ * @return bool
+ */
+ public function setMimeType($mimetype) {
+ return $this->mimetype = $mimetype;
+ }
+
+ /**
+ * Detects mime types based on filename or actual file.
+ *
+ * @param mixed $file The full path of the file to check. For uploaded files, use tmp_name.
+ * @param mixed $default A default. Useful to pass what the browser thinks it is.
+ * @since 1.7.12
+ *
+ * @note If $file is provided, this may be called statically
+ *
+ * @return mixed Detected type on success, false on failure.
+ */
+ public function detectMimeType($file = null, $default = null) {
+ if (!$file) {
+ if (isset($this) && $this->filename) {
+ $file = $this->filename;
+ } else {
+ return false;
+ }
+ }
+
+ $mime = false;
+
+ // for PHP5 folks.
+ if (function_exists('finfo_file') && defined('FILEINFO_MIME_TYPE')) {
+ $resource = finfo_open(FILEINFO_MIME_TYPE);
+ if ($resource) {
+ $mime = finfo_file($resource, $file);
+ }
+ }
+
+ // for everyone else.
+ if (!$mime && function_exists('mime_content_type')) {
+ $mime = mime_content_type($file);
+ }
+
+ // default
+ if (!$mime) {
+ return $default;
+ }
+
+ return $mime;
+ }
+
+ /**
+ * Set the optional file description.
+ *
+ * @param string $description The description.
+ *
+ * @return bool
+ */
+ public function setDescription($description) {
+ $this->description = $description;
+ }
+
+ /**
+ * Open the file with the given mode
+ *
+ * @param string $mode Either read/write/append
+ *
+ * @return resource File handler
+ *
+ * @throws IOException|InvalidParameterException
+ */
+ public function open($mode) {
+ if (!$this->getFilename()) {
+ throw new IOException(elgg_echo('IOException:MissingFileName'));
+ }
+
+ // See if file has already been saved
+ // seek on datastore, parameters and name?
+
+ // Sanity check
+ if (
+ ($mode != "read") &&
+ ($mode != "write") &&
+ ($mode != "append")
+ ) {
+ $msg = elgg_echo('InvalidParameterException:UnrecognisedFileMode', array($mode));
+ throw new InvalidParameterException($msg);
+ }
+
+ // Get the filestore
+ $fs = $this->getFilestore();
+
+ // Ensure that we save the file details to object store
+ //$this->save();
+
+ // Open the file handle
+ $this->handle = $fs->open($this, $mode);
+
+ return $this->handle;
+ }
+
+ /**
+ * Write data.
+ *
+ * @param string $data The data
+ *
+ * @return bool
+ */
+ public function write($data) {
+ $fs = $this->getFilestore();
+
+ return $fs->write($this->handle, $data);
+ }
+
+ /**
+ * Read data.
+ *
+ * @param int $length Amount to read.
+ * @param int $offset The offset to start from.
+ *
+ * @return mixed Data or false
+ */
+ public function read($length, $offset = 0) {
+ $fs = $this->getFilestore();
+
+ return $fs->read($this->handle, $length, $offset);
+ }
+
+ /**
+ * Gets the full contents of this file.
+ *
+ * @return mixed The file contents.
+ */
+ public function grabFile() {
+ $fs = $this->getFilestore();
+ return $fs->grabFile($this);
+ }
+
+ /**
+ * Close the file and commit changes
+ *
+ * @return bool
+ */
+ public function close() {
+ $fs = $this->getFilestore();
+
+ if ($fs->close($this->handle)) {
+ $this->handle = NULL;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Delete this file.
+ *
+ * @return bool
+ */
+ public function delete() {
+ $fs = $this->getFilestore();
+
+ $result = $fs->delete($this);
+
+ if ($this->getGUID() && $result) {
+ $result = parent::delete();
+ }
+
+ return $result;
+ }
+
+ /**
+ * Seek a position in the file.
+ *
+ * @param int $position Position in bytes
+ *
+ * @return bool
+ */
+ public function seek($position) {
+ $fs = $this->getFilestore();
+
+ // @todo add seek() to ElggFilestore
+ return $fs->seek($this->handle, $position);
+ }
+
+ /**
+ * Return the current position of the file.
+ *
+ * @return int The file position
+ */
+ public function tell() {
+ $fs = $this->getFilestore();
+
+ return $fs->tell($this->handle);
+ }
+
+ /**
+ * Return the size of the file in bytes.
+ *
+ * @return int
+ */
+ public function size() {
+ return $this->filestore->getFileSize($this);
+ }
+
+ /**
+ * Return a boolean value whether the file handle is at the end of the file
+ *
+ * @return bool
+ */
+ public function eof() {
+ $fs = $this->getFilestore();
+
+ return $fs->eof($this->handle);
+ }
+
+ /**
+ * Returns if the file exists
+ *
+ * @return bool
+ */
+ public function exists() {
+ $fs = $this->getFilestore();
+
+ return $fs->exists($this);
+ }
+
+ /**
+ * Set a filestore.
+ *
+ * @param ElggFilestore $filestore The file store.
+ *
+ * @return void
+ */
+ public function setFilestore(ElggFilestore $filestore) {
+ $this->filestore = $filestore;
+ }
+
+ /**
+ * Return a filestore suitable for saving this file.
+ * This filestore is either a pre-registered filestore,
+ * a filestore as recorded in metadata or the system default.
+ *
+ * @return ElggFilestore
+ *
+ * @throws ClassNotFoundException
+ */
+ protected function getFilestore() {
+ // Short circuit if already set.
+ if ($this->filestore) {
+ return $this->filestore;
+ }
+
+ // ask for entity specific filestore
+ // saved as filestore::className in metadata.
+ // need to get all filestore::* metadata because the rest are "parameters" that
+ // get passed to filestore::setParameters()
+ if ($this->guid) {
+ $options = array(
+ 'guid' => $this->guid,
+ 'where' => array("n.string LIKE 'filestore::%'"),
+ );
+
+ $mds = elgg_get_metadata($options);
+
+ $parameters = array();
+ foreach ($mds as $md) {
+ list($foo, $name) = explode("::", $md->name);
+ if ($name == 'filestore') {
+ $filestore = $md->value;
+ }
+ $parameters[$name] = $md->value;
+ }
+ }
+
+ // need to check if filestore is set because this entity is loaded in save()
+ // before the filestore metadata is saved.
+ if (isset($filestore)) {
+ if (!class_exists($filestore)) {
+ $msg = elgg_echo('ClassNotFoundException:NotFoundNotSavedWithFile',
+ array($filestore, $this->guid));
+ throw new ClassNotFoundException($msg);
+ }
+
+ $this->filestore = new $filestore();
+ $this->filestore->setParameters($parameters);
+ // @todo explain why $parameters will always be set here (PhpStorm complains)
+ }
+
+ // this means the entity hasn't been saved so fallback to default
+ if (!$this->filestore) {
+ $this->filestore = get_default_filestore();
+ }
+
+ return $this->filestore;
+ }
+
+ /**
+ * Save the file
+ *
+ * Write the file's data to the filestore and save
+ * the corresponding entity.
+ *
+ * @see ElggObject::save()
+ *
+ * @return bool
+ */
+ public function save() {
+ if (!parent::save()) {
+ return false;
+ }
+
+ // Save datastore metadata
+ $params = $this->filestore->getParameters();
+ foreach ($params as $k => $v) {
+ $this->setMetaData("filestore::$k", $v);
+ }
+
+ // Now make a note of the filestore class
+ $this->setMetaData("filestore::filestore", get_class($this->filestore));
+
+ return true;
+ }
+}
diff --git a/engine/classes/ElggFileCache.php b/engine/classes/ElggFileCache.php
new file mode 100644
index 000000000..94143f777
--- /dev/null
+++ b/engine/classes/ElggFileCache.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * ElggFileCache
+ * Store cached data in a file store.
+ *
+ * @package Elgg.Core
+ * @subpackage Caches
+ */
+class ElggFileCache extends ElggCache {
+ /**
+ * Set the Elgg cache.
+ *
+ * @param string $cache_path The cache path.
+ * @param int $max_age Maximum age in seconds, 0 if no limit.
+ * @param int $max_size Maximum size of cache in seconds, 0 if no limit.
+ *
+ * @throws ConfigurationException
+ */
+ function __construct($cache_path, $max_age = 0, $max_size = 0) {
+ $this->setVariable("cache_path", $cache_path);
+ $this->setVariable("max_age", $max_age);
+ $this->setVariable("max_size", $max_size);
+
+ if ($cache_path == "") {
+ throw new ConfigurationException(elgg_echo('ConfigurationException:NoCachePath'));
+ }
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Create and return a handle to a file.
+ *
+ * @deprecated 1.8 Use ElggFileCache::createFile()
+ *
+ * @param string $filename Filename to save as
+ * @param string $rw Write mode
+ *
+ * @return mixed
+ */
+ protected function create_file($filename, $rw = "rb") {
+ elgg_deprecated_notice('ElggFileCache::create_file() is deprecated by ::createFile()', 1.8);
+
+ return $this->createFile($filename, $rw);
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Create and return a handle to a file.
+ *
+ * @param string $filename Filename to save as
+ * @param string $rw Write mode
+ *
+ * @return mixed
+ */
+ protected function createFile($filename, $rw = "rb") {
+ // Create a filename matrix
+ $matrix = "";
+ $depth = strlen($filename);
+ if ($depth > 5) {
+ $depth = 5;
+ }
+
+ // Create full path
+ $path = $this->getVariable("cache_path") . $matrix;
+ if (!is_dir($path)) {
+ mkdir($path, 0700, true);
+ }
+
+ // Open the file
+ if ((!file_exists($path . $filename)) && ($rw == "rb")) {
+ return false;
+ }
+
+ return fopen($path . $filename, $rw);
+ }
+
+ // @codingStandardsIgnoreStart
+ /**
+ * Create a sanitised filename for the file.
+ *
+ * @deprecated 1.8 Use ElggFileCache::sanitizeFilename()
+ *
+ * @param string $filename The filename
+ *
+ * @return string
+ */
+ protected function sanitise_filename($filename) {
+ // @todo : Writeme
+
+ return $filename;
+ }
+ // @codingStandardsIgnoreEnd
+
+ /**
+ * Create a sanitised filename for the file.
+ *
+ * @param string $filename The filename
+ *
+ * @return string
+ */
+ protected function sanitizeFilename($filename) {
+ // @todo : Writeme
+
+ return $filename;
+ }
+
+ /**
+ * Save a key
+ *
+ * @param string $key Name
+ * @param string $data Value
+ *
+ * @return boolean
+ */
+ public function save($key, $data) {
+ $f = $this->createFile($this->sanitizeFilename($key), "wb");
+ if ($f) {
+ $result = fwrite($f, $data);
+ fclose($f);
+
+ return $result;
+ }
+
+ return false;
+ }
+
+ /**
+ * Load a key
+ *
+ * @param string $key Name
+ * @param int $offset Offset
+ * @param int $limit Limit
+ *
+ * @return string
+ */
+ public function load($key, $offset = 0, $limit = null) {
+ $f = $this->createFile($this->sanitizeFilename($key));
+ if ($f) {
+ if (!$limit) {
+ $limit = -1;
+ }
+
+ $data = stream_get_contents($f, $limit, $offset);
+
+ fclose($f);
+
+ return $data;
+ }
+
+ return false;
+ }
+
+ /**
+ * Invalidate a given key.
+ *
+ * @param string $key Name
+ *
+ * @return bool
+ */
+ public function delete($key) {
+ $dir = $this->getVariable("cache_path");
+
+ if (file_exists($dir . $key)) {
+ return unlink($dir . $key);
+ }
+ return TRUE;
+ }
+
+ /**
+ * Delete all files in the directory of this file cache
+ *
+ * @return void
+ */
+ public function clear() {
+ $dir = $this->getVariable("cache_path");
+
+ $exclude = array(".", "..");
+
+ $files = scandir($dir);
+ if (!$files) {
+ return;
+ }
+
+ foreach ($files as $f) {
+ if (!in_array($f, $exclude)) {
+ unlink($dir . $f);
+ }
+ }
+ }
+
+ /**
+ * Preform cleanup and invalidates cache upon object destruction
+ *
+ * @throws IOException
+ */
+ public function __destruct() {
+ // @todo Check size and age, clean up accordingly
+ $size = 0;
+ $dir = $this->getVariable("cache_path");
+
+ // Short circuit if both size and age are unlimited
+ if (($this->getVariable("max_age") == 0) && ($this->getVariable("max_size") == 0)) {
+ return;
+ }
+
+ $exclude = array(".", "..");
+
+ $files = scandir($dir);
+ if (!$files) {
+ throw new IOException(elgg_echo('IOException:NotDirectory', array($dir)));
+ }
+
+ // Perform cleanup
+ foreach ($files as $f) {
+ if (!in_array($f, $exclude)) {
+ $stat = stat($dir . $f);
+
+ // Add size
+ $size .= $stat['size'];
+
+ // Is this older than my maximum date?
+ if (($this->getVariable("max_age") > 0) && (time() - $stat['mtime'] > $this->getVariable("max_age"))) {
+ unlink($dir . $f);
+ }
+
+ // @todo Size
+ }
+ }
+ }
+}
diff --git a/engine/classes/ElggFilestore.php b/engine/classes/ElggFilestore.php
new file mode 100644
index 000000000..16430feac
--- /dev/null
+++ b/engine/classes/ElggFilestore.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * This class defines the interface for all elgg data repositories.
+ *
+ * @package Elgg.Core
+ * @subpackage DataStorage
+ * @class ElggFilestore
+ */
+abstract class ElggFilestore {
+ /**
+ * Attempt to open the file $file for storage or writing.
+ *
+ * @param ElggFile $file A file
+ * @param string $mode "read", "write", "append"
+ *
+ * @return mixed A handle to the opened file or false on error.
+ */
+ abstract public function open(ElggFile $file, $mode);
+
+ /**
+ * Write data to a given file handle.
+ *
+ * @param mixed $f The file handle - exactly what this is depends on the file system
+ * @param string $data The binary string of data to write
+ *
+ * @return int Number of bytes written.
+ */
+ abstract public function write($f, $data);
+
+ /**
+ * Read data from a filestore.
+ *
+ * @param mixed $f The file handle
+ * @param int $length Length in bytes to read.
+ * @param int $offset The optional offset.
+ *
+ * @return mixed String of data or false on error.
+ */
+ abstract public function read($f, $length, $offset = 0);
+
+ /**
+ * Seek a given position within a file handle.
+ *
+ * @param mixed $f The file handle.
+ * @param int $position The position.
+ *
+ * @return void
+ */
+ abstract public function seek($f, $position);
+
+ /**
+ * Return a whether the end of a file has been reached.
+ *
+ * @param mixed $f The file handle.
+ *
+ * @return boolean
+ */
+ abstract public function eof($f);
+
+ /**
+ * Return the current position in an open file.
+ *
+ * @param mixed $f The file handle.
+ *
+ * @return int
+ */
+ abstract public function tell($f);
+
+ /**
+ * Close a given file handle.
+ *
+ * @param mixed $f The file handle
+ *
+ * @return bool
+ */
+ abstract public function close($f);
+
+ /**
+ * Delete the file associated with a given file handle.
+ *
+ * @param ElggFile $file The file
+ *
+ * @return bool
+ */
+ abstract public function delete(ElggFile $file);
+
+ /**
+ * Return the size in bytes for a given file.
+ *
+ * @param ElggFile $file The file
+ *
+ * @return int
+ */
+ abstract public function getFileSize(ElggFile $file);
+
+ /**
+ * Return the filename of a given file as stored on the filestore.
+ *
+ * @param ElggFile $file The file
+ *
+ * @return string
+ */
+ abstract public function getFilenameOnFilestore(ElggFile $file);
+
+ /**
+ * Get the filestore's creation parameters as an associative array.
+ * Used for serialisation and for storing the creation details along side a file object.
+ *
+ * @return array
+ */
+ abstract public function getParameters();
+
+ /**
+ * Set the parameters from the associative array produced by $this->getParameters().
+ *
+ * @param array $parameters A list of parameters
+ *
+ * @return bool
+ */
+ abstract public function setParameters(array $parameters);
+
+ /**
+ * Get the contents of the whole file.
+ *
+ * @param mixed $file The file handle.
+ *
+ * @return mixed The file contents.
+ */
+ abstract public function grabFile(ElggFile $file);
+
+ /**
+ * Return whether a file physically exists or not.
+ *
+ * @param ElggFile $file The file
+ *
+ * @return bool
+ */
+ abstract public function exists(ElggFile $file);
+}
diff --git a/engine/classes/ElggGroup.php b/engine/classes/ElggGroup.php
new file mode 100644
index 000000000..7e69b7a84
--- /dev/null
+++ b/engine/classes/ElggGroup.php
@@ -0,0 +1,393 @@
+<?php
+
+/**
+ * Class representing a container for other elgg entities.
+ *
+ * @package Elgg.Core
+ * @subpackage Groups
+ *
+ * @property string $name A short name that captures the purpose of the group
+ * @property string $description A longer body of content that gives more details about the group
+ */
+class ElggGroup extends ElggEntity
+ implements Friendable {
+
+ /**
+ * Sets the type to group.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = "group";
+ $this->attributes['name'] = NULL;
+ $this->attributes['description'] = NULL;
+ $this->attributes['tables_split'] = 2;
+ }
+
+ /**
+ * Construct a new group entity, optionally from a given guid value.
+ *
+ * @param mixed $guid If an int, load that GUID.
+ * If an entity table db row, then will load the rest of the data.
+ *
+ * @throws IOException|InvalidParameterException if there was a problem creating the group.
+ */
+ function __construct($guid = null) {
+ $this->initializeAttributes();
+
+ // compatibility for 1.7 api.
+ $this->initialise_attributes(false);
+
+ if (!empty($guid)) {
+ // Is $guid is a entity table DB row
+ if ($guid instanceof stdClass) {
+ // Load the rest
+ if (!$this->load($guid)) {
+ $msg = elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid->guid));
+ throw new IOException($msg);
+ }
+ } else if ($guid instanceof ElggGroup) {
+ // $guid is an ElggGroup so this is a copy constructor
+ elgg_deprecated_notice('This type of usage of the ElggGroup constructor was deprecated. Please use the clone method.', 1.7);
+
+ foreach ($guid->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else if ($guid instanceof ElggEntity) {
+ // @todo why separate from else
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggGroup'));
+ } else if (is_numeric($guid)) {
+ // $guid is a GUID so load entity
+ if (!$this->load($guid)) {
+ throw new IOException(elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid)));
+ }
+ } else {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue'));
+ }
+ }
+ }
+
+ /**
+ * Add an ElggObject to this group.
+ *
+ * @param ElggObject $object The object.
+ *
+ * @return bool
+ */
+ public function addObjectToGroup(ElggObject $object) {
+ return add_object_to_group($this->getGUID(), $object->getGUID());
+ }
+
+ /**
+ * Remove an object from the containing group.
+ *
+ * @param int $guid The guid of the object.
+ *
+ * @return bool
+ */
+ public function removeObjectFromGroup($guid) {
+ return remove_object_from_group($this->getGUID(), $guid);
+ }
+
+ /**
+ * Returns an attribute or metadata.
+ *
+ * @see ElggEntity::get()
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ public function get($name) {
+ if ($name == 'username') {
+ return 'group:' . $this->getGUID();
+ }
+ return parent::get($name);
+ }
+
+ /**
+ * Start friendable compatibility block:
+ *
+ * public function addFriend($friend_guid);
+ public function removeFriend($friend_guid);
+ public function isFriend();
+ public function isFriendsWith($user_guid);
+ public function isFriendOf($user_guid);
+ public function getFriends($subtype = "", $limit = 10, $offset = 0);
+ public function getFriendsOf($subtype = "", $limit = 10, $offset = 0);
+ public function getObjects($subtype="", $limit = 10, $offset = 0);
+ public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0);
+ public function countObjects($subtype = "");
+ */
+
+ /**
+ * For compatibility with Friendable.
+ *
+ * Join a group when you friend ElggGroup.
+ *
+ * @param int $friend_guid The GUID of the user joining the group.
+ *
+ * @return bool
+ */
+ public function addFriend($friend_guid) {
+ return $this->join(get_entity($friend_guid));
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * Leave group when you unfriend ElggGroup.
+ *
+ * @param int $friend_guid The GUID of the user leaving.
+ *
+ * @return bool
+ */
+ public function removeFriend($friend_guid) {
+ return $this->leave(get_entity($friend_guid));
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * Friending a group adds you as a member
+ *
+ * @return bool
+ */
+ public function isFriend() {
+ return $this->isMember();
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param int $user_guid The GUID of a user to check.
+ *
+ * @return bool
+ */
+ public function isFriendsWith($user_guid) {
+ return $this->isMember($user_guid);
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param int $user_guid The GUID of a user to check.
+ *
+ * @return bool
+ */
+ public function isFriendOf($user_guid) {
+ return $this->isMember($user_guid);
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param string $subtype The GUID of a user to check.
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return bool
+ */
+ public function getFriends($subtype = "", $limit = 10, $offset = 0) {
+ return get_group_members($this->getGUID(), $limit, $offset);
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param string $subtype The GUID of a user to check.
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return bool
+ */
+ public function getFriendsOf($subtype = "", $limit = 10, $offset = 0) {
+ return get_group_members($this->getGUID(), $limit, $offset);
+ }
+
+ /**
+ * Get objects contained in this group.
+ *
+ * @param string $subtype Entity subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return array|false
+ */
+ public function getObjects($subtype = "", $limit = 10, $offset = 0) {
+ // @todo are we deprecating this method, too?
+ return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param string $subtype Entity subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return array|false
+ */
+ public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0) {
+ // @todo are we deprecating this method, too?
+ return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
+ }
+
+ /**
+ * For compatibility with Friendable
+ *
+ * @param string $subtype Subtype of entities
+ *
+ * @return array|false
+ */
+ public function countObjects($subtype = "") {
+ // @todo are we deprecating this method, too?
+ return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", 10, 0, true);
+ }
+
+ /**
+ * End friendable compatibility block
+ */
+
+ /**
+ * Get a list of group members.
+ *
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param bool $count Count
+ *
+ * @return mixed
+ */
+ public function getMembers($limit = 10, $offset = 0, $count = false) {
+ return get_group_members($this->getGUID(), $limit, $offset, 0, $count);
+ }
+
+ /**
+ * Returns whether the current group is public membership or not.
+ *
+ * @return bool
+ */
+ public function isPublicMembership() {
+ if ($this->membership == ACCESS_PUBLIC) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Return whether a given user is a member of this group or not.
+ *
+ * @param ElggUser $user The user
+ *
+ * @return bool
+ */
+ public function isMember($user = null) {
+ if (!($user instanceof ElggUser)) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+ if (!($user instanceof ElggUser)) {
+ return false;
+ }
+ return is_group_member($this->getGUID(), $user->getGUID());
+ }
+
+ /**
+ * Join an elgg user to this group.
+ *
+ * @param ElggUser $user User
+ *
+ * @return bool
+ */
+ public function join(ElggUser $user) {
+ return join_group($this->getGUID(), $user->getGUID());
+ }
+
+ /**
+ * Remove a user from the group.
+ *
+ * @param ElggUser $user User
+ *
+ * @return bool
+ */
+ public function leave(ElggUser $user) {
+ return leave_group($this->getGUID(), $user->getGUID());
+ }
+
+ /**
+ * Load the ElggGroup data from the database
+ *
+ * @param mixed $guid GUID of an ElggGroup entity or database row from entity table
+ *
+ * @return bool
+ */
+ protected function load($guid) {
+ $attr_loader = new ElggAttributeLoader(get_class(), 'group', $this->attributes);
+ $attr_loader->requires_access_control = !($this instanceof ElggPlugin);
+ $attr_loader->secondary_loader = 'get_group_entity_as_row';
+
+ $attrs = $attr_loader->getRequiredAttributes($guid);
+ if (!$attrs) {
+ return false;
+ }
+
+ $this->attributes = $attrs;
+ $this->attributes['tables_loaded'] = 2;
+ _elgg_cache_entity($this);
+
+ return true;
+ }
+
+ /**
+ * Override the save function.
+ *
+ * @return bool
+ */
+ public function save() {
+ // Save generic stuff
+ if (!parent::save()) {
+ return false;
+ }
+
+ // Now save specific stuff
+
+ _elgg_disable_caching_for_entity($this->guid);
+ $ret = create_group_entity($this->get('guid'), $this->get('name'), $this->get('description'));
+ _elgg_enable_caching_for_entity($this->guid);
+
+ return $ret;
+ }
+
+ // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array_merge(parent::getExportableValues(), array(
+ 'name',
+ 'description',
+ ));
+ }
+
+ /**
+ * Can a user comment on this group?
+ *
+ * @see ElggEntity::canComment()
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @return bool
+ * @since 1.8.0
+ */
+ public function canComment($user_guid = 0) {
+ $result = parent::canComment($user_guid);
+ if ($result !== null) {
+ return $result;
+ }
+ return false;
+ }
+}
diff --git a/engine/classes/ElggGroupItemVisibility.php b/engine/classes/ElggGroupItemVisibility.php
new file mode 100644
index 000000000..2c7e2abb4
--- /dev/null
+++ b/engine/classes/ElggGroupItemVisibility.php
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * Determines if otherwise visible items should be hidden from a user due to group
+ * policy or visibility.
+ *
+ * @class ElggGroupItemVisibility
+ * @package Elgg.Core
+ * @subpackage Groups
+ *
+ * @access private
+ */
+class ElggGroupItemVisibility {
+
+ const REASON_MEMBERSHIP = 'membershiprequired';
+ const REASON_LOGGEDOUT = 'loggedinrequired';
+ const REASON_NOACCESS = 'noaccess';
+
+ /**
+ * @var bool
+ */
+ public $shouldHideItems = false;
+
+ /**
+ * @var string
+ */
+ public $reasonHidden = '';
+
+ /**
+ * Determine visibility of items within a container for the current user
+ *
+ * @param int $container_guid GUID of a container (may/may not be a group)
+ *
+ * @return ElggGroupItemVisibility
+ *
+ * @todo Make this faster, considering it must run for every river item.
+ */
+ static public function factory($container_guid) {
+ // cache because this may be called repeatedly during river display, and
+ // due to need to check group visibility, cache will be disabled for some
+ // get_entity() calls
+ static $cache = array();
+
+ $ret = new ElggGroupItemVisibility();
+
+ if (!$container_guid) {
+ return $ret;
+ }
+
+ $user = elgg_get_logged_in_user_entity();
+ $user_guid = $user ? $user->guid : 0;
+
+ $container_guid = (int) $container_guid;
+
+ $cache_key = "$container_guid|$user_guid";
+ if (empty($cache[$cache_key])) {
+ // compute
+
+ $container = get_entity($container_guid);
+ $is_visible = (bool) $container;
+
+ if (!$is_visible) {
+ // see if it *really* exists...
+ $prev_access = elgg_set_ignore_access();
+ $container = get_entity($container_guid);
+ elgg_set_ignore_access($prev_access);
+ }
+
+ if ($container && $container instanceof ElggGroup) {
+ /* @var ElggGroup $container */
+
+ if ($is_visible) {
+ if (!$container->isPublicMembership()) {
+ if ($user) {
+ if (!$container->isMember($user) && !$user->isAdmin()) {
+ $ret->shouldHideItems = true;
+ $ret->reasonHidden = self::REASON_MEMBERSHIP;
+ }
+ } else {
+ $ret->shouldHideItems = true;
+ $ret->reasonHidden = self::REASON_LOGGEDOUT;
+ }
+ }
+ } else {
+ $ret->shouldHideItems = true;
+ $ret->reasonHidden = self::REASON_NOACCESS;
+ }
+ }
+ $cache[$cache_key] = $ret;
+ }
+ return $cache[$cache_key];
+ }
+}
diff --git a/engine/classes/ElggHMACCache.php b/engine/classes/ElggHMACCache.php
new file mode 100644
index 000000000..c2f468815
--- /dev/null
+++ b/engine/classes/ElggHMACCache.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * ElggHMACCache
+ * Store cached data in a temporary database, only used by the HMAC stuff.
+ *
+ * @package Elgg.Core
+ * @subpackage HMAC
+ */
+class ElggHMACCache extends ElggCache {
+ /**
+ * Set the Elgg cache.
+ *
+ * @param int $max_age Maximum age in seconds, 0 if no limit.
+ */
+ function __construct($max_age = 0) {
+ $this->setVariable("max_age", $max_age);
+ }
+
+ /**
+ * Save a key
+ *
+ * @param string $key Name
+ * @param string $data Value
+ *
+ * @return boolean
+ */
+ public function save($key, $data) {
+ global $CONFIG;
+
+ $key = sanitise_string($key);
+ $time = time();
+
+ $query = "INSERT into {$CONFIG->dbprefix}hmac_cache (hmac, ts) VALUES ('$key', '$time')";
+ return insert_data($query);
+ }
+
+ /**
+ * Load a key
+ *
+ * @param string $key Name
+ * @param int $offset Offset
+ * @param int $limit Limit
+ *
+ * @return string
+ */
+ public function load($key, $offset = 0, $limit = null) {
+ global $CONFIG;
+
+ $key = sanitise_string($key);
+
+ $row = get_data_row("SELECT * from {$CONFIG->dbprefix}hmac_cache where hmac='$key'");
+ if ($row) {
+ return $row->hmac;
+ }
+
+ return false;
+ }
+
+ /**
+ * Invalidate a given key.
+ *
+ * @param string $key Name
+ *
+ * @return bool
+ */
+ public function delete($key) {
+ global $CONFIG;
+
+ $key = sanitise_string($key);
+
+ return delete_data("DELETE from {$CONFIG->dbprefix}hmac_cache where hmac='$key'");
+ }
+
+ /**
+ * Clear out all the contents of the cache.
+ *
+ * Not currently implemented in this cache type.
+ *
+ * @return true
+ */
+ public function clear() {
+ return true;
+ }
+
+ /**
+ * Clean out old stuff.
+ *
+ */
+ public function __destruct() {
+ global $CONFIG;
+
+ $time = time();
+ $age = (int)$this->getVariable("max_age");
+
+ $expires = $time - $age;
+
+ delete_data("DELETE from {$CONFIG->dbprefix}hmac_cache where ts<$expires");
+ }
+}
diff --git a/engine/classes/ElggLRUCache.php b/engine/classes/ElggLRUCache.php
new file mode 100644
index 000000000..f51af2ed7
--- /dev/null
+++ b/engine/classes/ElggLRUCache.php
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * Least Recently Used Cache
+ *
+ * A fixed sized cache that removes the element used last when it reaches its
+ * size limit.
+ *
+ * Based on https://github.com/cash/LRUCache
+ *
+ * @access private
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+class ElggLRUCache implements ArrayAccess {
+ /** @var int */
+ protected $maximumSize;
+
+ /**
+ * The front of the array contains the LRU element
+ *
+ * @var array
+ */
+ protected $data = array();
+
+ /**
+ * Create a LRU Cache
+ *
+ * @param int $size The size of the cache
+ * @throws InvalidArgumentException
+ */
+ public function __construct($size) {
+ if (!is_int($size) || $size <= 0) {
+ throw new InvalidArgumentException();
+ }
+ $this->maximumSize = $size;
+ }
+
+ /**
+ * Get the value cached with this key
+ *
+ * @param int|string $key The key. Strings that are ints are cast to ints.
+ * @param mixed $default The value to be returned if key not found. (Optional)
+ * @return mixed
+ */
+ public function get($key, $default = null) {
+ if (isset($this->data[$key])) {
+ $this->recordAccess($key);
+ return $this->data[$key];
+ } else {
+ return $default;
+ }
+ }
+
+ /**
+ * Add something to the cache
+ *
+ * @param int|string $key The key. Strings that are ints are cast to ints.
+ * @param mixed $value The value to cache
+ * @return void
+ */
+ public function set($key, $value) {
+ if (isset($this->data[$key])) {
+ $this->data[$key] = $value;
+ $this->recordAccess($key);
+ } else {
+ $this->data[$key] = $value;
+ if ($this->size() > $this->maximumSize) {
+ // remove least recently used element (front of array)
+ reset($this->data);
+ unset($this->data[key($this->data)]);
+ }
+ }
+ }
+
+ /**
+ * Get the number of elements in the cache
+ *
+ * @return int
+ */
+ public function size() {
+ return count($this->data);
+ }
+
+ /**
+ * Does the cache contain an element with this key
+ *
+ * @param int|string $key The key
+ * @return boolean
+ */
+ public function containsKey($key) {
+ return isset($this->data[$key]);
+ }
+
+ /**
+ * Remove the element with this key.
+ *
+ * @param int|string $key The key
+ * @return mixed Value or null if not set
+ */
+ public function remove($key) {
+ if (isset($this->data[$key])) {
+ $value = $this->data[$key];
+ unset($this->data[$key]);
+ return $value;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Clear the cache
+ *
+ * @return void
+ */
+ public function clear() {
+ $this->data = array();
+ }
+
+ /**
+ * Moves the element from current position to end of array
+ *
+ * @param int|string $key The key
+ * @return void
+ */
+ protected function recordAccess($key) {
+ $value = $this->data[$key];
+ unset($this->data[$key]);
+ $this->data[$key] = $value;
+ }
+
+ /**
+ * Assigns a value for the specified key
+ *
+ * @see ArrayAccess::offsetSet()
+ *
+ * @param int|string $key The key to assign the value to.
+ * @param mixed $value The value to set.
+ * @return void
+ */
+ public function offsetSet($key, $value) {
+ $this->set($key, $value);
+ }
+
+ /**
+ * Get the value for specified key
+ *
+ * @see ArrayAccess::offsetGet()
+ *
+ * @param int|string $key The key to retrieve.
+ * @return mixed
+ */
+ public function offsetGet($key) {
+ return $this->get($key);
+ }
+
+ /**
+ * Unsets a key.
+ *
+ * @see ArrayAccess::offsetUnset()
+ *
+ * @param int|string $key The key to unset.
+ * @return void
+ */
+ public function offsetUnset($key) {
+ $this->remove($key);
+ }
+
+ /**
+ * Does key exist?
+ *
+ * @see ArrayAccess::offsetExists()
+ *
+ * @param int|string $key A key to check for.
+ * @return boolean
+ */
+ public function offsetExists($key) {
+ return $this->containsKey($key);
+ }
+}
diff --git a/engine/classes/ElggMemcache.php b/engine/classes/ElggMemcache.php
new file mode 100644
index 000000000..91d50ab89
--- /dev/null
+++ b/engine/classes/ElggMemcache.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Memcache wrapper class.
+ *
+ * @package Elgg.Core
+ * @subpackage Memcache
+ */
+class ElggMemcache extends ElggSharedMemoryCache {
+ /**
+ * Minimum version of memcached needed to run
+ *
+ */
+ private static $MINSERVERVERSION = '1.1.12';
+
+ /**
+ * Memcache object
+ */
+ private $memcache;
+
+ /**
+ * Expiry of saved items (default timeout after a day to prevent anything getting too stale)
+ */
+ private $expires = 86400;
+
+ /**
+ * The version of memcache running
+ */
+ private $version = 0;
+
+ /**
+ * Connect to memcache.
+ *
+ * @param string $namespace The namespace for this cache to write to -
+ * note, namespaces of the same name are shared!
+ *
+ * @throws ConfigurationException
+ */
+ function __construct($namespace = 'default') {
+ global $CONFIG;
+
+ $this->setNamespace($namespace);
+
+ // Do we have memcache?
+ if (!class_exists('Memcache')) {
+ throw new ConfigurationException('PHP memcache module not installed, you must install php5-memcache');
+ }
+
+ // Create memcache object
+ $this->memcache = new Memcache;
+
+ // Now add servers
+ if (!$CONFIG->memcache_servers) {
+ throw new ConfigurationException('No memcache servers defined, please populate the $CONFIG->memcache_servers variable');
+ }
+
+ if (is_callable(array($this->memcache, 'addServer'))) {
+ foreach ($CONFIG->memcache_servers as $server) {
+ if (is_array($server)) {
+ $this->memcache->addServer(
+ $server[0],
+ isset($server[1]) ? $server[1] : 11211,
+ isset($server[2]) ? $server[2] : FALSE,
+ isset($server[3]) ? $server[3] : 1,
+ isset($server[4]) ? $server[4] : 1,
+ isset($server[5]) ? $server[5] : 15,
+ isset($server[6]) ? $server[6] : TRUE
+ );
+
+ } else {
+ $this->memcache->addServer($server, 11211);
+ }
+ }
+ } else {
+ // don't use elgg_echo() here because most of the config hasn't been loaded yet
+ // and it caches the language, which is hard coded in $CONFIG->language as en.
+ // overriding it with real values later has no effect because it's already cached.
+ elgg_log("This version of the PHP memcache API doesn't support multiple servers.", 'ERROR');
+
+ $server = $CONFIG->memcache_servers[0];
+ if (is_array($server)) {
+ $this->memcache->connect($server[0], $server[1]);
+ } else {
+ $this->memcache->addServer($server, 11211);
+ }
+ }
+
+ // Get version
+ $this->version = $this->memcache->getVersion();
+ if (version_compare($this->version, ElggMemcache::$MINSERVERVERSION, '<')) {
+ $msg = vsprintf('Memcache needs at least version %s to run, you are running %s',
+ array(ElggMemcache::$MINSERVERVERSION,
+ $this->version
+ ));
+
+ throw new ConfigurationException($msg);
+ }
+
+ // Set some defaults
+ if (isset($CONFIG->memcache_expires)) {
+ $this->expires = $CONFIG->memcache_expires;
+ }
+ }
+
+ /**
+ * Set the default expiry.
+ *
+ * @param int $expires The lifetime as a unix timestamp or time from now. Defaults forever.
+ *
+ * @return void
+ */
+ public function setDefaultExpiry($expires = 0) {
+ $this->expires = $expires;
+ }
+
+ /**
+ * Combine a key with the namespace.
+ * Memcache can only accept <250 char key. If the given key is too long it is shortened.
+ *
+ * @param string $key The key
+ *
+ * @return string The new key.
+ */
+ private function makeMemcacheKey($key) {
+ $prefix = $this->getNamespace() . ":";
+
+ if (strlen($prefix . $key) > 250) {
+ $key = md5($key);
+ }
+
+ return $prefix . $key;
+ }
+
+ /**
+ * Saves a name and value to the cache
+ *
+ * @param string $key Name
+ * @param string $data Value
+ * @param integer $expires Expires (in seconds)
+ *
+ * @return bool
+ */
+ public function save($key, $data, $expires = null) {
+ $key = $this->makeMemcacheKey($key);
+
+ if ($expires === null) {
+ $expires = $this->expires;
+ }
+
+ $result = $this->memcache->set($key, $data, null, $expires);
+ if ($result === false) {
+ elgg_log("MEMCACHE: FAILED TO SAVE $key", 'ERROR');
+ }
+
+ return $result;
+ }
+
+ /**
+ * Retrieves data.
+ *
+ * @param string $key Name of data to retrieve
+ * @param int $offset Offset
+ * @param int $limit Limit
+ *
+ * @return mixed
+ */
+ public function load($key, $offset = 0, $limit = null) {
+ $key = $this->makeMemcacheKey($key);
+
+ $result = $this->memcache->get($key);
+ if ($result === false) {
+ elgg_log("MEMCACHE: FAILED TO LOAD $key", 'ERROR');
+ }
+
+ return $result;
+ }
+
+ /**
+ * Delete data
+ *
+ * @param string $key Name of data
+ *
+ * @return bool
+ */
+ public function delete($key) {
+ $key = $this->makeMemcacheKey($key);
+
+ return $this->memcache->delete($key, 0);
+ }
+
+ /**
+ * Clears the entire cache?
+ *
+ * @todo write or remove.
+ *
+ * @return true
+ */
+ public function clear() {
+ // DISABLE clearing for now - you must use delete on a specific key.
+ return true;
+
+ // @todo Namespaces as in #532
+ }
+}
diff --git a/engine/classes/ElggMenuBuilder.php b/engine/classes/ElggMenuBuilder.php
new file mode 100644
index 000000000..b463143d8
--- /dev/null
+++ b/engine/classes/ElggMenuBuilder.php
@@ -0,0 +1,291 @@
+<?php
+/**
+ * Elgg Menu Builder
+ *
+ * @package Elgg.Core
+ * @subpackage Navigation
+ * @since 1.8.0
+ */
+class ElggMenuBuilder {
+
+ /**
+ * @var ElggMenuItem[]
+ */
+ protected $menu = array();
+
+ protected $selected = null;
+
+ /**
+ * ElggMenuBuilder constructor
+ *
+ * @param ElggMenuItem[] $menu Array of ElggMenuItem objects
+ */
+ public function __construct(array $menu) {
+ $this->menu = $menu;
+ }
+
+ /**
+ * Get a prepared menu array
+ *
+ * @param mixed $sort_by Method to sort the menu by. @see ElggMenuBuilder::sort()
+ * @return array
+ */
+ public function getMenu($sort_by = 'text') {
+
+ $this->selectFromContext();
+
+ $this->selected = $this->findSelected();
+
+ $this->setupSections();
+
+ $this->setupTrees();
+
+ $this->sort($sort_by);
+
+ return $this->menu;
+ }
+
+ /**
+ * Get the selected menu item
+ *
+ * @return ElggMenuItem
+ */
+ public function getSelected() {
+ return $this->selected;
+ }
+
+ /**
+ * Select menu items for the current context
+ *
+ * @return void
+ */
+ protected function selectFromContext() {
+ if (!isset($this->menu)) {
+ $this->menu = array();
+ return;
+ }
+
+ // get menu items for this context
+ $selected_menu = array();
+ foreach ($this->menu as $menu_item) {
+ if (!is_object($menu_item)) {
+ elgg_log("A non-object was passed to ElggMenuBuilder", "ERROR");
+ continue;
+ }
+ if ($menu_item->inContext()) {
+ $selected_menu[] = $menu_item;
+ }
+ }
+
+ $this->menu = $selected_menu;
+ }
+
+ /**
+ * Group the menu items into sections
+ *
+ * @return void
+ */
+ protected function setupSections() {
+ $sectioned_menu = array();
+ foreach ($this->menu as $menu_item) {
+ if (!isset($sectioned_menu[$menu_item->getSection()])) {
+ $sectioned_menu[$menu_item->getSection()] = array();
+ }
+ $sectioned_menu[$menu_item->getSection()][] = $menu_item;
+ }
+ $this->menu = $sectioned_menu;
+ }
+
+ /**
+ * Create trees for each menu section
+ *
+ * @internal The tree is doubly linked (parent and children links)
+ * @return void
+ */
+ protected function setupTrees() {
+ $menu_tree = array();
+
+ foreach ($this->menu as $key => $section) {
+ $parents = array();
+ $children = array();
+ // divide base nodes from children
+ foreach ($section as $menu_item) {
+ /* @var ElggMenuItem $menu_item */
+ $parent_name = $menu_item->getParentName();
+ if (!$parent_name) {
+ $parents[$menu_item->getName()] = $menu_item;
+ } else {
+ $children[] = $menu_item;
+ }
+ }
+
+ // attach children to parents
+ $iteration = 0;
+ $current_gen = $parents;
+ $next_gen = null;
+ while (count($children) && $iteration < 5) {
+ foreach ($children as $index => $menu_item) {
+ $parent_name = $menu_item->getParentName();
+ if (array_key_exists($parent_name, $current_gen)) {
+ $next_gen[$menu_item->getName()] = $menu_item;
+ if (!in_array($menu_item, $current_gen[$parent_name]->getData('children'))) {
+ $current_gen[$parent_name]->addChild($menu_item);
+ $menu_item->setParent($current_gen[$parent_name]);
+ }
+ unset($children[$index]);
+ }
+ }
+ $current_gen = $next_gen;
+ $iteration += 1;
+ }
+
+ // convert keys to indexes for first level of tree
+ $parents = array_values($parents);
+
+ $menu_tree[$key] = $parents;
+ }
+
+ $this->menu = $menu_tree;
+ }
+
+ /**
+ * Find the menu item that is currently selected
+ *
+ * @return ElggMenuItem
+ */
+ protected function findSelected() {
+
+ // do we have a selected menu item already
+ foreach ($this->menu as $menu_item) {
+ if ($menu_item->getSelected()) {
+ return $menu_item;
+ }
+ }
+
+ // scan looking for a selected item
+ foreach ($this->menu as $menu_item) {
+ if ($menu_item->getHref()) {
+ if (elgg_http_url_is_identical(current_page_url(), $menu_item->getHref())) {
+ $menu_item->setSelected(true);
+ return $menu_item;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Sort the menu sections and trees
+ *
+ * @param mixed $sort_by Sort type as string or php callback
+ * @return void
+ */
+ protected function sort($sort_by) {
+
+ // sort sections
+ ksort($this->menu);
+
+ switch ($sort_by) {
+ case 'text':
+ $sort_callback = array('ElggMenuBuilder', 'compareByText');
+ break;
+ case 'name':
+ $sort_callback = array('ElggMenuBuilder', 'compareByName');
+ break;
+ case 'priority':
+ $sort_callback = array('ElggMenuBuilder', 'compareByWeight');
+ break;
+ case 'register':
+ // use registration order - usort breaks this
+ return;
+ break;
+ default:
+ if (is_callable($sort_by)) {
+ $sort_callback = $sort_by;
+ } else {
+ return;
+ }
+ break;
+ }
+
+ // sort each section
+ foreach ($this->menu as $index => $section) {
+ foreach ($section as $key => $node) {
+ $section[$key]->setData('original_order', $key);
+ }
+ usort($section, $sort_callback);
+ $this->menu[$index] = $section;
+
+ // depth first traversal of tree
+ foreach ($section as $root) {
+ $stack = array();
+ array_push($stack, $root);
+ while (!empty($stack)) {
+ $node = array_pop($stack);
+ /* @var ElggMenuItem $node */
+ $node->sortChildren($sort_callback);
+ $children = $node->getChildren();
+ if ($children) {
+ $stack = array_merge($stack, $children);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Compare two menu items by their display text
+ *
+ * @param ElggMenuItem $a Menu item
+ * @param ElggMenuItem $b Menu item
+ * @return bool
+ */
+ public static function compareByText($a, $b) {
+ $at = $a->getText();
+ $bt = $b->getText();
+
+ $result = strnatcmp($at, $bt);
+ if ($result === 0) {
+ return $a->getData('original_order') - $b->getData('original_order');
+ }
+ return $result;
+ }
+
+ /**
+ * Compare two menu items by their identifiers
+ *
+ * @param ElggMenuItem $a Menu item
+ * @param ElggMenuItem $b Menu item
+ * @return bool
+ */
+ public static function compareByName($a, $b) {
+ $an = $a->getName();
+ $bn = $b->getName();
+
+ $result = strcmp($an, $bn);
+ if ($result === 0) {
+ return $a->getData('original_order') - $b->getData('original_order');
+ }
+ return $result;
+ }
+
+ /**
+ * Compare two menu items by their priority
+ *
+ * @param ElggMenuItem $a Menu item
+ * @param ElggMenuItem $b Menu item
+ * @return bool
+ *
+ * @todo change name to compareByPriority
+ */
+ public static function compareByWeight($a, $b) {
+ $aw = $a->getWeight();
+ $bw = $b->getWeight();
+
+ if ($aw == $bw) {
+ return $a->getData('original_order') - $b->getData('original_order');
+ }
+ return $aw - $bw;
+ }
+}
diff --git a/engine/classes/ElggMenuItem.php b/engine/classes/ElggMenuItem.php
new file mode 100644
index 000000000..81ce6c099
--- /dev/null
+++ b/engine/classes/ElggMenuItem.php
@@ -0,0 +1,590 @@
+<?php
+/**
+ * Elgg Menu Item
+ *
+ * To create a menu item that is not a link, pass false for $href.
+ *
+ * @package Elgg.Core
+ * @subpackage Navigation
+ * @since 1.8.0
+ */
+class ElggMenuItem {
+
+ /**
+ * @var array Non-rendered data about the menu item
+ */
+ protected $data = array(
+ // string Identifier of the menu
+ 'name' => '',
+
+ // array Page contexts this menu item should appear on
+ 'contexts' => array('all'),
+
+ // string Menu section identifier
+ 'section' => 'default',
+
+ // int Smaller priorities float to the top
+ 'priority' => 100,
+
+ // bool Is this the currently selected menu item
+ 'selected' => false,
+
+ // string Identifier of this item's parent
+ 'parent_name' => '',
+
+ // ElggMenuItem The parent object or null
+ 'parent' => null,
+
+ // array Array of children objects or empty array
+ 'children' => array(),
+
+ // array Classes to apply to the li tag
+ 'itemClass' => array(),
+
+ // array Classes to apply to the anchor tag
+ 'linkClass' => array(),
+ );
+
+ /**
+ * @var string The menu display string
+ */
+ protected $text;
+
+ /**
+ * @var string The menu url
+ */
+ protected $href = null;
+
+ /**
+ * @var string Tooltip
+ */
+ protected $title = false;
+
+ /**
+ * @var string The string to display if link is clicked
+ */
+ protected $confirm = '';
+
+
+ /**
+ * ElggMenuItem constructor
+ *
+ * @param string $name Identifier of the menu item
+ * @param string $text Display text of the menu item
+ * @param string $href URL of the menu item (false if not a link)
+ */
+ public function __construct($name, $text, $href) {
+ //$this->name = $name;
+ $this->text = $text;
+ if ($href) {
+ $this->href = elgg_normalize_url($href);
+ } else {
+ $this->href = $href;
+ }
+
+ $this->data['name'] = $name;
+ }
+
+ /**
+ * ElggMenuItem factory method
+ *
+ * This static method creates an ElggMenuItem from an associative array.
+ * Required keys are name, text, and href.
+ *
+ * @param array $options Option array of key value pairs
+ *
+ * @return ElggMenuItem or NULL on error
+ */
+ public static function factory($options) {
+ if (!isset($options['name']) || !isset($options['text'])) {
+ return NULL;
+ }
+ if (!isset($options['href'])) {
+ $options['href'] = '';
+ }
+
+ $item = new ElggMenuItem($options['name'], $options['text'], $options['href']);
+ unset($options['name']);
+ unset($options['text']);
+ unset($options['href']);
+
+ // special catch in case someone uses context rather than contexts
+ if (isset($options['context'])) {
+ $options['contexts'] = $options['context'];
+ unset($options['context']);
+ }
+
+ // make sure contexts is set correctly
+ if (isset($options['contexts'])) {
+ $item->setContext($options['contexts']);
+ unset($options['contexts']);
+ }
+
+ if (isset($options['link_class'])) {
+ $item->setLinkClass($options['link_class']);
+ unset($options['link_class']);
+ }
+
+ if (isset($options['item_class'])) {
+ $item->setItemClass($options['item_class']);
+ unset($options['item_class']);
+ }
+
+ if (isset($options['data']) && is_array($options['data'])) {
+ $item->setData($options['data']);
+ unset($options['data']);
+ }
+
+ foreach ($options as $key => $value) {
+ if (isset($item->data[$key])) {
+ $item->data[$key] = $value;
+ } else {
+ $item->$key = $value;
+ }
+ }
+
+ return $item;
+ }
+
+ /**
+ * Set a data key/value pair or a set of key/value pairs
+ *
+ * This method allows storage of arbitrary data with this menu item. The
+ * data can be used for sorting, custom rendering, or any other use.
+ *
+ * @param mixed $key String key or an associative array of key/value pairs
+ * @param mixed $value The value if $key is a string
+ * @return void
+ */
+ public function setData($key, $value = null) {
+ if (is_array($key)) {
+ $this->data += $key;
+ } else {
+ $this->data[$key] = $value;
+ }
+ }
+
+ /**
+ * Get stored data
+ *
+ * @param string $key The key for the requested key/value pair
+ * @return mixed
+ */
+ public function getData($key) {
+ if (isset($this->data[$key])) {
+ return $this->data[$key];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Set the identifier of the menu item
+ *
+ * @param string $name Unique identifier
+ * @return void
+ */
+ public function setName($name) {
+ $this->data['name'] = $name;
+ }
+
+ /**
+ * Get the identifier of the menu item
+ *
+ * @return string
+ */
+ public function getName() {
+ return $this->data['name'];
+ }
+
+ /**
+ * Set the display text of the menu item
+ *
+ * @param string $text The display text
+ * @return void
+ */
+ public function setText($text) {
+ $this->text = $text;
+ }
+
+ /**
+ * Get the display text of the menu item
+ *
+ * @return string
+ */
+ public function getText() {
+ return $this->text;
+ }
+
+ /**
+ * Set the URL of the menu item
+ *
+ * @param string $href URL or false if not a link
+ * @return void
+ */
+ public function setHref($href) {
+ $this->href = $href;
+ }
+
+ /**
+ * Get the URL of the menu item
+ *
+ * @return string
+ */
+ public function getHref() {
+ return $this->href;
+ }
+
+ /**
+ * Set the contexts that this menu item is available for
+ *
+ * @param array $contexts An array of context strings
+ * @return void
+ */
+ public function setContext($contexts) {
+ if (is_string($contexts)) {
+ $contexts = array($contexts);
+ }
+ $this->data['contexts'] = $contexts;
+ }
+
+ /**
+ * Get an array of context strings
+ *
+ * @return array
+ */
+ public function getContext() {
+ return $this->data['contexts'];
+ }
+
+ /**
+ * Should this menu item be used given the current context
+ *
+ * @param string $context A context string (default is empty string for
+ * current context stack).
+ * @return bool
+ */
+ public function inContext($context = '') {
+ if ($context) {
+ return in_array($context, $this->data['contexts']);
+ }
+
+ if (in_array('all', $this->data['contexts'])) {
+ return true;
+ }
+
+ foreach ($this->data['contexts'] as $context) {
+ if (elgg_in_context($context)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Set the selected flag
+ *
+ * @param bool $state Selected state (default is true)
+ * @return void
+ */
+ public function setSelected($state = true) {
+ $this->data['selected'] = $state;
+ }
+
+ /**
+ * Get selected state
+ *
+ * @return bool
+ */
+ public function getSelected() {
+ return $this->data['selected'];
+ }
+
+ /**
+ * Set the tool tip text
+ *
+ * @param string $text The text of the tool tip
+ * @return void
+ */
+ public function setTooltip($text) {
+ $this->title = $text;
+ }
+
+ /**
+ * Get the tool tip text
+ *
+ * @return string
+ */
+ public function getTooltip() {
+ return $this->title;
+ }
+
+ /**
+ * Set the confirm text shown when link is clicked
+ *
+ * @param string $text The text to show
+ * @return void
+ */
+ public function setConfirmText($text) {
+ $this->confirm = $text;
+ }
+
+ /**
+ * Get the confirm text
+ *
+ * @return string
+ */
+ public function getConfirmText() {
+ return $this->confirm;
+ }
+
+ /**
+ * Set the anchor class
+ *
+ * @param mixed $class An array of class names, or a single string class name.
+ * @return void
+ */
+ public function setLinkClass($class) {
+ if (!is_array($class)) {
+ $this->data['linkClass'] = array($class);
+ } else {
+ $this->data['linkClass'] = $class;
+ }
+ }
+
+ /**
+ * Get the anchor classes as text
+ *
+ * @return string
+ */
+ public function getLinkClass() {
+ return implode(' ', $this->data['linkClass']);
+ }
+
+ /**
+ * Add a link class
+ *
+ * @param mixed $class An array of class names, or a single string class name.
+ * @return void
+ */
+ public function addLinkClass($class) {
+ if (!is_array($class)) {
+ $this->data['linkClass'][] = $class;
+ } else {
+ $this->data['linkClass'] += $class;
+ }
+ }
+
+ /**
+ * Set the li classes
+ *
+ * @param mixed $class An array of class names, or a single string class name.
+ * @return void
+ */
+ public function setItemClass($class) {
+ if (!is_array($class)) {
+ $this->data['itemClass'] = array($class);
+ } else {
+ $this->data['itemClass'] = $class;
+ }
+ }
+
+ /**
+ * Get the li classes as text
+ *
+ * @return string
+ */
+ public function getItemClass() {
+ // allow people to specify name with underscores and colons
+ $name = strtolower($this->getName());
+ $name = str_replace('_', '-', $name);
+ $name = str_replace(':', '-', $name);
+ $name = str_replace(' ', '-', $name);
+
+ $class = implode(' ', $this->data['itemClass']);
+ if ($class) {
+ return "elgg-menu-item-$name $class";
+ } else {
+ return "elgg-menu-item-$name";
+ }
+ }
+
+ /**
+ * Set the priority of the menu item
+ *
+ * @param int $priority The smaller numbers mean higher priority (1 before 100)
+ * @return void
+ * @deprecated
+ */
+ public function setWeight($priority) {
+ $this->data['priority'] = $priority;
+ }
+
+ /**
+ * Get the priority of the menu item
+ *
+ * @return int
+ * @deprecated
+ */
+ public function getWeight() {
+ return $this->data['priority'];
+ }
+
+ /**
+ * Set the priority of the menu item
+ *
+ * @param int $priority The smaller numbers mean higher priority (1 before 100)
+ * @return void
+ */
+ public function setPriority($priority) {
+ $this->data['priority'] = $priority;
+ }
+
+ /**
+ * Get the priority of the menu item
+ *
+ * @return int
+ */
+ public function getPriority() {
+ return $this->data['priority'];
+ }
+
+ /**
+ * Set the section identifier
+ *
+ * @param string $section The identifier of the section
+ * @return void
+ */
+ public function setSection($section) {
+ $this->data['section'] = $section;
+ }
+
+ /**
+ * Get the section identifier
+ *
+ * @return string
+ */
+ public function getSection() {
+ return $this->data['section'];
+ }
+
+ /**
+ * Set the parent identifier
+ *
+ * @param string $name The identifier of the parent ElggMenuItem
+ * @return void
+ */
+ public function setParentName($name) {
+ $this->data['parent_name'] = $name;
+ }
+
+ /**
+ * Get the parent identifier
+ *
+ * @return string
+ */
+ public function getParentName() {
+ return $this->data['parent_name'];
+ }
+
+ /**
+ * Set the parent menu item
+ *
+ * @param ElggMenuItem $parent The parent of this menu item
+ * @return void
+ */
+ public function setParent($parent) {
+ $this->data['parent'] = $parent;
+ }
+
+ /**
+ * Get the parent menu item
+ *
+ * @return ElggMenuItem or null
+ */
+ public function getParent() {
+ return $this->data['parent'];
+ }
+
+ /**
+ * Add a child menu item
+ *
+ * @param ElggMenuItem $item A child menu item
+ * @return void
+ */
+ public function addChild($item) {
+ $this->data['children'][] = $item;
+ }
+
+ /**
+ * Set the menu item's children
+ *
+ * @param array $children Array of ElggMenuItems
+ * @return void
+ */
+ public function setChildren($children) {
+ $this->data['children'] = $children;
+ }
+
+ /**
+ * Get the children menu items
+ *
+ * @return array
+ */
+ public function getChildren() {
+ return $this->data['children'];
+ }
+
+ /**
+ * Sort the children
+ *
+ * @param string $sortFunction A function that is passed to usort()
+ * @return void
+ */
+ public function sortChildren($sortFunction) {
+ foreach ($this->data['children'] as $key => $node) {
+ $this->data['children'][$key]->data['original_order'] = $key;
+ }
+ usort($this->data['children'], $sortFunction);
+ }
+
+ /**
+ * Get the menu item content (usually a link)
+ *
+ * @param array $vars Options to pass to output/url if a link
+ * @return string
+ * @todo View code in a model. How do we feel about that?
+ */
+ public function getContent(array $vars = array()) {
+
+ if ($this->href === false) {
+ return $this->text;
+ }
+
+ $defaults = get_object_vars($this);
+ unset($defaults['data']);
+
+ $vars += $defaults;
+
+ if ($this->data['linkClass']) {
+ if (isset($vars['class'])) {
+ $vars['class'] = $vars['class'] . ' ' . $this->getLinkClass();
+ } else {
+ $vars['class'] = $this->getLinkClass();
+ }
+ }
+
+ if (!isset($vars['rel']) && !isset($vars['is_trusted'])) {
+ $vars['is_trusted'] = true;
+ }
+
+ if ($this->confirm) {
+ $vars['confirm'] = $this->confirm;
+ return elgg_view('output/confirmlink', $vars);
+ } else {
+ unset($vars['confirm']);
+ }
+
+ return elgg_view('output/url', $vars);
+ }
+}
diff --git a/engine/classes/ElggMetadata.php b/engine/classes/ElggMetadata.php
new file mode 100644
index 000000000..3a8e2d817
--- /dev/null
+++ b/engine/classes/ElggMetadata.php
@@ -0,0 +1,158 @@
+<?php
+
+/**
+ * ElggMetadata
+ * This class describes metadata that can be attached to ElggEntities.
+ *
+ * @package Elgg.Core
+ * @subpackage Metadata
+ *
+ * @property string $value_type
+ * @property int $owner_guid
+ * @property string $enabled
+ */
+class ElggMetadata extends ElggExtender {
+
+ /**
+ * (non-PHPdoc)
+ *
+ * @see ElggData::initializeAttributes()
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = "metadata";
+ }
+
+ /**
+ * Construct a metadata object
+ *
+ * @param mixed $id ID of metadata or a database row as stdClass object
+ */
+ function __construct($id = null) {
+ $this->initializeAttributes();
+
+ if (!empty($id)) {
+ // Create from db row
+ if ($id instanceof stdClass) {
+ $metadata = $id;
+
+ $objarray = (array) $metadata;
+ foreach ($objarray as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else {
+ // get an ElggMetadata object and copy its attributes
+ $metadata = elgg_get_metadata_from_id($id);
+ $this->attributes = $metadata->attributes;
+ }
+ }
+ }
+
+ /**
+ * Determines whether or not the user can edit this piece of metadata
+ *
+ * @param int $user_guid The GUID of the user (defaults to currently logged in user)
+ *
+ * @return bool Depending on permissions
+ */
+ function canEdit($user_guid = 0) {
+ if ($entity = get_entity($this->get('entity_guid'))) {
+ return $entity->canEditMetadata($this, $user_guid);
+ }
+ return false;
+ }
+
+ /**
+ * Save metadata object
+ *
+ * @return int|bool the metadata object id or true if updated
+ *
+ * @throws IOException
+ */
+ function save() {
+ if ($this->id > 0) {
+ return update_metadata($this->id, $this->name, $this->value,
+ $this->value_type, $this->owner_guid, $this->access_id);
+ } else {
+ $this->id = create_metadata($this->entity_guid, $this->name, $this->value,
+ $this->value_type, $this->owner_guid, $this->access_id);
+
+ if (!$this->id) {
+ throw new IOException(elgg_echo('IOException:UnableToSaveNew', array(get_class())));
+ }
+ return $this->id;
+ }
+ }
+
+ /**
+ * Delete the metadata
+ *
+ * @return bool
+ */
+ function delete() {
+ $success = elgg_delete_metastring_based_object_by_id($this->id, 'metadata');
+ if ($success) {
+ // we mark unknown here because this deletes only one value
+ // under this name, and there may be others remaining.
+ elgg_get_metadata_cache()->markUnknown($this->entity_guid, $this->name);
+ }
+ return $success;
+ }
+
+ /**
+ * Disable the metadata
+ *
+ * @return bool
+ * @since 1.8
+ */
+ function disable() {
+ $success = elgg_set_metastring_based_object_enabled_by_id($this->id, 'no', 'metadata');
+ if ($success) {
+ // we mark unknown here because this disables only one value
+ // under this name, and there may be others remaining.
+ elgg_get_metadata_cache()->markUnknown($this->entity_guid, $this->name);
+ }
+ return $success;
+ }
+
+ /**
+ * Enable the metadata
+ *
+ * @return bool
+ * @since 1.8
+ */
+ function enable() {
+ $success = elgg_set_metastring_based_object_enabled_by_id($this->id, 'yes', 'metadata');
+ if ($success) {
+ elgg_get_metadata_cache()->markUnknown($this->entity_guid, $this->name);
+ }
+ return $success;
+ }
+
+ /**
+ * Get a url for this item of metadata.
+ *
+ * @return string
+ */
+ public function getURL() {
+ return get_metadata_url($this->id);
+ }
+
+ // SYSTEM LOG INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * For a given ID, return the object associated with it.
+ * This is used by the river functionality primarily.
+ * This is useful for checking access permissions etc on objects.
+ *
+ * @param int $id Metadata ID
+ *
+ * @return ElggMetadata
+ */
+ public function getObjectFromID($id) {
+ return elgg_get_metadata_from_id($id);
+ }
+}
diff --git a/engine/classes/ElggObject.php b/engine/classes/ElggObject.php
new file mode 100644
index 000000000..aeaa3ba5c
--- /dev/null
+++ b/engine/classes/ElggObject.php
@@ -0,0 +1,216 @@
+<?php
+/**
+ * Elgg Object
+ *
+ * Elgg objects are the most common means of storing information in the database.
+ * They are a child class of ElggEntity, so receive all the benefits of the Entities,
+ * but also include a title and description field.
+ *
+ * An ElggObject represents a row from the objects_entity table, as well
+ * as the related row in the entities table as represented by the parent
+ * ElggEntity object.
+ *
+ * @internal Title and description are stored in the objects_entity table.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Object
+ *
+ * @property string $title The title, name, or summary of this object
+ * @property string $description The body, description, or content of the object
+ * @property array $tags Array of tags that describe the object
+ */
+class ElggObject extends ElggEntity {
+
+ /**
+ * Initialise the attributes array to include the type,
+ * title, and description.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = "object";
+ $this->attributes['title'] = NULL;
+ $this->attributes['description'] = NULL;
+ $this->attributes['tables_split'] = 2;
+ }
+
+ /**
+ * Load or create a new ElggObject.
+ *
+ * If no arguments are passed, create a new entity.
+ *
+ * If an argument is passed, attempt to load a full ElggObject entity.
+ * Arguments can be:
+ * - The GUID of an object entity.
+ * - A DB result object from the entities table with a guid property
+ *
+ * @param mixed $guid If an int, load that GUID. If a db row, then will attempt to
+ * load the rest of the data.
+ *
+ * @throws IOException If passed an incorrect guid
+ * @throws InvalidParameterException If passed an Elgg* Entity that isn't an ElggObject
+ */
+ function __construct($guid = null) {
+ $this->initializeAttributes();
+
+ // compatibility for 1.7 api.
+ $this->initialise_attributes(false);
+
+ if (!empty($guid)) {
+ // Is $guid is a DB row from the entity table
+ if ($guid instanceof stdClass) {
+ // Load the rest
+ if (!$this->load($guid)) {
+ $msg = elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid->guid));
+ throw new IOException($msg);
+ }
+ } else if ($guid instanceof ElggObject) {
+ // $guid is an ElggObject so this is a copy constructor
+ elgg_deprecated_notice('This type of usage of the ElggObject constructor was deprecated. Please use the clone method.', 1.7);
+
+ foreach ($guid->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else if ($guid instanceof ElggEntity) {
+ // @todo remove - do not need separate exception
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggObject'));
+ } else if (is_numeric($guid)) {
+ // $guid is a GUID so load
+ if (!$this->load($guid)) {
+ throw new IOException(elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid)));
+ }
+ } else {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue'));
+ }
+ }
+ }
+
+ /**
+ * Loads the full ElggObject when given a guid.
+ *
+ * @param mixed $guid GUID of an ElggObject or the stdClass object from entities table
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+ protected function load($guid) {
+ $attr_loader = new ElggAttributeLoader(get_class(), 'object', $this->attributes);
+ $attr_loader->requires_access_control = !($this instanceof ElggPlugin);
+ $attr_loader->secondary_loader = 'get_object_entity_as_row';
+
+ $attrs = $attr_loader->getRequiredAttributes($guid);
+ if (!$attrs) {
+ return false;
+ }
+
+ $this->attributes = $attrs;
+ $this->attributes['tables_loaded'] = 2;
+ _elgg_cache_entity($this);
+
+ return true;
+ }
+
+ /**
+ * Saves object-specific attributes.
+ *
+ * @internal Object attributes are saved in the objects_entity table.
+ *
+ * @return bool
+ */
+ public function save() {
+ // Save ElggEntity attributes
+ if (!parent::save()) {
+ return false;
+ }
+
+ // Save ElggObject-specific attributes
+
+ _elgg_disable_caching_for_entity($this->guid);
+ $ret = create_object_entity($this->get('guid'), $this->get('title'), $this->get('description'));
+ _elgg_enable_caching_for_entity($this->guid);
+
+ return $ret;
+ }
+
+ /**
+ * Return sites that this object is a member of
+ *
+ * Site membership is determined by relationships and not site_guid.d
+ *
+ * @todo This should be moved to ElggEntity
+ * @todo Unimplemented
+ *
+ * @param string $subtype Optionally, the subtype of result we want to limit to
+ * @param int $limit The number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return array|false
+ */
+ function getSites($subtype = "", $limit = 10, $offset = 0) {
+ return get_site_objects($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Add this object to a site
+ *
+ * @param int $site_guid The guid of the site to add it to
+ *
+ * @return bool
+ */
+ function addToSite($site_guid) {
+ return add_site_object($this->getGUID(), $site_guid);
+ }
+
+ /*
+ * EXPORTABLE INTERFACE
+ */
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array_merge(parent::getExportableValues(), array(
+ 'title',
+ 'description',
+ ));
+ }
+
+ /**
+ * Can a user comment on this object?
+ *
+ * @see ElggEntity::canComment()
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @return bool
+ * @since 1.8.0
+ */
+ public function canComment($user_guid = 0) {
+ $result = parent::canComment($user_guid);
+ if ($result !== null) {
+ return $result;
+ }
+
+ if ($user_guid == 0) {
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+
+ // must be logged in to comment
+ if (!$user_guid) {
+ return false;
+ }
+
+ // must be member of group
+ if (elgg_instanceof($this->getContainerEntity(), 'group')) {
+ if (!$this->getContainerEntity()->canWriteToContainer($user_guid)) {
+ return false;
+ }
+ }
+
+ // no checks on read access since a user cannot see entities outside his access
+ return true;
+ }
+}
diff --git a/engine/classes/ElggPAM.php b/engine/classes/ElggPAM.php
new file mode 100644
index 000000000..f07095fc1
--- /dev/null
+++ b/engine/classes/ElggPAM.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * ElggPAM Pluggable Authentication Module
+ *
+ * @package Elgg.Core
+ * @subpackage Authentication
+ */
+class ElggPAM {
+ /**
+ * @var string PAM policy type: user, api or plugin-defined policies
+ */
+ protected $policy;
+
+ /**
+ * @var array Failure mesages
+ */
+ protected $messages;
+
+ /**
+ * ElggPAM constructor
+ *
+ * @param string $policy PAM policy type: user, api, or plugin-defined policies
+ */
+ public function __construct($policy) {
+ $this->policy = $policy;
+ $this->messages = array('sufficient' => array(), 'required' => array());
+ }
+
+ /**
+ * Authenticate a set of credentials against a policy
+ * This function will process all registered PAM handlers or stop when the first
+ * handler fails. A handler fails by either returning false or throwing an
+ * exception. The advantage of throwing an exception is that it returns a message
+ * that can be passed to the user. The processing order of the handlers is
+ * determined by the order that they were registered.
+ *
+ * If $credentials are provided, the PAM handler should authenticate using the
+ * provided credentials. If not, then credentials should be prompted for or
+ * otherwise retrieved (eg from the HTTP header or $_SESSION).
+ *
+ * @param array $credentials Credentials array dependant on policy type
+ * @return bool
+ */
+ public function authenticate($credentials = array()) {
+ global $_PAM_HANDLERS;
+
+ if (!isset($_PAM_HANDLERS[$this->policy]) ||
+ !is_array($_PAM_HANDLERS[$this->policy])) {
+ return false;
+ }
+
+ $authenticated = false;
+
+ foreach ($_PAM_HANDLERS[$this->policy] as $k => $v) {
+ $handler = $v->handler;
+ if (!is_callable($handler)) {
+ continue;
+ }
+ /* @var callable $handler */
+
+ $importance = $v->importance;
+
+ try {
+ // Execute the handler
+ // @todo don't assume $handler is a global function
+ $result = call_user_func($handler, $credentials);
+ if ($result) {
+ $authenticated = true;
+ } elseif ($result === false) {
+ if ($importance == 'required') {
+ $this->messages['required'][] = "$handler:failed";
+ return false;
+ } else {
+ $this->messages['sufficient'][] = "$handler:failed";
+ }
+ }
+ } catch (Exception $e) {
+ if ($importance == 'required') {
+ $this->messages['required'][] = $e->getMessage();
+ return false;
+ } else {
+ $this->messages['sufficient'][] = $e->getMessage();
+ }
+ }
+ }
+
+ return $authenticated;
+ }
+
+ /**
+ * Get a failure message to display to user
+ *
+ * @return string
+ */
+ public function getFailureMessage() {
+ $message = elgg_echo('auth:nopams');
+ if (!empty($this->messages['required'])) {
+ $message = $this->messages['required'][0];
+ } elseif (!empty($this->messages['sufficient'])) {
+ $message = $this->messages['sufficient'][0];
+ }
+
+ return elgg_trigger_plugin_hook('fail', 'auth', $this->messages, $message);
+ }
+}
diff --git a/engine/classes/ElggPlugin.php b/engine/classes/ElggPlugin.php
new file mode 100644
index 000000000..545b9a53c
--- /dev/null
+++ b/engine/classes/ElggPlugin.php
@@ -0,0 +1,1006 @@
+<?php
+/**
+ * Stores site-side plugin settings as private data.
+ *
+ * This class is currently a stub, allowing a plugin to
+ * save settings in an object's private settings for each site.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins.Settings
+ */
+class ElggPlugin extends ElggObject {
+ private $package;
+ private $manifest;
+
+ private $path;
+ private $pluginID;
+ private $errorMsg = '';
+
+ /**
+ * Set subtype to 'plugin'
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['subtype'] = "plugin";
+
+ // plugins must be public.
+ $this->access_id = ACCESS_PUBLIC;
+ }
+
+ /**
+ * Loads the plugin by GUID or path.
+ *
+ * @warning Unlike other ElggEntity objects, you cannot null instantiate
+ * ElggPlugin. You must point it to an actual plugin GUID or location.
+ *
+ * @param mixed $plugin The GUID of the ElggPlugin object or the path of the plugin to load.
+ *
+ * @throws PluginException
+ */
+ public function __construct($plugin) {
+ if (!$plugin) {
+ throw new PluginException(elgg_echo('PluginException:NullInstantiated'));
+ }
+
+ // ElggEntity can be instantiated with a guid or an object.
+ // @todo plugins w/id 12345
+ if (is_numeric($plugin) || is_object($plugin)) {
+ parent::__construct($plugin);
+ $this->path = elgg_get_plugins_path() . $this->getID();
+ } else {
+ $plugin_path = elgg_get_plugins_path();
+
+ // not a full path, so assume an id
+ // use the default path
+ if (strpos($plugin, $plugin_path) !== 0) {
+ $plugin = $plugin_path . $plugin;
+ }
+
+ // path checking is done in the package
+ $plugin = sanitise_filepath($plugin);
+ $this->path = $plugin;
+ $path_parts = explode('/', rtrim($plugin, '/'));
+ $plugin_id = array_pop($path_parts);
+ $this->pluginID = $plugin_id;
+
+ // check if we're loading an existing plugin
+ $existing_plugin = elgg_get_plugin_from_id($this->pluginID);
+ $existing_guid = null;
+
+ if ($existing_plugin) {
+ $existing_guid = $existing_plugin->guid;
+ }
+
+ // load the rest of the plugin
+ parent::__construct($existing_guid);
+ }
+
+ _elgg_cache_plugin_by_id($this);
+ }
+
+ /**
+ * Save the plugin object. Make sure required values exist.
+ *
+ * @see ElggObject::save()
+ * @return bool
+ */
+ public function save() {
+ // own by the current site so users can be deleted without affecting plugins
+ $site = get_config('site');
+ $this->attributes['site_guid'] = $site->guid;
+ $this->attributes['owner_guid'] = $site->guid;
+ $this->attributes['container_guid'] = $site->guid;
+ $this->attributes['title'] = $this->pluginID;
+
+ if (parent::save()) {
+ // make sure we have a priority
+ $priority = $this->getPriority();
+ if ($priority === FALSE || $priority === NULL) {
+ return $this->setPriority('last');
+ }
+ } else {
+ return false;
+ }
+ }
+
+
+ // Plugin ID and path
+
+ /**
+ * Returns the ID (dir name) of this plugin
+ *
+ * @return string
+ */
+ public function getID() {
+ return $this->title;
+ }
+
+ /**
+ * Returns the manifest's name if available, otherwise the ID.
+ *
+ * @return string
+ * @since 1.8.1
+ */
+ public function getFriendlyName() {
+ $manifest = $this->getManifest();
+ if ($manifest) {
+ return $manifest->getName();
+ }
+
+ return $this->getID();
+ }
+
+ /**
+ * Returns the plugin's full path with trailing slash.
+ *
+ * @return string
+ */
+ public function getPath() {
+ return sanitise_filepath($this->path);
+ }
+
+ /**
+ * Sets the location of this plugin.
+ *
+ * @param string $id The path to the plugin's dir.
+ * @return bool
+ */
+ public function setID($id) {
+ return $this->attributes['title'] = $id;
+ }
+
+ /**
+ * Returns an array of available markdown files for this plugin
+ *
+ * @return array
+ */
+ public function getAvailableTextFiles() {
+ $filenames = $this->getPackage()->getTextFilenames();
+
+ $files = array();
+ foreach ($filenames as $filename) {
+ if ($this->canReadFile($filename)) {
+ $files[$filename] = "$this->path/$filename";
+ }
+ }
+
+ return $files;
+ }
+
+ // Load Priority
+
+ /**
+ * Gets the plugin's load priority.
+ *
+ * @return int
+ */
+ public function getPriority() {
+ $name = elgg_namespace_plugin_private_setting('internal', 'priority');
+ return $this->$name;
+ }
+
+ /**
+ * Sets the priority of the plugin
+ *
+ * @param mixed $priority The priority to set. One of +1, -1, first, last, or a number.
+ * If given a number, this will displace all plugins at that number
+ * and set their priorities +1
+ * @param mixed $site_guid Optional site GUID.
+ * @return bool
+ */
+ public function setPriority($priority, $site_guid = null) {
+ if (!$this->guid) {
+ return false;
+ }
+
+ $db_prefix = get_config('dbprefix');
+ $name = elgg_namespace_plugin_private_setting('internal', 'priority');
+ // if no priority assume a priority of 1
+ $old_priority = (int) $this->getPriority();
+ $old_priority = (!$old_priority) ? 1 : $old_priority;
+ $max_priority = elgg_get_max_plugin_priority();
+
+ // can't use switch here because it's not strict and
+ // php evaluates +1 == 1
+ if ($priority === '+1') {
+ $priority = $old_priority + 1;
+ } elseif ($priority === '-1') {
+ $priority = $old_priority - 1;
+ } elseif ($priority === 'first') {
+ $priority = 1;
+ } elseif ($priority === 'last') {
+ $priority = $max_priority;
+ }
+
+ // should be a number by now
+ if ($priority > 0) {
+ if (!is_numeric($priority)) {
+ return false;
+ }
+
+ // there's nothing above the max.
+ if ($priority > $max_priority) {
+ $priority = $max_priority;
+ }
+
+ // there's nothing below 1.
+ if ($priority < 1) {
+ $priority = 1;
+ }
+
+ if ($priority > $old_priority) {
+ $op = '-';
+ $where = "CAST(value as unsigned) BETWEEN $old_priority AND $priority";
+ } else {
+ $op = '+';
+ $where = "CAST(value as unsigned) BETWEEN $priority AND $old_priority";
+ }
+
+ // displace the ones affected by this change
+ $q = "UPDATE {$db_prefix}private_settings
+ SET value = CAST(value as unsigned) $op 1
+ WHERE entity_guid != $this->guid
+ AND name = '$name'
+ AND $where";
+
+ if (!update_data($q)) {
+ return false;
+ }
+
+ // set this priority
+ if ($this->set($name, $priority)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+
+ // Plugin settings
+
+ /**
+ * Returns a plugin setting
+ *
+ * @param string $name The setting name
+ * @return mixed
+ */
+ public function getSetting($name) {
+ return $this->$name;
+ }
+
+ /**
+ * Returns an array of all settings saved for this plugin.
+ *
+ * @note Unlike user settings, plugin settings are not namespaced.
+ *
+ * @return array An array of key/value pairs.
+ */
+ public function getAllSettings() {
+ if (!$this->guid) {
+ return false;
+ }
+
+ $db_prefix = elgg_get_config('dbprefix');
+ // need to remove all namespaced private settings.
+ $us_prefix = elgg_namespace_plugin_private_setting('user_setting', '', $this->getID());
+ $is_prefix = elgg_namespace_plugin_private_setting('internal', '', $this->getID());
+
+ // Get private settings for user
+ $q = "SELECT * FROM {$db_prefix}private_settings
+ WHERE entity_guid = $this->guid
+ AND name NOT LIKE '$us_prefix%'
+ AND name NOT LIKE '$is_prefix%'";
+
+ $private_settings = get_data($q);
+
+ $return = array();
+
+ if ($private_settings) {
+ foreach ($private_settings as $setting) {
+ $return[$setting->name] = $setting->value;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Set a plugin setting for the plugin
+ *
+ * @todo This will only work once the plugin has a GUID.
+ *
+ * @param string $name The name to set
+ * @param string $value The value to set
+ *
+ * @return bool
+ */
+ public function setSetting($name, $value) {
+ if (!$this->guid) {
+ return false;
+ }
+
+ return $this->set($name, $value);
+ }
+
+ /**
+ * Removes a plugin setting name and value.
+ *
+ * @param string $name The setting name to remove
+ *
+ * @return bool
+ */
+ public function unsetSetting($name) {
+ return remove_private_setting($this->guid, $name);
+ }
+
+ /**
+ * Removes all settings for this plugin.
+ *
+ * @todo Should be a better way to do this without dropping to raw SQL.
+ * @todo If we could namespace the plugin settings this would be cleaner.
+ * @return bool
+ */
+ public function unsetAllSettings() {
+ $db_prefix = get_config('dbprefix');
+
+ $us_prefix = elgg_namespace_plugin_private_setting('user_setting', '', $this->getID());
+ $is_prefix = elgg_namespace_plugin_private_setting('internal', '', $this->getID());
+
+ $q = "DELETE FROM {$db_prefix}private_settings
+ WHERE entity_guid = $this->guid
+ AND name NOT LIKE '$us_prefix%'
+ AND name NOT LIKE '$is_prefix%'";
+
+ return delete_data($q);
+ }
+
+
+ // User settings
+
+ /**
+ * Returns a user's setting for this plugin
+ *
+ * @param string $name The setting name
+ * @param int $user_guid The user GUID
+ *
+ * @return mixed The setting string value or false
+ */
+ public function getUserSetting($name, $user_guid = null) {
+ $user_guid = (int)$user_guid;
+
+ if ($user_guid) {
+ $user = get_entity($user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ if (!($user instanceof ElggUser)) {
+ return false;
+ }
+
+ $name = elgg_namespace_plugin_private_setting('user_setting', $name, $this->getID());
+ return get_private_setting($user->guid, $name);
+ }
+
+ /**
+ * Returns an array of all user settings saved for this plugin for the user.
+ *
+ * @note Plugin settings are saved with a prefix. This removes that prefix.
+ *
+ * @param int $user_guid The user GUID. Defaults to logged in.
+ * @return array An array of key/value pairs.
+ */
+ public function getAllUserSettings($user_guid = null) {
+ $user_guid = (int)$user_guid;
+
+ if ($user_guid) {
+ $user = get_entity($user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ if (!($user instanceof ElggUser)) {
+ return false;
+ }
+
+ $db_prefix = elgg_get_config('dbprefix');
+ // send an empty name so we just get the first part of the namespace
+ $ps_prefix = elgg_namespace_plugin_private_setting('user_setting', '', $this->getID());
+ $ps_prefix_len = strlen($ps_prefix);
+
+ // Get private settings for user
+ $q = "SELECT * FROM {$db_prefix}private_settings
+ WHERE entity_guid = {$user->guid}
+ AND name LIKE '$ps_prefix%'";
+
+ $private_settings = get_data($q);
+
+ $return = array();
+
+ if ($private_settings) {
+ foreach ($private_settings as $setting) {
+ $name = substr($setting->name, $ps_prefix_len);
+ $value = $setting->value;
+
+ $return[$name] = $value;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Sets a user setting for a plugin
+ *
+ * @param string $name The setting name
+ * @param string $value The setting value
+ * @param int $user_guid The user GUID
+ *
+ * @return mixed The new setting ID or false
+ */
+ public function setUserSetting($name, $value, $user_guid = null) {
+ $user_guid = (int)$user_guid;
+
+ if ($user_guid) {
+ $user = get_entity($user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ if (!($user instanceof ElggUser)) {
+ return false;
+ }
+
+ // Hook to validate setting
+ // note: this doesn't pass the namespaced name
+ $value = elgg_trigger_plugin_hook('usersetting', 'plugin', array(
+ 'user' => $user,
+ 'plugin' => $this,
+ 'plugin_id' => $this->getID(),
+ 'name' => $name,
+ 'value' => $value
+ ), $value);
+
+ // set the namespaced name.
+ $name = elgg_namespace_plugin_private_setting('user_setting', $name, $this->getID());
+
+ return set_private_setting($user->guid, $name, $value);
+ }
+
+
+ /**
+ * Removes a user setting name and value.
+ *
+ * @param string $name The user setting name
+ * @param int $user_guid The user GUID
+ * @return bool
+ */
+ public function unsetUserSetting($name, $user_guid = null) {
+ $user_guid = (int)$user_guid;
+
+ if ($user_guid) {
+ $user = get_entity($user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ if (!($user instanceof ElggUser)) {
+ return false;
+ }
+
+ // set the namespaced name.
+ $name = elgg_namespace_plugin_private_setting('user_setting', $name, $this->getID());
+
+ return remove_private_setting($user->guid, $name);
+ }
+
+ /**
+ * Removes all User Settings for this plugin
+ *
+ * Use {@link removeAllUsersSettings()} to remove all user
+ * settings for all users. (Note the plural 'Users'.)
+ *
+ * @param int $user_guid The user GUID to remove user settings.
+ * @return bool
+ */
+ public function unsetAllUserSettings($user_guid) {
+ $db_prefix = get_config('dbprefix');
+ $ps_prefix = elgg_namespace_plugin_private_setting('user_setting', '', $this->getID());
+
+ $q = "DELETE FROM {$db_prefix}private_settings
+ WHERE entity_guid = $user_guid
+ AND name LIKE '$ps_prefix%'";
+
+ return delete_data($q);
+ }
+
+ /**
+ * Removes this plugin's user settings for all users.
+ *
+ * Use {@link removeAllUserSettings()} if you just want to remove
+ * settings for a single user.
+ *
+ * @return bool
+ */
+ public function unsetAllUsersSettings() {
+ $db_prefix = get_config('dbprefix');
+ $ps_prefix = elgg_namespace_plugin_private_setting('user_setting', '', $this->getID());
+
+ $q = "DELETE FROM {$db_prefix}private_settings
+ WHERE name LIKE '$ps_prefix%'";
+
+ return delete_data($q);
+ }
+
+
+ // validation
+
+ /**
+ * Returns if the plugin is complete, meaning has all required files
+ * and Elgg can read them and they make sense.
+ *
+ * @todo bad name? This could be confused with isValid() from ElggPluginPackage.
+ *
+ * @return bool
+ */
+ public function isValid() {
+ if (!$this->getID()) {
+ $this->errorMsg = elgg_echo('ElggPlugin:NoId', array($this->guid));
+ return false;
+ }
+
+ if (!$this->getPackage() instanceof ElggPluginPackage) {
+ $this->errorMsg = elgg_echo('ElggPlugin:NoPluginPackagePackage', array($this->getID(), $this->guid));
+ return false;
+ }
+
+ if (!$this->getPackage()->isValid()) {
+ $this->errorMsg = $this->getPackage()->getError();
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Is this plugin active?
+ *
+ * @param int $site_guid Optional site guid.
+ * @return bool
+ */
+ public function isActive($site_guid = null) {
+ if (!$this->guid) {
+ return false;
+ }
+
+ if ($site_guid) {
+ $site = get_entity($site_guid);
+ } else {
+ $site = get_config('site');
+ }
+
+ if (!($site instanceof ElggSite)) {
+ return false;
+ }
+
+ return check_entity_relationship($this->guid, 'active_plugin', $site->guid);
+ }
+
+ /**
+ * Checks if this plugin can be activated on the current
+ * Elgg installation.
+ *
+ * @todo remove $site_guid param or implement it
+ *
+ * @param mixed $site_guid Optional site guid
+ * @return bool
+ */
+ public function canActivate($site_guid = null) {
+ if ($this->getPackage()) {
+ $result = $this->getPackage()->isValid() && $this->getPackage()->checkDependencies();
+ if (!$result) {
+ $this->errorMsg = $this->getPackage()->getError();
+ }
+
+ return $result;
+ }
+
+ return false;
+ }
+
+
+ // activating and deactivating
+
+ /**
+ * Actives the plugin for the current site.
+ *
+ * @param mixed $site_guid Optional site GUID.
+ * @return bool
+ */
+ public function activate($site_guid = null) {
+ if ($this->isActive($site_guid)) {
+ return false;
+ }
+
+ if (!$this->canActivate()) {
+ return false;
+ }
+
+ // set in the db, now perform tasks and emit events
+ if ($this->setStatus(true, $site_guid)) {
+ // emit an event. returning false will make this not be activated.
+ // we need to do this after it's been fully activated
+ // or the deactivate will be confused.
+ $params = array(
+ 'plugin_id' => $this->pluginID,
+ 'plugin_entity' => $this
+ );
+
+ $return = elgg_trigger_event('activate', 'plugin', $params);
+
+ // if there are any on_enable functions, start the plugin now and run them
+ // Note: this will not run re-run the init hooks!
+ if ($return) {
+ if ($this->canReadFile('activate.php')) {
+ $flags = ELGG_PLUGIN_INCLUDE_START | ELGG_PLUGIN_REGISTER_CLASSES |
+ ELGG_PLUGIN_REGISTER_LANGUAGES | ELGG_PLUGIN_REGISTER_VIEWS;
+
+ $this->start($flags);
+
+ $return = $this->includeFile('activate.php');
+ }
+ }
+
+ if ($return === false) {
+ $this->deactivate($site_guid);
+ }
+
+ return $return;
+ }
+
+ return false;
+ }
+
+ /**
+ * Deactivates the plugin.
+ *
+ * @param mixed $site_guid Optional site GUID.
+ * @return bool
+ */
+ public function deactivate($site_guid = null) {
+ if (!$this->isActive($site_guid)) {
+ return false;
+ }
+
+ // emit an event. returning false will cause this to not be deactivated.
+ $params = array(
+ 'plugin_id' => $this->pluginID,
+ 'plugin_entity' => $this
+ );
+
+ $return = elgg_trigger_event('deactivate', 'plugin', $params);
+
+ // run any deactivate code
+ if ($return) {
+ if ($this->canReadFile('deactivate.php')) {
+ $return = $this->includeFile('deactivate.php');
+ }
+ }
+
+ if ($return === false) {
+ return false;
+ } else {
+ return $this->setStatus(false, $site_guid);
+ }
+ }
+
+ /**
+ * Start the plugin.
+ *
+ * @param int $flags Start flags for the plugin. See the constants in lib/plugins.php for details.
+ * @return true
+ * @throws PluginException
+ */
+ public function start($flags) {
+ //if (!$this->canActivate()) {
+ // return false;
+ //}
+
+ // include classes
+ if ($flags & ELGG_PLUGIN_REGISTER_CLASSES) {
+ $this->registerClasses();
+ }
+
+ // include start file
+ if ($flags & ELGG_PLUGIN_INCLUDE_START) {
+ $this->includeFile('start.php');
+ }
+
+ // include views
+ if ($flags & ELGG_PLUGIN_REGISTER_VIEWS) {
+ $this->registerViews();
+ }
+
+ // include languages
+ if ($flags & ELGG_PLUGIN_REGISTER_LANGUAGES) {
+ $this->registerLanguages();
+ }
+
+ return true;
+ }
+
+
+ // start helpers
+
+ /**
+ * Includes one of the plugins files
+ *
+ * @param string $filename The name of the file
+ *
+ * @throws PluginException
+ * @return mixed The return value of the included file (or 1 if there is none)
+ */
+ protected function includeFile($filename) {
+ // This needs to be here to be backwards compatible for 1.0-1.7.
+ // They expect the global config object to be available in start.php.
+ if ($filename == 'start.php') {
+ global $CONFIG;
+ }
+
+ $filepath = "$this->path/$filename";
+
+ if (!$this->canReadFile($filename)) {
+ $msg = elgg_echo('ElggPlugin:Exception:CannotIncludeFile',
+ array($filename, $this->getID(), $this->guid, $this->path));
+ throw new PluginException($msg);
+ }
+
+ return include $filepath;
+ }
+
+ /**
+ * Checks whether a plugin file with the given name exists
+ *
+ * @param string $filename The name of the file
+ * @return bool
+ */
+ protected function canReadFile($filename) {
+ return is_readable($this->path . '/' . $filename);
+ }
+
+ /**
+ * Registers the plugin's views
+ *
+ * @throws PluginException
+ * @return true
+ */
+ protected function registerViews() {
+ $view_dir = "$this->path/views/";
+
+ // plugins don't have to have views.
+ if (!is_dir($view_dir)) {
+ return true;
+ }
+
+ // but if they do, they have to be readable
+ $handle = opendir($view_dir);
+ if (!$handle) {
+ $msg = elgg_echo('ElggPlugin:Exception:CannotRegisterViews',
+ array($this->getID(), $this->guid, $view_dir));
+ throw new PluginException($msg);
+ }
+
+ while (FALSE !== ($view_type = readdir($handle))) {
+ $view_type_dir = $view_dir . $view_type;
+
+ if ('.' !== substr($view_type, 0, 1) && is_dir($view_type_dir)) {
+ if (autoregister_views('', $view_type_dir, $view_dir, $view_type)) {
+ elgg_register_viewtype($view_type);
+ } else {
+ $msg = elgg_echo('ElggPlugin:Exception:CannotRegisterViews',
+ array($this->getID(), $view_type_dir));
+ throw new PluginException($msg);
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Registers the plugin's languages
+ *
+ * @throws PluginException
+ * @return true
+ */
+ protected function registerLanguages() {
+ $languages_path = "$this->path/languages";
+
+ // don't need to have classes
+ if (!is_dir($languages_path)) {
+ return true;
+ }
+
+ // but need to have working ones.
+ if (!register_translations($languages_path)) {
+ $msg = elgg_echo('ElggPlugin:Exception:CannotRegisterLanguages',
+ array($this->getID(), $this->guid, $languages_path));
+ throw new PluginException($msg);
+ }
+
+ return true;
+ }
+
+ /**
+ * Registers the plugin's classes
+ *
+ * @throws PluginException
+ * @return true
+ */
+ protected function registerClasses() {
+ $classes_path = "$this->path/classes";
+
+ // don't need to have classes
+ if (!is_dir($classes_path)) {
+ return true;
+ }
+
+ elgg_register_classes($classes_path);
+
+ return true;
+ }
+
+
+ // generic helpers and overrides
+
+ /**
+ * Get a value from private settings.
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ public function get($name) {
+ // rewrite for old and inaccurate plugin:setting
+ if (strstr($name, 'plugin:setting:')) {
+ $msg = 'Direct access of user settings is deprecated. Use ElggPlugin->getUserSetting()';
+ elgg_deprecated_notice($msg, 1.8);
+ $name = str_replace('plugin:setting:', '', $name);
+ $name = elgg_namespace_plugin_private_setting('user_setting', $name);
+ }
+
+ // See if its in our base attribute
+ if (array_key_exists($name, $this->attributes)) {
+ return $this->attributes[$name];
+ }
+
+ // No, so see if its in the private data store.
+ // get_private_setting() returns false if it doesn't exist
+ $meta = $this->getPrivateSetting($name);
+
+ if ($meta === false) {
+ // Can't find it, so return null
+ return NULL;
+ }
+
+ return $meta;
+ }
+
+ /**
+ * Save a value as private setting or attribute.
+ *
+ * Attributes include title and description.
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return bool
+ */
+ public function set($name, $value) {
+ if (array_key_exists($name, $this->attributes)) {
+ // Check that we're not trying to change the guid!
+ if ((array_key_exists('guid', $this->attributes)) && ($name == 'guid')) {
+ return false;
+ }
+
+ $this->attributes[$name] = $value;
+
+ return true;
+ } else {
+ // Hook to validate setting
+ $value = elgg_trigger_plugin_hook('setting', 'plugin', array(
+ 'plugin_id' => $this->pluginID,
+ 'plugin' => $this,
+ 'name' => $name,
+ 'value' => $value
+ ), $value);
+
+ return $this->setPrivateSetting($name, $value);
+ }
+ }
+
+ /**
+ * Sets the plugin to active or inactive for $site_guid.
+ *
+ * @param bool $active Set to active or inactive
+ * @param mixed $site_guid Int for specific site, null for current site.
+ *
+ * @return bool
+ */
+ private function setStatus($active, $site_guid = null) {
+ if (!$this->guid) {
+ return false;
+ }
+
+ if ($site_guid) {
+ $site = get_entity($site_guid);
+
+ if (!($site instanceof ElggSite)) {
+ return false;
+ }
+ } else {
+ $site = get_config('site');
+ }
+
+ if ($active) {
+ return add_entity_relationship($this->guid, 'active_plugin', $site->guid);
+ } else {
+ return remove_entity_relationship($this->guid, 'active_plugin', $site->guid);
+ }
+ }
+
+ /**
+ * Returns the last error message registered.
+ *
+ * @return string|null
+ */
+ public function getError() {
+ return $this->errorMsg;
+ }
+
+ /**
+ * Returns this plugin's ElggPluginManifest object
+ *
+ * @return ElggPluginManifest
+ */
+ public function getManifest() {
+ if ($this->manifest instanceof ElggPluginManifest) {
+ return $this->manifest;
+ }
+
+ try {
+ $this->manifest = $this->getPackage()->getManifest();
+ } catch (Exception $e) {
+ elgg_log("Failed to load manifest for plugin $this->guid. " . $e->getMessage(), 'WARNING');
+ $this->errorMsg = $e->getmessage();
+ }
+
+ return $this->manifest;
+ }
+
+ /**
+ * Returns this plugin's ElggPluginPackage object
+ *
+ * @return ElggPluginPackage
+ */
+ public function getPackage() {
+ if ($this->package instanceof ElggPluginPackage) {
+ return $this->package;
+ }
+
+ try {
+ $this->package = new ElggPluginPackage($this->path, false);
+ } catch (Exception $e) {
+ elgg_log("Failed to load package for $this->guid. " . $e->getMessage(), 'WARNING');
+ $this->errorMsg = $e->getmessage();
+ }
+
+ return $this->package;
+ }
+}
diff --git a/engine/classes/ElggPluginManifest.php b/engine/classes/ElggPluginManifest.php
new file mode 100644
index 000000000..6912c2b08
--- /dev/null
+++ b/engine/classes/ElggPluginManifest.php
@@ -0,0 +1,656 @@
+<?php
+/**
+ * Parses Elgg manifest.xml files.
+ *
+ * Normalizes the values from the ElggManifestParser object.
+ *
+ * This requires an ElggPluginManifestParser class implementation
+ * as $this->parser.
+ *
+ * To add new parser versions, name them ElggPluginManifestParserXX
+ * where XX is the version specified in the top-level <plugin_manifest>
+ * tag's XML namespace.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ * @since 1.8
+ */
+class ElggPluginManifest {
+
+ /**
+ * The parser object
+ */
+ protected $parser;
+
+ /**
+ * The root for plugin manifest namespaces.
+ * This is in the format http://www.elgg.org/plugin_manifest/<version>
+ */
+ protected $namespace_root = 'http://www.elgg.org/plugin_manifest/';
+
+ /**
+ * The expected structure of a plugins requires element
+ */
+ private $depsStructPlugin = array(
+ 'type' => '',
+ 'name' => '',
+ 'version' => '',
+ 'comparison' => 'ge'
+ );
+
+ /**
+ * The expected structure of a priority element
+ */
+ private $depsStructPriority = array(
+ 'type' => '',
+ 'priority' => '',
+ 'plugin' => ''
+ );
+
+ /*
+ * The expected structure of elgg_version and elgg_release requires element
+ */
+ private $depsStructElgg = array(
+ 'type' => '',
+ 'version' => '',
+ 'comparison' => 'ge'
+ );
+
+ /**
+ * The expected structure of a requires php_ini dependency element
+ */
+ private $depsStructPhpIni = array(
+ 'type' => '',
+ 'name' => '',
+ 'value' => '',
+ 'comparison' => '='
+ );
+
+ /**
+ * The expected structure of a requires php_extension dependency element
+ */
+ private $depsStructPhpExtension = array(
+ 'type' => '',
+ 'name' => '',
+ 'version' => '',
+ 'comparison' => '='
+ );
+
+ /**
+ * The expected structure of a conflicts depedency element
+ */
+ private $depsConflictsStruct = array(
+ 'type' => '',
+ 'name' => '',
+ 'version' => '',
+ 'comparison' => '='
+ );
+
+ /**
+ * The expected structure of a provides dependency element.
+ */
+ private $depsProvidesStruct = array(
+ 'type' => '',
+ 'name' => '',
+ 'version' => ''
+ );
+
+ /**
+ * The expected structure of a screenshot element
+ */
+ private $screenshotStruct = array(
+ 'description' => '',
+ 'path' => ''
+ );
+
+ /**
+ * The API version of the manifest.
+ *
+ * @var int
+ */
+ protected $apiVersion;
+
+ /**
+ * The optional plugin id this manifest belongs to.
+ *
+ * @var string
+ */
+ protected $pluginID;
+
+ /**
+ * Load a manifest file, XmlElement or path to manifest.xml file
+ *
+ * @param mixed $manifest A string, XmlElement, or path of a manifest file.
+ * @param string $plugin_id Optional ID of the owning plugin. Used to
+ * fill in some values automatically.
+ */
+ public function __construct($manifest, $plugin_id = null) {
+ if ($plugin_id) {
+ $this->pluginID = $plugin_id;
+ }
+
+ // see if we need to construct the xml object.
+ if ($manifest instanceof ElggXMLElement) {
+ $manifest_obj = $manifest;
+ } else {
+ if (substr(trim($manifest), 0, 1) == '<') {
+ // this is a string
+ $raw_xml = $manifest;
+ } elseif (is_file($manifest)) {
+ // this is a file
+ $raw_xml = file_get_contents($manifest);
+ }
+
+ $manifest_obj = xml_to_object($raw_xml);
+ }
+
+ if (!$manifest_obj) {
+ throw new PluginException(elgg_echo('PluginException:InvalidManifest',
+ array($this->getPluginID())));
+ }
+
+ // set manifest api version
+ if (isset($manifest_obj->attributes['xmlns'])) {
+ $namespace = $manifest_obj->attributes['xmlns'];
+ $version = str_replace($this->namespace_root, '', $namespace);
+ } else {
+ $version = 1.7;
+ }
+
+ $this->apiVersion = $version;
+
+ $parser_class_name = 'ElggPluginManifestParser' . str_replace('.', '', $this->apiVersion);
+
+ // @todo currently the autoloader freaks out if a class doesn't exist.
+ try {
+ $class_exists = class_exists($parser_class_name);
+ } catch (Exception $e) {
+ $class_exists = false;
+ }
+
+ if ($class_exists) {
+ $this->parser = new $parser_class_name($manifest_obj, $this);
+ } else {
+ throw new PluginException(elgg_echo('PluginException:NoAvailableParser',
+ array($this->apiVersion, $this->getPluginID())));
+ }
+
+ if (!$this->parser->parse()) {
+ throw new PluginException(elgg_echo('PluginException:ParserError',
+ array($this->apiVersion, $this->getPluginID())));
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns the API version in use.
+ *
+ * @return int
+ */
+ public function getApiVersion() {
+ return $this->apiVersion;
+ }
+
+ /**
+ * Returns the plugin ID.
+ *
+ * @return string
+ */
+ public function getPluginID() {
+ if ($this->pluginID) {
+ return $this->pluginID;
+ } else {
+ return elgg_echo('unknown');
+ }
+ }
+
+ /**
+ * Returns the manifest array.
+ *
+ * Used for backward compatibility. Specific
+ * methods should be called instead.
+ *
+ * @return array
+ */
+ public function getManifest() {
+ return $this->parser->getManifest();
+ }
+
+ /***************************************
+ * Parsed and Normalized Manifest Data *
+ ***************************************/
+
+ /**
+ * Returns the plugin name
+ *
+ * @return string
+ */
+ public function getName() {
+ $name = $this->parser->getAttribute('name');
+
+ if (!$name && $this->pluginID) {
+ $name = ucwords(str_replace('_', ' ', $this->pluginID));
+ }
+
+ return $name;
+ }
+
+
+ /**
+ * Return the description
+ *
+ * @return string
+ */
+ public function getDescription() {
+ return $this->parser->getAttribute('description');
+ }
+
+ /**
+ * Return the short description
+ *
+ * @return string
+ */
+ public function getBlurb() {
+ $blurb = $this->parser->getAttribute('blurb');
+
+ if (!$blurb) {
+ $blurb = elgg_get_excerpt($this->getDescription());
+ }
+
+ return $blurb;
+ }
+
+ /**
+ * Returns the license
+ *
+ * @return string
+ */
+ public function getLicense() {
+ // license vs licence. Use license.
+ $en_us = $this->parser->getAttribute('license');
+ if ($en_us) {
+ return $en_us;
+ } else {
+ return $this->parser->getAttribute('licence');
+ }
+ }
+
+ /**
+ * Returns the repository url
+ *
+ * @return string
+ */
+ public function getRepositoryURL() {
+ return $this->parser->getAttribute('repository');
+ }
+
+ /**
+ * Returns the bug tracker page
+ *
+ * @return string
+ */
+ public function getBugTrackerURL() {
+ return $this->parser->getAttribute('bugtracker');
+ }
+
+ /**
+ * Returns the donations page
+ *
+ * @return string
+ */
+ public function getDonationsPageURL() {
+ return $this->parser->getAttribute('donations');
+ }
+
+ /**
+ * Returns the version of the plugin.
+ *
+ * @return float
+ */
+ public function getVersion() {
+ return $this->parser->getAttribute('version');
+ }
+
+ /**
+ * Returns the plugin author.
+ *
+ * @return string
+ */
+ public function getAuthor() {
+ return $this->parser->getAttribute('author');
+ }
+
+ /**
+ * Return the copyright
+ *
+ * @return string
+ */
+ public function getCopyright() {
+ return $this->parser->getAttribute('copyright');
+ }
+
+ /**
+ * Return the website
+ *
+ * @return string
+ */
+ public function getWebsite() {
+ return $this->parser->getAttribute('website');
+ }
+
+ /**
+ * Return the categories listed for this plugin
+ *
+ * @return array
+ */
+ public function getCategories() {
+ $bundled_plugins = array('blog', 'bookmarks', 'categories',
+ 'custom_index', 'dashboard', 'developers', 'diagnostics',
+ 'embed', 'externalpages', 'file', 'garbagecollector',
+ 'groups', 'htmlawed', 'invitefriends', 'likes',
+ 'logbrowser', 'logrotate', 'members', 'messageboard',
+ 'messages', 'notifications', 'oauth_api', 'pages', 'profile',
+ 'reportedcontent', 'search', 'tagcloud', 'thewire', 'tinymce',
+ 'twitter', 'twitter_api', 'uservalidationbyemail', 'zaudio',
+ );
+
+ $cats = $this->parser->getAttribute('category');
+
+ if (!$cats) {
+ $cats = array();
+ }
+
+ if (in_array('bundled', $cats) && !in_array($this->getPluginID(), $bundled_plugins)) {
+ unset($cats[array_search('bundled', $cats)]);
+ }
+
+ return $cats;
+ }
+
+ /**
+ * Return the screenshots listed.
+ *
+ * @return array
+ */
+ public function getScreenshots() {
+ $ss = $this->parser->getAttribute('screenshot');
+
+ if (!$ss) {
+ $ss = array();
+ }
+
+ $normalized = array();
+ foreach ($ss as $s) {
+ $normalized[] = $this->buildStruct($this->screenshotStruct, $s);
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Return the list of provides by this plugin.
+ *
+ * @return array
+ */
+ public function getProvides() {
+ // normalize for 1.7
+ if ($this->getApiVersion() < 1.8) {
+ $provides = array();
+ } else {
+ $provides = $this->parser->getAttribute('provides');
+ }
+
+ if (!$provides) {
+ $provides = array();
+ }
+
+ // always provide ourself if we can
+ if ($this->pluginID) {
+ $provides[] = array(
+ 'type' => 'plugin',
+ 'name' => $this->getPluginID(),
+ 'version' => $this->getVersion()
+ );
+ }
+
+ $normalized = array();
+ foreach ($provides as $provide) {
+ $normalized[] = $this->buildStruct($this->depsProvidesStruct, $provide);
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Returns the dependencies listed.
+ *
+ * @return array
+ */
+ public function getRequires() {
+ // rewrite the 1.7 style elgg_version as a real requires.
+ if ($this->apiVersion < 1.8) {
+ $elgg_version = $this->parser->getAttribute('elgg_version');
+ if ($elgg_version) {
+ $reqs = array(
+ array(
+ 'type' => 'elgg_version',
+ 'version' => $elgg_version,
+ 'comparison' => 'ge'
+ )
+ );
+ } else {
+ $reqs = array();
+ }
+ } else {
+ $reqs = $this->parser->getAttribute('requires');
+ }
+
+ if (!$reqs) {
+ $reqs = array();
+ }
+
+ $normalized = array();
+ foreach ($reqs as $req) {
+ $normalized[] = $this->normalizeDep($req);
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Returns the suggests elements.
+ *
+ * @return array
+ */
+ public function getSuggests() {
+ $suggests = $this->parser->getAttribute('suggests');
+
+ if (!$suggests) {
+ $suggests = array();
+ }
+
+ $normalized = array();
+ foreach ($suggests as $suggest) {
+ $normalized[] = $this->normalizeDep($suggest);
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Normalizes a dependency array using the defined structs.
+ * Can be used with either requires or suggests.
+ *
+ * @param array $dep A dependency array.
+ * @return array The normalized deps array.
+ */
+ private function normalizeDep($dep) {
+ switch ($dep['type']) {
+ case 'elgg_version':
+ case 'elgg_release':
+ $struct = $this->depsStructElgg;
+ break;
+
+ case 'plugin':
+ $struct = $this->depsStructPlugin;
+ break;
+
+ case 'priority':
+ $struct = $this->depsStructPriority;
+ break;
+
+ case 'php_extension':
+ $struct = $this->depsStructPhpExtension;
+ break;
+
+ case 'php_ini':
+ $struct = $this->depsStructPhpIni;
+
+ // also normalize boolean values
+ if (isset($dep['value'])) {
+ switch (strtolower($dep['value'])) {
+ case 'yes':
+ case 'true':
+ case 'on':
+ case 1:
+ $dep['value'] = 1;
+ break;
+
+ case 'no':
+ case 'false':
+ case 'off':
+ case 0:
+ case '':
+ $dep['value'] = 0;
+ break;
+ }
+ }
+ break;
+ default:
+ // unrecognized so we just return the raw dependency
+ return $dep;
+ }
+
+ $normalized_dep = $this->buildStruct($struct, $dep);
+
+ // normalize comparison operators
+ if (isset($normalized_dep['comparison'])) {
+ switch ($normalized_dep['comparison']) {
+ case '<':
+ $normalized_dep['comparison'] = 'lt';
+ break;
+
+ case '<=':
+ $normalized_dep['comparison'] = 'le';
+ break;
+
+ case '>':
+ $normalized_dep['comparison'] = 'gt';
+ break;
+
+ case '>=':
+ $normalized_dep['comparison'] = 'ge';
+ break;
+
+ case '==':
+ case 'eq':
+ $normalized_dep['comparison'] = '=';
+ break;
+
+ case '<>':
+ case 'ne':
+ $normalized_dep['comparison'] = '!=';
+ break;
+ }
+ }
+
+ return $normalized_dep;
+ }
+
+ /**
+ * Returns the conflicts listed
+ *
+ * @return array
+ */
+ public function getConflicts() {
+ // normalize for 1.7
+ if ($this->getApiVersion() < 1.8) {
+ $conflicts = array();
+ } else {
+ $conflicts = $this->parser->getAttribute('conflicts');
+ }
+
+ if (!$conflicts) {
+ $conflicts = array();
+ }
+
+ $normalized = array();
+
+ foreach ($conflicts as $conflict) {
+ $normalized[] = $this->buildStruct($this->depsConflictsStruct, $conflict);
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Should this plugin be activated when Elgg is installed
+ *
+ * @return bool
+ */
+ public function getActivateOnInstall() {
+ $activate = $this->parser->getAttribute('activate_on_install');
+ switch (strtolower($activate)) {
+ case 'yes':
+ case 'true':
+ case 'on':
+ case 1:
+ return true;
+
+ case 'no':
+ case 'false':
+ case 'off':
+ case 0:
+ case '':
+ return false;
+ }
+ }
+
+ /**
+ * Normalizes an array into the structure specified
+ *
+ * @param array $struct The struct to normalize $element to.
+ * @param array $array The array
+ *
+ * @return array
+ */
+ protected function buildStruct(array $struct, array $array) {
+ $return = array();
+
+ foreach ($struct as $index => $default) {
+ $return[$index] = elgg_extract($index, $array, $default);
+ }
+
+ return $return;
+ }
+
+ /**
+ * Returns a category's friendly name. This can be localized by
+ * defining the string 'admin:plugins:category:<category>'. If no
+ * localization is found, returns the category with _ and - converted to ' '
+ * and then ucwords()'d.
+ *
+ * @param str $category The category as defined in the manifest.
+ * @return str A human-readable category
+ */
+ static public function getFriendlyCategory($category) {
+ $cat_raw_string = "admin:plugins:category:$category";
+ $cat_display_string = elgg_echo($cat_raw_string);
+ if ($cat_display_string == $cat_raw_string) {
+ $category = str_replace(array('-', '_'), ' ', $category);
+ $cat_display_string = ucwords($category);
+ }
+ return $cat_display_string;
+ }
+}
diff --git a/engine/classes/ElggPluginManifestParser.php b/engine/classes/ElggPluginManifestParser.php
new file mode 100644
index 000000000..af152b561
--- /dev/null
+++ b/engine/classes/ElggPluginManifestParser.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Parent class for manifest parsers.
+ *
+ * Converts manifest.xml files or strings to an array.
+ *
+ * This should be extended by a class that does the actual work
+ * to convert based on the manifest.xml version.
+ *
+ * This class only parses XML to an XmlEntity object and
+ * an array. The array should be used primarily to extract
+ * information since it is quicker to parse once and store
+ * values from the XmlElement object than to parse the object
+ * each time.
+ *
+ * The array should be an exact representation of the manifest.xml
+ * file or string. Any normalization needs to be done in the
+ * calling class / function.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ * @since 1.8
+ */
+abstract class ElggPluginManifestParser {
+ /**
+ * The XmlElement object
+ *
+ * @var XmlElement
+ */
+ protected $manifestObject;
+
+ /**
+ * The manifest array
+ *
+ * @var array
+ */
+ protected $manifest;
+
+ /**
+ * All valid manifest attributes with default values.
+ *
+ * @var array
+ */
+ protected $validAttributes;
+
+ /**
+ * The object we're doing parsing for.
+ *
+ * @var object
+ */
+ protected $caller;
+
+ /**
+ * Loads the manifest XML to be parsed.
+ *
+ * @param ElggXmlElement $xml The Manifest XML object to be parsed
+ * @param object $caller The object calling this parser.
+ */
+ public function __construct(ElggXMLElement $xml, $caller) {
+ $this->manifestObject = $xml;
+ $this->caller = $caller;
+ }
+
+ /**
+ * Returns the manifest XML object
+ *
+ * @return XmlElement
+ */
+ public function getManifestObject() {
+ return $this->manifestObject;
+ }
+
+ /**
+ * Return the parsed manifest array
+ *
+ * @return array
+ */
+ public function getManifest() {
+ return $this->manifest;
+ }
+
+ /**
+ * Return an attribute in the manifest.
+ *
+ * @param string $name Attribute name
+ * @return mixed
+ */
+ public function getAttribute($name) {
+ if (in_array($name, $this->validAttributes) && isset($this->manifest[$name])) {
+ return $this->manifest[$name];
+ }
+
+ return false;
+ }
+
+ /**
+ * Parse the XML object into an array
+ *
+ * @return bool
+ */
+ abstract public function parse();
+}
diff --git a/engine/classes/ElggPluginManifestParser17.php b/engine/classes/ElggPluginManifestParser17.php
new file mode 100644
index 000000000..5658ee804
--- /dev/null
+++ b/engine/classes/ElggPluginManifestParser17.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Plugin manifest.xml parser for Elgg 1.7 and lower.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ * @since 1.8
+ */
+class ElggPluginManifestParser17 extends ElggPluginManifestParser {
+ /**
+ * The valid top level attributes and defaults for a 1.7 manifest
+ */
+ protected $validAttributes = array(
+ 'author', 'version', 'description', 'website',
+ 'copyright', 'license', 'licence', 'elgg_version',
+
+ // were never really used and not enforced in code.
+ 'requires', 'recommends', 'conflicts',
+
+ // not a 1.7 field, but we need it
+ 'name',
+ );
+
+ /**
+ * Parse a manifest object from 1.7 or earlier.
+ *
+ * @return void
+ */
+ public function parse() {
+ if (!isset($this->manifestObject->children)) {
+ return false;
+ }
+
+ $elements = array();
+
+ foreach ($this->manifestObject->children as $element) {
+ $key = $element->attributes['key'];
+ $value = $element->attributes['value'];
+
+ // create arrays if multiple fields are set
+ if (array_key_exists($key, $elements)) {
+ if (!is_array($elements[$key])) {
+ $orig = $elements[$key];
+ $elements[$key] = array($orig);
+ }
+
+ $elements[$key][] = $value;
+ } else {
+ $elements[$key] = $value;
+ }
+ }
+
+ if ($elements && !array_key_exists('name', $elements)) {
+ $elements['name'] = $this->caller->getName();
+ }
+
+ $this->manifest = $elements;
+
+ if (!$this->manifest) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Return an attribute in the manifest.
+ *
+ * Overrides ElggPluginManifestParser::getAttribute() because before 1.8
+ * there were no rules...weeeeeeeee!
+ *
+ * @param string $name Attribute name
+ * @return mixed
+ */
+ public function getAttribute($name) {
+ if (isset($this->manifest[$name])) {
+ return $this->manifest[$name];
+ }
+
+ return false;
+ }
+}
diff --git a/engine/classes/ElggPluginManifestParser18.php b/engine/classes/ElggPluginManifestParser18.php
new file mode 100644
index 000000000..3b753f17b
--- /dev/null
+++ b/engine/classes/ElggPluginManifestParser18.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * Plugin manifest.xml parser for Elgg 1.8 and above.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ * @since 1.8
+ */
+class ElggPluginManifestParser18 extends ElggPluginManifestParser {
+ /**
+ * The valid top level attributes and defaults for a 1.8 manifest array.
+ *
+ * @var array
+ */
+ protected $validAttributes = array(
+ 'name', 'author', 'version', 'blurb', 'description','website',
+ 'repository', 'bugtracker', 'donations', 'copyright', 'license',
+ 'requires', 'suggests', 'conflicts', 'provides',
+ 'screenshot', 'category', 'activate_on_install'
+ );
+
+ /**
+ * Required attributes for a valid 1.8 manifest
+ *
+ * @var array
+ */
+ protected $requiredAttributes = array(
+ 'name', 'author', 'version', 'description', 'requires'
+ );
+
+ /**
+ * Parse a manifest object from 1.8 and later
+ *
+ * @return void
+ */
+ public function parse() {
+ $parsed = array();
+ foreach ($this->manifestObject->children as $element) {
+ switch ($element->name) {
+ // single elements
+ case 'blurb':
+ case 'description':
+ case 'name':
+ case 'author':
+ case 'version':
+ case 'website':
+ case 'copyright':
+ case 'license':
+ case 'repository':
+ case 'bugtracker':
+ case 'donations':
+ case 'activate_on_install':
+ $parsed[$element->name] = $element->content;
+ break;
+
+ // arrays
+ case 'category':
+ $parsed[$element->name][] = $element->content;
+ break;
+
+ // 3d arrays
+ case 'screenshot':
+ case 'provides':
+ case 'conflicts':
+ case 'requires':
+ case 'suggests':
+ if (!isset($element->children)) {
+ return false;
+ }
+
+ $info = array();
+ foreach ($element->children as $child_element) {
+ $info[$child_element->name] = $child_element->content;
+ }
+
+ $parsed[$element->name][] = $info;
+ break;
+ }
+ }
+
+ // check we have all the required fields
+ foreach ($this->requiredAttributes as $attr) {
+ if (!array_key_exists($attr, $parsed)) {
+ throw new PluginException(elgg_echo('PluginException:ParserErrorMissingRequiredAttribute',
+ array($attr, $this->caller->getPluginID())));
+ }
+ }
+
+ $this->manifest = $parsed;
+
+ if (!$this->manifest) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/engine/classes/ElggPluginPackage.php b/engine/classes/ElggPluginPackage.php
new file mode 100644
index 000000000..37eb4bf4d
--- /dev/null
+++ b/engine/classes/ElggPluginPackage.php
@@ -0,0 +1,640 @@
+<?php
+/**
+ * Manages plugin packages under mod.
+ *
+ * @todo This should eventually be merged into ElggPlugin.
+ * Currently ElggPlugin objects are only used to get and save
+ * plugin settings and user settings, so not every plugin
+ * has an ElggPlugin object. It's not implemented in ElggPlugin
+ * right now because of conflicts with at least the constructor,
+ * enable(), disable(), and private settings.
+ *
+ * Around 1.9 or so we should each plugin over to using
+ * ElggPlugin and merge ElggPluginPackage and ElggPlugin.
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ * @since 1.8
+ */
+class ElggPluginPackage {
+
+ /**
+ * The required files in the package
+ *
+ * @var array
+ */
+ private $requiredFiles = array(
+ 'start.php', 'manifest.xml'
+ );
+
+ /**
+ * The optional files that can be read and served through the markdown page handler
+ * @var array
+ */
+ private $textFiles = array(
+ 'README.txt', 'CHANGES.txt',
+ 'INSTALL.txt', 'COPYRIGHT.txt', 'LICENSE.txt',
+
+ 'README', 'README.md', 'README.markdown'
+ );
+
+ /**
+ * Valid types for provides.
+ *
+ * @var array
+ */
+ private $providesSupportedTypes = array(
+ 'plugin', 'php_extension'
+ );
+
+ /**
+ * The type of requires/conflicts supported
+ *
+ * @var array
+ */
+ private $depsSupportedTypes = array(
+ 'elgg_version', 'elgg_release', 'php_extension', 'php_ini', 'plugin', 'priority',
+ );
+
+ /**
+ * An invalid plugin error.
+ */
+ private $errorMsg = '';
+
+ /**
+ * Any dependencies messages
+ */
+ private $depsMsgs = array();
+
+ /**
+ * The plugin's manifest object
+ *
+ * @var ElggPluginManifest
+ */
+ protected $manifest;
+
+ /**
+ * The plugin's full path
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Is the plugin valid?
+ *
+ * @var mixed Bool after validation check, null before.
+ */
+ protected $valid = null;
+
+ /**
+ * The plugin ID (dir name)
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Load a plugin package from mod/$id or by full path.
+ *
+ * @param string $plugin The ID (directory name) or full path of the plugin.
+ * @param bool $validate Automatically run isValid()?
+ *
+ * @throws PluginException
+ */
+ public function __construct($plugin, $validate = true) {
+ $plugin_path = elgg_get_plugins_path();
+ // @todo wanted to avoid another is_dir() call here.
+ // should do some profiling to see how much it affects
+ if (strpos($plugin, $plugin_path) === 0 || is_dir($plugin)) {
+ // this is a path
+ $path = sanitise_filepath($plugin);
+
+ // the id is the last element of the array
+ $path_array = explode('/', trim($path, '/'));
+ $id = array_pop($path_array);
+ } else {
+ // this is a plugin id
+ // strict plugin names
+ if (preg_match('/[^a-z0-9\.\-_]/i', $plugin)) {
+ throw new PluginException(elgg_echo('PluginException:InvalidID', array($plugin)));
+ }
+
+ $path = "{$plugin_path}$plugin/";
+ $id = $plugin;
+ }
+
+ if (!is_dir($path)) {
+ throw new PluginException(elgg_echo('PluginException:InvalidPath', array($path)));
+ }
+
+ $this->path = $path;
+ $this->id = $id;
+
+ if ($validate && !$this->isValid()) {
+ if ($this->errorMsg) {
+ throw new PluginException(elgg_echo('PluginException:InvalidPlugin:Details',
+ array($plugin, $this->errorMsg)));
+ } else {
+ throw new PluginException(elgg_echo('PluginException:InvalidPlugin', array($plugin)));
+ }
+ }
+
+ return true;
+ }
+
+ /********************************
+ * Validation and sanity checks *
+ ********************************/
+
+ /**
+ * Checks if this is a valid Elgg plugin.
+ *
+ * Checks for requires files as defined at the start of this
+ * class. Will check require manifest fields via ElggPluginManifest
+ * for Elgg 1.8 plugins.
+ *
+ * @note This doesn't check dependencies or conflicts.
+ * Use {@link ElggPluginPackage::canActivate()} or
+ * {@link ElggPluginPackage::checkDependencies()} for that.
+ *
+ * @return bool
+ */
+ public function isValid() {
+ if (isset($this->valid)) {
+ return $this->valid;
+ }
+
+ // check required files.
+ $have_req_files = true;
+ foreach ($this->requiredFiles as $file) {
+ if (!is_readable($this->path . $file)) {
+ $have_req_files = false;
+ $this->errorMsg =
+ elgg_echo('ElggPluginPackage:InvalidPlugin:MissingFile', array($file));
+ break;
+ }
+ }
+
+ // check required files
+ if (!$have_req_files) {
+ return $this->valid = false;
+ }
+
+ // check for valid manifest.
+ if (!$this->loadManifest()) {
+ return $this->valid = false;
+ }
+
+ // can't require or conflict with yourself or something you provide.
+ // make sure provides are all valid.
+ if (!$this->isSaneDeps()) {
+ return $this->valid = false;
+ }
+
+ return $this->valid = true;
+ }
+
+ /**
+ * Check the plugin doesn't require or conflict with itself
+ * or something provides. Also check that it only list
+ * valid provides. Deps are checked in checkDependencies()
+ *
+ * @note Plugins always provide themselves.
+ *
+ * @todo Don't let them require and conflict the same thing
+ *
+ * @return bool
+ */
+ private function isSaneDeps() {
+ // protection against plugins with no manifest file
+ if (!$this->getManifest()) {
+ return false;
+ }
+
+ // Note: $conflicts and $requires are not unused. They're called dynamically
+ $conflicts = $this->getManifest()->getConflicts();
+ $requires = $this->getManifest()->getRequires();
+ $provides = $this->getManifest()->getProvides();
+
+ foreach ($provides as $provide) {
+ // only valid provide types
+ if (!in_array($provide['type'], $this->providesSupportedTypes)) {
+ $this->errorMsg =
+ elgg_echo('ElggPluginPackage:InvalidPlugin:InvalidProvides', array($provide['type']));
+ return false;
+ }
+
+ // doesn't conflict or require any of its provides
+ $name = $provide['name'];
+ foreach (array('conflicts', 'requires') as $dep_type) {
+ foreach (${$dep_type} as $dep) {
+ if (!in_array($dep['type'], $this->depsSupportedTypes)) {
+ $this->errorMsg =
+ elgg_echo('ElggPluginPackage:InvalidPlugin:InvalidDependency', array($dep['type']));
+ return false;
+ }
+
+ // make sure nothing is providing something it conflicts or requires.
+ if (isset($dep['name']) && $dep['name'] == $name) {
+ $version_compare = version_compare($provide['version'], $dep['version'], $dep['comparison']);
+
+ if ($version_compare) {
+ $this->errorMsg =
+ elgg_echo('ElggPluginPackage:InvalidPlugin:CircularDep',
+ array($dep['type'], $dep['name'], $this->id));
+
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+
+ /************
+ * Manifest *
+ ************/
+
+ /**
+ * Returns a parsed manifest file.
+ *
+ * @return ElggPluginManifest
+ */
+ public function getManifest() {
+ if (!$this->manifest) {
+ if (!$this->loadManifest()) {
+ return false;
+ }
+ }
+
+ return $this->manifest;
+ }
+
+ /**
+ * Loads the manifest into this->manifest as an
+ * ElggPluginManifest object.
+ *
+ * @return bool
+ */
+ private function loadManifest() {
+ $file = $this->path . 'manifest.xml';
+
+ try {
+ $this->manifest = new ElggPluginManifest($file, $this->id);
+ } catch (Exception $e) {
+ $this->errorMsg = $e->getMessage();
+ return false;
+ }
+
+ if ($this->manifest instanceof ElggPluginManifest) {
+ return true;
+ }
+
+ $this->errorMsg = elgg_echo('unknown_error');
+ return false;
+ }
+
+ /****************
+ * Readme Files *
+ ***************/
+
+ /**
+ * Returns an array of present and readable text files
+ *
+ * @return array
+ */
+ public function getTextFilenames() {
+ return $this->textFiles;
+ }
+
+ /***********************
+ * Dependencies system *
+ ***********************/
+
+ /**
+ * Returns if the Elgg system meets the plugin's dependency
+ * requirements. This includes both requires and conflicts.
+ *
+ * Full reports can be requested. The results are returned
+ * as an array of arrays in the form array(
+ * 'type' => requires|conflicts,
+ * 'dep' => array( dependency array ),
+ * 'status' => bool if depedency is met,
+ * 'comment' => optional comment to display to the user.
+ * )
+ *
+ * @param bool $full_report Return a full report.
+ * @return bool|array
+ */
+ public function checkDependencies($full_report = false) {
+ // Note: $conflicts and $requires are not unused. They're called dynamically
+ $requires = $this->getManifest()->getRequires();
+ $conflicts = $this->getManifest()->getConflicts();
+
+ $enabled_plugins = elgg_get_plugins('active');
+ $this_id = $this->getID();
+ $report = array();
+
+ // first, check if any active plugin conflicts with us.
+ foreach ($enabled_plugins as $plugin) {
+ $temp_conflicts = array();
+ $temp_manifest = $plugin->getManifest();
+ if ($temp_manifest instanceof ElggPluginManifest) {
+ $temp_conflicts = $plugin->getManifest()->getConflicts();
+ }
+ foreach ($temp_conflicts as $conflict) {
+ if ($conflict['type'] == 'plugin' && $conflict['name'] == $this_id) {
+ $result = $this->checkDepPlugin($conflict, $enabled_plugins, false);
+
+ // rewrite the conflict to show the originating plugin
+ $conflict['name'] = $plugin->getManifest()->getName();
+
+ if (!$full_report && !$result['status']) {
+ $this->errorMsg = "Conflicts with plugin \"{$plugin->getManifest()->getName()}\".";
+ return $result['status'];
+ } else {
+ $report[] = array(
+ 'type' => 'conflicted',
+ 'dep' => $conflict,
+ 'status' => $result['status'],
+ 'value' => $this->getManifest()->getVersion()
+ );
+ }
+ }
+ }
+ }
+
+ $check_types = array('requires', 'conflicts');
+
+ if ($full_report) {
+ // Note: $suggests is not unused. It's called dynamically
+ $suggests = $this->getManifest()->getSuggests();
+ $check_types[] = 'suggests';
+ }
+
+ foreach ($check_types as $dep_type) {
+ $inverse = ($dep_type == 'conflicts') ? true : false;
+
+ foreach (${$dep_type} as $dep) {
+ switch ($dep['type']) {
+ case 'elgg_version':
+ $result = $this->checkDepElgg($dep, get_version(), $inverse);
+ break;
+
+ case 'elgg_release':
+ $result = $this->checkDepElgg($dep, get_version(true), $inverse);
+ break;
+
+ case 'plugin':
+ $result = $this->checkDepPlugin($dep, $enabled_plugins, $inverse);
+ break;
+
+ case 'priority':
+ $result = $this->checkDepPriority($dep, $enabled_plugins, $inverse);
+ break;
+
+ case 'php_extension':
+ $result = $this->checkDepPhpExtension($dep, $inverse);
+ break;
+
+ case 'php_ini':
+ $result = $this->checkDepPhpIni($dep, $inverse);
+ break;
+ }
+
+ // unless we're doing a full report, break as soon as we fail.
+ if (!$full_report && !$result['status']) {
+ $this->errorMsg = "Missing dependencies.";
+ return $result['status'];
+ } else {
+ // build report element and comment
+ $report[] = array(
+ 'type' => $dep_type,
+ 'dep' => $dep,
+ 'status' => $result['status'],
+ 'value' => $result['value']
+ );
+ }
+ }
+ }
+
+ if ($full_report) {
+ // add provides to full report
+ $provides = $this->getManifest()->getProvides();
+
+ foreach ($provides as $provide) {
+ $report[] = array(
+ 'type' => 'provides',
+ 'dep' => $provide,
+ 'status' => true,
+ 'value' => ''
+ );
+ }
+
+ return $report;
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks if $plugins meets the requirement by $dep.
+ *
+ * @param array $dep An Elgg manifest.xml deps array
+ * @param array $plugins A list of plugins as returned by elgg_get_plugins();
+ * @param bool $inverse Inverse the results to use as a conflicts.
+ * @return bool
+ */
+ private function checkDepPlugin(array $dep, array $plugins, $inverse = false) {
+ $r = elgg_check_plugins_provides('plugin', $dep['name'], $dep['version'], $dep['comparison']);
+
+ if ($inverse) {
+ $r['status'] = !$r['status'];
+ }
+
+ return $r;
+ }
+
+ /**
+ * Checks if $plugins meets the requirement by $dep.
+ *
+ * @param array $dep An Elgg manifest.xml deps array
+ * @param array $plugins A list of plugins as returned by elgg_get_plugins();
+ * @param bool $inverse Inverse the results to use as a conflicts.
+ * @return bool
+ */
+ private function checkDepPriority(array $dep, array $plugins, $inverse = false) {
+ // grab the ElggPlugin using this package.
+ $plugin_package = elgg_get_plugin_from_id($this->getID());
+ $plugin_priority = $plugin_package->getPriority();
+ $test_plugin = elgg_get_plugin_from_id($dep['plugin']);
+
+ // If this isn't a plugin or the plugin isn't installed or active
+ // priority doesn't matter. Use requires to check if a plugin is active.
+ if (!$plugin_package || !$test_plugin || !$test_plugin->isActive()) {
+ return array(
+ 'status' => true,
+ 'value' => 'uninstalled'
+ );
+ }
+
+ $test_plugin_priority = $test_plugin->getPriority();
+
+ switch ($dep['priority']) {
+ case 'before':
+ $status = $plugin_priority < $test_plugin_priority;
+ break;
+
+ case 'after':
+ $status = $plugin_priority > $test_plugin_priority;
+ break;
+
+ default;
+ $status = false;
+ }
+
+ // get the current value
+ if ($plugin_priority < $test_plugin_priority) {
+ $value = 'before';
+ } else {
+ $value = 'after';
+ }
+
+ if ($inverse) {
+ $status = !$status;
+ }
+
+ return array(
+ 'status' => $status,
+ 'value' => $value
+ );
+ }
+
+ /**
+ * Checks if $elgg_version meets the requirement by $dep.
+ *
+ * @param array $dep An Elgg manifest.xml deps array
+ * @param array $elgg_version An Elgg version (either YYYYMMDDXX or X.Y.Z)
+ * @param bool $inverse Inverse the result to use as a conflicts.
+ * @return bool
+ */
+ private function checkDepElgg(array $dep, $elgg_version, $inverse = false) {
+ $status = version_compare($elgg_version, $dep['version'], $dep['comparison']);
+
+ if ($inverse) {
+ $status = !$status;
+ }
+
+ return array(
+ 'status' => $status,
+ 'value' => $elgg_version
+ );
+ }
+
+ /**
+ * Checks if the PHP extension in $dep is loaded.
+ *
+ * @todo Can this be merged with the plugin checker?
+ *
+ * @param array $dep An Elgg manifest.xml deps array
+ * @param bool $inverse Inverse the result to use as a conflicts.
+ * @return array An array in the form array(
+ * 'status' => bool
+ * 'value' => string The version provided
+ * )
+ */
+ private function checkDepPhpExtension(array $dep, $inverse = false) {
+ $name = $dep['name'];
+ $version = $dep['version'];
+ $comparison = $dep['comparison'];
+
+ // not enabled.
+ $status = extension_loaded($name);
+
+ // enabled. check version.
+ $ext_version = phpversion($name);
+
+ if ($status) {
+ // some extensions (like gd) don't provide versions. neat.
+ // don't check version info and return a lie.
+ if ($ext_version && $version) {
+ $status = version_compare($ext_version, $version, $comparison);
+ }
+
+ if (!$ext_version) {
+ $ext_version = '???';
+ }
+ }
+
+ // some php extensions can be emulated, so check provides.
+ if ($status == false) {
+ $provides = elgg_check_plugins_provides('php_extension', $name, $version, $comparison);
+ $status = $provides['status'];
+ $ext_version = $provides['value'];
+ }
+
+ if ($inverse) {
+ $status = !$status;
+ }
+
+ return array(
+ 'status' => $status,
+ 'value' => $ext_version
+ );
+ }
+
+ /**
+ * Check if the PHP ini setting satisfies $dep.
+ *
+ * @param array $dep An Elgg manifest.xml deps array
+ * @param bool $inverse Inverse the result to use as a conflicts.
+ * @return bool
+ */
+ private function checkDepPhpIni($dep, $inverse = false) {
+ $name = $dep['name'];
+ $value = $dep['value'];
+ $comparison = $dep['comparison'];
+
+ // ini_get() normalizes truthy values to 1 but falsey values to 0 or ''.
+ // version_compare() considers '' < 0, so normalize '' to 0.
+ // ElggPluginManifest normalizes all bool values and '' to 1 or 0.
+ $setting = ini_get($name);
+
+ if ($setting === '') {
+ $setting = 0;
+ }
+
+ $status = version_compare($setting, $value, $comparison);
+
+ if ($inverse) {
+ $status = !$status;
+ }
+
+ return array(
+ 'status' => $status,
+ 'value' => $setting
+ );
+ }
+
+ /**
+ * Returns the Plugin ID
+ *
+ * @return string
+ */
+ public function getID() {
+ return $this->id;
+ }
+
+ /**
+ * Returns the last error message.
+ *
+ * @return string
+ */
+ public function getError() {
+ return $this->errorMsg;
+ }
+}
diff --git a/engine/classes/ElggPriorityList.php b/engine/classes/ElggPriorityList.php
new file mode 100644
index 000000000..416df885c
--- /dev/null
+++ b/engine/classes/ElggPriorityList.php
@@ -0,0 +1,366 @@
+<?php
+/**
+ * Iterate over elements in a specific priority.
+ *
+ * $pl = new ElggPriorityList();
+ * $pl->add('Element 0');
+ * $pl->add('Element 10', 10);
+ * $pl->add('Element -10', -10);
+ *
+ * foreach ($pl as $priority => $element) {
+ * var_dump("$priority => $element");
+ * }
+ *
+ * Yields:
+ * -10 => Element -10
+ * 0 => Element 0
+ * 10 => Element 10
+ *
+ * Collisions on priority are handled by inserting the element at or as close to the
+ * requested priority as possible:
+ *
+ * $pl = new ElggPriorityList();
+ * $pl->add('Element 5', 5);
+ * $pl->add('Colliding element 5', 5);
+ * $pl->add('Another colliding element 5', 5);
+ *
+ * foreach ($pl as $priority => $element) {
+ * var_dump("$priority => $element");
+ * }
+ *
+ * Yields:
+ * 5 => 'Element 5',
+ * 6 => 'Colliding element 5',
+ * 7 => 'Another colliding element 5'
+ *
+ * You can do priority lookups by element:
+ *
+ * $pl = new ElggPriorityList();
+ * $pl->add('Element 0');
+ * $pl->add('Element -5', -5);
+ * $pl->add('Element 10', 10);
+ * $pl->add('Element -10', -10);
+ *
+ * $priority = $pl->getPriority('Element -5');
+ *
+ * Or element lookups by priority.
+ * $element = $pl->getElement(-5);
+ *
+ * To remove elements, pass the element.
+ * $pl->remove('Element -10');
+ *
+ * To check if an element exists:
+ * $pl->contains('Element -5');
+ *
+ * To move an element:
+ * $pl->move('Element -5', -3);
+ *
+ * ElggPriorityList only tracks priority. No checking is done in ElggPriorityList for duplicates or
+ * updating. If you need to track this use objects and an external map:
+ *
+ * function elgg_register_something($id, $display_name, $location, $priority = 500) {
+ * // $id => $element.
+ * static $map = array();
+ * static $list;
+ *
+ * if (!$list) {
+ * $list = new ElggPriorityList();
+ * }
+ *
+ * // update if already registered.
+ * if (isset($map[$id])) {
+ * $element = $map[$id];
+ * // move it first because we have to pass the original element.
+ * if (!$list->move($element, $priority)) {
+ * return false;
+ * }
+ * $element->display_name = $display_name;
+ * $element->location = $location;
+ * } else {
+ * $element = new stdClass();
+ * $element->display_name = $display_name;
+ * $element->location = $location;
+ * if (!$list->add($element, $priority)) {
+ * return false;
+ * }
+ * $map[$id] = $element;
+ * }
+ *
+ * return true;
+ * }
+ *
+ * @package Elgg.Core
+ * @subpackage Helpers
+ */
+class ElggPriorityList
+ implements Iterator, Countable {
+
+ /**
+ * The list of elements
+ *
+ * @var array
+ */
+ private $elements = array();
+
+ /**
+ * Create a new priority list.
+ *
+ * @param array $elements An optional array of priorities => element
+ */
+ public function __construct(array $elements = array()) {
+ if ($elements) {
+ foreach ($elements as $priority => $element) {
+ $this->add($element, $priority);
+ }
+ }
+ }
+
+ /**
+ * Adds an element to the list.
+ *
+ * @warning This returns the priority at which the element was added, which can be 0. Use
+ * !== false to check for success.
+ *
+ * @param mixed $element The element to add to the list.
+ * @param mixed $priority Priority to add the element. In priority collisions, the original element
+ * maintains its priority and the new element is to the next available
+ * slot, taking into consideration all previously registered elements.
+ * Negative elements are accepted.
+ * @param bool $exact unused
+ * @return int The priority of the added element.
+ * @todo remove $exact or implement it. Note we use variable name strict below.
+ */
+ public function add($element, $priority = null, $exact = false) {
+ if ($priority !== null && !is_numeric($priority)) {
+ return false;
+ } else {
+ $priority = $this->getNextPriority($priority);
+ }
+
+ $this->elements[$priority] = $element;
+ $this->sorted = false;
+ return $priority;
+ }
+
+ /**
+ * Removes an element from the list.
+ *
+ * @warning The element must have the same attributes / values. If using $strict, it must have
+ * the same types. array(10) will fail in strict against array('10') (str vs int).
+ *
+ * @param mixed $element The element to remove from the list
+ * @param bool $strict Whether to check the type of the element match
+ * @return bool
+ */
+ public function remove($element, $strict = false) {
+ $index = array_search($element, $this->elements, $strict);
+ if ($index !== false) {
+ unset($this->elements[$index]);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Move an existing element to a new priority.
+ *
+ * @param mixed $element The element to move
+ * @param int $new_priority The new priority for the element
+ * @param bool $strict Whether to check the type of the element match
+ * @return bool
+ */
+ public function move($element, $new_priority, $strict = false) {
+ $new_priority = (int) $new_priority;
+
+ $current_priority = $this->getPriority($element, $strict);
+ if ($current_priority === false) {
+ return false;
+ }
+
+ if ($current_priority == $new_priority) {
+ return true;
+ }
+
+ // move the actual element so strict operations still work
+ $element = $this->getElement($current_priority);
+ unset($this->elements[$current_priority]);
+ return $this->add($element, $new_priority);
+ }
+
+ /**
+ * Returns the elements
+ *
+ * @return array
+ */
+ public function getElements() {
+ $this->sortIfUnsorted();
+ return $this->elements;
+ }
+
+ /**
+ * Sort the elements optionally by a callback function.
+ *
+ * If no user function is provided the elements are sorted by priority registered.
+ *
+ * The callback function should accept the array of elements as the first
+ * argument and should return a sorted array.
+ *
+ * This function can be called multiple times.
+ *
+ * @param callback $callback The callback for sorting. Numeric sorting is the default.
+ * @return bool
+ */
+ public function sort($callback = null) {
+ if (!$callback) {
+ ksort($this->elements, SORT_NUMERIC);
+ } else {
+ $sorted = call_user_func($callback, $this->elements);
+
+ if (!$sorted) {
+ return false;
+ }
+
+ $this->elements = $sorted;
+ }
+
+ $this->sorted = true;
+ return true;
+ }
+
+ /**
+ * Sort the elements if they haven't been sorted yet.
+ *
+ * @return bool
+ */
+ private function sortIfUnsorted() {
+ if (!$this->sorted) {
+ return $this->sort();
+ }
+ }
+
+ /**
+ * Returns the next priority available.
+ *
+ * @param int $near Make the priority as close to $near as possible.
+ * @return int
+ */
+ public function getNextPriority($near = 0) {
+ $near = (int) $near;
+
+ while (array_key_exists($near, $this->elements)) {
+ $near++;
+ }
+
+ return $near;
+ }
+
+ /**
+ * Returns the priority of an element if it exists in the list.
+ *
+ * @warning This can return 0 if the element's priority is 0.
+ *
+ * @param mixed $element The element to check for.
+ * @param bool $strict Use strict checking?
+ * @return mixed False if the element doesn't exists, the priority if it does.
+ */
+ public function getPriority($element, $strict = false) {
+ return array_search($element, $this->elements, $strict);
+ }
+
+ /**
+ * Returns the element at $priority.
+ *
+ * @param int $priority The priority
+ * @return mixed The element or false on fail.
+ */
+ public function getElement($priority) {
+ return (isset($this->elements[$priority])) ? $this->elements[$priority] : false;
+ }
+
+ /**
+ * Returns if the list contains $element.
+ *
+ * @param mixed $element The element to check.
+ * @param bool $strict Use strict checking?
+ * @return bool
+ */
+ public function contains($element, $strict = false) {
+ return $this->getPriority($element, $strict) !== false;
+ }
+
+
+ /**********************
+ * Interface methods *
+ **********************/
+
+ /**
+ * Iterator
+ */
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::rewind()
+ * @return void
+ */
+ public function rewind() {
+ $this->sortIfUnsorted();
+ return reset($this->elements);
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::current()
+ * @return mixed
+ */
+ public function current() {
+ $this->sortIfUnsorted();
+ return current($this->elements);
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::key()
+ * @return int
+ */
+ public function key() {
+ $this->sortIfUnsorted();
+ return key($this->elements);
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::next()
+ * @return mixed
+ */
+ public function next() {
+ $this->sortIfUnsorted();
+ return next($this->elements);
+ }
+
+ /**
+ * PHP Iterator Interface
+ *
+ * @see Iterator::valid()
+ * @return bool
+ */
+ public function valid() {
+ $this->sortIfUnsorted();
+ $key = key($this->elements);
+ return ($key !== NULL && $key !== FALSE);
+ }
+
+ /**
+ * Countable interface
+ *
+ * @see Countable::count()
+ * @return int
+ */
+ public function count() {
+ return count($this->elements);
+ }
+} \ No newline at end of file
diff --git a/engine/classes/ElggRelationship.php b/engine/classes/ElggRelationship.php
new file mode 100644
index 000000000..d2e88882a
--- /dev/null
+++ b/engine/classes/ElggRelationship.php
@@ -0,0 +1,231 @@
+<?php
+/**
+ * Relationship class.
+ *
+ * @package Elgg.Core
+ * @subpackage Core
+ *
+ * @property int $id The unique identifier (read-only)
+ * @property int $guid_one The GUID of the subject of the relationship
+ * @property string $relationship The name of the relationship
+ * @property int $guid_two The GUID of the object of the relationship
+ * @property int $time_created A UNIX timestamp of when the relationship was created (read-only, set on first save)
+ */
+class ElggRelationship extends ElggData implements
+ Importable
+{
+
+ /**
+ * Create a relationship object, optionally from a given id value or row.
+ *
+ * @param mixed $id ElggRelationship id, database row, or null for new relationship
+ */
+ function __construct($id = null) {
+ $this->initializeAttributes();
+
+ if (!empty($id)) {
+ if ($id instanceof stdClass) {
+ $relationship = $id; // Create from db row
+ } else {
+ $relationship = get_relationship($id);
+ }
+
+ if ($relationship) {
+ $objarray = (array) $relationship;
+ foreach ($objarray as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Class member get overloading
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ function get($name) {
+ if (array_key_exists($name, $this->attributes)) {
+ return $this->attributes[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * Class member set overloading
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return mixed
+ */
+ function set($name, $value) {
+ $this->attributes[$name] = $value;
+ return true;
+ }
+
+ /**
+ * Save the relationship
+ *
+ * @return int the relationship id
+ * @throws IOException
+ */
+ public function save() {
+ if ($this->id > 0) {
+ delete_relationship($this->id);
+ }
+
+ $this->id = add_entity_relationship($this->guid_one, $this->relationship, $this->guid_two);
+ if (!$this->id) {
+ throw new IOException(elgg_echo('IOException:UnableToSaveNew', array(get_class())));
+ }
+
+ return $this->id;
+ }
+
+ /**
+ * Delete a given relationship.
+ *
+ * @return bool
+ */
+ public function delete() {
+ return delete_relationship($this->id);
+ }
+
+ /**
+ * Get a URL for this relationship.
+ *
+ * @return string
+ */
+ public function getURL() {
+ return get_relationship_url($this->id);
+ }
+
+ // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array(
+ 'id',
+ 'guid_one',
+ 'relationship',
+ 'guid_two'
+ );
+ }
+
+ /**
+ * Export this relationship
+ *
+ * @return array
+ */
+ public function export() {
+ $uuid = get_uuid_from_object($this);
+ $relationship = new ODDRelationship(
+ guid_to_uuid($this->guid_one),
+ $this->relationship,
+ guid_to_uuid($this->guid_two)
+ );
+
+ $relationship->setAttribute('uuid', $uuid);
+
+ return $relationship;
+ }
+
+ // IMPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Import a relationship
+ *
+ * @param ODD $data ODD data
+
+ * @return bool
+ * @throws ImportException|InvalidParameterException
+ */
+ public function import(ODD $data) {
+ if (!($data instanceof ODDRelationship)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnexpectedODDClass'));
+ }
+
+ $uuid_one = $data->getAttribute('uuid1');
+ $uuid_two = $data->getAttribute('uuid2');
+
+ // See if this entity has already been imported, if so then we need to link to it
+ $entity1 = get_entity_from_uuid($uuid_one);
+ $entity2 = get_entity_from_uuid($uuid_two);
+ if (($entity1) && ($entity2)) {
+ // Set the item ID
+ $this->attributes['guid_one'] = $entity1->getGUID();
+ $this->attributes['guid_two'] = $entity2->getGUID();
+
+ // Map verb to relationship
+ //$verb = $data->getAttribute('verb');
+ //$relationship = get_relationship_from_verb($verb);
+ $relationship = $data->getAttribute('type');
+
+ if ($relationship) {
+ $this->attributes['relationship'] = $relationship;
+ // save
+ $result = $this->save();
+ if (!$result) {
+ throw new ImportException(elgg_echo('ImportException:ProblemSaving', array(get_class())));
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ // SYSTEM LOG INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Return an identification for the object for storage in the system log.
+ * This id must be an integer.
+ *
+ * @return int
+ */
+ public function getSystemLogID() {
+ return $this->id;
+ }
+
+ /**
+ * For a given ID, return the object associated with it.
+ * This is used by the river functionality primarily.
+ * This is useful for checking access permissions etc on objects.
+ *
+ * @param int $id ID
+ *
+ * @return ElggRelationship
+ */
+ public function getObjectFromID($id) {
+ return get_relationship($id);
+ }
+
+ /**
+ * Return a type of the object - eg. object, group, user, relationship, metadata, annotation etc
+ *
+ * @return string 'relationship'
+ */
+ public function getType() {
+ return 'relationship';
+ }
+
+ /**
+ * Return a subtype. For metadata & annotations this is the 'name' and for relationship this
+ * is the relationship type.
+ *
+ * @return string
+ */
+ public function getSubtype() {
+ return $this->relationship;
+ }
+
+}
diff --git a/engine/classes/ElggRiverItem.php b/engine/classes/ElggRiverItem.php
new file mode 100644
index 000000000..d3d09cd91
--- /dev/null
+++ b/engine/classes/ElggRiverItem.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * River item class.
+ *
+ * @package Elgg.Core
+ * @subpackage Core
+ *
+ * @property int $id The unique identifier (read-only)
+ * @property int $subject_guid The GUID of the actor
+ * @property int $object_guid The GUID of the object
+ * @property int $annotation_id The ID of the annotation involved in the action
+ * @property string $type The type of one of the entities involved in the action
+ * @property string $subtype The subtype of one of the entities involved in the action
+ * @property string $action_type The name of the action
+ * @property string $view The view for displaying this river item
+ * @property int $access_id The visibility of the river item
+ * @property int $posted UNIX timestamp when the action occurred
+ */
+class ElggRiverItem {
+ public $id;
+ public $subject_guid;
+ public $object_guid;
+ public $annotation_id;
+ public $type;
+ public $subtype;
+ public $action_type;
+ public $access_id;
+ public $view;
+ public $posted;
+
+ /**
+ * Construct a river item object given a database row.
+ *
+ * @param stdClass $object Object obtained from database
+ */
+ function __construct($object) {
+ if (!($object instanceof stdClass)) {
+ // throw exception
+ }
+
+ // the casting is to support typed serialization like json
+ $int_types = array('id', 'subject_guid', 'object_guid', 'annotation_id', 'access_id', 'posted');
+ foreach ($object as $key => $value) {
+ if (in_array($key, $int_types)) {
+ $this->$key = (int)$value;
+ } else {
+ $this->$key = $value;
+ }
+ }
+ }
+
+ /**
+ * Get the subject of this river item
+ *
+ * @return ElggEntity
+ */
+ public function getSubjectEntity() {
+ return get_entity($this->subject_guid);
+ }
+
+ /**
+ * Get the object of this river item
+ *
+ * @return ElggEntity
+ */
+ public function getObjectEntity() {
+ return get_entity($this->object_guid);
+ }
+
+ /**
+ * Get the Annotation for this river item
+ *
+ * @return ElggAnnotation
+ */
+ public function getAnnotation() {
+ return elgg_get_annotation_from_id($this->annotation_id);
+ }
+
+ /**
+ * Get the view used to display this river item
+ *
+ * @return string
+ */
+ public function getView() {
+ return $this->view;
+ }
+
+ /**
+ * Get the time this activity was posted
+ *
+ * @return int
+ */
+ public function getPostedTime() {
+ return (int)$this->posted;
+ }
+
+ /**
+ * Get the type of the object
+ *
+ * @return string 'river'
+ */
+ public function getType() {
+ return 'river';
+ }
+
+ /**
+ * Get the subtype of the object
+ *
+ * @return string 'item'
+ */
+ public function getSubtype() {
+ return 'item';
+ }
+
+}
diff --git a/engine/classes/ElggSession.php b/engine/classes/ElggSession.php
new file mode 100644
index 000000000..9750f063e
--- /dev/null
+++ b/engine/classes/ElggSession.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Magic session class.
+ * This class is intended to extend the $_SESSION magic variable by providing an API hook
+ * to plug in other values.
+ *
+ * Primarily this is intended to provide a way of supplying "logged in user"
+ * details without touching the session (which can cause problems when
+ * accessed server side).
+ *
+ * If a value is present in the session then that value is returned, otherwise
+ * a plugin hook 'session:get', '$var' is called, where $var is the variable
+ * being requested.
+ *
+ * Setting values will store variables in the session in the normal way.
+ *
+ * LIMITATIONS: You can not access multidimensional arrays
+ *
+ * @package Elgg.Core
+ * @subpackage Sessions
+ */
+class ElggSession implements ArrayAccess {
+ /** Local cache of trigger retrieved variables */
+ private static $__localcache;
+
+ /**
+ * Test if property is set either as an attribute or metadata.
+ *
+ * @param string $key The name of the attribute or metadata.
+ *
+ * @return bool
+ */
+ function __isset($key) {
+ return $this->offsetExists($key);
+ }
+
+ /**
+ * Set a value, go straight to session.
+ *
+ * @param string $key Name
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ function offsetSet($key, $value) {
+ $_SESSION[$key] = $value;
+ }
+
+ /**
+ * Get a variable from either the session, or if its not in the session
+ * attempt to get it from an api call.
+ *
+ * @see ArrayAccess::offsetGet()
+ *
+ * @param mixed $key Name
+ *
+ * @return mixed
+ */
+ function offsetGet($key) {
+ if (!ElggSession::$__localcache) {
+ ElggSession::$__localcache = array();
+ }
+
+ if (isset($_SESSION[$key])) {
+ return $_SESSION[$key];
+ }
+
+ if (isset(ElggSession::$__localcache[$key])) {
+ return ElggSession::$__localcache[$key];
+ }
+
+ $value = NULL;
+ $value = elgg_trigger_plugin_hook('session:get', $key, NULL, $value);
+
+ ElggSession::$__localcache[$key] = $value;
+
+ return ElggSession::$__localcache[$key];
+ }
+
+ /**
+ * Unset a value from the cache and the session.
+ *
+ * @see ArrayAccess::offsetUnset()
+ *
+ * @param mixed $key Name
+ *
+ * @return void
+ */
+ function offsetUnset($key) {
+ unset(ElggSession::$__localcache[$key]);
+ unset($_SESSION[$key]);
+ }
+
+ /**
+ * Return whether the value is set in either the session or the cache.
+ *
+ * @see ArrayAccess::offsetExists()
+ *
+ * @param int $offset Offset
+ *
+ * @return bool
+ */
+ function offsetExists($offset) {
+ if (isset(ElggSession::$__localcache[$offset])) {
+ return true;
+ }
+
+ if (isset($_SESSION[$offset])) {
+ return true;
+ }
+
+ if ($this->offsetGet($offset)) {
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Alias to ::offsetGet()
+ *
+ * @param string $key Name
+ *
+ * @return mixed
+ */
+ function get($key) {
+ return $this->offsetGet($key);
+ }
+
+ /**
+ * Alias to ::offsetSet()
+ *
+ * @param string $key Name
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ function set($key, $value) {
+ $this->offsetSet($key, $value);
+ }
+
+ /**
+ * Alias to offsetUnset()
+ *
+ * @param string $key Name
+ *
+ * @return void
+ */
+ function del($key) {
+ $this->offsetUnset($key);
+ }
+}
diff --git a/engine/classes/ElggSharedMemoryCache.php b/engine/classes/ElggSharedMemoryCache.php
new file mode 100644
index 000000000..f5f11d2c7
--- /dev/null
+++ b/engine/classes/ElggSharedMemoryCache.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Shared memory cache description.
+ * Extends ElggCache with functions useful to shared memory
+ * style caches (static variables, memcache etc)
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+abstract class ElggSharedMemoryCache extends ElggCache {
+ /**
+ * Namespace variable used to keep various bits of the cache
+ * separate.
+ *
+ * @var string
+ */
+ private $namespace;
+
+ /**
+ * Set the namespace of this cache.
+ * This is useful for cache types (like memcache or static variables) where there is one large
+ * flat area of memory shared across all instances of the cache.
+ *
+ * @param string $namespace Namespace for cache
+ *
+ * @return void
+ */
+ public function setNamespace($namespace = "default") {
+ $this->namespace = $namespace;
+ }
+
+ /**
+ * Get the namespace currently defined.
+ *
+ * @return string
+ */
+ public function getNamespace() {
+ return $this->namespace;
+ }
+}
diff --git a/engine/classes/ElggSite.php b/engine/classes/ElggSite.php
new file mode 100644
index 000000000..dd996fe98
--- /dev/null
+++ b/engine/classes/ElggSite.php
@@ -0,0 +1,455 @@
+<?php
+/**
+ * A Site entity.
+ *
+ * ElggSite represents a single site entity.
+ *
+ * An ElggSite object is an ElggEntity child class with the subtype
+ * of "site." It is created upon installation and hold all the
+ * information about a site:
+ * - name
+ * - description
+ * - url
+ *
+ * Every ElggEntity (except ElggSite) belongs to a site.
+ *
+ * @internal ElggSite represents a single row from the sites_entity
+ * table, as well as the corresponding ElggEntity row from the entities table.
+ *
+ * @warning Multiple site support isn't fully developed.
+ *
+ * @package Elgg.Core
+ * @subpackage DataMode.Site
+ * @link http://docs.elgg.org/DataModel/Sites
+ *
+ * @property string $name The name or title of the website
+ * @property string $description A motto, mission statement, or description of the website
+ * @property string $url The root web address for the site, including trailing slash
+ */
+class ElggSite extends ElggEntity {
+
+ /**
+ * Initialise the attributes array.
+ * This is vital to distinguish between metadata and base parameters.
+ *
+ * Place your base parameters here.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = "site";
+ $this->attributes['name'] = NULL;
+ $this->attributes['description'] = NULL;
+ $this->attributes['url'] = NULL;
+ $this->attributes['tables_split'] = 2;
+ }
+
+ /**
+ * Load or create a new ElggSite.
+ *
+ * If no arguments are passed, create a new entity.
+ *
+ * If an argument is passed attempt to load a full Site entity. Arguments
+ * can be:
+ * - The GUID of a site entity.
+ * - A URL as stored in ElggSite->url
+ * - A DB result object with a guid property
+ *
+ * @param mixed $guid If an int, load that GUID. If a db row then will
+ * load the rest of the data.
+ *
+ * @throws IOException If passed an incorrect guid
+ * @throws InvalidParameterException If passed an Elgg* Entity that isn't an ElggSite
+ */
+ function __construct($guid = null) {
+ $this->initializeAttributes();
+
+ // compatibility for 1.7 api.
+ $this->initialise_attributes(false);
+
+ if (!empty($guid)) {
+ // Is $guid is a DB entity table row
+ if ($guid instanceof stdClass) {
+ // Load the rest
+ if (!$this->load($guid)) {
+ $msg = elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid->guid));
+ throw new IOException($msg);
+ }
+ } else if ($guid instanceof ElggSite) {
+ // $guid is an ElggSite so this is a copy constructor
+ elgg_deprecated_notice('This type of usage of the ElggSite constructor was deprecated. Please use the clone method.', 1.7);
+
+ foreach ($guid->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else if ($guid instanceof ElggEntity) {
+ // @todo remove and just use else clause
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggSite'));
+ } else if (strpos($guid, "http") !== false) {
+ // url so retrieve by url
+ $guid = get_site_by_url($guid);
+ foreach ($guid->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else if (is_numeric($guid)) {
+ // $guid is a GUID so load
+ if (!$this->load($guid)) {
+ throw new IOException(elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid)));
+ }
+ } else {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue'));
+ }
+ }
+ }
+
+ /**
+ * Loads the full ElggSite when given a guid.
+ *
+ * @param mixed $guid GUID of ElggSite entity or database row object
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+ protected function load($guid) {
+ $attr_loader = new ElggAttributeLoader(get_class(), 'site', $this->attributes);
+ $attr_loader->requires_access_control = !($this instanceof ElggPlugin);
+ $attr_loader->secondary_loader = 'get_site_entity_as_row';
+
+ $attrs = $attr_loader->getRequiredAttributes($guid);
+ if (!$attrs) {
+ return false;
+ }
+
+ $this->attributes = $attrs;
+ $this->attributes['tables_loaded'] = 2;
+ _elgg_cache_entity($this);
+
+ return true;
+ }
+
+ /**
+ * Saves site-specific attributes.
+ *
+ * @internal Site attributes are saved in the sites_entity table.
+ *
+ * @return bool
+ */
+ public function save() {
+ global $CONFIG;
+
+ // Save generic stuff
+ if (!parent::save()) {
+ return false;
+ }
+
+ // make sure the site guid is set (if not, set to self)
+ if (!$this->get('site_guid')) {
+ $guid = $this->get('guid');
+ update_data("UPDATE {$CONFIG->dbprefix}entities SET site_guid=$guid
+ WHERE guid=$guid");
+ }
+
+ // Now save specific stuff
+ return create_site_entity($this->get('guid'), $this->get('name'),
+ $this->get('description'), $this->get('url'));
+ }
+
+ /**
+ * Delete the site.
+ *
+ * @note You cannot delete the current site.
+ *
+ * @return bool
+ * @throws SecurityException
+ */
+ public function delete() {
+ global $CONFIG;
+ if ($CONFIG->site->getGUID() == $this->guid) {
+ throw new SecurityException('SecurityException:deletedisablecurrentsite');
+ }
+
+ return parent::delete();
+ }
+
+ /**
+ * Disable the site
+ *
+ * @note You cannot disable the current site.
+ *
+ * @param string $reason Optional reason for disabling
+ * @param bool $recursive Recursively disable all contained entities?
+ *
+ * @return bool
+ * @throws SecurityException
+ */
+ public function disable($reason = "", $recursive = true) {
+ global $CONFIG;
+
+ if ($CONFIG->site->getGUID() == $this->guid) {
+ throw new SecurityException('SecurityException:deletedisablecurrentsite');
+ }
+
+ return parent::disable($reason, $recursive);
+ }
+
+ /**
+ * Gets an array of ElggUser entities who are members of the site.
+ *
+ * @param array $options An associative array for key => value parameters
+ * accepted by elgg_get_entities(). Common parameters
+ * include 'limit', and 'offset'.
+ * Note: this was $limit before version 1.8
+ * @param int $offset Offset @deprecated parameter
+ *
+ * @todo remove $offset in 2.0
+ *
+ * @return array of ElggUsers
+ */
+ public function getMembers($options = array(), $offset = 0) {
+ if (!is_array($options)) {
+ elgg_deprecated_notice("ElggSite::getMembers uses different arguments!", 1.8);
+ $options = array(
+ 'limit' => $options,
+ 'offset' => $offset,
+ );
+ }
+
+ $defaults = array(
+ 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $this->getGUID(),
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ );
+
+ $options = array_merge($defaults, $options);
+
+ return elgg_get_entities_from_relationship($options);
+ }
+
+ /**
+ * List the members of this site
+ *
+ * @param array $options An associative array for key => value parameters
+ * accepted by elgg_list_entities(). Common parameters
+ * include 'full_view', 'limit', and 'offset'.
+ *
+ * @return string
+ * @since 1.8.0
+ */
+ public function listMembers($options = array()) {
+ $defaults = array(
+ 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $this->getGUID(),
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ );
+
+ $options = array_merge($defaults, $options);
+
+ return elgg_list_entities_from_relationship($options);
+ }
+
+ /**
+ * Adds a user to the site.
+ *
+ * @param int $user_guid GUID
+ *
+ * @return bool
+ */
+ public function addUser($user_guid) {
+ return add_site_user($this->getGUID(), $user_guid);
+ }
+
+ /**
+ * Removes a user from the site.
+ *
+ * @param int $user_guid GUID
+ *
+ * @return bool
+ */
+ public function removeUser($user_guid) {
+ return remove_site_user($this->getGUID(), $user_guid);
+ }
+
+ /**
+ * Returns an array of ElggObject entities that belong to the site.
+ *
+ * @warning This only returns objects that have been explicitly added to the
+ * site through addObject()
+ *
+ * @param string $subtype Entity subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return array
+ */
+ public function getObjects($subtype = "", $limit = 10, $offset = 0) {
+ return get_site_objects($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Adds an object to the site.
+ *
+ * @param int $object_guid GUID
+ *
+ * @return bool
+ */
+ public function addObject($object_guid) {
+ return add_site_object($this->getGUID(), $object_guid);
+ }
+
+ /**
+ * Remvoes an object from the site.
+ *
+ * @param int $object_guid GUID
+ *
+ * @return bool
+ */
+ public function removeObject($object_guid) {
+ return remove_site_object($this->getGUID(), $object_guid);
+ }
+
+ /**
+ * Get the collections associated with a site.
+ *
+ * @param string $subtype Subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return unknown
+ * @deprecated 1.8 Was never implemented
+ */
+ public function getCollections($subtype = "", $limit = 10, $offset = 0) {
+ elgg_deprecated_notice("ElggSite::getCollections() is deprecated", 1.8);
+ get_site_collections($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /*
+ * EXPORTABLE INTERFACE
+ */
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array_merge(parent::getExportableValues(), array(
+ 'name',
+ 'description',
+ 'url',
+ ));
+ }
+
+ /**
+ * Halts bootup and redirects to the site front page
+ * if site is in walled garden mode, no user is logged in,
+ * and the URL is not a public page.
+ *
+ * @link http://docs.elgg.org/Tutorials/WalledGarden
+ *
+ * @return void
+ * @since 1.8.0
+ */
+ public function checkWalledGarden() {
+ global $CONFIG;
+
+ // command line calls should not invoke the walled garden check
+ if (PHP_SAPI === 'cli') {
+ return;
+ }
+
+ if ($CONFIG->walled_garden) {
+ if ($CONFIG->default_access == ACCESS_PUBLIC) {
+ $CONFIG->default_access = ACCESS_LOGGED_IN;
+ }
+ elgg_register_plugin_hook_handler(
+ 'access:collections:write',
+ 'user',
+ '_elgg_walled_garden_remove_public_access');
+
+ if (!elgg_is_logged_in()) {
+ // hook into the index system call at the highest priority
+ elgg_register_plugin_hook_handler('index', 'system', 'elgg_walled_garden_index', 1);
+
+ if (!$this->isPublicPage()) {
+ if (!elgg_is_xhr()) {
+ $_SESSION['last_forward_from'] = current_page_url();
+ }
+ register_error(elgg_echo('loggedinrequired'));
+ forward();
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns if a URL is public for this site when in Walled Garden mode.
+ *
+ * Pages are registered to be public by {@elgg_plugin_hook public_pages walled_garden}.
+ *
+ * @param string $url Defaults to the current URL.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+ public function isPublicPage($url = '') {
+ global $CONFIG;
+
+ if (empty($url)) {
+ $url = current_page_url();
+
+ // do not check against URL queries
+ if ($pos = strpos($url, '?')) {
+ $url = substr($url, 0, $pos);
+ }
+ }
+
+ // always allow index page
+ if ($url == elgg_get_site_url($this->guid)) {
+ return TRUE;
+ }
+
+ // default public pages
+ $defaults = array(
+ 'walled_garden/.*',
+ 'login',
+ 'action/login',
+ 'register',
+ 'action/register',
+ 'forgotpassword',
+ 'resetpassword',
+ 'action/user/requestnewpassword',
+ 'action/user/passwordreset',
+ 'action/security/refreshtoken',
+ 'ajax/view/js/languages',
+ 'upgrade\.php',
+ 'xml-rpc\.php',
+ 'mt/mt-xmlrpc\.cgi',
+ 'css/.*',
+ 'js/.*',
+ 'cache/css/.*',
+ 'cache/js/.*',
+ 'cron/.*',
+ 'services/.*',
+ );
+
+ // include a hook for plugin authors to include public pages
+ $plugins = elgg_trigger_plugin_hook('public_pages', 'walled_garden', NULL, array());
+
+ // allow public pages
+ foreach (array_merge($defaults, $plugins) as $public) {
+ $pattern = "`^{$CONFIG->url}$public/*$`i";
+ if (preg_match($pattern, $url)) {
+ return TRUE;
+ }
+ }
+
+ // non-public page
+ return FALSE;
+ }
+}
diff --git a/engine/classes/ElggStaticVariableCache.php b/engine/classes/ElggStaticVariableCache.php
new file mode 100644
index 000000000..9c14fdfba
--- /dev/null
+++ b/engine/classes/ElggStaticVariableCache.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * ElggStaticVariableCache
+ * Dummy cache which stores values in a static array. Using this makes future
+ * replacements to other caching back ends (eg memcache) much easier.
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+class ElggStaticVariableCache extends ElggSharedMemoryCache {
+ /**
+ * The cache.
+ *
+ * @var array
+ */
+ private static $__cache;
+
+ /**
+ * Create the variable cache.
+ *
+ * This function creates a variable cache in a static variable in
+ * memory, optionally with a given namespace (to avoid overlap).
+ *
+ * @param string $namespace The namespace for this cache to write to.
+ * @warning namespaces of the same name are shared!
+ */
+ function __construct($namespace = 'default') {
+ $this->setNamespace($namespace);
+ $this->clear();
+ }
+
+ /**
+ * Save a key
+ *
+ * @param string $key Name
+ * @param string $data Value
+ *
+ * @return boolean
+ */
+ public function save($key, $data) {
+ $namespace = $this->getNamespace();
+
+ ElggStaticVariableCache::$__cache[$namespace][$key] = $data;
+
+ return true;
+ }
+
+ /**
+ * Load a key
+ *
+ * @param string $key Name
+ * @param int $offset Offset
+ * @param int $limit Limit
+ *
+ * @return string
+ */
+ public function load($key, $offset = 0, $limit = null) {
+ $namespace = $this->getNamespace();
+
+ if (isset(ElggStaticVariableCache::$__cache[$namespace][$key])) {
+ return ElggStaticVariableCache::$__cache[$namespace][$key];
+ }
+
+ return false;
+ }
+
+ /**
+ * Invalidate a given key.
+ *
+ * @param string $key Name
+ *
+ * @return bool
+ */
+ public function delete($key) {
+ $namespace = $this->getNamespace();
+
+ unset(ElggStaticVariableCache::$__cache[$namespace][$key]);
+
+ return true;
+ }
+
+ /**
+ * Clears the cache for a particular namespace
+ *
+ * @return void
+ */
+ public function clear() {
+ $namespace = $this->getNamespace();
+
+ if (!isset(ElggStaticVariableCache::$__cache)) {
+ ElggStaticVariableCache::$__cache = array();
+ }
+
+ ElggStaticVariableCache::$__cache[$namespace] = array();
+ }
+}
diff --git a/engine/classes/ElggTranslit.php b/engine/classes/ElggTranslit.php
new file mode 100644
index 000000000..b4bf87797
--- /dev/null
+++ b/engine/classes/ElggTranslit.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Elgg Transliterate
+ *
+ * For creating "friendly titles" for URLs
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the LGPL. For more information, see
+ * <http://www.doctrine-project.org>.
+ *
+ * @package Elgg.Core
+ * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
+ * @author Jonathan H. Wage <jonwage@gmail.com>
+ * @author Steve Clay <steve@mrclay.org>
+ *
+ * @access private Plugin authors should not use this directly
+ */
+class ElggTranslit {
+
+ /**
+ * Create a version of a string for embedding in a URL
+ *
+ * @param string $string A UTF-8 string
+ * @param string $separator The character to separate words with
+ * @return string
+ */
+ static public function urlize($string, $separator = '-') {
+ // Iñtërnâtiônàlizætiøn, AND 日本語!
+
+ // try to force combined chars because the translit map and others expect it
+ if (self::hasNormalizerSupport()) {
+ $nfc = normalizer_normalize($string);
+ if (is_string($nfc)) {
+ $string = $nfc;
+ }
+ }
+ // Internationalization, AND 日本語!
+ $string = self::transliterateAscii($string);
+
+ // allow HTML tags in titles
+ $string = preg_replace('~<([a-zA-Z][^>]*)>~', ' $1 ', $string);
+
+ // more substitutions
+ // @todo put these somewhere else
+ $string = strtr($string, array(
+ // currency
+ "\xE2\x82\xAC" /* € */ => ' E ',
+ "\xC2\xA3" /* £ */ => ' GBP ',
+ ));
+
+ // remove all ASCII except 0-9a-zA-Z, hyphen, underscore, and whitespace
+ // note: "x" modifier did not work with this pattern.
+ $string = preg_replace('~['
+ . '\x00-\x08' // control chars
+ . '\x0b\x0c' // vert tab, form feed
+ . '\x0e-\x1f' // control chars
+ . '\x21-\x2c' // ! ... ,
+ . '\x2e\x2f' // . slash
+ . '\x3a-\x40' // : ... @
+ . '\x5b-\x5e' // [ ... ^
+ . '\x60' // `
+ . '\x7b-\x7f' // { ... DEL
+ . ']~', '', $string);
+ $string = strtr($string, '', '');
+
+ // internationalization, and 日本語!
+ // note: not using elgg_strtolower to keep this class portable
+ $string = is_callable('mb_strtolower')
+ ? mb_strtolower($string, 'UTF-8')
+ : strtolower($string);
+
+ // split by ASCII chars not in 0-9a-zA-Z
+ // note: we cannot use [^0-9a-zA-Z] because that matches multibyte chars.
+ // note: "x" modifier did not work with this pattern.
+ $pattern = '~['
+ . '\x00-\x2f' // controls ... slash
+ . '\x3a-\x40' // : ... @
+ . '\x5b-\x60' // [ ... `
+ . '\x7b-\x7f' // { ... DEL
+ . ']+~x';
+
+ // ['internationalization', 'and', '日本語']
+ $words = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY);
+
+ // ['internationalization', 'and', '%E6%97%A5%E6%9C%AC%E8%AA%9E']
+ $words = array_map('urlencode', $words);
+
+ // internationalization-and-%E6%97%A5%E6%9C%AC%E8%AA%9E
+ return implode($separator, $words);
+ }
+
+ /**
+ * Transliterate Western multibyte chars to ASCII
+ *
+ * @param string $utf8 a UTF-8 string
+ * @return string
+ */
+ static public function transliterateAscii($utf8) {
+ static $map = null;
+ if (!preg_match('/[\x80-\xff]/', $utf8)) {
+ return $utf8;
+ }
+ if (null === $map) {
+ $map = self::getAsciiTranslitMap();
+ }
+ return strtr($utf8, $map);
+ }
+
+ /**
+ * Get array of UTF-8 (NFC) character replacements.
+ *
+ * @return array
+ */
+ static public function getAsciiTranslitMap() {
+ return array(
+ // Decompositions for Latin-1 Supplement
+ "\xC2\xAA" /* ª */ => 'a', "\xC2\xBA" /* º */ => 'o', "\xC3\x80" /* À */ => 'A',
+ "\xC3\x81" /* à */ => 'A', "\xC3\x82" /* Â */ => 'A', "\xC3\x83" /* Ã */ => 'A',
+ "\xC3\x84" /* Ä */ => 'A', "\xC3\x85" /* Å */ => 'A', "\xC3\x86" /* Æ */ => 'AE',
+ "\xC3\x87" /* Ç */ => 'C', "\xC3\x88" /* È */ => 'E', "\xC3\x89" /* É */ => 'E',
+ "\xC3\x8A" /* Ê */ => 'E', "\xC3\x8B" /* Ë */ => 'E', "\xC3\x8C" /* Ì */ => 'I',
+ "\xC3\x8D" /* Ã */ => 'I', "\xC3\x8E" /* ÃŽ */ => 'I', "\xC3\x8F" /* Ã */ => 'I',
+ "\xC3\x90" /* à */ => 'D', "\xC3\x91" /* Ñ */ => 'N', "\xC3\x92" /* Ò */ => 'O',
+ "\xC3\x93" /* Ó */ => 'O', "\xC3\x94" /* Ô */ => 'O', "\xC3\x95" /* Õ */ => 'O',
+ "\xC3\x96" /* Ö */ => 'O', "\xC3\x99" /* Ù */ => 'U', "\xC3\x9A" /* Ú */ => 'U',
+ "\xC3\x9B" /* Û */ => 'U', "\xC3\x9C" /* Ü */ => 'U', "\xC3\x9D" /* à */ => 'Y',
+ "\xC3\x9E" /* Þ */ => 'TH', "\xC3\x9F" /* ß */ => 'ss', "\xC3\xA0" /* à */ => 'a',
+ "\xC3\xA1" /* á */ => 'a', "\xC3\xA2" /* â */ => 'a', "\xC3\xA3" /* ã */ => 'a',
+ "\xC3\xA4" /* ä */ => 'a', "\xC3\xA5" /* å */ => 'a', "\xC3\xA6" /* æ */ => 'ae',
+ "\xC3\xA7" /* ç */ => 'c', "\xC3\xA8" /* è */ => 'e', "\xC3\xA9" /* é */ => 'e',
+ "\xC3\xAA" /* ê */ => 'e', "\xC3\xAB" /* ë */ => 'e', "\xC3\xAC" /* ì */ => 'i',
+ "\xC3\xAD" /* í */ => 'i', "\xC3\xAE" /* î */ => 'i', "\xC3\xAF" /* ï */ => 'i',
+ "\xC3\xB0" /* ð */ => 'd', "\xC3\xB1" /* ñ */ => 'n', "\xC3\xB2" /* ò */ => 'o',
+ "\xC3\xB3" /* ó */ => 'o', "\xC3\xB4" /* ô */ => 'o', "\xC3\xB5" /* õ */ => 'o',
+ "\xC3\xB6" /* ö */ => 'o', "\xC3\xB8" /* ø */ => 'o', "\xC3\xB9" /* ù */ => 'u',
+ "\xC3\xBA" /* ú */ => 'u', "\xC3\xBB" /* û */ => 'u', "\xC3\xBC" /* ü */ => 'u',
+ "\xC3\xBD" /* ý */ => 'y', "\xC3\xBE" /* þ */ => 'th', "\xC3\xBF" /* ÿ */ => 'y',
+ "\xC3\x98" /* Ø */ => 'O',
+ // Decompositions for Latin Extended-A
+ "\xC4\x80" /* Ä€ */ => 'A', "\xC4\x81" /* Ä */ => 'a', "\xC4\x82" /* Ä‚ */ => 'A',
+ "\xC4\x83" /* ă */ => 'a', "\xC4\x84" /* Ą */ => 'A', "\xC4\x85" /* ą */ => 'a',
+ "\xC4\x86" /* Ć */ => 'C', "\xC4\x87" /* ć */ => 'c', "\xC4\x88" /* Ĉ */ => 'C',
+ "\xC4\x89" /* ĉ */ => 'c', "\xC4\x8A" /* Ċ */ => 'C', "\xC4\x8B" /* ċ */ => 'c',
+ "\xC4\x8C" /* ÄŒ */ => 'C', "\xC4\x8D" /* Ä */ => 'c', "\xC4\x8E" /* ÄŽ */ => 'D',
+ "\xC4\x8F" /* Ä */ => 'd', "\xC4\x90" /* Ä */ => 'D', "\xC4\x91" /* Ä‘ */ => 'd',
+ "\xC4\x92" /* Ä’ */ => 'E', "\xC4\x93" /* Ä“ */ => 'e', "\xC4\x94" /* Ä” */ => 'E',
+ "\xC4\x95" /* Ä• */ => 'e', "\xC4\x96" /* Ä– */ => 'E', "\xC4\x97" /* Ä— */ => 'e',
+ "\xC4\x98" /* Ę */ => 'E', "\xC4\x99" /* ę */ => 'e', "\xC4\x9A" /* Ě */ => 'E',
+ "\xC4\x9B" /* Ä› */ => 'e', "\xC4\x9C" /* Äœ */ => 'G', "\xC4\x9D" /* Ä */ => 'g',
+ "\xC4\x9E" /* Äž */ => 'G', "\xC4\x9F" /* ÄŸ */ => 'g', "\xC4\xA0" /* Ä  */ => 'G',
+ "\xC4\xA1" /* ġ */ => 'g', "\xC4\xA2" /* Ģ */ => 'G', "\xC4\xA3" /* ģ */ => 'g',
+ "\xC4\xA4" /* Ĥ */ => 'H', "\xC4\xA5" /* ĥ */ => 'h', "\xC4\xA6" /* Ħ */ => 'H',
+ "\xC4\xA7" /* ħ */ => 'h', "\xC4\xA8" /* Ĩ */ => 'I', "\xC4\xA9" /* ĩ */ => 'i',
+ "\xC4\xAA" /* Ī */ => 'I', "\xC4\xAB" /* ī */ => 'i', "\xC4\xAC" /* Ĭ */ => 'I',
+ "\xC4\xAD" /* ĭ */ => 'i', "\xC4\xAE" /* Į */ => 'I', "\xC4\xAF" /* į */ => 'i',
+ "\xC4\xB0" /* İ */ => 'I', "\xC4\xB1" /* ı */ => 'i', "\xC4\xB2" /* IJ */ => 'IJ',
+ "\xC4\xB3" /* ij */ => 'ij', "\xC4\xB4" /* Ĵ */ => 'J', "\xC4\xB5" /* ĵ */ => 'j',
+ "\xC4\xB6" /* Ķ */ => 'K', "\xC4\xB7" /* ķ */ => 'k', "\xC4\xB8" /* ĸ */ => 'k',
+ "\xC4\xB9" /* Ĺ */ => 'L', "\xC4\xBA" /* ĺ */ => 'l', "\xC4\xBB" /* Ļ */ => 'L',
+ "\xC4\xBC" /* ļ */ => 'l', "\xC4\xBD" /* Ľ */ => 'L', "\xC4\xBE" /* ľ */ => 'l',
+ "\xC4\xBF" /* Ŀ */ => 'L', "\xC5\x80" /* ŀ */ => 'l', "\xC5\x81" /* Š*/ => 'L',
+ "\xC5\x82" /* ł */ => 'l', "\xC5\x83" /* Ń */ => 'N', "\xC5\x84" /* ń */ => 'n',
+ "\xC5\x85" /* Ņ */ => 'N', "\xC5\x86" /* ņ */ => 'n', "\xC5\x87" /* Ň */ => 'N',
+ "\xC5\x88" /* ň */ => 'n', "\xC5\x89" /* ʼn */ => 'N', "\xC5\x8A" /* Ŋ */ => 'n',
+ "\xC5\x8B" /* ŋ */ => 'N', "\xC5\x8C" /* Ō */ => 'O', "\xC5\x8D" /* Š*/ => 'o',
+ "\xC5\x8E" /* ÅŽ */ => 'O', "\xC5\x8F" /* Å */ => 'o', "\xC5\x90" /* Å */ => 'O',
+ "\xC5\x91" /* Å‘ */ => 'o', "\xC5\x92" /* Å’ */ => 'OE', "\xC5\x93" /* Å“ */ => 'oe',
+ "\xC5\x94" /* Å” */ => 'R', "\xC5\x95" /* Å• */ => 'r', "\xC5\x96" /* Å– */ => 'R',
+ "\xC5\x97" /* ŗ */ => 'r', "\xC5\x98" /* Ř */ => 'R', "\xC5\x99" /* ř */ => 'r',
+ "\xC5\x9A" /* Ś */ => 'S', "\xC5\x9B" /* ś */ => 's', "\xC5\x9C" /* Ŝ */ => 'S',
+ "\xC5\x9D" /* Å */ => 's', "\xC5\x9E" /* Åž */ => 'S', "\xC5\x9F" /* ÅŸ */ => 's',
+ "\xC5\xA0" /* Š */ => 'S', "\xC5\xA1" /* š */ => 's', "\xC5\xA2" /* Ţ */ => 'T',
+ "\xC5\xA3" /* ţ */ => 't', "\xC5\xA4" /* Ť */ => 'T', "\xC5\xA5" /* ť */ => 't',
+ "\xC5\xA6" /* Ŧ */ => 'T', "\xC5\xA7" /* ŧ */ => 't', "\xC5\xA8" /* Ũ */ => 'U',
+ "\xC5\xA9" /* ũ */ => 'u', "\xC5\xAA" /* Ū */ => 'U', "\xC5\xAB" /* ū */ => 'u',
+ "\xC5\xAC" /* Ŭ */ => 'U', "\xC5\xAD" /* ŭ */ => 'u', "\xC5\xAE" /* Ů */ => 'U',
+ "\xC5\xAF" /* ů */ => 'u', "\xC5\xB0" /* Ű */ => 'U', "\xC5\xB1" /* ű */ => 'u',
+ "\xC5\xB2" /* Ų */ => 'U', "\xC5\xB3" /* ų */ => 'u', "\xC5\xB4" /* Ŵ */ => 'W',
+ "\xC5\xB5" /* ŵ */ => 'w', "\xC5\xB6" /* Ŷ */ => 'Y', "\xC5\xB7" /* ŷ */ => 'y',
+ "\xC5\xB8" /* Ÿ */ => 'Y', "\xC5\xB9" /* Ź */ => 'Z', "\xC5\xBA" /* ź */ => 'z',
+ "\xC5\xBB" /* Ż */ => 'Z', "\xC5\xBC" /* ż */ => 'z', "\xC5\xBD" /* Ž */ => 'Z',
+ "\xC5\xBE" /* ž */ => 'z', "\xC5\xBF" /* ſ */ => 's',
+ // Decompositions for Latin Extended-B
+ "\xC8\x98" /* Ș */ => 'S', "\xC8\x99" /* ș */ => 's',
+ "\xC8\x9A" /* Èš */ => 'T', "\xC8\x9B" /* È› */ => 't',
+ // unmarked
+ "\xC6\xA0" /* Æ  */ => 'O', "\xC6\xA1" /* Æ¡ */ => 'o',
+ "\xC6\xAF" /* Ư */ => 'U', "\xC6\xB0" /* ư */ => 'u',
+ // grave accent
+ "\xE1\xBA\xA6" /* Ầ */ => 'A', "\xE1\xBA\xA7" /* ầ */ => 'a',
+ "\xE1\xBA\xB0" /* Ằ */ => 'A', "\xE1\xBA\xB1" /* ằ */ => 'a',
+ "\xE1\xBB\x80" /* Ề */ => 'E', "\xE1\xBB\x81" /* Ỡ*/ => 'e',
+ "\xE1\xBB\x92" /* Ồ */ => 'O', "\xE1\xBB\x93" /* ồ */ => 'o',
+ "\xE1\xBB\x9C" /* Ờ */ => 'O', "\xE1\xBB\x9D" /* Ỡ*/ => 'o',
+ "\xE1\xBB\xAA" /* Ừ */ => 'U', "\xE1\xBB\xAB" /* ừ */ => 'u',
+ "\xE1\xBB\xB2" /* Ỳ */ => 'Y', "\xE1\xBB\xB3" /* ỳ */ => 'y',
+ // hook
+ "\xE1\xBA\xA2" /* Ả */ => 'A', "\xE1\xBA\xA3" /* ả */ => 'a',
+ "\xE1\xBA\xA8" /* Ẩ */ => 'A', "\xE1\xBA\xA9" /* ẩ */ => 'a',
+ "\xE1\xBA\xB2" /* Ẳ */ => 'A', "\xE1\xBA\xB3" /* ẳ */ => 'a',
+ "\xE1\xBA\xBA" /* Ẻ */ => 'E', "\xE1\xBA\xBB" /* ẻ */ => 'e',
+ "\xE1\xBB\x82" /* Ể */ => 'E', "\xE1\xBB\x83" /* ể */ => 'e',
+ "\xE1\xBB\x88" /* Ỉ */ => 'I', "\xE1\xBB\x89" /* ỉ */ => 'i',
+ "\xE1\xBB\x8E" /* Ỏ */ => 'O', "\xE1\xBB\x8F" /* Ỡ*/ => 'o',
+ "\xE1\xBB\x94" /* Ổ */ => 'O', "\xE1\xBB\x95" /* ổ */ => 'o',
+ "\xE1\xBB\x9E" /* Ở */ => 'O', "\xE1\xBB\x9F" /* ở */ => 'o',
+ "\xE1\xBB\xA6" /* Ủ */ => 'U', "\xE1\xBB\xA7" /* ủ */ => 'u',
+ "\xE1\xBB\xAC" /* Ử */ => 'U', "\xE1\xBB\xAD" /* ử */ => 'u',
+ "\xE1\xBB\xB6" /* á»¶ */ => 'Y', "\xE1\xBB\xB7" /* á»· */ => 'y',
+ // tilde
+ "\xE1\xBA\xAA" /* Ẫ */ => 'A', "\xE1\xBA\xAB" /* ẫ */ => 'a',
+ "\xE1\xBA\xB4" /* Ẵ */ => 'A', "\xE1\xBA\xB5" /* ẵ */ => 'a',
+ "\xE1\xBA\xBC" /* Ẽ */ => 'E', "\xE1\xBA\xBD" /* ẽ */ => 'e',
+ "\xE1\xBB\x84" /* Ễ */ => 'E', "\xE1\xBB\x85" /* ễ */ => 'e',
+ "\xE1\xBB\x96" /* á»– */ => 'O', "\xE1\xBB\x97" /* á»— */ => 'o',
+ "\xE1\xBB\xA0" /* Ỡ */ => 'O', "\xE1\xBB\xA1" /* ỡ */ => 'o',
+ "\xE1\xBB\xAE" /* Ữ */ => 'U', "\xE1\xBB\xAF" /* ữ */ => 'u',
+ "\xE1\xBB\xB8" /* Ỹ */ => 'Y', "\xE1\xBB\xB9" /* ỹ */ => 'y',
+ // acute accent
+ "\xE1\xBA\xA4" /* Ấ */ => 'A', "\xE1\xBA\xA5" /* ấ */ => 'a',
+ "\xE1\xBA\xAE" /* Ắ */ => 'A', "\xE1\xBA\xAF" /* ắ */ => 'a',
+ "\xE1\xBA\xBE" /* Ế */ => 'E', "\xE1\xBA\xBF" /* ế */ => 'e',
+ "\xE1\xBB\x90" /* Ỡ*/ => 'O', "\xE1\xBB\x91" /* ố */ => 'o',
+ "\xE1\xBB\x9A" /* Ớ */ => 'O', "\xE1\xBB\x9B" /* ớ */ => 'o',
+ "\xE1\xBB\xA8" /* Ứ */ => 'U', "\xE1\xBB\xA9" /* ứ */ => 'u',
+ // dot below
+ "\xE1\xBA\xA0" /* Ạ */ => 'A', "\xE1\xBA\xA1" /* ạ */ => 'a',
+ "\xE1\xBA\xAC" /* Ậ */ => 'A', "\xE1\xBA\xAD" /* ậ */ => 'a',
+ "\xE1\xBA\xB6" /* Ặ */ => 'A', "\xE1\xBA\xB7" /* ặ */ => 'a',
+ "\xE1\xBA\xB8" /* Ẹ */ => 'E', "\xE1\xBA\xB9" /* ẹ */ => 'e',
+ "\xE1\xBB\x86" /* Ệ */ => 'E', "\xE1\xBB\x87" /* ệ */ => 'e',
+ "\xE1\xBB\x8A" /* Ị */ => 'I', "\xE1\xBB\x8B" /* ị */ => 'i',
+ "\xE1\xBB\x8C" /* Ọ */ => 'O', "\xE1\xBB\x8D" /* Ỡ*/ => 'o',
+ "\xE1\xBB\x98" /* Ộ */ => 'O', "\xE1\xBB\x99" /* ộ */ => 'o',
+ "\xE1\xBB\xA2" /* Ợ */ => 'O', "\xE1\xBB\xA3" /* ợ */ => 'o',
+ "\xE1\xBB\xA4" /* Ụ */ => 'U', "\xE1\xBB\xA5" /* ụ */ => 'u',
+ "\xE1\xBB\xB0" /* á»° */ => 'U', "\xE1\xBB\xB1" /* á»± */ => 'u',
+ "\xE1\xBB\xB4" /* Ỵ */ => 'Y', "\xE1\xBB\xB5" /* ỵ */ => 'y',
+ );
+ }
+
+ /**
+ * Tests that "normalizer_normalize" exists and works
+ *
+ * @return bool
+ */
+ static public function hasNormalizerSupport() {
+ static $ret = null;
+ if (null === $ret) {
+ $form_c = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
+ $form_d = "A\xCC\x8A"; // A followed by 'COMBINING RING ABOVE' (U+030A)
+ $ret = (function_exists('normalizer_normalize')
+ && $form_c === normalizer_normalize($form_d));
+ }
+ return $ret;
+ }
+}
diff --git a/engine/classes/ElggUser.php b/engine/classes/ElggUser.php
new file mode 100644
index 000000000..6163f9b62
--- /dev/null
+++ b/engine/classes/ElggUser.php
@@ -0,0 +1,588 @@
+<?php
+/**
+ * ElggUser
+ *
+ * Representation of a "user" in the system.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.User
+ *
+ * @property string $name The display name that the user will be known by in the network
+ * @property string $username The short, reference name for the user in the network
+ * @property string $email The email address to which Elgg will send email notifications
+ * @property string $language The language preference of the user (ISO 639-1 formatted)
+ * @property string $banned 'yes' if the user is banned from the network, 'no' otherwise
+ * @property string $admin 'yes' if the user is an administrator of the network, 'no' otherwise
+ * @property string $password The hashed password of the user
+ * @property string $salt The salt used to secure the password before hashing
+ */
+class ElggUser extends ElggEntity
+ implements Friendable {
+
+ /**
+ * Initialise the attributes array.
+ * This is vital to distinguish between metadata and base parameters.
+ *
+ * Place your base parameters here.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['type'] = "user";
+ $this->attributes['name'] = NULL;
+ $this->attributes['username'] = NULL;
+ $this->attributes['password'] = NULL;
+ $this->attributes['salt'] = NULL;
+ $this->attributes['email'] = NULL;
+ $this->attributes['language'] = NULL;
+ $this->attributes['code'] = NULL;
+ $this->attributes['banned'] = "no";
+ $this->attributes['admin'] = 'no';
+ $this->attributes['prev_last_action'] = NULL;
+ $this->attributes['last_login'] = NULL;
+ $this->attributes['prev_last_login'] = NULL;
+ $this->attributes['tables_split'] = 2;
+ }
+
+ /**
+ * Construct a new user entity, optionally from a given id value.
+ *
+ * @param mixed $guid If an int, load that GUID.
+ * If an entity table db row then will load the rest of the data.
+ *
+ * @throws Exception if there was a problem creating the user.
+ */
+ function __construct($guid = null) {
+ $this->initializeAttributes();
+
+ // compatibility for 1.7 api.
+ $this->initialise_attributes(false);
+
+ if (!empty($guid)) {
+ // Is $guid is a DB entity row
+ if ($guid instanceof stdClass) {
+ // Load the rest
+ if (!$this->load($guid)) {
+ $msg = elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid->guid));
+ throw new IOException($msg);
+ }
+ } else if (is_string($guid)) {
+ // $guid is a username
+ $user = get_user_by_username($guid);
+ if ($user) {
+ foreach ($user->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ }
+ } else if ($guid instanceof ElggUser) {
+ // $guid is an ElggUser so this is a copy constructor
+ elgg_deprecated_notice('This type of usage of the ElggUser constructor was deprecated. Please use the clone method.', 1.7);
+
+ foreach ($guid->attributes as $key => $value) {
+ $this->attributes[$key] = $value;
+ }
+ } else if ($guid instanceof ElggEntity) {
+ // @todo why have a special case here
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonElggUser'));
+ } else if (is_numeric($guid)) {
+ // $guid is a GUID so load entity
+ if (!$this->load($guid)) {
+ throw new IOException(elgg_echo('IOException:FailedToLoadGUID', array(get_class(), $guid)));
+ }
+ } else {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:UnrecognisedValue'));
+ }
+ }
+ }
+
+ /**
+ * Load the ElggUser data from the database
+ *
+ * @param mixed $guid ElggUser GUID or stdClass database row from entity table
+ *
+ * @return bool
+ */
+ protected function load($guid) {
+ $attr_loader = new ElggAttributeLoader(get_class(), 'user', $this->attributes);
+ $attr_loader->secondary_loader = 'get_user_entity_as_row';
+
+ $attrs = $attr_loader->getRequiredAttributes($guid);
+ if (!$attrs) {
+ return false;
+ }
+
+ $this->attributes = $attrs;
+ $this->attributes['tables_loaded'] = 2;
+ _elgg_cache_entity($this);
+
+ return true;
+ }
+
+ /**
+ * Saves this user to the database.
+ *
+ * @return bool
+ */
+ public function save() {
+ // Save generic stuff
+ if (!parent::save()) {
+ return false;
+ }
+
+ // Now save specific stuff
+ _elgg_disable_caching_for_entity($this->guid);
+ $ret = create_user_entity($this->get('guid'), $this->get('name'), $this->get('username'),
+ $this->get('password'), $this->get('salt'), $this->get('email'), $this->get('language'),
+ $this->get('code'));
+ _elgg_enable_caching_for_entity($this->guid);
+
+ return $ret;
+ }
+
+ /**
+ * User specific override of the entity delete method.
+ *
+ * @return bool
+ */
+ public function delete() {
+ global $USERNAME_TO_GUID_MAP_CACHE, $CODE_TO_GUID_MAP_CACHE;
+
+ // clear cache
+ if (isset($USERNAME_TO_GUID_MAP_CACHE[$this->username])) {
+ unset($USERNAME_TO_GUID_MAP_CACHE[$this->username]);
+ }
+ if (isset($CODE_TO_GUID_MAP_CACHE[$this->code])) {
+ unset($CODE_TO_GUID_MAP_CACHE[$this->code]);
+ }
+
+ clear_user_files($this);
+
+ // Delete entity
+ return parent::delete();
+ }
+
+ /**
+ * Ban this user.
+ *
+ * @param string $reason Optional reason
+ *
+ * @return bool
+ */
+ public function ban($reason = "") {
+ return ban_user($this->guid, $reason);
+ }
+
+ /**
+ * Unban this user.
+ *
+ * @return bool
+ */
+ public function unban() {
+ return unban_user($this->guid);
+ }
+
+ /**
+ * Is this user banned or not?
+ *
+ * @return bool
+ */
+ public function isBanned() {
+ return $this->banned == 'yes';
+ }
+
+ /**
+ * Is this user admin?
+ *
+ * @return bool
+ */
+ public function isAdmin() {
+
+ // for backward compatibility we need to pull this directly
+ // from the attributes instead of using the magic methods.
+ // this can be removed in 1.9
+ // return $this->admin == 'yes';
+ return $this->attributes['admin'] == 'yes';
+ }
+
+ /**
+ * Make the user an admin
+ *
+ * @return bool
+ */
+ public function makeAdmin() {
+ // If already saved, use the standard function.
+ if ($this->guid && !make_user_admin($this->guid)) {
+ return FALSE;
+ }
+
+ // need to manually set attributes since they've already been loaded.
+ $this->attributes['admin'] = 'yes';
+
+ return TRUE;
+ }
+
+ /**
+ * Remove the admin flag for user
+ *
+ * @return bool
+ */
+ public function removeAdmin() {
+ // If already saved, use the standard function.
+ if ($this->guid && !remove_user_admin($this->guid)) {
+ return FALSE;
+ }
+
+ // need to manually set attributes since they've already been loaded.
+ $this->attributes['admin'] = 'no';
+
+ return TRUE;
+ }
+
+ /**
+ * Get sites that this user is a member of
+ *
+ * @param string $subtype Optionally, the subtype of result we want to limit to
+ * @param int $limit The number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return array
+ */
+ function getSites($subtype = "", $limit = 10, $offset = 0) {
+ return get_user_sites($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Add this user to a particular site
+ *
+ * @param int $site_guid The guid of the site to add it to
+ *
+ * @return bool
+ */
+ function addToSite($site_guid) {
+ return add_site_user($site_guid, $this->getGUID());
+ }
+
+ /**
+ * Remove this user from a particular site
+ *
+ * @param int $site_guid The guid of the site to remove it from
+ *
+ * @return bool
+ */
+ function removeFromSite($site_guid) {
+ return remove_site_user($site_guid, $this->getGUID());
+ }
+
+ /**
+ * Adds a user as a friend
+ *
+ * @param int $friend_guid The GUID of the user to add
+ *
+ * @return bool
+ */
+ function addFriend($friend_guid) {
+ return user_add_friend($this->getGUID(), $friend_guid);
+ }
+
+ /**
+ * Removes a user as a friend
+ *
+ * @param int $friend_guid The GUID of the user to remove
+ *
+ * @return bool
+ */
+ function removeFriend($friend_guid) {
+ return user_remove_friend($this->getGUID(), $friend_guid);
+ }
+
+ /**
+ * Determines whether or not this user is a friend of the currently logged in user
+ *
+ * @return bool
+ */
+ function isFriend() {
+ return $this->isFriendOf(elgg_get_logged_in_user_guid());
+ }
+
+ /**
+ * Determines whether this user is friends with another user
+ *
+ * @param int $user_guid The GUID of the user to check against
+ *
+ * @return bool
+ */
+ function isFriendsWith($user_guid) {
+ return user_is_friend($this->getGUID(), $user_guid);
+ }
+
+ /**
+ * Determines whether or not this user is another user's friend
+ *
+ * @param int $user_guid The GUID of the user to check against
+ *
+ * @return bool
+ */
+ function isFriendOf($user_guid) {
+ return user_is_friend($user_guid, $this->getGUID());
+ }
+
+ /**
+ * Gets this user's friends
+ *
+ * @param string $subtype Optionally, the user subtype (leave blank for all)
+ * @param int $limit The number of users to retrieve
+ * @param int $offset Indexing offset, if any
+ *
+ * @return array|false Array of ElggUser, or false, depending on success
+ */
+ function getFriends($subtype = "", $limit = 10, $offset = 0) {
+ return get_user_friends($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Gets users who have made this user a friend
+ *
+ * @param string $subtype Optionally, the user subtype (leave blank for all)
+ * @param int $limit The number of users to retrieve
+ * @param int $offset Indexing offset, if any
+ *
+ * @return array|false Array of ElggUser, or false, depending on success
+ */
+ function getFriendsOf($subtype = "", $limit = 10, $offset = 0) {
+ return get_user_friends_of($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Lists the user's friends
+ *
+ * @param string $subtype Optionally, the user subtype (leave blank for all)
+ * @param int $limit The number of users to retrieve
+ * @param array $vars Display variables for the user view
+ *
+ * @return string Rendered list of friends
+ * @since 1.8.0
+ */
+ function listFriends($subtype = "", $limit = 10, array $vars = array()) {
+ $defaults = array(
+ 'type' => 'user',
+ 'relationship' => 'friend',
+ 'relationship_guid' => $this->guid,
+ 'limit' => $limit,
+ 'full_view' => false,
+ );
+
+ $options = array_merge($defaults, $vars);
+
+ if ($subtype) {
+ $options['subtype'] = $subtype;
+ }
+
+ return elgg_list_entities_from_relationship($options);
+ }
+
+ /**
+ * Gets the user's groups
+ *
+ * @param string $subtype Optionally, the subtype of user to filter to (leave blank for all)
+ * @param int $limit The number of groups to retrieve
+ * @param int $offset Indexing offset, if any
+ *
+ * @return array|false Array of ElggGroup, or false, depending on success
+ */
+ function getGroups($subtype = "", $limit = 10, $offset = 0) {
+ $options = array(
+ 'type' => 'group',
+ 'relationship' => 'member',
+ 'relationship_guid' => $this->guid,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ );
+
+ if ($subtype) {
+ $options['subtype'] = $subtype;
+ }
+
+ return elgg_get_entities_from_relationship($options);
+ }
+
+ /**
+ * Lists the user's groups
+ *
+ * @param string $subtype Optionally, the user subtype (leave blank for all)
+ * @param int $limit The number of users to retrieve
+ * @param int $offset Indexing offset, if any
+ *
+ * @return string
+ */
+ function listGroups($subtype = "", $limit = 10, $offset = 0) {
+ $options = array(
+ 'type' => 'group',
+ 'relationship' => 'member',
+ 'relationship_guid' => $this->guid,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'full_view' => false,
+ );
+
+ if ($subtype) {
+ $options['subtype'] = $subtype;
+ }
+
+ return elgg_list_entities_from_relationship($options);
+ }
+
+ /**
+ * Get an array of ElggObject owned by this user.
+ *
+ * @param string $subtype The subtype of the objects, if any
+ * @param int $limit Number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return array|false
+ */
+ public function getObjects($subtype = "", $limit = 10, $offset = 0) {
+ $params = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'owner_guid' => $this->getGUID(),
+ 'limit' => $limit,
+ 'offset' => $offset
+ );
+ return elgg_get_entities($params);
+ }
+
+ /**
+ * Get an array of ElggObjects owned by this user's friends.
+ *
+ * @param string $subtype The subtype of the objects, if any
+ * @param int $limit Number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return array|false
+ */
+ public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0) {
+ return get_user_friends_objects($this->getGUID(), $subtype, $limit, $offset);
+ }
+
+ /**
+ * Counts the number of ElggObjects owned by this user
+ *
+ * @param string $subtype The subtypes of the objects, if any
+ *
+ * @return int The number of ElggObjects
+ */
+ public function countObjects($subtype = "") {
+ return count_user_objects($this->getGUID(), $subtype);
+ }
+
+ /**
+ * Get the collections associated with a user.
+ *
+ * @param string $subtype Optionally, the subtype of result we want to limit to
+ * @param int $limit The number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return array|false
+ */
+ public function getCollections($subtype = "", $limit = 10, $offset = 0) {
+ elgg_deprecated_notice("ElggUser::getCollections() has been deprecated", 1.8);
+ return false;
+ }
+
+ /**
+ * Get a user's owner GUID
+ *
+ * Returns it's own GUID if the user is not owned.
+ *
+ * @return int
+ */
+ function getOwnerGUID() {
+ if ($this->owner_guid == 0) {
+ return $this->guid;
+ }
+
+ return $this->owner_guid;
+ }
+
+ /**
+ * If a user's owner is blank, return its own GUID as the owner
+ *
+ * @return int User GUID
+ * @deprecated 1.8 Use getOwnerGUID()
+ */
+ function getOwner() {
+ elgg_deprecated_notice("ElggUser::getOwner deprecated for ElggUser::getOwnerGUID", 1.8);
+ $this->getOwnerGUID();
+ }
+
+ // EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
+
+ /**
+ * Return an array of fields which can be exported.
+ *
+ * @return array
+ */
+ public function getExportableValues() {
+ return array_merge(parent::getExportableValues(), array(
+ 'name',
+ 'username',
+ 'language',
+ ));
+ }
+
+ /**
+ * Need to catch attempts to make a user an admin. Remove for 1.9
+ *
+ * @param string $name Name
+ * @param mixed $value Value
+ *
+ * @return bool
+ */
+ public function __set($name, $value) {
+ if ($name == 'admin' || $name == 'siteadmin') {
+ elgg_deprecated_notice('The admin/siteadmin metadata are not longer used. Use ElggUser->makeAdmin() and ElggUser->removeAdmin().', 1.7);
+
+ if ($value == 'yes' || $value == '1') {
+ $this->makeAdmin();
+ } else {
+ $this->removeAdmin();
+ }
+ }
+ return parent::__set($name, $value);
+ }
+
+ /**
+ * Need to catch attempts to test user for admin. Remove for 1.9
+ *
+ * @param string $name Name
+ *
+ * @return bool
+ */
+ public function __get($name) {
+ if ($name == 'admin' || $name == 'siteadmin') {
+ elgg_deprecated_notice('The admin/siteadmin metadata are not longer used. Use ElggUser->isAdmin().', 1.7);
+ return $this->isAdmin();
+ }
+
+ return parent::__get($name);
+ }
+
+ /**
+ * Can a user comment on this user?
+ *
+ * @see ElggEntity::canComment()
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @return bool
+ * @since 1.8.0
+ */
+ public function canComment($user_guid = 0) {
+ $result = parent::canComment($user_guid);
+ if ($result !== null) {
+ return $result;
+ }
+ return false;
+ }
+}
diff --git a/engine/classes/ElggVolatileMetadataCache.php b/engine/classes/ElggVolatileMetadataCache.php
new file mode 100644
index 000000000..4acda7cee
--- /dev/null
+++ b/engine/classes/ElggVolatileMetadataCache.php
@@ -0,0 +1,355 @@
+<?php
+/**
+ * ElggVolatileMetadataCache
+ * In memory cache of known metadata values stored by entity.
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ *
+ * @access private
+ */
+class ElggVolatileMetadataCache {
+
+ /**
+ * The cached values (or null for known to be empty). If the portion of the cache
+ * is synchronized, missing values are assumed to indicate that values do not
+ * exist in storage, otherwise, we don't know what's there.
+ *
+ * @var array
+ */
+ protected $values = array();
+
+ /**
+ * Does the cache know that it contains all names fetch-able from storage?
+ * The keys are entity GUIDs and either the value exists (true) or it's not set.
+ *
+ * @var array
+ */
+ protected $isSynchronized = array();
+
+ /**
+ * @var null|bool
+ */
+ protected $ignoreAccess = null;
+
+ /**
+ * Cache metadata for an entity
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param array $values The metadata values to cache
+ * @return void
+ */
+ public function saveAll($entity_guid, array $values) {
+ if (!$this->getIgnoreAccess()) {
+ $this->values[$entity_guid] = $values;
+ $this->isSynchronized[$entity_guid] = true;
+ }
+ }
+
+ /**
+ * Get the metadata for an entity
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @return array
+ */
+ public function loadAll($entity_guid) {
+ if (isset($this->values[$entity_guid])) {
+ return $this->values[$entity_guid];
+ } else {
+ return array();
+ }
+ }
+
+ /**
+ * Declare that there may be fetch-able metadata names in storage that this
+ * cache doesn't know about
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @return void
+ */
+ public function markOutOfSync($entity_guid) {
+ unset($this->isSynchronized[$entity_guid]);
+ }
+
+ /**
+ * Have all the metadata for this entity been cached?
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @return bool
+ */
+ public function isSynchronized($entity_guid) {
+ return isset($this->isSynchronized[$entity_guid]);
+ }
+
+ /**
+ * Cache a piece of metadata
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param string $name The metadata name
+ * @param array|int|string|null $value The metadata value. null means it is
+ * known that there is no fetch-able
+ * metadata under this name
+ * @param bool $allow_multiple Can the metadata be an array
+ * @return void
+ */
+ public function save($entity_guid, $name, $value, $allow_multiple = false) {
+ if ($this->getIgnoreAccess()) {
+ // we don't know if what gets saves here will be available to user once
+ // access control returns, hence it's best to forget :/
+ $this->markUnknown($entity_guid, $name);
+ } else {
+ if ($allow_multiple) {
+ if ($this->isKnown($entity_guid, $name)) {
+ $existing = $this->load($entity_guid, $name);
+ if ($existing !== null) {
+ $existing = (array) $existing;
+ $existing[] = $value;
+ $value = $existing;
+ }
+ } else {
+ // we don't know whether there are unknown values, so it's
+ // safest to leave that assumption
+ $this->markUnknown($entity_guid, $name);
+ return;
+ }
+ }
+ $this->values[$entity_guid][$name] = $value;
+ }
+ }
+
+ /**
+ * Warning: You should always call isKnown() beforehand to verify that this
+ * function's return value should be trusted (otherwise a null return value
+ * is ambiguous).
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param string $name The metadata name
+ * @return array|string|int|null null = value does not exist
+ */
+ public function load($entity_guid, $name) {
+ if (isset($this->values[$entity_guid]) && array_key_exists($name, $this->values[$entity_guid])) {
+ return $this->values[$entity_guid][$name];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Forget about this metadata entry. We don't want to try to guess what the
+ * next fetch from storage will return
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param string $name The metadata name
+ * @return void
+ */
+ public function markUnknown($entity_guid, $name) {
+ unset($this->values[$entity_guid][$name]);
+ $this->markOutOfSync($entity_guid);
+ }
+
+ /**
+ * If true, load() will return an accurate value for this name
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param string $name The metadata name
+ * @return bool
+ */
+ public function isKnown($entity_guid, $name) {
+ if (isset($this->isSynchronized[$entity_guid])) {
+ return true;
+ } else {
+ return (isset($this->values[$entity_guid]) && array_key_exists($name, $this->values[$entity_guid]));
+ }
+
+ }
+
+ /**
+ * Declare that metadata under this name is known to be not fetch-able from storage
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param string $name The metadata name
+ * @return array
+ */
+ public function markEmpty($entity_guid, $name) {
+ $this->values[$entity_guid][$name] = null;
+ }
+
+ /**
+ * Forget about all metadata for an entity
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @return void
+ */
+ public function clear($entity_guid) {
+ $this->values[$entity_guid] = array();
+ $this->markOutOfSync($entity_guid);
+ }
+
+ /**
+ * Clear entire cache and mark all entities as out of sync
+ *
+ * @return void
+ */
+ public function flush() {
+ $this->values = array();
+ $this->isSynchronized = array();
+ }
+
+ /**
+ * Use this value instead of calling elgg_get_ignore_access(). By default that
+ * function will be called.
+ *
+ * This setting makes this component a little more loosely-coupled.
+ *
+ * @param bool $ignore Whether to ignore access or not
+ * @return void
+ */
+ public function setIgnoreAccess($ignore) {
+ $this->ignoreAccess = (bool) $ignore;
+ }
+
+ /**
+ * Tell the cache to call elgg_get_ignore_access() to determing access status.
+ *
+ * @return void
+ */
+ public function unsetIgnoreAccess() {
+ $this->ignoreAccess = null;
+ }
+
+ /**
+ * Get the ignore access value
+ *
+ * @return bool
+ */
+ protected function getIgnoreAccess() {
+ if (null === $this->ignoreAccess) {
+ return elgg_get_ignore_access();
+ } else {
+ return $this->ignoreAccess;
+ }
+ }
+
+ /**
+ * Invalidate based on options passed to the global *_metadata functions
+ *
+ * @param string $action Action performed on metadata. "delete", "disable", or "enable"
+ * @param array $options Options passed to elgg_(delete|disable|enable)_metadata
+ * "guid" if given, invalidation will be limited to this entity
+ * "metadata_name" if given, invalidation will be limited to metadata with this name
+ * @return void
+ */
+ public function invalidateByOptions($action, array $options) {
+ // remove as little as possible, optimizing for common cases
+ if (empty($options['guid'])) {
+ // safest to clear everything unless we want to make this even more complex :(
+ $this->flush();
+ } else {
+ if (empty($options['metadata_name'])) {
+ // safest to clear the whole entity
+ $this->clear($options['guid']);
+ } else {
+ switch ($action) {
+ case 'delete':
+ $this->markEmpty($options['guid'], $options['metadata_name']);
+ break;
+ default:
+ $this->markUnknown($options['guid'], $options['metadata_name']);
+ }
+ }
+ }
+ }
+
+ /**
+ * Populate the cache from a set of entities
+ *
+ * @param int|array $guids Array of or single GUIDs
+ * @return void
+ */
+ public function populateFromEntities($guids) {
+ if (empty($guids)) {
+ return;
+ }
+ if (!is_array($guids)) {
+ $guids = array($guids);
+ }
+ $guids = array_unique($guids);
+
+ // could be useful at some point in future
+ //$guids = $this->filterMetadataHeavyEntities($guids);
+
+ $db_prefix = elgg_get_config('dbprefix');
+ $options = array(
+ 'guids' => $guids,
+ 'limit' => 0,
+ 'callback' => false,
+ 'joins' => array(
+ "JOIN {$db_prefix}metastrings v ON n_table.value_id = v.id",
+ "JOIN {$db_prefix}metastrings n ON n_table.name_id = n.id",
+ ),
+ 'selects' => array('n.string AS name', 'v.string AS value'),
+ 'order_by' => 'n_table.entity_guid, n_table.time_created ASC',
+
+ // @todo don't know why this is necessary
+ 'wheres' => array(get_access_sql_suffix('n_table')),
+ );
+ $data = elgg_get_metadata($options);
+
+ // build up metadata for each entity, save when GUID changes (or data ends)
+ $last_guid = null;
+ $metadata = array();
+ $last_row_idx = count($data) - 1;
+ foreach ($data as $i => $row) {
+ $name = $row->name;
+ $value = ($row->value_type === 'text') ? $row->value : (int) $row->value;
+ $guid = $row->entity_guid;
+ if ($guid !== $last_guid) {
+ if ($last_guid) {
+ $this->saveAll($last_guid, $metadata);
+ }
+ $metadata = array();
+ }
+ if (isset($metadata[$name])) {
+ $metadata[$name] = (array) $metadata[$name];
+ $metadata[$name][] = $value;
+ } else {
+ $metadata[$name] = $value;
+ }
+ if (($i == $last_row_idx)) {
+ $this->saveAll($guid, $metadata);
+ }
+ $last_guid = $guid;
+ }
+ }
+
+ /**
+ * Filter out entities whose concatenated metadata values (INTs casted as string)
+ * exceed a threshold in characters. This could be used to avoid overpopulating the
+ * cache if RAM usage becomes an issue.
+ *
+ * @param array $guids GUIDs of entities to examine
+ * @param int $limit Limit in characters of all metadata (with ints casted to strings)
+ * @return array
+ */
+ public function filterMetadataHeavyEntities(array $guids, $limit = 1024000) {
+ $db_prefix = elgg_get_config('dbprefix');
+
+ $options = array(
+ 'guids' => $guids,
+ 'limit' => 0,
+ 'callback' => false,
+ 'joins' => "JOIN {$db_prefix}metastrings v ON n_table.value_id = v.id",
+ 'selects' => array('SUM(LENGTH(v.string)) AS bytes'),
+ 'order_by' => 'n_table.entity_guid, n_table.time_created ASC',
+ 'group_by' => 'n_table.entity_guid',
+ );
+ $data = elgg_get_metadata($options);
+ // don't cache if metadata for entity is over 10MB (or rolled INT)
+ foreach ($data as $row) {
+ if ($row->bytes > $limit || $row->bytes < 0) {
+ array_splice($guids, array_search($row->entity_guid, $guids), 1);
+ }
+ }
+ return $guids;
+ }
+}
diff --git a/engine/classes/ElggWidget.php b/engine/classes/ElggWidget.php
new file mode 100644
index 000000000..66191bf47
--- /dev/null
+++ b/engine/classes/ElggWidget.php
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * ElggWidget
+ *
+ * Stores metadata in private settings rather than as ElggMetadata
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets
+ *
+ * @property-read string $handler internal, do not use
+ * @property-read string $column internal, do not use
+ * @property-read string $order internal, do not use
+ * @property-read string $context internal, do not use
+ */
+class ElggWidget extends ElggObject {
+
+ /**
+ * Set subtype to widget.
+ *
+ * @return void
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['subtype'] = "widget";
+ }
+
+ /**
+ * Override entity get and sets in order to save data to private data store.
+ *
+ * @param string $name Name
+ *
+ * @return mixed
+ */
+ public function get($name) {
+ // See if its in our base attribute
+ if (array_key_exists($name, $this->attributes)) {
+ return $this->attributes[$name];
+ }
+
+ // No, so see if its in the private data store.
+ $meta = $this->getPrivateSetting($name);
+ if ($meta) {
+ return $meta;
+ }
+
+ // Can't find it, so return null
+ return null;
+ }
+
+ /**
+ * Override entity get and sets in order to save data to private data store.
+ *
+ * @param string $name Name
+ * @param string $value Value
+ *
+ * @return bool
+ */
+ public function set($name, $value) {
+ if (array_key_exists($name, $this->attributes)) {
+ // Check that we're not trying to change the guid!
+ if ((array_key_exists('guid', $this->attributes)) && ($name == 'guid')) {
+ return false;
+ }
+
+ $this->attributes[$name] = $value;
+ } else {
+ return $this->setPrivateSetting($name, $value);
+ }
+
+ return true;
+ }
+
+ /**
+ * Set the widget context
+ *
+ * @param string $context The widget context
+ * @return bool
+ * @since 1.8.0
+ */
+ public function setContext($context) {
+ return $this->setPrivateSetting('context', $context);
+ }
+
+ /**
+ * Get the widget context
+ *
+ * @return string
+ * @since 1.8.0
+ */
+ public function getContext() {
+ return $this->getPrivateSetting('context');
+ }
+
+ /**
+ * Get the title of the widget
+ *
+ * @return string
+ * @since 1.8.0
+ */
+ public function getTitle() {
+ $title = $this->title;
+ if (!$title) {
+ global $CONFIG;
+ $title = $CONFIG->widgets->handlers[$this->handler]->name;
+ }
+ return $title;
+ }
+
+ /**
+ * Move the widget
+ *
+ * @param int $column The widget column
+ * @param int $rank Zero-based rank from the top of the column
+ * @return void
+ * @since 1.8.0
+ */
+ public function move($column, $rank) {
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'widget',
+ 'container_guid' => $this->container_guid,
+ 'limit' => false,
+ 'private_setting_name_value_pairs' => array(
+ array('name' => 'context', 'value' => $this->getContext()),
+ array('name' => 'column', 'value' => $column)
+ )
+ );
+ $widgets = elgg_get_entities_from_private_settings($options);
+ if (!$widgets) {
+ $this->column = (int)$column;
+ $this->order = 0;
+ return;
+ }
+
+ usort($widgets, create_function('$a,$b','return (int)$a->order > (int)$b->order;'));
+
+ // remove widgets from inactive plugins
+ $widget_types = elgg_get_widget_types($this->context);
+ $inactive_widgets = array();
+ foreach ($widgets as $index => $widget) {
+ if (!array_key_exists($widget->handler, $widget_types)) {
+ $inactive_widgets[] = $widget;
+ unset($widgets[$index]);
+ }
+ }
+
+ $bottom_rank = count($widgets);
+ if ($column == $this->column) {
+ $bottom_rank--;
+ }
+
+ if ($rank == 0) {
+ // top of the column
+ $this->order = reset($widgets)->order - 10;
+ } elseif ($rank == $bottom_rank) {
+ // bottom of the column of active widgets
+ $this->order = end($widgets)->order + 10;
+ } else {
+ // reorder widgets
+
+ // remove the widget that's being moved from the array
+ foreach ($widgets as $index => $widget) {
+ if ($widget->guid == $this->guid) {
+ unset($widgets[$index]);
+ }
+ }
+
+ // split the array in two and recombine with the moved widget in middle
+ $before = array_slice($widgets, 0, $rank);
+ array_push($before, $this);
+ $after = array_slice($widgets, $rank);
+ $widgets = array_merge($before, $after);
+ ksort($widgets);
+ $order = 0;
+ foreach ($widgets as $widget) {
+ $widget->order = $order;
+ $order += 10;
+ }
+ }
+
+ // put inactive widgets at the bottom
+ if ($inactive_widgets) {
+ $bottom = 0;
+ foreach ($widgets as $widget) {
+ if ($widget->order > $bottom) {
+ $bottom = $widget->order;
+ }
+ }
+ $bottom += 10;
+ foreach ($inactive_widgets as $widget) {
+ $widget->order = $bottom;
+ $bottom += 10;
+ }
+ }
+
+ $this->column = $column;
+ }
+
+ /**
+ * Saves the widget's settings
+ *
+ * Plugins can override the save mechanism using the plugin hook:
+ * 'widget_settings', <widget handler identifier>. The widget and
+ * the parameters are passed. The plugin hook handler should return
+ * true to indicate that it has successfully saved the settings.
+ *
+ * @warning The values in the parameter array cannot be arrays
+ *
+ * @param array $params An array of name => value parameters
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+ public function saveSettings($params) {
+ if (!$this->canEdit()) {
+ return false;
+ }
+
+ // plugin hook handlers should return true to indicate the settings have
+ // been saved so that default code does not run
+ $hook_params = array(
+ 'widget' => $this,
+ 'params' => $params
+ );
+ if (elgg_trigger_plugin_hook('widget_settings', $this->handler, $hook_params, false) == true) {
+ return true;
+ }
+
+ if (is_array($params) && count($params) > 0) {
+ foreach ($params as $name => $value) {
+ if (is_array($value)) {
+ // private settings cannot handle arrays
+ return false;
+ } else {
+ $this->$name = $value;
+ }
+ }
+ $this->save();
+ }
+
+ return true;
+ }
+}
diff --git a/engine/classes/ElggXMLElement.php b/engine/classes/ElggXMLElement.php
new file mode 100644
index 000000000..cbd3fc5ce
--- /dev/null
+++ b/engine/classes/ElggXMLElement.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * A parser for XML that uses SimpleXMLElement
+ *
+ * @package Elgg.Core
+ * @subpackage XML
+ */
+class ElggXMLElement {
+ /**
+ * @var SimpleXMLElement
+ */
+ private $_element;
+
+ /**
+ * Creates an ElggXMLParser from a string or existing SimpleXMLElement
+ *
+ * @param string|SimpleXMLElement $xml The XML to parse
+ */
+ public function __construct($xml) {
+ if ($xml instanceof SimpleXMLElement) {
+ $this->_element = $xml;
+ } else {
+ // do not load entities
+ $disable_load_entities = libxml_disable_entity_loader(true);
+
+ $this->_element = new SimpleXMLElement($xml);
+
+ libxml_disable_entity_loader($disable_load_entities);
+ }
+ }
+
+ /**
+ * @return string The name of the element
+ */
+ public function getName() {
+ return $this->_element->getName();
+ }
+
+ /**
+ * @return string[] The attributes
+ */
+ public function getAttributes() {
+ //include namespace declarations as attributes
+ $xmlnsRaw = $this->_element->getNamespaces();
+ $xmlns = array();
+ foreach ($xmlnsRaw as $key => $val) {
+ $label = 'xmlns' . ($key ? ":$key" : $key);
+ $xmlns[$label] = $val;
+ }
+ //get attributes and merge with namespaces
+ $attrRaw = $this->_element->attributes();
+ $attr = array();
+ foreach ($attrRaw as $key => $val) {
+ $attr[$key] = $val;
+ }
+ $attr = array_merge((array) $xmlns, (array) $attr);
+ $result = array();
+ foreach ($attr as $key => $val) {
+ $result[$key] = (string) $val;
+ }
+ return $result;
+ }
+
+ /**
+ * @return string CData
+ */
+ public function getContent() {
+ return (string) $this->_element;
+ }
+
+ /**
+ * @return ElggXMLElement[] Child elements
+ */
+ public function getChildren() {
+ $children = $this->_element->children();
+ $result = array();
+ foreach ($children as $val) {
+ $result[] = new ElggXMLElement($val);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Override ->
+ *
+ * @param string $name Property name
+ * @return mixed
+ */
+ function __get($name) {
+ switch ($name) {
+ case 'name':
+ return $this->getName();
+ break;
+ case 'attributes':
+ return $this->getAttributes();
+ break;
+ case 'content':
+ return $this->getContent();
+ break;
+ case 'children':
+ return $this->getChildren();
+ break;
+ }
+ return null;
+ }
+
+ /**
+ * Override isset
+ *
+ * @param string $name Property name
+ * @return boolean
+ */
+ function __isset($name) {
+ switch ($name) {
+ case 'name':
+ return $this->getName() !== null;
+ break;
+ case 'attributes':
+ return $this->getAttributes() !== null;
+ break;
+ case 'content':
+ return $this->getContent() !== null;
+ break;
+ case 'children':
+ return $this->getChildren() !== null;
+ break;
+ }
+ return false;
+ }
+}
diff --git a/engine/classes/ErrorResult.php b/engine/classes/ErrorResult.php
new file mode 100644
index 000000000..afad4c740
--- /dev/null
+++ b/engine/classes/ErrorResult.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * ErrorResult
+ * The error result class.
+ *
+ * @package Elgg.Core
+ * @subpackage WebServicesAPI
+ */
+class ErrorResult extends GenericResult {
+ // Fail with no specific code
+ public static $RESULT_FAIL = -1 ;
+
+ public static $RESULT_FAIL_APIKEY_DISABLED = -30;
+ public static $RESULT_FAIL_APIKEY_INACTIVE = -31;
+ public static $RESULT_FAIL_APIKEY_INVALID = -32;
+
+ // Invalid, expired or missing auth token
+ public static $RESULT_FAIL_AUTHTOKEN = -20;
+
+ /**
+ * A new error result
+ *
+ * @param string $message Message
+ * @param int $code Error Code
+ * @param Exception $exception Exception object
+ *
+ * @return void
+ */
+ public function __construct($message, $code = "", Exception $exception = NULL) {
+ if ($code == "") {
+ $code = ErrorResult::$RESULT_FAIL;
+ }
+
+ if ($exception != NULL) {
+ $this->setResult($exception->__toString());
+ }
+
+ $this->setStatusCode($code, $message);
+ }
+
+ /**
+ * Get a new instance of the ErrorResult.
+ *
+ * @param string $message Message
+ * @param int $code Code
+ * @param Exception $exception Optional exception for generating a stack trace.
+ *
+ * @return ErrorResult
+ */
+ public static function getInstance($message, $code = "", Exception $exception = NULL) {
+ // Return a new error object.
+ return new ErrorResult($message, $code, $exception);
+ }
+}
diff --git a/engine/classes/ExportException.php b/engine/classes/ExportException.php
new file mode 100644
index 000000000..ae8a8e41b
--- /dev/null
+++ b/engine/classes/ExportException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Export exception
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ *
+ */
+class ExportException extends DataFormatException {}
diff --git a/engine/classes/Exportable.php b/engine/classes/Exportable.php
new file mode 100644
index 000000000..0c1ea5282
--- /dev/null
+++ b/engine/classes/Exportable.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Define an interface for all ODD exportable objects.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ */
+interface Exportable {
+ /**
+ * This must take the contents of the object and convert it to exportable ODD
+ *
+ * @return object or array of objects.
+ */
+ public function export();
+
+ /**
+ * Return a list of all fields that can be exported.
+ * This should be used as the basis for the values returned by export()
+ *
+ * @return array
+ */
+ public function getExportableValues();
+}
diff --git a/engine/classes/Friendable.php b/engine/classes/Friendable.php
new file mode 100644
index 000000000..c308b4598
--- /dev/null
+++ b/engine/classes/Friendable.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * An interface for objects that behave as elements within a social network that have a profile.
+ *
+ * @package Elgg.Core
+ * @subpackage SocialModel.Friendable
+ */
+interface Friendable {
+ /**
+ * Adds a user as a friend
+ *
+ * @param int $friend_guid The GUID of the user to add
+ *
+ * @return bool
+ */
+ public function addFriend($friend_guid);
+
+ /**
+ * Removes a user as a friend
+ *
+ * @param int $friend_guid The GUID of the user to remove
+ *
+ * @return bool
+ */
+ public function removeFriend($friend_guid);
+
+ /**
+ * Determines whether or not the current user is a friend of this entity
+ *
+ * @return bool
+ */
+ public function isFriend();
+
+ /**
+ * Determines whether or not this entity is friends with a particular entity
+ *
+ * @param int $user_guid The GUID of the entity this entity may or may not be friends with
+ *
+ * @return bool
+ */
+ public function isFriendsWith($user_guid);
+
+ /**
+ * Determines whether or not a foreign entity has made this one a friend
+ *
+ * @param int $user_guid The GUID of the foreign entity
+ *
+ * @return bool
+ */
+ public function isFriendOf($user_guid);
+
+ /**
+ * Returns this entity's friends
+ *
+ * @param string $subtype The subtype of entity to return
+ * @param int $limit The number of entities to return
+ * @param int $offset Indexing offset
+ *
+ * @return array|false
+ */
+ public function getFriends($subtype = "", $limit = 10, $offset = 0);
+
+ /**
+ * Returns entities that have made this entity a friend
+ *
+ * @param string $subtype The subtype of entity to return
+ * @param int $limit The number of entities to return
+ * @param int $offset Indexing offset
+ *
+ * @return array|false
+ */
+ public function getFriendsOf($subtype = "", $limit = 10, $offset = 0);
+
+ /**
+ * Returns objects in this entity's container
+ *
+ * @param string $subtype The subtype of entity to return
+ * @param int $limit The number of entities to return
+ * @param int $offset Indexing offset
+ *
+ * @return array|false
+ */
+ public function getObjects($subtype = "", $limit = 10, $offset = 0);
+
+ /**
+ * Returns objects in the containers of this entity's friends
+ *
+ * @param string $subtype The subtype of entity to return
+ * @param int $limit The number of entities to return
+ * @param int $offset Indexing offset
+ *
+ * @return array|false
+ */
+ public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0);
+
+ /**
+ * Returns the number of object entities in this entity's container
+ *
+ * @param string $subtype The subtype of entity to count
+ *
+ * @return int
+ */
+ public function countObjects($subtype = "");
+}
diff --git a/engine/classes/GenericResult.php b/engine/classes/GenericResult.php
new file mode 100644
index 000000000..e42e924d1
--- /dev/null
+++ b/engine/classes/GenericResult.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * GenericResult Result superclass.
+ *
+ * @package Elgg.Core
+ * @subpackage WebServicesAPI
+ */
+abstract class GenericResult {
+ /**
+ * The status of the result.
+ * @var int
+ */
+ private $status_code;
+
+ /**
+ * Message returned along with the status which is almost always an error message.
+ * This must be human readable, understandable and localised.
+ * @var string
+ */
+ private $message;
+
+ /**
+ * Result store.
+ * Attach result specific informaton here.
+ *
+ * @var mixed. Should probably be an object of some sort.
+ */
+ private $result;
+
+ /**
+ * Set a status code and optional message.
+ *
+ * @param int $status The status code.
+ * @param string $message The message.
+ *
+ * @return void
+ */
+ protected function setStatusCode($status, $message = "") {
+ $this->status_code = $status;
+ $this->message = $message;
+ }
+
+ /**
+ * Set the result.
+ *
+ * @param mixed $result The result
+ *
+ * @return void
+ */
+ protected function setResult($result) {
+ $this->result = $result;
+ }
+
+ /**
+ * Return the current status code
+ *
+ * @return string
+ */
+ protected function getStatusCode() {
+ return $this->status_code;
+ }
+
+ /**
+ * Return the current status message
+ *
+ * @return string
+ */
+ protected function getStatusMessage() {
+ return $this->message;
+ }
+
+ /**
+ * Return the current result
+ *
+ * @return string
+ */
+ protected function getResult() {
+ return $this->result;
+ }
+
+ /**
+ * Serialise to a standard class.
+ *
+ * DEVNOTE: The API is only interested in data, we can not easily serialise
+ * custom classes without the need for 1) the other side being PHP, 2) you need to have the class
+ * definition installed, 3) its the right version!
+ *
+ * Therefore, I'm not bothering.
+ *
+ * Override this to include any more specific information, however api results
+ * should be attached to the class using setResult().
+ *
+ * if $CONFIG->debug is set then additional information about the runtime environment and
+ * authentication will be returned.
+ *
+ * @return stdClass Object containing the serialised result.
+ */
+ public function export() {
+ global $ERRORS, $CONFIG, $_PAM_HANDLERS_MSG;
+
+ $result = new stdClass;
+
+ $result->status = $this->getStatusCode();
+ if ($this->getStatusMessage() != "") {
+ $result->message = $this->getStatusMessage();
+ }
+
+ $resultdata = $this->getResult();
+ if (isset($resultdata)) {
+ $result->result = $resultdata;
+ }
+
+ if (isset($CONFIG->debug)) {
+ if (count($ERRORS)) {
+ $result->runtime_errors = $ERRORS;
+ }
+
+ if (count($_PAM_HANDLERS_MSG)) {
+ $result->pam = $_PAM_HANDLERS_MSG;
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/engine/classes/IOException.php b/engine/classes/IOException.php
new file mode 100644
index 000000000..57403f44c
--- /dev/null
+++ b/engine/classes/IOException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * IOException
+ * An IO Exception, throw when an IO Exception occurs. Subclass for specific IO Exceptions.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class IOException extends Exception {}
diff --git a/engine/classes/ImportException.php b/engine/classes/ImportException.php
new file mode 100644
index 000000000..909c599d5
--- /dev/null
+++ b/engine/classes/ImportException.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Import exception
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class ImportException extends DataFormatException {}
diff --git a/engine/classes/Importable.php b/engine/classes/Importable.php
new file mode 100644
index 000000000..23b2ce2c8
--- /dev/null
+++ b/engine/classes/Importable.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Define an interface for all ODD importable objects.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Importable
+ */
+interface Importable {
+ /**
+ * Accepts an array of data to import, this data is parsed from the XML produced by export.
+ * The function should return the constructed object data, or NULL.
+ *
+ * @param ODD $data Data in ODD format
+ *
+ * @return bool
+ * @throws ImportException if there was a critical error importing data.
+ */
+ public function import(ODD $data);
+}
diff --git a/engine/classes/IncompleteEntityException.php b/engine/classes/IncompleteEntityException.php
new file mode 100644
index 000000000..8c86edcc6
--- /dev/null
+++ b/engine/classes/IncompleteEntityException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * IncompleteEntityException
+ * Thrown when constructing an entity that is missing its secondary entity table
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ * @access private
+ */
+class IncompleteEntityException extends Exception {}
diff --git a/engine/classes/InstallationException.php b/engine/classes/InstallationException.php
new file mode 100644
index 000000000..1dad6c1e5
--- /dev/null
+++ b/engine/classes/InstallationException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * InstallationException
+ * Thrown when there is a major problem with the installation.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class InstallationException extends ConfigurationException {}
diff --git a/engine/classes/InvalidClassException.php b/engine/classes/InvalidClassException.php
new file mode 100644
index 000000000..12f353b9a
--- /dev/null
+++ b/engine/classes/InvalidClassException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * InvalidClassException
+ * An invalid class Exception, throw when a class is invalid.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class InvalidClassException extends ClassException {}
diff --git a/engine/classes/InvalidParameterException.php b/engine/classes/InvalidParameterException.php
new file mode 100644
index 000000000..fbc9bffc9
--- /dev/null
+++ b/engine/classes/InvalidParameterException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * InvalidParameterException
+ * A parameter is invalid.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class InvalidParameterException extends CallException {}
diff --git a/engine/classes/Locatable.php b/engine/classes/Locatable.php
new file mode 100644
index 000000000..7287d9798
--- /dev/null
+++ b/engine/classes/Locatable.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Define an interface for geo-tagging entities.
+ *
+ * @package Elgg.Core
+ * @subpackage SocialModel.Locatable
+ */
+interface Locatable {
+ /**
+ * Set a location text
+ *
+ * @param string $location Textual representation of location
+ *
+ * @return bool
+ */
+ public function setLocation($location);
+
+ /**
+ * Set latitude and longitude tags for a given entity.
+ *
+ * @param float $lat Latitude
+ * @param float $long Longitude
+ *
+ * @return bool
+ */
+ public function setLatLong($lat, $long);
+
+ /**
+ * Get the contents of the ->geo:lat field.
+ *
+ * @return int
+ */
+ public function getLatitude();
+
+ /**
+ * Get the contents of the ->geo:lat field.
+ *
+ * @return int
+ */
+ public function getLongitude();
+
+ /**
+ * Get the ->location metadata.
+ *
+ * @return string
+ */
+ public function getLocation();
+}
diff --git a/engine/classes/Loggable.php b/engine/classes/Loggable.php
new file mode 100644
index 000000000..b9e8bf26b
--- /dev/null
+++ b/engine/classes/Loggable.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Interface that provides an interface which must be implemented by all objects wishing to be
+ * recorded in the system log (and by extension the river).
+ *
+ * This interface defines a set of methods that permit the system log functions to
+ * hook in and retrieve the necessary information and to identify what events can
+ * actually be logged.
+ *
+ * To have events involving your object to be logged simply implement this interface.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Loggable
+ */
+interface Loggable {
+ /**
+ * Return an identification for the object for storage in the system log.
+ * This id must be an integer.
+ *
+ * @return int
+ */
+ public function getSystemLogID();
+
+ /**
+ * Return the class name of the object.
+ * Added as a function because get_class causes errors for some reason.
+ *
+ * @return string
+ */
+ public function getClassName();
+
+ /**
+ * Return the type of the object - eg. object, group, user, relationship, metadata, annotation etc
+ *
+ * @return string
+ */
+ public function getType();
+
+ /**
+ * Return a subtype. For metadata & annotations this is the 'name' and for relationship this is the
+ * relationship type.
+ *
+ * @return string
+ */
+ public function getSubtype();
+
+ /**
+ * For a given ID, return the object associated with it.
+ * This is used by the river functionality primarily.
+ * This is useful for checking access permissions etc on objects.
+ *
+ * @param int $id GUID of an entity
+ *
+ * @return ElggEntity
+ */
+ public function getObjectFromID($id);
+
+ /**
+ * Return the GUID of the owner of this object.
+ *
+ * @return int
+ * @deprecated 1.8 Use getOwnerGUID() instead
+ */
+ public function getObjectOwnerGUID();
+}
diff --git a/engine/classes/LoginException.php b/engine/classes/LoginException.php
new file mode 100644
index 000000000..7546fa36f
--- /dev/null
+++ b/engine/classes/LoginException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Login Exception Stub
+ *
+ * Generic parent class for login exceptions.
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions.Stub
+ */
+class LoginException extends Exception {}
diff --git a/engine/classes/NotImplementedException.php b/engine/classes/NotImplementedException.php
new file mode 100644
index 000000000..d1decf75c
--- /dev/null
+++ b/engine/classes/NotImplementedException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * NotImplementedException
+ * Thrown when a method or function has not been implemented, primarily used
+ * in development... you should not see these!
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class NotImplementedException extends CallException {}
diff --git a/engine/classes/Notable.php b/engine/classes/Notable.php
new file mode 100644
index 000000000..0c21af27d
--- /dev/null
+++ b/engine/classes/Notable.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Calendar interface for events.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Notable
+ *
+ * @todo Implement or remove.
+ */
+interface Notable {
+ /**
+ * Calendar functionality.
+ * This function sets the time of an object on a calendar listing.
+ *
+ * @param int $hour If ommitted, now is assumed.
+ * @param int $minute If ommitted, now is assumed.
+ * @param int $second If ommitted, now is assumed.
+ * @param int $day If ommitted, now is assumed.
+ * @param int $month If ommitted, now is assumed.
+ * @param int $year If ommitted, now is assumed.
+ * @param int $duration Duration of event, remainder of the day is assumed.
+ *
+ * @return bool
+ */
+ public function setCalendarTimeAndDuration($hour = NULL, $minute = NULL, $second = NULL,
+ $day = NULL, $month = NULL, $year = NULL, $duration = NULL);
+
+ /**
+ * Return the start timestamp.
+ *
+ * @return int
+ */
+ public function getCalendarStartTime();
+
+ /**
+ * Return the end timestamp.
+ *
+ * @return int
+ */
+ public function getCalendarEndTime();
+}
diff --git a/engine/classes/NotificationException.php b/engine/classes/NotificationException.php
new file mode 100644
index 000000000..71c742f17
--- /dev/null
+++ b/engine/classes/NotificationException.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Notification exception.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class NotificationException extends Exception {}
diff --git a/engine/classes/ODD.php b/engine/classes/ODD.php
new file mode 100644
index 000000000..fa5b616fc
--- /dev/null
+++ b/engine/classes/ODD.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Open Data Definition (ODD) superclass.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ */
+abstract class ODD {
+ /**
+ * Attributes.
+ */
+ private $attributes = array();
+
+ /**
+ * Optional body.
+ */
+ private $body;
+
+ /**
+ * Construct an ODD document with initial values.
+ */
+ public function __construct() {
+ $this->body = "";
+ }
+
+ /**
+ * Returns an array of attributes
+ *
+ * @return array
+ */
+ public function getAttributes() {
+ return $this->attributes;
+ }
+
+ /**
+ * Sets an attribute
+ *
+ * @param string $key Name
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ public function setAttribute($key, $value) {
+ $this->attributes[$key] = $value;
+ }
+
+ /**
+ * Returns an attribute
+ *
+ * @param string $key Name
+ *
+ * @return mixed
+ */
+ public function getAttribute($key) {
+ if (isset($this->attributes[$key])) {
+ return $this->attributes[$key];
+ }
+
+ return NULL;
+ }
+
+ /**
+ * Sets the body of the ODD.
+ *
+ * @param mixed $value Value
+ *
+ * @return void
+ */
+ public function setBody($value) {
+ $this->body = $value;
+ }
+
+ /**
+ * Gets the body of the ODD.
+ *
+ * @return mixed
+ */
+ public function getBody() {
+ return $this->body;
+ }
+
+ /**
+ * Set the published time.
+ *
+ * @param int $time Unix timestamp
+ *
+ * @return void
+ */
+ public function setPublished($time) {
+ $this->attributes['published'] = date("r", $time);
+ }
+
+ /**
+ * Return the published time as a unix timestamp.
+ *
+ * @return int or false on failure.
+ */
+ public function getPublishedAsTime() {
+ return strtotime($this->attributes['published']);
+ }
+
+ /**
+ * For serialisation, implement to return a string name of the tag eg "header" or "metadata".
+ *
+ * @return string
+ */
+ abstract protected function getTagName();
+
+ /**
+ * Magic function to generate valid ODD XML for this item.
+ *
+ * @return string
+ */
+ public function __toString() {
+ // Construct attributes
+ $attr = "";
+ foreach ($this->attributes as $k => $v) {
+ $attr .= ($v != "") ? "$k=\"$v\" " : "";
+ }
+
+ $body = $this->getBody();
+ $tag = $this->getTagName();
+
+ $end = "/>";
+ if ($body != "") {
+ $end = "><![CDATA[$body]]></{$tag}>";
+ }
+
+ return "<{$tag} $attr" . $end . "\n";
+ }
+}
diff --git a/engine/classes/ODDDocument.php b/engine/classes/ODDDocument.php
new file mode 100644
index 000000000..540c35a3b
--- /dev/null
+++ b/engine/classes/ODDDocument.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * This class is used during import and export to construct.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ */
+class ODDDocument implements Iterator {
+ /**
+ * ODD Version
+ *
+ * @var string
+ */
+ private $ODDSupportedVersion = "1.0";
+
+ /**
+ * Elements of the document.
+ */
+ private $elements;
+
+ /**
+ * Optional wrapper factory.
+ */
+ private $wrapperfactory;
+
+ /**
+ * Create a new ODD Document.
+ *
+ * @param array $elements Elements to add
+ *
+ * @return void
+ */
+ public function __construct(array $elements = NULL) {
+ if ($elements) {
+ if (is_array($elements)) {
+ $this->elements = $elements;
+ } else {
+ $this->addElement($elements);
+ }
+ } else {
+ $this->elements = array();
+ }
+ }
+
+ /**
+ * Return the version of ODD being used.
+ *
+ * @return string
+ */
+ public function getVersion() {
+ return $this->ODDSupportedVersion;
+ }
+
+ /**
+ * Returns the number of elements
+ *
+ * @return int
+ */
+ public function getNumElements() {
+ return count($this->elements);
+ }
+
+ /**
+ * Add an element
+ *
+ * @param ODD $element An ODD element
+ *
+ * @return void
+ */
+ public function addElement(ODD $element) {
+ if (!is_array($this->elements)) {
+ $this->elements = array();
+ }
+ $this->elements[] = $element;
+ }
+
+ /**
+ * Add multiple elements at once
+ *
+ * @param array $elements Array of ODD elements
+ *
+ * @return void
+ */
+ public function addElements(array $elements) {
+ foreach ($elements as $element) {
+ $this->addElement($element);
+ }
+ }
+
+ /**
+ * Return all elements
+ *
+ * @return array
+ */
+ public function getElements() {
+ return $this->elements;
+ }
+
+ /**
+ * Set an optional wrapper factory to optionally embed the ODD document in another format.
+ *
+ * @param ODDWrapperFactory $factory The factory
+ *
+ * @return void
+ */
+ public function setWrapperFactory(ODDWrapperFactory $factory) {
+ $this->wrapperfactory = $factory;
+ }
+
+ /**
+ * Magic function to generate valid ODD XML for this item.
+ *
+ * @return string
+ */
+ public function __toString() {
+ $xml = "";
+
+ if ($this->wrapperfactory) {
+ // A wrapper has been provided
+ $wrapper = $this->wrapperfactory->getElementWrapper($this); // Get the wrapper for this element
+
+ $xml = $wrapper->wrap($this); // Wrap this element (and subelements)
+ } else {
+ // Output begin tag
+ $generated = date("r");
+ $xml .= "<odd version=\"{$this->ODDSupportedVersion}\" generated=\"$generated\">\n";
+
+ // Get XML for elements
+ foreach ($this->elements as $element) {
+ $xml .= "$element";
+ }
+
+ // Output end tag
+ $xml .= "</odd>\n";
+ }
+
+ return $xml;
+ }
+
+ // ITERATOR INTERFACE //////////////////////////////////////////////////////////////
+ /*
+ * This lets an entity's attributes be displayed using foreach as a normal array.
+ * Example: http://www.sitepoint.com/print/php5-standard-library
+ */
+
+ private $valid = FALSE;
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::rewind()
+ *
+ * @return void
+ */
+ function rewind() {
+ $this->valid = (FALSE !== reset($this->elements));
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::current()
+ *
+ * @return void
+ */
+ function current() {
+ return current($this->elements);
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::key()
+ *
+ * @return void
+ */
+ function key() {
+ return key($this->elements);
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::next()
+ *
+ * @return void
+ */
+ function next() {
+ $this->valid = (FALSE !== next($this->elements));
+ }
+
+ /**
+ * Iterator interface
+ *
+ * @see Iterator::valid()
+ *
+ * @return void
+ */
+ function valid() {
+ return $this->valid;
+ }
+}
diff --git a/engine/classes/ODDEntity.php b/engine/classes/ODDEntity.php
new file mode 100644
index 000000000..e9bb5da6a
--- /dev/null
+++ b/engine/classes/ODDEntity.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * ODD Entity class.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ */
+class ODDEntity extends ODD {
+
+ /**
+ * New ODD Entity
+ *
+ * @param string $uuid A universally unique ID
+ * @param string $class Class
+ * @param string $subclass Subclass
+ */
+ function __construct($uuid, $class, $subclass = "") {
+ parent::__construct();
+
+ $this->setAttribute('uuid', $uuid);
+ $this->setAttribute('class', $class);
+ $this->setAttribute('subclass', $subclass);
+ }
+
+ /**
+ * Returns entity.
+ *
+ * @return 'entity'
+ */
+ protected function getTagName() {
+ return "entity";
+ }
+}
diff --git a/engine/classes/ODDMetaData.php b/engine/classes/ODDMetaData.php
new file mode 100644
index 000000000..09b653582
--- /dev/null
+++ b/engine/classes/ODDMetaData.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * ODD Metadata class.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ */
+class ODDMetaData extends ODD {
+
+ /**
+ * New ODD metadata
+ *
+ * @param string $uuid Unique ID
+ * @param string $entity_uuid Another unique ID
+ * @param string $name Name
+ * @param string $value Value
+ * @param string $type Type
+ * @param string $owner_uuid Owner ID
+ */
+ function __construct($uuid, $entity_uuid, $name, $value, $type = "", $owner_uuid = "") {
+ parent::__construct();
+
+ $this->setAttribute('uuid', $uuid);
+ $this->setAttribute('entity_uuid', $entity_uuid);
+ $this->setAttribute('name', $name);
+ $this->setAttribute('type', $type);
+ $this->setAttribute('owner_uuid', $owner_uuid);
+ $this->setBody($value);
+ }
+
+ /**
+ * Returns 'metadata'
+ *
+ * @return string 'metadata'
+ */
+ protected function getTagName() {
+ return "metadata";
+ }
+}
diff --git a/engine/classes/ODDRelationship.php b/engine/classes/ODDRelationship.php
new file mode 100644
index 000000000..8b1fe217b
--- /dev/null
+++ b/engine/classes/ODDRelationship.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * ODD Relationship class.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+class ODDRelationship extends ODD {
+
+ /**
+ * New ODD Relationship
+ *
+ * @param string $uuid1 First UUID
+ * @param string $type Type of telationship
+ * @param string $uuid2 Second UUId
+ */
+ function __construct($uuid1, $type, $uuid2) {
+ parent::__construct();
+
+ $this->setAttribute('uuid1', $uuid1);
+ $this->setAttribute('type', $type);
+ $this->setAttribute('uuid2', $uuid2);
+ }
+
+ /**
+ * Returns 'relationship'
+ *
+ * @return string 'relationship'
+ */
+ protected function getTagName() {
+ return "relationship";
+ }
+}
diff --git a/engine/classes/PluginException.php b/engine/classes/PluginException.php
new file mode 100644
index 000000000..a74303695
--- /dev/null
+++ b/engine/classes/PluginException.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * PluginException
+ *
+ * A plugin Exception, thrown when an Exception occurs relating to the plugin mechanism.
+ * Subclass for specific plugin Exceptions.
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class PluginException extends Exception {}
diff --git a/engine/classes/RegistrationException.php b/engine/classes/RegistrationException.php
new file mode 100644
index 000000000..5246efc25
--- /dev/null
+++ b/engine/classes/RegistrationException.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * RegistrationException
+ * Could not register a new user for whatever reason.
+ *
+ * @package Elgg.Core
+ * @subpackage Exceptions
+ */
+class RegistrationException extends InstallationException {}
diff --git a/engine/classes/SecurityException.php b/engine/classes/SecurityException.php
new file mode 100644
index 000000000..3b6382f9e
--- /dev/null
+++ b/engine/classes/SecurityException.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * SecurityException
+ * An Security Exception, throw when a Security Exception occurs. Subclass for
+ * specific Security Execeptions (access problems etc)
+ *
+ * @package Elgg.Core
+ * @subpackage Exception
+ */
+class SecurityException extends Exception {}
diff --git a/engine/classes/SuccessResult.php b/engine/classes/SuccessResult.php
new file mode 100644
index 000000000..ab5468ad8
--- /dev/null
+++ b/engine/classes/SuccessResult.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * SuccessResult
+ * Generic success result class, extend if you want to do something special.
+ *
+ * @package Elgg.Core
+ * @subpackage WebServicesAPI
+ */
+class SuccessResult extends GenericResult {
+ // Do not change this from 0
+ public static $RESULT_SUCCESS = 0;
+
+ /**
+ * A new success result
+ *
+ * @param string $result The result
+ */
+ public function __construct($result) {
+ $this->setResult($result);
+ $this->setStatusCode(SuccessResult::$RESULT_SUCCESS);
+ }
+
+ /**
+ * Returns a new instance of this class
+ *
+ * @param unknown $result A result of some kind?
+ *
+ * @return SuccessResult
+ */
+ public static function getInstance($result) {
+ // Return a new error object.
+ return new SuccessResult($result);
+ }
+}
diff --git a/engine/classes/XMLRPCArrayParameter.php b/engine/classes/XMLRPCArrayParameter.php
new file mode 100644
index 000000000..a8edccba7
--- /dev/null
+++ b/engine/classes/XMLRPCArrayParameter.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * An array containing other XMLRPCParameter objects.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ *
+ */
+class XMLRPCArrayParameter extends XMLRPCParameter
+{
+ /**
+ * Construct an array.
+ *
+ * @param array $parameters Optional array of parameters, if not provided
+ * then addField must be used.
+ */
+ function __construct($parameters = NULL) {
+ parent::__construct();
+
+ if (is_array($parameters)) {
+ foreach ($parameters as $v) {
+ $this->addField($v);
+ }
+ }
+ }
+
+ /**
+ * Add a field to the container.
+ *
+ * @param XMLRPCParameter $value The value.
+ *
+ * @return void
+ */
+ public function addField(XMLRPCParameter $value) {
+ if (!is_array($this->value)) {
+ $this->value = array();
+ }
+
+ $this->value[] = $value;
+ }
+
+ /**
+ * Converts XML array to string
+ *
+ * @return string
+ */
+ function __toString() {
+ $params = "";
+ foreach ($this->value as $value) {
+ $params .= "$value";
+ }
+
+ return "<array><data>$params</data></array>";
+ }
+}
diff --git a/engine/classes/XMLRPCBase64Parameter.php b/engine/classes/XMLRPCBase64Parameter.php
new file mode 100644
index 000000000..7db0a761c
--- /dev/null
+++ b/engine/classes/XMLRPCBase64Parameter.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * A base 64 encoded blob of binary.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCBase64Parameter extends XMLRPCParameter {
+ /**
+ * Construct a base64 encoded block
+ *
+ * @param string $blob Unencoded binary blob
+ */
+ function __construct($blob) {
+ parent::__construct();
+
+ $this->value = base64_encode($blob);
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ return "<value><base64>{$value}</base64></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCBoolParameter.php b/engine/classes/XMLRPCBoolParameter.php
new file mode 100644
index 000000000..607841cb8
--- /dev/null
+++ b/engine/classes/XMLRPCBoolParameter.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * A boolean.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCBoolParameter extends XMLRPCParameter {
+
+ /**
+ * New bool parameter
+ *
+ * @param bool $value Value
+ */
+ function __construct($value) {
+ parent::__construct();
+
+ $this->value = (bool)$value;
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ $code = ($this->value) ? "1" : "0";
+ return "<value><boolean>{$code}</boolean></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCCall.php b/engine/classes/XMLRPCCall.php
new file mode 100644
index 000000000..fd28f1e3e
--- /dev/null
+++ b/engine/classes/XMLRPCCall.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * An XMLRPC call
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCCall {
+ /** Method name */
+ private $methodname;
+
+ /** Parameters */
+ private $params;
+
+ /**
+ * Construct a new XML RPC Call
+ *
+ * @param string $xml XML
+ */
+ function __construct($xml) {
+ $this->parse($xml);
+ }
+
+ /**
+ * Return the method name associated with the call.
+ *
+ * @return string
+ */
+ public function getMethodName() { return $this->methodname; }
+
+ /**
+ * Return the parameters.
+ * Returns a nested array of XmlElement.
+ *
+ * @see XmlElement
+ * @return array
+ */
+ public function getParameters() { return $this->params; }
+
+ /**
+ * Parse the xml into its components according to spec.
+ * This first version is a little primitive.
+ *
+ * @param string $xml XML
+ *
+ * @return void
+ */
+ private function parse($xml) {
+ $xml = xml_to_object($xml);
+
+ // sanity check
+ if ((isset($xml->name)) && (strcasecmp($xml->name, "methodCall") != 0)) {
+ throw new CallException(elgg_echo('CallException:NotRPCCall'));
+ }
+
+ // method name
+ $this->methodname = $xml->children[0]->content;
+
+ // parameters
+ $this->params = $xml->children[1]->children;
+ }
+}
diff --git a/engine/classes/XMLRPCDateParameter.php b/engine/classes/XMLRPCDateParameter.php
new file mode 100644
index 000000000..93bbbd8f5
--- /dev/null
+++ b/engine/classes/XMLRPCDateParameter.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * An ISO8601 data and time.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCDateParameter extends XMLRPCParameter {
+ /**
+ * Construct a date
+ *
+ * @param int $timestamp The unix timestamp, or blank for "now".
+ */
+ function __construct($timestamp = 0) {
+ parent::__construct();
+
+ $this->value = $timestamp;
+
+ if (!$timestamp) {
+ $this->value = time();
+ }
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ $value = date('c', $this->value);
+ return "<value><dateTime.iso8601>{$value}</dateTime.iso8601></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCDoubleParameter.php b/engine/classes/XMLRPCDoubleParameter.php
new file mode 100644
index 000000000..b7834650e
--- /dev/null
+++ b/engine/classes/XMLRPCDoubleParameter.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * A double precision signed floating point number.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCDoubleParameter extends XMLRPCParameter {
+
+ /**
+ * New XML Double
+ *
+ * @param int $value Value
+ */
+ function __construct($value) {
+ parent::__construct();
+
+ $this->value = (float)$value;
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ return "<value><double>{$this->value}</double></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCErrorResponse.php b/engine/classes/XMLRPCErrorResponse.php
new file mode 100644
index 000000000..425c075cc
--- /dev/null
+++ b/engine/classes/XMLRPCErrorResponse.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * XMLRPC Error Response
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCErrorResponse extends XMLRPCResponse {
+ /**
+ * Set the error response and error code.
+ *
+ * @param string $message The message
+ * @param int $code Error code (default = system error as defined by
+ * http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php)
+ */
+ function __construct($message, $code = -32400) {
+ $this->addParameter(
+ new XMLRPCStructParameter(
+ array (
+ 'faultCode' => new XMLRPCIntParameter($code),
+ 'faultString' => new XMLRPCStringParameter($message)
+ )
+ )
+ );
+ }
+
+ /**
+ * Output to XML.
+ *
+ * @return string
+ */
+ public function __toString() {
+ return "<methodResponse><fault><value>{$this->parameters[0]}</value></fault></methodResponse>";
+ }
+}
diff --git a/engine/classes/XMLRPCIntParameter.php b/engine/classes/XMLRPCIntParameter.php
new file mode 100644
index 000000000..0fc146165
--- /dev/null
+++ b/engine/classes/XMLRPCIntParameter.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * An Integer.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCIntParameter extends XMLRPCParameter {
+
+ /**
+ * A new XML int
+ *
+ * @param int $value Value
+ */
+ function __construct($value) {
+ parent::__construct();
+
+ $this->value = (int)$value;
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ return "<value><i4>{$this->value}</i4></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCParameter.php b/engine/classes/XMLRPCParameter.php
new file mode 100644
index 000000000..ffbad8082
--- /dev/null
+++ b/engine/classes/XMLRPCParameter.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Superclass for all RPC parameters.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+abstract class XMLRPCParameter {
+ protected $value;
+
+ /**
+ * Set initial values
+ */
+ function __construct() { }
+
+}
diff --git a/engine/classes/XMLRPCResponse.php b/engine/classes/XMLRPCResponse.php
new file mode 100644
index 000000000..a6256d385
--- /dev/null
+++ b/engine/classes/XMLRPCResponse.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * XML-RPC Response.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+abstract class XMLRPCResponse {
+ /** An array of parameters */
+ protected $parameters = array();
+
+ /**
+ * Add a parameter here.
+ *
+ * @param XMLRPCParameter $param The parameter.
+ *
+ * @return void
+ */
+ public function addParameter(XMLRPCParameter $param) {
+ if (!is_array($this->parameters)) {
+ $this->parameters = array();
+ }
+
+ $this->parameters[] = $param;
+ }
+
+ /**
+ * Add an integer
+ *
+ * @param int $value Value
+ *
+ * @return void
+ */
+ public function addInt($value) {
+ $this->addParameter(new XMLRPCIntParameter($value));
+ }
+
+ /**
+ * Add a string
+ *
+ * @param string $value Value
+ *
+ * @return void
+ */
+ public function addString($value) {
+ $this->addParameter(new XMLRPCStringParameter($value));
+ }
+
+ /**
+ * Add a double
+ *
+ * @param int $value Value
+ *
+ * @return void
+ */
+ public function addDouble($value) {
+ $this->addParameter(new XMLRPCDoubleParameter($value));
+ }
+
+ /**
+ * Add a boolean
+ *
+ * @param bool $value Value
+ *
+ * @return void
+ */
+ public function addBoolean($value) {
+ $this->addParameter(new XMLRPCBoolParameter($value));
+ }
+}
diff --git a/engine/classes/XMLRPCStringParameter.php b/engine/classes/XMLRPCStringParameter.php
new file mode 100644
index 000000000..35b28214b
--- /dev/null
+++ b/engine/classes/XMLRPCStringParameter.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * A string.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCStringParameter extends XMLRPCParameter {
+
+ /**
+ * A new XML string
+ *
+ * @param string $value Value
+ */
+ function __construct($value) {
+ parent::__construct();
+
+ $this->value = $value;
+ }
+
+ /**
+ * Convert to XML string
+ *
+ * @return string
+ */
+ function __toString() {
+ $value = htmlentities($this->value);
+ return "<value><string>{$value}</string></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCStructParameter.php b/engine/classes/XMLRPCStructParameter.php
new file mode 100644
index 000000000..694ddf5df
--- /dev/null
+++ b/engine/classes/XMLRPCStructParameter.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * A structure containing other XMLRPCParameter objects.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCStructParameter extends XMLRPCParameter {
+ /**
+ * Construct a struct.
+ *
+ * @param array $parameters Optional associated array of parameters, if
+ * not provided then addField must be used.
+ */
+ function __construct($parameters = NULL) {
+ parent::__construct();
+
+ if (is_array($parameters)) {
+ foreach ($parameters as $k => $v) {
+ $this->addField($k, $v);
+ }
+ }
+ }
+
+ /**
+ * Add a field to the container.
+ *
+ * @param string $name The name of the field.
+ * @param XMLRPCParameter $value The value.
+ *
+ * @return void
+ */
+ public function addField($name, XMLRPCParameter $value) {
+ if (!is_array($this->value)) {
+ $this->value = array();
+ }
+
+ $this->value[$name] = $value;
+ }
+
+ /**
+ * Convert to string
+ *
+ * @return string
+ */
+ function __toString() {
+ $params = "";
+ foreach ($this->value as $k => $v) {
+ $params .= "<member><name>$k</name>$v</member>";
+ }
+
+ return "<value><struct>$params</struct></value>";
+ }
+}
diff --git a/engine/classes/XMLRPCSuccessResponse.php b/engine/classes/XMLRPCSuccessResponse.php
new file mode 100644
index 000000000..e02e82c5c
--- /dev/null
+++ b/engine/classes/XMLRPCSuccessResponse.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Success Response
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+class XMLRPCSuccessResponse extends XMLRPCResponse {
+ /**
+ * Output to XML.
+ *
+ * @return string
+ */
+ public function __toString() {
+ $params = "";
+ foreach ($this->parameters as $param) {
+ $params .= "<param>$param</param>\n";
+ }
+
+ return "<methodResponse><params>$params</params></methodResponse>";
+ }
+}
diff --git a/engine/classes/XmlElement.php b/engine/classes/XmlElement.php
new file mode 100644
index 000000000..280bba664
--- /dev/null
+++ b/engine/classes/XmlElement.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * A class representing an XML element for import.
+ *
+ * @package Elgg.Core
+ * @subpackage XML
+ */
+class XmlElement {
+ /** The name of the element */
+ public $name;
+
+ /** The attributes */
+ public $attributes;
+
+ /** CData */
+ public $content;
+
+ /** Child elements */
+ public $children;
+};
diff --git a/engine/handlers/action_handler.php b/engine/handlers/action_handler.php
new file mode 100644
index 000000000..bcad110b2
--- /dev/null
+++ b/engine/handlers/action_handler.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Action handler.
+ *
+ * This file dispatches actions. It is called via a URL rewrite in .htaccess
+ * from http://site/action/. Anything after 'action/' is considered the action
+ * and will be passed to {@link action()}.
+ *
+ * @warning This sets the input named 'action' to the current action. When calling
+ * an action, get_input('action') will always return the action name.
+ *
+ * @package Elgg.Core
+ * @subpackage Actions
+ * @link http://docs.elgg.org/Tutorials/Actions
+ */
+
+require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+$action = get_input("action");
+action($action);
diff --git a/engine/handlers/cache_handler.php b/engine/handlers/cache_handler.php
new file mode 100644
index 000000000..36fc665bb
--- /dev/null
+++ b/engine/handlers/cache_handler.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Cache handler.
+ *
+ * External access to cached CSS and JavaScript views. The cached file URLS
+ * should be of the form: cache/<type>/<viewtype>/<name/of/view>.<unique_id>.<type> where
+ * type is either css or js, view is the name of the cached view, and
+ * unique_id is an identifier that is updated every time the cache is flushed.
+ * The simplest way to maintain a unique identifier is to use the lastcache
+ * variable in Elgg's config object.
+ *
+ * @see elgg_register_simplecache_view()
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+
+// Get dataroot
+require_once(dirname(dirname(__FILE__)) . '/settings.php');
+$mysql_dblink = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, true);
+if (!$mysql_dblink) {
+ echo 'Cache error: unable to connect to database server';
+ exit;
+}
+
+if (!mysql_select_db($CONFIG->dbname, $mysql_dblink)) {
+ echo 'Cache error: unable to connect to Elgg database';
+ exit;
+}
+
+$query = "select name, value from {$CONFIG->dbprefix}datalists
+ where name in ('dataroot', 'simplecache_enabled')";
+
+$result = mysql_query($query, $mysql_dblink);
+if (!$result) {
+ echo 'Cache error: unable to get the data root';
+ exit;
+}
+while ($row = mysql_fetch_object($result)) {
+ ${$row->name} = $row->value;
+}
+mysql_free_result($result);
+
+
+$dirty_request = $_GET['request'];
+// only alphanumeric characters plus /, ., and _ and no '..'
+$filter = array("options" => array("regexp" => "/^(\.?[_a-zA-Z0-9\/]+)+$/"));
+$request = filter_var($dirty_request, FILTER_VALIDATE_REGEXP, $filter);
+if (!$request || !$simplecache_enabled) {
+ echo 'Cache error: bad request';
+ exit;
+}
+
+// testing showed regex to be marginally faster than array / string functions over 100000 reps
+// it won't make a difference in real life and regex is easier to read.
+// <type>/<viewtype>/<name/of/view.and.dots>.<ts>.<type>
+$regex = '|([^/]+)/([^/]+)/(.+)\.([^\.]+)\.([^.]+)$|';
+preg_match($regex, $request, $matches);
+
+$type = $matches[1];
+$viewtype = $matches[2];
+$view = $matches[3];
+$ts = $matches[4];
+
+// If is the same ETag, content didn't changed.
+$etag = $ts;
+if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == "\"$etag\"") {
+ header("HTTP/1.1 304 Not Modified");
+ exit;
+}
+
+switch ($type) {
+ case 'css':
+ header("Content-type: text/css", true);
+ $view = "css/$view";
+ break;
+ case 'js':
+ header('Content-type: text/javascript', true);
+ $view = "js/$view";
+ break;
+}
+
+header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', strtotime("+6 months")), true);
+header("Pragma: public", true);
+header("Cache-Control: public", true);
+header("ETag: \"$etag\"");
+
+$filename = $dataroot . 'views_simplecache/' . md5($viewtype . $view);
+
+if (file_exists($filename)) {
+ readfile($filename);
+} else {
+ // someone trying to access a non-cached file or a race condition with cache flushing
+ mysql_close($mysql_dblink);
+ require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+ global $CONFIG;
+ if (!in_array($view, $CONFIG->views->simplecache)) {
+ header("HTTP/1.1 404 Not Found");
+ exit;
+ }
+
+ elgg_set_viewtype($viewtype);
+ echo elgg_view($view);
+}
diff --git a/engine/handlers/export_handler.php b/engine/handlers/export_handler.php
new file mode 100644
index 000000000..aa5214c23
--- /dev/null
+++ b/engine/handlers/export_handler.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Export handler.
+ *
+ * @package Elgg.Core
+ * @subpackage Export
+ */
+
+require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+
+// Get input values, these will be mapped via modrewrite
+$guid = get_input("guid"); // guid of the entity
+
+// For attributes eg http://example.com/odd/73/attr/owner_uuid/
+// or http://example.com/odd/73/metadata/86/
+$type = get_input("type"); // attr, metadata, annotation, relationship
+$id_or_name = get_input("idname"); // Either a number or the key name (if attribute)
+
+$body = "";
+$title = "";
+
+// Only export the GUID
+if (($guid != "") && ($type == "") && ($id_or_name == "")) {
+ $entity = get_entity($guid);
+
+ if (!$entity) {
+ $query = elgg_echo('InvalidParameterException:GUIDNotFound', array($guid));
+ throw new InvalidParameterException($query);
+ }
+
+ $title = "GUID:$guid";
+ $body = elgg_view("export/entity", array("entity" => $entity, "uuid" => guid_to_uuid($guid)));
+
+ // Export an individual attribute
+} else if (($guid != "") && ($type != "") && ($id_or_name != "")) {
+ // Get a uuid
+ $entity = get_entity($guid);
+ if (!$entity) {
+ $msg = elgg_echo('InvalidParameterException:GUIDNotFound', array($guid));
+ throw new InvalidParameterException($msg);
+ }
+
+ $uuid = guid_to_uuid($entity->getGUID()) . "$type/$id_or_name/";
+
+ switch ($type) {
+ case 'attr' : // @todo: Do this better? - This is a bit of a hack...
+ $v = $entity->get($id_or_name);
+ if (!$v) {
+ $msg = elgg_echo('InvalidParameterException:IdNotExistForGUID', array($id_or_name, $guid));
+ throw new InvalidParameterException($msg);
+ }
+
+ $m = new ElggMetadata();
+
+ $m->value = $v;
+ $m->name = $id_or_name;
+ $m->entity_guid = $guid;
+ $m->time_created = $entity->time_created;
+ $m->time_updated = $entity->time_updated;
+ $m->owner_guid = $entity->owner_guid;
+ $m->id = $id_or_name;
+ $m->type = "attr";
+ break;
+ case 'metadata' :
+ $m = elgg_get_metadata_from_id($id_or_name);
+ break;
+ case 'annotation' :
+ $m = elgg_get_annotation_from_id($id_or_name);
+ break;
+ case 'relationship' :
+ $r = get_relationship($id_or_name);
+ break;
+ case 'volatile' :
+ $m = elgg_trigger_plugin_hook('volatile', 'metadata', array(
+ 'guid' => $guid,
+ 'varname' => $id_or_name,
+ ));
+ break;
+
+ default :
+ $msg = elgg_echo('InvalidParameterException:CanNotExportType', array($type));
+ throw new InvalidParameterException($msg);
+ }
+
+ // Render metadata or relationship
+ if ((!$m) && (!$r)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NoDataFound'));
+ }
+
+ // Exporting metadata?
+ if ($m) {
+ if ($m->entity_guid != $entity->guid) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:DoesNotBelong'));
+ }
+
+ $title = "$type:$id_or_name";
+ $body = elgg_view("export/metadata", array("metadata" => $m, "uuid" => $uuid));
+ }
+
+ // Exporting relationship
+ if ($r) {
+ if (($r->guid_one != $entity->guid) && ($r->guid_two != $entity->guid)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:DoesNotBelongOrRefer'));
+ }
+
+ $title = "$type:$id_or_name";
+ $body = elgg_view("export/relationship", array("relationship" => $r, "uuid" => $uuid));
+ }
+
+ // Something went wrong
+} else {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:MissingParameter'));
+}
+
+$content = elgg_view_title($title) . $body;
+$body = elgg_view_layout('one_sidebar', array('content' => $content));
+echo elgg_view_page($title, $body);
diff --git a/engine/handlers/page_handler.php b/engine/handlers/page_handler.php
new file mode 100644
index 000000000..1ed295b7d
--- /dev/null
+++ b/engine/handlers/page_handler.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Pages handler.
+ *
+ * This file dispatches pages. It is called via a URL rewrite in .htaccess
+ * from http://site/handler/page1/page2. The first element after site/ is
+ * the page handler name as registered by {@link elgg_register_page_handler()}.
+ * The rest of the string is sent to {@link page_handler()}.
+ *
+ * Note that the following handler names are reserved by elgg and should not be
+ * registered by any plugins:
+ * * action
+ * * cache
+ * * services
+ * * export
+ * * mt
+ * * xml-rpc.php
+ * * rewrite.php
+ * * tag (deprecated, reserved for backwards compatibility)
+ * * pg (deprecated, reserved for backwards compatibility)
+ *
+ * {@link page_handler()} explodes the pages string by / and sends it to
+ * the page handler function as registered by {@link elgg_register_page_handler()}.
+ * If a valid page handler isn't found, plugins have a chance to provide a 404.
+ *
+ * @package Elgg.Core
+ * @subpackage PageHandler
+ * @link http://docs.elgg.org/Tutorials/PageHandlers
+ */
+
+
+// Permanent redirect to pg-less urls
+$url = $_SERVER['REQUEST_URI'];
+$new_url = preg_replace('#/pg/#', '/', $url, 1);
+
+if ($url !== $new_url) {
+ header("HTTP/1.1 301 Moved Permanently");
+ header("Location: $new_url");
+}
+
+require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+$handler = get_input('handler');
+$page = get_input('page');
+
+if (!page_handler($handler, $page)) {
+ forward('', '404');
+}
diff --git a/engine/handlers/service_handler.php b/engine/handlers/service_handler.php
new file mode 100644
index 000000000..9cfcd230f
--- /dev/null
+++ b/engine/handlers/service_handler.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Services handler.
+ *
+ * This file dispatches requests to web services. It is called via a URL rewrite
+ * in .htaccess from http://site/services/api/handler/response_format/request.
+ * The first element after 'services/api/' is the service handler name as
+ * registered by {@link register_service_handler()}.
+ *
+ * The remaining string is then passed to the {@link service_handler()}
+ * which explodes by /, extracts the first element as the response format
+ * (viewtype), and then passes the remaining array to the service handler
+ * function registered by {@link register_service_handler()}.
+ *
+ * If a service handler isn't found, a 404 header is sent.
+ *
+ * @package Elgg.Core
+ * @subpackage WebServices
+ * @link http://docs.elgg.org/Tutorials/WebServices
+ */
+
+require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+$handler = get_input('handler');
+$request = get_input('request');
+
+service_handler($handler, $request);
diff --git a/engine/handlers/xml-rpc_handler.php b/engine/handlers/xml-rpc_handler.php
new file mode 100644
index 000000000..2ee29e5b7
--- /dev/null
+++ b/engine/handlers/xml-rpc_handler.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * XML-RPC handler.
+ *
+ * @warning This is very old code. Does it work at all?
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ * @link http://docs.elgg.org/Tutorials/XMLRPC
+ * @todo Does this work?
+ */
+
+require_once(dirname(dirname(__FILE__)) . "/start.php");
+
+// Register the error handler
+error_reporting(E_ALL);
+set_error_handler('_php_xmlrpc_error_handler');
+
+// Register a default exception handler
+set_exception_handler('_php_xmlrpc_exception_handler');
+
+// Set some defaults
+$result = null;
+set_input('view', 'xml'); // Set default view regardless
+
+// Get the post data
+$input = get_post_data();
+
+if ($input) {
+ // Parse structures from xml
+ $call = new XMLRPCCall($input);
+
+ // Process call
+ $result = trigger_xmlrpc_handler($call);
+} else {
+ throw new CallException(elgg_echo('xmlrpc:noinputdata'));
+}
+
+if (!($result instanceof XMLRPCResponse)) {
+ throw new APIException(elgg_echo('APIException:ApiResultUnknown'));
+}
+
+// Output result
+echo elgg_view_page("XML-RPC", elgg_view("xml-rpc/output", array('result' => $result)));
diff --git a/engine/lib/access.php b/engine/lib/access.php
new file mode 100644
index 000000000..de0693ea8
--- /dev/null
+++ b/engine/lib/access.php
@@ -0,0 +1,1078 @@
+<?php
+/**
+ * Functions for Elgg's access system for entities, metadata, and annotations.
+ *
+ * Access is generally saved in the database as access_id. This corresponds to
+ * one of the ACCESS_* constants defined in {@link elgglib.php} or the ID of an
+ * access collection.
+ *
+ * @package Elgg.Core
+ * @subpackage Access
+ * @link http://docs.elgg.org/Access
+ */
+
+/**
+ * Return an ElggCache static variable cache for the access caches
+ *
+ * @staticvar ElggStaticVariableCache $access_cache
+ * @return \ElggStaticVariableCache
+ * @access private
+ */
+function _elgg_get_access_cache() {
+ /**
+ * A default filestore cache using the dataroot.
+ */
+ static $access_cache;
+
+ if (!$access_cache) {
+ $access_cache = new ElggStaticVariableCache('access');
+ }
+
+ return $access_cache;
+}
+
+/**
+ * Return a string of access_ids for $user_id appropriate for inserting into an SQL IN clause.
+ *
+ * @uses get_access_array
+ *
+ * @link http://docs.elgg.org/Access
+ * @see get_access_array()
+ *
+ * @param int $user_id User ID; defaults to currently logged in user
+ * @param int $site_id Site ID; defaults to current site
+ * @param bool $flush If set to true, will refresh the access list from the
+ * database rather than using this function's cache.
+ *
+ * @return string A list of access collections suitable for using in an SQL call
+ * @access private
+ */
+function get_access_list($user_id = 0, $site_id = 0, $flush = false) {
+ global $CONFIG, $init_finished;
+ $cache = _elgg_get_access_cache();
+
+ if ($flush) {
+ $cache->clear();
+ }
+
+ if ($user_id == 0) {
+ $user_id = elgg_get_logged_in_user_guid();
+ }
+
+ if (($site_id == 0) && (isset($CONFIG->site_id))) {
+ $site_id = $CONFIG->site_id;
+ }
+ $user_id = (int) $user_id;
+ $site_id = (int) $site_id;
+
+ $hash = $user_id . $site_id . 'get_access_list';
+
+ if ($cache[$hash]) {
+ return $cache[$hash];
+ }
+
+ $access_array = get_access_array($user_id, $site_id, $flush);
+ $access = "(" . implode(",", $access_array) . ")";
+
+ if ($init_finished) {
+ $cache[$hash] = $access;
+ }
+
+ return $access;
+}
+
+/**
+ * Returns an array of access IDs a user is permitted to see.
+ *
+ * Can be overridden with the 'access:collections:read', 'user' plugin hook.
+ *
+ * This returns a list of all the collection ids a user owns or belongs
+ * to plus public and logged in access levels. If the user is an admin, it includes
+ * the private access level.
+ *
+ * @internal this is only used in core for creating the SQL where clause when
+ * retrieving content from the database. The friends access level is handled by
+ * get_access_sql_suffix().
+ *
+ * @see get_write_access_array() for the access levels that a user can write to.
+ *
+ * @param int $user_id User ID; defaults to currently logged in user
+ * @param int $site_id Site ID; defaults to current site
+ * @param bool $flush If set to true, will refresh the access ids from the
+ * database rather than using this function's cache.
+ *
+ * @return array An array of access collections ids
+ */
+function get_access_array($user_id = 0, $site_id = 0, $flush = false) {
+ global $CONFIG, $init_finished;
+
+ $cache = _elgg_get_access_cache();
+
+ if ($flush) {
+ $cache->clear();
+ }
+
+ if ($user_id == 0) {
+ $user_id = elgg_get_logged_in_user_guid();
+ }
+
+ if (($site_id == 0) && (isset($CONFIG->site_guid))) {
+ $site_id = $CONFIG->site_guid;
+ }
+
+ $user_id = (int) $user_id;
+ $site_id = (int) $site_id;
+
+ $hash = $user_id . $site_id . 'get_access_array';
+
+ if ($cache[$hash]) {
+ $access_array = $cache[$hash];
+ } else {
+ $access_array = array(ACCESS_PUBLIC);
+
+ // The following can only return sensible data if the user is logged in.
+ if (elgg_is_logged_in()) {
+ $access_array[] = ACCESS_LOGGED_IN;
+
+ // Get ACL memberships
+ $query = "SELECT am.access_collection_id"
+ . " FROM {$CONFIG->dbprefix}access_collection_membership am"
+ . " LEFT JOIN {$CONFIG->dbprefix}access_collections ag ON ag.id = am.access_collection_id"
+ . " WHERE am.user_guid = $user_id AND (ag.site_guid = $site_id OR ag.site_guid = 0)";
+
+ $collections = get_data($query);
+ if ($collections) {
+ foreach ($collections as $collection) {
+ if (!empty($collection->access_collection_id)) {
+ $access_array[] = (int)$collection->access_collection_id;
+ }
+ }
+ }
+
+ // Get ACLs owned.
+ $query = "SELECT ag.id FROM {$CONFIG->dbprefix}access_collections ag ";
+ $query .= "WHERE ag.owner_guid = $user_id AND (ag.site_guid = $site_id OR ag.site_guid = 0)";
+
+ $collections = get_data($query);
+ if ($collections) {
+ foreach ($collections as $collection) {
+ if (!empty($collection->id)) {
+ $access_array[] = (int)$collection->id;
+ }
+ }
+ }
+
+ $ignore_access = elgg_check_access_overrides($user_id);
+
+ if ($ignore_access == true) {
+ $access_array[] = ACCESS_PRIVATE;
+ }
+ }
+
+ if ($init_finished) {
+ $cache[$hash] = $access_array;
+ }
+ }
+
+ $options = array(
+ 'user_id' => $user_id,
+ 'site_id' => $site_id
+ );
+
+ return elgg_trigger_plugin_hook('access:collections:read', 'user', $options, $access_array);
+}
+
+/**
+ * Gets the default access permission.
+ *
+ * This returns the default access level for the site or optionally for the user.
+ *
+ * @param ElggUser $user Get the user's default access. Defaults to logged in user.
+ *
+ * @return int default access id (see ACCESS defines in elgglib.php)
+ * @link http://docs.elgg.org/Access
+ */
+function get_default_access(ElggUser $user = null) {
+ global $CONFIG;
+
+ if (!$CONFIG->allow_user_default_access) {
+ return $CONFIG->default_access;
+ }
+
+ if (!($user) && (!$user = elgg_get_logged_in_user_entity())) {
+ return $CONFIG->default_access;
+ }
+
+ if (false !== ($default_access = $user->getPrivateSetting('elgg_default_access'))) {
+ return $default_access;
+ } else {
+ return $CONFIG->default_access;
+ }
+}
+
+/**
+ * Allow disabled entities and metadata to be returned by getter functions
+ *
+ * @todo Replace this with query object!
+ * @global bool $ENTITY_SHOW_HIDDEN_OVERRIDE
+ * @access private
+ */
+$ENTITY_SHOW_HIDDEN_OVERRIDE = false;
+
+/**
+ * Show or hide disabled entities.
+ *
+ * @param bool $show_hidden Show disabled entities.
+ * @return void
+ * @access private
+ */
+function access_show_hidden_entities($show_hidden) {
+ global $ENTITY_SHOW_HIDDEN_OVERRIDE;
+ $ENTITY_SHOW_HIDDEN_OVERRIDE = $show_hidden;
+}
+
+/**
+ * Return current status of showing disabled entities.
+ *
+ * @return bool
+ * @access private
+ */
+function access_get_show_hidden_status() {
+ global $ENTITY_SHOW_HIDDEN_OVERRIDE;
+ return $ENTITY_SHOW_HIDDEN_OVERRIDE;
+}
+
+/**
+ * Returns the SQL where clause for a table with a access_id and enabled columns.
+ *
+ * This handles returning where clauses for ACCESS_FRIENDS and the currently
+ * unused block and filter lists in addition to using get_access_list() for
+ * access collections and the standard access levels.
+ *
+ * @param string $table_prefix Optional table. prefix for the access code.
+ * @param int $owner The guid to check access for. Defaults to logged in user.
+ *
+ * @return string The SQL for a where clause
+ * @access private
+ */
+function get_access_sql_suffix($table_prefix = '', $owner = null) {
+ global $ENTITY_SHOW_HIDDEN_OVERRIDE, $CONFIG;
+
+ $sql = "";
+ $friends_bit = "";
+ $enemies_bit = "";
+
+ if ($table_prefix) {
+ $table_prefix = sanitise_string($table_prefix) . ".";
+ }
+
+ if (!isset($owner)) {
+ $owner = elgg_get_logged_in_user_guid();
+ }
+
+ if (!$owner) {
+ $owner = -1;
+ }
+
+ $ignore_access = elgg_check_access_overrides($owner);
+ $access = get_access_list($owner);
+
+ if ($ignore_access) {
+ $sql = " (1 = 1) ";
+ } else if ($owner != -1) {
+ // we have an entity's guid and auto check for friend relationships
+ $friends_bit = "{$table_prefix}access_id = " . ACCESS_FRIENDS . "
+ AND {$table_prefix}owner_guid IN (
+ SELECT guid_one FROM {$CONFIG->dbprefix}entity_relationships
+ WHERE relationship='friend' AND guid_two=$owner
+ )";
+
+ $friends_bit = '(' . $friends_bit . ') OR ';
+
+ // @todo untested and unsupported at present
+ if ((isset($CONFIG->user_block_and_filter_enabled)) && ($CONFIG->user_block_and_filter_enabled)) {
+ // check to see if the user is in the entity owner's block list
+ // or if the entity owner is in the user's filter list
+ // if so, disallow access
+ $enemies_bit = get_access_restriction_sql('elgg_block_list', "{$table_prefix}owner_guid", $owner, false);
+ $enemies_bit = '('
+ . $enemies_bit
+ . ' AND ' . get_access_restriction_sql('elgg_filter_list', $owner, "{$table_prefix}owner_guid", false)
+ . ')';
+ }
+ }
+
+ if (empty($sql)) {
+ $sql = " $friends_bit ({$table_prefix}access_id IN {$access}
+ OR ({$table_prefix}owner_guid = {$owner})
+ OR (
+ {$table_prefix}access_id = " . ACCESS_PRIVATE . "
+ AND {$table_prefix}owner_guid = $owner
+ )
+ )";
+ }
+
+ if ($enemies_bit) {
+ $sql = "$enemies_bit AND ($sql)";
+ }
+
+ if (!$ENTITY_SHOW_HIDDEN_OVERRIDE) {
+ $sql .= " and {$table_prefix}enabled='yes'";
+ }
+
+ return '(' . $sql . ')';
+}
+
+/**
+ * Get the where clause for an access restriction based on annotations
+ *
+ * Returns an SQL fragment that is true (or optionally false) if the given user has
+ * added an annotation with the given name to the given entity.
+ *
+ * @warning this is a private function for an untested capability and will likely
+ * be removed from a future version of Elgg.
+ *
+ * @param string $annotation_name Name of the annotation
+ * @param string $entity_guid SQL GUID of entity the annotation is attached to.
+ * @param string $owner_guid SQL string that evaluates to the GUID of the annotation owner
+ * @param boolean $exists If true, returns BOOL if the annotation exists
+ *
+ * @return string An SQL fragment suitable for inserting into a WHERE clause
+ * @access private
+ */
+function get_access_restriction_sql($annotation_name, $entity_guid, $owner_guid, $exists) {
+ global $CONFIG;
+
+ if ($exists) {
+ $not = '';
+ } else {
+ $not = 'NOT';
+ }
+
+ $sql = <<<END
+$not EXISTS (SELECT * FROM {$CONFIG->dbprefix}annotations a
+INNER JOIN {$CONFIG->dbprefix}metastrings ms ON (a.name_id = ms.id)
+WHERE ms.string = '$annotation_name'
+AND a.entity_guid = $entity_guid
+AND a.owner_guid = $owner_guid)
+END;
+ return $sql;
+}
+
+/**
+ * Can a user access an entity.
+ *
+ * @warning If a logged in user doesn't have access to an entity, the
+ * core engine will not load that entity.
+ *
+ * @tip This is mostly useful for checking if a user other than the logged in
+ * user has access to an entity that is currently loaded.
+ *
+ * @todo This function would be much more useful if we could pass the guid of the
+ * entity to test access for. We need to be able to tell whether the entity exists
+ * and whether the user has access to the entity.
+ *
+ * @param ElggEntity $entity The entity to check access for.
+ * @param ElggUser $user Optionally user to check access for. Defaults to
+ * logged in user (which is a useless default).
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Access
+ */
+function has_access_to_entity($entity, $user = null) {
+ global $CONFIG;
+
+ if (!isset($user)) {
+ $access_bit = get_access_sql_suffix("e");
+ } else {
+ $access_bit = get_access_sql_suffix("e", $user->getGUID());
+ }
+
+ $query = "SELECT guid from {$CONFIG->dbprefix}entities e WHERE e.guid = " . $entity->getGUID();
+ // Add access controls
+ $query .= " AND " . $access_bit;
+ if (get_data($query)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Returns an array of access permissions that the user is allowed to save content with.
+ * Permissions returned are of the form (id => 'name').
+ *
+ * Example return value in English:
+ * array(
+ * 0 => 'Private',
+ * -2 => 'Friends',
+ * 1 => 'Logged in users',
+ * 2 => 'Public',
+ * 34 => 'My favorite friends',
+ * );
+ *
+ * Plugin hook of 'access:collections:write', 'user'
+ *
+ * @warning this only returns access collections that the user owns plus the
+ * standard access levels. It does not return access collections that the user
+ * belongs to such as the access collection for a group.
+ *
+ * @param int $user_id The user's GUID.
+ * @param int $site_id The current site.
+ * @param bool $flush If this is set to true, this will ignore a cached access array
+ *
+ * @return array List of access permissions
+ * @link http://docs.elgg.org/Access
+ */
+function get_write_access_array($user_id = 0, $site_id = 0, $flush = false) {
+ global $CONFIG, $init_finished;
+ $cache = _elgg_get_access_cache();
+
+ if ($flush) {
+ $cache->clear();
+ }
+
+ if ($user_id == 0) {
+ $user_id = elgg_get_logged_in_user_guid();
+ }
+
+ if (($site_id == 0) && (isset($CONFIG->site_id))) {
+ $site_id = $CONFIG->site_id;
+ }
+
+ $user_id = (int) $user_id;
+ $site_id = (int) $site_id;
+
+ $hash = $user_id . $site_id . 'get_write_access_array';
+
+ if ($cache[$hash]) {
+ $access_array = $cache[$hash];
+ } else {
+ // @todo is there such a thing as public write access?
+ $access_array = array(
+ ACCESS_PRIVATE => elgg_echo("PRIVATE"),
+ ACCESS_FRIENDS => elgg_echo("access:friends:label"),
+ ACCESS_LOGGED_IN => elgg_echo("LOGGED_IN"),
+ ACCESS_PUBLIC => elgg_echo("PUBLIC")
+ );
+
+ $query = "SELECT ag.* FROM {$CONFIG->dbprefix}access_collections ag ";
+ $query .= " WHERE (ag.site_guid = $site_id OR ag.site_guid = 0)";
+ $query .= " AND (ag.owner_guid = $user_id)";
+
+ $collections = get_data($query);
+ if ($collections) {
+ foreach ($collections as $collection) {
+ $access_array[$collection->id] = $collection->name;
+ }
+ }
+
+ if ($init_finished) {
+ $cache[$hash] = $access_array;
+ }
+ }
+
+ $options = array(
+ 'user_id' => $user_id,
+ 'site_id' => $site_id
+ );
+ return elgg_trigger_plugin_hook('access:collections:write', 'user',
+ $options, $access_array);
+}
+
+/**
+ * Can the user change this access collection?
+ *
+ * Use the plugin hook of 'access:collections:write', 'user' to change this.
+ * @see get_write_access_array() for details on the hook.
+ *
+ * Respects access control disabling for admin users and {@see elgg_set_ignore_access()}
+ *
+ * @see get_write_access_array()
+ *
+ * @param int $collection_id The collection id
+ * @param mixed $user_guid The user GUID to check for. Defaults to logged in user.
+ * @return bool
+ */
+function can_edit_access_collection($collection_id, $user_guid = null) {
+ if ($user_guid) {
+ $user = get_entity((int) $user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $collection = get_access_collection($collection_id);
+
+ if (!($user instanceof ElggUser) || !$collection) {
+ return false;
+ }
+
+ $write_access = get_write_access_array($user->getGUID(), 0, true);
+
+ // don't ignore access when checking users.
+ if ($user_guid) {
+ return array_key_exists($collection_id, $write_access);
+ } else {
+ return elgg_get_ignore_access() || array_key_exists($collection_id, $write_access);
+ }
+}
+
+/**
+ * Creates a new access collection.
+ *
+ * Access colletions allow plugins and users to create granular access
+ * for entities.
+ *
+ * Triggers plugin hook 'access:collections:addcollection', 'collection'
+ *
+ * @internal Access collections are stored in the access_collections table.
+ * Memberships to collections are in access_collections_membership.
+ *
+ * @param string $name The name of the collection.
+ * @param int $owner_guid The GUID of the owner (default: currently logged in user).
+ * @param int $site_guid The GUID of the site (default: current site).
+ *
+ * @return int|false The collection ID if successful and false on failure.
+ * @link http://docs.elgg.org/Access/Collections
+ * @see update_access_collection()
+ * @see delete_access_collection()
+ */
+function create_access_collection($name, $owner_guid = 0, $site_guid = 0) {
+ global $CONFIG;
+
+ $name = trim($name);
+ if (empty($name)) {
+ return false;
+ }
+
+ if ($owner_guid == 0) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+ if (($site_guid == 0) && (isset($CONFIG->site_guid))) {
+ $site_guid = $CONFIG->site_guid;
+ }
+ $name = sanitise_string($name);
+
+ $q = "INSERT INTO {$CONFIG->dbprefix}access_collections
+ SET name = '{$name}',
+ owner_guid = {$owner_guid},
+ site_guid = {$site_guid}";
+ $id = insert_data($q);
+ if (!$id) {
+ return false;
+ }
+
+ $params = array(
+ 'collection_id' => $id
+ );
+
+ if (!elgg_trigger_plugin_hook('access:collections:addcollection', 'collection', $params, true)) {
+ return false;
+ }
+
+ return $id;
+}
+
+/**
+ * Updates the membership in an access collection.
+ *
+ * @warning Expects a full list of all members that should
+ * be part of the access collection
+ *
+ * @note This will run all hooks associated with adding or removing
+ * members to access collections.
+ *
+ * @param int $collection_id The ID of the collection.
+ * @param array $members Array of member GUIDs
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Access/Collections
+ * @see add_user_to_access_collection()
+ * @see remove_user_from_access_collection()
+ */
+function update_access_collection($collection_id, $members) {
+ $acl = get_access_collection($collection_id);
+
+ if (!$acl) {
+ return false;
+ }
+ $members = (is_array($members)) ? $members : array();
+
+ $cur_members = get_members_of_access_collection($collection_id, true);
+ $cur_members = (is_array($cur_members)) ? $cur_members : array();
+
+ $remove_members = array_diff($cur_members, $members);
+ $add_members = array_diff($members, $cur_members);
+
+ $result = true;
+
+ foreach ($add_members as $guid) {
+ $result = $result && add_user_to_access_collection($guid, $collection_id);
+ }
+
+ foreach ($remove_members as $guid) {
+ $result = $result && remove_user_from_access_collection($guid, $collection_id);
+ }
+
+ return $result;
+}
+
+/**
+ * Deletes a specified access collection and its membership.
+ *
+ * @param int $collection_id The collection ID
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Access/Collections
+ * @see create_access_collection()
+ * @see update_access_collection()
+ */
+function delete_access_collection($collection_id) {
+ global $CONFIG;
+
+ $collection_id = (int) $collection_id;
+ $params = array('collection_id' => $collection_id);
+
+ if (!elgg_trigger_plugin_hook('access:collections:deletecollection', 'collection', $params, true)) {
+ return false;
+ }
+
+ // Deleting membership doesn't affect result of deleting ACL.
+ $q = "DELETE FROM {$CONFIG->dbprefix}access_collection_membership
+ WHERE access_collection_id = {$collection_id}";
+ delete_data($q);
+
+ $q = "DELETE FROM {$CONFIG->dbprefix}access_collections
+ WHERE id = {$collection_id}";
+ $result = delete_data($q);
+
+ return (bool)$result;
+}
+
+/**
+ * Get a specified access collection
+ *
+ * @note This doesn't return the members of an access collection,
+ * just the database row of the actual collection.
+ *
+ * @see get_members_of_access_collection()
+ *
+ * @param int $collection_id The collection ID
+ *
+ * @return object|false
+ */
+function get_access_collection($collection_id) {
+ global $CONFIG;
+ $collection_id = (int) $collection_id;
+
+ $query = "SELECT * FROM {$CONFIG->dbprefix}access_collections WHERE id = {$collection_id}";
+ $get_collection = get_data_row($query);
+
+ return $get_collection;
+}
+
+/**
+ * Adds a user to an access collection.
+ *
+ * Triggers the 'access:collections:add_user', 'collection' plugin hook.
+ *
+ * @param int $user_guid The GUID of the user to add
+ * @param int $collection_id The ID of the collection to add them to
+ *
+ * @return bool
+ * @see update_access_collection()
+ * @see remove_user_from_access_collection()
+ * @link http://docs.elgg.org/Access/Collections
+ */
+function add_user_to_access_collection($user_guid, $collection_id) {
+ global $CONFIG;
+
+ $collection_id = (int) $collection_id;
+ $user_guid = (int) $user_guid;
+ $user = get_user($user_guid);
+
+ $collection = get_access_collection($collection_id);
+
+ if (!($user instanceof Elgguser) || !$collection) {
+ return false;
+ }
+
+ $params = array(
+ 'collection_id' => $collection_id,
+ 'user_guid' => $user_guid
+ );
+
+ $result = elgg_trigger_plugin_hook('access:collections:add_user', 'collection', $params, true);
+ if ($result == false) {
+ return false;
+ }
+
+ // if someone tries to insert the same data twice, we do a no-op on duplicate key
+ $q = "INSERT INTO {$CONFIG->dbprefix}access_collection_membership
+ SET access_collection_id = $collection_id, user_guid = $user_guid
+ ON DUPLICATE KEY UPDATE user_guid = user_guid";
+ $result = insert_data($q);
+
+ return $result !== false;
+}
+
+/**
+ * Removes a user from an access collection.
+ *
+ * Triggers the 'access:collections:remove_user', 'collection' plugin hook.
+ *
+ * @param int $user_guid The user GUID
+ * @param int $collection_id The access collection ID
+ *
+ * @return bool
+ * @see update_access_collection()
+ * @see remove_user_from_access_collection()
+ * @link http://docs.elgg.org/Access/Collections
+ */
+function remove_user_from_access_collection($user_guid, $collection_id) {
+ global $CONFIG;
+
+ $collection_id = (int) $collection_id;
+ $user_guid = (int) $user_guid;
+ $user = get_user($user_guid);
+
+ $collection = get_access_collection($collection_id);
+
+ if (!($user instanceof Elgguser) || !$collection) {
+ return false;
+ }
+
+ $params = array(
+ 'collection_id' => $collection_id,
+ 'user_guid' => $user_guid
+ );
+
+ if (!elgg_trigger_plugin_hook('access:collections:remove_user', 'collection', $params, true)) {
+ return false;
+ }
+
+ $q = "DELETE FROM {$CONFIG->dbprefix}access_collection_membership
+ WHERE access_collection_id = {$collection_id}
+ AND user_guid = {$user_guid}";
+
+ return (bool)delete_data($q);
+}
+
+/**
+ * Returns an array of database row objects of the access collections owned by $owner_guid.
+ *
+ * @param int $owner_guid The entity guid
+ * @param int $site_guid The GUID of the site (default: current site).
+ *
+ * @return array|false
+ * @see add_access_collection()
+ * @see get_members_of_access_collection()
+ * @link http://docs.elgg.org/Access/Collections
+ */
+function get_user_access_collections($owner_guid, $site_guid = 0) {
+ global $CONFIG;
+ $owner_guid = (int) $owner_guid;
+ $site_guid = (int) $site_guid;
+
+ if (($site_guid == 0) && (isset($CONFIG->site_guid))) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ $query = "SELECT * FROM {$CONFIG->dbprefix}access_collections
+ WHERE owner_guid = {$owner_guid}
+ AND site_guid = {$site_guid}";
+
+ $collections = get_data($query);
+
+ return $collections;
+}
+
+/**
+ * Get all of members of an access collection
+ *
+ * @param int $collection The collection's ID
+ * @param bool $idonly If set to true, will only return the members' GUIDs (default: false)
+ *
+ * @return array ElggUser guids or entities if successful, false if not
+ * @see add_user_to_access_collection()
+ * @see http://docs.elgg.org/Access/Collections
+ */
+function get_members_of_access_collection($collection, $idonly = FALSE) {
+ global $CONFIG;
+ $collection = (int)$collection;
+
+ if (!$idonly) {
+ $query = "SELECT e.* FROM {$CONFIG->dbprefix}access_collection_membership m"
+ . " JOIN {$CONFIG->dbprefix}entities e ON e.guid = m.user_guid"
+ . " WHERE m.access_collection_id = {$collection}";
+ $collection_members = get_data($query, "entity_row_to_elggstar");
+ } else {
+ $query = "SELECT e.guid FROM {$CONFIG->dbprefix}access_collection_membership m"
+ . " JOIN {$CONFIG->dbprefix}entities e ON e.guid = m.user_guid"
+ . " WHERE m.access_collection_id = {$collection}";
+ $collection_members = get_data($query);
+ if (!$collection_members) {
+ return FALSE;
+ }
+ foreach ($collection_members as $key => $val) {
+ $collection_members[$key] = $val->guid;
+ }
+ }
+
+ return $collection_members;
+}
+
+/**
+ * Return entities based upon access id.
+ *
+ * @param array $options Any options accepted by {@link elgg_get_entities()} and
+ * access_id => int The access ID of the entity.
+ *
+ * @see elgg_get_entities()
+ * @return mixed If count, int. If not count, array. false on errors.
+ * @since 1.7.0
+ */
+function elgg_get_entities_from_access_id(array $options = array()) {
+ // restrict the resultset to access collection provided
+ if (!isset($options['access_id'])) {
+ return FALSE;
+ }
+
+ // @todo add support for an array of collection_ids
+ $where = "e.access_id = '{$options['access_id']}'";
+ if (isset($options['wheres'])) {
+ if (is_array($options['wheres'])) {
+ $options['wheres'][] = $where;
+ } else {
+ $options['wheres'] = array($options['wheres'], $where);
+ }
+ } else {
+ $options['wheres'] = array($where);
+ }
+
+ // return entities with the desired options
+ return elgg_get_entities($options);
+}
+
+/**
+ * Lists entities from an access collection
+ *
+ * @param array $options See elgg_list_entities() and elgg_get_entities_from_access_id()
+ *
+ * @see elgg_list_entities()
+ * @see elgg_get_entities_from_access_id()
+ *
+ * @return string
+ */
+function elgg_list_entities_from_access_id(array $options = array()) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_access_id');
+}
+
+/**
+ * Return the name of an ACCESS_* constant or a access collection,
+ * but only if the user has write access on that ACL.
+ *
+ * @warning This function probably doesn't work how it's meant to.
+ *
+ * @param int $entity_access_id The entity's access id
+ *
+ * @return string 'Public', 'Private', etc.
+ * @since 1.7.0
+ * @todo I think this probably wants get_access_array() instead of get_write_access_array(),
+ * but those two functions return different types of arrays.
+ */
+function get_readable_access_level($entity_access_id) {
+ $access = (int) $entity_access_id;
+
+ //get the access level for object in readable string
+ $options = get_write_access_array();
+
+ if (array_key_exists($access, $options)) {
+ return $options[$access];
+ }
+
+ // return 'Limited' if the user does not have access to the access collection
+ return elgg_echo('access:limited:label');
+}
+
+/**
+ * Set if entity access system should be ignored.
+ *
+ * The access system will not return entities in any getter
+ * functions if the user doesn't have access.
+ *
+ * @internal For performance reasons this is done at the database access clause level.
+ *
+ * @tip Use this to access entities in automated scripts
+ * when no user is logged in.
+ *
+ * @note This clears the access cache.
+ *
+ * @warning This will not show disabled entities.
+ * Use {@link access_show_hidden_entities()} to access disabled entities.
+ *
+ * @param bool $ignore If true, disables all access checks.
+ *
+ * @return bool Previous ignore_access setting.
+ * @since 1.7.0
+ * @see http://docs.elgg.org/Access/IgnoreAccess
+ * @see elgg_get_ignore_access()
+ */
+function elgg_set_ignore_access($ignore = true) {
+ $cache = _elgg_get_access_cache();
+ $cache->clear();
+ $elgg_access = elgg_get_access_object();
+ return $elgg_access->setIgnoreAccess($ignore);
+}
+
+/**
+ * Get current ignore access setting.
+ *
+ * @return bool
+ * @since 1.7.0
+ * @see http://docs.elgg.org/Access/IgnoreAccess
+ * @see elgg_set_ignore_access()
+ */
+function elgg_get_ignore_access() {
+ return elgg_get_access_object()->getIgnoreAccess();
+}
+
+/**
+ * Decides if the access system should be ignored for a user.
+ *
+ * Returns true (meaning ignore access) if either of these 2 conditions are true:
+ * 1) an admin user guid is passed to this function.
+ * 2) {@link elgg_get_ignore_access()} returns true.
+ *
+ * @see elgg_set_ignore_access()
+ *
+ * @param int $user_guid The user to check against.
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function elgg_check_access_overrides($user_guid = 0) {
+ if (!$user_guid || $user_guid <= 0) {
+ $is_admin = false;
+ } else {
+ $is_admin = elgg_is_admin_user($user_guid);
+ }
+
+ return ($is_admin || elgg_get_ignore_access());
+}
+
+/**
+ * Returns the ElggAccess object.
+ *
+ * // @todo comment is incomplete
+ * This is used to
+ *
+ * @return ElggAccess
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_access_object() {
+ static $elgg_access;
+
+ if (!$elgg_access) {
+ $elgg_access = new ElggAccess();
+ }
+
+ return $elgg_access;
+}
+
+/**
+ * A flag to set if Elgg's access initialization is finished.
+ *
+ * @global bool $init_finished
+ * @access private
+ * @todo This is required to tell the access system to start caching because
+ * calls are made while in ignore access mode and before the user is logged in.
+ */
+$init_finished = false;
+
+/**
+ * A quick and dirty way to make sure the access permissions have been correctly set up
+ *
+ * @elgg_event_handler init system
+ * @todo Invesigate
+ *
+ * @return void
+ */
+function access_init() {
+ global $init_finished;
+ $init_finished = true;
+}
+
+/**
+ * Overrides the access system if appropriate.
+ *
+ * Allows admin users and calls after {@link elgg_set_ignore_access} to
+ * bypass the access system.
+ *
+ * Registered for the 'permissions_check', 'all' and the
+ * 'container_permissions_check', 'all' plugin hooks.
+ *
+ * Returns true to override the access system or null if no change is needed.
+ *
+ * @param string $hook
+ * @param string $type
+ * @param bool $value
+ * @param array $params
+ * @return true|null
+ * @access private
+ */
+function elgg_override_permissions($hook, $type, $value, $params) {
+ $user = elgg_extract('user', $params);
+ if ($user) {
+ $user_guid = $user->getGUID();
+ } else {
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+
+ // don't do this so ignore access still works with no one logged in
+ //if (!$user instanceof ElggUser) {
+ // return false;
+ //}
+
+ // check for admin
+ if ($user_guid && elgg_is_admin_user($user_guid)) {
+ return true;
+ }
+
+ // check access overrides
+ if ((elgg_check_access_overrides($user_guid))) {
+ return true;
+ }
+
+ // consult other hooks
+ return NULL;
+}
+
+/**
+ * Runs unit tests for the entities object.
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $value
+ * @param array $params
+ * @return array
+ *
+ * @access private
+ */
+function access_test($hook, $type, $value, $params) {
+ global $CONFIG;
+
+ $value[] = $CONFIG->path . 'engine/tests/api/access_collections.php';
+ return $value;
+}
+
+// Tell the access functions the system has booted, plugins are loaded,
+// and the user is logged in so it can start caching
+elgg_register_event_handler('ready', 'system', 'access_init');
+
+// For overrided permissions
+elgg_register_plugin_hook_handler('permissions_check', 'all', 'elgg_override_permissions');
+elgg_register_plugin_hook_handler('container_permissions_check', 'all', 'elgg_override_permissions');
+
+elgg_register_plugin_hook_handler('unit_test', 'system', 'access_test'); \ No newline at end of file
diff --git a/engine/lib/actions.php b/engine/lib/actions.php
new file mode 100644
index 000000000..8047914ac
--- /dev/null
+++ b/engine/lib/actions.php
@@ -0,0 +1,549 @@
+<?php
+/**
+ * Elgg Actions
+ *
+ * Actions are one of the primary controllers (The C in MVC) in Elgg. They are
+ * registered by {@link register_elgg_action()} and are called by URL
+ * http://elggsite.org/action/action_name. For URLs, a rewrite rule in
+ * .htaccess passes the action name to engine/handlers/action_handler.php,
+ * which dispatches the request for the action.
+ *
+ * An action name must be registered to a file in the system. Core actions are
+ * found in /actions/ and plugin actions are usually under /mod/<plugin>/actions/.
+ * It is recommended that actions be namespaced to avoid collisions.
+ *
+ * All actions require security tokens. Using the {@elgg_view input/form} view
+ * will automatically add tokens as hidden inputs as will the elgg_view_form()
+ * function. To manually add hidden inputs, use the {@elgg_view input/securitytoken} view.
+ *
+ * To include security tokens for actions called via GET, use
+ * {@link elgg_add_security_tokens_to_url()} or specify is_action as true when
+ * using {@lgg_view output/url}.
+ *
+ * Action tokens can be manually generated by using {@link generate_action_token()}.
+ *
+ * @tip When registered, actions can be restricted to logged in or admin users.
+ *
+ * @tip Action URLs should be called with a trailing / to prevent 301 redirects.
+ *
+ * @package Elgg.Core
+ * @subpackage Actions
+ * @link http://docs.elgg.org/Actions
+ * @link http://docs.elgg.org/Actions/Tokens
+ */
+
+/**
+ * Perform an action.
+ *
+ * This function executes the action with name $action as registered
+ * by {@link elgg_register_action()}.
+ *
+ * The plugin hook 'action', $action_name will be triggered before the action
+ * is executed. If a handler returns false, it will prevent the action script
+ * from being called.
+ *
+ * @note If an action isn't registered in the system or is registered
+ * to an unavailable file the user will be forwarded to the site front
+ * page and an error will be emitted via {@link register_error()}.
+ *
+ * @warning All actions require {@link http://docs.elgg.org/Actions/Tokens Action Tokens}.
+ *
+ * @param string $action The requested action
+ * @param string $forwarder Optionally, the location to forward to
+ *
+ * @link http://docs.elgg.org/Actions
+ * @see elgg_register_action()
+ *
+ * @return void
+ * @access private
+ */
+function action($action, $forwarder = "") {
+ global $CONFIG;
+
+ $action = rtrim($action, '/');
+
+ // @todo REMOVE THESE ONCE #1509 IS IN PLACE.
+ // Allow users to disable plugins without a token in order to
+ // remove plugins that are incompatible.
+ // Logout for convenience.
+ // file/download (see #2010)
+ $exceptions = array(
+ 'admin/plugins/disable',
+ 'logout',
+ 'file/download',
+ );
+
+ if (!in_array($action, $exceptions)) {
+ action_gatekeeper($action);
+ }
+
+ $forwarder = str_replace(elgg_get_site_url(), "", $forwarder);
+ $forwarder = str_replace("http://", "", $forwarder);
+ $forwarder = str_replace("@", "", $forwarder);
+ if (substr($forwarder, 0, 1) == "/") {
+ $forwarder = substr($forwarder, 1);
+ }
+
+ if (!isset($CONFIG->actions[$action])) {
+ register_error(elgg_echo('actionundefined', array($action)));
+ } elseif (!elgg_is_admin_logged_in() && ($CONFIG->actions[$action]['access'] === 'admin')) {
+ register_error(elgg_echo('actionunauthorized'));
+ } elseif (!elgg_is_logged_in() && ($CONFIG->actions[$action]['access'] !== 'public')) {
+ register_error(elgg_echo('actionloggedout'));
+ } else {
+ // Returning falsy doesn't produce an error
+ // We assume this will be handled in the hook itself.
+ if (elgg_trigger_plugin_hook('action', $action, null, true)) {
+ if (!include($CONFIG->actions[$action]['file'])) {
+ register_error(elgg_echo('actionnotfound', array($action)));
+ }
+ }
+ }
+
+ $forwarder = empty($forwarder) ? REFERER : $forwarder;
+ forward($forwarder);
+}
+
+/**
+ * Registers an action.
+ *
+ * Actions are registered to a script in the system and are executed
+ * either by the URL http://elggsite.org/action/action_name/.
+ *
+ * $filename must be the full path of the file to register, or a path relative
+ * to the core actions/ dir.
+ *
+ * Actions should be namedspaced for your plugin. Example:
+ * <code>
+ * elgg_register_action('myplugin/save_settings', ...);
+ * </code>
+ *
+ * @tip Put action files under the actions/<plugin_name> directory of your plugin.
+ *
+ * @tip You don't need to include engine/start.php in your action files.
+ *
+ * @internal Actions are saved in $CONFIG->actions as an array in the form:
+ * <code>
+ * array(
+ * 'file' => '/location/to/file.php',
+ * 'access' => 'public', 'logged_in', or 'admin'
+ * )
+ * </code>
+ *
+ * @param string $action The name of the action (eg "register", "account/settings/save")
+ * @param string $filename Optionally, the filename where this action is located. If not specified,
+ * will assume the action is in elgg/actions/<action>.php
+ * @param string $access Who is allowed to execute this action: public, logged_in, admin.
+ * (default: logged_in)
+ *
+ * @see action()
+ * @see http://docs.elgg.org/Actions
+ *
+ * @return bool
+ */
+function elgg_register_action($action, $filename = "", $access = 'logged_in') {
+ global $CONFIG;
+
+ // plugins are encouraged to call actions with a trailing / to prevent 301
+ // redirects but we store the actions without it
+ $action = rtrim($action, '/');
+
+ if (!isset($CONFIG->actions)) {
+ $CONFIG->actions = array();
+ }
+
+ if (empty($filename)) {
+ $path = "";
+ if (isset($CONFIG->path)) {
+ $path = $CONFIG->path;
+ }
+
+ $filename = $path . "actions/" . $action . ".php";
+ }
+
+ $CONFIG->actions[$action] = array(
+ 'file' => $filename,
+ 'access' => $access,
+ );
+ return true;
+}
+
+/**
+ * Unregisters an action
+ *
+ * @param string $action Action name
+ * @return bool
+ * @since 1.8.1
+ */
+function elgg_unregister_action($action) {
+ global $CONFIG;
+
+ if (isset($CONFIG->actions[$action])) {
+ unset($CONFIG->actions[$action]);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Is the token timestamp within acceptable range?
+ *
+ * @param int $ts timestamp from the CSRF token
+ *
+ * @return bool
+ */
+function _elgg_validate_token_timestamp($ts) {
+ $action_token_timeout = elgg_get_config('action_token_timeout');
+ // default is 2 hours
+ $timeout = ($action_token_timeout !== null) ? $action_token_timeout : 2;
+
+ $hour = 60 * 60;
+ $timeout = $timeout * $hour;
+ $now = time();
+
+ // Validate time to ensure its not crazy
+ return ($timeout == 0 || ($ts > $now - $timeout) && ($ts < $now + $timeout));
+}
+
+/**
+ * Validate an action token.
+ *
+ * Calls to actions will automatically validate tokens. If tokens are not
+ * present or invalid, the action will be denied and the user will be redirected.
+ *
+ * Plugin authors should never have to manually validate action tokens.
+ *
+ * @param bool $visibleerrors Emit {@link register_error()} errors on failure?
+ * @param mixed $token The token to test against. Default: $_REQUEST['__elgg_token']
+ * @param mixed $ts The time stamp to test against. Default: $_REQUEST['__elgg_ts']
+ *
+ * @return bool
+ * @see generate_action_token()
+ * @link http://docs.elgg.org/Actions/Tokens
+ * @access private
+ */
+function validate_action_token($visibleerrors = TRUE, $token = NULL, $ts = NULL) {
+ if (!$token) {
+ $token = get_input('__elgg_token');
+ }
+
+ if (!$ts) {
+ $ts = get_input('__elgg_ts');
+ }
+
+ $session_id = session_id();
+
+ if (($token) && ($ts) && ($session_id)) {
+ // generate token, check with input and forward if invalid
+ $required_token = generate_action_token($ts);
+
+ // Validate token
+ if ($token == $required_token) {
+
+ if (_elgg_validate_token_timestamp($ts)) {
+ // We have already got this far, so unless anything
+ // else says something to the contrary we assume we're ok
+ $returnval = true;
+
+ $returnval = elgg_trigger_plugin_hook('action_gatekeeper:permissions:check', 'all', array(
+ 'token' => $token,
+ 'time' => $ts
+ ), $returnval);
+
+ if ($returnval) {
+ return true;
+ } else if ($visibleerrors) {
+ register_error(elgg_echo('actiongatekeeper:pluginprevents'));
+ }
+ } else if ($visibleerrors) {
+ // this is necessary because of #5133
+ if (elgg_is_xhr()) {
+ register_error(elgg_echo('js:security:token_refresh_failed', array(elgg_get_site_url())));
+ } else {
+ register_error(elgg_echo('actiongatekeeper:timeerror'));
+ }
+ }
+ } else if ($visibleerrors) {
+ // this is necessary because of #5133
+ if (elgg_is_xhr()) {
+ register_error(elgg_echo('js:security:token_refresh_failed', array(elgg_get_site_url())));
+ } else {
+ register_error(elgg_echo('actiongatekeeper:tokeninvalid'));
+ }
+ }
+ } else {
+ if (! empty($_SERVER['CONTENT_LENGTH']) && empty($_POST)) {
+ // The size of $_POST or uploaded file has exceed the size limit
+ $error_msg = elgg_trigger_plugin_hook('action_gatekeeper:upload_exceeded_msg', 'all', array(
+ 'post_size' => $_SERVER['CONTENT_LENGTH'],
+ 'visible_errors' => $visibleerrors,
+ ), elgg_echo('actiongatekeeper:uploadexceeded'));
+ } else {
+ $error_msg = elgg_echo('actiongatekeeper:missingfields');
+ }
+ if ($visibleerrors) {
+ register_error($error_msg);
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ * Validates the presence of action tokens.
+ *
+ * This function is called for all actions. If action tokens are missing,
+ * the user will be forwarded to the site front page and an error emitted.
+ *
+ * This function verifies form input for security features (like a generated token),
+ * and forwards if they are invalid.
+ *
+ * @param string $action The action being performed
+ *
+ * @return mixed True if valid or redirects.
+ * @access private
+ */
+function action_gatekeeper($action) {
+ if ($action === 'login') {
+ if (validate_action_token(false)) {
+ return true;
+ }
+
+ $token = get_input('__elgg_token');
+ $ts = (int)get_input('__elgg_ts');
+ if ($token && _elgg_validate_token_timestamp($ts)) {
+ // The tokens are present and the time looks valid: this is probably a mismatch due to the
+ // login form being on a different domain.
+ register_error(elgg_echo('actiongatekeeper:crosssitelogin'));
+
+
+ forward('login', 'csrf');
+ }
+
+ // let the validator send an appropriate msg
+ validate_action_token();
+
+ } elseif (validate_action_token()) {
+ return true;
+ }
+
+ forward(REFERER, 'csrf');
+}
+
+/**
+ * Generate an action token.
+ *
+ * Action tokens are based on timestamps as returned by {@link time()}.
+ * They are valid for one hour.
+ *
+ * Action tokens should be passed to all actions name __elgg_ts and __elgg_token.
+ *
+ * @warning Action tokens are required for all actions.
+ *
+ * @param int $timestamp Unix timestamp
+ *
+ * @see @elgg_view input/securitytoken
+ * @see @elgg_view input/form
+ * @example actions/manual_tokens.php
+ *
+ * @return string|false
+ * @access private
+ */
+function generate_action_token($timestamp) {
+ $site_secret = get_site_secret();
+ $session_id = session_id();
+ // Session token
+ $st = $_SESSION['__elgg_session'];
+
+ if (($site_secret) && ($session_id)) {
+ return md5($site_secret . $timestamp . $session_id . $st);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Initialise the site secret (32 bytes: "z" to indicate format + 186-bit key in Base64 URL).
+ *
+ * Used during installation and saves as a datalist.
+ *
+ * Note: Old secrets were hex encoded.
+ *
+ * @return mixed The site secret hash or false
+ * @access private
+ * @todo Move to better file.
+ */
+function init_site_secret() {
+ $secret = 'z' . ElggCrypto::getRandomString(31);
+
+ if (datalist_set('__site_secret__', $secret)) {
+ return $secret;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Returns the site secret.
+ *
+ * Used to generate difficult to guess hashes for sessions and action tokens.
+ *
+ * @return string Site secret.
+ * @access private
+ * @todo Move to better file.
+ */
+function get_site_secret() {
+ $secret = datalist_get('__site_secret__');
+ if (!$secret) {
+ $secret = init_site_secret();
+ }
+
+ return $secret;
+}
+
+/**
+ * Get the strength of the site secret
+ *
+ * @return string "strong", "moderate", or "weak"
+ * @access private
+ */
+function _elgg_get_site_secret_strength() {
+ $secret = get_site_secret();
+ if ($secret[0] !== 'z') {
+ $rand_max = getrandmax();
+ if ($rand_max < pow(2, 16)) {
+ return 'weak';
+ }
+ if ($rand_max < pow(2, 32)) {
+ return 'moderate';
+ }
+ }
+ return 'strong';
+}
+
+/**
+ * Check if an action is registered and its script exists.
+ *
+ * @param string $action Action name
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_action_exists($action) {
+ global $CONFIG;
+
+ return (isset($CONFIG->actions[$action]) && file_exists($CONFIG->actions[$action]['file']));
+}
+
+/**
+ * Checks whether the request was requested via ajax
+ *
+ * @return bool whether page was requested via ajax
+ * @since 1.8.0
+ */
+function elgg_is_xhr() {
+ return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
+ && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ||
+ get_input('X-Requested-With') === 'XMLHttpRequest';
+}
+
+/**
+ * Catch calls to forward() in ajax request and force an exit.
+ *
+ * Forces response is json of the following form:
+ * <pre>
+ * {
+ * "current_url": "the.url.we/were/coming/from",
+ * "forward_url": "the.url.we/were/going/to",
+ * "system_messages": {
+ * "messages": ["msg1", "msg2", ...],
+ * "errors": ["err1", "err2", ...]
+ * },
+ * "status": -1 //or 0 for success if there are no error messages present
+ * }
+ * </pre>
+ * where "system_messages" is all message registers at the point of forwarding
+ *
+ * @param string $hook
+ * @param string $type
+ * @param string $reason
+ * @param array $params
+ * @return void
+ * @access private
+ */
+function ajax_forward_hook($hook, $type, $reason, $params) {
+ if (elgg_is_xhr()) {
+ // always pass the full structure to avoid boilerplate JS code.
+ $params = array(
+ 'output' => '',
+ 'status' => 0,
+ 'system_messages' => array(
+ 'error' => array(),
+ 'success' => array()
+ )
+ );
+
+ //grab any data echo'd in the action
+ $output = ob_get_clean();
+
+ //Avoid double-encoding in case data is json
+ $json = json_decode($output);
+ if (isset($json)) {
+ $params['output'] = $json;
+ } else {
+ $params['output'] = $output;
+ }
+
+ //Grab any system messages so we can inject them via ajax too
+ $system_messages = system_messages(NULL, "");
+
+ if (isset($system_messages['success'])) {
+ $params['system_messages']['success'] = $system_messages['success'];
+ }
+
+ if (isset($system_messages['error'])) {
+ $params['system_messages']['error'] = $system_messages['error'];
+ $params['status'] = -1;
+ }
+
+ // Check the requester can accept JSON responses, if not fall back to
+ // returning JSON in a plain-text response. Some libraries request
+ // JSON in an invisible iframe which they then read from the iframe,
+ // however some browsers will not accept the JSON MIME type.
+ if (stripos($_SERVER['HTTP_ACCEPT'], 'application/json') === FALSE) {
+ header("Content-type: text/plain");
+ } else {
+ header("Content-type: application/json");
+ }
+
+ echo json_encode($params);
+ exit;
+ }
+}
+
+/**
+ * Buffer all output echo'd directly in the action for inclusion in the returned JSON.
+ * @return void
+ * @access private
+ */
+function ajax_action_hook() {
+ if (elgg_is_xhr()) {
+ ob_start();
+ }
+}
+
+/**
+ * Initialize some ajaxy actions features
+ * @access private
+ */
+function actions_init() {
+ elgg_register_action('security/refreshtoken', '', 'public');
+
+ elgg_register_simplecache_view('js/languages/en');
+
+ elgg_register_plugin_hook_handler('action', 'all', 'ajax_action_hook');
+ elgg_register_plugin_hook_handler('forward', 'all', 'ajax_forward_hook');
+}
+
+elgg_register_event_handler('init', 'system', 'actions_init');
diff --git a/engine/lib/admin.php b/engine/lib/admin.php
new file mode 100644
index 000000000..f36f29668
--- /dev/null
+++ b/engine/lib/admin.php
@@ -0,0 +1,663 @@
+<?php
+/**
+ * Elgg admin functions.
+ *
+ * Admin menu items
+ * Elgg has a convenience function for adding menu items to the sidebar of the
+ * admin area. @see elgg_register_admin_menu_item()
+ *
+ * Admin pages
+ * Plugins no not need to provide their own page handler to add a page to the
+ * admin area. A view placed at admin/<section>/<subsection> can be access
+ * at http://example.org/admin/<section>/<subsection>. The title of the page
+ * will be elgg_echo('admin:<section>:<subsection>'). For an example of how to
+ * add a page to the admin area, see the diagnostics plugin.
+ *
+ * Admin notices
+ * System messages (success and error messages) are used in both the main site
+ * and the admin area. There is a special presistent message for the admin area
+ * called an admin notice. It should be used when a plugin requires an
+ * administrator to take an action. An example is the categories plugin
+ * requesting that the administrator set site categories after the plugin has
+ * been activated. @see elgg_add_admin_notice()
+ *
+ *
+ * @package Elgg.Core
+ * @subpackage Admin
+ */
+
+/**
+ * Get the admin users
+ *
+ * @param array $options Options array, @see elgg_get_entities() for parameters
+ *
+ * @return mixed Array of admin users or false on failure. If a count, returns int.
+ * @since 1.8.0
+ */
+function elgg_get_admins(array $options = array()) {
+ global $CONFIG;
+
+ if (isset($options['joins'])) {
+ if (!is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ }
+ $options['joins'][] = "join {$CONFIG->dbprefix}users_entity u on e.guid=u.guid";
+ } else {
+ $options['joins'] = array("join {$CONFIG->dbprefix}users_entity u on e.guid=u.guid");
+ }
+
+ if (isset($options['wheres'])) {
+ if (!is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ }
+ $options['wheres'][] = "u.admin = 'yes'";
+ } else {
+ $options['wheres'][] = "u.admin = 'yes'";
+ }
+
+ return elgg_get_entities($options);
+}
+
+/**
+ * Write a persistent message to the admin view.
+ * Useful to alert the admin to take a certain action.
+ * The id is a unique ID that can be cleared once the admin
+ * completes the action.
+ *
+ * eg: add_admin_notice('twitter_services_no_api',
+ * 'Before your users can use Twitter services on this site, you must set up
+ * the Twitter API key in the <a href="link">Twitter Services Settings</a>');
+ *
+ * @param string $id A unique ID that your plugin can remember
+ * @param string $message Body of the message
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_add_admin_notice($id, $message) {
+ if ($id && $message) {
+ if (elgg_admin_notice_exists($id)) {
+ return false;
+ }
+
+ // need to handle when no one is logged in
+ $old_ia = elgg_set_ignore_access(true);
+
+ $admin_notice = new ElggObject();
+ $admin_notice->subtype = 'admin_notice';
+ // admins can see ACCESS_PRIVATE but no one else can.
+ $admin_notice->access_id = ACCESS_PRIVATE;
+ $admin_notice->admin_notice_id = $id;
+ $admin_notice->description = $message;
+
+ $result = $admin_notice->save();
+
+ elgg_set_ignore_access($old_ia);
+
+ return (bool)$result;
+ }
+
+ return false;
+}
+
+/**
+ * Remove an admin notice by ID.
+ *
+ * eg In actions/twitter_service/save_settings:
+ * if (is_valid_twitter_api_key()) {
+ * delete_admin_notice('twitter_services_no_api');
+ * }
+ *
+ * @param string $id The unique ID assigned in add_admin_notice()
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_delete_admin_notice($id) {
+ if (!$id) {
+ return FALSE;
+ }
+ $result = TRUE;
+ $notices = elgg_get_entities_from_metadata(array(
+ 'metadata_name' => 'admin_notice_id',
+ 'metadata_value' => $id
+ ));
+
+ if ($notices) {
+ // in case a bad plugin adds many, let it remove them all at once.
+ foreach ($notices as $notice) {
+ $result = ($result && $notice->delete());
+ }
+ return $result;
+ }
+ return FALSE;
+}
+
+/**
+ * Get admin notices. An admin must be logged in since the notices are private.
+ *
+ * @param int $limit Limit
+ *
+ * @return array Array of admin notices
+ * @since 1.8.0
+ */
+function elgg_get_admin_notices($limit = 10) {
+ return elgg_get_entities_from_metadata(array(
+ 'type' => 'object',
+ 'subtype' => 'admin_notice',
+ 'limit' => $limit
+ ));
+}
+
+/**
+ * Check if an admin notice is currently active.
+ *
+ * @param string $id The unique ID used to register the notice.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_admin_notice_exists($id) {
+ $old_ia = elgg_set_ignore_access(true);
+ $notice = elgg_get_entities_from_metadata(array(
+ 'type' => 'object',
+ 'subtype' => 'admin_notice',
+ 'metadata_name_value_pair' => array('name' => 'admin_notice_id', 'value' => $id)
+ ));
+ elgg_set_ignore_access($old_ia);
+
+ return ($notice) ? TRUE : FALSE;
+}
+
+/**
+ * Add an admin area section or child section.
+ * This is a wrapper for elgg_register_menu_item().
+ *
+ * Used in conjuction with http://elgg.org/admin/section_id/child_section style
+ * page handler. See the documentation at the top of this file for more details
+ * on that.
+ *
+ * The text of the menu item is obtained from elgg_echo(admin:$parent_id:$menu_id)
+ *
+ * This function handles registering the parent if it has not been registered.
+ *
+ * @param string $section The menu section to add to
+ * @param string $menu_id The unique ID of section
+ * @param string $parent_id If a child section, the parent section id
+ * @param int $priority The menu item priority
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_admin_menu_item($section, $menu_id, $parent_id = NULL, $priority = 100) {
+
+ // make sure parent is registered
+ if ($parent_id && !elgg_is_menu_item_registered('page', $parent_id)) {
+ elgg_register_admin_menu_item($section, $parent_id);
+ }
+
+ // in the admin section parents never have links
+ if ($parent_id) {
+ $href = "admin/$parent_id/$menu_id";
+ } else {
+ $href = NULL;
+ }
+
+ $name = $menu_id;
+ if ($parent_id) {
+ $name = "$parent_id:$name";
+ }
+
+ return elgg_register_menu_item('page', array(
+ 'name' => $name,
+ 'href' => $href,
+ 'text' => elgg_echo("admin:$name"),
+ 'context' => 'admin',
+ 'parent_name' => $parent_id,
+ 'priority' => $priority,
+ 'section' => $section
+ ));
+}
+
+/**
+ * Initialize the admin backend.
+ * @return void
+ * @access private
+ */
+function admin_init() {
+ elgg_register_action('admin/user/ban', '', 'admin');
+ elgg_register_action('admin/user/unban', '', 'admin');
+ elgg_register_action('admin/user/delete', '', 'admin');
+ elgg_register_action('admin/user/resetpassword', '', 'admin');
+ elgg_register_action('admin/user/makeadmin', '', 'admin');
+ elgg_register_action('admin/user/removeadmin', '', 'admin');
+
+ elgg_register_action('admin/site/update_basic', '', 'admin');
+ elgg_register_action('admin/site/update_advanced', '', 'admin');
+ elgg_register_action('admin/site/flush_cache', '', 'admin');
+ elgg_register_action('admin/site/unlock_upgrade', '', 'admin');
+ elgg_register_action('admin/site/regenerate_secret', '', 'admin');
+
+ elgg_register_action('admin/menu/save', '', 'admin');
+
+ elgg_register_action('admin/delete_admin_notice', '', 'admin');
+
+ elgg_register_action('profile/fields/reset', '', 'admin');
+ elgg_register_action('profile/fields/add', '', 'admin');
+ elgg_register_action('profile/fields/edit', '', 'admin');
+ elgg_register_action('profile/fields/delete', '', 'admin');
+ elgg_register_action('profile/fields/reorder', '', 'admin');
+
+ elgg_register_simplecache_view('css/admin');
+ elgg_register_simplecache_view('js/admin');
+ $url = elgg_get_simplecache_url('js', 'admin');
+ elgg_register_js('elgg.admin', $url);
+ elgg_register_js('jquery.jeditable', 'vendors/jquery/jquery.jeditable.mini.js');
+
+ // administer
+ // dashboard
+ elgg_register_menu_item('page', array(
+ 'name' => 'dashboard',
+ 'href' => 'admin/dashboard',
+ 'text' => elgg_echo('admin:dashboard'),
+ 'context' => 'admin',
+ 'priority' => 10,
+ 'section' => 'administer'
+ ));
+ // statistics
+ elgg_register_admin_menu_item('administer', 'statistics', null, 20);
+ elgg_register_admin_menu_item('administer', 'overview', 'statistics');
+ elgg_register_admin_menu_item('administer', 'server', 'statistics');
+
+ // users
+ elgg_register_admin_menu_item('administer', 'users', null, 20);
+ elgg_register_admin_menu_item('administer', 'online', 'users', 10);
+ elgg_register_admin_menu_item('administer', 'admins', 'users', 20);
+ elgg_register_admin_menu_item('administer', 'newest', 'users', 30);
+ elgg_register_admin_menu_item('administer', 'add', 'users', 40);
+
+ // configure
+ // plugins
+ elgg_register_menu_item('page', array(
+ 'name' => 'plugins',
+ 'href' => 'admin/plugins',
+ 'text' => elgg_echo('admin:plugins'),
+ 'context' => 'admin',
+ 'priority' => 75,
+ 'section' => 'configure'
+ ));
+
+ // settings
+ elgg_register_admin_menu_item('configure', 'appearance', null, 50);
+ elgg_register_admin_menu_item('configure', 'settings', null, 100);
+ elgg_register_admin_menu_item('configure', 'basic', 'settings', 10);
+ elgg_register_admin_menu_item('configure', 'advanced', 'settings', 20);
+ elgg_register_admin_menu_item('configure', 'advanced/site_secret', 'settings', 25);
+ elgg_register_admin_menu_item('configure', 'menu_items', 'appearance', 30);
+ elgg_register_admin_menu_item('configure', 'profile_fields', 'appearance', 40);
+ // default widgets is added via an event handler elgg_default_widgets_init() in widgets.php
+ // because it requires additional setup.
+
+ // plugin settings are added in elgg_admin_add_plugin_settings_menu() via the admin page handler
+ // for performance reasons.
+
+ // we want plugin settings menu items to be sorted alphabetical
+ if (elgg_in_context('admin')) {
+ elgg_register_plugin_hook_handler('prepare', 'menu:page', 'elgg_admin_sort_page_menu');
+ }
+
+ if (elgg_is_admin_logged_in()) {
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'administration',
+ 'href' => 'admin',
+ 'text' => elgg_view_icon('settings') . elgg_echo('admin'),
+ 'priority' => 100,
+ 'section' => 'alt',
+ ));
+ }
+
+ // widgets
+ $widgets = array('online_users', 'new_users', 'content_stats', 'admin_welcome', 'control_panel');
+ foreach ($widgets as $widget) {
+ elgg_register_widget_type(
+ $widget,
+ elgg_echo("admin:widget:$widget"),
+ elgg_echo("admin:widget:$widget:help"),
+ 'admin'
+ );
+ }
+
+ // automatic adding of widgets for admin
+ elgg_register_event_handler('make_admin', 'user', 'elgg_add_admin_widgets');
+
+ elgg_register_page_handler('admin', 'admin_page_handler');
+ elgg_register_page_handler('admin_plugin_screenshot', 'admin_plugin_screenshot_page_handler');
+ elgg_register_page_handler('admin_plugin_text_file', 'admin_markdown_page_handler');
+}
+
+/**
+ * Create the plugin settings page menu.
+ *
+ * This is done in a separate function called from the admin
+ * page handler because of performance concerns.
+ *
+ * @return void
+ * @access private
+ * @since 1.8.0
+ */
+function elgg_admin_add_plugin_settings_menu() {
+
+ $active_plugins = elgg_get_plugins('active');
+ if (!$active_plugins) {
+ // nothing added because no items
+ return;
+ }
+
+ foreach ($active_plugins as $plugin) {
+ $plugin_id = $plugin->getID();
+ $settings_view_old = 'settings/' . $plugin_id . '/edit';
+ $settings_view_new = 'plugins/' . $plugin_id . '/settings';
+ if (elgg_view_exists($settings_view_new) || elgg_view_exists($settings_view_old)) {
+ elgg_register_menu_item('page', array(
+ 'name' => $plugin_id,
+ 'href' => "admin/plugin_settings/$plugin_id",
+ 'text' => $plugin->getManifest()->getName(),
+ 'parent_name' => 'settings',
+ 'context' => 'admin',
+ 'section' => 'configure',
+ ));
+ }
+ }
+}
+
+/**
+ * Sort the plugin settings menu items
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return
+ * @param array $params
+ *
+ * @return void
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_admin_sort_page_menu($hook, $type, $return, $params) {
+ $configure_items = $return['configure'];
+ /* @var ElggMenuItem[] $configure_items */
+ foreach ($configure_items as $menu_item) {
+ if ($menu_item->getName() == 'settings') {
+ $settings = $menu_item;
+ }
+ }
+
+ // keep the basic and advanced settings at the top
+ /* @var ElggMenuItem $settings */
+ $children = $settings->getChildren();
+ $site_settings = array_splice($children, 0, 2);
+ usort($children, array('ElggMenuBuilder', 'compareByText'));
+ array_splice($children, 0, 0, $site_settings);
+ $settings->setChildren($children);
+}
+
+/**
+ * Handles any set up required for administration pages
+ *
+ * @return void
+ * @access private
+ */
+function admin_pagesetup() {
+ if (elgg_in_context('admin')) {
+ $url = elgg_get_simplecache_url('css', 'admin');
+ elgg_register_css('elgg.admin', $url);
+ elgg_load_css('elgg.admin');
+ elgg_unregister_css('elgg');
+
+ // setup footer menu
+ elgg_register_menu_item('admin_footer', array(
+ 'name' => 'faq',
+ 'text' => elgg_echo('admin:footer:faq'),
+ 'href' => 'http://docs.elgg.org/wiki/Category:Administration_FAQ',
+ ));
+
+ elgg_register_menu_item('admin_footer', array(
+ 'name' => 'manual',
+ 'text' => elgg_echo('admin:footer:manual'),
+ 'href' => 'http://docs.elgg.org/wiki/Administration_Manual',
+ ));
+
+ elgg_register_menu_item('admin_footer', array(
+ 'name' => 'community_forums',
+ 'text' => elgg_echo('admin:footer:community_forums'),
+ 'href' => 'http://community.elgg.org/groups/all/',
+ ));
+
+ elgg_register_menu_item('admin_footer', array(
+ 'name' => 'blog',
+ 'text' => elgg_echo('admin:footer:blog'),
+ 'href' => 'http://blog.elgg.org/',
+ ));
+ }
+}
+
+/**
+ * Handle admin pages. Expects corresponding views as admin/section/subsection
+ *
+ * @param array $page Array of pages
+ *
+ * @return bool
+ * @access private
+ */
+function admin_page_handler($page) {
+
+ admin_gatekeeper();
+ elgg_admin_add_plugin_settings_menu();
+ elgg_set_context('admin');
+
+ elgg_unregister_css('elgg');
+ elgg_load_js('elgg.admin');
+ elgg_load_js('jquery.jeditable');
+
+ // default to dashboard
+ if (!isset($page[0]) || empty($page[0])) {
+ $page = array('dashboard');
+ }
+
+ // was going to fix this in the page_handler() function but
+ // it's commented to explicitly return a string if there's a trailing /
+ if (empty($page[count($page) - 1])) {
+ array_pop($page);
+ }
+
+ $vars = array('page' => $page);
+
+ // special page for plugin settings since we create the form for them
+ if ($page[0] == 'plugin_settings') {
+ if (isset($page[1]) && (elgg_view_exists("settings/{$page[1]}/edit") ||
+ elgg_view_exists("plugins/{$page[1]}/settings"))) {
+
+ $view = 'admin/plugin_settings';
+ $plugin = elgg_get_plugin_from_id($page[1]);
+ $vars['plugin'] = $plugin;
+
+ $title = elgg_echo("admin:{$page[0]}");
+ } else {
+ forward('', '404');
+ }
+ } else {
+ $view = 'admin/' . implode('/', $page);
+ $title = elgg_echo("admin:{$page[0]}");
+ if (count($page) > 1) {
+ $title .= ' : ' . elgg_echo('admin:' . implode(':', $page));
+ }
+ }
+
+ // gets content and prevents direct access to 'components' views
+ if ($page[0] == 'components' || !($content = elgg_view($view, $vars))) {
+ $title = elgg_echo('admin:unknown_section');
+ $content = elgg_echo('admin:unknown_section');
+ }
+
+ $body = elgg_view_layout('admin', array('content' => $content, 'title' => $title));
+ echo elgg_view_page($title, $body, 'admin');
+ return true;
+}
+
+/**
+ * Serves up screenshots for plugins from
+ * admin_plugin_screenshot/<plugin_id>/<size>/<ss_name>.<ext>
+ *
+ * @param array $pages The pages array
+ * @return bool
+ * @access private
+ */
+function admin_plugin_screenshot_page_handler($pages) {
+ // only admins can use this for security
+ admin_gatekeeper();
+
+ $plugin_id = elgg_extract(0, $pages);
+ // only thumbnail or full.
+ $size = elgg_extract(1, $pages, 'thumbnail');
+
+ // the rest of the string is the filename
+ $filename_parts = array_slice($pages, 2);
+ $filename = implode('/', $filename_parts);
+ $filename = sanitise_filepath($filename, false);
+
+ $plugin = new ElggPlugin($plugin_id);
+ if (!$plugin) {
+ $file = elgg_get_root_path() . '_graphics/icons/default/medium.png';
+ } else {
+ $file = $plugin->getPath() . $filename;
+ if (!file_exists($file)) {
+ $file = elgg_get_root_path() . '_graphics/icons/default/medium.png';
+ }
+ }
+
+ header("Content-type: image/jpeg");
+
+ // resize to 100x100 for thumbnails
+ switch ($size) {
+ case 'thumbnail':
+ echo get_resized_image_from_existing_file($file, 100, 100, true);
+ break;
+
+ case 'full':
+ default:
+ echo file_get_contents($file);
+ break;
+ }
+ return true;
+}
+
+/**
+ * Formats and serves out markdown files from plugins.
+ *
+ * URLs in format like admin_plugin_text_file/<plugin_id>/filename.ext
+ *
+ * The only valid files are:
+ * * README.txt
+ * * CHANGES.txt
+ * * INSTALL.txt
+ * * COPYRIGHT.txt
+ * * LICENSE.txt
+ *
+ * @param array $pages
+ * @return bool
+ * @access private
+ */
+function admin_markdown_page_handler($pages) {
+ admin_gatekeeper();
+
+ elgg_set_context('admin');
+
+ elgg_unregister_css('elgg');
+ elgg_load_js('elgg.admin');
+ elgg_load_js('jquery.jeditable');
+ elgg_load_library('elgg:markdown');
+
+ $plugin_id = elgg_extract(0, $pages);
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ $filename = elgg_extract(1, $pages);
+
+ $error = false;
+ if (!$plugin) {
+ $error = elgg_echo('admin:plugins:markdown:unknown_plugin');
+ $body = elgg_view_layout('admin', array('content' => $error, 'title' => $error));
+ echo elgg_view_page($error, $body, 'admin');
+ return true;
+ }
+
+ $text_files = $plugin->getAvailableTextFiles();
+
+ if (!array_key_exists($filename, $text_files)) {
+ $error = elgg_echo('admin:plugins:markdown:unknown_file');
+ }
+
+ $file = $text_files[$filename];
+ $file_contents = file_get_contents($file);
+
+ if (!$file_contents) {
+ $error = elgg_echo('admin:plugins:markdown:unknown_file');
+ }
+
+ if ($error) {
+ $title = $error;
+ $body = elgg_view_layout('admin', array('content' => $error, 'title' => $title));
+ echo elgg_view_page($title, $body, 'admin');
+ return true;
+ }
+
+ $title = $plugin->getManifest()->getName() . ": $filename";
+ $text = Markdown($file_contents);
+
+ $body = elgg_view_layout('admin', array(
+ // setting classes here because there's no way to pass classes
+ // to the layout
+ 'content' => '<div class="elgg-markdown">' . $text . '</div>',
+ 'title' => $title
+ ));
+
+ echo elgg_view_page($title, $body, 'admin');
+ return true;
+}
+
+/**
+ * Adds default admin widgets to the admin dashboard.
+ *
+ * @param string $event
+ * @param string $type
+ * @param ElggUser $user
+ *
+ * @return null|true
+ * @access private
+ */
+function elgg_add_admin_widgets($event, $type, $user) {
+ elgg_set_ignore_access(true);
+
+ // check if the user already has widgets
+ if (elgg_get_widgets($user->getGUID(), 'admin')) {
+ return true;
+ }
+
+ // In the form column => array of handlers in order, top to bottom
+ $adminWidgets = array(
+ 1 => array('control_panel', 'admin_welcome'),
+ 2 => array('online_users', 'new_users', 'content_stats'),
+ );
+
+ foreach ($adminWidgets as $column => $handlers) {
+ foreach ($handlers as $position => $handler) {
+ $guid = elgg_create_widget($user->getGUID(), $handler, 'admin');
+ if ($guid) {
+ $widget = get_entity($guid);
+ /* @var ElggWidget $widget */
+ $widget->move($column, $position);
+ }
+ }
+ }
+ elgg_set_ignore_access(false);
+}
+
+elgg_register_event_handler('init', 'system', 'admin_init');
+elgg_register_event_handler('pagesetup', 'system', 'admin_pagesetup', 1000);
diff --git a/engine/lib/annotations.php b/engine/lib/annotations.php
new file mode 100644
index 000000000..5e9b530de
--- /dev/null
+++ b/engine/lib/annotations.php
@@ -0,0 +1,618 @@
+<?php
+/**
+ * Elgg annotations
+ * Functions to manage object annotations.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+/**
+ * Convert a database row to a new ElggAnnotation
+ *
+ * @param stdClass $row Db row result object
+ *
+ * @return ElggAnnotation
+ * @access private
+ */
+function row_to_elggannotation($row) {
+ if (!($row instanceof stdClass)) {
+ // @todo should throw in this case?
+ return $row;
+ }
+
+ return new ElggAnnotation($row);
+}
+
+/**
+ * Get a specific annotation by its id.
+ * If you want multiple annotation objects, use
+ * {@link elgg_get_annotations()}.
+ *
+ * @param int $id The id of the annotation object being retrieved.
+ *
+ * @return ElggAnnotation|false
+ */
+function elgg_get_annotation_from_id($id) {
+ return elgg_get_metastring_based_object_from_id($id, 'annotations');
+}
+
+/**
+ * Deletes an annotation using its ID.
+ *
+ * @param int $id The annotation ID to delete.
+ * @return bool
+ */
+function elgg_delete_annotation_by_id($id) {
+ $annotation = elgg_get_annotation_from_id($id);
+ if (!$annotation) {
+ return false;
+ }
+ return $annotation->delete();
+}
+
+/**
+ * Create a new annotation.
+ *
+ * @param int $entity_guid Entity Guid
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value (default is auto detection)
+ * @param int $owner_guid Owner of annotation (default is logged in user)
+ * @param int $access_id Access level of annotation
+ *
+ * @return int|bool id on success or false on failure
+ */
+function create_annotation($entity_guid, $name, $value, $value_type = '',
+$owner_guid = 0, $access_id = ACCESS_PRIVATE) {
+ global $CONFIG;
+
+ $result = false;
+
+ $entity_guid = (int)$entity_guid;
+ //$name = sanitise_string(trim($name));
+ //$value = sanitise_string(trim($value));
+ $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
+
+ $owner_guid = (int)$owner_guid;
+ if ($owner_guid == 0) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $access_id = (int)$access_id;
+ $time = time();
+
+ // Add the metastring
+ $value = add_metastring($value);
+ if (!$value) {
+ return false;
+ }
+
+ $name = add_metastring($name);
+ if (!$name) {
+ return false;
+ }
+
+ $entity = get_entity($entity_guid);
+
+ if (elgg_trigger_event('annotate', $entity->type, $entity)) {
+ // If ok then add it
+ $result = insert_data("INSERT into {$CONFIG->dbprefix}annotations
+ (entity_guid, name_id, value_id, value_type, owner_guid, time_created, access_id) VALUES
+ ($entity_guid,'$name',$value,'$value_type', $owner_guid, $time, $access_id)");
+
+ if ($result !== false) {
+ $obj = elgg_get_annotation_from_id($result);
+ if (elgg_trigger_event('create', 'annotation', $obj)) {
+ return $result;
+ } else {
+ // plugin returned false to reject annotation
+ elgg_delete_annotation_by_id($result);
+ return FALSE;
+ }
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Update an annotation.
+ *
+ * @param int $annotation_id Annotation ID
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid Owner of annotation
+ * @param int $access_id Access level of annotation
+ *
+ * @return bool
+ */
+function update_annotation($annotation_id, $name, $value, $value_type, $owner_guid, $access_id) {
+ global $CONFIG;
+
+ $annotation_id = (int)$annotation_id;
+ $name = (trim($name));
+ $value = (trim($value));
+ $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
+
+ $owner_guid = (int)$owner_guid;
+ if ($owner_guid == 0) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $access_id = (int)$access_id;
+
+ $access = get_access_sql_suffix();
+
+ // Add the metastring
+ $value = add_metastring($value);
+ if (!$value) {
+ return false;
+ }
+
+ $name = add_metastring($name);
+ if (!$name) {
+ return false;
+ }
+
+ // If ok then add it
+ $result = update_data("UPDATE {$CONFIG->dbprefix}annotations
+ set name_id='$name', value_id='$value', value_type='$value_type', access_id=$access_id, owner_guid=$owner_guid
+ where id=$annotation_id and $access");
+
+ if ($result !== false) {
+ // @todo add plugin hook that sends old and new annotation information before db access
+ $obj = elgg_get_annotation_from_id($annotation_id);
+ elgg_trigger_event('update', 'annotation', $obj);
+ }
+
+ return $result;
+}
+
+/**
+ * Returns annotations. Accepts all elgg_get_entities() options for entity
+ * restraints.
+ *
+ * @see elgg_get_entities
+ *
+ * @param array $options Array in format:
+ *
+ * annotation_names => NULL|ARR Annotation names
+ * annotation_values => NULL|ARR Annotation values
+ * annotation_ids => NULL|ARR annotation ids
+ * annotation_case_sensitive => BOOL Overall Case sensitive
+ * annotation_owner_guids => NULL|ARR guids for annotation owners
+ * annotation_created_time_lower => INT Lower limit for created time.
+ * annotation_created_time_upper => INT Upper limit for created time.
+ * annotation_calculation => STR Perform the MySQL function on the annotation values returned.
+ * Do not confuse this "annotation_calculation" option with the
+ * "calculation" option to elgg_get_entities_from_annotation_calculation().
+ * The "annotation_calculation" option causes this function to
+ * return the result of performing a mathematical calculation on
+ * all annotations that match the query instead of ElggAnnotation
+ * objects.
+ * See the docs for elgg_get_entities_from_annotation_calculation()
+ * for the proper use of the "calculation" option.
+ *
+ *
+ * @return ElggAnnotation[]|mixed
+ * @since 1.8.0
+ */
+function elgg_get_annotations(array $options = array()) {
+
+ // @todo remove support for count shortcut - see #4393
+ if (isset($options['__egefac']) && $options['__egefac']) {
+ unset($options['__egefac']);
+ } else {
+ // support shortcut of 'count' => true for 'annotation_calculation' => 'count'
+ if (isset($options['count']) && $options['count']) {
+ $options['annotation_calculation'] = 'count';
+ unset($options['count']);
+ }
+ }
+
+ $options['metastring_type'] = 'annotations';
+ return elgg_get_metastring_based_objects($options);
+}
+
+/**
+ * Deletes annotations based on $options.
+ *
+ * @warning Unlike elgg_get_annotations() this will not accept an empty options array!
+ * This requires at least one constraint: annotation_owner_guid(s),
+ * annotation_name(s), annotation_value(s), or guid(s) must be set.
+ *
+ * @param array $options An options array. {@See elgg_get_annotations()}
+ * @return bool|null true on success, false on failure, null if no annotations to delete.
+ * @since 1.8.0
+ */
+function elgg_delete_annotations(array $options) {
+ if (!elgg_is_valid_options_for_batch_operation($options, 'annotations')) {
+ return false;
+ }
+
+ $options['metastring_type'] = 'annotations';
+ return elgg_batch_metastring_based_objects($options, 'elgg_batch_delete_callback', false);
+}
+
+/**
+ * Disables annotations based on $options.
+ *
+ * @warning Unlike elgg_get_annotations() this will not accept an empty options array!
+ *
+ * @param array $options An options array. {@See elgg_get_annotations()}
+ * @return bool|null true on success, false on failure, null if no annotations disabled.
+ * @since 1.8.0
+ */
+function elgg_disable_annotations(array $options) {
+ if (!elgg_is_valid_options_for_batch_operation($options, 'annotations')) {
+ return false;
+ }
+
+ // if we can see hidden (disabled) we need to use the offset
+ // otherwise we risk an infinite loop if there are more than 50
+ $inc_offset = access_get_show_hidden_status();
+
+ $options['metastring_type'] = 'annotations';
+ return elgg_batch_metastring_based_objects($options, 'elgg_batch_disable_callback', $inc_offset);
+}
+
+/**
+ * Enables annotations based on $options.
+ *
+ * @warning Unlike elgg_get_annotations() this will not accept an empty options array!
+ *
+ * @warning In order to enable annotations, you must first use
+ * {@link access_show_hidden_entities()}.
+ *
+ * @param array $options An options array. {@See elgg_get_annotations()}
+ * @return bool|null true on success, false on failure, null if no metadata enabled.
+ * @since 1.8.0
+ */
+function elgg_enable_annotations(array $options) {
+ if (!$options || !is_array($options)) {
+ return false;
+ }
+
+ $options['metastring_type'] = 'annotations';
+ return elgg_batch_metastring_based_objects($options, 'elgg_batch_enable_callback');
+}
+
+/**
+ * Returns a rendered list of annotations with pagination.
+ *
+ * @param array $options Annotation getter and display options.
+ * {@see elgg_get_annotations()} and {@see elgg_list_entities()}.
+ *
+ * @return string The list of entities
+ * @since 1.8.0
+ */
+function elgg_list_annotations($options) {
+ $defaults = array(
+ 'limit' => 25,
+ 'offset' => (int) max(get_input('annoff', 0), 0),
+ );
+
+ $options = array_merge($defaults, $options);
+
+ return elgg_list_entities($options, 'elgg_get_annotations', 'elgg_view_annotation_list');
+}
+
+/**
+ * Entities interfaces
+ */
+
+/**
+ * Returns entities based upon annotations. Also accepts all options available
+ * to elgg_get_entities() and elgg_get_entities_from_metadata().
+ *
+ * Entity creation time is selected as maxtime. To sort based upon
+ * this, pass 'order_by' => 'maxtime asc' || 'maxtime desc'
+ *
+ * @see elgg_get_entities
+ * @see elgg_get_entities_from_metadata
+ *
+ * @param array $options Array in format:
+ *
+ * annotation_names => NULL|ARR annotations names
+ *
+ * annotation_values => NULL|ARR annotations values
+ *
+ * annotation_name_value_pairs => NULL|ARR (name = 'name', value => 'value',
+ * 'operator' => '=', 'case_sensitive' => TRUE) entries.
+ * Currently if multiple values are sent via an array (value => array('value1', 'value2')
+ * the pair's operator will be forced to "IN".
+ *
+ * annotation_name_value_pairs_operator => NULL|STR The operator to use for combining
+ * (name = value) OPERATOR (name = value); default AND
+ *
+ * annotation_case_sensitive => BOOL Overall Case sensitive
+ *
+ * order_by_annotation => NULL|ARR (array('name' => 'annotation_text1', 'direction' => ASC|DESC,
+ * 'as' => text|integer),
+ *
+ * Also supports array('name' => 'annotation_text1')
+ *
+ * annotation_owner_guids => NULL|ARR guids for annotaiton owners
+ *
+ * @return mixed If count, int. If not count, array. false on errors.
+ * @since 1.7.0
+ */
+function elgg_get_entities_from_annotations(array $options = array()) {
+ $defaults = array(
+ 'annotation_names' => ELGG_ENTITIES_ANY_VALUE,
+ 'annotation_values' => ELGG_ENTITIES_ANY_VALUE,
+ 'annotation_name_value_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'annotation_name_value_pairs_operator' => 'AND',
+ 'annotation_case_sensitive' => TRUE,
+ 'order_by_annotation' => array(),
+
+ 'annotation_created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'annotation_created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'annotation_owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'order_by' => 'maxtime desc',
+ 'group_by' => 'a.entity_guid'
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('annotation_name', 'annotation_value',
+ 'annotation_name_value_pair', 'annotation_owner_guid');
+
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+ $options = elgg_entities_get_metastrings_options('annotation', $options);
+
+ if (!$options) {
+ return false;
+ }
+
+ // special sorting for annotations
+ //@todo overrides other sorting
+ $options['selects'][] = "max(n_table.time_created) as maxtime";
+ $options['group_by'] = 'n_table.entity_guid';
+
+ $time_wheres = elgg_get_entity_time_where_sql('a', $options['annotation_created_time_upper'],
+ $options['annotation_created_time_lower']);
+
+ if ($time_wheres) {
+ $options['wheres'] = array_merge($options['wheres'], $time_wheres);
+ }
+
+ return elgg_get_entities_from_metadata($options);
+}
+
+/**
+ * Returns a viewable list of entities from annotations.
+ *
+ * @param array $options Options array
+ *
+ * @see elgg_get_entities_from_annotations()
+ * @see elgg_list_entities()
+ *
+ * @return string
+ */
+function elgg_list_entities_from_annotations($options = array()) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_annotations');
+}
+
+/**
+ * Get entities ordered by a mathematical calculation on annotation values
+ *
+ * @param array $options An options array:
+ * 'calculation' => The calculation to use. Must be a valid MySQL function.
+ * Defaults to sum. Result selected as 'annotation_calculation'.
+ * Don't confuse this "calculation" option with the
+ * "annotation_calculation" option to elgg_get_annotations().
+ * This "calculation" option is applied to each entity's set of
+ * annotations and is selected as annotation_calculation for that row.
+ * See the docs for elgg_get_annotations() for proper use of the
+ * "annotation_calculation" option.
+ * 'order_by' => The order for the sorting. Defaults to 'annotation_calculation desc'.
+ * 'annotation_names' => The names of annotations on the entity.
+ * 'annotation_values' => The values of annotations on the entity.
+ *
+ * 'metadata_names' => The name of metadata on the entity.
+ * 'metadata_values' => The value of metadata on the entitiy.
+ *
+ * @return mixed If count, int. If not count, array. false on errors.
+ */
+function elgg_get_entities_from_annotation_calculation($options) {
+ $db_prefix = elgg_get_config('dbprefix');
+ $defaults = array(
+ 'calculation' => 'sum',
+ 'order_by' => 'annotation_calculation desc'
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $function = sanitize_string(elgg_extract('calculation', $options, 'sum', false));
+
+ // you must cast this as an int or it sorts wrong.
+ $options['selects'][] = 'e.*';
+ $options['selects'][] = "$function(cast(a_msv.string as signed)) as annotation_calculation";
+
+ // need our own join to get the values because the lower level functions don't
+ // add all the joins if it's a different callback.
+ $options['joins'][] = "JOIN {$db_prefix}metastrings a_msv ON n_table.value_id = a_msv.id";
+
+ // don't need access control because it's taken care of by elgg_get_annotations.
+ $options['group_by'] = 'n_table.entity_guid';
+
+ $options['callback'] = 'entity_row_to_elggstar';
+
+ // see #4393
+ // @todo remove after the 'count' shortcut is removed from elgg_get_annotations()
+ $options['__egefac'] = true;
+
+ return elgg_get_annotations($options);
+}
+
+/**
+ * List entities from an annotation calculation.
+ *
+ * @see elgg_get_entities_from_annotation_calculation()
+ *
+ * @param array $options An options array.
+ *
+ * @return string
+ */
+function elgg_list_entities_from_annotation_calculation($options) {
+ $defaults = array(
+ 'calculation' => 'sum',
+ 'order_by' => 'annotation_calculation desc'
+ );
+ $options = array_merge($defaults, $options);
+
+ return elgg_list_entities($options, 'elgg_get_entities_from_annotation_calculation');
+}
+
+/**
+ * Export the annotations for the specified entity
+ *
+ * @param string $hook 'export'
+ * @param string $type 'all'
+ * @param mixed $returnvalue Default return value
+ * @param mixed $params Parameters determining what annotations to export
+ *
+ * @elgg_plugin_hook export all
+ *
+ * @return array
+ * @throws InvalidParameterException
+ * @access private
+ */
+function export_annotation_plugin_hook($hook, $type, $returnvalue, $params) {
+ // Sanity check values
+ if ((!is_array($params)) && (!isset($params['guid']))) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
+ }
+
+ if (!is_array($returnvalue)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
+ }
+
+ $guid = (int)$params['guid'];
+ $options = array('guid' => $guid, 'limit' => 0);
+ if (isset($params['name'])) {
+ $options['annotation_name'] = $params['name'];
+ }
+
+ $result = elgg_get_annotations($options);
+
+ if ($result) {
+ foreach ($result as $r) {
+ $returnvalue[] = $r->export();
+ }
+ }
+
+ return $returnvalue;
+}
+
+/**
+ * Get the URL for this item of metadata, by default this links to the
+ * export handler in the current view.
+ *
+ * @param int $id Annotation id
+ *
+ * @return mixed
+ */
+function get_annotation_url($id) {
+ $id = (int)$id;
+
+ if ($extender = elgg_get_annotation_from_id($id)) {
+ return get_extender_url($extender);
+ }
+ return false;
+}
+
+/**
+ * Check to see if a user has already created an annotation on an object
+ *
+ * @param int $entity_guid Entity guid
+ * @param string $annotation_type Type of annotation
+ * @param int $owner_guid Defaults to logged in user.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_annotation_exists($entity_guid, $annotation_type, $owner_guid = NULL) {
+ global $CONFIG;
+
+ if (!$owner_guid && !($owner_guid = elgg_get_logged_in_user_guid())) {
+ return FALSE;
+ }
+
+ $entity_guid = sanitize_int($entity_guid);
+ $owner_guid = sanitize_int($owner_guid);
+ $annotation_type = sanitize_string($annotation_type);
+
+ $sql = "SELECT a.id FROM {$CONFIG->dbprefix}annotations a" .
+ " JOIN {$CONFIG->dbprefix}metastrings m ON a.name_id = m.id" .
+ " WHERE a.owner_guid = $owner_guid AND a.entity_guid = $entity_guid" .
+ " AND m.string = '$annotation_type'";
+
+ if (get_data_row($sql)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Return the URL for a comment
+ *
+ * @param ElggAnnotation $comment The comment object
+ * @return string
+ * @access private
+ */
+function elgg_comment_url_handler(ElggAnnotation $comment) {
+ $entity = $comment->getEntity();
+ if ($entity) {
+ return $entity->getURL() . '#item-annotation-' . $comment->id;
+ }
+ return "";
+}
+
+/**
+ * Register an annotation url handler.
+ *
+ * @param string $extender_name The name, default 'all'.
+ * @param string $function_name The function.
+ *
+ * @return string
+ */
+function elgg_register_annotation_url_handler($extender_name = "all", $function_name) {
+ return elgg_register_extender_url_handler('annotation', $extender_name, $function_name);
+}
+
+/**
+ * Register annotation unit tests
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $value
+ * @param array $params
+ * @return array
+ * @access private
+ */
+function annotations_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/annotations.php';
+ return $value;
+}
+
+/**
+ * Initialize the annotation library
+ * @access private
+ */
+function elgg_annotations_init() {
+ elgg_register_annotation_url_handler('generic_comment', 'elgg_comment_url_handler');
+
+ elgg_register_plugin_hook_handler("export", "all", "export_annotation_plugin_hook", 2);
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'annotations_test');
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_annotations_init');
diff --git a/engine/lib/cache.php b/engine/lib/cache.php
new file mode 100644
index 000000000..3116c1a9b
--- /dev/null
+++ b/engine/lib/cache.php
@@ -0,0 +1,453 @@
+<?php
+/**
+ * Elgg cache
+ * Cache file interface for caching data.
+ *
+ * @package Elgg.Core
+ * @subpackage Cache
+ */
+
+/* Filepath Cache */
+
+/**
+ * Returns an ElggCache object suitable for caching system information
+ *
+ * @todo Can this be done in a cleaner way?
+ * @todo Swap to memcache etc?
+ *
+ * @return ElggFileCache
+ */
+function elgg_get_system_cache() {
+ global $CONFIG;
+
+ /**
+ * A default filestore cache using the dataroot.
+ */
+ static $FILE_PATH_CACHE;
+
+ if (!$FILE_PATH_CACHE) {
+ $FILE_PATH_CACHE = new ElggFileCache($CONFIG->dataroot . 'system_cache/');
+ }
+
+ return $FILE_PATH_CACHE;
+}
+
+/**
+ * Reset the system cache by deleting the caches
+ *
+ * @return void
+ */
+function elgg_reset_system_cache() {
+ $cache = elgg_get_system_cache();
+ $cache->clear();
+}
+
+/**
+ * Saves a system cache.
+ *
+ * @param string $type The type or identifier of the cache
+ * @param string $data The data to be saved
+ * @return bool
+ */
+function elgg_save_system_cache($type, $data) {
+ global $CONFIG;
+
+ if ($CONFIG->system_cache_enabled) {
+ $cache = elgg_get_system_cache();
+ return $cache->save($type, $data);
+ }
+
+ return false;
+}
+
+/**
+ * Retrieve the contents of a system cache.
+ *
+ * @param string $type The type of cache to load
+ * @return string
+ */
+function elgg_load_system_cache($type) {
+ global $CONFIG;
+
+ if ($CONFIG->system_cache_enabled) {
+ $cache = elgg_get_system_cache();
+ $cached_data = $cache->load($type);
+
+ if ($cached_data) {
+ return $cached_data;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * Enables the system disk cache.
+ *
+ * Uses the 'system_cache_enabled' datalist with a boolean value.
+ * Resets the system cache.
+ *
+ * @return void
+ */
+function elgg_enable_system_cache() {
+ global $CONFIG;
+
+ datalist_set('system_cache_enabled', 1);
+ $CONFIG->system_cache_enabled = 1;
+ elgg_reset_system_cache();
+}
+
+/**
+ * Disables the system disk cache.
+ *
+ * Uses the 'system_cache_enabled' datalist with a boolean value.
+ * Resets the system cache.
+ *
+ * @return void
+ */
+function elgg_disable_system_cache() {
+ global $CONFIG;
+
+ datalist_set('system_cache_enabled', 0);
+ $CONFIG->system_cache_enabled = 0;
+ elgg_reset_system_cache();
+}
+
+/** @todo deprecate in Elgg 1.9 **/
+
+/**
+ * @access private
+ */
+function elgg_get_filepath_cache() {
+ return elgg_get_system_cache();
+}
+/**
+ * @access private
+ */
+function elgg_filepath_cache_reset() {
+ elgg_reset_system_cache();
+}
+/**
+ * @access private
+ */
+function elgg_filepath_cache_save($type, $data) {
+ return elgg_save_system_cache($type, $data);
+}
+/**
+ * @access private
+ */
+function elgg_filepath_cache_load($type) {
+ return elgg_load_system_cache($type);
+}
+/**
+ * @access private
+ */
+function elgg_enable_filepath_cache() {
+ elgg_enable_system_cache();
+}
+/**
+ * @access private
+ */
+function elgg_disable_filepath_cache() {
+ elgg_disable_system_cache();
+}
+
+/* Simplecache */
+
+/**
+ * Registers a view to simple cache.
+ *
+ * Simple cache is a caching mechanism that saves the output of
+ * views and its extensions into a file. If the view is called
+ * by the {@link simplecache/view.php} file, the Elgg framework will
+ * not be loaded and the contents of the view will returned
+ * from file.
+ *
+ * @warning Simple cached views must take no parameters and return
+ * the same content no matter who is logged in.
+ *
+ * @example
+ * $blog_js = elgg_get_simplecache_url('js', 'blog/save_draft');
+ * elgg_register_simplecache_view('js/blog/save_draft');
+ * elgg_register_js('elgg.blog', $blog_js);
+ * elgg_load_js('elgg.blog');
+ *
+ * @param string $viewname View name
+ *
+ * @return void
+ * @link http://docs.elgg.org/Views/Simplecache
+ * @see elgg_regenerate_simplecache()
+ * @since 1.8.0
+ */
+function elgg_register_simplecache_view($viewname) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->views)) {
+ $CONFIG->views = new stdClass;
+ }
+
+ if (!isset($CONFIG->views->simplecache)) {
+ $CONFIG->views->simplecache = array();
+ }
+
+ $CONFIG->views->simplecache[] = $viewname;
+}
+
+/**
+ * Get the URL for the cached file
+ *
+ * @warning You must register the view with elgg_register_simplecache_view()
+ * for caching to work. See elgg_register_simplecache_view() for a full example.
+ *
+ * @param string $type The file type: css or js
+ * @param string $view The view name
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_get_simplecache_url($type, $view) {
+ global $CONFIG;
+ $lastcache = (int)$CONFIG->lastcache;
+ $viewtype = elgg_get_viewtype();
+ elgg_register_simplecache_view("$type/$view");// see #5302
+ if (elgg_is_simplecache_enabled()) {
+ $url = elgg_get_site_url() . "cache/$type/$viewtype/$view.$lastcache.$type";
+ } else {
+ $url = elgg_get_site_url() . "$type/$view.$lastcache.$type";
+ $elements = array("view" => $viewtype);
+ $url = elgg_http_add_url_query_elements($url, $elements);
+ }
+
+ return $url;
+}
+
+/**
+ * Regenerates the simple cache.
+ *
+ * @warning This does not invalidate the cache, but actively rebuilds it.
+ *
+ * @param string $viewtype Optional viewtype to regenerate. Defaults to all valid viewtypes.
+ *
+ * @return void
+ * @see elgg_register_simplecache_view()
+ * @since 1.8.0
+ */
+function elgg_regenerate_simplecache($viewtype = NULL) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->views->simplecache) || !is_array($CONFIG->views->simplecache)) {
+ return;
+ }
+
+ $lastcached = time();
+
+ // @todo elgg_view() checks if the page set is done (isset($CONFIG->pagesetupdone)) and
+ // triggers an event if it's not. Calling elgg_view() here breaks submenus
+ // (at least) because the page setup hook is called before any
+ // contexts can be correctly set (since this is called before page_handler()).
+ // To avoid this, lie about $CONFIG->pagehandlerdone to force
+ // the trigger correctly when the first view is actually being output.
+ $CONFIG->pagesetupdone = TRUE;
+
+ if (!file_exists($CONFIG->dataroot . 'views_simplecache')) {
+ mkdir($CONFIG->dataroot . 'views_simplecache');
+ }
+
+ if (isset($viewtype)) {
+ $viewtypes = array($viewtype);
+ } else {
+ $viewtypes = $CONFIG->view_types;
+ }
+
+ $original_viewtype = elgg_get_viewtype();
+
+ // disable error reporting so we don't cache problems
+ $old_debug = elgg_get_config('debug');
+ elgg_set_config('debug', null);
+
+ foreach ($viewtypes as $viewtype) {
+ elgg_set_viewtype($viewtype);
+ foreach ($CONFIG->views->simplecache as $view) {
+ $viewcontents = elgg_view($view);
+ $viewname = md5(elgg_get_viewtype() . $view);
+ if ($handle = fopen($CONFIG->dataroot . 'views_simplecache/' . $viewname, 'w')) {
+ fwrite($handle, $viewcontents);
+ fclose($handle);
+ }
+ }
+
+ datalist_set("simplecache_lastupdate_$viewtype", $lastcached);
+ datalist_set("simplecache_lastcached_$viewtype", $lastcached);
+ }
+
+ elgg_set_config('debug', $old_debug);
+ elgg_set_viewtype($original_viewtype);
+
+ // needs to be set for links in html head
+ $CONFIG->lastcache = $lastcached;
+
+ unset($CONFIG->pagesetupdone);
+}
+
+/**
+ * Is simple cache enabled
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_is_simplecache_enabled() {
+ if (elgg_get_config('simplecache_enabled')) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Enables the simple cache.
+ *
+ * @access private
+ * @see elgg_register_simplecache_view()
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_enable_simplecache() {
+ global $CONFIG;
+
+ datalist_set('simplecache_enabled', 1);
+ $CONFIG->simplecache_enabled = 1;
+ elgg_regenerate_simplecache();
+}
+
+/**
+ * Disables the simple cache.
+ *
+ * @warning Simplecache is also purged when disabled.
+ *
+ * @access private
+ * @see elgg_register_simplecache_view()
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_disable_simplecache() {
+ global $CONFIG;
+ if ($CONFIG->simplecache_enabled) {
+ datalist_set('simplecache_enabled', 0);
+ $CONFIG->simplecache_enabled = 0;
+
+ // purge simple cache
+ if ($handle = opendir($CONFIG->dataroot . 'views_simplecache')) {
+ while (false !== ($file = readdir($handle))) {
+ if ($file != "." && $file != "..") {
+ unlink($CONFIG->dataroot . 'views_simplecache/' . $file);
+ }
+ }
+ closedir($handle);
+ }
+ }
+}
+
+/**
+ * Deletes all cached views in the simplecache and sets the lastcache and
+ * lastupdate time to 0 for every valid viewtype.
+ *
+ * @return bool
+ * @since 1.7.4
+ */
+function elgg_invalidate_simplecache() {
+ global $CONFIG;
+
+ if (!isset($CONFIG->views->simplecache) || !is_array($CONFIG->views->simplecache)) {
+ return false;
+ }
+
+ $handle = opendir($CONFIG->dataroot . 'views_simplecache');
+
+ if (!$handle) {
+ return false;
+ }
+
+ // remove files.
+ $return = true;
+ while (false !== ($file = readdir($handle))) {
+ if ($file != "." && $file != "..") {
+ $return &= unlink($CONFIG->dataroot . 'views_simplecache/' . $file);
+ }
+ }
+ closedir($handle);
+
+ // reset cache times
+ $viewtypes = $CONFIG->view_types;
+
+ if (!is_array($viewtypes)) {
+ return false;
+ }
+
+ foreach ($viewtypes as $viewtype) {
+ $return &= datalist_set("simplecache_lastupdate_$viewtype", 0);
+ $return &= datalist_set("simplecache_lastcached_$viewtype", 0);
+ }
+
+ return $return;
+}
+
+/**
+ * @see elgg_reset_system_cache()
+ * @access private
+ */
+function _elgg_load_cache() {
+ global $CONFIG;
+
+ $CONFIG->system_cache_loaded = false;
+
+ $CONFIG->views = new stdClass();
+ $data = elgg_load_system_cache('view_locations');
+ if (!is_string($data)) {
+ return;
+ }
+ $CONFIG->views->locations = unserialize($data);
+
+ $data = elgg_load_system_cache('view_types');
+ if (!is_string($data)) {
+ return;
+ }
+ $CONFIG->view_types = unserialize($data);
+
+ $CONFIG->system_cache_loaded = true;
+}
+
+/**
+ * @access private
+ */
+function _elgg_cache_init() {
+ global $CONFIG;
+
+ $viewtype = elgg_get_viewtype();
+
+ // Regenerate the simple cache if expired.
+ // Don't do it on upgrade because upgrade does it itself.
+ // @todo - move into function and perhaps run off init system event
+ if (!defined('UPGRADING')) {
+ $lastupdate = datalist_get("simplecache_lastupdate_$viewtype");
+ $lastcached = datalist_get("simplecache_lastcached_$viewtype");
+ if ($lastupdate == 0 || $lastcached < $lastupdate) {
+ elgg_regenerate_simplecache($viewtype);
+ $lastcached = datalist_get("simplecache_lastcached_$viewtype");
+ }
+ $CONFIG->lastcache = $lastcached;
+ }
+
+ // cache system data if enabled and not loaded
+ if ($CONFIG->system_cache_enabled && !$CONFIG->system_cache_loaded) {
+ elgg_save_system_cache('view_locations', serialize($CONFIG->views->locations));
+ elgg_save_system_cache('view_types', serialize($CONFIG->view_types));
+ }
+
+ if ($CONFIG->system_cache_enabled && !$CONFIG->i18n_loaded_from_cache) {
+ reload_all_translations();
+ foreach ($CONFIG->translations as $lang => $map) {
+ elgg_save_system_cache("$lang.lang", serialize($map));
+ }
+ }
+}
+
+elgg_register_event_handler('ready', 'system', '_elgg_cache_init');
diff --git a/engine/lib/calendar.php b/engine/lib/calendar.php
new file mode 100644
index 000000000..e6f95934c
--- /dev/null
+++ b/engine/lib/calendar.php
@@ -0,0 +1,573 @@
+<?php
+/**
+ * Elgg calendar / entity / event functions.
+ *
+ * @package Elgg.Core
+ * @subpackage Calendar
+ *
+ * @todo Implement or remove
+ */
+
+/**
+ * Return a timestamp for the start of a given day (defaults today).
+ *
+ * @param int $day Day
+ * @param int $month Month
+ * @param int $year Year
+ *
+ * @return int
+ * @access private
+ */
+function get_day_start($day = null, $month = null, $year = null) {
+ return mktime(0, 0, 0, $month, $day, $year);
+}
+
+/**
+ * Return a timestamp for the end of a given day (defaults today).
+ *
+ * @param int $day Day
+ * @param int $month Month
+ * @param int $year Year
+ *
+ * @return int
+ * @access private
+ */
+function get_day_end($day = null, $month = null, $year = null) {
+ return mktime(23, 59, 59, $month, $day, $year);
+}
+
+/**
+ * Return the notable entities for a given time period.
+ *
+ * @todo this function also accepts an array(type => subtypes) for 3rd arg. Should we document this?
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count Set to true to get a count instead of entities. Defaults to false.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param mixed $container_guid Container or containers to get entities from (default: any).
+ *
+ * @return array|false
+ * @access private
+ */
+function get_notable_entities($start_time, $end_time, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "asc", $limit = 10, $offset = 0, $count = false, $site_guid = 0,
+$container_guid = null) {
+ global $CONFIG;
+
+ if ($subtype === false || $subtype === null || $subtype === 0) {
+ return false;
+ }
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $order_by = sanitise_string($order_by);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ $where = array();
+
+ if (is_array($type)) {
+ $tempwhere = "";
+ if (sizeof($type)) {
+ foreach ($type as $typekey => $subtypearray) {
+ foreach ($subtypearray as $subtypeval) {
+ $typekey = sanitise_string($typekey);
+ if (!empty($subtypeval)) {
+ $subtypeval = (int) get_subtype_id($typekey, $subtypeval);
+ } else {
+ $subtypeval = 0;
+ }
+ if (!empty($tempwhere)) {
+ $tempwhere .= " or ";
+ }
+ $tempwhere .= "(e.type = '{$typekey}' and e.subtype = {$subtypeval})";
+ }
+ }
+ }
+ if (!empty($tempwhere)) {
+ $where[] = "({$tempwhere})";
+ }
+ } else {
+ $type = sanitise_string($type);
+ $subtype = get_subtype_id($type, $subtype);
+
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+
+ if ($subtype !== "") {
+ $where[] = "e.subtype=$subtype";
+ }
+ }
+
+ if ($owner_guid != "") {
+ if (!is_array($owner_guid)) {
+ $owner_array = array($owner_guid);
+ $owner_guid = (int) $owner_guid;
+ $where[] = "e.owner_guid = '$owner_guid'";
+ } else if (sizeof($owner_guid) > 0) {
+ $owner_array = array_map('sanitise_int', $owner_guid);
+ // Cast every element to the owner_guid array to int
+ $owner_guid = implode(",", $owner_guid);
+ $where[] = "e.owner_guid in ({$owner_guid})";
+ }
+ if (is_null($container_guid)) {
+ $container_guid = $owner_array;
+ }
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if (!is_null($container_guid)) {
+ if (is_array($container_guid)) {
+ foreach ($container_guid as $key => $val) {
+ $container_guid[$key] = (int) $val;
+ }
+ $where[] = "e.container_guid in (" . implode(",", $container_guid) . ")";
+ } else {
+ $container_guid = (int) $container_guid;
+ $where[] = "e.container_guid = {$container_guid}";
+ }
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+
+ if (!$count) {
+ $query = "SELECT e.* from {$CONFIG->dbprefix}entities e $cal_join where ";
+ } else {
+ $query = "SELECT count(e.guid) as total from {$CONFIG->dbprefix}entities e $cal_join where ";
+ }
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ $query .= get_access_sql_suffix('e'); // Add access controls
+
+ if (!$count) {
+ $query .= " order by n.calendar_start $order_by";
+ // Add order and limit
+ if ($limit) {
+ $query .= " limit $offset, $limit";
+ }
+ $dt = get_data($query, "entity_row_to_elggstar");
+
+ return $dt;
+ } else {
+ $total = get_data_row($query);
+ return $total->total;
+ }
+}
+
+/**
+ * Return the notable entities for a given time period based on an item of metadata.
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param bool $count If true, returns count instead of entities. (Default: false)
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ * @access private
+ */
+function get_notable_entities_from_metadata($start_time, $end_time, $meta_name, $meta_value = "",
+$entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "",
+$site_guid = 0, $count = false) {
+
+ global $CONFIG;
+
+ $meta_n = get_metastring_id($meta_name);
+ $meta_v = get_metastring_id($meta_value);
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $entity_type = sanitise_string($entity_type);
+ $entity_subtype = get_subtype_id($entity_type, $entity_subtype);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $site_guid = (int) $site_guid;
+ if ((is_array($owner_guid) && (count($owner_guid)))) {
+ foreach ($owner_guid as $key => $guid) {
+ $owner_guid[$key] = (int) $guid;
+ }
+ } else {
+ $owner_guid = (int) $owner_guid;
+ }
+
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($entity_type != "") {
+ $where[] = "e.type='$entity_type'";
+ }
+
+ if ($entity_subtype) {
+ $where[] = "e.subtype=$entity_subtype";
+ }
+
+ if ($meta_name != "") {
+ $where[] = "m.name_id='$meta_n'";
+ }
+
+ if ($meta_value != "") {
+ $where[] = "m.value_id='$meta_v'";
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if (is_array($owner_guid)) {
+ $where[] = "e.container_guid in (" . implode(",", $owner_guid) . ")";
+ } else if ($owner_guid > 0) {
+ $where[] = "e.container_guid = {$owner_guid}";
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+ if (!$count) {
+ $query = "SELECT distinct e.* ";
+ } else {
+ $query = "SELECT count(distinct e.guid) as total ";
+ }
+
+ $query .= "from {$CONFIG->dbprefix}entities e"
+ . " JOIN {$CONFIG->dbprefix}metadata m on e.guid = m.entity_guid $cal_join where";
+
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix("e");
+ $query .= ' and ' . get_access_sql_suffix("m");
+
+ if (!$count) {
+ // Add order and limit
+ $query .= " order by $order_by limit $offset, $limit";
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($row = get_data_row($query)) {
+ return $row->total;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Return the notable entities for a given time period based on their relationship.
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to say
+ * "give me all entities for whom $relationship_guid is a
+ * $relationship of"
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param string $order_by Optional Order by
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * @access private
+ */
+function get_noteable_entities_from_relationship($start_time, $end_time, $relationship,
+$relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+
+ global $CONFIG;
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $relationship = sanitise_string($relationship);
+ $relationship_guid = (int)$relationship_guid;
+ $inverse_relationship = (bool)$inverse_relationship;
+ $type = sanitise_string($type);
+ $subtype = get_subtype_id($type, $subtype);
+ $owner_guid = (int)$owner_guid;
+ if ($order_by == "") {
+ $order_by = "time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($relationship != "") {
+ $where[] = "r.relationship='$relationship'";
+ }
+ if ($relationship_guid) {
+ $where[] = $inverse_relationship ?
+ "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'";
+ }
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+ if ($subtype) {
+ $where[] = "e.subtype=$subtype";
+ }
+ if ($owner_guid != "") {
+ $where[] = "e.container_guid='$owner_guid'";
+ }
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+ // Select what we're joining based on the options
+ $joinon = "e.guid = r.guid_one";
+ if (!$inverse_relationship) {
+ $joinon = "e.guid = r.guid_two";
+ }
+
+ if ($count) {
+ $query = "SELECT count(distinct e.guid) as total ";
+ } else {
+ $query = "SELECT distinct e.* ";
+ }
+ $query .= " from {$CONFIG->dbprefix}entity_relationships r"
+ . " JOIN {$CONFIG->dbprefix}entities e on $joinon $cal_join where ";
+
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+ // Add access controls
+ $query .= get_access_sql_suffix("e");
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Get all entities for today.
+ *
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ * @param mixed $container_guid Container(s) to get entities from (default: any).
+ *
+ * @return array|false
+ * @access private
+ */
+function get_todays_entities($type = "", $subtype = "", $owner_guid = 0, $order_by = "",
+$limit = 10, $offset = 0, $count = false, $site_guid = 0, $container_guid = null) {
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities($day_start, $day_end, $type, $subtype, $owner_guid, $order_by,
+ $limit, $offset, $count, $site_guid, $container_guid);
+}
+
+/**
+ * Get entities for today from metadata.
+ *
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param bool $count If true, returns count instead of entities. (Default: false)
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ * @access private
+ */
+function get_todays_entities_from_metadata($meta_name, $meta_value = "", $entity_type = "",
+$entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0,
+$count = false) {
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities_from_metadata($day_start, $day_end, $meta_name, $meta_value,
+ $entity_type, $entity_subtype, $owner_guid, $limit, $offset, $order_by, $site_guid, $count);
+}
+
+/**
+ * Get entities for today from a relationship
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to say
+ * "give me all entities for whom $relationship_guid is a
+ * $relationship of"
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param string $order_by Optional Order by
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * @access private
+ */
+function get_todays_entities_from_relationship($relationship, $relationship_guid,
+$inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities_from_relationship($day_start, $day_end, $relationship,
+ $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, $order_by,
+ $limit, $offset, $count, $site_guid);
+}
+
+/**
+ * Returns a viewable list of entities for a given time period.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to return; 10 by default
+ * @param boolean $fullview Whether or not to display the full view (default: true)
+ * @param boolean $listtypetoggle Whether or not to allow gallery view
+ * @param boolean $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @access private
+ */
+function list_notable_entities($start_time, $end_time, $type= "", $subtype = "", $owner_guid = 0,
+$limit = 10, $fullview = true, $listtypetoggle = false, $navigation = true) {
+
+ $offset = (int) get_input('offset');
+ $count = get_notable_entities($start_time, $end_time, $type, $subtype,
+ $owner_guid, "", $limit, $offset, true);
+
+ $entities = get_notable_entities($start_time, $end_time, $type, $subtype,
+ $owner_guid, "", $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit,
+ $fullview, $listtypetoggle, $navigation);
+}
+
+/**
+ * Return a list of today's entities.
+ *
+ * @see list_notable_entities
+ *
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to return; 10 by default
+ * @param boolean $fullview Whether or not to display the full view (default: true)
+ * @param boolean $listtypetoggle Whether or not to allow gallery view
+ * @param boolean $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @access private
+ */
+function list_todays_entities($type= "", $subtype = "", $owner_guid = 0, $limit = 10,
+$fullview = true, $listtypetoggle = false, $navigation = true) {
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return list_notable_entities($day_start, $day_end, $type, $subtype, $owner_guid, $limit,
+ $fullview, $listtypetoggle, $navigation);
+}
diff --git a/engine/lib/configuration.php b/engine/lib/configuration.php
new file mode 100644
index 000000000..55e5bbd36
--- /dev/null
+++ b/engine/lib/configuration.php
@@ -0,0 +1,632 @@
+<?php
+/**
+ * Elgg configuration procedural code.
+ *
+ * Includes functions for manipulating the configuration values stored in the database
+ * Plugin authors should use the {@link elgg_get_config()}, {@link elgg_set_config()},
+ * {@link elgg_save_config()}, and {@unset_config()} functions to access or update
+ * config values.
+ *
+ * Elgg's configuration is split among 2 tables and 1 file:
+ * - dbprefix_config
+ * - dbprefix_datalists
+ * - engine/settings.php (See {@link settings.example.php})
+ *
+ * Upon system boot, all values in dbprefix_config are read into $CONFIG.
+ *
+ * @package Elgg.Core
+ * @subpackage Configuration
+ */
+
+/**
+ * Get the URL for the current (or specified) site
+ *
+ * @param int $site_guid The GUID of the site whose URL we want to grab
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_get_site_url($site_guid = 0) {
+ if ($site_guid == 0) {
+ global $CONFIG;
+ return $CONFIG->wwwroot;
+ }
+
+ $site = get_entity($site_guid);
+
+ if (!$site instanceof ElggSite) {
+ return false;
+ }
+ /* @var ElggSite $site */
+
+ return $site->url;
+}
+
+/**
+ * Get the plugin path for this installation
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_get_plugins_path() {
+ global $CONFIG;
+ return $CONFIG->pluginspath;
+}
+
+/**
+ * Get the data directory path for this installation
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_get_data_path() {
+ global $CONFIG;
+ return $CONFIG->dataroot;
+}
+
+/**
+ * Get the root directory path for this installation
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_get_root_path() {
+ global $CONFIG;
+ return $CONFIG->path;
+}
+
+/**
+ * Get an Elgg configuration value
+ *
+ * @param string $name Name of the configuration value
+ * @param int $site_guid NULL for installation setting, 0 for default site
+ *
+ * @return mixed Configuration value or null if it does not exist
+ * @since 1.8.0
+ */
+function elgg_get_config($name, $site_guid = 0) {
+ global $CONFIG;
+
+ $name = trim($name);
+
+ if (isset($CONFIG->$name)) {
+ return $CONFIG->$name;
+ }
+
+ if ($site_guid === null) {
+ // installation wide setting
+ $value = datalist_get($name);
+ } else {
+ // hit DB only if we're not sure if value exists or not
+ if (!isset($CONFIG->site_config_loaded)) {
+ // site specific setting
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_id;
+ }
+ $value = get_config($name, $site_guid);
+ } else {
+ $value = null;
+ }
+ }
+
+ // @todo document why we don't cache false
+ if ($value === false) {
+ return null;
+ }
+
+ $CONFIG->$name = $value;
+ return $value;
+}
+
+/**
+ * Set an Elgg configuration value
+ *
+ * @warning This does not persist the configuration setting. Use elgg_save_config()
+ *
+ * @param string $name Name of the configuration value
+ * @param mixed $value Value
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_set_config($name, $value) {
+ global $CONFIG;
+
+ $name = trim($name);
+
+ $CONFIG->$name = $value;
+}
+
+/**
+ * Save a configuration setting
+ *
+ * @param string $name Configuration name (cannot be greater than 255 characters)
+ * @param mixed $value Configuration value. Should be string for installation setting
+ * @param int $site_guid NULL for installation setting, 0 for default site
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_save_config($name, $value, $site_guid = 0) {
+ global $CONFIG;
+
+ $name = trim($name);
+
+ if (strlen($name) > 255) {
+ elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");
+ return false;
+ }
+
+ elgg_set_config($name, $value);
+
+ if ($site_guid === NULL) {
+ if (is_array($value) || is_object($value)) {
+ return false;
+ }
+ return datalist_set($name, $value);
+ } else {
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_id;
+ }
+ return set_config($name, $value, $site_guid);
+ }
+}
+
+/**
+ * Check that installation has completed and the database is populated.
+ *
+ * @throws InstallationException|DatabaseException
+ * @return void
+ * @access private
+ */
+function verify_installation() {
+ global $CONFIG;
+
+ if (isset($CONFIG->installed)) {
+ return;
+ }
+
+ try {
+ $dblink = get_db_link('read');
+ if (!$dblink) {
+ throw new DatabaseException();
+ }
+
+ mysql_query("SELECT value FROM {$CONFIG->dbprefix}datalists WHERE name = 'installed'", $dblink);
+ if (mysql_errno($dblink) > 0) {
+ throw new DatabaseException();
+ }
+
+ $CONFIG->installed = true;
+
+ } catch (DatabaseException $e) {
+ throw new InstallationException(elgg_echo('InstallationException:SiteNotInstalled'));
+ }
+}
+
+/**
+ * An array of key value pairs from the datalists table.
+ *
+ * Used as a cache in datalist functions.
+ *
+ * @global array $DATALIST_CACHE
+ */
+$DATALIST_CACHE = array();
+
+/**
+ * Get the value of a datalist element.
+ *
+ * @internal Datalists are stored in the datalist table.
+ *
+ * @tip Use datalists to store information common to a full installation.
+ *
+ * @param string $name The name of the datalist
+ * @return string|null|false String if value exists, null if doesn't, false on error
+ * @access private
+ */
+function datalist_get($name) {
+ global $CONFIG, $DATALIST_CACHE;
+
+ $name = trim($name);
+
+ // cannot store anything longer than 255 characters in db, so catch here
+ if (elgg_strlen($name) > 255) {
+ elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");
+ return false;
+ }
+
+ $name = sanitise_string($name);
+ if (isset($DATALIST_CACHE[$name])) {
+ return $DATALIST_CACHE[$name];
+ }
+
+ // If memcache enabled then cache value in memcache
+ $value = null;
+ static $datalist_memcache;
+ if ((!$datalist_memcache) && (is_memcache_available())) {
+ $datalist_memcache = new ElggMemcache('datalist_memcache');
+ }
+ if ($datalist_memcache) {
+ $value = $datalist_memcache->load($name);
+ }
+ if ($value) {
+ return $value;
+ }
+
+ // [Marcus Povey 20090217 : Now retrieving all datalist values on first
+ // load as this saves about 9 queries per page]
+ // This also causes OOM problems when the datalists table is large
+ // @todo make a list of datalists that we want to get in one grab
+ $result = get_data("SELECT * from {$CONFIG->dbprefix}datalists");
+ if ($result) {
+ foreach ($result as $row) {
+ $DATALIST_CACHE[$row->name] = $row->value;
+
+ // Cache it if memcache is available
+ if ($datalist_memcache) {
+ $datalist_memcache->save($row->name, $row->value);
+ }
+ }
+
+ if (isset($DATALIST_CACHE[$name])) {
+ return $DATALIST_CACHE[$name];
+ }
+ }
+
+ return null;
+}
+
+/**
+ * Set the value for a datalist element.
+ *
+ * @param string $name The name of the datalist
+ * @param string $value The new value
+ *
+ * @return bool
+ * @access private
+ */
+function datalist_set($name, $value) {
+ global $CONFIG, $DATALIST_CACHE;
+
+ // cannot store anything longer than 255 characters in db, so catch before we set
+ if (elgg_strlen($name) > 255) {
+ elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");
+ return false;
+ }
+
+ $sanitised_name = sanitise_string($name);
+ $sanitised_value = sanitise_string($value);
+
+ // If memcache is available then invalidate the cached copy
+ static $datalist_memcache;
+ if ((!$datalist_memcache) && (is_memcache_available())) {
+ $datalist_memcache = new ElggMemcache('datalist_memcache');
+ }
+
+ if ($datalist_memcache) {
+ $datalist_memcache->delete($name);
+ }
+
+ $success = insert_data("INSERT into {$CONFIG->dbprefix}datalists"
+ . " set name = '{$sanitised_name}', value = '{$sanitised_value}'"
+ . " ON DUPLICATE KEY UPDATE value='{$sanitised_value}'");
+
+ if ($success !== FALSE) {
+ $DATALIST_CACHE[$name] = $value;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Run a function one time per installation.
+ *
+ * If you pass a timestamp as the second argument, it will run the function
+ * only if (i) it has never been run before or (ii) the timestamp is >=
+ * the last time it was run.
+ *
+ * @warning Functions are determined by their name. If you change the name of a function
+ * it will be run again.
+ *
+ * @tip Use $timelastupdatedcheck in your plugins init function to perform automated
+ * upgrades. Schedule a function to run once and pass the timestamp of the new release.
+ * This will cause the run once function to be run on all installations. To perform
+ * additional upgrades, create new functions for each release.
+ *
+ * @warning The function name cannot be longer than 255 characters long due to
+ * the current schema for the datalist table.
+ *
+ * @internal A datalist entry $functioname is created with the value of time().
+ *
+ * @param string $functionname The name of the function you want to run.
+ * @param int $timelastupdatedcheck A UNIX timestamp. If time() is > than this,
+ * this function will be run again.
+ *
+ * @return bool
+ */
+function run_function_once($functionname, $timelastupdatedcheck = 0) {
+ $lastupdated = datalist_get($functionname);
+ if ($lastupdated) {
+ $lastupdated = (int) $lastupdated;
+ } elseif ($lastupdated !== false) {
+ $lastupdated = 0;
+ } else {
+ // unable to check datalist
+ return false;
+ }
+ if (is_callable($functionname) && $lastupdated <= $timelastupdatedcheck) {
+ $functionname();
+ datalist_set($functionname, time());
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Removes a config setting.
+ *
+ * @internal
+ * These settings are stored in the dbprefix_config table and read during system
+ * boot into $CONFIG.
+ *
+ * @param string $name The name of the field.
+ * @param int $site_guid Optionally, the GUID of the site (current site is assumed by default).
+ *
+ * @return int|false The number of affected rows or false on error.
+ *
+ * @see get_config()
+ * @see set_config()
+ */
+function unset_config($name, $site_guid = 0) {
+ global $CONFIG;
+
+ if (isset($CONFIG->$name)) {
+ unset($CONFIG->$name);
+ }
+
+ $name = sanitise_string($name);
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_id;
+ }
+
+ $query = "delete from {$CONFIG->dbprefix}config where name='$name' and site_guid=$site_guid";
+ return delete_data($query);
+}
+
+/**
+ * Add or update a config setting.
+ *
+ * If the config name already exists, it will be updated to the new value.
+ *
+ * @internal
+ * These settings are stored in the dbprefix_config table and read during system
+ * boot into $CONFIG.
+ *
+ * @param string $name The name of the configuration value
+ * @param string $value Its value
+ * @param int $site_guid Optionally, the GUID of the site (current site is assumed by default)
+ *
+ * @return bool
+ * @todo The config table doens't have numeric primary keys so insert_data returns 0.
+ * @todo Use "INSERT ... ON DUPLICATE KEY UPDATE" instead of trying to delete then add.
+ * @see unset_config()
+ * @see get_config()
+ * @access private
+ */
+function set_config($name, $value, $site_guid = 0) {
+ global $CONFIG;
+
+ $name = trim($name);
+
+ // cannot store anything longer than 255 characters in db, so catch before we set
+ if (elgg_strlen($name) > 255) {
+ elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");
+ return false;
+ }
+
+ // Unset existing
+ unset_config($name, $site_guid);
+
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_id;
+ }
+ $CONFIG->$name = $value;
+ $value = sanitise_string(serialize($value));
+
+ $query = "insert into {$CONFIG->dbprefix}config"
+ . " set name = '{$name}', value = '{$value}', site_guid = {$site_guid}";
+ $result = insert_data($query);
+ return $result !== false;
+}
+
+/**
+ * Gets a configuration value
+ *
+ * @internal
+ * These settings are stored in the dbprefix_config table and read during system
+ * boot into $CONFIG.
+ *
+ * @param string $name The name of the config value
+ * @param int $site_guid Optionally, the GUID of the site (current site is assumed by default)
+ *
+ * @return mixed|null
+ * @see set_config()
+ * @see unset_config()
+ * @access private
+ */
+function get_config($name, $site_guid = 0) {
+ global $CONFIG;
+
+ $name = sanitise_string($name);
+ $site_guid = (int) $site_guid;
+
+ // check for deprecated values.
+ // @todo might be a better spot to define this?
+ $new_name = false;
+ switch($name) {
+ case 'viewpath':
+ $new_name = 'view_path';
+ $dep_version = 1.8;
+ break;
+
+ case 'pluginspath':
+ $new_name = 'plugins_path';
+ $dep_version = 1.8;
+ break;
+
+ case 'sitename':
+ $new_name = 'site_name';
+ $dep_version = 1.8;
+ break;
+ }
+
+ // @todo these haven't really been implemented in Elgg 1.8. Complete in 1.9.
+ // show dep message
+ if ($new_name) {
+ // $msg = "Config value $name has been renamed as $new_name";
+ $name = $new_name;
+ // elgg_deprecated_notice($msg, $dep_version);
+ }
+
+ // decide from where to return the value
+ if (isset($CONFIG->$name)) {
+ return $CONFIG->$name;
+ }
+
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_id;
+ }
+
+ $result = get_data_row("SELECT value FROM {$CONFIG->dbprefix}config
+ WHERE name = '{$name}' and site_guid = {$site_guid}");
+
+ if ($result) {
+ $result = $result->value;
+ $result = unserialize($result->value);
+ $CONFIG->$name = $result;
+ return $result;
+ }
+
+ return null;
+}
+
+/**
+ * Loads all configuration values from the dbprefix_config table into $CONFIG.
+ *
+ * @param int $site_guid Optionally, the GUID of the site (current site is assumed by default)
+ *
+ * @return bool
+ * @access private
+ */
+function get_all_config($site_guid = 0) {
+ global $CONFIG;
+
+ $site_guid = (int) $site_guid;
+
+ if ($site_guid == 0) {
+ $site_guid = (int) $CONFIG->site_guid;
+ }
+
+ if ($result = get_data("SELECT * FROM {$CONFIG->dbprefix}config WHERE site_guid = $site_guid")) {
+ foreach ($result as $r) {
+ $name = $r->name;
+ $value = $r->value;
+ $CONFIG->$name = unserialize($value);
+ }
+
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Loads configuration related to this site
+ *
+ * This loads from the config database table and the site entity
+ * @access private
+ */
+function _elgg_load_site_config() {
+ global $CONFIG;
+
+ $CONFIG->site_guid = (int) datalist_get('default_site');
+ $CONFIG->site_id = $CONFIG->site_guid;
+ $CONFIG->site = get_entity($CONFIG->site_guid);
+ if (!$CONFIG->site) {
+ throw new InstallationException(elgg_echo('InstallationException:SiteNotInstalled'));
+ }
+
+ $CONFIG->wwwroot = $CONFIG->site->url;
+ $CONFIG->sitename = $CONFIG->site->name;
+ $CONFIG->sitedescription = $CONFIG->site->description;
+ $CONFIG->siteemail = $CONFIG->site->email;
+ $CONFIG->url = $CONFIG->wwwroot;
+
+ get_all_config();
+ // gives hint to elgg_get_config function how to approach missing values
+ $CONFIG->site_config_loaded = true;
+}
+
+/**
+ * Loads configuration related to Elgg as an application
+ *
+ * This loads from the datalists database table
+ * @access private
+ */
+function _elgg_load_application_config() {
+ global $CONFIG;
+
+ $install_root = str_replace("\\", "/", dirname(dirname(dirname(__FILE__))));
+ $defaults = array(
+ 'path' => "$install_root/",
+ 'view_path' => "$install_root/views/",
+ 'plugins_path' => "$install_root/mod/",
+ 'language' => 'en',
+
+ // compatibility with old names for plugins not using elgg_get_config()
+ 'viewpath' => "$install_root/views/",
+ 'pluginspath' => "$install_root/mod/",
+ );
+
+ foreach ($defaults as $name => $value) {
+ if (empty($CONFIG->$name)) {
+ $CONFIG->$name = $value;
+ }
+ }
+
+ $path = datalist_get('path');
+ if (!empty($path)) {
+ $CONFIG->path = $path;
+ }
+ $dataroot = datalist_get('dataroot');
+ if (!empty($dataroot)) {
+ $CONFIG->dataroot = $dataroot;
+ }
+ $simplecache_enabled = datalist_get('simplecache_enabled');
+ if ($simplecache_enabled !== false) {
+ $CONFIG->simplecache_enabled = $simplecache_enabled;
+ } else {
+ $CONFIG->simplecache_enabled = 1;
+ }
+ $system_cache_enabled = datalist_get('system_cache_enabled');
+ if ($system_cache_enabled !== false) {
+ $CONFIG->system_cache_enabled = $system_cache_enabled;
+ } else {
+ $CONFIG->system_cache_enabled = 1;
+ }
+
+ // initialize context here so it is set before the get_input call
+ $CONFIG->context = array();
+
+ // needs to be set before system, init for links in html head
+ $viewtype = get_input('view', 'default');
+ $lastcached = datalist_get("simplecache_lastcached_$viewtype");
+ $CONFIG->lastcache = $lastcached;
+
+ $CONFIG->i18n_loaded_from_cache = false;
+
+ // this must be synced with the enum for the entities table
+ $CONFIG->entity_types = array('group', 'object', 'site', 'user');
+}
diff --git a/engine/lib/cron.php b/engine/lib/cron.php
new file mode 100644
index 000000000..4f3d05b93
--- /dev/null
+++ b/engine/lib/cron.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Elgg cron library.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+/**
+ * Cron initialization
+ *
+ * @return void
+ * @access private
+ */
+function cron_init() {
+ // Register a pagehandler for cron
+ elgg_register_page_handler('cron', 'cron_page_handler');
+
+ // register a hook for Walled Garden public pages
+ elgg_register_plugin_hook_handler('public_pages', 'walled_garden', 'cron_public_pages');
+}
+
+/**
+ * Cron handler
+ *
+ * @param array $page Pages
+ *
+ * @return bool
+ * @throws CronException
+ * @access private
+ */
+function cron_page_handler($page) {
+ if (!isset($page[0])) {
+ forward();
+ }
+
+ $period = strtolower($page[0]);
+
+ $allowed_periods = array(
+ 'minute', 'fiveminute', 'fifteenmin', 'halfhour', 'hourly',
+ 'daily', 'weekly', 'monthly', 'yearly', 'reboot'
+ );
+
+ if (!in_array($period, $allowed_periods)) {
+ throw new CronException(elgg_echo('CronException:unknownperiod', array($period)));
+ }
+
+ // Get a list of parameters
+ $params = array();
+ $params['time'] = time();
+
+ // Data to return to
+ $old_stdout = "";
+ ob_start();
+
+ $old_stdout = elgg_trigger_plugin_hook('cron', $period, $params, $old_stdout);
+ $std_out = ob_get_clean();
+
+ echo $std_out . $old_stdout;
+ return true;
+}
+
+/**
+ * Register cron's pages as public in case we're in Walled Garden mode
+ *
+ * @param string $hook public_pages
+ * @param string $type system
+ * @param array $return_value Array of pages to allow
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function cron_public_pages($hook, $type, $return_value, $params) {
+ $return_value[] = 'cron/minute';
+ $return_value[] = 'cron/fiveminute';
+ $return_value[] = 'cron/fifteenmin';
+ $return_value[] = 'cron/halfhour';
+ $return_value[] = 'cron/hourly';
+ $return_value[] = 'cron/daily';
+ $return_value[] = 'cron/weekly';
+ $return_value[] = 'cron/monthly';
+ $return_value[] = 'cron/yearly';
+ $return_value[] = 'cron/reboot';
+
+ return $return_value;
+}
+
+elgg_register_event_handler('init', 'system', 'cron_init');
diff --git a/engine/lib/database.php b/engine/lib/database.php
new file mode 100644
index 000000000..a7949788d
--- /dev/null
+++ b/engine/lib/database.php
@@ -0,0 +1,764 @@
+<?php
+/**
+ * Elgg database procedural code.
+ *
+ * Includes functions for establishing and retrieving a database link,
+ * reading data, writing data, upgrading DB schemas, and sanitizing input.
+ *
+ * @package Elgg.Core
+ * @subpackage Database
+ */
+
+/**
+ * Query cache for all queries.
+ *
+ * Each query and its results are stored in this cache as:
+ * <code>
+ * $DB_QUERY_CACHE[query hash] => array(result1, result2, ... resultN)
+ * </code>
+ * @see elgg_query_runner() for details on the hash.
+ *
+ * @warning Elgg used to set this as an empty array to turn off the cache
+ *
+ * @global ElggLRUCache|null $DB_QUERY_CACHE
+ * @access private
+ */
+global $DB_QUERY_CACHE;
+$DB_QUERY_CACHE = null;
+
+/**
+ * Queries to be executed upon shutdown.
+ *
+ * These queries are saved to an array and executed using
+ * a function registered by register_shutdown_function().
+ *
+ * Queries are saved as an array in the format:
+ * <code>
+ * $DB_DELAYED_QUERIES[] = array(
+ * 'q' => str $query,
+ * 'l' => resource $dblink,
+ * 'h' => str $handler // a callback function
+ * );
+ * </code>
+ *
+ * @global array $DB_DELAYED_QUERIES
+ * @access private
+ */
+global $DB_DELAYED_QUERIES;
+$DB_DELAYED_QUERIES = array();
+
+/**
+ * Database connection resources.
+ *
+ * Each database link created with establish_db_link($name) is stored in
+ * $dblink as $dblink[$name] => resource. Use get_db_link($name) to retrieve it.
+ *
+ * @global resource[] $dblink
+ * @access private
+ */
+global $dblink;
+$dblink = array();
+
+/**
+ * Database call count
+ *
+ * Each call to the database increments this counter.
+ *
+ * @global integer $dbcalls
+ * @access private
+ */
+global $dbcalls;
+$dbcalls = 0;
+
+/**
+ * Establish a connection to the database servser
+ *
+ * Connect to the database server and use the Elgg database for a particular database link
+ *
+ * @param string $dblinkname The type of database connection. Used to identify the
+ * resource. eg "read", "write", or "readwrite".
+ *
+ * @return void
+ * @throws DatabaseException
+ * @access private
+ */
+function establish_db_link($dblinkname = "readwrite") {
+ // Get configuration, and globalise database link
+ global $CONFIG, $dblink, $DB_QUERY_CACHE;
+
+ if ($dblinkname != "readwrite" && isset($CONFIG->db[$dblinkname])) {
+ if (is_array($CONFIG->db[$dblinkname])) {
+ $index = rand(0, sizeof($CONFIG->db[$dblinkname]));
+ $dbhost = $CONFIG->db[$dblinkname][$index]->dbhost;
+ $dbuser = $CONFIG->db[$dblinkname][$index]->dbuser;
+ $dbpass = $CONFIG->db[$dblinkname][$index]->dbpass;
+ $dbname = $CONFIG->db[$dblinkname][$index]->dbname;
+ } else {
+ $dbhost = $CONFIG->db[$dblinkname]->dbhost;
+ $dbuser = $CONFIG->db[$dblinkname]->dbuser;
+ $dbpass = $CONFIG->db[$dblinkname]->dbpass;
+ $dbname = $CONFIG->db[$dblinkname]->dbname;
+ }
+ } else {
+ $dbhost = $CONFIG->dbhost;
+ $dbuser = $CONFIG->dbuser;
+ $dbpass = $CONFIG->dbpass;
+ $dbname = $CONFIG->dbname;
+ }
+
+ // Connect to database
+ if (!$dblink[$dblinkname] = mysql_connect($dbhost, $dbuser, $dbpass, true)) {
+ $msg = elgg_echo('DatabaseException:WrongCredentials',
+ array($dbuser, $dbhost, "****"));
+ throw new DatabaseException($msg);
+ }
+
+ if (!mysql_select_db($dbname, $dblink[$dblinkname])) {
+ $msg = elgg_echo('DatabaseException:NoConnect', array($dbname));
+ throw new DatabaseException($msg);
+ }
+
+ // Set DB for UTF8
+ mysql_query("SET NAMES utf8");
+
+ $db_cache_off = FALSE;
+ if (isset($CONFIG->db_disable_query_cache)) {
+ $db_cache_off = $CONFIG->db_disable_query_cache;
+ }
+
+ // Set up cache if global not initialized and query cache not turned off
+ if ((!$DB_QUERY_CACHE) && (!$db_cache_off)) {
+ // @todo if we keep this cache in 1.9, expose the size as a config parameter
+ $DB_QUERY_CACHE = new ElggLRUCache(200);
+ }
+}
+
+/**
+ * Establish database connections
+ *
+ * If the configuration has been set up for multiple read/write databases, set those
+ * links up separately; otherwise just create the one database link.
+ *
+ * @return void
+ * @access private
+ */
+function setup_db_connections() {
+ global $CONFIG;
+
+ if (!empty($CONFIG->db->split)) {
+ establish_db_link('read');
+ establish_db_link('write');
+ } else {
+ establish_db_link('readwrite');
+ }
+}
+
+/**
+ * Display profiling information about db at NOTICE debug level upon shutdown.
+ *
+ * @return void
+ * @access private
+ */
+function db_profiling_shutdown_hook() {
+ global $dbcalls;
+
+ // demoted to NOTICE as it corrupts javasript at DEBUG
+ elgg_log("DB Queries for this page: $dbcalls", 'NOTICE');
+}
+
+/**
+ * Execute any delayed queries upon shutdown.
+ *
+ * @return void
+ * @access private
+ */
+function db_delayedexecution_shutdown_hook() {
+ global $DB_DELAYED_QUERIES;
+
+ foreach ($DB_DELAYED_QUERIES as $query_details) {
+ try {
+ $link = $query_details['l'];
+
+ if ($link == 'read' || $link == 'write') {
+ $link = get_db_link($link);
+ } elseif (!is_resource($link)) {
+ elgg_log("Link for delayed query not valid resource or db_link type. Query: {$query_details['q']}", 'WARNING');
+ }
+
+ $result = execute_query($query_details['q'], $link);
+
+ if ((isset($query_details['h'])) && (is_callable($query_details['h']))) {
+ $query_details['h']($result);
+ }
+ } catch (Exception $e) {
+ // Suppress all errors since these can't be dealt with here
+ elgg_log($e, 'WARNING');
+ }
+ }
+}
+
+/**
+ * Returns (if required, also creates) a database link resource.
+ *
+ * Database link resources are stored in the {@link $dblink} global. These
+ * resources are created by {@link setup_db_connections()}, which is called if
+ * no links exist.
+ *
+ * @param string $dblinktype The type of link we want: "read", "write" or "readwrite".
+ *
+ * @return resource Database link
+ * @access private
+ */
+function get_db_link($dblinktype) {
+ global $dblink;
+
+ if (isset($dblink[$dblinktype])) {
+ return $dblink[$dblinktype];
+ } else if (isset($dblink['readwrite'])) {
+ return $dblink['readwrite'];
+ } else {
+ setup_db_connections();
+ return get_db_link($dblinktype);
+ }
+}
+
+/**
+ * Execute an EXPLAIN for $query.
+ *
+ * @param string $query The query to explain
+ * @param mixed $link The database link resource to user.
+ *
+ * @return mixed An object of the query's result, or FALSE
+ * @access private
+ */
+function explain_query($query, $link) {
+ if ($result = execute_query("explain " . $query, $link)) {
+ return mysql_fetch_object($result);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Execute a query.
+ *
+ * $query is executed via {@link mysql_query()}. If there is an SQL error,
+ * a {@link DatabaseException} is thrown.
+ *
+ * @internal
+ * {@link $dbcalls} is incremented and the query is saved into the {@link $DB_QUERY_CACHE}.
+ *
+ * @param string $query The query
+ * @param resource $dblink The DB link
+ *
+ * @return resource result of mysql_query()
+ * @throws DatabaseException
+ * @access private
+ */
+function execute_query($query, $dblink) {
+ global $dbcalls;
+
+ if ($query == NULL) {
+ throw new DatabaseException(elgg_echo('DatabaseException:InvalidQuery'));
+ }
+
+ if (!is_resource($dblink)) {
+ throw new DatabaseException(elgg_echo('DatabaseException:InvalidDBLink'));
+ }
+
+ $dbcalls++;
+
+ $result = mysql_query($query, $dblink);
+
+ if (mysql_errno($dblink)) {
+ throw new DatabaseException(mysql_error($dblink) . "\n\n QUERY: " . $query);
+ }
+
+ return $result;
+}
+
+/**
+ * Queue a query for execution upon shutdown.
+ *
+ * You can specify a handler function if you care about the result. This function will accept
+ * the raw result from {@link mysql_query()}.
+ *
+ * @param string $query The query to execute
+ * @param resource|string $dblink The database link to use or the link type (read | write)
+ * @param string $handler A callback function to pass the results array to
+ *
+ * @return true
+ * @access private
+ */
+function execute_delayed_query($query, $dblink, $handler = "") {
+ global $DB_DELAYED_QUERIES;
+
+ if (!isset($DB_DELAYED_QUERIES)) {
+ $DB_DELAYED_QUERIES = array();
+ }
+
+ if (!is_resource($dblink) && $dblink != 'read' && $dblink != 'write') {
+ return false;
+ }
+
+ // Construct delayed query
+ $delayed_query = array();
+ $delayed_query['q'] = $query;
+ $delayed_query['l'] = $dblink;
+ $delayed_query['h'] = $handler;
+
+ $DB_DELAYED_QUERIES[] = $delayed_query;
+
+ return TRUE;
+}
+
+/**
+ * Write wrapper for execute_delayed_query()
+ *
+ * @param string $query The query to execute
+ * @param string $handler The handler if you care about the result.
+ *
+ * @return true
+ * @uses execute_delayed_query()
+ * @uses get_db_link()
+ * @access private
+ */
+function execute_delayed_write_query($query, $handler = "") {
+ return execute_delayed_query($query, 'write', $handler);
+}
+
+/**
+ * Read wrapper for execute_delayed_query()
+ *
+ * @param string $query The query to execute
+ * @param string $handler The handler if you care about the result.
+ *
+ * @return true
+ * @uses execute_delayed_query()
+ * @uses get_db_link()
+ * @access private
+ */
+function execute_delayed_read_query($query, $handler = "") {
+ return execute_delayed_query($query, 'read', $handler);
+}
+
+/**
+ * Retrieve rows from the database.
+ *
+ * Queries are executed with {@link execute_query()} and results
+ * are retrieved with {@link mysql_fetch_object()}. If a callback
+ * function $callback is defined, each row will be passed as the single
+ * argument to $callback. If no callback function is defined, the
+ * entire result set is returned as an array.
+ *
+ * @param mixed $query The query being passed.
+ * @param string $callback Optionally, the name of a function to call back to on each row
+ *
+ * @return array An array of database result objects or callback function results. If the query
+ * returned nothing, an empty array.
+ * @access private
+ */
+function get_data($query, $callback = "") {
+ return elgg_query_runner($query, $callback, false);
+}
+
+/**
+ * Retrieve a single row from the database.
+ *
+ * Similar to {@link get_data()} but returns only the first row
+ * matched. If a callback function $callback is specified, the row will be passed
+ * as the only argument to $callback.
+ *
+ * @param mixed $query The query to execute.
+ * @param string $callback A callback function
+ *
+ * @return mixed A single database result object or the result of the callback function.
+ * @access private
+ */
+function get_data_row($query, $callback = "") {
+ return elgg_query_runner($query, $callback, true);
+}
+
+/**
+ * Handles returning data from a query, running it through a callback function,
+ * and caching the results. This is for R queries (from CRUD).
+ *
+ * @access private
+ *
+ * @param string $query The query to execute
+ * @param string $callback An optional callback function to run on each row
+ * @param bool $single Return only a single result?
+ *
+ * @return array An array of database result objects or callback function results. If the query
+ * returned nothing, an empty array.
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_query_runner($query, $callback = null, $single = false) {
+ global $DB_QUERY_CACHE;
+
+ // Since we want to cache results of running the callback, we need to
+ // need to namespace the query with the callback and single result request.
+ // https://github.com/elgg/elgg/issues/4049
+ $hash = (string)$callback . (int)$single . $query;
+
+ // Is cached?
+ if ($DB_QUERY_CACHE) {
+ if (isset($DB_QUERY_CACHE[$hash])) {
+ elgg_log("DB query $query results returned from cache (hash: $hash)", 'NOTICE');
+ return $DB_QUERY_CACHE[$hash];
+ }
+ }
+
+ $dblink = get_db_link('read');
+ $return = array();
+
+ if ($result = execute_query("$query", $dblink)) {
+
+ // test for callback once instead of on each iteration.
+ // @todo check profiling to see if this needs to be broken out into
+ // explicit cases instead of checking in the iteration.
+ $is_callable = is_callable($callback);
+ while ($row = mysql_fetch_object($result)) {
+ if ($is_callable) {
+ $row = $callback($row);
+ }
+
+ if ($single) {
+ $return = $row;
+ break;
+ } else {
+ $return[] = $row;
+ }
+ }
+ }
+
+ if (empty($return)) {
+ elgg_log("DB query $query returned no results.", 'NOTICE');
+ }
+
+ // Cache result
+ if ($DB_QUERY_CACHE) {
+ $DB_QUERY_CACHE[$hash] = $return;
+ elgg_log("DB query $query results cached (hash: $hash)", 'NOTICE');
+ }
+
+ return $return;
+}
+
+/**
+ * Insert a row into the database.
+ *
+ * @note Altering the DB invalidates all queries in {@link $DB_QUERY_CACHE}.
+ *
+ * @param mixed $query The query to execute.
+ *
+ * @return int|false The database id of the inserted row if a AUTO_INCREMENT field is
+ * defined, 0 if not, and false on failure.
+ * @access private
+ */
+function insert_data($query) {
+
+ elgg_log("DB query $query", 'NOTICE');
+
+ $dblink = get_db_link('write');
+
+ _elgg_invalidate_query_cache();
+
+ if (execute_query("$query", $dblink)) {
+ return mysql_insert_id($dblink);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Update the database.
+ *
+ * @note Altering the DB invalidates all queries in {@link $DB_QUERY_CACHE}.
+ *
+ * @param string $query The query to run.
+ *
+ * @return bool
+ * @access private
+ */
+function update_data($query) {
+
+ elgg_log("DB query $query", 'NOTICE');
+
+ $dblink = get_db_link('write');
+
+ _elgg_invalidate_query_cache();
+
+ if (execute_query("$query", $dblink)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Remove data from the database.
+ *
+ * @note Altering the DB invalidates all queries in {@link $DB_QUERY_CACHE}.
+ *
+ * @param string $query The SQL query to run
+ *
+ * @return int|false The number of affected rows or false on failure
+ * @access private
+ */
+function delete_data($query) {
+
+ elgg_log("DB query $query", 'NOTICE');
+
+ $dblink = get_db_link('write');
+
+ _elgg_invalidate_query_cache();
+
+ if (execute_query("$query", $dblink)) {
+ return mysql_affected_rows($dblink);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Invalidate the query cache
+ *
+ * @access private
+ */
+function _elgg_invalidate_query_cache() {
+ global $DB_QUERY_CACHE;
+ if ($DB_QUERY_CACHE instanceof ElggLRUCache) {
+ $DB_QUERY_CACHE->clear();
+ elgg_log("Query cache invalidated", 'NOTICE');
+ } elseif ($DB_QUERY_CACHE) {
+ // In case someone sets the cache to an array and primes it with data
+ $DB_QUERY_CACHE = array();
+ elgg_log("Query cache invalidated", 'NOTICE');
+ }
+}
+
+/**
+ * Return tables matching the database prefix {@link $CONFIG->dbprefix}% in the currently
+ * selected database.
+ *
+ * @return array|false List of tables or false on failure
+ * @static array $tables Tables found matching the database prefix
+ * @access private
+ */
+function get_db_tables() {
+ global $CONFIG;
+ static $tables;
+
+ if (isset($tables)) {
+ return $tables;
+ }
+
+ try{
+ $result = get_data("show tables like '" . $CONFIG->dbprefix . "%'");
+ } catch (DatabaseException $d) {
+ // Likely we can't handle an exception here, so just return false.
+ return FALSE;
+ }
+
+ $tables = array();
+
+ if (is_array($result) && !empty($result)) {
+ foreach ($result as $row) {
+ $row = (array) $row;
+ if (is_array($row) && !empty($row)) {
+ foreach ($row as $element) {
+ $tables[] = $element;
+ }
+ }
+ }
+ } else {
+ return FALSE;
+ }
+
+ return $tables;
+}
+
+/**
+ * Optimise a table.
+ *
+ * Executes an OPTIMIZE TABLE query on $table. Useful after large DB changes.
+ *
+ * @param string $table The name of the table to optimise
+ *
+ * @return bool
+ * @access private
+ */
+function optimize_table($table) {
+ $table = sanitise_string($table);
+ return update_data("optimize table $table");
+}
+
+/**
+ * Get the last database error for a particular database link
+ *
+ * @param resource $dblink The DB link
+ *
+ * @return string Database error message
+ * @access private
+ */
+function get_db_error($dblink) {
+ return mysql_error($dblink);
+}
+
+/**
+ * Runs a full database script from disk.
+ *
+ * The file specified should be a standard SQL file as created by
+ * mysqldump or similar. Statements must be terminated with ;
+ * and a newline character (\n or \r\n) with only one statement per line.
+ *
+ * The special string 'prefix_' is replaced with the database prefix
+ * as defined in {@link $CONFIG->dbprefix}.
+ *
+ * @warning Errors do not halt execution of the script. If a line
+ * generates an error, the error message is saved and the
+ * next line is executed. After the file is run, any errors
+ * are displayed as a {@link DatabaseException}
+ *
+ * @param string $scriptlocation The full path to the script
+ *
+ * @return void
+ * @throws DatabaseException
+ * @access private
+ */
+function run_sql_script($scriptlocation) {
+ if ($script = file_get_contents($scriptlocation)) {
+ global $CONFIG;
+
+ $errors = array();
+
+ // Remove MySQL -- style comments
+ $script = preg_replace('/\-\-.*\n/', '', $script);
+
+ // Statements must end with ; and a newline
+ $sql_statements = preg_split('/;[\n\r]+/', $script);
+
+ foreach ($sql_statements as $statement) {
+ $statement = trim($statement);
+ $statement = str_replace("prefix_", $CONFIG->dbprefix, $statement);
+ if (!empty($statement)) {
+ try {
+ update_data($statement);
+ } catch (DatabaseException $e) {
+ $errors[] = $e->getMessage();
+ }
+ }
+ }
+ if (!empty($errors)) {
+ $errortxt = "";
+ foreach ($errors as $error) {
+ $errortxt .= " {$error};";
+ }
+
+ $msg = elgg_echo('DatabaseException:DBSetupIssues') . $errortxt;
+ throw new DatabaseException($msg);
+ }
+ } else {
+ $msg = elgg_echo('DatabaseException:ScriptNotFound', array($scriptlocation));
+ throw new DatabaseException($msg);
+ }
+}
+
+/**
+ * Format a query string for logging
+ *
+ * @param string $query Query string
+ * @return string
+ * @access private
+ */
+function elgg_format_query($query) {
+ // remove newlines and extra spaces so logs are easier to read
+ return preg_replace('/\s\s+/', ' ', $query);
+}
+
+/**
+ * Sanitise a string for database use, but with the option of escaping extra characters.
+ *
+ * @param string $string The string to sanitise
+ * @param string $extra_escapeable Extra characters to escape with '\\'
+ *
+ * @return string The escaped string
+ */
+function sanitise_string_special($string, $extra_escapeable = '') {
+ $string = sanitise_string($string);
+
+ for ($n = 0; $n < strlen($extra_escapeable); $n++) {
+ $string = str_replace($extra_escapeable[$n], "\\" . $extra_escapeable[$n], $string);
+ }
+
+ return $string;
+}
+
+/**
+ * Sanitise a string for database use.
+ *
+ * @param string $string The string to sanitise
+ *
+ * @return string Sanitised string
+ */
+function sanitise_string($string) {
+ // @todo does this really need the trim?
+ // there are times when you might want trailing / preceeding white space.
+ return mysql_real_escape_string(trim($string));
+}
+
+/**
+ * Wrapper function for alternate English spelling
+ *
+ * @param string $string The string to sanitise
+ *
+ * @return string Sanitised string
+ */
+function sanitize_string($string) {
+ return sanitise_string($string);
+}
+
+/**
+ * Sanitises an integer for database use.
+ *
+ * @param int $int Value to be sanitized
+ * @param bool $signed Whether negative values should be allowed (true)
+ * @return int
+ */
+function sanitise_int($int, $signed = true) {
+ $int = (int) $int;
+
+ if ($signed === false) {
+ if ($int < 0) {
+ $int = 0;
+ }
+ }
+
+ return (int) $int;
+}
+
+/**
+ * Sanitizes an integer for database use.
+ * Wrapper function for alternate English spelling (@see sanitise_int)
+ *
+ * @param int $int Value to be sanitized
+ * @param bool $signed Whether negative values should be allowed (true)
+ * @return int
+ */
+function sanitize_int($int, $signed = true) {
+ return sanitise_int($int, $signed);
+}
+
+/**
+ * Registers shutdown functions for database profiling and delayed queries.
+ *
+ * @access private
+ */
+function init_db() {
+ register_shutdown_function('db_delayedexecution_shutdown_hook');
+ register_shutdown_function('db_profiling_shutdown_hook');
+}
+
+elgg_register_event_handler('init', 'system', 'init_db');
diff --git a/engine/lib/deprecated-1.7.php b/engine/lib/deprecated-1.7.php
new file mode 100644
index 000000000..ee95b5611
--- /dev/null
+++ b/engine/lib/deprecated-1.7.php
@@ -0,0 +1,1164 @@
+<?php
+/**
+ * Get entities with the specified access collection id.
+ *
+ * @deprecated 1.7. Use elgg_get_entities_from_access_id()
+ *
+ * @param int $collection_id ID of collection
+ * @param string $entity_type Type of entities
+ * @param string $entity_subtype Subtype of entities
+ * @param int $owner_guid Guid of owner
+ * @param int $limit Limit of number of entities to return
+ * @param int $offset Skip this many entities
+ * @param string $order_by Column to order by
+ * @param int $site_guid The site guid
+ * @param bool $count Return a count or entities
+ *
+ * @return array
+ */
+function get_entities_from_access_id($collection_id, $entity_type = "", $entity_subtype = "",
+ $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0, $count = false) {
+ // log deprecated warning
+ elgg_deprecated_notice('get_entities_from_access_id() was deprecated by elgg_get_entities()', 1.7);
+
+ if (!$collection_id) {
+ return FALSE;
+ }
+
+ // build the options using given parameters
+ $options = array();
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+ $options['count'] = $count;
+
+ if ($entity_type) {
+ $options['type'] = sanitise_string($entity_type);
+ }
+
+ if ($entity_subtype) {
+ $options['subtype'] = $entity_subtype;
+ }
+
+ if ($site_guid) {
+ $options['site_guid'] = $site_guid;
+ }
+
+ if ($order_by) {
+ $options['order_by'] = sanitise_string("e.time_created, $order_by");
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($site_guid) {
+ $options['site_guid'] = $site_guid;
+ }
+
+ $options['access_id'] = $collection_id;
+
+ return elgg_get_entities_from_access_id($options);
+}
+
+/**
+ * @deprecated 1.7
+ */
+function get_entities_from_access_collection($collection_id, $entity_type = "", $entity_subtype = "",
+ $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0, $count = false) {
+
+ elgg_deprecated_notice('get_entities_from_access_collection() was deprecated by elgg_get_entities()', 1.7);
+
+ return get_entities_from_access_id($collection_id, $entity_type, $entity_subtype,
+ $owner_guid, $limit, $offset, $order_by, $site_guid, $count);
+}
+
+/**
+ * Get entities from annotations
+ *
+ * No longer used.
+ *
+ * @deprecated 1.7 Use elgg_get_entities_from_annotations()
+ *
+ * @param mixed $entity_type Type of entity
+ * @param mixed $entity_subtype Subtype of entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param int $owner_guid Guid of owner of annotation
+ * @param int $group_guid Guid of group
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by SQL order by string
+ * @param bool $count Count or return entities
+ * @param int $timelower Lower time limit
+ * @param int $timeupper Upper time limit
+ *
+ * @return unknown_type
+ */
+function get_entities_from_annotations($entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $owner_guid = 0, $group_guid = 0, $limit = 10, $offset = 0, $order_by = "asc",
+$count = false, $timelower = 0, $timeupper = 0) {
+ $msg = 'get_entities_from_annotations() is deprecated by elgg_get_entities_from_annotations().';
+ elgg_deprecated_notice($msg, 1.7);
+
+ $options = array();
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ $options['annotation_names'] = $name;
+
+ if ($value) {
+ $options['annotation_values'] = $value;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['annotation_owner_guids'] = $owner_guid;
+ } else {
+ $options['annotation_owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($group_guid) {
+ $options['container_guid'] = $group_guid;
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'] = "maxtime $order_by";
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ if ($timelower) {
+ $options['annotation_created_time_lower'] = $timelower;
+ }
+
+ if ($timeupper) {
+ $options['annotation_created_time_upper'] = $timeupper;
+ }
+
+ return elgg_get_entities_from_annotations($options);
+}
+
+/**
+ * Lists entities
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param string $entity_type Type of entity.
+ * @param string $entity_subtype Subtype of entity.
+ * @param string $name Name of annotation.
+ * @param string $value Value of annotation.
+ * @param int $limit Maximum number of results to return.
+ * @param int $owner_guid Owner.
+ * @param int $group_guid Group container. Currently only supported if entity_type is object
+ * @param boolean $asc Whether to list in ascending or descending order (default: desc)
+ * @param boolean $fullview Whether to display the entities in full
+ * @param boolean $listtypetoggle Can 'gallery' view can be displayed (default: no)
+ *
+ * @deprecated 1.7 Use elgg_list_entities_from_annotations()
+ * @return string Formatted entity list
+ */
+function list_entities_from_annotations($entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $limit = 10, $owner_guid = 0, $group_guid = 0, $asc = false, $fullview = true,
+$listtypetoggle = false) {
+
+ $msg = 'list_entities_from_annotations is deprecated by elgg_list_entities_from_annotations';
+ elgg_deprecated_notice($msg, 1.8);
+
+ $options = array();
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ if ($name) {
+ $options['annotation_names'] = $name;
+ }
+
+ if ($value) {
+ $options['annotation_values'] = $value;
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($owner_guid) {
+ $options['annotation_owner_guid'] = $owner_guid;
+ }
+
+ if ($group_guid) {
+ $options['container_guid'] = $group_guid;
+ }
+
+ if ($asc) {
+ $options['order_by'] = 'maxtime desc';
+ }
+
+ if ($offset = sanitise_int(get_input('offset', null))) {
+ $options['offset'] = $offset;
+ }
+
+ $options['full_view'] = $fullview;
+ $options['list_type_toggle'] = $listtypetoggle;
+ $options['pagination'] = $pagination;
+
+ return elgg_list_entities_from_annotations($options);
+}
+
+/**
+ * Returns all php files in a directory.
+ *
+ * @deprecated 1.7 Use elgg_get_file_list() instead
+ *
+ * @param string $directory Directory to look in
+ * @param array $exceptions Array of extensions (with .!) to ignore
+ * @param array $list A list files to include in the return
+ *
+ * @return array
+ */
+function get_library_files($directory, $exceptions = array(), $list = array()) {
+ elgg_deprecated_notice('get_library_files() deprecated by elgg_get_file_list()', 1.7);
+ return elgg_get_file_list($directory, $exceptions, $list, array('.php'));
+}
+
+/**
+ * Add action tokens to URL.
+ *
+ * @param string $url URL
+ *
+ * @return string
+ *
+ * @deprecated 1.7 final
+ */
+function elgg_validate_action_url($url) {
+ elgg_deprecated_notice('elgg_validate_action_url() deprecated by elgg_add_action_tokens_to_url().',
+ 1.7);
+
+ return elgg_add_action_tokens_to_url($url);
+}
+
+/**
+ * Does nothing.
+ *
+ * @deprecated 1.7
+ * @return 0
+ */
+function test_ip() {
+ elgg_deprecated_notice('test_ip() was removed because of licensing issues.', 1.7);
+
+ return 0;
+}
+
+/**
+ * Does nothing.
+ *
+ * @return bool
+ * @deprecated 1.7
+ */
+function is_ip_in_array() {
+ elgg_deprecated_notice('is_ip_in_array() was removed because of licensing issues.', 1.7);
+
+ return false;
+}
+
+/**
+ * Returns entities.
+ *
+ * @deprecated 1.7. Use elgg_get_entities().
+ *
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param string $order_by Order by clause
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param bool $count Return a count or an array of entities
+ * @param int $site_guid Site GUID
+ * @param int $container_guid Container GUID
+ * @param int $timelower Lower time limit
+ * @param int $timeupper Upper time limit
+ *
+ * @return array
+ */
+function get_entities($type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10,
+$offset = 0, $count = false, $site_guid = 0, $container_guid = null, $timelower = 0,
+$timeupper = 0) {
+
+ elgg_deprecated_notice('get_entities() was deprecated by elgg_get_entities().', 1.7);
+
+ // rewrite owner_guid to container_guid to emulate old functionality
+ if ($owner_guid != "") {
+ if (is_null($container_guid)) {
+ $container_guid = $owner_guid;
+ $owner_guid = NULL;
+ }
+ }
+
+ $options = array();
+ if ($type) {
+ if (is_array($type)) {
+ $options['types'] = $type;
+ } else {
+ $options['type'] = $type;
+ }
+ }
+
+ if ($subtype) {
+ if (is_array($subtype)) {
+ $options['subtypes'] = $subtype;
+ } else {
+ $options['subtype'] = $subtype;
+ }
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($order_by) {
+ $options['order_by'] = $order_by;
+ }
+
+ // need to pass 0 for all option
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ if ($site_guid) {
+ $options['site_guids'] = $site_guid;
+ }
+
+ if ($container_guid) {
+ $options['container_guids'] = $container_guid;
+ }
+
+ if ($timeupper) {
+ $options['created_time_upper'] = $timeupper;
+ }
+
+ if ($timelower) {
+ $options['created_time_lower'] = $timelower;
+ }
+
+ $r = elgg_get_entities($options);
+ return $r;
+}
+
+/**
+ * Delete multiple entities that match a given query.
+ * This function iterates through and calls delete_entity on
+ * each one, this is somewhat inefficient but lets
+ * the 'delete' event be called for each entity.
+ *
+ * @deprecated 1.7. This is a dangerous function as it defaults to deleting everything.
+ *
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ *
+ * @return false
+ */
+function delete_entities($type = "", $subtype = "", $owner_guid = 0) {
+ elgg_deprecated_notice('delete_entities() was deprecated because no one should use it.', 1.7);
+ return false;
+}
+
+/**
+ * Lists entities.
+ *
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param bool $fullview Show entity full views
+ * @param bool $listtypetoggle Show list type toggle
+ * @param bool $allowedtypes A string of the allowed types
+ *
+ * @return string
+ * @deprecated 1.7. Use elgg_list_registered_entities().
+ */
+function list_registered_entities($owner_guid = 0, $limit = 10, $fullview = true,
+$listtypetoggle = false, $allowedtypes = true) {
+
+ elgg_deprecated_notice('list_registered_entities() was deprecated by elgg_list_registered_entities().', 1.7);
+
+ $options = array();
+
+ // don't want to send anything if not being used.
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($allowedtypes) {
+ $options['allowed_types'] = $allowedtypes;
+ }
+
+ // need to send because might be BOOL
+ $options['full_view'] = $fullview;
+ $options['list_type_toggle'] = $listtypetoggle;
+
+ $options['offset'] = get_input('offset', 0);
+
+ return elgg_list_registered_entities($options);
+}
+
+/**
+ * Lists entities
+ *
+ * @deprecated 1.7. Use elgg_list_entities().
+ *
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param bool $fullview Display entity full views?
+ * @param bool $listtypetoggle Allow switching to gallery mode?
+ * @param bool $pagination Show pagination?
+ *
+ * @return string
+ */
+function list_entities($type= "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true,
+$listtypetoggle = false, $pagination = true) {
+
+ elgg_deprecated_notice('list_entities() was deprecated by elgg_list_entities()!', 1.7);
+
+ $options = array();
+
+ // rewrite owner_guid to container_guid to emulate old functionality
+ if ($owner_guid) {
+ $options['container_guids'] = $owner_guid;
+ }
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($offset = sanitise_int(get_input('offset', null))) {
+ $options['offset'] = $offset;
+ }
+
+ $options['full_view'] = $fullview;
+ $options['list_type_toggle'] = $listtypetoggle;
+ $options['pagination'] = $pagination;
+
+ return elgg_list_entities($options);
+}
+
+/**
+ * Searches for a group based on a complete or partial name or description
+ *
+ * @param string $criteria The partial or full name or description
+ * @param int $limit Limit of the search.
+ * @param int $offset Offset.
+ * @param string $order_by The order.
+ * @param boolean $count Whether to return the count of results or just the results.
+ *
+ * @return mixed
+ * @deprecated 1.7
+ */
+function search_for_group($criteria, $limit = 10, $offset = 0, $order_by = "", $count = false) {
+ elgg_deprecated_notice('search_for_group() was deprecated by new search plugin.', 1.7);
+ global $CONFIG;
+
+ $criteria = sanitise_string($criteria);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $order_by = sanitise_string($order_by);
+
+ $access = get_access_sql_suffix("e");
+
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+
+ if ($count) {
+ $query = "SELECT count(e.guid) as total ";
+ } else {
+ $query = "SELECT e.* ";
+ }
+ $query .= "from {$CONFIG->dbprefix}entities e"
+ . " JOIN {$CONFIG->dbprefix}groups_entity g on e.guid=g.guid where ";
+
+ $query .= "(g.name like \"%{$criteria}%\" or g.description like \"%{$criteria}%\")";
+ $query .= " and $access";
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Returns a formatted list of groups suitable for injecting into search.
+ *
+ * @deprecated 1.7
+ *
+ * @param string $hook Hook name
+ * @param string $user User
+ * @param mixed $returnvalue Previous hook's return value
+ * @param string $tag Tag to search on
+ *
+ * @return string
+ */
+function search_list_groups_by_name($hook, $user, $returnvalue, $tag) {
+ elgg_deprecated_notice('search_list_groups_by_name() was deprecated by new search plugin', 1.7);
+ // Change this to set the number of groups that display on the search page
+ $threshold = 4;
+
+ $object = get_input('object');
+
+ if (!get_input('offset') && (empty($object) || $object == 'group')) {
+ if ($groups = search_for_group($tag, $threshold)) {
+ $countgroups = search_for_group($tag, 0, 0, "", true);
+
+ $return = elgg_view('group/search/startblurb', array('count' => $countgroups, 'tag' => $tag));
+ foreach ($groups as $group) {
+ $return .= elgg_view_entity($group);
+ }
+ $vars = array('count' => $countgroups, 'threshold' => $threshold, 'tag' => $tag);
+ $return .= elgg_view('group/search/finishblurb', $vars);
+ return $return;
+ }
+ }
+}
+
+/**
+ * Displays a list of group objects that have been searched for.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param string $tag Search criteria
+ * @param int $limit The number of entities to display on a page
+ *
+ * @return string The list in a form suitable to display
+ * @deprecated 1.7
+ */
+function list_group_search($tag, $limit = 10) {
+ elgg_deprecated_notice('list_group_search() was deprecated by new search plugin.', 1.7);
+ $offset = (int) get_input('offset');
+ $limit = (int) $limit;
+ $count = (int) search_for_group($tag, 10, 0, '', true);
+ $entities = search_for_group($tag, $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, false);
+
+}
+
+/**
+ * Return a list of entities based on the given search criteria.
+ *
+ * @deprecated 1.7 use elgg_get_entities_from_metadata().
+ *
+ * @param mixed $meta_name Metadat name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site GUID. 0 for current, -1 for any.
+ * @param bool $count Return a count instead of entities
+ * @param bool $case_sensitive Metadata names case sensitivity
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ */
+function get_entities_from_metadata($meta_name, $meta_value = "", $entity_type = "",
+$entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "",
+$site_guid = 0, $count = FALSE, $case_sensitive = TRUE) {
+
+ elgg_deprecated_notice('get_entities_from_metadata() was deprecated by elgg_get_entities_from_metadata()!', 1.7);
+
+ $options = array();
+
+ $options['metadata_names'] = $meta_name;
+
+ if ($meta_value) {
+ $options['metadata_values'] = $meta_value;
+ }
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ // need to be able to pass false
+ $options['metadata_case_sensitive'] = $case_sensitive;
+
+ return elgg_get_entities_from_metadata($options);
+}
+
+/**
+ * Return entities from metadata
+ *
+ * @deprecated 1.7. Use elgg_get_entities_from_metadata().
+ *
+ * @param mixed $meta_array Metadata name
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site GUID. 0 for current, -1 for any.
+ * @param bool $count Return a count instead of entities
+ * @param bool $meta_array_operator Operator for metadata values
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ */
+function get_entities_from_metadata_multi($meta_array, $entity_type = "", $entity_subtype = "",
+$owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0,
+$count = false, $meta_array_operator = 'and') {
+
+ elgg_deprecated_notice('get_entities_from_metadata_multi() was deprecated by elgg_get_entities_from_metadata()!', 1.7);
+
+ if (!is_array($meta_array) || sizeof($meta_array) == 0) {
+ return false;
+ }
+
+ $options = array();
+
+ $options['metadata_name_value_pairs'] = $meta_array;
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ $options['metadata_name_value_pairs_operator'] = $meta_array_operator;
+
+ return elgg_get_entities_from_metadata($options);
+}
+
+/**
+ * Returns a menu item for use in the children section of add_menu()
+ * This is not currently used in the Elgg core.
+ *
+ * @param string $menu_name The name of the menu item
+ * @param string $menu_url Its URL
+ *
+ * @return stdClass|false Depending on success
+ * @deprecated 1.7
+ */
+function menu_item($menu_name, $menu_url) {
+ elgg_deprecated_notice('menu_item() is deprecated by add_submenu_item', 1.7);
+ return make_register_object($menu_name, $menu_url);
+}
+
+/**
+ * Searches for an object based on a complete or partial title
+ * or description using full text searching.
+ *
+ * IMPORTANT NOTE: With MySQL's default setup:
+ * 1) $criteria must be 4 or more characters long
+ * 2) If $criteria matches greater than 50% of results NO RESULTS ARE RETURNED!
+ *
+ * @param string $criteria The partial or full name or username.
+ * @param int $limit Limit of the search.
+ * @param int $offset Offset.
+ * @param string $order_by The order.
+ * @param boolean $count Whether to return the count of results or just the results.
+ *
+ * @return int|false
+ * @deprecated 1.7
+ */
+function search_for_object($criteria, $limit = 10, $offset = 0, $order_by = "", $count = false) {
+ elgg_deprecated_notice('search_for_object() was deprecated by new search plugin.', 1.7);
+ global $CONFIG;
+
+ $criteria = sanitise_string($criteria);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $order_by = sanitise_string($order_by);
+ $container_guid = (int)$container_guid;
+
+ $access = get_access_sql_suffix("e");
+
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+
+ if ($count) {
+ $query = "SELECT count(e.guid) as total ";
+ } else {
+ $query = "SELECT e.* ";
+ }
+ $query .= "from {$CONFIG->dbprefix}entities e
+ join {$CONFIG->dbprefix}objects_entity o on e.guid=o.guid
+ where match(o.title,o.description) against ('$criteria') and $access";
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Returns a formatted list of objects suitable for injecting into search.
+ *
+ * @deprecated 1.7
+ *
+ * @param sting $hook Hook
+ * @param string $user user
+ * @param mixed $returnvalue Previous return value
+ * @param mixed $tag Search term
+ *
+ * @return array
+ */
+function search_list_objects_by_name($hook, $user, $returnvalue, $tag) {
+ elgg_deprecated_notice('search_list_objects_by_name was deprecated by new search plugin.', 1.7);
+
+ // Change this to set the number of users that display on the search page
+ $threshold = 4;
+
+ $object = get_input('object');
+
+ if (!get_input('offset') && (empty($object) || $object == 'user')) {
+ if ($users = search_for_user($tag, $threshold)) {
+ $countusers = search_for_user($tag, 0, 0, "", true);
+
+ $return = elgg_view('user/search/startblurb', array('count' => $countusers, 'tag' => $tag));
+ foreach ($users as $user) {
+ $return .= elgg_view_entity($user);
+ }
+ $return .= elgg_view('user/search/finishblurb',
+ array('count' => $countusers, 'threshold' => $threshold, 'tag' => $tag));
+
+ return $return;
+
+ }
+ }
+}
+
+/**
+ * Return entities from relationships
+ *
+ * @deprecated 1.7 Use elgg_get_entities_from_relationship()
+ *
+ * @param string $relationship The relationship type
+ * @param int $relationship_guid The GUID of the relationship owner
+ * @param bool $inverse_relationship Invert relationship?
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Entity owner GUID
+ * @param string $order_by Order by clause
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param bool $count Return a count instead of entities?
+ * @param int $site_guid Site GUID
+ *
+ * @return mixed
+ */
+function get_entities_from_relationship($relationship, $relationship_guid,
+$inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+
+ elgg_deprecated_notice('get_entities_from_relationship() was deprecated by elgg_get_entities_from_relationship()!', 1.7);
+
+ $options = array();
+
+ $options['relationship'] = $relationship;
+ $options['relationship_guid'] = $relationship_guid;
+ $options['inverse_relationship'] = $inverse_relationship;
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_relationship($options);
+}
+
+/**
+ * Searches for a site based on a complete or partial name
+ * or description or url using full text searching.
+ *
+ * IMPORTANT NOTE: With MySQL's default setup:
+ * 1) $criteria must be 4 or more characters long
+ * 2) If $criteria matches greater than 50% of results NO RESULTS ARE RETURNED!
+ *
+ * @param string $criteria The partial or full name or username.
+ * @param int $limit Limit of the search.
+ * @param int $offset Offset.
+ * @param string $order_by The order.
+ * @param boolean $count Whether to return the count of results or just the results.
+ *
+ * @return mixed
+ * @deprecated 1.7
+ */
+function search_for_site($criteria, $limit = 10, $offset = 0, $order_by = "", $count = false) {
+ elgg_deprecated_notice('search_for_site() was deprecated by new search plugin.', 1.7);
+ global $CONFIG;
+
+ $criteria = sanitise_string($criteria);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $order_by = sanitise_string($order_by);
+
+ $access = get_access_sql_suffix("e");
+
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+
+ if ($count) {
+ $query = "SELECT count(e.guid) as total ";
+ } else {
+ $query = "SELECT e.* ";
+ }
+ $query .= "from {$CONFIG->dbprefix}entities e
+ join {$CONFIG->dbprefix}sites_entity s on e.guid=s.guid
+ where match(s.name, s.description, s.url) against ('$criteria') and $access";
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Searches for a user based on a complete or partial name or username.
+ *
+ * @param string $criteria The partial or full name or username.
+ * @param int $limit Limit of the search.
+ * @param int $offset Offset.
+ * @param string $order_by The order.
+ * @param boolean $count Whether to return the count of results or just the results.
+ *
+ * @return mixed
+ * @deprecated 1.7
+ */
+function search_for_user($criteria, $limit = 10, $offset = 0, $order_by = "", $count = false) {
+ elgg_deprecated_notice('search_for_user() was deprecated by new search.', 1.7);
+ global $CONFIG;
+
+ $criteria = sanitise_string($criteria);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $order_by = sanitise_string($order_by);
+
+ $access = get_access_sql_suffix("e");
+
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+
+ if ($count) {
+ $query = "SELECT count(e.guid) as total ";
+ } else {
+ $query = "SELECT e.* ";
+ }
+ $query .= "from {$CONFIG->dbprefix}entities e
+ join {$CONFIG->dbprefix}users_entity u on e.guid=u.guid where ";
+
+ $query .= "(u.name like \"%{$criteria}%\" or u.username like \"%{$criteria}%\")";
+ $query .= " and $access";
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit";
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Displays a list of user objects that have been searched for.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param string $tag Search criteria
+ * @param int $limit The number of entities to display on a page
+ *
+ * @return string The list in a form suitable to display
+ *
+ * @deprecated 1.7
+ */
+function list_user_search($tag, $limit = 10) {
+ elgg_deprecated_notice('list_user_search() deprecated by new search', 1.7);
+ $offset = (int) get_input('offset');
+ $limit = (int) $limit;
+ $count = (int) search_for_user($tag, 10, 0, '', true);
+ $entities = search_for_user($tag, $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, false);
+}
+
+/**
+ * Returns a formatted list of users suitable for injecting into search.
+ *
+ * @deprecated 1.7
+ *
+ * @param string $hook Hook name
+ * @param string $user User?
+ * @param mixed $returnvalue Previous hook's return value
+ * @param mixed $tag Tag to search against
+ *
+ * @return void
+ */
+function search_list_users_by_name($hook, $user, $returnvalue, $tag) {
+ elgg_deprecated_notice('search_list_users_by_name() was deprecated by new search', 1.7);
+ // Change this to set the number of users that display on the search page
+ $threshold = 4;
+
+ $object = get_input('object');
+
+ if (!get_input('offset') && (empty($object) || $object == 'user')) {
+ if ($users = search_for_user($tag, $threshold)) {
+ $countusers = search_for_user($tag, 0, 0, "", true);
+
+ $return = elgg_view('user/search/startblurb', array('count' => $countusers, 'tag' => $tag));
+ foreach ($users as $user) {
+ $return .= elgg_view_entity($user);
+ }
+
+ $vars = array('count' => $countusers, 'threshold' => $threshold, 'tag' => $tag);
+ $return .= elgg_view('user/search/finishblurb', $vars);
+ return $return;
+
+ }
+ }
+}
+
+/**
+ * Extend a view
+ *
+ * @deprecated 1.7. Use elgg_extend_view().
+ *
+ * @param string $view The view to extend.
+ * @param string $view_name This view is added to $view
+ * @param int $priority The priority, from 0 to 1000,
+ * to add at (lowest numbers displayed first)
+ * @param string $viewtype Not used
+ *
+ * @return void
+ */
+function extend_view($view, $view_name, $priority = 501, $viewtype = '') {
+ elgg_deprecated_notice('extend_view() was deprecated by elgg_extend_view()!', 1.7);
+ elgg_extend_view($view, $view_name, $priority, $viewtype);
+}
+
+/**
+ * Get views in a dir
+ *
+ * @deprecated 1.7. Use elgg_get_views().
+ *
+ * @param string $dir Dir
+ * @param string $base Base view
+ *
+ * @return array
+ */
+function get_views($dir, $base) {
+ elgg_deprecated_notice('get_views() was deprecated by elgg_get_views()!', 1.7);
+ elgg_get_views($dir, $base);
+}
+
+/**
+ * Constructs and returns a register object.
+ *
+ * @param string $register_name The name of the register
+ * @param mixed $register_value The value of the register
+ * @param array $children_array Optionally, an array of children
+ *
+ * @return false|stdClass Depending on success
+ * @deprecated 1.7 Use {@link add_submenu_item()}
+ */
+function make_register_object($register_name, $register_value, $children_array = array()) {
+ elgg_deprecated_notice('make_register_object() is deprecated by add_submenu_item()', 1.7);
+ if (empty($register_name) || empty($register_value)) {
+ return false;
+ }
+
+ $register = new stdClass;
+ $register->name = $register_name;
+ $register->value = $register_value;
+ $register->children = $children_array;
+
+ return $register;
+}
+
+/**
+ * THIS FUNCTION IS DEPRECATED.
+ *
+ * Delete a object's extra data.
+ *
+ * @todo - this should be removed - was deprecated in 1.5 or earlier
+ *
+ * @param int $guid GUID
+ *
+ * @return 1
+ * @deprecated 1.7
+ */
+function delete_object_entity($guid) {
+ system_message(elgg_echo('deprecatedfunction', array('delete_user_entity')));
+
+ return 1; // Always return that we have deleted one row in order to not break existing code.
+}
+
+/**
+ * THIS FUNCTION IS DEPRECATED.
+ *
+ * Delete a user's extra data.
+ *
+ * @todo remove
+ *
+ * @param int $guid User GUID
+ *
+ * @return 1
+ * @deprecated 1.7
+ */
+function delete_user_entity($guid) {
+ system_message(elgg_echo('deprecatedfunction', array('delete_user_entity')));
+
+ return 1; // Always return that we have deleted one row in order to not break existing code.
+} \ No newline at end of file
diff --git a/engine/lib/deprecated-1.8.php b/engine/lib/deprecated-1.8.php
new file mode 100644
index 000000000..91068d047
--- /dev/null
+++ b/engine/lib/deprecated-1.8.php
@@ -0,0 +1,4820 @@
+<?php
+/**
+ * ***************************************************************************
+ * NOTE: If this is ever removed from Elgg, sites lose the ability to upgrade
+ * from 1.7.x and earlier to the latest version of Elgg without upgrading to
+ * 1.8 first.
+ * ***************************************************************************
+ *
+ * Upgrade the database schema in an ordered sequence.
+ *
+ * Executes all upgrade files in elgg/engine/schema/upgrades/ in sequential order.
+ * Upgrade files must be in the standard Elgg release format of YYYYMMDDII.sql
+ * where II is an incrementor starting from 01.
+ *
+ * Files that are < $version will be ignored.
+ *
+ * @warning Plugin authors should not call this function directly.
+ *
+ * @param int $version The version you are upgrading from in the format YYYYMMDDII.
+ * @param string $fromdir Optional directory to load upgrades from. default: engine/schema/upgrades/
+ * @param bool $quiet If true, suppress all error messages. Only use for the upgrade from <=1.6.
+ *
+ * @return int The number of upgrades run.
+ * @see upgrade.php
+ * @see version.php
+ * @deprecated 1.8 Use PHP upgrades for sql changes.
+ */
+function db_upgrade($version, $fromdir = "", $quiet = FALSE) {
+ global $CONFIG;
+
+ elgg_deprecated_notice('db_upgrade() is deprecated by using PHP upgrades.', 1.8);
+
+ $version = (int) $version;
+
+ if (!$fromdir) {
+ $fromdir = $CONFIG->path . 'engine/schema/upgrades/';
+ }
+
+ $i = 0;
+
+ if ($handle = opendir($fromdir)) {
+ $sqlupgrades = array();
+
+ while ($sqlfile = readdir($handle)) {
+ if (!is_dir($fromdir . $sqlfile)) {
+ if (preg_match('/^([0-9]{10})\.(sql)$/', $sqlfile, $matches)) {
+ $sql_version = (int) $matches[1];
+ if ($sql_version > $version) {
+ $sqlupgrades[] = $sqlfile;
+ }
+ }
+ }
+ }
+
+ asort($sqlupgrades);
+
+ if (sizeof($sqlupgrades) > 0) {
+ foreach ($sqlupgrades as $sqlfile) {
+
+ // hide all errors.
+ if ($quiet) {
+ try {
+ run_sql_script($fromdir . $sqlfile);
+ } catch (DatabaseException $e) {
+ error_log($e->getmessage());
+ }
+ } else {
+ run_sql_script($fromdir . $sqlfile);
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $i;
+}
+
+/**
+ * Lists entities from an access collection
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_access_id()
+ *
+ * @return str
+ */
+function list_entities_from_access_id($access_id, $entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = true, $pagination = true) {
+
+ elgg_deprecated_notice("All list_entities* functions were deprecated in 1.8. Use elgg_list_entities* instead.", 1.8);
+
+ echo elgg_list_entities_from_access_id(array('access_id' => $access_id,
+ 'type' => $entity_type, 'subtype' => $entity_subtype, 'owner_guids' => $owner_guid,
+ 'limit' => $limit, 'full_view' => $fullview, 'list_type_toggle' => $listtypetoggle,
+ 'pagination' => $pagination,));
+}
+
+/**
+ * Registers a particular action in memory
+ *
+ * @deprecated 1.8 Use {@link elgg_register_action()} instead
+ *
+ * @param string $action The name of the action (eg "register", "account/settings/save")
+ * @param boolean $public Can this action be accessed by people not logged into the system?
+ * @param string $filename Optionally, the filename where this action is located
+ * @param boolean $admin_only Whether this action is only available to admin users.
+ */
+function register_action($action, $public = false, $filename = "", $admin_only = false) {
+ elgg_deprecated_notice("register_action() was deprecated by elgg_register_action()", 1.8);
+
+ if ($admin_only) {
+ $access = 'admin';
+ } elseif ($public) {
+ $access = 'public';
+ } else {
+ $access = 'logged_in';
+ }
+
+ return elgg_register_action($action, $filename, $access);
+}
+
+/**
+ * Register an admin page with the admin panel.
+ * This function extends the view "admin/main" with the provided view.
+ * This view should provide a description and either a control or a link to.
+ *
+ * @deprecated 1.8 Extend admin views manually
+ *
+ * Usage:
+ * - To add a control to the main admin panel then extend admin/main
+ * - To add a control to a new page create a page which renders a view admin/subpage
+ * (where subpage is your new page -
+ * nb. some pages already exist that you can extend), extend the main view to point to it,
+ * and add controls to your new view.
+ *
+ * At the moment this is essentially a wrapper around elgg_extend_view().
+ *
+ * @param string $new_admin_view The view associated with the control you're adding
+ * @param string $view The view to extend, by default this is 'admin/main'.
+ * @param int $priority Optional priority to govern the appearance in the list.
+ *
+ * @return void
+ */
+function extend_elgg_admin_page($new_admin_view, $view = 'admin/main', $priority = 500) {
+ elgg_deprecated_notice('extend_elgg_admin_page() does nothing. Extend admin views manually.', 1.8);
+}
+
+/**
+ * Get entities ordered by a mathematical calculation
+ *
+ * @deprecated 1.8 Use elgg_get_entities_from_annotation_calculation()
+ *
+ * @param string $sum What sort of calculation to perform
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $mdname Metadata name
+ * @param string $mdvalue Metadata value
+ * @param int $owner_guid GUID of owner of annotation
+ * @param int $limit Limit of results
+ * @param int $offset Offset of results
+ * @param string $orderdir Order of results
+ * @param bool $count Return count or entities
+ *
+ * @return mixed
+ */
+function get_entities_from_annotations_calculate_x($sum = "sum", $entity_type = "", $entity_subtype = "", $name = "", $mdname = '', $mdvalue = '', $owner_guid = 0, $limit = 10, $offset = 0, $orderdir = 'desc', $count = false) {
+
+ $msg = 'get_entities_from_annotations_calculate_x() is deprecated by elgg_get_entities_from_annotation_calculation().';
+
+ elgg_deprecated_notice($msg, 1.8);
+
+ $options = array();
+
+ $options['calculation'] = $sum;
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ $options['annotation_names'] = $name;
+
+ if ($mdname) {
+ $options['metadata_names'] = $mdname;
+ }
+
+ if ($mdvalue) {
+ $options['metadata_values'] = $mdvalue;
+ }
+
+ // original function rewrote this to container guid.
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['container_guids'] = $owner_guid;
+ } else {
+ $options['container_guid'] = $owner_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+
+ $options['order_by'] = "annotation_calculation $orderdir";
+
+ $options['count'] = $count;
+
+ return elgg_get_entities_from_annotation_calculation($options);
+}
+
+/**
+ * Returns entities ordered by the sum of an annotation
+ *
+ * @warning This is function uses sum instead of count. THIS IS SLOW. See #3366.
+ * This should be used when you have annotations with different values and you
+ * want a list of entities ordered by the sum of all of those values.
+ * If you want a list of entities ordered by the number of annotations on each entity,
+ * use __get_entities_from_annotations_calculate_x() and pass 'count' as the first param.
+ *
+ * @deprecated 1.8 Use elgg_get_entities_from_annotation_calculation()
+ *
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $mdname Metadata name
+ * @param string $mdvalue Metadata value
+ * @param int $owner_guid GUID of owner of annotation
+ * @param int $limit Limit of results
+ * @param int $offset Offset of results
+ * @param string $orderdir Order of results
+ * @param bool $count Return count or entities
+ *
+ * @return unknown
+ */
+function get_entities_from_annotation_count($entity_type = "", $entity_subtype = "", $name = "", $mdname = '', $mdvalue = '', $owner_guid = 0, $limit = 10, $offset = 0, $orderdir = 'desc', $count = false) {
+
+ $msg = 'get_entities_from_annotation_count() is deprecated by elgg_get_entities_from_annotation_calculation().';
+
+ elgg_deprecated_notice($msg, 1.8);
+
+ $options = array();
+
+ $options['calculation'] = 'sum';
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ $options['annotation_names'] = $name;
+
+ if ($mdname) {
+ $options['metadata_names'] = $mdname;
+ }
+
+ if ($mdvalue) {
+ $options['metadata_values'] = $mdvalue;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+
+ $options['order_by'] = "annotation_calculation $orderdir";
+
+ $options['count'] = $count;
+
+ return elgg_get_entities_from_annotation_calculation($options);
+}
+
+/**
+ * Lists entities by the totals of a particular kind of annotation
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_annotation_calculation()
+ *
+ * @param string $entity_type Type of entity.
+ * @param string $entity_subtype Subtype of entity.
+ * @param string $name Name of annotation.
+ * @param int $limit Maximum number of results to return.
+ * @param int $owner_guid Owner.
+ * @param int $group_guid Group container. Currently only supported if entity_type is object
+ * @param boolean $asc Whether to list in ascending or descending order (default: desc)
+ * @param boolean $fullview Whether to display the entities in full
+ * @param boolean $listtypetoggle Can the 'gallery' view can be displayed (default: no)
+ * @param boolean $pagination Add pagination
+ * @param string $orderdir Order desc or asc
+ *
+ * @return string Formatted entity list
+ */
+function list_entities_from_annotation_count($entity_type = "", $entity_subtype = "", $name = "", $limit = 10, $owner_guid = 0, $group_guid = 0, $asc = false, $fullview = true, $listtypetoggle = false, $pagination = true, $orderdir = 'desc') {
+
+ $msg = 'list_entities_from_annotation_count() is deprecated by elgg_list_entities_from_annotation_calculation().';
+
+ elgg_deprecated_notice($msg, 1.8);
+
+ $options = array();
+
+ $options['calculation'] = 'sum';
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ $options['annotation_names'] = $name;
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ $options['full_view'] = $fullview;
+
+ $options['list_type_toggle'] = $listtypetoggle;
+
+ $options['pagination'] = $pagination;
+
+ $options['limit'] = $limit;
+
+ $options['order_by'] = "annotation_calculation $orderdir";
+
+ return elgg_get_entities_from_annotation_calculation($options);
+}
+
+/**
+ * Adds an entry in $CONFIG[$register_name][$subregister_name].
+ *
+ * @deprecated 1.8 Use the new menu system.
+ *
+ * This is only used for the site-wide menu. See {@link add_menu()}.
+ *
+ * @param string $register_name The name of the top-level register
+ * @param string $subregister_name The name of the subregister
+ * @param mixed $subregister_value The value of the subregister
+ * @param array $children_array Optionally, an array of children
+ *
+ * @return true|false Depending on success
+ */
+function add_to_register($register_name, $subregister_name, $subregister_value, $children_array = array()) {
+ elgg_deprecated_notice("add_to_register() has been deprecated", 1.8);
+ global $CONFIG;
+
+ if (empty($register_name) || empty($subregister_name)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->registers)) {
+ $CONFIG->registers = array();
+ }
+
+ if (!isset($CONFIG->registers[$register_name])) {
+ $CONFIG->registers[$register_name] = array();
+ }
+
+ $subregister = new stdClass;
+ $subregister->name = $subregister_name;
+ $subregister->value = $subregister_value;
+
+ if (is_array($children_array)) {
+ $subregister->children = $children_array;
+ }
+
+ $CONFIG->registers[$register_name][$subregister_name] = $subregister;
+ return true;
+}
+
+/**
+ * Removes a register entry from $CONFIG[register_name][subregister_name]
+ *
+ * @deprecated 1.8 Use the new menu system.
+ *
+ * This is used to by {@link remove_menu()} to remove site-wide menu items.
+ *
+ * @param string $register_name The name of the top-level register
+ * @param string $subregister_name The name of the subregister
+ *
+ * @return true|false Depending on success
+ * @since 1.7.0
+ */
+function remove_from_register($register_name, $subregister_name) {
+ elgg_deprecated_notice("remove_from_register() has been deprecated", 1.8);
+ global $CONFIG;
+
+ if (empty($register_name) || empty($subregister_name)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->registers)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->registers[$register_name])) {
+ return false;
+ }
+
+ if (isset($CONFIG->registers[$register_name][$subregister_name])) {
+ unset($CONFIG->registers[$register_name][$subregister_name]);
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * If it exists, returns a particular register as an array
+ *
+ * @deprecated 1.8 Use the new menu system
+ *
+ * @param string $register_name The name of the register
+ *
+ * @return array|false Depending on success
+ */
+function get_register($register_name) {
+ elgg_deprecated_notice("get_register() has been deprecated", 1.8);
+ global $CONFIG;
+
+ if ($register_name == 'menu') {
+ // backward compatible code for site menu
+ $menu = $CONFIG->menus['site'];
+ $builder = new ElggMenuBuilder($menu);
+ $menu_items = $builder->getMenu('text');
+ $menu_items = $menu_items['default'];
+
+ $menu = array();
+ foreach ($menu_items as $item) {
+ $subregister = new stdClass;
+ $subregister->name = $item->getText();
+ $subregister->value = $item->getHref();
+ $menu[$subregister->name] = $subregister;
+ }
+ return $menu;
+ }
+
+ if (isset($CONFIG->registers[$register_name])) {
+ return $CONFIG->registers[$register_name];
+ }
+
+ return false;
+}
+
+/**
+ * Deprecated events core function. Code divided between elgg_register_event_handler()
+ * and trigger_elgg_event().
+ *
+ * @deprecated 1.8 Use explicit register/trigger event functions
+ *
+ * @param string $event The type of event (eg 'init', 'update', 'delete')
+ * @param string $object_type The type of object (eg 'system', 'blog', 'user')
+ * @param string $function The name of the function that will handle the event
+ * @param int $priority Priority to call handler. Lower numbers called first (default 500)
+ * @param boolean $call Set to true to call the event rather than add to it (default false)
+ * @param mixed $object Optionally, the object the event is being performed on (eg a user)
+ *
+ * @return true|false Depending on success
+ */
+function events($event = "", $object_type = "", $function = "", $priority = 500, $call = false, $object = null) {
+
+ elgg_deprecated_notice('events() has been deprecated.', 1.8);
+
+ // leaving this here just in case someone was directly calling this internal function
+ if (!$call) {
+ return elgg_register_event_handler($event, $object_type, $function, $priority);
+ } else {
+ return trigger_elgg_event($event, $object_type, $object);
+ }
+}
+
+/**
+ * Alias function for events, that registers a function to a particular kind of event
+ *
+ * @deprecated 1.8 Use elgg_register_event_handler() instead
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $function The function name
+ * @return true|false Depending on success
+ */
+function register_elgg_event_handler($event, $object_type, $callback, $priority = 500) {
+ elgg_deprecated_notice("register_elgg_event_handler() was deprecated by elgg_register_event_handler()", 1.8);
+ return elgg_register_event_handler($event, $object_type, $callback, $priority);
+}
+
+/**
+ * Unregisters a function to a particular kind of event
+ *
+ * @deprecated 1.8 Use elgg_unregister_event_handler instead
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $function The function name
+ * @since 1.7.0
+ */
+function unregister_elgg_event_handler($event, $object_type, $callback) {
+ elgg_deprecated_notice('unregister_elgg_event_handler => elgg_unregister_event_handler', 1.8);
+ elgg_unregister_event_handler($event, $object_type, $callback);
+}
+
+/**
+ * Alias function for events, that triggers a particular kind of event
+ *
+ * @deprecated 1.8 Use elgg_trigger_event() instead
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $function The function name
+ * @return true|false Depending on success
+ */
+function trigger_elgg_event($event, $object_type, $object = null) {
+ elgg_deprecated_notice('trigger_elgg_event() was deprecated by elgg_trigger_event()', 1.8);
+ return elgg_trigger_event($event, $object_type, $object);
+}
+
+/**
+ * Register a function to a plugin hook for a particular entity type, with a given priority.
+ *
+ * @deprecated 1.8 Use elgg_register_plugin_hook_handler() instead
+ *
+ * eg if you want the function "export_user" to be called when the hook "export" for "user" entities
+ * is run, use:
+ *
+ * register_plugin_hook("export", "user", "export_user");
+ *
+ * "all" is a valid value for both $hook and $entity_type. "none" is a valid value for $entity_type.
+ *
+ * The export_user function would then be defined as:
+ *
+ * function export_user($hook, $entity_type, $returnvalue, $params);
+ *
+ * Where $returnvalue is the return value returned by the last function returned by the hook, and
+ * $params is an array containing a set of parameters (or nothing).
+ *
+ * @param string $hook The name of the hook
+ * @param string $entity_type The name of the type of entity (eg "user", "object" etc)
+ * @param string $function The name of a valid function to be run
+ * @param string $priority The priority - 0 is first, 1000 last, default is 500
+ * @return true|false Depending on success
+ */
+function register_plugin_hook($hook, $type, $callback, $priority = 500) {
+ elgg_deprecated_notice("register_plugin_hook() was deprecated by elgg_register_plugin_hook_handler()", 1.8);
+ return elgg_register_plugin_hook_handler($hook, $type, $callback, $priority);
+}
+
+/**
+ * Unregister a function to a plugin hook for a particular entity type
+ *
+ * @deprecated 1.8 Use elgg_unregister_plugin_hook_handler() instead
+ *
+ * @param string $hook The name of the hook
+ * @param string $entity_type The name of the type of entity (eg "user", "object" etc)
+ * @param string $function The name of a valid function to be run
+ * @since 1.7.0
+ */
+function unregister_plugin_hook($hook, $entity_type, $callback) {
+ elgg_deprecated_notice("unregister_plugin_hook() was deprecated by elgg_unregister_plugin_hook_handler()", 1.8);
+ elgg_unregister_plugin_hook_handler($hook, $entity_type, $callback);
+}
+
+/**
+ * Triggers a plugin hook, with various parameters as an array. For example, to provide
+ * a 'foo' hook that concerns an entity of type 'bar', with a parameter called 'param1'
+ * with value 'value1', that by default returns true, you'd call:
+ *
+ * @deprecated 1.8 Use elgg_trigger_plugin_hook() instead
+ *
+ * trigger_plugin_hook('foo', 'bar', array('param1' => 'value1'), true);
+ *
+ * @see register_plugin_hook
+ * @param string $hook The name of the hook to trigger
+ * @param string $entity_type The name of the entity type to trigger it for (or "all", or "none")
+ * @param array $params Any parameters. It's good practice to name the keys, i.e. by using array('name' => 'value', 'name2' => 'value2')
+ * @param mixed $returnvalue An initial return value
+ * @return mixed|null The cumulative return value for the plugin hook functions
+ */
+function trigger_plugin_hook($hook, $type, $params = null, $returnvalue = null) {
+ elgg_deprecated_notice("trigger_plugin_hook() was deprecated by elgg_trigger_plugin_hook()", 1.8);
+ return elgg_trigger_plugin_hook($hook, $type, $params, $returnvalue);
+}
+
+/**
+ * Checks if code is being called from a certain function.
+ *
+ * To use, call this function with the function name (and optional
+ * file location) that it has to be called from, it will either
+ * return true or false.
+ *
+ * e.g.
+ *
+ * function my_secure_function()
+ * {
+ * if (!call_gatekeeper("my_call_function"))
+ * return false;
+ *
+ * ... do secure stuff ...
+ * }
+ *
+ * function my_call_function()
+ * {
+ * // will work
+ * my_secure_function();
+ * }
+ *
+ * function bad_function()
+ * {
+ * // Will not work
+ * my_secure_function();
+ * }
+ *
+ * @param mixed $function The function that this function must have in its call stack,
+ * to test against a method pass an array containing a class and
+ * method name.
+ * @param string $file Optional file that the function must reside in.
+ *
+ * @return bool
+ *
+ * @deprecated 1.8 A neat but pointless function
+ */
+function call_gatekeeper($function, $file = "") {
+ elgg_deprecated_notice("call_gatekeeper() is neat but pointless", 1.8);
+ // Sanity check
+ if (!$function) {
+ return false;
+ }
+
+ // Check against call stack to see if this is being called from the correct location
+ $callstack = debug_backtrace();
+ $stack_element = false;
+
+ foreach ($callstack as $call) {
+ if (is_array($function)) {
+ if ((strcmp($call['class'], $function[0]) == 0) && (strcmp($call['function'], $function[1]) == 0)) {
+ $stack_element = $call;
+ }
+ } else {
+ if (strcmp($call['function'], $function) == 0) {
+ $stack_element = $call;
+ }
+ }
+ }
+
+ if (!$stack_element) {
+ return false;
+ }
+
+ // If file then check that this it is being called from this function
+ if ($file) {
+ $mirror = null;
+
+ if (is_array($function)) {
+ $mirror = new ReflectionMethod($function[0], $function[1]);
+ } else {
+ $mirror = new ReflectionFunction($function);
+ }
+
+ if ((!$mirror) || (strcmp($file, $mirror->getFileName()) != 0)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * This function checks to see if it is being called at somepoint by a function defined somewhere
+ * on a given path (optionally including subdirectories).
+ *
+ * This function is similar to call_gatekeeper() but returns true if it is being called
+ * by a method or function which has been defined on a given path or by a specified file.
+ *
+ * @param string $path The full path and filename that this function must have
+ * in its call stack If a partial path is given and
+ * $include_subdirs is true, then the function will return
+ * true if called by any function in or below the specified path.
+ * @param bool $include_subdirs Are subdirectories of the path ok, or must you specify an
+ * absolute path and filename.
+ * @param bool $strict_mode If true then the calling method or function must be directly
+ * called by something on $path, if false the whole call stack is
+ * searched.
+ *
+ * @return void
+ *
+ * @deprecated 1.8 A neat but pointless function
+ */
+function callpath_gatekeeper($path, $include_subdirs = true, $strict_mode = false) {
+ elgg_deprecated_notice("callpath_gatekeeper() is neat but pointless", 1.8);
+
+ global $CONFIG;
+
+ $path = sanitise_string($path);
+
+ if ($path) {
+ $callstack = debug_backtrace();
+
+ foreach ($callstack as $call) {
+ $call['file'] = str_replace("\\", "/", $call['file']);
+
+ if ($include_subdirs) {
+ if (strpos($call['file'], $path) === 0) {
+
+ if ($strict_mode) {
+ $callstack[1]['file'] = str_replace("\\", "/", $callstack[1]['file']);
+ if ($callstack[1] === $call) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ } else {
+ if (strcmp($path, $call['file']) == 0) {
+ if ($strict_mode) {
+ if ($callstack[1] === $call) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+ }
+
+ }
+ return false;
+ }
+
+ if (isset($CONFIG->debug)) {
+ system_message("Gatekeeper'd function called from {$callstack[1]['file']}:" . "{$callstack[1]['line']}\n\nStack trace:\n\n" . print_r($callstack, true));
+ }
+
+ return false;
+}
+
+/**
+ * Returns SQL where clause for owner and containers.
+ *
+ * @deprecated 1.8 Use elgg_get_guid_based_where_sql();
+ *
+ * @param string $table Entity table prefix as defined in SELECT...FROM entities $table
+ * @param NULL|array $owner_guids Owner GUIDs
+ *
+ * @return FALSE|str
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_owner_where_sql($table, $owner_guids) {
+ elgg_deprecated_notice('elgg_get_entity_owner_where_sql() is deprecated by elgg_get_guid_based_where_sql().', 1.8);
+
+ return elgg_get_guid_based_where_sql("{$table}.owner_guid", $owner_guids);
+}
+
+/**
+ * Returns SQL where clause for containers.
+ *
+ * @deprecated 1.8 Use elgg_get_guid_based_where_sql();
+ *
+ * @param string $table Entity table prefix as defined in
+ * SELECT...FROM entities $table
+ * @param NULL|array $container_guids Array of container guids
+ *
+ * @return FALSE|string
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_container_where_sql($table, $container_guids) {
+ elgg_deprecated_notice('elgg_get_entity_container_where_sql() is deprecated by elgg_get_guid_based_where_sql().', 1.8);
+
+ return elgg_get_guid_based_where_sql("{$table}.container_guid", $container_guids);
+}
+
+/**
+ * Returns SQL where clause for site entities
+ *
+ * @deprecated 1.8 Use elgg_get_guid_based_where_sql()
+ *
+ * @param string $table Entity table prefix as defined in SELECT...FROM entities $table
+ * @param NULL|array $site_guids Array of site guids
+ *
+ * @return FALSE|string
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_site_where_sql($table, $site_guids) {
+ elgg_deprecated_notice('elgg_get_entity_site_where_sql() is deprecated by elgg_get_guid_based_where_sql().', 1.8);
+
+ return elgg_get_guid_based_where_sql("{$table}.site_guid", $site_guids);
+}
+
+/**
+ * Return an array of objects in a given container.
+ *
+ * @see get_entities()
+ *
+ * @param int $group_guid The container (defaults to current page owner)
+ * @param string $subtype The subtype
+ * @param int $owner_guid Owner
+ * @param int $site_guid The site
+ * @param string $order_by Order
+ * @param int $limit Limit on number of elements to return, by default 10.
+ * @param int $offset Where to start, by default 0.
+ * @param bool $count Whether to return the entities or a count of them.
+ *
+ * @return array|false
+ * @deprecated 1.8 Use elgg_get_entities() instead
+ */
+function get_objects_in_group($group_guid, $subtype = "", $owner_guid = 0, $site_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = FALSE) {
+ elgg_deprecated_notice("get_objects_in_group was deprected in 1.8. Use elgg_get_entities() instead", 1.8);
+
+ global $CONFIG;
+
+ if ($subtype === FALSE || $subtype === null || $subtype === 0) {
+ return FALSE;
+ }
+
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $site_guid = (int)$site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ $container_guid = (int)$group_guid;
+ if ($container_guid == 0) {
+ $container_guid = elgg_get_page_owner_guid();
+ }
+
+ $where = array();
+
+ $where[] = "e.type='object'";
+
+ if (!empty($subtype)) {
+ if (!$subtype = get_subtype_id('object', $subtype)) {
+ return FALSE;
+ }
+ $where[] = "e.subtype=$subtype";
+ }
+ if ($owner_guid != "") {
+ if (!is_array($owner_guid)) {
+ $owner_guid = (int)$owner_guid;
+ $where[] = "e.container_guid = '$owner_guid'";
+ } else if (sizeof($owner_guid) > 0) {
+ // Cast every element to the owner_guid array to int
+ $owner_guid = array_map("sanitise_int", $owner_guid);
+ $owner_guid = implode(",", $owner_guid);
+ $where[] = "e.container_guid in ({$owner_guid})";
+ }
+ }
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if ($container_guid > 0) {
+ $where[] = "e.container_guid = {$container_guid}";
+ }
+
+ if (!$count) {
+ $query = "SELECT * from {$CONFIG->dbprefix}entities e" . " join {$CONFIG->dbprefix}objects_entity o on e.guid=o.guid where ";
+ } else {
+ $query = "SELECT count(e.guid) as total from {$CONFIG->dbprefix}entities e" . " join {$CONFIG->dbprefix}objects_entity o on e.guid=o.guid where ";
+ }
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix('e');
+ if (!$count) {
+ $query .= " order by $order_by";
+
+ // Add order and limit
+ if ($limit) {
+ $query .= " limit $offset, $limit";
+ }
+
+ $dt = get_data($query, "entity_row_to_elggstar");
+ return $dt;
+ } else {
+ $total = get_data_row($query);
+ return $total->total;
+ }
+}
+
+/**
+ * Lists entities that belong to a group.
+ *
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $container_guid The GUID of the containing group
+ * @param int $limit The number of entities to display per page (default: 10)
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow gallery view (default: true)
+ * @param bool $pagination Whether to display pagination (default: true)
+ *
+ * @return string List of parsed entities
+ *
+ * @see elgg_list_entities()
+ * @deprecated 1.8 Use elgg_list_entities() instead
+ */
+function list_entities_groups($subtype = "", $owner_guid = 0, $container_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = true, $pagination = true) {
+ elgg_deprecated_notice("list_entities_groups was deprecated in 1.8. Use elgg_list_entities() instead.", 1.8);
+ $offset = (int)get_input('offset');
+ $count = get_objects_in_group($container_guid, $subtype, $owner_guid, 0, "", $limit, $offset, true);
+ $entities = get_objects_in_group($container_guid, $subtype, $owner_guid, 0, "", $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $listtypetoggle, $pagination);
+}
+
+/**
+ * Get all the entities from metadata from a group.
+ *
+ * @param int $group_guid The ID of the group.
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner guid
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site GUID. 0 for current, -1 for any
+ * @param bool $count Return count instead of entities
+ *
+ * @return array|false
+ * @deprecated 1.8 Use elgg_get_entities_from_metadata()
+ */
+function get_entities_from_metadata_groups($group_guid, $meta_name, $meta_value = "", $entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0, $count = false) {
+ elgg_deprecated_notice("get_entities_from_metadata_groups was deprecated in 1.8.", 1.8);
+ global $CONFIG;
+
+ $meta_n = get_metastring_id($meta_name);
+ $meta_v = get_metastring_id($meta_value);
+
+ $entity_type = sanitise_string($entity_type);
+ $entity_subtype = get_subtype_id($entity_type, $entity_subtype);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $site_guid = (int)$site_guid;
+ if (is_array($owner_guid)) {
+ foreach ($owner_guid as $key => $guid) {
+ $owner_guid[$key] = (int)$guid;
+ }
+ } else {
+ $owner_guid = (int)$owner_guid;
+ }
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ $container_guid = (int)$group_guid;
+ if ($container_guid == 0) {
+ $container_guid = elgg_get_page_owner_guid();
+ }
+
+ $where = array();
+
+ if ($entity_type != "") {
+ $where[] = "e.type='$entity_type'";
+ }
+ if ($entity_subtype) {
+ $where[] = "e.subtype=$entity_subtype";
+ }
+ if ($meta_name != "") {
+ $where[] = "m.name_id='$meta_n'";
+ }
+ if ($meta_value != "") {
+ $where[] = "m.value_id='$meta_v'";
+ }
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+ if ($container_guid > 0) {
+ $where[] = "e.container_guid = {$container_guid}";
+ }
+
+ if (is_array($owner_guid)) {
+ $where[] = "e.container_guid in (" . implode(",", $owner_guid) . ")";
+ } else if ($owner_guid > 0) {
+ $where[] = "e.container_guid = {$owner_guid}";
+ }
+
+ if (!$count) {
+ $query = "SELECT distinct e.* ";
+ } else {
+ $query = "SELECT count(e.guid) as total ";
+ }
+
+ $query .= "from {$CONFIG->dbprefix}entities e" . " JOIN {$CONFIG->dbprefix}metadata m on e.guid = m.entity_guid " . " JOIN {$CONFIG->dbprefix}objects_entity o on e.guid = o.guid where";
+
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix("e");
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($row = get_data_row($query)) {
+ return $row->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * As get_entities_from_metadata_groups() but with multiple entities.
+ *
+ * @param int $group_guid The ID of the group.
+ * @param array $meta_array Array of 'name' => 'value' pairs
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site GUID. 0 for current, -1 for any
+ * @param bool $count Return count of entities instead of entities
+ *
+ * @return int|array List of ElggEntities, or the total number if count is set to false
+ * @deprecated 1.8 Use elgg_get_entities_from_metadata()
+ */
+function get_entities_from_metadata_groups_multi($group_guid, $meta_array, $entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0, $count = false) {
+ elgg_deprecated_notice("get_entities_from_metadata_groups_multi was deprecated in 1.8.", 1.8);
+
+ global $CONFIG;
+
+ if (!is_array($meta_array) || sizeof($meta_array) == 0) {
+ return false;
+ }
+
+ $where = array();
+
+ $mindex = 1;
+ $join = "";
+ foreach ($meta_array as $meta_name => $meta_value) {
+ $meta_n = get_metastring_id($meta_name);
+ $meta_v = get_metastring_id($meta_value);
+ $join .= " JOIN {$CONFIG->dbprefix}metadata m{$mindex} on e.guid = m{$mindex}.entity_guid" . " JOIN {$CONFIG->dbprefix}objects_entity o on e.guid = o.guid ";
+
+ if ($meta_name != "") {
+ $where[] = "m{$mindex}.name_id='$meta_n'";
+ }
+
+ if ($meta_value != "") {
+ $where[] = "m{$mindex}.value_id='$meta_v'";
+ }
+
+ $mindex++;
+ }
+
+ $entity_type = sanitise_string($entity_type);
+ $entity_subtype = get_subtype_id($entity_type, $entity_subtype);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $owner_guid = (int)$owner_guid;
+
+ $site_guid = (int)$site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ //$access = get_access_list();
+
+ if ($entity_type != "") {
+ $where[] = "e.type = '{$entity_type}'";
+ }
+
+ if ($entity_subtype) {
+ $where[] = "e.subtype = {$entity_subtype}";
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if ($owner_guid > 0) {
+ $where[] = "e.owner_guid = {$owner_guid}";
+ }
+
+ if ($container_guid > 0) {
+ $where[] = "e.container_guid = {$container_guid}";
+ }
+
+ if ($count) {
+ $query = "SELECT count(e.guid) as total ";
+ } else {
+ $query = "SELECT distinct e.* ";
+ }
+
+ $query .= " from {$CONFIG->dbprefix}entities e {$join} where";
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+ $query .= get_access_sql_suffix("e"); // Add access controls
+
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * List items within a given geographic area.
+ *
+ * @param real $lat Latitude
+ * @param real $long Longitude
+ * @param real $radius The radius
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to display per page (default: 10)
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow gallery view
+ * @param bool $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @deprecated 1.8 Use elgg_get_entities_from_location()
+ */
+function list_entities_in_area($lat, $long, $radius, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = false, $navigation = true) {
+ elgg_deprecated_notice('list_entities_in_area() was deprecated. Use elgg_list_entities_from_location()', 1.8);
+
+ $options = array();
+
+ $options['latitude'] = $lat;
+ $options['longitude'] = $long;
+ $options['distance'] = $radius;
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+
+ $options['full_view'] = $fullview;
+ $options['list_type_toggle'] = $listtypetoggle;
+ $options['pagination'] = $pagination;
+
+ return elgg_list_entities_from_location($options);
+}
+
+/**
+ * List entities in a given location
+ *
+ * @param string $location Location
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to display per page (default: 10)
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow gallery view
+ * @param bool $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @deprecated 1.8 Use elgg_list_entities_from_location()
+ */
+function list_entities_location($location, $type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = false, $navigation = true) {
+ elgg_deprecated_notice('list_entities_location() was deprecated. Use elgg_list_entities_from_metadata()', 1.8);
+
+ return list_entities_from_metadata('location', $location, $type, $subtype, $owner_guid, $limit, $fullview, $listtypetoggle, $navigation);
+}
+
+/**
+ * Return entities within a given geographic area.
+ *
+ * @param float $lat Latitude
+ * @param float $long Longitude
+ * @param float $radius The radius
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count Count entities
+ * @param int $site_guid Site GUID. 0 for current, -1 for any
+ * @param int|array $container_guid Container GUID
+ *
+ * @return array A list of entities.
+ * @deprecated 1.8 Use elgg_get_entities_from_location()
+ */
+function get_entities_in_area($lat, $long, $radius, $type = "", $subtype = "", $owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0, $container_guid = NULL) {
+ elgg_deprecated_notice('get_entities_in_area() was deprecated by elgg_get_entities_from_location()!', 1.8);
+
+ $options = array();
+
+ $options['latitude'] = $lat;
+ $options['longitude'] = $long;
+ $options['distance'] = $radius;
+
+ // set container_guid to owner_guid to emulate old functionality
+ if ($owner_guid != "") {
+ if (is_null($container_guid)) {
+ $container_guid = $owner_guid;
+ }
+ }
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($container_guid) {
+ if (is_array($container_guid)) {
+ $options['container_guids'] = $container_guid;
+ } else {
+ $options['container_guid'] = $container_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_location($options);
+}
+
+/**
+ * Return a list of entities suitable for display based on the given search criteria.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_metadata
+ *
+ * @param mixed $meta_name Metadata name to search on
+ * @param mixed $meta_value The value to match, optionally
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Number of entities to display per page
+ * @param bool $fullview WDisplay the full view (default: true)
+ * @param bool $listtypetoggle Allow users to toggle to the gallery view. Default: true
+ * @param bool $pagination Display pagination? Default: true
+ * @param bool $case_sensitive Case sensitive metadata names?
+ *
+ * @return string
+ *
+ * @return string A list of entities suitable for display
+ */
+function list_entities_from_metadata($meta_name, $meta_value = "", $entity_type = ELGG_ENTITIES_ANY_VALUE, $entity_subtype = ELGG_ENTITIES_ANY_VALUE, $owner_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = true, $pagination = true, $case_sensitive = true) {
+
+ elgg_deprecated_notice('list_entities_from_metadata() was deprecated by elgg_list_entities_from_metadata()!', 1.8);
+
+ $offset = (int)get_input('offset');
+ $limit = (int)$limit;
+ $options = array(
+ 'metadata_name' => $meta_name,
+ 'metadata_value' => $meta_value,
+ 'type' => $entity_type,
+ 'subtype' => $entity_subtype,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'count' => TRUE,
+ 'metadata_case_sensitive' => $case_sensitive
+ );
+
+ // previous function allowed falsy $owner_guid for anything
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ $count = elgg_get_entities_from_metadata($options);
+
+ $options['count'] = FALSE;
+ $entities = elgg_get_entities_from_metadata($options);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $listtypetoggle, $pagination);
+}
+
+/**
+ * Returns a viewable list of entities based on the given search criteria.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param array $meta_array Array of 'name' => 'value' pairs
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param bool $fullview WDisplay the full view (default: true)
+ * @param bool $listtypetoggle Allow users to toggle to the gallery view. Default: true
+ * @param bool $pagination Display pagination? Default: true
+ *
+ * @return string List of ElggEntities suitable for display
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_metadata() instead
+ */
+function list_entities_from_metadata_multi($meta_array, $entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $fullview = true, $listtypetoggle = true, $pagination = true) {
+ elgg_deprecated_notice(elgg_echo('deprecated:function', array(
+ 'list_entities_from_metadata_multi', 'elgg_get_entities_from_metadata')), 1.8);
+
+ $offset = (int)get_input('offset');
+ $limit = (int)$limit;
+ $count = get_entities_from_metadata_multi($meta_array, $entity_type, $entity_subtype, $owner_guid, $limit, $offset, "", $site_guid, true);
+ $entities = get_entities_from_metadata_multi($meta_array, $entity_type, $entity_subtype, $owner_guid, $limit, $offset, "", $site_guid, false);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $listtypetoggle, $pagination);
+}
+
+/**
+ * Deprecated by elgg_register_menu_item(). Set $menu_name to 'page'.
+ *
+ * @see elgg_register_menu_item()
+ * @deprecated 1.8 Use the new menu system
+ *
+ * @param string $label The label
+ * @param string $link The link
+ * @param string $group The group to store item in
+ * @param boolean $onclick Add a confirmation when clicked?
+ * @param boolean $selected Is menu item selected
+ *
+ * @return bool
+ */
+function add_submenu_item($label, $link, $group = 'default', $onclick = false, $selected = NULL) {
+ elgg_deprecated_notice('add_submenu_item was deprecated by elgg_register_menu_item', 1.8);
+
+ // submenu items were added in the page setup hook usually by checking
+ // the context. We'll pass in the current context here, which will
+ // emulate that effect.
+ // if context == 'main' (default) it probably means they always wanted
+ // the menu item to show up everywhere.
+ $context = elgg_get_context();
+
+ if ($context == 'main') {
+ $context = 'all';
+ }
+
+ $item = array('name' => $label, 'text' => $label, 'href' => $link, 'context' => $context,
+ 'section' => $group,);
+
+ if ($selected) {
+ $item['selected'] = true;
+ }
+
+ if ($onclick) {
+ $js = "onclick=\"javascript:return confirm('" . elgg_echo('deleteconfirm') . "')\"";
+ $item['vars'] = array('js' => $js);
+ }
+
+ return elgg_register_menu_item('page', $item);
+}
+
+/**
+ * Remove an item from submenu by label
+ *
+ * @deprecated 1.8 Use the new menu system
+ * @see elgg_unregister_menu_item()
+ *
+ * @param string $label The item label
+ * @param string $group The submenu group (default "a")
+ * @return bool whether the item was removed or not
+ * @since 1.7.8
+ */
+function remove_submenu_item($label, $group = 'a') {
+ elgg_deprecated_notice('remove_submenu_item was deprecated by elgg_unregister_menu_item', 1.8);
+
+ return elgg_unregister_menu_item('page', $label);
+}
+
+/**
+ * Use elgg_view_menu(). Set $menu_name to 'owner_block'.
+ *
+ * @see elgg_view_menu()
+ * @deprecated 1.8 Use the new menu system. elgg_view_menu()
+ *
+ * @return string
+ */
+function get_submenu() {
+ elgg_deprecated_notice("get_submenu() has been deprecated by elgg_view_menu()", 1.8);
+ return elgg_view_menu('owner_block', array('entity' => $owner,
+ 'class' => 'elgg-menu-owner-block',));
+}
+
+/**
+ * Adds an item to the site-wide menu.
+ *
+ * You can obtain the menu array by calling {@link get_register('menu')}
+ *
+ * @param string $menu_name The name of the menu item
+ * @param string $menu_url The URL of the page
+ * @param array $menu_children Optionally, an array of submenu items (not used)
+ * @param string $context (not used)
+ *
+ * @return true|false Depending on success
+ * @deprecated 1.8 use elgg_register_menu_item() for the menu 'site'
+ */
+function add_menu($menu_name, $menu_url, $menu_children = array(), $context = "") {
+ elgg_deprecated_notice('add_menu() deprecated by elgg_register_menu_item()', 1.8);
+
+ return elgg_register_menu_item('site', array('name' => $menu_name, 'text' => $menu_name,
+ 'href' => $menu_url,));
+}
+
+/**
+ * Removes an item from the menu register
+ *
+ * @param string $menu_name The name of the menu item
+ *
+ * @return true|false Depending on success
+ * @deprecated 1.8 Use the new menu system
+ */
+function remove_menu($menu_name) {
+ elgg_deprecated_notice("remove_menu() deprecated by elgg_unregister_menu_item()", 1.8);
+ return elgg_unregister_menu_item('site', $menu_name);
+}
+
+/**
+ * When given a title, returns a version suitable for inclusion in a URL
+ *
+ * @param string $title The title
+ *
+ * @return string The optimised title
+ * @deprecated 1.8 Use elgg_get_friendly_title()
+ */
+function friendly_title($title) {
+ elgg_deprecated_notice('friendly_title was deprecated by elgg_get_friendly_title', 1.8);
+ return elgg_get_friendly_title($title);
+}
+
+/**
+ * Displays a UNIX timestamp in a friendly way (eg "less than a minute ago")
+ *
+ * @param int $time A UNIX epoch timestamp
+ *
+ * @return string The friendly time
+ * @deprecated 1.8 Use elgg_view_friendly_time()
+ */
+function friendly_time($time) {
+ elgg_deprecated_notice('friendly_time was deprecated by elgg_view_friendly_time', 1.8);
+ return elgg_view_friendly_time($time);
+}
+
+/**
+ * Filters a string into an array of significant words
+ *
+ * @deprecated 1.8 Don't use this.
+ *
+ * @param string $string A string
+ *
+ * @return array
+ */
+function filter_string($string) {
+ elgg_deprecated_notice('filter_string() was deprecated!', 1.8);
+
+ // Convert it to lower and trim
+ $string = strtolower($string);
+ $string = trim($string);
+
+ // Remove links and email addresses
+ // match protocol://address/path/file.extension?some=variable&another=asf%
+ $string = preg_replace("/\s([a-zA-Z]+:\/\/[a-z][a-z0-9\_\.\-]*[a-z]{2,6}" . "[a-zA-Z0-9\/\*\-\?\&\%\=]*)([\s|\.|\,])/iu", " ", $string);
+
+ // match www.something.domain/path/file.extension?some=variable&another=asf%
+ $string = preg_replace("/\s(www\.[a-z][a-z0-9\_\.\-]*[a-z]{2,6}" . "[a-zA-Z0-9\/\*\-\?\&\%\=]*)([\s|\.|\,])/iu", " ", $string);
+
+ // match name@address
+ $string = preg_replace("/\s([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]" . "*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})([\s|\.|\,])/iu", " ", $string);
+
+ // Sanitise the string; remove unwanted characters
+ $string = preg_replace('/\W/ui', ' ', $string);
+
+ // Explode it into an array
+ $terms = explode(' ', $string);
+
+ // Remove any blacklist terms
+ //$terms = array_filter($terms, 'remove_blacklist');
+
+ return $terms;
+}
+
+/**
+ * Returns true if the word in $input is considered significant
+ *
+ * @deprecated 1.8 Don't use this.
+ *
+ * @param string $input A word
+ *
+ * @return true|false
+ */
+function remove_blacklist($input) {
+ elgg_deprecated_notice('remove_blacklist() was deprecated!', 1.8);
+
+ global $CONFIG;
+
+ if (!is_array($CONFIG->wordblacklist)) {
+ return $input;
+ }
+
+ if (strlen($input) < 3 || in_array($input, $CONFIG->wordblacklist)) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Gets the guid of the entity that owns the current page.
+ *
+ * @deprecated 1.8 Use elgg_get_page_owner_guid()
+ *
+ * @return int The current page owner guid (0 if none).
+ */
+function page_owner() {
+ elgg_deprecated_notice('page_owner() was deprecated by elgg_get_page_owner_guid().', 1.8);
+ return elgg_get_page_owner_guid();
+}
+
+/**
+ * Gets the owner entity for the current page.
+ *
+ * @deprecated 1.8 Use elgg_get_page_owner_entity()
+ * @return ElggEntity|false The current page owner or false if none.
+ */
+function page_owner_entity() {
+ elgg_deprecated_notice('page_owner_entity() was deprecated by elgg_get_page_owner_entity().', 1.8);
+ return elgg_get_page_owner_entity();
+}
+
+/**
+ * Registers a page owner handler function
+ *
+ * @param string $functionname The callback function
+ *
+ * @deprecated 1.8 Use the 'page_owner', 'system' plugin hook
+ * @return void
+ */
+function add_page_owner_handler($functionname) {
+ elgg_deprecated_notice("add_page_owner_handler() was deprecated by the plugin hook 'page_owner', 'system'.", 1.8);
+}
+
+/**
+ * Set a page owner entity
+ *
+ * @param int $entitytoset The GUID of the entity
+ *
+ * @deprecated 1.8 Use elgg_set_page_owner_guid()
+ * @return void
+ */
+function set_page_owner($entitytoset = -1) {
+ elgg_deprecated_notice('set_page_owner() was deprecated by elgg_set_page_owner_guid().', 1.8);
+ elgg_set_page_owner_guid($entitytoset);
+}
+
+/**
+ * Sets the functional context of a page
+ *
+ * @deprecated 1.8 Use elgg_set_context()
+ *
+ * @param string $context The context of the page
+ *
+ * @return mixed Either the context string, or false on failure
+ */
+function set_context($context) {
+ elgg_deprecated_notice('set_context() was deprecated by elgg_set_context().', 1.8);
+ elgg_set_context($context);
+ if (empty($context)) {
+ return false;
+ }
+ return $context;
+}
+
+/**
+ * Returns the functional context of a page
+ *
+ * @deprecated 1.8 Use elgg_get_context()
+ *
+ * @return string The context, or 'main' if no context has been provided
+ */
+function get_context() {
+ elgg_deprecated_notice('get_context() was deprecated by elgg_get_context().', 1.8);
+ return elgg_get_context();
+
+ // @todo - used to set context based on calling script
+ // $context = get_plugin_name(true)
+}
+
+/**
+ * Returns a list of plugins to load, in the order that they should be loaded.
+ *
+ * @deprecated 1.8 Use elgg_get_plugin_ids_in_dir() or elgg_get_plugins()
+ *
+ * @return array List of plugins
+ */
+function get_plugin_list() {
+ elgg_deprecated_notice('get_plugin_list() is deprecated by elgg_get_plugin_ids_in_dir() or elgg_get_plugins()', 1.8);
+
+ $plugins = elgg_get_plugins('any');
+
+ $list = array();
+ if ($plugins) {
+ foreach ($plugins as $i => $plugin) {
+ // in <=1.7 this returned indexed by multiples of 10.
+ // uh...sure...why not.
+ $index = ($i + 1) * 10;
+ $list[$index] = $plugin->getID();
+ }
+ }
+
+ return $list;
+}
+
+/**
+ * Regenerates the list of known plugins and saves it to the current site
+ *
+ * Important: You should regenerate simplecache and the viewpath cache after executing this function
+ * otherwise you may experience view display artifacts. Do this with the following code:
+ *
+ * elgg_regenerate_simplecache();
+ * elgg_reset_system_cache();
+ *
+ * @deprecated 1.8 Use elgg_generate_plugin_entities() and elgg_set_plugin_priorities()
+ *
+ * @param array $pluginorder Optionally, a list of existing plugins and their orders
+ *
+ * @return array The new list of plugins and their orders
+ */
+function regenerate_plugin_list($pluginorder = FALSE) {
+ $msg = 'regenerate_plugin_list() is (sorta) deprecated by elgg_generate_plugin_entities() and'
+ . ' elgg_set_plugin_priorities().';
+ elgg_deprecated_notice($msg, 1.8);
+
+ // they're probably trying to set it?
+ if ($pluginorder) {
+ if (elgg_generate_plugin_entities()) {
+ // sort the plugins by the index numerically since we used
+ // weird indexes in the old system.
+ ksort($pluginorder, SORT_NUMERIC);
+ return elgg_set_plugin_priorities($pluginorder);
+ }
+ return false;
+ } else {
+ // they're probably trying to regenerate from disk?
+ return elgg_generate_plugin_entities();
+ }
+}
+
+/**
+ * Get the name of the most recent plugin to be called in the
+ * call stack (or the plugin that owns the current page, if any).
+ *
+ * i.e., if the last plugin was in /mod/foobar/, get_plugin_name would return foo_bar.
+ *
+ * @deprecated 1.8 Use elgg_get_calling_plugin_id()
+ *
+ * @param boolean $mainfilename If set to true, this will instead determine the
+ * context from the main script filename called by
+ * the browser. Default = false.
+ *
+ * @return string|false Plugin name, or false if no plugin name was called
+ */
+function get_plugin_name($mainfilename = false) {
+ elgg_deprecated_notice('get_plugin_name() is deprecated by elgg_get_calling_plugin_id()', 1.8);
+
+ return elgg_get_calling_plugin_id($mainfilename);
+}
+
+/**
+ * Load and parse a plugin manifest from a plugin XML file.
+ *
+ * @example plugins/manifest.xml Example 1.8-style manifest file.
+ *
+ * @deprecated 1.8 Use ElggPlugin->getManifest()
+ *
+ * @param string $plugin Plugin name.
+ * @return array of values
+ */
+function load_plugin_manifest($plugin) {
+ elgg_deprecated_notice('load_plugin_manifest() is deprecated by ElggPlugin->getManifest()', 1.8);
+
+ $xml_file = elgg_get_plugins_path() . "$plugin/manifest.xml";
+
+ try {
+ $manifest = new ElggPluginManifest($xml_file, $plugin);
+ } catch(Exception $e) {
+ return false;
+ }
+
+ return $manifest->getManifest();
+}
+
+/**
+ * This function checks a plugin manifest 'elgg_version' value against the current install
+ * returning TRUE if the elgg_version is >= the current install's version.
+ *
+ * @deprecated 1.8 Use ElggPlugin->canActivate()
+ *
+ * @param string $manifest_elgg_version_string The build version (eg 2009010201).
+ * @return bool
+ */
+function check_plugin_compatibility($manifest_elgg_version_string) {
+ elgg_deprecated_notice('check_plugin_compatibility() is deprecated by ElggPlugin->canActivate()', 1.8);
+
+ $version = get_version();
+
+ if (strpos($manifest_elgg_version_string, '.') === false) {
+ // Using version
+ $req_version = (int)$manifest_elgg_version_string;
+
+ return ($version >= $req_version);
+ }
+
+ return false;
+}
+
+/**
+ * Shorthand function for finding the plugin settings.
+ *
+ * @deprecated 1.8 Use elgg_get_calling_plugin_entity() or elgg_get_plugin_from_id()
+ *
+ * @param string $plugin_id Optional plugin id, if not specified
+ * then it is detected from where you are calling.
+ *
+ * @return mixed
+ */
+function find_plugin_settings($plugin_id = null) {
+ elgg_deprecated_notice('find_plugin_setting() is deprecated by elgg_get_calling_plugin_entity() or elgg_get_plugin_from_id()', 1.8);
+ if ($plugin_id) {
+ return elgg_get_plugin_from_id($plugin_id);
+ } else {
+ return elgg_get_calling_plugin_entity();
+ }
+}
+
+/**
+ * Return an array of installed plugins.
+ *
+ * @deprecated 1.8 use elgg_get_plugins()
+ *
+ * @param string $status any|enabled|disabled
+ * @return array
+ */
+function get_installed_plugins($status = 'all') {
+ global $CONFIG;
+
+ elgg_deprecated_notice('get_installed_plugins() was deprecated by elgg_get_plugins()', 1.8);
+
+ $plugins = elgg_get_plugins($status);
+
+ if (!$plugins) {
+ return array();
+ }
+
+ $installed_plugins = array();
+
+ foreach ($plugins as $plugin) {
+ if (!$plugin->isValid()) {
+ continue;
+ }
+
+ $include = true;
+
+ if ($status == 'enabled' && !$plugin->isActive()) {
+ $include = false;
+ } elseif ($status == 'disabled' && $plugin->isActive()) {
+ $include = true;
+ }
+
+ if ($include) {
+ $installed_plugins[$plugin->getID()] = array(
+ 'active' => $plugin->isActive(),
+ 'manifest' => $plugin->getManifest()->getManifest()
+ );
+ }
+ }
+
+ return $installed_plugins;
+}
+
+/**
+ * Enable a plugin for a site (default current site)
+ *
+ * Important: You should regenerate simplecache and the viewpath cache after executing this function
+ * otherwise you may experience view display artifacts. Do this with the following code:
+ *
+ * elgg_regenerate_simplecache();
+ * elgg_reset_system_cache();
+ *
+ * @deprecated 1.8 Use ElggPlugin->activate()
+ *
+ * @param string $plugin The plugin name.
+ * @param int $site_guid The site id, if not specified then this is detected.
+ *
+ * @return array
+ * @throws InvalidClassException
+ */
+function enable_plugin($plugin, $site_guid = null) {
+ elgg_deprecated_notice('enable_plugin() was deprecated by ElggPlugin->activate()', 1.8);
+
+ $plugin = sanitise_string($plugin);
+
+ $site_guid = (int) $site_guid;
+ if (!$site_guid) {
+ $site = get_config('site');
+ $site_guid = $site->guid;
+ }
+
+ try {
+ $plugin = new ElggPlugin($plugin);
+ } catch(Exception $e) {
+ return false;
+ }
+
+ if (!$plugin->canActivate($site_guid)) {
+ return false;
+ }
+
+ return $plugin->activate($site_guid);
+}
+
+/**
+ * Disable a plugin for a site (default current site)
+ *
+ * Important: You should regenerate simplecache and the viewpath cache after executing this function
+ * otherwise you may experience view display artifacts. Do this with the following code:
+ *
+ * elgg_regenerate_simplecache();
+ * elgg_reset_system_cache();
+ *
+ * @deprecated 1.8 Use ElggPlugin->deactivate()
+ *
+ * @param string $plugin The plugin name.
+ * @param int $site_guid The site id, if not specified then this is detected.
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+function disable_plugin($plugin, $site_guid = 0) {
+ elgg_deprecated_notice('disable_plugin() was deprecated by ElggPlugin->deactivate()', 1.8);
+
+ $plugin = sanitise_string($plugin);
+
+ $site_guid = (int) $site_guid;
+ if (!$site_guid) {
+ $site = get_config('site');
+ $site_guid = $site->guid;
+ }
+
+ try {
+ $plugin = new ElggPlugin($plugin);
+ } catch(Exception $e) {
+ return false;
+ }
+
+ return $plugin->deactivate($site_guid);
+}
+
+/**
+ * Return whether a plugin is enabled or not.
+ *
+ * @deprecated 1.8 Use elgg_is_active_plugin()
+ *
+ * @param string $plugin The plugin name.
+ * @param int $site_guid The site id, if not specified then this is detected.
+ *
+ * @return bool
+ */
+function is_plugin_enabled($plugin, $site_guid = 0) {
+ elgg_deprecated_notice('is_plugin_enabled() was deprecated by elgg_is_active_plugin()', 1.8);
+ return elgg_is_active_plugin($plugin, $site_guid);
+}
+
+/**
+ * Get entities based on their private data.
+ *
+ * @param string $name The name of the setting
+ * @param string $value The value of the setting
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count Return a count of entities
+ * @param int $site_guid The site to get entities for. 0 for current, -1 for any
+ * @param mixed $container_guid The container(s) GUIDs
+ *
+ * @return array A list of entities.
+ * @deprecated 1.8 Use elgg_get_entities_from_private_settings()
+ */
+function get_entities_from_private_setting($name = "", $value = "", $type = "", $subtype = "",
+$owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0,
+$container_guid = null) {
+ elgg_deprecated_notice('get_entities_from_private_setting() was deprecated by elgg_get_entities_from_private_setting()!', 1.8);
+
+ $options = array();
+
+ $options['private_setting_name'] = $name;
+ $options['private_setting_value'] = $value;
+
+ // set container_guid to owner_guid to emulate old functionality
+ if ($owner_guid != "") {
+ if (is_null($container_guid)) {
+ $container_guid = $owner_guid;
+ }
+ }
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($container_guid) {
+ if (is_array($container_guid)) {
+ $options['container_guids'] = $container_guid;
+ } else {
+ $options['container_guid'] = $container_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_private_settings($options);
+}
+
+/**
+ * Get entities based on their private data by multiple keys.
+ *
+ * @param string $name The name of the setting
+ * @param mixed $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param bool $count Count entities
+ * @param int $site_guid Site GUID. 0 for current, -1 for any.
+ * @param mixed $container_guid Container GUID
+ *
+ * @return array A list of entities.
+ * @deprecated 1.8 Use elgg_get_entities_from_private_settings()
+ */
+function get_entities_from_private_setting_multi(array $name, $type = "", $subtype = "",
+$owner_guid = 0, $order_by = "", $limit = 10, $offset = 0, $count = false,
+$site_guid = 0, $container_guid = null) {
+
+ elgg_deprecated_notice('get_entities_from_private_setting_multi() was deprecated by elgg_get_entities_from_private_settings()!', 1.8);
+
+ $options = array();
+
+ $pairs = array();
+ foreach ($name as $setting_name => $setting_value) {
+ $pairs[] = array('name' => $setting_name, 'value' => $setting_value);
+ }
+ $options['private_setting_name_value_pairs'] = $pairs;
+
+ // set container_guid to owner_guid to emulate old functionality
+ if ($owner_guid != "") {
+ if (is_null($container_guid)) {
+ $container_guid = $owner_guid;
+ }
+ }
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ if ($container_guid) {
+ if (is_array($container_guid)) {
+ $options['container_guids'] = $container_guid;
+ } else {
+ $options['container_guid'] = $container_guid;
+ }
+ }
+
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_private_settings($options);
+}
+
+/**
+ * Returns a viewable list of entities by relationship
+ *
+ * @see elgg_view_entity_list
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_relationship()
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to instead say "give me all entities for whome $relationship_guid is a $relationship of"
+ * @param string $type The type of entity (eg 'object')
+ * @param string $subtype The entity subtype
+ * @param int $owner_guid The owner (default: all)
+ * @param int $limit The number of entities to display on a page
+ * @param true|false $fullview Whether or not to display the full view (default: true)
+ * @param true|false $viewtypetoggle Whether or not to allow gallery view
+ * @param true|false $pagination Whether to display pagination (default: true)
+ * @param bool $order_by SQL order by clause
+ * @return string The viewable list of entities
+ */
+function list_entities_from_relationship($relationship, $relationship_guid,
+$inverse_relationship = false, $type = ELGG_ENTITIES_ANY_VALUE,
+$subtype = ELGG_ENTITIES_ANY_VALUE, $owner_guid = 0, $limit = 10,
+$fullview = true, $listtypetoggle = false, $pagination = true, $order_by = '') {
+
+ elgg_deprecated_notice("list_entities_from_relationship was deprecated by elgg_list_entities_from_relationship()!", 1.8);
+ return elgg_list_entities_from_relationship(array(
+ 'relationship' => $relationship,
+ 'relationship_guid' => $relationship_guid,
+ 'inverse_relationship' => $inverse_relationship,
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'owner_guid' => $owner_guid,
+ 'order_by' => $order_by,
+ 'limit' => $limit,
+ 'full_view' => $fullview,
+ 'list_type_toggle' => $listtypetoggle,
+ 'pagination' => $pagination,
+ ));
+}
+
+/**
+ * Gets the number of entities by a the number of entities related to them in a particular way.
+ * This is a good way to get out the users with the most friends, or the groups with the
+ * most members.
+ *
+ * @deprecated 1.8 Use elgg_get_entities_from_relationship_count()
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param bool $inverse_relationship Inverse relationship owners
+ * @param string $type The type of entity (default: all)
+ * @param string $subtype The entity subtype (default: all)
+ * @param int $owner_guid The owner of the entities (default: none)
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param bool $count Return a count instead of entities
+ * @param int $site_guid Site GUID
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ */
+function get_entities_by_relationship_count($relationship, $inverse_relationship = true, $type = "",
+$subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ elgg_deprecated_notice('get_entities_by_relationship_count() is deprecated by elgg_get_entities_from_relationship_count()', 1.8);
+
+ $options = array();
+
+ $options['relationship'] = $relationship;
+
+ // this used to default to true, which is wrong.
+ // flip it for the new function
+ $options['inverse_relationship'] = !$inverse_relationship;
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ $options['limit'] = $limit;
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_relationship_count($options);
+}
+
+/**
+ * Displays a human-readable list of entities
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_relationship_count()
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param bool $inverse_relationship Inverse relationship owners
+ * @param string $type The type of entity (eg 'object')
+ * @param string $subtype The entity subtype
+ * @param int $owner_guid The owner (default: all)
+ * @param int $limit The number of entities to display on a page
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow gallery view
+ * @param bool $pagination Whether to display pagination (default: true)
+ *
+ * @return string The viewable list of entities
+ */
+function list_entities_by_relationship_count($relationship, $inverse_relationship = true,
+$type = "", $subtype = "", $owner_guid = 0, $limit = 10, $fullview = true,
+$listtypetoggle = false, $pagination = true) {
+
+ elgg_deprecated_notice('list_entities_by_relationship_count() was deprecated by elgg_list_entities_from_relationship_count()', 1.8);
+
+ $options = array();
+
+ $options['relationship'] = $relationship;
+
+ // this used to default to true, which is wrong.
+ // flip it for the new function
+ $options['inverse_relationship'] = !$inverse_relationship;
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ $options['limit'] = $limit;
+
+ $options['full_view'] = $fullview;
+
+ return elgg_list_entities_from_relationship_count($options);
+}
+
+/**
+ * Gets the number of entities by a the number of entities related to
+ * them in a particular way also constrained by metadata.
+ *
+ * @deprecated 1.8 Use elgg_get_entities_from_relationship()
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Inverse relationship owner
+ * @param String $meta_name The metadata name
+ * @param String $meta_value The metadata value
+ * @param string $type The type of entity (default: all)
+ * @param string $subtype The entity subtype (default: all)
+ * @param int $owner_guid The owner of the entities (default: none)
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param bool $count Return a count instead of entities
+ * @param int $site_guid Site GUID
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ */
+function get_entities_from_relationships_and_meta($relationship, $relationship_guid,
+$inverse_relationship = false, $meta_name = "", $meta_value = "", $type = "",
+$subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+
+ elgg_deprecated_notice('get_entities_from_relationship_and_meta() was deprecated by elgg_get_entities_from_relationship()!', 1.7);
+
+ $options = array();
+
+ $options['relationship'] = $relationship;
+ $options['relationship_guid'] = $relationship_guid;
+ $options['inverse_relationship'] = $inverse_relationship;
+
+ if ($meta_value) {
+ $options['values'] = $meta_value;
+ }
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($type) {
+ $options['types'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtypes'] = $subtype;
+ }
+
+ if ($owner_guid) {
+ $options['owner_guid'] = $owner_guid;
+ }
+
+ if ($limit) {
+ $options['limit'] = $limit;
+ }
+
+ if ($offset) {
+ $options['offset'] = $offset;
+ }
+
+ if ($order_by) {
+ $options['order_by'];
+ }
+
+ if ($site_guid) {
+ $options['site_guid'];
+ }
+
+ if ($count) {
+ $options['count'] = $count;
+ }
+
+ return elgg_get_entities_from_relationship($options);
+}
+
+
+/**
+ * Retrieves items from the river. All parameters are optional.
+ *
+ * @param int|array $subject_guid Acting entity to restrict to. Default: all
+ * @param int|array $object_guid Entity being acted on to restrict to. Default: all
+ * @param string $subject_relationship If set to a relationship type, this will use
+ * $subject_guid as the starting point and set the
+ * subjects to be all users this
+ * entity has this relationship with (eg 'friend').
+ * Default: blank
+ * @param string $type The type of entity to restrict to. Default: all
+ * @param string $subtype The subtype of entity to restrict to. Default: all
+ * @param string $action_type The type of river action to restrict to. Default: all
+ * @param int $limit The number of items to retrieve. Default: 20
+ * @param int $offset The page offset. Default: 0
+ * @param int $posted_min The minimum time period to look at. Default: none
+ * @param int $posted_max The maximum time period to look at. Default: none
+ *
+ * @return array|false Depending on success
+ * @deprecated 1.8 Use elgg_get_river()
+ */
+function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '',
+$type = '', $subtype = '', $action_type = '', $limit = 20, $offset = 0, $posted_min = 0,
+$posted_max = 0) {
+ elgg_deprecated_notice("get_river_items deprecated by elgg_get_river", 1.8);
+
+ $options = array();
+
+ if ($subject_guid) {
+ $options['subject_guid'] = $subject_guid;
+ }
+
+ if ($object_guid) {
+ $options['object_guid'] = $object_guid;
+ }
+
+ if ($subject_relationship) {
+ $options['relationship'] = $subject_relationship;
+ unset($options['subject_guid']);
+ $options['relationship_guid'] = $subject_guid;
+ }
+
+ if ($type) {
+ $options['type'] = $type;
+ }
+
+ if ($subtype) {
+ $options['subtype'] = $subtype;
+ }
+
+ if ($action_type) {
+ $options['action_type'] = $action_type;
+ }
+
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+
+ if ($posted_min) {
+ $options['posted_time_lower'] = $posted_min;
+ }
+
+ if ($posted_max) {
+ $options['posted_time_upper'] = $posted_max;
+ }
+
+ return elgg_get_river($options);
+}
+
+/**
+ * Returns a human-readable version of the river.
+ *
+ * @param int|array $subject_guid Acting entity to restrict to. Default: all
+ * @param int|array $object_guid Entity being acted on to restrict to. Default: all
+ * @param string $subject_relationship If set to a relationship type, this will use
+ * $subject_guid as the starting point and set
+ * the subjects to be all users this entity has this
+ * relationship with (eg 'friend'). Default: blank
+ * @param string $type The type of entity to restrict to. Default: all
+ * @param string $subtype The subtype of entity to restrict to. Default: all
+ * @param string $action_type The type of river action to restrict to. Default: all
+ * @param int $limit The number of items to retrieve. Default: 20
+ * @param int $posted_min The minimum time period to look at. Default: none
+ * @param int $posted_max The maximum time period to look at. Default: none
+ * @param bool $pagination Show pagination?
+ *
+ * @return string Human-readable river.
+ * @deprecated 1.8 Use elgg_list_river()
+ */
+function elgg_view_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '',
+$type = '', $subtype = '', $action_type = '', $limit = 20, $posted_min = 0,
+$posted_max = 0, $pagination = true) {
+ elgg_deprecated_notice("elgg_view_river_items deprecated for elgg_list_river", 1.8);
+
+ $river_items = get_river_items($subject_guid, $object_guid, $subject_relationship,
+ $type, $subtype, $action_type, $limit + 1, $posted_min, $posted_max);
+
+ // Get input from outside world and sanitise it
+ $offset = (int) get_input('offset', 0);
+
+ // view them
+ $params = array(
+ 'items' => $river_items,
+ 'count' => count($river_items),
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'pagination' => $pagination,
+ 'list-class' => 'elgg-list-river',
+ );
+
+ return elgg_view('page/components/list', $params);
+}
+
+/**
+ * Construct and execute the query required for the activity stream.
+ *
+ * @deprecated 1.8 This is outdated and uses the systemlog table instead of the river table.
+ * Don't use it.
+ */
+function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype = "",
+$owner_guid = "", $owner_relationship = "") {
+ elgg_deprecated_notice("get_activity_stream_data was deprecated", 1.8);
+
+ global $CONFIG;
+
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ if ($type) {
+ if (!is_array($type)) {
+ $type = array(sanitise_string($type));
+ } else {
+ foreach ($type as $k => $v) {
+ $type[$k] = sanitise_string($v);
+ }
+ }
+ }
+
+ if ($subtype) {
+ if (!is_array($subtype)) {
+ $subtype = array(sanitise_string($subtype));
+ } else {
+ foreach ($subtype as $k => $v) {
+ $subtype[$k] = sanitise_string($v);
+ }
+ }
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ foreach ($owner_guid as $k => $v) {
+ $owner_guid[$k] = (int)$v;
+ }
+ } else {
+ $owner_guid = array((int)$owner_guid);
+ }
+ }
+
+ $owner_relationship = sanitise_string($owner_relationship);
+
+ // Get a list of possible views
+ $activity_events = array();
+ $activity_views = array_merge(elgg_view_tree('activity', 'default'),
+ elgg_view_tree('river', 'default'));
+
+ $done = array();
+
+ foreach ($activity_views as $view) {
+ $fragments = explode('/', $view);
+ $tmp = explode('/', $view, 2);
+ $tmp = $tmp[1];
+
+ if ((isset($fragments[0])) && (($fragments[0] == 'river') || ($fragments[0] == 'activity'))
+ && (!in_array($tmp, $done))) {
+
+ if (isset($fragments[1])) {
+ $f = array();
+ for ($n = 1; $n < count($fragments); $n++) {
+ $val = sanitise_string($fragments[$n]);
+ switch($n) {
+ case 1: $key = 'type'; break;
+ case 2: $key = 'subtype'; break;
+ case 3: $key = 'event'; break;
+ }
+ $f[$key] = $val;
+ }
+
+ // Filter result based on parameters
+ $add = true;
+ if ($type) {
+ if (!in_array($f['type'], $type)) {
+ $add = false;
+ }
+ }
+ if (($add) && ($subtype)) {
+ if (!in_array($f['subtype'], $subtype)) {
+ $add = false;
+ }
+ }
+ if (($add) && ($event)) {
+ if (!in_array($f['event'], $event)) {
+ $add = false;
+ }
+ }
+
+ if ($add) {
+ $activity_events[] = $f;
+ }
+ }
+
+ $done[] = $tmp;
+ }
+ }
+
+ $n = 0;
+ foreach ($activity_events as $details) {
+ // Get what we're talking about
+ if ($details['subtype'] == 'default') {
+ $details['subtype'] = '';
+ }
+
+ if (($details['type']) && ($details['event'])) {
+ if ($n > 0) {
+ $obj_query .= " or ";
+ }
+
+ $access = "";
+ if ($details['type'] != 'relationship') {
+ $access = " and " . get_access_sql_suffix('sl');
+ }
+
+ $obj_query .= "( sl.object_type='{$details['type']}'
+ AND sl.object_subtype='{$details['subtype']}'
+ AND sl.event='{$details['event']}' $access )";
+
+ $n++;
+ }
+ }
+
+ // User
+ if ((count($owner_guid)) && ($owner_guid[0] != 0)) {
+ $user = " and sl.performed_by_guid in (" . implode(',', $owner_guid) . ")";
+
+ if ($owner_relationship) {
+ $friendsarray = "";
+ if ($friends = elgg_get_entities_from_relationship(array(
+ 'relationship' => $owner_relationship,
+ 'relationship_guid' => $owner_guid[0],
+ 'inverse_relationship' => FALSE,
+ 'type' => 'user',
+ 'subtype' => $subtype,
+ 'limit' => false))
+ ) {
+
+ $friendsarray = array();
+ foreach ($friends as $friend) {
+ $friendsarray[] = $friend->getGUID();
+ }
+
+ $user = " and sl.performed_by_guid in (" . implode(',', $friendsarray) . ")";
+ }
+ }
+ }
+
+ $query = "SELECT sl.* FROM {$CONFIG->dbprefix}system_log sl
+ WHERE 1 $user AND ($obj_query)
+ ORDER BY sl.time_created desc limit $offset, $limit";
+ return get_data($query);
+}
+
+/**
+ * Perform standard authentication with a given username and password.
+ * Returns an ElggUser object for use with login.
+ *
+ * @see login
+ *
+ * @param string $username The username, optionally (for standard logins)
+ * @param string $password The password, optionally (for standard logins)
+ *
+ * @return ElggUser|false The authenticated user object, or false on failure.
+ *
+ * @deprecated 1.8 Use elgg_authenticate
+ */
+function authenticate($username, $password) {
+ elgg_deprecated_notice('authenticate() has been deprecated for elgg_authenticate()', 1.8);
+ $pam = new ElggPAM('user');
+ $credentials = array('username' => $username, 'password' => $password);
+ $result = $pam->authenticate($credentials);
+ if ($result) {
+ return get_user_by_username($username);
+ }
+ return false;
+}
+
+
+/**
+ * Get the members of a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $limit User GUID
+ * @param int $offset Offset
+ *
+ * @return mixed
+ * @deprecated 1.8 Use ElggSite::getMembers()
+ */
+function get_site_members($site_guid, $limit = 10, $offset = 0) {
+ elgg_deprecated_notice("get_site_members() deprecated.
+ Use ElggSite::getMembers()", 1.8);
+
+ $site = get_entity($site_guid);
+ if ($site) {
+ return $site->getMembers($limit, $offset);
+ }
+
+ return false;
+}
+
+/**
+ * Display a list of site members
+ *
+ * @param int $site_guid The GUID of the site
+ * @param int $limit The number of members to display on a page
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ *
+ * @return string A displayable list of members
+ * @deprecated 1.8 Use ElggSite::listMembers()
+ */
+function list_site_members($site_guid, $limit = 10, $fullview = true) {
+ elgg_deprecated_notice("list_site_members() deprecated.
+ Use ElggSite::listMembers()", 1.8);
+
+ $options = array(
+ 'limit' => $limit,
+ 'full_view' => $full_view,
+ );
+
+ $site = get_entity($site_guid);
+ if ($site) {
+ return $site->listMembers($options);
+ }
+
+ return '';
+}
+
+
+/**
+ * Add a collection to a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $collection_guid Collection GUID
+ *
+ * @return mixed
+ * @deprecated 1.8 Don't use this.
+ */
+function add_site_collection($site_guid, $collection_guid) {
+ elgg_deprecated_notice("add_site_collection has been deprecated", 1.8);
+ global $CONFIG;
+
+ $site_guid = (int)$site_guid;
+ $collection_guid = (int)$collection_guid;
+
+ return add_entity_relationship($collection_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Remove a collection from a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $collection_guid Collection GUID
+ *
+ * @return mixed
+ * @deprecated 1.8 Don't use this.
+ */
+function remove_site_collection($site_guid, $collection_guid) {
+ elgg_deprecated_notice("remove_site_collection has been deprecated", 1.8);
+ $site_guid = (int)$site_guid;
+ $collection_guid = (int)$collection_guid;
+
+ return remove_entity_relationship($collection_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Get the collections belonging to a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param string $subtype Subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return mixed
+ * @deprecated 1.8 Don't use this.
+ */
+function get_site_collections($site_guid, $subtype = "", $limit = 10, $offset = 0) {
+ elgg_deprecated_notice("get_site_collections has been deprecated", 1.8);
+ $site_guid = (int)$site_guid;
+ $subtype = sanitise_string($subtype);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ // collection isn't a valid type. This won't work.
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $site_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'collection',
+ 'subtype' => $subtype,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+}
+
+/**
+ * Get an array of tags with weights for use with the output/tagcloud view.
+ *
+ * @deprecated 1.8 Use elgg_get_tags().
+ *
+ * @param int $threshold Get the threshold of minimum number of each tags to
+ * bother with (ie only show tags where there are more
+ * than $threshold occurances)
+ * @param int $limit Number of tags to return
+ * @param string $metadata_name Optionally, the name of the field you want to grab for
+ * @param string $entity_type Optionally, the entity type ('object' etc)
+ * @param string $entity_subtype The entity subtype, optionally
+ * @param int $owner_guid The GUID of the tags owner, optionally
+ * @param int $site_guid Optionally, the site to restrict to (default is the current site)
+ * @param int $start_ts Optionally specify a start timestamp for tags used to
+ * generate cloud.
+ * @param int $end_ts Optionally specify an end timestamp for tags used to generate cloud
+ *
+ * @return array|false Array of objects with ->tag and ->total values, or false on failure
+ */
+function get_tags($threshold = 1, $limit = 10, $metadata_name = "", $entity_type = "object",
+$entity_subtype = "", $owner_guid = "", $site_guid = -1, $start_ts = "", $end_ts = "") {
+
+ elgg_deprecated_notice('get_tags() has been replaced by elgg_get_tags()', 1.8);
+
+ if (is_array($metadata_name)) {
+ return false;
+ }
+
+ $options = array();
+ if ($metadata_name === '') {
+ $options['tag_names'] = array();
+ } else {
+ $options['tag_names'] = array($metadata_name);
+ }
+
+ $options['threshold'] = $threshold;
+ $options['limit'] = $limit;
+
+ // rewrite owner_guid to container_guid to emulate old functionality
+ $container_guid = $owner_guid;
+ if ($container_guid) {
+ $options['container_guids'] = $container_guid;
+ }
+
+ if ($entity_type) {
+ $options['type'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtype'] = $entity_subtype;
+ }
+
+ if ($site_guid != -1) {
+ $options['site_guids'] = $site_guid;
+ }
+
+ if ($end_ts) {
+ $options['created_time_upper'] = $end_ts;
+ }
+
+ if ($start_ts) {
+ $options['created_time_lower'] = $start_ts;
+ }
+
+ $r = elgg_get_tags($options);
+ return $r;
+}
+
+/**
+ * Loads and displays a tagcloud given particular criteria.
+ *
+ * @deprecated 1.8 use elgg_view_tagcloud()
+ *
+ * @param int $threshold Get the threshold of minimum number of each tags
+ * to bother with (ie only show tags where there are
+ * more than $threshold occurances)
+ * @param int $limit Number of tags to return
+ * @param string $metadata_name Optionally, the name of the field you want to grab for
+ * @param string $entity_type Optionally, the entity type ('object' etc)
+ * @param string $entity_subtype The entity subtype, optionally
+ * @param int $owner_guid The GUID of the tags owner, optionally
+ * @param int $site_guid Optionally, the site to restrict to (default is the current site)
+ * @param int $start_ts Optionally specify a start timestamp for tags used to
+ * generate cloud.
+ * @param int $end_ts Optionally specify an end timestamp for tags used to generate
+ * cloud.
+ *
+ * @return string The HTML (or other, depending on view type) of the tagcloud.
+ */
+function display_tagcloud($threshold = 1, $limit = 10, $metadata_name = "", $entity_type = "object",
+$entity_subtype = "", $owner_guid = "", $site_guid = -1, $start_ts = "", $end_ts = "") {
+
+ elgg_deprecated_notice('display_tagcloud() was deprecated by elgg_view_tagcloud()!', 1.8);
+
+ $tags = get_tags($threshold, $limit, $metadata_name, $entity_type,
+ $entity_subtype, $owner_guid, $site_guid, $start_ts, $end_ts);
+
+ return elgg_view('output/tagcloud', array(
+ 'value' => $tags,
+ 'type' => $entity_type,
+ 'subtype' => $entity_subtype,
+ ));
+}
+
+
+/**
+ * Obtains a list of objects owned by a user
+ *
+ * @param int $user_guid The GUID of the owning user
+ * @param string $subtype Optionally, the subtype of objects
+ * @param int $limit The number of results to return (default 10)
+ * @param int $offset Indexing offset, if any
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return false|array An array of ElggObjects or false, depending on success
+ * @deprecated 1.8 Use elgg_get_entities() instead
+ */
+function get_user_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,
+$offset = 0, $timelower = 0, $timeupper = 0) {
+ elgg_deprecated_notice("get_user_objects() was deprecated in favor of elgg_get_entities()", 1.8);
+ $ntt = elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'owner_guid' => $user_guid,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'container_guid' => $user_guid,
+ 'created_time_lower' => $timelower,
+ 'created_time_upper' => $timeupper
+ ));
+ return $ntt;
+}
+
+/**
+ * Counts the objects (optionally of a particular subtype) owned by a user
+ *
+ * @param int $user_guid The GUID of the owning user
+ * @param string $subtype Optionally, the subtype of objects
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return int The number of objects the user owns (of this subtype)
+ * @deprecated 1.8 Use elgg_get_entities() instead
+ */
+function count_user_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $timelower = 0,
+$timeupper = 0) {
+ elgg_deprecated_notice("count_user_objects() was deprecated in favor of elgg_get_entities()", 1.8);
+ $total = elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'owner_guid' => $user_guid,
+ 'count' => TRUE,
+ 'container_guid' => $user_guid,
+ 'created_time_lower' => $timelower,
+ 'created_time_upper' => $timeupper
+ ));
+ return $total;
+}
+
+/**
+ * Displays a list of user objects of a particular subtype, with navigation.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param int $user_guid The GUID of the user
+ * @param string $subtype The object subtype
+ * @param int $limit The number of entities to display on a page
+ * @param bool $fullview Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow gallery view (default: true)
+ * @param bool $pagination Whether to display pagination (default: true)
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return string The list in a form suitable to display
+ * @deprecated 1.8 Use elgg_list_entities() instead
+ */
+function list_user_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,
+$fullview = true, $listtypetoggle = true, $pagination = true, $timelower = 0, $timeupper = 0) {
+ elgg_deprecated_notice("list_user_objects() was deprecated in favor of elgg_list_entities()", 1.8);
+
+ $offset = (int) get_input('offset');
+ $limit = (int) $limit;
+ $count = (int) count_user_objects($user_guid, $subtype, $timelower, $timeupper);
+ $entities = get_user_objects($user_guid, $subtype, $limit, $offset, $timelower, $timeupper);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit, $fullview, $listtypetoggle,
+ $pagination);
+}
+
+
+/**
+ * Get user objects by an array of metadata
+ *
+ * @param int $user_guid The GUID of the owning user
+ * @param string $subtype Optionally, the subtype of objects
+ * @param array $metadata An array of metadata
+ * @param int $limit The number of results to return (default 10)
+ * @param int $offset Indexing offset, if any
+ *
+ * @return false|array An array of ElggObjects or false, depending on success
+ * @deprecated 1.8 Use elgg_get_entities_from_metadata() instead
+ */
+function get_user_objects_by_metadata($user_guid, $subtype = "", $metadata = array(),
+$limit = 0, $offset = 0) {
+ elgg_deprecated_notice("get_user_objects_by_metadata() was deprecated in favor of elgg_get_entities_from_metadata()", 1.8);
+ return get_entities_from_metadata_multi($metadata, "object", $subtype, $user_guid,
+ $limit, $offset);
+}
+
+/**
+ * Set the validation status for a user.
+ *
+ * @param bool $status Validated (true) or false
+ * @param string $method Optional method to say how a user was validated
+ * @return bool
+ * @deprecated 1.8 Use elgg_set_user_validation_status()
+ */
+function set_user_validation_status($user_guid, $status, $method = '') {
+ elgg_deprecated_notice("set_user_validation_status() is deprecated", 1.8);
+ return elgg_set_user_validation_status($user_guid, $status, $method);
+}
+
+/**
+ * Trigger an event requesting that a user guid be validated somehow - either by email address or some other way.
+ *
+ * This function invalidates any existing validation value.
+ *
+ * @param int $user_guid User's GUID
+ * @deprecated 1.8 Hook into the register, user plugin hook and request validation.
+ */
+function request_user_validation($user_guid) {
+ elgg_deprecated_notice("request_user_validation() is deprecated.
+ Plugins should register for the 'register, user' plugin hook", 1.8);
+ $user = get_entity($user_guid);
+
+ if (($user) && ($user instanceof ElggUser)) {
+ // invalidate any existing validations
+ set_user_validation_status($user_guid, false);
+
+ // request validation
+ trigger_elgg_event('validate', 'user', $user);
+ }
+}
+
+/**
+ * Register a user settings page with the admin panel.
+ * This function extends the view "usersettings/main" with the provided view.
+ * This view should provide a description and either a control or a link to.
+ *
+ * Usage:
+ * - To add a control to the main admin panel then extend usersettings/main
+ * - To add a control to a new page create a page which renders a view
+ * usersettings/subpage (where subpage is your new page -
+ * nb. some pages already exist that you can extend), extend the main view
+ * to point to it, and add controls to your new view.
+ *
+ * At the moment this is essentially a wrapper around elgg_extend_view().
+ *
+ * @param string $new_settings_view The view associated with the control you're adding
+ * @param string $view The view to extend, by default this is 'usersettings/main'.
+ * @param int $priority Optional priority to govern the appearance in the list.
+ *
+ * @return bool
+ * @deprecated 1.8 Extend one of the views in core/settings
+ */
+function extend_elgg_settings_page($new_settings_view, $view = 'usersettings/main',
+$priority = 500) {
+ // see views: /core/settings
+ elgg_deprecated_notice("extend_elgg_settings_page has been deprecated. Extend one of the settings views instead", 1.8);
+
+ return elgg_extend_view($view, $new_settings_view, $priority);
+}
+
+/**
+ * Returns a representation of a full 'page' (which might be an HTML page,
+ * RSS file, etc, depending on the current viewtype)
+ *
+ * @param string $title
+ * @param string $body
+ * @return string
+ *
+ * @deprecated 1.8 Use elgg_view_page()
+ */
+function page_draw($title, $body, $sidebar = "") {
+ elgg_deprecated_notice("page_draw() was deprecated in favor of elgg_view_page() in 1.8.", 1.8);
+
+ $vars = array(
+ 'sidebar' => $sidebar
+ );
+ echo elgg_view_page($title, $body, 'default', $vars);
+}
+
+/**
+ * Wrapper function to display search listings.
+ *
+ * @param string $icon The icon for the listing
+ * @param string $info Any information that needs to be displayed.
+ *
+ * @return string The HTML (etc) representing the listing
+ * @deprecated 1.8 use elgg_view_image_block()
+ */
+function elgg_view_listing($icon, $info) {
+ elgg_deprecated_notice('elgg_view_listing deprecated by elgg_view_image_block', 1.8);
+ return elgg_view('page/components/image_block', array('image' => $icon, 'body' => $info));
+}
+
+/**
+ * Return the icon URL for an entity.
+ *
+ * @tip Can be overridden by registering a plugin hook for entity:icon:url, $entity_type.
+ *
+ * @internal This is passed an entity rather than a guid to handle non-created entities.
+ *
+ * @param ElggEntity $entity The entity
+ * @param string $size Icon size
+ *
+ * @return string URL to the entity icon.
+ * @deprecated 1.8 Use $entity->getIconURL()
+ */
+function get_entity_icon_url(ElggEntity $entity, $size = 'medium') {
+ elgg_deprecated_notice("get_entity_icon_url() deprecated for getIconURL()", 1.8);
+ global $CONFIG;
+
+ $size = sanitise_string($size);
+ switch (strtolower($size)) {
+ case 'master':
+ $size = 'master';
+ break;
+
+ case 'large' :
+ $size = 'large';
+ break;
+
+ case 'topbar' :
+ $size = 'topbar';
+ break;
+
+ case 'tiny' :
+ $size = 'tiny';
+ break;
+
+ case 'small' :
+ $size = 'small';
+ break;
+
+ case 'medium' :
+ default:
+ $size = 'medium';
+ }
+
+ $url = false;
+
+ $viewtype = elgg_get_viewtype();
+
+ // Step one, see if anyone knows how to render this in the current view
+ $params = array('entity' => $entity, 'viewtype' => $viewtype, 'size' => $size);
+ $url = elgg_trigger_plugin_hook('entity:icon:url', $entity->getType(), $params, $url);
+
+ // Fail, so use default
+ if (!$url) {
+ $type = $entity->getType();
+ $subtype = $entity->getSubtype();
+
+ if (!empty($subtype)) {
+ $overrideurl = elgg_view("icon/{$type}/{$subtype}/{$size}", array('entity' => $entity));
+ if (!empty($overrideurl)) {
+ return $overrideurl;
+ }
+ }
+
+ $overrideurl = elgg_view("icon/{$type}/default/{$size}", array('entity' => $entity));
+ if (!empty($overrideurl)) {
+ return $overrideurl;
+ }
+
+ $url = "_graphics/icons/default/$size.png";
+ }
+
+ return elgg_normalize_url($url);
+}
+
+/**
+ * Return the current logged in user, or NULL if no user is logged in.
+ *
+ * If no user can be found in the current session, a plugin
+ * hook - 'session:get' 'user' to give plugin authors another
+ * way to provide user details to the ACL system without touching the session.
+ *
+ * @deprecated 1.8 Use elgg_get_logged_in_user_entity()
+ * @return ElggUser|NULL
+ */
+function get_loggedin_user() {
+ elgg_deprecated_notice('get_loggedin_user() is deprecated by elgg_get_logged_in_user_entity()', 1.8);
+ return elgg_get_logged_in_user_entity();
+}
+
+/**
+ * Return the current logged in user by id.
+ *
+ * @deprecated 1.8 Use elgg_get_logged_in_user_guid()
+ * @see elgg_get_logged_in_user_entity()
+ * @return int
+ */
+function get_loggedin_userid() {
+ elgg_deprecated_notice('get_loggedin_userid() is deprecated by elgg_get_logged_in_user_guid()', 1.8);
+ return elgg_get_logged_in_user_guid();
+}
+
+
+/**
+ * Returns whether or not the user is currently logged in
+ *
+ * @deprecated 1.8 Use elgg_is_logged_in();
+ * @return bool
+ */
+function isloggedin() {
+ elgg_deprecated_notice('isloggedin() is deprecated by elgg_is_logged_in()', 1.8);
+ return elgg_is_logged_in();
+}
+
+/**
+ * Returns whether or not the user is currently logged in and that they are an admin user.
+ *
+ * @deprecated 1.8 Use elgg_is_admin_logged_in()
+ * @return bool
+ */
+function isadminloggedin() {
+ elgg_deprecated_notice('isadminloggedin() is deprecated by elgg_is_admin_logged_in()', 1.8);
+ return elgg_is_admin_logged_in();
+}
+
+
+/**
+ * Loads plugins
+ *
+ * @deprecated 1.8 Use elgg_load_plugins()
+ *
+ * @return bool
+ */
+function load_plugins() {
+ elgg_deprecated_notice('load_plugins() is deprecated by elgg_load_plugins()', 1.8);
+ return elgg_load_plugins();
+}
+
+/**
+ * Find the plugin settings for a user.
+ *
+ * @param string $plugin_id Plugin name.
+ * @param int $user_guid The guid who's settings to retrieve.
+ *
+ * @deprecated 1.8 Use elgg_get_all_plugin_user_settings() or ElggPlugin->getAllUserSettings()
+ * @return StdClass Object with all user settings.
+ */
+function find_plugin_usersettings($plugin_id = null, $user_guid = 0) {
+ elgg_deprecated_notice('find_plugin_usersettings() is deprecated by elgg_get_all_plugin_user_settings()', 1.8);
+ return elgg_get_all_plugin_user_settings($user_guid, $plugin_id, true);
+}
+
+/**
+ * Set a user specific setting for a plugin.
+ *
+ * @param string $name The name - note, can't be "title".
+ * @param mixed $value The value.
+ * @param int $user_guid Optional user.
+ * @param string $plugin_id Optional plugin name, if not specified then it
+ * is detected from where you are calling from.
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_set_plugin_user_setting() or ElggPlugin->setUserSetting()
+ */
+function set_plugin_usersetting($name, $value, $user_guid = 0, $plugin_id = "") {
+ elgg_deprecated_notice('find_plugin_usersettings() is deprecated by elgg_get_all_plugin_user_settings()', 1.8);
+ return elgg_set_plugin_user_setting($name, $value, $user_guid, $plugin_id);
+}
+
+/**
+ * Clears a user-specific plugin setting
+ *
+ * @param str $name Name of the plugin setting
+ * @param int $user_guid Defaults to logged in user
+ * @param str $plugin_id Defaults to contextual plugin name
+ *
+ * @deprecated 1.8 Use elgg_unset_plugin_user_setting or ElggPlugin->unsetUserSetting().
+ * @return bool Success
+ */
+function clear_plugin_usersetting($name, $user_guid = 0, $plugin_id = '') {
+ elgg_deprecated_notice('clear_plugin_usersetting() is deprecated by elgg_unset_plugin_usersetting()', 1.8);
+ return elgg_unset_plugin_user_setting($name, $user_guid, $plugin_id);
+}
+
+/**
+ * Get a user specific setting for a plugin.
+ *
+ * @param string $name The name.
+ * @param int $user_guid Guid of owning user
+ * @param string $plugin_id Optional plugin name, if not specified
+ * it is detected from where you are calling.
+ *
+ * @deprecated 1.8 Use elgg_get_plugin_user_setting() or ElggPlugin->getUserSetting()
+ * @return mixed
+ */
+function get_plugin_usersetting($name, $user_guid = 0, $plugin_id = "") {
+ elgg_deprecated_notice('get_plugin_usersetting() is deprecated by elgg_get_plugin_user_setting()', 1.8);
+ return elgg_get_plugin_user_setting($name, $user_guid, $plugin_id);
+}
+
+/**
+ * Set a setting for a plugin.
+ *
+ * @param string $name The name - note, can't be "title".
+ * @param mixed $value The value.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @deprecated 1.8 Use elgg_set_plugin_setting() or ElggPlugin->setSetting()
+ * @return int|false
+ */
+function set_plugin_setting($name, $value, $plugin_id = null) {
+ elgg_deprecated_notice('set_plugin_setting() is deprecated by elgg_set_plugin_setting()', 1.8);
+ return elgg_set_plugin_setting($name, $value, $plugin_id);
+}
+
+/**
+ * Get setting for a plugin.
+ *
+ * @param string $name The name.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @deprecated 1.8 Use elgg_get_plugin_setting() or ElggPlugin->getSetting()
+ * @return mixed
+ */
+function get_plugin_setting($name, $plugin_id = "") {
+ elgg_deprecated_notice('get_plugin_setting() is deprecated by elgg_get_plugin_setting()', 1.8);
+ return elgg_get_plugin_setting($name, $plugin_id);
+}
+
+/**
+ * Clear a plugin setting.
+ *
+ * @param string $name The name.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @deprecated 1.8 Use elgg_unset_plugin_setting() or ElggPlugin->unsetSetting()
+ * @return bool
+ */
+function clear_plugin_setting($name, $plugin_id = "") {
+ elgg_deprecated_notice('clear_plugin_setting() is deprecated by elgg_unset_plugin_setting()', 1.8);
+ return elgg_unset_plugin_setting($name, $plugin_id);
+}
+
+/**
+ * Unsets all plugin settings for a plugin.
+ *
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_unset_all_plugin_settings() or ElggPlugin->unsetAllSettings()
+ * @since 1.7.0
+ */
+function clear_all_plugin_settings($plugin_id = "") {
+ elgg_deprecated_notice('clear_all_plugin_settings() is deprecated by elgg_unset_all_plugin_setting()', 1.8);
+ return elgg_unset_all_plugin_settings($plugin_id);
+}
+
+
+/**
+ * Get a list of annotations for a given object/user/annotation type.
+ *
+ * @param int|array $entity_guid GUID to return annotations of (falsey for any)
+ * @param string $entity_type Type of entity
+ * @param string $entity_subtype Subtype of entity
+ * @param string $name Name of annotation
+ * @param mixed $value Value of annotation
+ * @param int|array $owner_guid Owner(s) of annotation
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Order annotations by SQL
+ * @param int $timelower Lower time limit
+ * @param int $timeupper Upper time limit
+ * @param int $entity_owner_guid Owner guid for the entity
+ *
+ * @return array
+ * @deprecated 1.8 Use elgg_get_annotations()
+ */
+function get_annotations($entity_guid = 0, $entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "asc", $timelower = 0,
+$timeupper = 0, $entity_owner_guid = 0) {
+
+ elgg_deprecated_notice('get_annotations() is deprecated by elgg_get_annotations()', 1.8);
+ $options = array();
+
+ if ($entity_guid) {
+ $options['guid'] = $entity_guid;
+ }
+
+ if ($entity_type) {
+ $options['type'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtype'] = $entity_subtype;
+ }
+
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ if ($value) {
+ $options['annotation_value'] = $value;
+ }
+
+ if ($owner_guid) {
+ $options['annotation_owner_guid'] = $owner_guid;
+ }
+
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+
+ if ($order_by == 'desc') {
+ $options['order_by'] = 'n_table.time_created desc';
+ }
+
+ if ($timelower) {
+ $options['annotation_time_lower'] = $timelower;
+ }
+
+ if ($timeupper) {
+ $options['annotation_time_upper'] = $timeupper;
+ }
+
+ if ($entity_owner_guid) {
+ $options['owner_guid'] = $entity_owner_guid;
+ }
+
+ return elgg_get_annotations($options);
+}
+
+
+/**
+ * Returns a human-readable list of annotations on a particular entity.
+ *
+ * @param int $entity_guid The entity GUID
+ * @param string $name The name of the kind of annotation
+ * @param int $limit The number of annotations to display at once
+ * @param true|false $asc Display annotations in ascending order. (Default: true)
+ *
+ * @return string HTML (etc) version of the annotation list
+ * @deprecated 1.8 Use elgg_list_annotations()
+ */
+function list_annotations($entity_guid, $name = "", $limit = 25, $asc = true) {
+ elgg_deprecated_notice('list_annotations() is deprecated by elgg_list_annotations()', 1.8);
+
+ if ($asc) {
+ $asc = "asc";
+ } else {
+ $asc = "desc";
+ }
+
+ $options = array(
+ 'guid' => $entity_guid,
+ 'limit' => $limit,
+ 'order_by' => "n_table.time_created $asc"
+ );
+
+ return elgg_list_annotations($options);
+}
+
+/**
+ * Helper function to deprecate annotation calculation functions. Don't use.
+ *
+ * @param unknown_type $entity_guid
+ * @param unknown_type $entity_type
+ * @param unknown_type $entity_subtype
+ * @param unknown_type $name
+ * @param unknown_type $value
+ * @param unknown_type $value_type
+ * @param unknown_type $owner_guid
+ * @param unknown_type $timelower
+ * @param unknown_type $timeupper
+ * @param unknown_type $calculation
+ * @internal Don't use this at all.
+ * @deprecated 1.8 Use elgg_get_annotations()
+ */
+function elgg_deprecated_annotation_calculation($entity_guid = 0, $entity_type = "", $entity_subtype = "",
+$name = "", $value = "", $value_type = "", $owner_guid = 0, $timelower = 0,
+$timeupper = 0, $calculation = '') {
+
+ $options = array('annotation_calculation' => $calculation);
+
+ if ($entity_guid) {
+ $options['guid'] = $entity_guid;
+ }
+
+ if ($entity_type) {
+ $options['type'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtype'] = $entity_subtype;
+ }
+
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ if ($value) {
+ $options['annotation_value'] = $value;
+ }
+
+ if ($owner_guid) {
+ $options['annotation_owner_guid'] = $owner_guid;
+ }
+
+ if ($order_by == 'desc') {
+ $options['order_by'] = 'n_table.time_created desc';
+ }
+
+ if ($timelower) {
+ $options['annotation_time_lower'] = $timelower;
+ }
+
+ if ($timeupper) {
+ $options['annotation_time_upper'] = $timeupper;
+ }
+
+ return elgg_get_annotations($options);
+}
+
+/**
+ * Count the number of annotations based on search parameters
+ *
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ * @param int $timelower Lower time limit
+ * @param int $timeupper Upper time limit
+ *
+ * @deprecated 1.8 Use elgg_get_annotations() and pass 'count' => true
+ * @return int
+ */
+function count_annotations($entity_guid = 0, $entity_type = "", $entity_subtype = "",
+$name = "", $value = "", $value_type = "", $owner_guid = 0, $timelower = 0,
+$timeupper = 0) {
+ elgg_deprecated_notice('count_annotations() is deprecated by elgg_get_annotations() and passing "count" => true', 1.8);
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, 'count');
+}
+
+/**
+ * Return the sum of a given integer annotation.
+ *
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ *
+ * @deprecated 1.8 Use elgg_get_annotations() and pass 'annotation_calculation' => 'sum'
+ * @return int
+ */
+function get_annotations_sum($entity_guid, $entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $value_type = "", $owner_guid = 0) {
+ elgg_deprecated_notice('get_annotations_sum() is deprecated by elgg_get_annotations() and passing "annotation_calculation" => "sum"', 1.8);
+
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, 'sum');
+}
+
+/**
+ * Return the max of a given integer annotation.
+ *
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ *
+ * @deprecated 1.8 Use elgg_get_annotations() and pass 'annotation_calculation' => 'max'
+ * @return int
+ */
+function get_annotations_max($entity_guid, $entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $value_type = "", $owner_guid = 0) {
+ elgg_deprecated_notice('get_annotations_max() is deprecated by elgg_get_annotations() and passing "annotation_calculation" => "max"', 1.8);
+
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, 'max');
+}
+
+
+/**
+ * Return the minumum of a given integer annotation.
+ *
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ *
+ * @deprecated 1.8 Use elgg_get_annotations() and pass 'annotation_calculation' => 'min'
+ * @return int
+ */
+function get_annotations_min($entity_guid, $entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $value_type = "", $owner_guid = 0) {
+ elgg_deprecated_notice('get_annotations_min() is deprecated by elgg_get_annotations() and passing "annotation_calculation" => "min"', 1.8);
+
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, 'min');
+}
+
+
+/**
+ * Return the average of a given integer annotation.
+ *
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ *
+ * @deprecated 1.8 Use elgg_get_annotations() and pass 'annotation_calculation' => 'min'
+ *
+ * @return int
+ */
+function get_annotations_avg($entity_guid, $entity_type = "", $entity_subtype = "", $name = "",
+$value = "", $value_type = "", $owner_guid = 0) {
+ elgg_deprecated_notice('get_annotations_avg() is deprecated by elgg_get_annotations() and passing "annotation_calculation" => "avg"', 1.8);
+
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, 'avg');
+}
+
+
+/**
+ * Perform a mathmatical calculation on integer annotations.
+ *
+ * @param string $sum What sort of calculation to perform
+ * @param int $entity_guid Guid of Entity
+ * @param string $entity_type Type of Entity
+ * @param string $entity_subtype Subtype of Entity
+ * @param string $name Name of annotation
+ * @param string $value Value of annotation
+ * @param string $value_type Type of value
+ * @param int $owner_guid GUID of owner of annotation
+ * @param int $timelower Lower time limit
+ * @param int $timeupper Upper time limit
+ *
+ * @return int
+ * @deprecated 1.8 Use elgg_get_annotations() and pass anntoation_calculation => <calculation>
+ */
+function get_annotations_calculate_x($sum = "avg", $entity_guid, $entity_type = "",
+$entity_subtype = "", $name = "", $value = "", $value_type = "", $owner_guid = 0,
+$timelower = 0, $timeupper = 0) {
+ elgg_deprecated_notice('get_annotations_calculate_x() is deprecated by elgg_get_annotations() and passing "annotation_calculation" => "calculation"', 1.8);
+
+ return elgg_deprecated_annotation_calculation($entity_guid, $entity_type, $entity_subtype,
+ $name, $value, $value_type, $owner_guid, $timelower, $timeupper, $sum);
+}
+
+
+/**
+ * Lists entities by the totals of a particular kind of annotation AND
+ * the value of a piece of metadata
+ *
+ * @param string $entity_type Type of entity.
+ * @param string $entity_subtype Subtype of entity.
+ * @param string $name Name of annotation.
+ * @param string $mdname Metadata name
+ * @param string $mdvalue Metadata value
+ * @param int $limit Maximum number of results to return.
+ * @param int $owner_guid Owner.
+ * @param int $group_guid Group container. Currently only supported if entity_type is object
+ * @param boolean $asc Whether to list in ascending or descending order (default: desc)
+ * @param boolean $fullview Whether to display the entities in full
+ * @param boolean $listtypetoggle Can the 'gallery' view can be displayed (default: no)
+ * @param boolean $pagination Display pagination
+ * @param string $orderdir 'desc' or 'asc'
+ *
+ * @deprecated 1.8 Use elgg_list_entities_from_annotation_calculation().
+ *
+ * @return string Formatted entity list
+ */
+function list_entities_from_annotation_count_by_metadata($entity_type = "", $entity_subtype = "",
+$name = "", $mdname = '', $mdvalue = '', $limit = 10, $owner_guid = 0, $group_guid = 0,
+$asc = false, $fullview = true, $listtypetoggle = false, $pagination = true, $orderdir = 'desc') {
+
+ $msg = 'list_entities_from_annotation_count_by_metadata() is deprecated by elgg_list_entities_from_annotation_calculation().';
+
+ elgg_deprecated_notice($msg, 1.8);
+
+ $options = array();
+
+ $options['calculation'] = 'sum';
+
+ if ($entity_type) {
+ $options['types'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtypes'] = $entity_subtype;
+ }
+
+ $options['annotation_names'] = $name;
+
+ if ($mdname) {
+ $options['metadata_name'] = $mdname;
+ }
+
+ if ($mdvalue) {
+ $options['metadata_value'] = $mdvalue;
+ }
+
+ if ($owner_guid) {
+ if (is_array($owner_guid)) {
+ $options['owner_guids'] = $owner_guid;
+ } else {
+ $options['owner_guid'] = $owner_guid;
+ }
+ }
+
+ $options['full_view'] = $fullview;
+
+ $options['list_type_toggle'] = $listtypetoggle;
+
+ $options['pagination'] = $pagination;
+
+ $options['limit'] = $limit;
+
+ $options['order_by'] = "annotation_calculation $orderdir";
+
+ return elgg_get_entities_from_annotation_calculation($options);
+}
+
+/**
+ * Set an alternative base location for a view (as opposed to the default of $CONFIG->viewpath)
+ *
+ * @param string $view The name of the view
+ * @param string $location The base location path
+ *
+ * @deprecated 1.8 Use elgg_set_view_location()
+ */
+function set_view_location($view, $location, $viewtype = '') {
+ elgg_deprecated_notice("set_view_location() was deprecated by elgg_set_view_location()", 1.8);
+ return elgg_set_view_location($view, $location, $viewtype);
+}
+
+/**
+ * Sets the URL handler for a particular entity type and subtype
+ *
+ * @param string $function_name The function to register
+ * @param string $entity_type The entity type
+ * @param string $entity_subtype The entity subtype
+ * @return true|false Depending on success
+ *
+ * @deprecated 1.8 Use elgg_register_entity_url_handler()
+ */
+function register_entity_url_handler($function_name, $entity_type = "all", $entity_subtype = "all") {
+ elgg_deprecated_notice("register_entity_url_handler() was deprecated by elgg_register_entity_url_handler()", 1.8);
+ return elgg_register_entity_url_handler($entity_type, $entity_subtype, $function_name);
+}
+
+
+/**
+ * Get the metadata where the entities they are referring to match a given criteria.
+ *
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site GUID. 0 for current, -1 for any
+ *
+ * @return mixed
+ * @deprecated 1.8 Use elgg_get_metadata()
+ */
+function find_metadata($meta_name = "", $meta_value = "", $entity_type = "", $entity_subtype = "",
+ $limit = 10, $offset = 0, $order_by = "", $site_guid = 0) {
+
+ elgg_deprecated_notice('get_metadata() is deprecated by elgg_get_metadata()', 1.8);
+
+ $options = array();
+
+ if ($meta_name) {
+ $options['annotation_name'] = $meta_name;
+ }
+
+ if ($meta_value) {
+ $options['annotation_value'] = $meta_value;
+ }
+
+ if ($entity_type) {
+ $options['type'] = $entity_type;
+ }
+
+ if ($entity_subtype) {
+ $options['subtype'] = $entity_subtype;
+ }
+
+ $options['limit'] = $limit;
+ $options['offset'] = $offset;
+
+ if ($order_by == 'desc') {
+ $options['order_by'] = 'n_table.time_created desc';
+ }
+
+ if ($site_guid) {
+ $options['site_guid'] = $site_guid;
+ }
+
+ return elgg_get_metadata($options);
+}
+
+/**
+ * Get metadata objects by name.
+ *
+ * @param int $entity_guid Entity GUID
+ * @param string $meta_name Metadata name
+ *
+ * @return mixed ElggMetadata object, an array of ElggMetadata or false.
+ * @deprecated 1.8 Use elgg_get_metadata()
+ */
+function get_metadata_byname($entity_guid, $meta_name) {
+ elgg_deprecated_notice('get_metadata_byname() is deprecated by elgg_get_metadata()', 1.8);
+
+ if (!$entity_guid || !$meta_name) {
+ return false;
+ }
+
+ $options = array(
+ 'guid' => $entity_guid,
+ 'metadata_name' => $meta_name,
+ 'limit' => 0
+ );
+
+ $md = elgg_get_metadata($options);
+
+ if ($md && count($md) == 1) {
+ return $md[0];
+ }
+
+ return $md;
+}
+
+/**
+ * Return all the metadata for a given GUID.
+ *
+ * @param int $entity_guid Entity GUID
+ *
+ * @return mixed
+ * @deprecated 1.8 Use elgg_get_metadata()
+ */
+function get_metadata_for_entity($entity_guid) {
+ elgg_deprecated_notice('get_metadata_for_entity() is deprecated by elgg_get_metadata()', 1.8);
+
+ if (!$entity_guid) {
+ return false;
+ }
+
+ $options = array(
+ 'guid' => $entity_guid,
+ 'limit' => 0
+ );
+
+ return elgg_get_metadata($options);
+}
+
+/**
+ * Get a specific metadata object.
+ *
+ * @param int $id The id of the metadata being retrieved.
+ *
+ * @return mixed False on failure or ElggMetadata
+ * @deprecated 1.8 Use elgg_get_metadata_from_id()
+ */
+function get_metadata($id) {
+ elgg_deprecated_notice('get_metadata() is deprecated by elgg_get_metadata_from_id()', 1.8);
+ return elgg_get_metadata_from_id($id);
+}
+
+/**
+ * Clear all the metadata for a given entity, assuming you have access to that entity.
+ *
+ * @param int $guid Entity GUID
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_delete_metadata()
+ */
+function clear_metadata($guid) {
+ elgg_deprecated_notice('clear_metadata() is deprecated by elgg_delete_metadata()', 1.8);
+ if (!$guid) {
+ return false;
+ }
+ return elgg_delete_metadata(array('guid' => $guid, 'limit' => 0));
+}
+
+/**
+ * Clear all metadata belonging to a given owner_guid
+ *
+ * @param int $owner_guid The owner
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_delete_metadata()
+ */
+function clear_metadata_by_owner($owner_guid) {
+ elgg_deprecated_notice('clear_metadata() is deprecated by elgg_delete_metadata()', 1.8);
+ if (!$owner_guid) {
+ return false;
+ }
+ return elgg_delete_metadata(array('metadata_owner_guid' => $owner_guid, 'limit' => 0));
+}
+
+/**
+ * Delete a piece of metadata, where the current user has access.
+ *
+ * @param int $id The id of metadata to delete.
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_delete_metadata()
+ */
+function delete_metadata($id) {
+ elgg_deprecated_notice('delete_metadata() is deprecated by elgg_delete_metadata()', 1.8);
+ if (!$id) {
+ return false;
+ }
+ return elgg_delete_metadata(array('metadata_id' => $id));
+}
+
+/**
+ * Removes metadata on an entity with a particular name, optionally with a given value.
+ *
+ * @param int $guid The entity GUID
+ * @param string $name The name of the metadata
+ * @param string $value The value of the metadata (useful to remove a single item of a set)
+ *
+ * @return bool Depending on success
+ * @deprecated 1.8 Use elgg_delete_metadata()
+ */
+function remove_metadata($guid, $name, $value = "") {
+ elgg_deprecated_notice('delete_metadata() is deprecated by elgg_delete_metadata()', 1.8);
+
+ // prevent them from deleting everything
+ if (!$guid) {
+ return false;
+ }
+
+ $options = array(
+ 'guid' => $guid,
+ 'metadata_name' => $name,
+ 'limit' => 0
+ );
+
+ if ($value) {
+ $options['metadata_value'] = $value;
+ }
+
+ return elgg_delete_metadata($options);
+}
+
+/**
+ * Get a specific annotation.
+ *
+ * @param int $annotation_id Annotation ID
+ *
+ * @return ElggAnnotation
+ * @deprecated 1.8 Use elgg_get_annotation_from_id()
+ */
+function get_annotation($annotation_id) {
+ elgg_deprecated_notice('get_annotation() is deprecated by elgg_get_annotation_from_id()', 1.8);
+ return elgg_get_annotation_from_id($annotation_id);
+}
+
+/**
+ * Delete a given annotation.
+ *
+ * @param int $id The annotation id
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_delete_annotations()
+ */
+function delete_annotation($id) {
+ elgg_deprecated_notice('delete_annotation() is deprecated by elgg_delete_annotations()', 1.8);
+ if (!$id) {
+ return false;
+ }
+ return elgg_delete_annotations(array('annotation_id' => $annotation_id));
+}
+
+/**
+ * Clear all the annotations for a given entity, assuming you have access to that metadata.
+ *
+ * @param int $guid The entity guid
+ * @param string $name The name of the annotation to delete.
+ *
+ * @return int Number of annotations deleted or false if an error
+ * @deprecated 1.8 Use elgg_delete_annotations()
+ */
+function clear_annotations($guid, $name = "") {
+ elgg_deprecated_notice('clear_annotations() is deprecated by elgg_delete_annotations()', 1.8);
+
+ if (!$guid) {
+ return false;
+ }
+
+ $options = array(
+ 'guid' => $guid,
+ 'limit' => 0
+ );
+
+ if ($name) {
+ $options['annotation_name'] = $name;
+ }
+
+ return elgg_delete_annotations($options);
+}
+
+/**
+ * Clear all annotations belonging to a given owner_guid
+ *
+ * @param int $owner_guid The owner
+ *
+ * @return int Number of annotations deleted
+ * @deprecated 1.8 Use elgg_delete_annotations()
+ */
+function clear_annotations_by_owner($owner_guid) {
+ elgg_deprecated_notice('clear_annotations_by_owner() is deprecated by elgg_delete_annotations()', 1.8);
+
+ if (!$owner_guid) {
+ return false;
+ }
+
+ $options = array(
+ 'annotation_owner_guid' => $guid,
+ 'limit' => 0
+ );
+
+ return elgg_delete_annotations($options);
+}
+
+/**
+ * Registers a page handler for a particular identifier
+ *
+ * For example, you can register a function called 'blog_page_handler' for handler type 'blog'
+ * Now for all URLs of type http://yoururl/pg/blog/*, the blog_page_handler() function will be called.
+ * The part of the URL marked with * above will be exploded on '/' characters and passed as an
+ * array to that function.
+ * For example, the URL http://yoururl/blog/username/friends/ would result in the call:
+ * blog_page_handler(array('username','friends'), blog);
+ *
+ * Page handler functions should return true or the default page handler will be called.
+ *
+ * A request to register a page handler with the same identifier as previously registered
+ * handler will replace the previous one.
+ *
+ * The context is set to the page handler identifier before the registered
+ * page handler function is called. For the above example, the context is set to 'blog'.
+ *
+ * @param string $handler The page type to handle
+ * @param string $function Your function name
+ * @return true|false Depending on success
+ *
+ * @deprecated 1.8 Use {@link elgg_register_page_handler()}
+ */
+function register_page_handler($handler, $function){
+ elgg_deprecated_notice("register_page_handler() was deprecated by elgg_register_page_handler()", 1.8);
+ return elgg_register_page_handler($handler, $function);
+}
+
+/**
+ * Unregister a page handler for an identifier
+ *
+ * Note: to replace a page handler, call register_page_handler()
+ *
+ * @param string $handler The page type identifier
+ * @since 1.7.2
+ *
+ * @deprecated 1.8 Use {@link elgg_unregister_page_handler()}
+ */
+function unregister_page_handler($handler) {
+ elgg_deprecated_notice("unregister_page_handler() was deprecated by elgg_unregister_page_handler()", 1.8);
+ return elgg_unregister_page_handler($handler);
+}
+
+/**
+ * Register an annotation url handler.
+ *
+ * @param string $function_name The function.
+ * @param string $extender_name The name, default 'all'.
+ *
+ * @deprecated 1.8 Use {@link elgg_register_annotation_url_handler()}
+ */
+function register_annotation_url_handler($function, $extender_name) {
+ elgg_deprecated_notice("register_annotation_url_handler() was deprecated by elgg_register_annotation_url_handler()", 1.8);
+ return elgg_register_annotation_url_handler($extender_name, $function);
+}
+
+/**
+ * Sets the URL handler for a particular extender type and name.
+ * It is recommended that you do not call this directly, instead use one of the wrapper functions in the
+ * subtype files.
+ *
+ * @param string $function_name The function to register
+ * @param string $extender_type Extender type
+ * @param string $extender_name The name of the extender
+ * @return true|false Depending on success
+ *
+ * @deprecated 1.8 Use {@link elgg_register_extender_url_handler()}
+ */
+function register_extender_url_handler($function, $type = "all", $name = "all") {
+ elgg_deprecated_notice("register_extender_url_handler() was deprecated by elgg_register_extender_url_handler()", 1.8);
+ return elgg_register_extender_url_handler($type, $name, $function);
+}
+
+/**
+ * Registers and entity type and subtype to return in search and other places.
+ * A description in the elgg_echo languages file of the form item:type:subtype
+ * is also expected.
+ *
+ * @param string $type The type of entity (object, site, user, group)
+ * @param string $subtype The subtype to register (may be blank)
+ * @return true|false Depending on success
+ *
+ * @deprecated 1.8 Use {@link elgg_register_entity_type()}
+ */
+function register_entity_type($type, $subtype = null) {
+ elgg_deprecated_notice("register_entity_type() was deprecated by elgg_register_entity_type()", 1.8);
+ return elgg_register_entity_type($type, $subtype);
+}
+
+/**
+ * Register a metadata url handler.
+ *
+ * @param string $function_name The function.
+ * @param string $extender_name The name, default 'all'.
+ *
+ * @deprecated 1.8 Use {@link elgg_register_metadata_url_handler()}
+ */
+function register_metadata_url_handler($function, $extender_name = "all") {
+ return elgg_register_metadata_url_handler($extender_name, $function);
+}
+
+/**
+ * Sets the URL handler for a particular relationship type
+ *
+ * @param string $function_name The function to register
+ * @param string $relationship_type The relationship type.
+ * @return true|false Depending on success
+ *
+ * @deprecated 1.8 Use {@link elgg_register_relationship_url_handler()}
+ */
+function register_relationship_url_handler($function_name, $relationship_type = "all") {
+ elgg_deprecated_notice("register_relationship_url_handler() was deprecated by elgg_register_relationship_url_handler()", 1.8);
+ return elgg_register_relationship_url_handler($relationship_type, $function_name);
+}
+
+/**
+ * Registers a view to be simply cached
+ *
+ * Views cached in this manner must take no parameters and be login agnostic -
+ * that is to say, they look the same no matter who is logged in (or logged out).
+ *
+ * CSS and the basic jS views are automatically cached like this.
+ *
+ * @param string $viewname View name
+ *
+ * @deprecated 1.8 Use {@link elgg_register_simplecache_view()}
+ */
+function elgg_view_register_simplecache($viewname) {
+ elgg_deprecated_notice("elgg_view_register_simplecache() was deprecated by elgg_register_simplecache_view()", 1.8);
+ return elgg_register_simplecache_view($viewname);
+}
+
+/**
+ * Regenerates the simple cache.
+ *
+ * @param string $viewtype Optional viewtype to regenerate
+ * @see elgg_view_register_simplecache()
+ *
+ * @deprecated 1.8 Use {@link elgg_regenerate_simplecache()}
+ */
+function elgg_view_regenerate_simplecache($viewtype = NULL) {
+ elgg_deprecated_notice("elgg_view_regenerate_simplecache() was deprecated by elgg_regenerate_simplecache()", 1.8);
+ return elgg_regenerate_simplecache($viewtype);
+}
+
+/**
+ * Enables the simple cache.
+ *
+ * @see elgg_view_register_simplecache()
+ *
+ * @deprecated 1.8 Use {@link elgg_enable_simplecache()}
+ */
+function elgg_view_enable_simplecache() {
+ elgg_deprecated_notice("elgg_view_enable_simplecache() was deprecated by elgg_enable_simplecache()", 1.8);
+ return elgg_enable_simplecache();
+}
+
+/**
+ * Disables the simple cache.
+ *
+ * @see elgg_view_register_simplecache()
+ *
+ * @deprecated 1.8 Use {@link elgg_disable_simplecache()}
+ */
+function elgg_view_disable_simplecache() {
+ elgg_deprecated_notice("elgg_view_disable_simplecache() was deprecated by elgg_disable_simplecache()", 1.8);
+ return elgg_disable_simplecache();
+}
+
+// these were internal functions that perhaps can be removed rather than deprecated
+/**
+ * @deprecated 1.8
+ */
+function is_db_installed() {
+ elgg_deprecated_notice('is_db_installed() has been deprecated', 1.8);
+ return true;
+}
+
+/**
+ * @deprecated 1.8
+ */
+function is_installed() {
+ elgg_deprecated_notice('is_installed() has been deprecated', 1.8);
+ return true;
+}
+
+/**
+ * Attempt to authenticate.
+ * This function will process all registered PAM handlers or stop when the first
+ * handler fails. A handler fails by either returning false or throwing an
+ * exception. The advantage of throwing an exception is that it returns a message
+ * through the global $_PAM_HANDLERS_MSG which can be used in communication with
+ * a user. The order that handlers are processed is determined by the order that
+ * they were registered.
+ *
+ * If $credentials are provided the PAM handler should authenticate using the
+ * provided credentials, if not then credentials should be prompted for or
+ * otherwise retrieved (eg from the HTTP header or $_SESSION).
+ *
+ * @param mixed $credentials Mixed PAM handler specific credentials (e.g. username, password)
+ * @param string $policy - the policy type, default is "user"
+ * @return bool true if authenticated, false if not.
+ *
+ * @deprecated 1.8 See {@link ElggPAM}
+ */
+function pam_authenticate($credentials = NULL, $policy = "user") {
+ elgg_deprecated_notice('pam_authenticate has been deprecated for ElggPAM', 1.8);
+ global $_PAM_HANDLERS, $_PAM_HANDLERS_MSG;
+
+ $_PAM_HANDLERS_MSG = array();
+
+ $authenticated = false;
+
+ foreach ($_PAM_HANDLERS[$policy] as $k => $v) {
+ $handler = $v->handler;
+ $importance = $v->importance;
+
+ try {
+ // Execute the handler
+ if ($handler($credentials)) {
+ // Explicitly returned true
+ $_PAM_HANDLERS_MSG[$k] = "Authenticated!";
+
+ $authenticated = true;
+ } else {
+ $_PAM_HANDLERS_MSG[$k] = "Not Authenticated.";
+
+ // If this is required then abort.
+ if ($importance == 'required') {
+ return false;
+ }
+ }
+ } catch (Exception $e) {
+ $_PAM_HANDLERS_MSG[$k] = "$e";
+
+ // If this is required then abort.
+ if ($importance == 'required') {
+ return false;
+ }
+ }
+ }
+
+ return $authenticated;
+}
+
+
+/**
+ * When given a widget entity and a new requested location, saves the new location
+ * and also provides a sensible ordering for all widgets in that column
+ *
+ * @param ElggObject $widget The widget entity
+ * @param int $order The order within the column
+ * @param int $column The column (1, 2 or 3)
+ *
+ * @return bool Depending on success
+ * @deprecated 1.8 use ElggWidget::move()
+ */
+function save_widget_location(ElggObject $widget, $order, $column) {
+ elgg_deprecated_notice('save_widget_location() is deprecated', 1.8);
+ if ($widget instanceof ElggObject) {
+ if ($widget->subtype == "widget") {
+ // If you can't move the widget, don't save a new location
+ if (!$widget->draggable) {
+ return false;
+ }
+
+ // Sanitise the column value
+ if ($column != 1 || $column != 2 || $column != 3) {
+ $column = 1;
+ }
+
+ $widget->column = (int) $column;
+
+ $ordertmp = array();
+ $params = array(
+ 'context' => $widget->context,
+ 'column' => $column,
+ );
+
+ if ($entities = get_entities_from_metadata_multi($params, 'object', 'widget')) {
+ foreach ($entities as $entity) {
+ $entityorder = $entity->order;
+ if ($entityorder < $order) {
+ $ordertmp[$entityorder] = $entity;
+ }
+ if ($entityorder >= $order) {
+ $ordertmp[$entityorder + 10000] = $entity;
+ }
+ }
+ }
+
+ $ordertmp[$order] = $widget;
+ ksort($ordertmp);
+
+ $orderticker = 10;
+ foreach ($ordertmp as $orderval => $entity) {
+ $entity->order = $orderticker;
+ $orderticker += 10;
+ }
+
+ return true;
+ } else {
+ register_error($widget->subtype);
+ }
+
+ }
+
+ return false;
+}
+
+/**
+ * Get widgets for a particular context and column, in order of display
+ *
+ * @param int $user_guid The owner user GUID
+ * @param string $context The context (profile, dashboard etc)
+ * @param int $column The column (1 or 2)
+ *
+ * @return array|false An array of widget ElggObjects, or false
+ * @deprecated 1.8 Use elgg_get_widgets()
+ */
+function get_widgets($user_guid, $context, $column) {
+ elgg_deprecated_notice('get_widgets is depecated for elgg_get_widgets', 1.8);
+ $params = array(
+ 'column' => $column,
+ 'context' => $context
+ );
+ $widgets = get_entities_from_private_setting_multi($params, "object",
+ "widget", $user_guid, "", 10000);
+
+ if ($widgets) {
+ $widgetorder = array();
+ foreach ($widgets as $widget) {
+ $order = $widget->order;
+ while (isset($widgetorder[$order])) {
+ $order++;
+ }
+ $widgetorder[$order] = $widget;
+ }
+
+ ksort($widgetorder);
+
+ return $widgetorder;
+ }
+
+ return false;
+}
+
+/**
+ * Add a new widget instance
+ *
+ * @param int $entity_guid GUID of entity that owns this widget
+ * @param string $handler The handler for this widget
+ * @param string $context The page context for this widget
+ * @param int $order The order to display this widget in
+ * @param int $column The column to display this widget in (1, 2 or 3)
+ * @param int $access_id If not specified, it is set to the default access level
+ *
+ * @return int|false Widget GUID or false on failure
+ * @deprecated 1.8 use elgg_create_widget()
+ */
+function add_widget($entity_guid, $handler, $context, $order = 0, $column = 1, $access_id = null) {
+ elgg_deprecated_notice('add_widget has been deprecated for elgg_create_widget', 1.8);
+ if (empty($entity_guid) || empty($context) || empty($handler) || !widget_type_exists($handler)) {
+ return false;
+ }
+
+ if ($entity = get_entity($entity_guid)) {
+ $widget = new ElggWidget;
+ $widget->owner_guid = $entity_guid;
+ $widget->container_guid = $entity_guid;
+ if (isset($access_id)) {
+ $widget->access_id = $access_id;
+ } else {
+ $widget->access_id = get_default_access();
+ }
+
+ $guid = $widget->save();
+
+ // private settings cannot be set until ElggWidget saved
+ $widget->handler = $handler;
+ $widget->context = $context;
+ $widget->column = $column;
+ $widget->order = $order;
+
+ return $guid;
+ }
+
+ return false;
+}
+
+/**
+ * Define a new widget type
+ *
+ * @param string $handler The identifier for the widget handler
+ * @param string $name The name of the widget type
+ * @param string $description A description for the widget type
+ * @param string $context A comma-separated list of contexts where this
+ * widget is allowed (default: 'all')
+ * @param bool $multiple Whether or not multiple instances of this widget
+ * are allowed on a single dashboard (default: false)
+ * @param string $positions A comma-separated list of positions on the page
+ * (side or main) where this widget is allowed (default: "side,main")
+ *
+ * @return bool Depending on success
+ * @deprecated 1.8 Use elgg_register_widget_type
+ */
+function add_widget_type($handler, $name, $description, $context = "all",
+$multiple = false, $positions = "side,main") {
+ elgg_deprecated_notice("add_widget_type deprecated for elgg_register_widget_type", 1.8);
+
+ return elgg_register_widget_type($handler, $name, $description, $context, $multiple);
+}
+
+/**
+ * Remove a widget type
+ *
+ * @param string $handler The identifier for the widget handler
+ *
+ * @return void
+ * @since 1.7.1
+ * @deprecated 1.8 Use elgg_unregister_widget_type
+ */
+function remove_widget_type($handler) {
+ elgg_deprecated_notice("remove_widget_type deprecated for elgg_unregister_widget_type", 1.8);
+ return elgg_unregister_widget_type($handler);
+}
+
+/**
+ * Determines whether or not widgets with the specified handler have been defined
+ *
+ * @param string $handler The widget handler identifying string
+ *
+ * @return bool Whether or not those widgets exist
+ * @deprecated 1.8 Use elgg_is_widget_type
+ */
+function widget_type_exists($handler) {
+ elgg_deprecated_notice("widget_type_exists deprecated for elgg_is_widget_type", 1.8);
+ return elgg_is_widget_type($handler);
+}
+
+/**
+ * Returns an array of stdClass objects representing the defined widget types
+ *
+ * @return array A list of types defined (if any)
+ * @deprecated 1.8 Use elgg_get_widget_types
+ */
+function get_widget_types() {
+ elgg_deprecated_notice("get_widget_types deprecrated for elgg_get_widget_types", 1.8);
+ return elgg_get_widget_types();
+}
+
+/**
+ * Saves a widget's settings (by passing an array of
+ * (name => value) pairs to save_{$handler}_widget)
+ *
+ * @param int $widget_guid The GUID of the widget we're saving to
+ * @param array $params An array of name => value parameters
+ *
+ * @return bool
+ * @deprecated 1.8 Use elgg_save_widget_settings
+ */
+function save_widget_info($widget_guid, $params) {
+ elgg_deprecated_notice("save_widget_info() is deprecated for elgg_save_widget_settings", 1.8);
+ if ($widget = get_entity($widget_guid)) {
+
+ $subtype = $widget->getSubtype();
+
+ if ($subtype != "widget") {
+ return false;
+ }
+ $handler = $widget->handler;
+ if (empty($handler) || !widget_type_exists($handler)) {
+ return false;
+ }
+
+ if (!$widget->canEdit()) {
+ return false;
+ }
+
+ // Save the params to the widget
+ if (is_array($params) && sizeof($params) > 0) {
+ foreach ($params as $name => $value) {
+
+ if (!empty($name) && !in_array($name, array(
+ 'guid', 'owner_guid', 'site_guid'
+ ))) {
+ if (is_array($value)) {
+ // @todo Handle arrays securely
+ $widget->setMetaData($name, $value, "", true);
+ } else {
+ $widget->$name = $value;
+ }
+ }
+ }
+ $widget->save();
+ }
+
+ $function = "save_{$handler}_widget";
+ if (is_callable($function)) {
+ return $function($params);
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Reorders the widgets from a widget panel
+ *
+ * @param string $panelstring1 String of guids of ElggWidget objects separated by ::
+ * @param string $panelstring2 String of guids of ElggWidget objects separated by ::
+ * @param string $panelstring3 String of guids of ElggWidget objects separated by ::
+ * @param string $context Profile or dashboard
+ * @param int $owner Owner guid
+ *
+ * @return void
+ * @deprecated 1.8 Don't use.
+ */
+function reorder_widgets_from_panel($panelstring1, $panelstring2, $panelstring3, $context, $owner) {
+ elgg_deprecated_notice("reorder_widgets_from_panel() is deprecated", 1.8);
+ $return = true;
+
+ $mainwidgets = explode('::', $panelstring1);
+ $sidewidgets = explode('::', $panelstring2);
+ $rightwidgets = explode('::', $panelstring3);
+
+ $handlers = array();
+ $guids = array();
+
+ if (is_array($mainwidgets) && sizeof($mainwidgets) > 0) {
+ foreach ($mainwidgets as $widget) {
+
+ $guid = (int) $widget;
+
+ if ("{$guid}" == "{$widget}") {
+ $guids[1][] = $widget;
+ } else {
+ $handlers[1][] = $widget;
+ }
+ }
+ }
+ if (is_array($sidewidgets) && sizeof($sidewidgets) > 0) {
+ foreach ($sidewidgets as $widget) {
+
+ $guid = (int) $widget;
+
+ if ("{$guid}" == "{$widget}") {
+ $guids[2][] = $widget;
+ } else {
+ $handlers[2][] = $widget;
+ }
+
+ }
+ }
+ if (is_array($rightwidgets) && sizeof($rightwidgets) > 0) {
+ foreach ($rightwidgets as $widget) {
+
+ $guid = (int) $widget;
+
+ if ("{$guid}" == "{$widget}") {
+ $guids[3][] = $widget;
+ } else {
+ $handlers[3][] = $widget;
+ }
+
+ }
+ }
+
+ // Reorder existing widgets or delete ones that have vanished
+ foreach (array(1, 2, 3) as $column) {
+ if ($dbwidgets = get_widgets($owner, $context, $column)) {
+
+ foreach ($dbwidgets as $dbwidget) {
+ if (in_array($dbwidget->getGUID(), $guids[1])
+ || in_array($dbwidget->getGUID(), $guids[2]) || in_array($dbwidget->getGUID(), $guids[3])) {
+
+ if (in_array($dbwidget->getGUID(), $guids[1])) {
+ $pos = array_search($dbwidget->getGUID(), $guids[1]);
+ $col = 1;
+ } else if (in_array($dbwidget->getGUID(), $guids[2])) {
+ $pos = array_search($dbwidget->getGUID(), $guids[2]);
+ $col = 2;
+ } else {
+ $pos = array_search($dbwidget->getGUID(), $guids[3]);
+ $col = 3;
+ }
+ $pos = ($pos + 1) * 10;
+ $dbwidget->column = $col;
+ $dbwidget->order = $pos;
+ } else {
+ $dbguid = $dbwidget->getGUID();
+ if (!$dbwidget->delete()) {
+ $return = false;
+ } else {
+ // Remove state cookie
+ setcookie('widget' + $dbguid, null);
+ }
+ }
+ }
+
+ }
+ // Add new ones
+ if (sizeof($guids[$column]) > 0) {
+ foreach ($guids[$column] as $key => $guid) {
+ if ($guid == 0) {
+ $pos = ($key + 1) * 10;
+ $handler = $handlers[$column][$key];
+ if (!add_widget($owner, $handler, $context, $pos, $column)) {
+ $return = false;
+ }
+ }
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Register a particular context for use with widgets.
+ *
+ * @param string $context The context we wish to enable context for
+ *
+ * @return void
+ * @deprecated 1.8 Don't use.
+ */
+function use_widgets($context) {
+ elgg_deprecated_notice("use_widgets is deprecated", 1.8);
+ global $CONFIG;
+
+ if (!isset($CONFIG->widgets)) {
+ $CONFIG->widgets = new stdClass;
+ }
+
+ if (!isset($CONFIG->widgets->contexts)) {
+ $CONFIG->widgets->contexts = array();
+ }
+
+ if (!empty($context)) {
+ $CONFIG->widgets->contexts[] = $context;
+ }
+}
+
+/**
+ * Determines whether or not the current context is using widgets
+ *
+ * @return bool Depending on widget status
+ * @deprecated 1.8 Don't use.
+ */
+function using_widgets() {
+ elgg_deprecated_notice("using_widgets is deprecated", 1.8);
+ global $CONFIG;
+
+ $context = elgg_get_context();
+ if (isset($CONFIG->widgets->contexts) && is_array($CONFIG->widgets->contexts)) {
+ if (in_array($context, $CONFIG->widgets->contexts)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Displays a particular widget
+ *
+ * @param ElggObject $widget The widget to display
+ * @return string The HTML for the widget, including JavaScript wrapper
+ *
+ * @deprecated 1.8 Use elgg_view_entity()
+ */
+function display_widget(ElggObject $widget) {
+ elgg_deprecated_notice("display_widget() was been deprecated. Use elgg_view_entity().", 1.8);
+ return elgg_view_entity($widget);
+}
+
+/**
+ * Count the number of comments attached to an entity
+ *
+ * @param ElggEntity $entity
+ * @return int Number of comments
+ * @deprecated 1.8 Use ElggEntity->countComments()
+ */
+function elgg_count_comments($entity) {
+ elgg_deprecated_notice('elgg_count_comments() is deprecated by ElggEntity->countComments()', 1.8);
+
+ if ($entity instanceof ElggEntity) {
+ return $entity->countComments();
+ }
+
+ return 0;
+}
+
+/**
+ * Removes all items relating to a particular acting entity from the river
+ *
+ * @param int $subject_guid The GUID of the entity
+ *
+ * @return bool Depending on success
+ * @deprecated 1.8 Use elgg_delete_river()
+ */
+function remove_from_river_by_subject($subject_guid) {
+ elgg_deprecated_notice("remove_from_river_by_subject() deprecated by elgg_delete_river()", 1.8);
+
+ return elgg_delete_river(array('subject_guid' => $subject_guid));
+}
+
+/**
+ * Removes all items relating to a particular entity being acted upon from the river
+ *
+ * @param int $object_guid The GUID of the entity
+ *
+ * @return bool Depending on success
+ * @deprecated 1.8 Use elgg_delete_river()
+ */
+function remove_from_river_by_object($object_guid) {
+ elgg_deprecated_notice("remove_from_river_by_object() deprecated by elgg_delete_river()", 1.8);
+
+ return elgg_delete_river(array('object_guid' => $object_guid));
+}
+
+/**
+ * Removes all items relating to a particular annotation being acted upon from the river
+ *
+ * @param int $annotation_id The ID of the annotation
+ *
+ * @return bool Depending on success
+ * @since 1.7.0
+ * @deprecated 1.8 Use elgg_delete_river()
+ */
+function remove_from_river_by_annotation($annotation_id) {
+ elgg_deprecated_notice("remove_from_river_by_annotation() deprecated by elgg_delete_river()", 1.8);
+
+ return elgg_delete_river(array('annotation_id' => $annotation_id));
+}
+
+/**
+ * Removes a single river entry
+ *
+ * @param int $id The ID of the river entry
+ *
+ * @return bool Depending on success
+ * @since 1.7.2
+ * @deprecated 1.8 Use elgg_delete_river()
+ */
+function remove_from_river_by_id($id) {
+ elgg_deprecated_notice("remove_from_river_by_id() deprecated by elgg_delete_river()", 1.8);
+
+ return elgg_delete_river(array('id' => $id));
+}
+
+/**
+ * A default page handler
+ * Tries to locate a suitable file to include. Only works for core pages, not plugins.
+ *
+ * @param array $page The page URL elements
+ * @param string $handler The base handler
+ *
+ * @return true|false Depending on success
+ * @deprecated 1.8
+ */
+function default_page_handler($page, $handler) {
+ global $CONFIG;
+
+ elgg_deprecated_notice("default_page_handler is deprecated", "1.8");
+
+ $page = implode('/', $page);
+
+ // protect against including arbitary files
+ $page = str_replace("..", "", $page);
+
+ $callpath = $CONFIG->path . $handler . "/" . $page;
+ if (is_dir($callpath)) {
+ $callpath = sanitise_filepath($callpath);
+ $callpath .= "index.php";
+ if (file_exists($callpath)) {
+ if (include($callpath)) {
+ return TRUE;
+ }
+ }
+ } else if (file_exists($callpath)) {
+ include($callpath);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Invalidate this class's entry in the cache.
+ *
+ * @param int $guid The entity guid
+ *
+ * @return void
+ * @access private
+ * @deprecated 1.8
+ */
+function invalidate_cache_for_entity($guid) {
+ elgg_deprecated_notice('invalidate_cache_for_entity() is a private function and should not be used.', 1.8);
+ _elgg_invalidate_cache_for_entity($guid);
+}
+
+/**
+ * Cache an entity.
+ *
+ * Stores an entity in $ENTITY_CACHE;
+ *
+ * @param ElggEntity $entity Entity to cache
+ *
+ * @return void
+ * @access private
+ * @deprecated 1.8
+ */
+function cache_entity(ElggEntity $entity) {
+ elgg_deprecated_notice('cache_entity() is a private function and should not be used.', 1.8);
+ _elgg_cache_entity($entity);
+}
+
+/**
+ * Retrieve a entity from the cache.
+ *
+ * @param int $guid The guid
+ *
+ * @return ElggEntity|bool false if entity not cached, or not fully loaded
+ * @access private
+ * @deprecated 1.8
+ */
+function retrieve_cached_entity($guid) {
+ elgg_deprecated_notice('retrieve_cached_entity() is a private function and should not be used.', 1.8);
+ return _elgg_retrieve_cached_entity($guid);
+}
diff --git a/engine/lib/deprecated-1.9.php b/engine/lib/deprecated-1.9.php
new file mode 100644
index 000000000..31d03428f
--- /dev/null
+++ b/engine/lib/deprecated-1.9.php
@@ -0,0 +1,582 @@
+<?php
+/**
+ * Return a timestamp for the start of a given day (defaults today).
+ *
+ * @param int $day Day
+ * @param int $month Month
+ * @param int $year Year
+ *
+ * @return int
+ * @access private
+ * @deprecated 1.9
+ */
+function get_day_start($day = null, $month = null, $year = null) {
+ elgg_deprecated_notice('get_day_start() has been deprecated', 1.9);
+ return mktime(0, 0, 0, $month, $day, $year);
+}
+
+/**
+ * Return a timestamp for the end of a given day (defaults today).
+ *
+ * @param int $day Day
+ * @param int $month Month
+ * @param int $year Year
+ *
+ * @return int
+ * @access private
+ * @deprecated 1.9
+ */
+function get_day_end($day = null, $month = null, $year = null) {
+ elgg_deprecated_notice('get_day_end() has been deprecated', 1.9);
+ return mktime(23, 59, 59, $month, $day, $year);
+}
+
+/**
+ * Return the notable entities for a given time period.
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count Set to true to get a count instead of entities. Defaults to false.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param mixed $container_guid Container or containers to get entities from (default: any).
+ *
+ * @return array|false
+ * @access private
+ * @deprecated 1.9
+ */
+function get_notable_entities($start_time, $end_time, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "asc", $limit = 10, $offset = 0, $count = false, $site_guid = 0,
+$container_guid = null) {
+ elgg_deprecated_notice('get_notable_entities() has been deprecated', 1.9);
+ global $CONFIG;
+
+ if ($subtype === false || $subtype === null || $subtype === 0) {
+ return false;
+ }
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $order_by = sanitise_string($order_by);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ $where = array();
+
+ if (is_array($type)) {
+ $tempwhere = "";
+ if (sizeof($type)) {
+ foreach ($type as $typekey => $subtypearray) {
+ foreach ($subtypearray as $subtypeval) {
+ $typekey = sanitise_string($typekey);
+ if (!empty($subtypeval)) {
+ $subtypeval = (int) get_subtype_id($typekey, $subtypeval);
+ } else {
+ $subtypeval = 0;
+ }
+ if (!empty($tempwhere)) {
+ $tempwhere .= " or ";
+ }
+ $tempwhere .= "(e.type = '{$typekey}' and e.subtype = {$subtypeval})";
+ }
+ }
+ }
+ if (!empty($tempwhere)) {
+ $where[] = "({$tempwhere})";
+ }
+ } else {
+ $type = sanitise_string($type);
+ $subtype = get_subtype_id($type, $subtype);
+
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+
+ if ($subtype !== "") {
+ $where[] = "e.subtype=$subtype";
+ }
+ }
+
+ if ($owner_guid != "") {
+ if (!is_array($owner_guid)) {
+ $owner_array = array($owner_guid);
+ $owner_guid = (int) $owner_guid;
+ $where[] = "e.owner_guid = '$owner_guid'";
+ } else if (sizeof($owner_guid) > 0) {
+ $owner_array = array_map('sanitise_int', $owner_guid);
+ // Cast every element to the owner_guid array to int
+ $owner_guid = implode(",", $owner_guid);
+ $where[] = "e.owner_guid in ({$owner_guid})";
+ }
+ if (is_null($container_guid)) {
+ $container_guid = $owner_array;
+ }
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if (!is_null($container_guid)) {
+ if (is_array($container_guid)) {
+ foreach ($container_guid as $key => $val) {
+ $container_guid[$key] = (int) $val;
+ }
+ $where[] = "e.container_guid in (" . implode(",", $container_guid) . ")";
+ } else {
+ $container_guid = (int) $container_guid;
+ $where[] = "e.container_guid = {$container_guid}";
+ }
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+
+ if (!$count) {
+ $query = "SELECT e.* from {$CONFIG->dbprefix}entities e $cal_join where ";
+ } else {
+ $query = "SELECT count(e.guid) as total from {$CONFIG->dbprefix}entities e $cal_join where ";
+ }
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ $query .= get_access_sql_suffix('e'); // Add access controls
+
+ if (!$count) {
+ $query .= " order by n.calendar_start $order_by";
+ // Add order and limit
+ if ($limit) {
+ $query .= " limit $offset, $limit";
+ }
+ $dt = get_data($query, "entity_row_to_elggstar");
+
+ return $dt;
+ } else {
+ $total = get_data_row($query);
+ return $total->total;
+ }
+}
+
+/**
+ * Return the notable entities for a given time period based on an item of metadata.
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param bool $count If true, returns count instead of entities. (Default: false)
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ * @access private
+ * @deprecated 1.9
+ */
+function get_notable_entities_from_metadata($start_time, $end_time, $meta_name, $meta_value = "",
+$entity_type = "", $entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "",
+$site_guid = 0, $count = false) {
+ elgg_deprecated_notice('get_notable_entities_from_metadata() has been deprecated', 1.9);
+
+ global $CONFIG;
+
+ $meta_n = get_metastring_id($meta_name);
+ $meta_v = get_metastring_id($meta_value);
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $entity_type = sanitise_string($entity_type);
+ $entity_subtype = get_subtype_id($entity_type, $entity_subtype);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ if ($order_by == "") {
+ $order_by = "e.time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $site_guid = (int) $site_guid;
+ if ((is_array($owner_guid) && (count($owner_guid)))) {
+ foreach ($owner_guid as $key => $guid) {
+ $owner_guid[$key] = (int) $guid;
+ }
+ } else {
+ $owner_guid = (int) $owner_guid;
+ }
+
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($entity_type != "") {
+ $where[] = "e.type='$entity_type'";
+ }
+
+ if ($entity_subtype) {
+ $where[] = "e.subtype=$entity_subtype";
+ }
+
+ if ($meta_name != "") {
+ $where[] = "m.name_id='$meta_n'";
+ }
+
+ if ($meta_value != "") {
+ $where[] = "m.value_id='$meta_v'";
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ if (is_array($owner_guid)) {
+ $where[] = "e.container_guid in (" . implode(",", $owner_guid) . ")";
+ } else if ($owner_guid > 0) {
+ $where[] = "e.container_guid = {$owner_guid}";
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+ if (!$count) {
+ $query = "SELECT distinct e.* ";
+ } else {
+ $query = "SELECT count(distinct e.guid) as total ";
+ }
+
+ $query .= "from {$CONFIG->dbprefix}entities e"
+ . " JOIN {$CONFIG->dbprefix}metadata m on e.guid = m.entity_guid $cal_join where";
+
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix("e");
+ $query .= ' and ' . get_access_sql_suffix("m");
+
+ if (!$count) {
+ // Add order and limit
+ $query .= " order by $order_by limit $offset, $limit";
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($row = get_data_row($query)) {
+ return $row->total;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Return the notable entities for a given time period based on their relationship.
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to say
+ * "give me all entities for whom $relationship_guid is a
+ * $relationship of"
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param string $order_by Optional Order by
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * @access private
+ * @deprecated 1.9
+ */
+function get_noteable_entities_from_relationship($start_time, $end_time, $relationship,
+$relationship_guid, $inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ elgg_deprecated_notice('get_noteable_entities_from_relationship() has been deprecated', 1.9);
+
+ global $CONFIG;
+
+ $start_time = (int)$start_time;
+ $end_time = (int)$end_time;
+ $relationship = sanitise_string($relationship);
+ $relationship_guid = (int)$relationship_guid;
+ $inverse_relationship = (bool)$inverse_relationship;
+ $type = sanitise_string($type);
+ $subtype = get_subtype_id($type, $subtype);
+ $owner_guid = (int)$owner_guid;
+ if ($order_by == "") {
+ $order_by = "time_created desc";
+ }
+ $order_by = sanitise_string($order_by);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+
+ //$access = get_access_list();
+
+ $where = array();
+
+ if ($relationship != "") {
+ $where[] = "r.relationship='$relationship'";
+ }
+ if ($relationship_guid) {
+ $where[] = $inverse_relationship ?
+ "r.guid_two='$relationship_guid'" : "r.guid_one='$relationship_guid'";
+ }
+ if ($type != "") {
+ $where[] = "e.type='$type'";
+ }
+ if ($subtype) {
+ $where[] = "e.subtype=$subtype";
+ }
+ if ($owner_guid != "") {
+ $where[] = "e.container_guid='$owner_guid'";
+ }
+ if ($site_guid > 0) {
+ $where[] = "e.site_guid = {$site_guid}";
+ }
+
+ // Add the calendar stuff
+ $cal_join = "
+ JOIN {$CONFIG->dbprefix}metadata cal_start on e.guid=cal_start.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_name on cal_start.name_id=cal_start_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_start_value on cal_start.value_id=cal_start_value.id
+
+ JOIN {$CONFIG->dbprefix}metadata cal_end on e.guid=cal_end.entity_guid
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_name on cal_end.name_id=cal_end_name.id
+ JOIN {$CONFIG->dbprefix}metastrings cal_end_value on cal_end.value_id=cal_end_value.id
+ ";
+ $where[] = "cal_start_name.string='calendar_start'";
+ $where[] = "cal_start_value.string>=$start_time";
+ $where[] = "cal_end_name.string='calendar_end'";
+ $where[] = "cal_end_value.string <= $end_time";
+
+ // Select what we're joining based on the options
+ $joinon = "e.guid = r.guid_one";
+ if (!$inverse_relationship) {
+ $joinon = "e.guid = r.guid_two";
+ }
+
+ if ($count) {
+ $query = "SELECT count(distinct e.guid) as total ";
+ } else {
+ $query = "SELECT distinct e.* ";
+ }
+ $query .= " from {$CONFIG->dbprefix}entity_relationships r"
+ . " JOIN {$CONFIG->dbprefix}entities e on $joinon $cal_join where ";
+
+ foreach ($where as $w) {
+ $query .= " $w and ";
+ }
+ // Add access controls
+ $query .= get_access_sql_suffix("e");
+ if (!$count) {
+ $query .= " order by $order_by limit $offset, $limit"; // Add order and limit
+ return get_data($query, "entity_row_to_elggstar");
+ } else {
+ if ($count = get_data_row($query)) {
+ return $count->total;
+ }
+ }
+ return false;
+}
+
+/**
+ * Get all entities for today.
+ *
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param string $order_by The field to order by; by default, time_created desc
+ * @param int $limit The number of entities to return; 10 by default
+ * @param int $offset The indexing offset, 0 by default
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ * @param mixed $container_guid Container(s) to get entities from (default: any).
+ *
+ * @return array|false
+ * @access private
+ * @deprecated 1.9
+ */
+function get_todays_entities($type = "", $subtype = "", $owner_guid = 0, $order_by = "",
+$limit = 10, $offset = 0, $count = false, $site_guid = 0, $container_guid = null) {
+ elgg_deprecated_notice('get_todays_entities() has been deprecated', 1.9);
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities($day_start, $day_end, $type, $subtype, $owner_guid, $order_by,
+ $limit, $offset, $count, $site_guid, $container_guid);
+}
+
+/**
+ * Get entities for today from metadata.
+ *
+ * @param mixed $meta_name Metadata name
+ * @param mixed $meta_value Metadata value
+ * @param string $entity_type The type of entity to look for, eg 'site' or 'object'
+ * @param string $entity_subtype The subtype of the entity.
+ * @param int $owner_guid Owner GUID
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param string $order_by Optional ordering.
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any.
+ * @param bool $count If true, returns count instead of entities. (Default: false)
+ *
+ * @return int|array A list of entities, or a count if $count is set to true
+ * @access private
+ * @deprecated 1.9
+ */
+function get_todays_entities_from_metadata($meta_name, $meta_value = "", $entity_type = "",
+$entity_subtype = "", $owner_guid = 0, $limit = 10, $offset = 0, $order_by = "", $site_guid = 0,
+$count = false) {
+ elgg_deprecated_notice('get_todays_entities_from_metadata() has been deprecated', 1.9);
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities_from_metadata($day_start, $day_end, $meta_name, $meta_value,
+ $entity_type, $entity_subtype, $owner_guid, $limit, $offset, $order_by, $site_guid, $count);
+}
+
+/**
+ * Get entities for today from a relationship
+ *
+ * @param string $relationship The relationship eg "friends_of"
+ * @param int $relationship_guid The guid of the entity to use query
+ * @param bool $inverse_relationship Reverse the normal function of the query to say
+ * "give me all entities for whom $relationship_guid is a
+ * $relationship of"
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param int $owner_guid Owner GUID
+ * @param string $order_by Optional Order by
+ * @param int $limit Limit
+ * @param int $offset Offset
+ * @param boolean $count If true returns a count of entities (default false)
+ * @param int $site_guid Site to get entities for. Default 0 = current site. -1 = any
+ *
+ * @return array|int|false An array of entities, or the number of entities, or false on failure
+ * @access private
+ * @deprecated 1.9
+ */
+function get_todays_entities_from_relationship($relationship, $relationship_guid,
+$inverse_relationship = false, $type = "", $subtype = "", $owner_guid = 0,
+$order_by = "", $limit = 10, $offset = 0, $count = false, $site_guid = 0) {
+ elgg_deprecated_notice('get_todays_entities_from_relationship() has been deprecated', 1.9);
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return get_notable_entities_from_relationship($day_start, $day_end, $relationship,
+ $relationship_guid, $inverse_relationship, $type, $subtype, $owner_guid, $order_by,
+ $limit, $offset, $count, $site_guid);
+}
+
+/**
+ * Returns a viewable list of entities for a given time period.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param int $start_time The start time as a unix timestamp.
+ * @param int $end_time The end time as a unix timestamp.
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to return; 10 by default
+ * @param boolean $fullview Whether or not to display the full view (default: true)
+ * @param boolean $listtypetoggle Whether or not to allow gallery view
+ * @param boolean $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @access private
+ * @deprecated 1.9
+ */
+function list_notable_entities($start_time, $end_time, $type= "", $subtype = "", $owner_guid = 0,
+$limit = 10, $fullview = true, $listtypetoggle = false, $navigation = true) {
+ elgg_deprecated_notice('list_notable_entities() has been deprecated', 1.9);
+
+ $offset = (int) get_input('offset');
+ $count = get_notable_entities($start_time, $end_time, $type, $subtype,
+ $owner_guid, "", $limit, $offset, true);
+
+ $entities = get_notable_entities($start_time, $end_time, $type, $subtype,
+ $owner_guid, "", $limit, $offset);
+
+ return elgg_view_entity_list($entities, $count, $offset, $limit,
+ $fullview, $listtypetoggle, $navigation);
+}
+
+/**
+ * Return a list of today's entities.
+ *
+ * @see list_notable_entities
+ *
+ * @param string $type The type of entity (eg "user", "object" etc)
+ * @param string $subtype The arbitrary subtype of the entity
+ * @param int $owner_guid The GUID of the owning user
+ * @param int $limit The number of entities to return; 10 by default
+ * @param boolean $fullview Whether or not to display the full view (default: true)
+ * @param boolean $listtypetoggle Whether or not to allow gallery view
+ * @param boolean $navigation Display pagination? Default: true
+ *
+ * @return string A viewable list of entities
+ * @access private
+ * @deprecated 1.9
+ */
+function list_todays_entities($type= "", $subtype = "", $owner_guid = 0, $limit = 10,
+$fullview = true, $listtypetoggle = false, $navigation = true) {
+ elgg_deprecated_notice('list_todays_entities() has been deprecated', 1.9);
+
+ $day_start = get_day_start();
+ $day_end = get_day_end();
+
+ return list_notable_entities($day_start, $day_end, $type, $subtype, $owner_guid, $limit,
+ $fullview, $listtypetoggle, $navigation);
+}
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php
new file mode 100644
index 000000000..34111c69d
--- /dev/null
+++ b/engine/lib/elgglib.php
@@ -0,0 +1,2304 @@
+<?php
+/**
+ * Bootstrapping and helper procedural code available for use in Elgg core and plugins.
+ *
+ * @package Elgg.Core
+ * @todo These functions can't be subpackaged because they cover a wide mix of
+ * purposes and subsystems. Many of them should be moved to more relevant files.
+ */
+
+// prep core classes to be autoloadable
+spl_autoload_register('_elgg_autoload');
+elgg_register_classes(dirname(dirname(__FILE__)) . '/classes');
+
+/**
+ * Autoload classes
+ *
+ * @param string $class The name of the class
+ *
+ * @return void
+ * @throws Exception
+ * @access private
+ */
+function _elgg_autoload($class) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->classes[$class]) || !include($CONFIG->classes[$class])) {
+ return false;
+ }
+}
+
+/**
+ * Register all files found in $dir as classes
+ * Need to be named MyClass.php
+ *
+ * @param string $dir The dir to look in
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_register_classes($dir) {
+ $classes = elgg_get_file_list($dir, array(), array(), array('.php'));
+
+ foreach ($classes as $class) {
+ elgg_register_class(basename($class, '.php'), $class);
+ }
+}
+
+/**
+ * Register a classname to a file.
+ *
+ * @param string $class The name of the class
+ * @param string $location The location of the file
+ *
+ * @return true
+ * @since 1.8.0
+ */
+function elgg_register_class($class, $location) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->classes)) {
+ $CONFIG->classes = array();
+ }
+
+ $CONFIG->classes[$class] = $location;
+
+ return true;
+}
+
+/**
+ * Register a php library.
+ *
+ * @param string $name The name of the library
+ * @param string $location The location of the file
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_register_library($name, $location) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->libraries)) {
+ $CONFIG->libraries = array();
+ }
+
+ $CONFIG->libraries[$name] = $location;
+}
+
+/**
+ * Load a php library.
+ *
+ * @param string $name The name of the library
+ *
+ * @return void
+ * @throws InvalidParameterException
+ * @since 1.8.0
+ * @todo return boolean in 1.9 to indicate whether the library has been loaded
+ */
+function elgg_load_library($name) {
+ global $CONFIG;
+
+ static $loaded_libraries = array();
+
+ if (in_array($name, $loaded_libraries)) {
+ return;
+ }
+
+ if (!isset($CONFIG->libraries)) {
+ $CONFIG->libraries = array();
+ }
+
+ if (!isset($CONFIG->libraries[$name])) {
+ $error = elgg_echo('InvalidParameterException:LibraryNotRegistered', array($name));
+ throw new InvalidParameterException($error);
+ }
+
+ if (!include_once($CONFIG->libraries[$name])) {
+ $error = elgg_echo('InvalidParameterException:LibraryNotFound', array(
+ $name,
+ $CONFIG->libraries[$name])
+ );
+ throw new InvalidParameterException($error);
+ }
+
+ $loaded_libraries[] = $name;
+}
+
+/**
+ * Forward to $location.
+ *
+ * Sends a 'Location: $location' header and exists. If headers have
+ * already been sent, returns FALSE.
+ *
+ * @param string $location URL to forward to browser to. Can be path relative to the network's URL.
+ * @param string $reason Short explanation for why we're forwarding
+ *
+ * @return false False if headers have been sent. Terminates execution if forwarding.
+ * @throws SecurityException
+ */
+function forward($location = "", $reason = 'system') {
+ if (!headers_sent($file, $line)) {
+ if ($location === REFERER) {
+ $location = $_SERVER['HTTP_REFERER'];
+ }
+
+ $location = elgg_normalize_url($location);
+
+ // return new forward location or false to stop the forward or empty string to exit
+ $current_page = current_page_url();
+ $params = array('current_url' => $current_page, 'forward_url' => $location);
+ $location = elgg_trigger_plugin_hook('forward', $reason, $params, $location);
+
+ if ($location) {
+ header("Location: {$location}");
+ exit;
+ } else if ($location === '') {
+ exit;
+ }
+ } else {
+ throw new SecurityException(elgg_echo('SecurityException:ForwardFailedToRedirect', array($file, $line)));
+ }
+}
+
+/**
+ * Register a JavaScript file for inclusion
+ *
+ * This function handles adding JavaScript to a web page. If multiple
+ * calls are made to register the same JavaScript file based on the $id
+ * variable, only the last file is included. This allows a plugin to add
+ * JavaScript from a view that may be called more than once. It also handles
+ * more than one plugin adding the same JavaScript.
+ *
+ * jQuery plugins often have filenames such as jquery.rating.js. A best practice
+ * is to base $name on the filename: "jquery.rating". It is recommended to not
+ * use version numbers in the name.
+ *
+ * The JavaScript files can be local to the server or remote (such as
+ * Google's CDN).
+ *
+ * @param string $name An identifier for the JavaScript library
+ * @param string $url URL of the JavaScript file
+ * @param string $location Page location: head or footer. (default: head)
+ * @param int $priority Priority of the JS file (lower numbers load earlier)
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_js($name, $url, $location = 'head', $priority = null) {
+ return elgg_register_external_file('js', $name, $url, $location, $priority);
+}
+
+/**
+ * Unregister a JavaScript file
+ *
+ * @param string $name The identifier for the JavaScript library
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unregister_js($name) {
+ return elgg_unregister_external_file('js', $name);
+}
+
+/**
+ * Load a JavaScript resource on this page
+ *
+ * This must be called before elgg_view_page(). It can be called before the
+ * script is registered. If you do not want a script loaded, unregister it.
+ *
+ * @param string $name Identifier of the JavaScript resource
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_load_js($name) {
+ elgg_load_external_file('js', $name);
+}
+
+/**
+ * Get the JavaScript URLs that are loaded
+ *
+ * @param string $location 'head' or 'footer'
+ *
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_loaded_js($location = 'head') {
+ return elgg_get_loaded_external_files('js', $location);
+}
+
+/**
+ * Register a CSS file for inclusion in the HTML head
+ *
+ * @param string $name An identifier for the CSS file
+ * @param string $url URL of the CSS file
+ * @param int $priority Priority of the CSS file (lower numbers load earlier)
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_css($name, $url, $priority = null) {
+ return elgg_register_external_file('css', $name, $url, 'head', $priority);
+}
+
+/**
+ * Unregister a CSS file
+ *
+ * @param string $name The identifier for the CSS file
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unregister_css($name) {
+ return elgg_unregister_external_file('css', $name);
+}
+
+/**
+ * Load a CSS file for this page
+ *
+ * This must be called before elgg_view_page(). It can be called before the
+ * CSS file is registered. If you do not want a CSS file loaded, unregister it.
+ *
+ * @param string $name Identifier of the CSS file
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_load_css($name) {
+ elgg_load_external_file('css', $name);
+}
+
+/**
+ * Get the loaded CSS URLs
+ *
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_loaded_css() {
+ return elgg_get_loaded_external_files('css', 'head');
+}
+
+/**
+ * Core registration function for external files
+ *
+ * @param string $type Type of external resource (js or css)
+ * @param string $name Identifier used as key
+ * @param string $url URL
+ * @param string $location Location in the page to include the file
+ * @param int $priority Loading priority of the file
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_external_file($type, $name, $url, $location, $priority = 500) {
+ global $CONFIG;
+
+ if (empty($name) || empty($url)) {
+ return false;
+ }
+
+ $url = elgg_format_url($url);
+ $url = elgg_normalize_url($url);
+
+ elgg_bootstrap_externals_data_structure($type);
+
+ $name = trim(strtolower($name));
+
+ // normalize bogus priorities, but allow empty, null, and false to be defaults.
+ if (!is_numeric($priority)) {
+ $priority = 500;
+ }
+
+ // no negative priorities right now.
+ $priority = max((int)$priority, 0);
+
+ $item = elgg_extract($name, $CONFIG->externals_map[$type]);
+
+ if ($item) {
+ // updating a registered item
+ // don't update loaded because it could already be set
+ $item->url = $url;
+ $item->location = $location;
+
+ // if loaded before registered, that means it hasn't been added to the list yet
+ if ($CONFIG->externals[$type]->contains($item)) {
+ $priority = $CONFIG->externals[$type]->move($item, $priority);
+ } else {
+ $priority = $CONFIG->externals[$type]->add($item, $priority);
+ }
+ } else {
+ $item = new stdClass();
+ $item->loaded = false;
+ $item->url = $url;
+ $item->location = $location;
+
+ $priority = $CONFIG->externals[$type]->add($item, $priority);
+ }
+
+ $CONFIG->externals_map[$type][$name] = $item;
+
+ return $priority !== false;
+}
+
+/**
+ * Unregister an external file
+ *
+ * @param string $type Type of file: js or css
+ * @param string $name The identifier of the file
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unregister_external_file($type, $name) {
+ global $CONFIG;
+
+ elgg_bootstrap_externals_data_structure($type);
+
+ $name = trim(strtolower($name));
+ $item = elgg_extract($name, $CONFIG->externals_map[$type]);
+
+ if ($item) {
+ unset($CONFIG->externals_map[$type][$name]);
+ return $CONFIG->externals[$type]->remove($item);
+ }
+
+ return false;
+}
+
+/**
+ * Load an external resource for use on this page
+ *
+ * @param string $type Type of file: js or css
+ * @param string $name The identifier for the file
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_load_external_file($type, $name) {
+ global $CONFIG;
+
+ elgg_bootstrap_externals_data_structure($type);
+
+ $name = trim(strtolower($name));
+
+ $item = elgg_extract($name, $CONFIG->externals_map[$type]);
+
+ if ($item) {
+ // update a registered item
+ $item->loaded = true;
+ } else {
+ $item = new stdClass();
+ $item->loaded = true;
+ $item->url = '';
+ $item->location = '';
+
+ $CONFIG->externals[$type]->add($item);
+ $CONFIG->externals_map[$type][$name] = $item;
+ }
+}
+
+/**
+ * Get external resource descriptors
+ *
+ * @param string $type Type of file: js or css
+ * @param string $location Page location
+ *
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_loaded_external_files($type, $location) {
+ global $CONFIG;
+
+ if (isset($CONFIG->externals) && $CONFIG->externals[$type] instanceof ElggPriorityList) {
+ $items = $CONFIG->externals[$type]->getElements();
+
+ $callback = "return \$v->loaded == true && \$v->location == '$location';";
+ $items = array_filter($items, create_function('$v', $callback));
+ if ($items) {
+ array_walk($items, create_function('&$v,$k', '$v = $v->url;'));
+ }
+ return $items;
+ }
+ return array();
+}
+
+/**
+ * Bootstraps the externals data structure in $CONFIG.
+ *
+ * @param string $type The type of external, js or css.
+ * @access private
+ */
+function elgg_bootstrap_externals_data_structure($type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->externals)) {
+ $CONFIG->externals = array();
+ }
+
+ if (!isset($CONFIG->externals[$type]) || !$CONFIG->externals[$type] instanceof ElggPriorityList) {
+ $CONFIG->externals[$type] = new ElggPriorityList();
+ }
+
+ if (!isset($CONFIG->externals_map)) {
+ $CONFIG->externals_map = array();
+ }
+
+ if (!isset($CONFIG->externals_map[$type])) {
+ $CONFIG->externals_map[$type] = array();
+ }
+}
+
+/**
+ * Returns a list of files in $directory.
+ *
+ * Only returns files. Does not recurse into subdirs.
+ *
+ * @param string $directory Directory to look in
+ * @param array $exceptions Array of filenames to ignore
+ * @param array $list Array of files to append to
+ * @param mixed $extensions Array of extensions to allow, NULL for all. Use a dot: array('.php').
+ *
+ * @return array Filenames in $directory, in the form $directory/filename.
+ */
+function elgg_get_file_list($directory, $exceptions = array(), $list = array(),
+$extensions = NULL) {
+
+ $directory = sanitise_filepath($directory);
+ if ($handle = opendir($directory)) {
+ while (($file = readdir($handle)) !== FALSE) {
+ if (!is_file($directory . $file) || in_array($file, $exceptions)) {
+ continue;
+ }
+
+ if (is_array($extensions)) {
+ if (in_array(strrchr($file, '.'), $extensions)) {
+ $list[] = $directory . $file;
+ }
+ } else {
+ $list[] = $directory . $file;
+ }
+ }
+ closedir($handle);
+ }
+
+ return $list;
+}
+
+/**
+ * Sanitise file paths ensuring that they begin and end with slashes etc.
+ *
+ * @param string $path The path
+ * @param bool $append_slash Add tailing slash
+ *
+ * @return string
+ */
+function sanitise_filepath($path, $append_slash = TRUE) {
+ // Convert to correct UNIX paths
+ $path = str_replace('\\', '/', $path);
+ $path = str_replace('../', '/', $path);
+ // replace // with / except when preceeded by :
+ $path = preg_replace("/([^:])\/\//", "$1/", $path);
+
+ // Sort trailing slash
+ $path = trim($path);
+ // rtrim defaults plus /
+ $path = rtrim($path, " \n\t\0\x0B/");
+
+ if ($append_slash) {
+ $path = $path . '/';
+ }
+
+ return $path;
+}
+
+/**
+ * Queues a message to be displayed.
+ *
+ * Messages will not be displayed immediately, but are stored in
+ * for later display, usually upon next page load.
+ *
+ * The method of displaying these messages differs depending upon plugins and
+ * viewtypes. The core default viewtype retrieves messages in
+ * {@link views/default/page/shells/default.php} and displays messages as
+ * javascript popups.
+ *
+ * @internal Messages are stored as strings in the $_SESSION['msg'][$register] array.
+ *
+ * @warning This function is used to both add to and clear the message
+ * stack. If $messages is null, $register will be returned and cleared.
+ * If $messages is null and $register is empty, all messages will be
+ * returned and removed.
+ *
+ * @important This function handles the standard {@link system_message()} ($register =
+ * 'messages') as well as {@link register_error()} messages ($register = 'errors').
+ *
+ * @param mixed $message Optionally, a single message or array of messages to add, (default: null)
+ * @param string $register Types of message: "error", "success" (default: success)
+ * @param bool $count Count the number of messages (default: false)
+ *
+ * @return bool|array Either the array of messages, or a response regarding
+ * whether the message addition was successful.
+ * @todo Clean up. Separate registering messages and retrieving them.
+ */
+function system_messages($message = null, $register = "success", $count = false) {
+ if (!isset($_SESSION['msg'])) {
+ $_SESSION['msg'] = array();
+ }
+ if (!isset($_SESSION['msg'][$register]) && !empty($register)) {
+ $_SESSION['msg'][$register] = array();
+ }
+ if (!$count) {
+ if (!empty($message) && is_array($message)) {
+ $_SESSION['msg'][$register] = array_merge($_SESSION['msg'][$register], $message);
+ return true;
+ } else if (!empty($message) && is_string($message)) {
+ $_SESSION['msg'][$register][] = $message;
+ return true;
+ } else if (is_null($message)) {
+ if ($register != "") {
+ $returnarray = array();
+ $returnarray[$register] = $_SESSION['msg'][$register];
+ $_SESSION['msg'][$register] = array();
+ } else {
+ $returnarray = $_SESSION['msg'];
+ $_SESSION['msg'] = array();
+ }
+ return $returnarray;
+ }
+ } else {
+ if (!empty($register)) {
+ return sizeof($_SESSION['msg'][$register]);
+ } else {
+ $count = 0;
+ foreach ($_SESSION['msg'] as $submessages) {
+ $count += sizeof($submessages);
+ }
+ return $count;
+ }
+ }
+ return false;
+}
+
+/**
+ * Counts the number of messages, either globally or in a particular register
+ *
+ * @param string $register Optionally, the register
+ *
+ * @return integer The number of messages
+ */
+function count_messages($register = "") {
+ return system_messages(null, $register, true);
+}
+
+/**
+ * Display a system message on next page load.
+ *
+ * @see system_messages()
+ *
+ * @param string|array $message Message or messages to add
+ *
+ * @return bool
+ */
+function system_message($message) {
+ return system_messages($message, "success");
+}
+
+/**
+ * Display an error on next page load.
+ *
+ * @see system_messages()
+ *
+ * @param string|array $error Error or errors to add
+ *
+ * @return bool
+ */
+function register_error($error) {
+ return system_messages($error, "error");
+}
+
+/**
+ * Register a callback as an Elgg event handler.
+ *
+ * Events are emitted by Elgg when certain actions occur. Plugins
+ * can respond to these events or halt them completely by registering a handler
+ * as a callback to an event. Multiple handlers can be registered for
+ * the same event and will be executed in order of $priority. Any handler
+ * returning false will halt the execution chain.
+ *
+ * This function is called with the event name, event type, and handler callback name.
+ * Setting the optional $priority allows plugin authors to specify when the
+ * callback should be run. Priorities for plugins should be 1-1000.
+ *
+ * The callback is passed 3 arguments when called: $event, $type, and optional $params.
+ *
+ * $event is the name of event being emitted.
+ * $type is the type of event or object concerned.
+ * $params is an optional parameter passed that can include a related object. See
+ * specific event documentation for details on which events pass what parameteres.
+ *
+ * @tip If a priority isn't specified it is determined by the order the handler was
+ * registered relative to the event and type. For plugins, this generally means
+ * the earlier the plugin is in the load order, the earlier the priorities are for
+ * any event handlers.
+ *
+ * @tip $event and $object_type can use the special keyword 'all'. Handler callbacks registered
+ * with $event = all will be called for all events of type $object_type. Similarly,
+ * callbacks registered with $object_type = all will be called for all events of type
+ * $event, regardless of $object_type. If $event and $object_type both are 'all', the
+ * handler callback will be called for all events.
+ *
+ * @tip Event handler callbacks are considered in the follow order:
+ * - Specific registration where 'all' isn't used.
+ * - Registration where 'all' is used for $event only.
+ * - Registration where 'all' is used for $type only.
+ * - Registration where 'all' is used for both.
+ *
+ * @warning If you use the 'all' keyword, you must have logic in the handler callback to
+ * test the passed parameters before taking an action.
+ *
+ * @tip When referring to events, the preferred syntax is "event, type".
+ *
+ * @internal Events are stored in $CONFIG->events as:
+ * <code>
+ * $CONFIG->events[$event][$type][$priority] = $callback;
+ * </code>
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $callback The handler callback
+ * @param int $priority The priority - 0 is default, negative before, positive after
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Tutorials/Plugins/Events
+ * @example events/basic.php Basic example of registering an event handler callback.
+ * @example events/advanced.php Advanced example of registering an event handler
+ * callback and halting execution.
+ * @example events/all.php Example of how to use the 'all' keyword.
+ */
+function elgg_register_event_handler($event, $object_type, $callback, $priority = 500) {
+ global $CONFIG;
+
+ if (empty($event) || empty($object_type)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->events)) {
+ $CONFIG->events = array();
+ }
+ if (!isset($CONFIG->events[$event])) {
+ $CONFIG->events[$event] = array();
+ }
+ if (!isset($CONFIG->events[$event][$object_type])) {
+ $CONFIG->events[$event][$object_type] = array();
+ }
+
+ if (!is_callable($callback, true)) {
+ return false;
+ }
+
+ $priority = max((int) $priority, 0);
+
+ while (isset($CONFIG->events[$event][$object_type][$priority])) {
+ $priority++;
+ }
+ $CONFIG->events[$event][$object_type][$priority] = $callback;
+ ksort($CONFIG->events[$event][$object_type]);
+ return true;
+}
+
+/**
+ * Unregisters a callback for an event.
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $callback The callback
+ *
+ * @return void
+ * @since 1.7
+ */
+function elgg_unregister_event_handler($event, $object_type, $callback) {
+ global $CONFIG;
+
+ if (isset($CONFIG->events[$event]) && isset($CONFIG->events[$event][$object_type])) {
+ foreach ($CONFIG->events[$event][$object_type] as $key => $event_callback) {
+ if ($event_callback == $callback) {
+ unset($CONFIG->events[$event][$object_type][$key]);
+ }
+ }
+ }
+}
+
+/**
+ * Trigger an Elgg Event and run all handler callbacks registered to that event, type.
+ *
+ * This function runs all handlers registered to $event, $object_type or
+ * the special keyword 'all' for either or both.
+ *
+ * $event is usually a verb: create, update, delete, annotation.
+ *
+ * $object_type is usually a noun: object, group, user, annotation, relationship, metadata.
+ *
+ * $object is usually an Elgg* object assciated with the event.
+ *
+ * @warning Elgg events should only be triggered by core. Plugin authors should use
+ * {@link trigger_elgg_plugin_hook()} instead.
+ *
+ * @tip When referring to events, the preferred syntax is "event, type".
+ *
+ * @internal Only rarely should events be changed, added, or removed in core.
+ * When making changes to events, be sure to first create a ticket on Github.
+ *
+ * @internal @tip Think of $object_type as the primary namespace element, and
+ * $event as the secondary namespace.
+ *
+ * @param string $event The event type
+ * @param string $object_type The object type
+ * @param string $object The object involved in the event
+ *
+ * @return bool The result of running all handler callbacks.
+ * @link http://docs.elgg.org/Tutorials/Core/Events
+ * @internal @example events/emit.php Basic emitting of an Elgg event.
+ */
+function elgg_trigger_event($event, $object_type, $object = null) {
+ global $CONFIG;
+
+ $events = array();
+ if (isset($CONFIG->events[$event][$object_type])) {
+ $events[] = $CONFIG->events[$event][$object_type];
+ }
+ if (isset($CONFIG->events['all'][$object_type])) {
+ $events[] = $CONFIG->events['all'][$object_type];
+ }
+ if (isset($CONFIG->events[$event]['all'])) {
+ $events[] = $CONFIG->events[$event]['all'];
+ }
+ if (isset($CONFIG->events['all']['all'])) {
+ $events[] = $CONFIG->events['all']['all'];
+ }
+
+ $args = array($event, $object_type, $object);
+
+ foreach ($events as $callback_list) {
+ if (is_array($callback_list)) {
+ foreach ($callback_list as $callback) {
+ if (is_callable($callback) && (call_user_func_array($callback, $args) === false)) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Register a callback as a plugin hook handler.
+ *
+ * Plugin hooks allow developers to losely couple plugins and features by
+ * repsonding to and emitting {@link elgg_trigger_plugin_hook()} customizable hooks.
+ * Handler callbacks can respond to the hook, change the details of the hook, or
+ * ignore it.
+ *
+ * Multiple handlers can be registered for a plugin hook, and each callback
+ * is called in order of priority. If the return value of a handler is not
+ * null, that value is passed to the next callback in the call stack. When all
+ * callbacks have been run, the final value is passed back to the caller
+ * via {@link elgg_trigger_plugin_hook()}.
+ *
+ * Similar to Elgg Events, plugin hook handler callbacks are registered by passing
+ * a hook, a type, and a priority.
+ *
+ * The callback is passed 4 arguments when called: $hook, $type, $value, and $params.
+ *
+ * - str $hook The name of the hook.
+ * - str $type The type of hook.
+ * - mixed $value The return value of the last handler or the default
+ * value if no other handlers have been called.
+ * - mixed $params An optional array of parameters. Used to provide additional
+ * information to plugins.
+ *
+ * @internal Plugin hooks are stored in $CONFIG->hooks as:
+ * <code>
+ * $CONFIG->hooks[$hook][$type][$priority] = $callback;
+ * </code>
+ *
+ * @tip Plugin hooks are similar to Elgg Events in that Elgg emits
+ * a plugin hook when certain actions occur, but a plugin hook allows you to alter the
+ * parameters, as well as halt execution.
+ *
+ * @tip If a priority isn't specified it is determined by the order the handler was
+ * registered relative to the event and type. For plugins, this generally means
+ * the earlier the plugin is in the load order, the earlier the priorities are for
+ * any event handlers.
+ *
+ * @tip Like Elgg Events, $hook and $type can use the special keyword 'all'.
+ * Handler callbacks registered with $hook = all will be called for all hooks
+ * of type $type. Similarly, handlers registered with $type = all will be
+ * called for all hooks of type $event, regardless of $object_type. If $hook
+ * and $type both are 'all', the handler will be called for all hooks.
+ *
+ * @tip Plugin hooks are sometimes used to gather lists from plugins. This is
+ * usually done by pushing elements into an array passed in $params. Be sure
+ * to append to and then return $value so you don't overwrite other plugin's
+ * values.
+ *
+ * @warning Unlike Elgg Events, a handler that returns false will NOT halt the
+ * execution chain.
+ *
+ * @param string $hook The name of the hook
+ * @param string $type The type of the hook
+ * @param callable $callback The name of a valid function or an array with object and method
+ * @param int $priority The priority - 500 is default, lower numbers called first
+ *
+ * @return bool
+ *
+ * @example hooks/register/basic.php Registering for a plugin hook and examining the variables.
+ * @example hooks/register/advanced.php Registering for a plugin hook and changing the params.
+ * @link http://docs.elgg.org/Tutorials/Plugins/Hooks
+ * @since 1.8.0
+ */
+function elgg_register_plugin_hook_handler($hook, $type, $callback, $priority = 500) {
+ global $CONFIG;
+
+ if (empty($hook) || empty($type)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->hooks)) {
+ $CONFIG->hooks = array();
+ }
+ if (!isset($CONFIG->hooks[$hook])) {
+ $CONFIG->hooks[$hook] = array();
+ }
+ if (!isset($CONFIG->hooks[$hook][$type])) {
+ $CONFIG->hooks[$hook][$type] = array();
+ }
+
+ if (!is_callable($callback, true)) {
+ return false;
+ }
+
+ $priority = max((int) $priority, 0);
+
+ while (isset($CONFIG->hooks[$hook][$type][$priority])) {
+ $priority++;
+ }
+ $CONFIG->hooks[$hook][$type][$priority] = $callback;
+ ksort($CONFIG->hooks[$hook][$type]);
+ return true;
+}
+
+/**
+ * Unregister a callback as a plugin hook.
+ *
+ * @param string $hook The name of the hook
+ * @param string $entity_type The name of the type of entity (eg "user", "object" etc)
+ * @param callable $callback The PHP callback to be removed
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_unregister_plugin_hook_handler($hook, $entity_type, $callback) {
+ global $CONFIG;
+
+ if (isset($CONFIG->hooks[$hook]) && isset($CONFIG->hooks[$hook][$entity_type])) {
+ foreach ($CONFIG->hooks[$hook][$entity_type] as $key => $hook_callback) {
+ if ($hook_callback == $callback) {
+ unset($CONFIG->hooks[$hook][$entity_type][$key]);
+ }
+ }
+ }
+}
+
+/**
+ * Trigger a Plugin Hook and run all handler callbacks registered to that hook:type.
+ *
+ * This function runs all handlers regsitered to $hook, $type or
+ * the special keyword 'all' for either or both.
+ *
+ * Use $params to send additional information to the handler callbacks.
+ *
+ * $returnvalue Is the initial value to pass to the handlers, which can
+ * then change it. It is useful to use $returnvalue to set defaults.
+ * If no handlers are registered, $returnvalue is immediately returned.
+ *
+ * $hook is usually a verb: import, get_views, output.
+ *
+ * $type is usually a noun: user, ecml, page.
+ *
+ * @tip Like Elgg Events, $hook and $type can use the special keyword 'all'.
+ * Handler callbacks registered with $hook = all will be called for all hooks
+ * of type $type. Similarly, handlers registered with $type = all will be
+ * called for all hooks of type $event, regardless of $object_type. If $hook
+ * and $type both are 'all', the handler will be called for all hooks.
+ *
+ * @internal The checks for $hook and/or $type not being equal to 'all' is to
+ * prevent a plugin hook being registered with an 'all' being called more than
+ * once if the trigger occurs with an 'all'. An example in core of this is in
+ * actions.php:
+ * elgg_trigger_plugin_hook('action_gatekeeper:permissions:check', 'all', ...)
+ *
+ * @see elgg_register_plugin_hook_handler()
+ *
+ * @param string $hook The name of the hook to trigger ("all" will
+ * trigger for all $types regardless of $hook value)
+ * @param string $type The type of the hook to trigger ("all" will
+ * trigger for all $hooks regardless of $type value)
+ * @param mixed $params Additional parameters to pass to the handlers
+ * @param mixed $returnvalue An initial return value
+ *
+ * @return mixed|null The return value of the last handler callback called
+ *
+ * @example hooks/trigger/basic.php Trigger a hook that determins if execution
+ * should continue.
+ * @example hooks/trigger/advanced.php Trigger a hook with a default value and use
+ * the results to populate a menu.
+ * @example hooks/basic.php Trigger and respond to a basic plugin hook.
+ * @link http://docs.elgg.org/Tutorials/Plugins/Hooks
+ *
+ * @since 1.8.0
+ */
+function elgg_trigger_plugin_hook($hook, $type, $params = null, $returnvalue = null) {
+ global $CONFIG;
+
+ $hooks = array();
+ if (isset($CONFIG->hooks[$hook][$type])) {
+ if ($hook != 'all' && $type != 'all') {
+ $hooks[] = $CONFIG->hooks[$hook][$type];
+ }
+ }
+ if (isset($CONFIG->hooks['all'][$type])) {
+ if ($type != 'all') {
+ $hooks[] = $CONFIG->hooks['all'][$type];
+ }
+ }
+ if (isset($CONFIG->hooks[$hook]['all'])) {
+ if ($hook != 'all') {
+ $hooks[] = $CONFIG->hooks[$hook]['all'];
+ }
+ }
+ if (isset($CONFIG->hooks['all']['all'])) {
+ $hooks[] = $CONFIG->hooks['all']['all'];
+ }
+
+ foreach ($hooks as $callback_list) {
+ if (is_array($callback_list)) {
+ foreach ($callback_list as $hookcallback) {
+ if (is_callable($hookcallback)) {
+ $args = array($hook, $type, $returnvalue, $params);
+ $temp_return_value = call_user_func_array($hookcallback, $args);
+ if (!is_null($temp_return_value)) {
+ $returnvalue = $temp_return_value;
+ }
+ }
+ }
+ }
+ }
+
+ return $returnvalue;
+}
+
+/**
+ * Intercepts, logs, and displays uncaught exceptions.
+ *
+ * @warning This function should never be called directly.
+ *
+ * @see http://www.php.net/set-exception-handler
+ *
+ * @param Exception $exception The exception being handled
+ *
+ * @return void
+ * @access private
+ */
+function _elgg_php_exception_handler($exception) {
+ $timestamp = time();
+ error_log("Exception #$timestamp: $exception");
+
+ // Wipe any existing output buffer
+ ob_end_clean();
+
+ // make sure the error isn't cached
+ header("Cache-Control: no-cache, must-revalidate", true);
+ header('Expires: Fri, 05 Feb 1982 00:00:00 -0500', true);
+ // @note Do not send a 500 header because it is not a server error
+
+ try {
+ // we don't want the 'pagesetup', 'system' event to fire
+ global $CONFIG;
+ $CONFIG->pagesetupdone = true;
+
+ elgg_set_viewtype('failsafe');
+ if (elgg_is_admin_logged_in()) {
+ $body = elgg_view("messages/exceptions/admin_exception", array(
+ 'object' => $exception,
+ 'ts' => $timestamp
+ ));
+ } else {
+ $body = elgg_view("messages/exceptions/exception", array(
+ 'object' => $exception,
+ 'ts' => $timestamp
+ ));
+ }
+ echo elgg_view_page(elgg_echo('exception:title'), $body);
+ } catch (Exception $e) {
+ $timestamp = time();
+ $message = $e->getMessage();
+ echo "Fatal error in exception handler. Check log for Exception #$timestamp";
+ error_log("Exception #$timestamp : fatal error in exception handler : $message");
+ }
+}
+
+/**
+ * Intercepts catchable PHP errors.
+ *
+ * @warning This function should never be called directly.
+ *
+ * @internal
+ * For catchable fatal errors, throws an Exception with the error.
+ *
+ * For non-fatal errors, depending upon the debug settings, either
+ * log the error or ignore it.
+ *
+ * @see http://www.php.net/set-error-handler
+ *
+ * @param int $errno The level of the error raised
+ * @param string $errmsg The error message
+ * @param string $filename The filename the error was raised in
+ * @param int $linenum The line number the error was raised at
+ * @param array $vars An array that points to the active symbol table where error occurred
+ *
+ * @return true
+ * @throws Exception
+ * @access private
+ * @todo Replace error_log calls with elgg_log calls.
+ */
+function _elgg_php_error_handler($errno, $errmsg, $filename, $linenum, $vars) {
+ $error = date("Y-m-d H:i:s (T)") . ": \"$errmsg\" in file $filename (line $linenum)";
+
+ switch ($errno) {
+ case E_USER_ERROR:
+ error_log("PHP ERROR: $error");
+ register_error("ERROR: $error");
+
+ // Since this is a fatal error, we want to stop any further execution but do so gracefully.
+ throw new Exception($error);
+ break;
+
+ case E_WARNING :
+ case E_USER_WARNING :
+ case E_RECOVERABLE_ERROR: // (e.g. type hint violation)
+
+ // check if the error wasn't suppressed by the error control operator (@)
+ if (error_reporting()) {
+ error_log("PHP WARNING: $error");
+ }
+ break;
+
+ default:
+ global $CONFIG;
+ if (isset($CONFIG->debug) && $CONFIG->debug === 'NOTICE') {
+ error_log("PHP NOTICE: $error");
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Display or log a message.
+ *
+ * If $level is >= to the debug setting in {@link $CONFIG->debug}, the
+ * message will be sent to {@link elgg_dump()}. Messages with lower
+ * priority than {@link $CONFIG->debug} are ignored.
+ *
+ * {@link elgg_dump()} outputs all levels but NOTICE to screen by default.
+ *
+ * @note No messages will be displayed unless debugging has been enabled.
+ *
+ * @param string $message User message
+ * @param string $level NOTICE | WARNING | ERROR | DEBUG
+ *
+ * @return bool
+ * @since 1.7.0
+ * @todo This is complicated and confusing. Using int constants for debug levels will
+ * make things easier.
+ */
+function elgg_log($message, $level = 'NOTICE') {
+ global $CONFIG;
+
+ // only log when debugging is enabled
+ if (isset($CONFIG->debug)) {
+ // debug to screen or log?
+ $to_screen = !($CONFIG->debug == 'NOTICE');
+
+ switch ($level) {
+ case 'ERROR':
+ // always report
+ elgg_dump("$level: $message", $to_screen, $level);
+ break;
+ case 'WARNING':
+ case 'DEBUG':
+ // report except if user wants only errors
+ if ($CONFIG->debug != 'ERROR') {
+ elgg_dump("$level: $message", $to_screen, $level);
+ }
+ break;
+ case 'NOTICE':
+ default:
+ // only report when lowest level is desired
+ if ($CONFIG->debug == 'NOTICE') {
+ elgg_dump("$level: $message", FALSE, $level);
+ }
+ break;
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Logs or displays $value.
+ *
+ * If $to_screen is true, $value is displayed to screen. Else,
+ * it is handled by PHP's {@link error_log()} function.
+ *
+ * A {@elgg_plugin_hook debug log} is called. If a handler returns
+ * false, it will stop the default logging method.
+ *
+ * @param mixed $value The value
+ * @param bool $to_screen Display to screen?
+ * @param string $level The debug level
+ *
+ * @return void
+ * @since 1.7.0
+ */
+function elgg_dump($value, $to_screen = TRUE, $level = 'NOTICE') {
+ global $CONFIG;
+
+ // plugin can return false to stop the default logging method
+ $params = array(
+ 'level' => $level,
+ 'msg' => $value,
+ 'to_screen' => $to_screen,
+ );
+ if (!elgg_trigger_plugin_hook('debug', 'log', $params, true)) {
+ return;
+ }
+
+ // Do not want to write to screen before page creation has started.
+ // This is not fool-proof but probably fixes 95% of the cases when logging
+ // results in data sent to the browser before the page is begun.
+ if (!isset($CONFIG->pagesetupdone)) {
+ $to_screen = FALSE;
+ }
+
+ // Do not want to write to JS or CSS pages
+ if (elgg_in_context('js') || elgg_in_context('css')) {
+ $to_screen = FALSE;
+ }
+
+ if ($to_screen == TRUE) {
+ echo '<pre>';
+ print_r($value);
+ echo '</pre>';
+ } else {
+ error_log(print_r($value, TRUE));
+ }
+}
+
+/**
+ * Sends a notice about deprecated use of a function, view, etc.
+ *
+ * This function either displays or logs the deprecation message,
+ * depending upon the deprecation policies in {@link CODING.txt}.
+ * Logged messages are sent with the level of 'WARNING'. Only admins
+ * get visual deprecation notices. When non-admins are logged in, the
+ * notices are sent to PHP's log through elgg_dump().
+ *
+ * A user-visual message will be displayed if $dep_version is greater
+ * than 1 minor releases lower than the current Elgg version, or at all
+ * lower than the current Elgg major version.
+ *
+ * @note This will always at least log a warning. Don't use to pre-deprecate things.
+ * This assumes we are releasing in order and deprecating according to policy.
+ *
+ * @see CODING.txt
+ *
+ * @param string $msg Message to log / display.
+ * @param string $dep_version Human-readable *release* version: 1.7, 1.8, ...
+ * @param int $backtrace_level How many levels back to display the backtrace.
+ * Useful if calling from functions that are called
+ * from other places (like elgg_view()). Set to -1
+ * for a full backtrace.
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function elgg_deprecated_notice($msg, $dep_version, $backtrace_level = 1) {
+ // if it's a major release behind, visual and logged
+ // if it's a 1 minor release behind, visual and logged
+ // if it's for current minor release, logged.
+ // bugfixes don't matter because we are not deprecating between them
+
+ if (!$dep_version) {
+ return false;
+ }
+
+ $elgg_version = get_version(true);
+ $elgg_version_arr = explode('.', $elgg_version);
+ $elgg_major_version = (int)$elgg_version_arr[0];
+ $elgg_minor_version = (int)$elgg_version_arr[1];
+
+ $dep_major_version = (int)$dep_version;
+ $dep_minor_version = 10 * ($dep_version - $dep_major_version);
+
+ $visual = false;
+
+ if (($dep_major_version < $elgg_major_version) ||
+ ($dep_minor_version < $elgg_minor_version)) {
+ $visual = true;
+ }
+
+ $msg = "Deprecated in $dep_major_version.$dep_minor_version: $msg";
+
+ if ($visual && elgg_is_admin_logged_in()) {
+ register_error($msg);
+ }
+
+ // Get a file and line number for the log. Never show this in the UI.
+ // Skip over the function that sent this notice and see who called the deprecated
+ // function itself.
+ $msg .= " Called from ";
+ $stack = array();
+ $backtrace = debug_backtrace();
+ // never show this call.
+ array_shift($backtrace);
+ $i = count($backtrace);
+
+ foreach ($backtrace as $trace) {
+ $stack[] = "[#$i] {$trace['file']}:{$trace['line']}";
+ $i--;
+
+ if ($backtrace_level > 0) {
+ if ($backtrace_level <= 1) {
+ break;
+ }
+ $backtrace_level--;
+ }
+ }
+
+ $msg .= implode("<br /> -> ", $stack);
+
+ elgg_log($msg, 'WARNING');
+
+ return true;
+}
+
+/**
+ * Returns the current page's complete URL.
+ *
+ * The current URL is assembled using the network's wwwroot and the request URI
+ * in $_SERVER as populated by the web server. This function will include
+ * any schemes, usernames and passwords, and ports.
+ *
+ * @return string The current page URL.
+ */
+function current_page_url() {
+ $url = parse_url(elgg_get_site_url());
+
+ $page = $url['scheme'] . "://";
+
+ // user/pass
+ if ((isset($url['user'])) && ($url['user'])) {
+ $page .= $url['user'];
+ }
+ if ((isset($url['pass'])) && ($url['pass'])) {
+ $page .= ":" . $url['pass'];
+ }
+ if ((isset($url['user']) && $url['user']) ||
+ (isset($url['pass']) && $url['pass'])) {
+ $page .= "@";
+ }
+
+ $page .= $url['host'];
+
+ if ((isset($url['port'])) && ($url['port'])) {
+ $page .= ":" . $url['port'];
+ }
+
+ $page = trim($page, "/");
+
+ $page .= $_SERVER['REQUEST_URI'];
+
+ return $page;
+}
+
+/**
+ * Return the full URL of the current page.
+ *
+ * @return string The URL
+ * @todo Combine / replace with current_page_url()
+ */
+function full_url() {
+ $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
+ $protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0,
+ strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")) . $s;
+
+ $port = ($_SERVER["SERVER_PORT"] == "80" || $_SERVER["SERVER_PORT"] == "443") ?
+ "" : (":" . $_SERVER["SERVER_PORT"]);
+
+ // This is here to prevent XSS in poorly written browsers used by 80% of the population.
+ // https://github.com/Elgg/Elgg/commit/0c947e80f512cb0a482b1864fd0a6965c8a0cd4a
+ $quotes = array('\'', '"');
+ $encoded = array('%27', '%22');
+
+ return $protocol . "://" . $_SERVER['SERVER_NAME'] . $port .
+ str_replace($quotes, $encoded, $_SERVER['REQUEST_URI']);
+}
+
+/**
+ * Builds a URL from the a parts array like one returned by {@link parse_url()}.
+ *
+ * @note If only partial information is passed, a partial URL will be returned.
+ *
+ * @param array $parts Associative array of URL components like parse_url() returns
+ * @param bool $html_encode HTML Encode the url?
+ *
+ * @return string Full URL
+ * @since 1.7.0
+ */
+function elgg_http_build_url(array $parts, $html_encode = TRUE) {
+ // build only what's given to us.
+ $scheme = isset($parts['scheme']) ? "{$parts['scheme']}://" : '';
+ $host = isset($parts['host']) ? "{$parts['host']}" : '';
+ $port = isset($parts['port']) ? ":{$parts['port']}" : '';
+ $path = isset($parts['path']) ? "{$parts['path']}" : '';
+ $query = isset($parts['query']) ? "?{$parts['query']}" : '';
+
+ $string = $scheme . $host . $port . $path . $query;
+
+ if ($html_encode) {
+ return elgg_format_url($string);
+ } else {
+ return $string;
+ }
+}
+
+/**
+ * Adds action tokens to URL
+ *
+ * As of 1.7.0 action tokens are required on all actions.
+ * Use this function to append action tokens to a URL's GET parameters.
+ * This will preserve any existing GET parameters.
+ *
+ * @note If you are using {@elgg_view input/form} you don't need to
+ * add tokens to the action. The form view automatically handles
+ * tokens.
+ *
+ * @param string $url Full action URL
+ * @param bool $html_encode HTML encode the url? (default: false)
+ *
+ * @return string URL with action tokens
+ * @since 1.7.0
+ * @link http://docs.elgg.org/Tutorials/Actions
+ */
+function elgg_add_action_tokens_to_url($url, $html_encode = FALSE) {
+ $components = parse_url(elgg_normalize_url($url));
+
+ if (isset($components['query'])) {
+ $query = elgg_parse_str($components['query']);
+ } else {
+ $query = array();
+ }
+
+ if (isset($query['__elgg_ts']) && isset($query['__elgg_token'])) {
+ return $url;
+ }
+
+ // append action tokens to the existing query
+ $query['__elgg_ts'] = time();
+ $query['__elgg_token'] = generate_action_token($query['__elgg_ts']);
+ $components['query'] = http_build_query($query);
+
+ // rebuild the full url
+ return elgg_http_build_url($components, $html_encode);
+}
+
+/**
+ * Removes an element from a URL's query string.
+ *
+ * @note You can send a partial URL string.
+ *
+ * @param string $url Full URL
+ * @param string $element The element to remove
+ *
+ * @return string The new URL with the query element removed.
+ * @since 1.7.0
+ */
+function elgg_http_remove_url_query_element($url, $element) {
+ $url_array = parse_url($url);
+
+ if (isset($url_array['query'])) {
+ $query = elgg_parse_str($url_array['query']);
+ } else {
+ // nothing to remove. Return original URL.
+ return $url;
+ }
+
+ if (array_key_exists($element, $query)) {
+ unset($query[$element]);
+ }
+
+ $url_array['query'] = http_build_query($query);
+ $string = elgg_http_build_url($url_array, false);
+ return $string;
+}
+
+/**
+ * Adds an element or elements to a URL's query string.
+ *
+ * @param string $url The URL
+ * @param array $elements Key/value pairs to add to the URL
+ *
+ * @return string The new URL with the query strings added
+ * @since 1.7.0
+ */
+function elgg_http_add_url_query_elements($url, array $elements) {
+ $url_array = parse_url($url);
+
+ if (isset($url_array['query'])) {
+ $query = elgg_parse_str($url_array['query']);
+ } else {
+ $query = array();
+ }
+
+ foreach ($elements as $k => $v) {
+ $query[$k] = $v;
+ }
+
+ $url_array['query'] = http_build_query($query);
+ $string = elgg_http_build_url($url_array, false);
+
+ return $string;
+}
+
+/**
+ * Test if two URLs are functionally identical.
+ *
+ * @tip If $ignore_params is used, neither the name nor its value will be considered when comparing.
+ *
+ * @tip The order of GET params doesn't matter.
+ *
+ * @param string $url1 First URL
+ * @param string $url2 Second URL
+ * @param array $ignore_params GET params to ignore in the comparison
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset', 'limit')) {
+ // if the server portion is missing but it starts with / then add the url in.
+ // @todo use elgg_normalize_url()
+ if (elgg_substr($url1, 0, 1) == '/') {
+ $url1 = elgg_get_site_url() . ltrim($url1, '/');
+ }
+
+ if (elgg_substr($url1, 0, 1) == '/') {
+ $url2 = elgg_get_site_url() . ltrim($url2, '/');
+ }
+
+ // @todo - should probably do something with relative URLs
+
+ if ($url1 == $url2) {
+ return TRUE;
+ }
+
+ $url1_info = parse_url($url1);
+ $url2_info = parse_url($url2);
+
+ if (isset($url1_info['path'])) {
+ $url1_info['path'] = trim($url1_info['path'], '/');
+ }
+ if (isset($url2_info['path'])) {
+ $url2_info['path'] = trim($url2_info['path'], '/');
+ }
+
+ // compare basic bits
+ $parts = array('scheme', 'host', 'path');
+
+ foreach ($parts as $part) {
+ if ((isset($url1_info[$part]) && isset($url2_info[$part]))
+ && $url1_info[$part] != $url2_info[$part]) {
+ return FALSE;
+ } elseif (isset($url1_info[$part]) && !isset($url2_info[$part])) {
+ return FALSE;
+ } elseif (!isset($url1_info[$part]) && isset($url2_info[$part])) {
+ return FALSE;
+ }
+ }
+
+ // quick compare of get params
+ if (isset($url1_info['query']) && isset($url2_info['query'])
+ && $url1_info['query'] == $url2_info['query']) {
+ return TRUE;
+ }
+
+ // compare get params that might be out of order
+ $url1_params = array();
+ $url2_params = array();
+
+ if (isset($url1_info['query'])) {
+ if ($url1_info['query'] = html_entity_decode($url1_info['query'])) {
+ $url1_params = elgg_parse_str($url1_info['query']);
+ }
+ }
+
+ if (isset($url2_info['query'])) {
+ if ($url2_info['query'] = html_entity_decode($url2_info['query'])) {
+ $url2_params = elgg_parse_str($url2_info['query']);
+ }
+ }
+
+ // drop ignored params
+ foreach ($ignore_params as $param) {
+ if (isset($url1_params[$param])) {
+ unset($url1_params[$param]);
+ }
+ if (isset($url2_params[$param])) {
+ unset($url2_params[$param]);
+ }
+ }
+
+ // array_diff_assoc only returns the items in arr1 that aren't in arrN
+ // but not the items that ARE in arrN but NOT in arr1
+ // if arr1 is an empty array, this function will return 0 no matter what.
+ // since we only care if they're different and not how different,
+ // add the results together to get a non-zero (ie, different) result
+ $diff_count = count(array_diff_assoc($url1_params, $url2_params));
+ $diff_count += count(array_diff_assoc($url2_params, $url1_params));
+ if ($diff_count > 0) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Checks for $array[$key] and returns its value if it exists, else
+ * returns $default.
+ *
+ * Shorthand for $value = (isset($array['key'])) ? $array['key'] : 'default';
+ *
+ * @param string $key The key to check.
+ * @param array $array The array to check against.
+ * @param mixed $default Default value to return if nothing is found.
+ * @param bool $strict Return array key if it's set, even if empty. If false,
+ * return $default if the array key is unset or empty.
+ *
+ * @return mixed
+ * @since 1.8.0
+ */
+function elgg_extract($key, array $array, $default = null, $strict = true) {
+ if (!is_array($array)) {
+ return $default;
+ }
+
+ if ($strict) {
+ return (isset($array[$key])) ? $array[$key] : $default;
+ } else {
+ return (isset($array[$key]) && !empty($array[$key])) ? $array[$key] : $default;
+ }
+}
+
+/**
+ * Sorts a 3d array by specific element.
+ *
+ * @warning Will re-index numeric indexes.
+ *
+ * @note This operates the same as the built-in sort functions.
+ * It sorts the array and returns a bool for success.
+ *
+ * Do this: elgg_sort_3d_array_by_value($my_array);
+ * Not this: $my_array = elgg_sort_3d_array_by_value($my_array);
+ *
+ * @param array &$array Array to sort
+ * @param string $element Element to sort by
+ * @param int $sort_order PHP sort order
+ * {@see http://us2.php.net/array_multisort}
+ * @param int $sort_type PHP sort type
+ * {@see http://us2.php.net/sort}
+ *
+ * @return bool
+ */
+function elgg_sort_3d_array_by_value(&$array, $element, $sort_order = SORT_ASC,
+$sort_type = SORT_LOCALE_STRING) {
+
+ $sort = array();
+
+ foreach ($array as $v) {
+ if (isset($v[$element])) {
+ $sort[] = strtolower($v[$element]);
+ } else {
+ $sort[] = NULL;
+ }
+ };
+
+ return array_multisort($sort, $sort_order, $sort_type, $array);
+}
+
+/**
+ * Return the state of a php.ini setting as a bool
+ *
+ * @warning Using this on ini settings that are not boolean
+ * will be inaccurate!
+ *
+ * @param string $ini_get_arg The INI setting
+ *
+ * @return bool Depending on whether it's on or off
+ */
+function ini_get_bool($ini_get_arg) {
+ $temp = strtolower(ini_get($ini_get_arg));
+
+ if ($temp == '1' || $temp == 'on' || $temp == 'true') {
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Returns a PHP INI setting in bytes.
+ *
+ * @tip Use this for arithmetic when determining if a file can be uploaded.
+ *
+ * @param string $setting The php.ini setting
+ *
+ * @return int
+ * @since 1.7.0
+ * @link http://www.php.net/manual/en/function.ini-get.php
+ */
+function elgg_get_ini_setting_in_bytes($setting) {
+ // retrieve INI setting
+ $val = ini_get($setting);
+
+ // convert INI setting when shorthand notation is used
+ $last = strtolower($val[strlen($val) - 1]);
+ switch($last) {
+ case 'g':
+ $val *= 1024;
+ // fallthrough intentional
+ case 'm':
+ $val *= 1024;
+ // fallthrough intentional
+ case 'k':
+ $val *= 1024;
+ }
+
+ // return byte value
+ return $val;
+}
+
+/**
+ * Returns true is string is not empty, false, or null.
+ *
+ * Function to be used in array_filter which returns true if $string is not null.
+ *
+ * @param string $string The string to test
+ *
+ * @return bool
+ * @todo This is used once in metadata.php. Use a lambda function instead.
+ */
+function is_not_null($string) {
+ if (($string === '') || ($string === false) || ($string === null)) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Normalise the singular keys in an options array to plural keys.
+ *
+ * Used in elgg_get_entities*() functions to support shortcutting plural
+ * names by singular names.
+ *
+ * @param array $options The options array. $options['keys'] = 'values';
+ * @param array $singulars A list of singular words to pluralize by adding 's'.
+ *
+ * @return array
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_normalise_plural_options_array($options, $singulars) {
+ foreach ($singulars as $singular) {
+ $plural = $singular . 's';
+
+ if (array_key_exists($singular, $options)) {
+ if ($options[$singular] === ELGG_ENTITIES_ANY_VALUE) {
+ $options[$plural] = $options[$singular];
+ } else {
+ // Test for array refs #2641
+ if (!is_array($options[$singular])) {
+ $options[$plural] = array($options[$singular]);
+ } else {
+ $options[$plural] = $options[$singular];
+ }
+ }
+ }
+
+ unset($options[$singular]);
+ }
+
+ return $options;
+}
+
+/**
+ * Emits a shutdown:system event upon PHP shutdown, but before database connections are dropped.
+ *
+ * @tip Register for the shutdown:system event to perform functions at the end of page loads.
+ *
+ * @warning Using this event to perform long-running functions is not very
+ * useful. Servers will hold pages until processing is done before sending
+ * them out to the browser.
+ *
+ * @see http://www.php.net/register-shutdown-function
+ *
+ * @return void
+ * @see register_shutdown_hook()
+ * @access private
+ */
+function _elgg_shutdown_hook() {
+ global $START_MICROTIME;
+
+ try {
+ elgg_trigger_event('shutdown', 'system');
+
+ $time = (float)(microtime(TRUE) - $START_MICROTIME);
+ // demoted to NOTICE from DEBUG so javascript is not corrupted
+ elgg_log("Page {$_SERVER['REQUEST_URI']} generated in $time seconds", 'NOTICE');
+ } catch (Exception $e) {
+ $message = 'Error: ' . get_class($e) . ' thrown within the shutdown handler. ';
+ $message .= "Message: '{$e->getMessage()}' in file {$e->getFile()} (line {$e->getLine()})";
+ error_log($message);
+ error_log("Exception trace stack: {$e->getTraceAsString()}");
+ }
+}
+
+/**
+ * Serve javascript pages.
+ *
+ * Searches for views under js/ and outputs them with special
+ * headers for caching control.
+ *
+ * @param array $page The page array
+ *
+ * @return bool
+ * @elgg_pagehandler js
+ * @access private
+ */
+function elgg_js_page_handler($page) {
+ return elgg_cacheable_view_page_handler($page, 'js');
+}
+
+/**
+ * Serve individual views for Ajax.
+ *
+ * /ajax/view/<name of view>?<key/value params>
+ *
+ * @param array $page The page array
+ *
+ * @return bool
+ * @elgg_pagehandler ajax
+ * @access private
+ */
+function elgg_ajax_page_handler($page) {
+ if (is_array($page) && sizeof($page)) {
+ // throw away 'view' and form the view name
+ unset($page[0]);
+ $view = implode('/', $page);
+
+ $allowed_views = elgg_get_config('allowed_ajax_views');
+ if (!array_key_exists($view, $allowed_views)) {
+ header('HTTP/1.1 403 Forbidden');
+ exit;
+ }
+
+ // pull out GET parameters through filter
+ $vars = array();
+ foreach ($_GET as $name => $value) {
+ $vars[$name] = get_input($name);
+ }
+
+ if (isset($vars['guid'])) {
+ $vars['entity'] = get_entity($vars['guid']);
+ }
+
+ echo elgg_view($view, $vars);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Serve CSS
+ *
+ * Serves CSS from the css views directory with headers for caching control
+ *
+ * @param array $page The page array
+ *
+ * @return bool
+ * @elgg_pagehandler css
+ * @access private
+ */
+function elgg_css_page_handler($page) {
+ if (!isset($page[0])) {
+ // default css
+ $page[0] = 'elgg';
+ }
+
+ return elgg_cacheable_view_page_handler($page, 'css');
+}
+
+/**
+ * Serves a JS or CSS view with headers for caching.
+ *
+ * /<css||js>/name/of/view.<last_cache>.<css||js>
+ *
+ * @param array $page The page array
+ * @param string $type The type: js or css
+ *
+ * @return bool
+ * @access private
+ */
+function elgg_cacheable_view_page_handler($page, $type) {
+
+ switch ($type) {
+ case 'js':
+ $content_type = 'text/javascript';
+ break;
+
+ case 'css':
+ $content_type = 'text/css';
+ break;
+
+ default:
+ return false;
+ break;
+ }
+
+ if ($page) {
+ // the view file names can have multiple dots
+ // eg: views/default/js/calendars/jquery.fullcalendar.min.php
+ // translates to the url /js/calendars/jquery.fullcalendar.min.<ts>.js
+ // and the view js/calendars/jquery.fullcalendar.min
+ // we ignore the last two dots for the ts and the ext.
+ // Additionally, the timestamp is optional.
+ $page = implode('/', $page);
+ $regex = '|(.+?)\.([\d]+\.)?\w+$|';
+ preg_match($regex, $page, $matches);
+ $view = $matches[1];
+ $return = elgg_view("$type/$view");
+
+ header("Content-type: $content_type");
+
+ // @todo should js be cached when simple cache turned off
+ //header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', strtotime("+10 days")), true);
+ //header("Pragma: public");
+ //header("Cache-Control: public");
+ //header("Content-Length: " . strlen($return));
+
+ echo $return;
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Reverses the ordering in an ORDER BY clause. This is achived by replacing
+ * asc with desc, or appending desc to the end of the clause.
+ *
+ * This is used mostly for elgg_get_entities() and other similar functions.
+ *
+ * @param string $order_by An order by clause
+ * @access private
+ * @return string
+ * @access private
+ */
+function elgg_sql_reverse_order_by_clause($order_by) {
+ $order_by = strtolower($order_by);
+
+ if (strpos($order_by, ' asc') !== false) {
+ $return = str_replace(' asc', ' desc', $order_by);
+ } elseif (strpos($order_by, ' desc') !== false) {
+ $return = str_replace(' desc', ' asc', $order_by);
+ } else {
+ // no order specified, so default to desc since mysql defaults to asc
+ $return = $order_by . ' desc';
+ }
+
+ return $return;
+}
+
+/**
+ * Enable objects with an enable() method.
+ *
+ * Used as a callback for ElggBatch.
+ *
+ * @todo why aren't these static methods on ElggBatch?
+ *
+ * @param object $object The object to enable
+ * @return bool
+ * @access private
+ */
+function elgg_batch_enable_callback($object) {
+ // our db functions return the number of rows affected...
+ return $object->enable() ? true : false;
+}
+
+/**
+ * Disable objects with a disable() method.
+ *
+ * Used as a callback for ElggBatch.
+ *
+ * @param object $object The object to disable
+ * @return bool
+ * @access private
+ */
+function elgg_batch_disable_callback($object) {
+ // our db functions return the number of rows affected...
+ return $object->disable() ? true : false;
+}
+
+/**
+ * Delete objects with a delete() method.
+ *
+ * Used as a callback for ElggBatch.
+ *
+ * @param object $object The object to disable
+ * @return bool
+ * @access private
+ */
+function elgg_batch_delete_callback($object) {
+ // our db functions return the number of rows affected...
+ return $object->delete() ? true : false;
+}
+
+/**
+ * Checks if there are some constraints on the options array for
+ * potentially dangerous operations.
+ *
+ * @param array $options Options array
+ * @param string $type Options type: metadata or annotations
+ * @return bool
+ * @access private
+ */
+function elgg_is_valid_options_for_batch_operation($options, $type) {
+ if (!$options || !is_array($options)) {
+ return false;
+ }
+
+ // at least one of these is required.
+ $required = array(
+ // generic restraints
+ 'guid', 'guids'
+ );
+
+ switch ($type) {
+ case 'metadata':
+ $metadata_required = array(
+ 'metadata_owner_guid', 'metadata_owner_guids',
+ 'metadata_name', 'metadata_names',
+ 'metadata_value', 'metadata_values'
+ );
+
+ $required = array_merge($required, $metadata_required);
+ break;
+
+ case 'annotations':
+ case 'annotation':
+ $annotations_required = array(
+ 'annotation_owner_guid', 'annotation_owner_guids',
+ 'annotation_name', 'annotation_names',
+ 'annotation_value', 'annotation_values'
+ );
+
+ $required = array_merge($required, $annotations_required);
+ break;
+
+ default:
+ return false;
+ }
+
+ foreach ($required as $key) {
+ // check that it exists and is something.
+ if (isset($options[$key]) && $options[$key]) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Intercepts the index page when Walled Garden mode is enabled.
+ *
+ * @link http://docs.elgg.org/Tutorials/WalledGarden
+ * @elgg_plugin_hook index system
+ *
+ * @param string $hook The name of the hook
+ * @param string $type The type of hook
+ * @param bool $value Has a plugin already rendered an index page?
+ * @param array $params Array of parameters (should be empty)
+ * @return bool
+ * @access private
+ */
+function elgg_walled_garden_index($hook, $type, $value, $params) {
+ if ($value) {
+ // do not create a second index page so return
+ return;
+ }
+
+ elgg_load_css('elgg.walled_garden');
+ elgg_load_js('elgg.walled_garden');
+
+ $content = elgg_view('core/walled_garden/login');
+
+ $params = array(
+ 'content' => $content,
+ 'class' => 'elgg-walledgarden-double',
+ 'id' => 'elgg-walledgarden-login',
+ );
+ $body = elgg_view_layout('walled_garden', $params);
+ echo elgg_view_page('', $body, 'walled_garden');
+
+ // return true to prevent other plugins from adding a front page
+ return true;
+}
+
+/**
+ * Serve walled garden sections
+ *
+ * @param array $page Array of URL segments
+ * @return string
+ * @access private
+ */
+function _elgg_walled_garden_ajax_handler($page) {
+ $view = $page[0];
+ $params = array(
+ 'content' => elgg_view("core/walled_garden/$view"),
+ 'class' => 'elgg-walledgarden-single hidden',
+ 'id' => str_replace('_', '-', "elgg-walledgarden-$view"),
+ );
+ echo elgg_view_layout('walled_garden', $params);
+ return true;
+}
+
+/**
+ * Checks the status of the Walled Garden and forwards to a login page
+ * if required.
+ *
+ * If the site is in Walled Garden mode, all page except those registered as
+ * plugin pages by {@elgg_hook public_pages walled_garden} will redirect to
+ * a login page.
+ *
+ * @since 1.8.0
+ * @elgg_event_handler init system
+ * @link http://docs.elgg.org/Tutorials/WalledGarden
+ * @return void
+ * @access private
+ */
+function elgg_walled_garden() {
+ global $CONFIG;
+
+ elgg_register_css('elgg.walled_garden', '/css/walled_garden.css');
+ elgg_register_js('elgg.walled_garden', '/js/walled_garden.js');
+
+ elgg_register_page_handler('walled_garden', '_elgg_walled_garden_ajax_handler');
+
+ // check for external page view
+ if (isset($CONFIG->site) && $CONFIG->site instanceof ElggSite) {
+ $CONFIG->site->checkWalledGarden();
+ }
+}
+
+/**
+ * Remove public access for walled gardens
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $accesses
+ * @return array
+ * @access private
+ */
+function _elgg_walled_garden_remove_public_access($hook, $type, $accesses) {
+ if (isset($accesses[ACCESS_PUBLIC])) {
+ unset($accesses[ACCESS_PUBLIC]);
+ }
+ return $accesses;
+}
+
+/**
+ * Boots the engine
+ *
+ * 1. sets error handlers
+ * 2. connects to database
+ * 3. verifies the installation suceeded
+ * 4. loads application configuration
+ * 5. loads i18n data
+ * 6. loads site configuration
+ *
+ * @access private
+ */
+function _elgg_engine_boot() {
+ // Register the error handlers
+ set_error_handler('_elgg_php_error_handler');
+ set_exception_handler('_elgg_php_exception_handler');
+
+ setup_db_connections();
+
+ verify_installation();
+
+ _elgg_load_application_config();
+
+ _elgg_load_site_config();
+
+ _elgg_session_boot();
+
+ _elgg_load_cache();
+
+ _elgg_load_translations();
+}
+
+/**
+ * Elgg's main init.
+ *
+ * Handles core actions for comments, the JS pagehandler, and the shutdown function.
+ *
+ * @elgg_event_handler init system
+ * @return void
+ * @access private
+ */
+function elgg_init() {
+ global $CONFIG;
+
+ elgg_register_action('comments/add');
+ elgg_register_action('comments/delete');
+
+ elgg_register_page_handler('js', 'elgg_js_page_handler');
+ elgg_register_page_handler('css', 'elgg_css_page_handler');
+ elgg_register_page_handler('ajax', 'elgg_ajax_page_handler');
+
+ elgg_register_js('elgg.autocomplete', 'js/lib/ui.autocomplete.js');
+ elgg_register_js('jquery.ui.autocomplete.html', 'vendors/jquery/jquery.ui.autocomplete.html.js');
+ elgg_register_js('elgg.userpicker', 'js/lib/ui.userpicker.js');
+ elgg_register_js('elgg.friendspicker', 'js/lib/ui.friends_picker.js');
+ elgg_register_js('jquery.easing', 'vendors/jquery/jquery.easing.1.3.packed.js');
+ elgg_register_js('elgg.avatar_cropper', 'js/lib/ui.avatar_cropper.js');
+ elgg_register_js('jquery.imgareaselect', 'vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.imgareaselect.min.js');
+ elgg_register_js('elgg.ui.river', 'js/lib/ui.river.js');
+
+ elgg_register_css('jquery.imgareaselect', 'vendors/jquery/jquery.imgareaselect-0.9.8/css/imgareaselect-deprecated.css');
+
+ // Trigger the shutdown:system event upon PHP shutdown.
+ register_shutdown_function('_elgg_shutdown_hook');
+
+ $logo_url = elgg_get_site_url() . "_graphics/elgg_toolbar_logo.gif";
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'elgg_logo',
+ 'href' => 'http://www.elgg.org/',
+ 'text' => "<img src=\"$logo_url\" alt=\"Elgg logo\" width=\"38\" height=\"20\" />",
+ 'priority' => 1,
+ 'link_class' => 'elgg-topbar-logo',
+ ));
+
+ // Sets a blacklist of words in the current language.
+ // This is a comma separated list in word:blacklist.
+ // @todo possibly deprecate
+ $CONFIG->wordblacklist = array();
+ $list = explode(',', elgg_echo('word:blacklist'));
+ if ($list) {
+ foreach ($list as $l) {
+ $CONFIG->wordblacklist[] = trim($l);
+ }
+ }
+}
+
+/**
+ * Adds unit tests for the general API.
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param array $value array of test files
+ * @param array $params empty
+ *
+ * @elgg_plugin_hook unit_tests system
+ * @return array
+ * @access private
+ */
+function elgg_api_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/entity_getter_functions.php';
+ $value[] = $CONFIG->path . 'engine/tests/api/helpers.php';
+ $value[] = $CONFIG->path . 'engine/tests/regression/trac_bugs.php';
+ return $value;
+}
+
+/**#@+
+ * Controls access levels on ElggEntity entities, metadata, and annotations.
+ *
+ * @warning ACCESS_DEFAULT is a place holder for the input/access view. Do not
+ * use it when saving an entity.
+ *
+ * @var int
+ */
+define('ACCESS_DEFAULT', -1);
+define('ACCESS_PRIVATE', 0);
+define('ACCESS_LOGGED_IN', 1);
+define('ACCESS_PUBLIC', 2);
+define('ACCESS_FRIENDS', -2);
+/**#@-*/
+
+/**
+ * Constant to request the value of a parameter be ignored in elgg_get_*() functions
+ *
+ * @see elgg_get_entities()
+ * @var NULL
+ * @since 1.7
+ */
+define('ELGG_ENTITIES_ANY_VALUE', NULL);
+
+/**
+ * Constant to request the value of a parameter be nothing in elgg_get_*() functions.
+ *
+ * @see elgg_get_entities()
+ * @var int 0
+ * @since 1.7
+ */
+define('ELGG_ENTITIES_NO_VALUE', 0);
+
+/**
+ * Used in calls to forward() to specify the browser should be redirected to the
+ * referring page.
+ *
+ * @see forward
+ * @var int -1
+ */
+define('REFERRER', -1);
+
+/**
+ * Alternate spelling for REFERRER. Included because of some bad documentation
+ * in the original HTTP spec.
+ *
+ * @see forward()
+ * @link http://en.wikipedia.org/wiki/HTTP_referrer#Origin_of_the_term_referer
+ * @var int -1
+ */
+define('REFERER', -1);
+
+elgg_register_event_handler('init', 'system', 'elgg_init');
+elgg_register_event_handler('boot', 'system', '_elgg_engine_boot', 1);
+elgg_register_plugin_hook_handler('unit_test', 'system', 'elgg_api_test');
+
+elgg_register_event_handler('init', 'system', 'add_custom_menu_items', 1000);
+elgg_register_event_handler('init', 'system', 'elgg_walled_garden', 1000);
diff --git a/engine/lib/entities.php b/engine/lib/entities.php
new file mode 100644
index 000000000..4fcf1c657
--- /dev/null
+++ b/engine/lib/entities.php
@@ -0,0 +1,2590 @@
+<?php
+/**
+ * Procedural code for creating, loading, and modifying ElggEntity objects.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Entities
+ * @link http://docs.elgg.org/DataModel/Entities
+ */
+
+/**
+ * Cache entities in memory once loaded.
+ *
+ * @global array $ENTITY_CACHE
+ * @access private
+ */
+global $ENTITY_CACHE;
+$ENTITY_CACHE = array();
+
+/**
+ * GUIDs of entities banned from the entity cache (during this request)
+ *
+ * @global array $ENTITY_CACHE_DISABLED_GUIDS
+ * @access private
+ */
+global $ENTITY_CACHE_DISABLED_GUIDS;
+$ENTITY_CACHE_DISABLED_GUIDS = array();
+
+/**
+ * Cache subtypes and related class names.
+ *
+ * @global array|null $SUBTYPE_CACHE array once populated from DB, initially null
+ * @access private
+ */
+global $SUBTYPE_CACHE;
+$SUBTYPE_CACHE = null;
+
+/**
+ * Remove this entity from the entity cache and make sure it is not re-added
+ *
+ * @param int $guid The entity guid
+ *
+ * @access private
+ * @todo this is a workaround until #5604 can be implemented
+ */
+function _elgg_disable_caching_for_entity($guid) {
+ global $ENTITY_CACHE_DISABLED_GUIDS;
+
+ _elgg_invalidate_cache_for_entity($guid);
+ $ENTITY_CACHE_DISABLED_GUIDS[$guid] = true;
+}
+
+/**
+ * Allow this entity to be stored in the entity cache
+ *
+ * @param int $guid The entity guid
+ *
+ * @access private
+ */
+function _elgg_enable_caching_for_entity($guid) {
+ global $ENTITY_CACHE_DISABLED_GUIDS;
+
+ unset($ENTITY_CACHE_DISABLED_GUIDS[$guid]);
+}
+
+/**
+ * Invalidate this class's entry in the cache.
+ *
+ * @param int $guid The entity guid
+ *
+ * @return void
+ * @access private
+ */
+function _elgg_invalidate_cache_for_entity($guid) {
+ global $ENTITY_CACHE;
+
+ $guid = (int)$guid;
+
+ unset($ENTITY_CACHE[$guid]);
+
+ elgg_get_metadata_cache()->clear($guid);
+}
+
+/**
+ * Cache an entity.
+ *
+ * Stores an entity in $ENTITY_CACHE;
+ *
+ * @param ElggEntity $entity Entity to cache
+ *
+ * @return void
+ * @see _elgg_retrieve_cached_entity()
+ * @see _elgg_invalidate_cache_for_entity()
+ * @access private
+ * @todo Use an ElggCache object
+ */
+function _elgg_cache_entity(ElggEntity $entity) {
+ global $ENTITY_CACHE, $ENTITY_CACHE_DISABLED_GUIDS;
+
+ // Don't cache non-plugin entities while access control is off, otherwise they could be
+ // exposed to users who shouldn't see them when control is re-enabled.
+ if (!($entity instanceof ElggPlugin) && elgg_get_ignore_access()) {
+ return;
+ }
+
+ $guid = $entity->getGUID();
+ if (isset($ENTITY_CACHE_DISABLED_GUIDS[$guid])) {
+ return;
+ }
+
+ // Don't store too many or we'll have memory problems
+ // @todo Pick a less arbitrary limit
+ if (count($ENTITY_CACHE) > 256) {
+ $random_guid = array_rand($ENTITY_CACHE);
+
+ unset($ENTITY_CACHE[$random_guid]);
+
+ // Purge separate metadata cache. Original idea was to do in entity destructor, but that would
+ // have caused a bunch of unnecessary purges at every shutdown. Doing it this way we have no way
+ // to know that the expunged entity will be GCed (might be another reference living), but that's
+ // OK; the metadata will reload if necessary.
+ elgg_get_metadata_cache()->clear($random_guid);
+ }
+
+ $ENTITY_CACHE[$guid] = $entity;
+}
+
+/**
+ * Retrieve a entity from the cache.
+ *
+ * @param int $guid The guid
+ *
+ * @return ElggEntity|bool false if entity not cached, or not fully loaded
+ * @see _elgg_cache_entity()
+ * @see _elgg_invalidate_cache_for_entity()
+ * @access private
+ */
+function _elgg_retrieve_cached_entity($guid) {
+ global $ENTITY_CACHE;
+
+ if (isset($ENTITY_CACHE[$guid])) {
+ if ($ENTITY_CACHE[$guid]->isFullyLoaded()) {
+ return $ENTITY_CACHE[$guid];
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Return the id for a given subtype.
+ *
+ * ElggEntity objects have a type and a subtype. Subtypes
+ * are defined upon creation and cannot be changed.
+ *
+ * Plugin authors generally don't need to use this function
+ * unless writing their own SQL queries. Use {@link ElggEntity::getSubtype()}
+ * to return the string subtype.
+ *
+ * @warning {@link ElggEntity::subtype} returns the ID. You probably want
+ * {@link ElggEntity::getSubtype()} instead!
+ *
+ * @internal Subtypes are stored in the entity_subtypes table. There is a foreign
+ * key in the entities table.
+ *
+ * @param string $type Type
+ * @param string $subtype Subtype
+ *
+ * @return int Subtype ID
+ * @link http://docs.elgg.org/DataModel/Entities/Subtypes
+ * @see get_subtype_from_id()
+ * @access private
+ */
+function get_subtype_id($type, $subtype) {
+ global $SUBTYPE_CACHE;
+
+ if (!$subtype) {
+ return false;
+ }
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ // use the cache before hitting database
+ $result = _elgg_retrieve_cached_subtype($type, $subtype);
+ if ($result !== null) {
+ return $result->id;
+ }
+
+ return false;
+}
+
+/**
+ * Return string name for a given subtype ID.
+ *
+ * @param int $subtype_id Subtype ID
+ *
+ * @return string|false Subtype name, false if subtype not found
+ * @link http://docs.elgg.org/DataModel/Entities/Subtypes
+ * @see get_subtype_from_id()
+ * @access private
+ */
+function get_subtype_from_id($subtype_id) {
+ global $SUBTYPE_CACHE;
+
+ if (!$subtype_id) {
+ return false;
+ }
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ if (isset($SUBTYPE_CACHE[$subtype_id])) {
+ return $SUBTYPE_CACHE[$subtype_id]->subtype;
+ }
+
+ return false;
+}
+
+/**
+ * Retrieve subtype from the cache.
+ *
+ * @param string $type
+ * @param string $subtype
+ * @return stdClass|null
+ *
+ * @access private
+ */
+function _elgg_retrieve_cached_subtype($type, $subtype) {
+ global $SUBTYPE_CACHE;
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ foreach ($SUBTYPE_CACHE as $obj) {
+ if ($obj->type === $type && $obj->subtype === $subtype) {
+ return $obj;
+ }
+ }
+ return null;
+}
+
+/**
+ * Fetch all suptypes from DB to local cache.
+ *
+ * @access private
+ */
+function _elgg_populate_subtype_cache() {
+ global $CONFIG, $SUBTYPE_CACHE;
+
+ $results = get_data("SELECT * FROM {$CONFIG->dbprefix}entity_subtypes");
+
+ $SUBTYPE_CACHE = array();
+ foreach ($results as $row) {
+ $SUBTYPE_CACHE[$row->id] = $row;
+ }
+}
+
+/**
+ * Return the class name for a registered type and subtype.
+ *
+ * Entities can be registered to always be loaded as a certain class
+ * with add_subtype() or update_subtype(). This function returns the class
+ * name if found and NULL if not.
+ *
+ * @param string $type The type
+ * @param string $subtype The subtype
+ *
+ * @return string|null a class name or null
+ * @see get_subtype_from_id()
+ * @see get_subtype_class_from_id()
+ * @access private
+ */
+function get_subtype_class($type, $subtype) {
+ global $SUBTYPE_CACHE;
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ // use the cache before going to the database
+ $obj = _elgg_retrieve_cached_subtype($type, $subtype);
+ if ($obj) {
+ return $obj->class;
+ }
+
+ return null;
+}
+
+/**
+ * Returns the class name for a subtype id.
+ *
+ * @param int $subtype_id The subtype id
+ *
+ * @return string|null
+ * @see get_subtype_class()
+ * @see get_subtype_from_id()
+ * @access private
+ */
+function get_subtype_class_from_id($subtype_id) {
+ global $SUBTYPE_CACHE;
+
+ if (!$subtype_id) {
+ return null;
+ }
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ if (isset($SUBTYPE_CACHE[$subtype_id])) {
+ return $SUBTYPE_CACHE[$subtype_id]->class;
+ }
+
+ return null;
+}
+
+/**
+ * Register ElggEntities with a certain type and subtype to be loaded as a specific class.
+ *
+ * By default entities are loaded as one of the 4 parent objects: site, user, object, or group.
+ * If you subclass any of these you can register the classname with add_subtype() so
+ * it will be loaded as that class automatically when retrieved from the database with
+ * {@link get_entity()}.
+ *
+ * @warning This function cannot be used to change the class for a type-subtype pair.
+ * Use update_subtype() for that.
+ *
+ * @param string $type The type you're subtyping (site, user, object, or group)
+ * @param string $subtype The subtype
+ * @param string $class Optional class name for the object
+ *
+ * @return int
+ * @link http://docs.elgg.org/Tutorials/Subclasses
+ * @link http://docs.elgg.org/DataModel/Entities
+ * @see update_subtype()
+ * @see remove_subtype()
+ * @see get_entity()
+ */
+function add_subtype($type, $subtype, $class = "") {
+ global $CONFIG, $SUBTYPE_CACHE;
+
+ if (!$subtype) {
+ return 0;
+ }
+
+ $id = get_subtype_id($type, $subtype);
+
+ if (!$id) {
+ // In cache we store non-SQL-escaped strings because that's what's returned by query
+ $cache_obj = (object) array(
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'class' => $class,
+ );
+
+ $type = sanitise_string($type);
+ $subtype = sanitise_string($subtype);
+ $class = sanitise_string($class);
+
+ $id = insert_data("INSERT INTO {$CONFIG->dbprefix}entity_subtypes"
+ . " (type, subtype, class) VALUES ('$type', '$subtype', '$class')");
+
+ // add entry to cache
+ $cache_obj->id = $id;
+ $SUBTYPE_CACHE[$id] = $cache_obj;
+ }
+
+ return $id;
+}
+
+/**
+ * Removes a registered ElggEntity type, subtype, and classname.
+ *
+ * @warning You do not want to use this function. If you want to unregister
+ * a class for a subtype, use update_subtype(). Using this function will
+ * permanently orphan all the objects created with the specified subtype.
+ *
+ * @param string $type Type
+ * @param string $subtype Subtype
+ *
+ * @return bool
+ * @see add_subtype()
+ * @see update_subtype()
+ */
+function remove_subtype($type, $subtype) {
+ global $CONFIG;
+
+ $type = sanitise_string($type);
+ $subtype = sanitise_string($subtype);
+
+ return delete_data("DELETE FROM {$CONFIG->dbprefix}entity_subtypes"
+ . " WHERE type = '$type' AND subtype = '$subtype'");
+}
+
+/**
+ * Update a registered ElggEntity type, subtype, and class name
+ *
+ * @param string $type Type
+ * @param string $subtype Subtype
+ * @param string $class Class name to use when loading this entity
+ *
+ * @return bool
+ */
+function update_subtype($type, $subtype, $class = '') {
+ global $CONFIG, $SUBTYPE_CACHE;
+
+ $id = get_subtype_id($type, $subtype);
+ if (!$id) {
+ return false;
+ }
+
+ if ($SUBTYPE_CACHE === null) {
+ _elgg_populate_subtype_cache();
+ }
+
+ $unescaped_class = $class;
+
+ $type = sanitise_string($type);
+ $subtype = sanitise_string($subtype);
+ $class = sanitise_string($class);
+
+ $success = update_data("UPDATE {$CONFIG->dbprefix}entity_subtypes
+ SET type = '$type', subtype = '$subtype', class = '$class'
+ WHERE id = $id
+ ");
+
+ if ($success && isset($SUBTYPE_CACHE[$id])) {
+ $SUBTYPE_CACHE[$id]->class = $unescaped_class;
+ }
+
+ return $success;
+}
+
+/**
+ * Update an entity in the database.
+ *
+ * There are 4 basic entity types: site, user, object, and group.
+ * All entities are split between two tables: the entities table and their type table.
+ *
+ * @warning Plugin authors should never call this directly. Use ->save() instead.
+ *
+ * @param int $guid The guid of the entity to update
+ * @param int $owner_guid The new owner guid
+ * @param int $access_id The new access id
+ * @param int $container_guid The new container guid
+ * @param int $time_created The time creation timestamp
+ *
+ * @return bool
+ * @throws InvalidParameterException
+ * @access private
+ */
+function update_entity($guid, $owner_guid, $access_id, $container_guid = null, $time_created = null) {
+ global $CONFIG, $ENTITY_CACHE;
+
+ $guid = (int)$guid;
+ $owner_guid = (int)$owner_guid;
+ $access_id = (int)$access_id;
+ $container_guid = (int) $container_guid;
+ if (is_null($container_guid)) {
+ $container_guid = $owner_guid;
+ }
+ $time = time();
+
+ $entity = get_entity($guid);
+
+ if ($time_created == null) {
+ $time_created = $entity->time_created;
+ } else {
+ $time_created = (int) $time_created;
+ }
+
+ if ($access_id == ACCESS_DEFAULT) {
+ throw new InvalidParameterException('ACCESS_DEFAULT is not a valid access level. See its documentation in elgglib.h');
+ }
+
+ if ($entity && $entity->canEdit()) {
+ if (elgg_trigger_event('update', $entity->type, $entity)) {
+ $ret = update_data("UPDATE {$CONFIG->dbprefix}entities
+ set owner_guid='$owner_guid', access_id='$access_id',
+ container_guid='$container_guid', time_created='$time_created',
+ time_updated='$time' WHERE guid=$guid");
+
+ if ($entity instanceof ElggObject) {
+ update_river_access_by_object($guid, $access_id);
+ }
+
+ // If memcache is available then delete this entry from the cache
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+ if ($newentity_cache) {
+ $newentity_cache->delete($guid);
+ }
+
+ // Handle cases where there was no error BUT no rows were updated!
+ if ($ret === false) {
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
+
+/**
+ * Determine if a given user can write to an entity container.
+ *
+ * An entity can be a container for any other entity by setting the
+ * container_guid. container_guid can differ from owner_guid.
+ *
+ * A plugin hook container_permissions_check:$entity_type is emitted to allow granular
+ * access controls in plugins.
+ *
+ * @param int $user_guid The user guid, or 0 for logged in user
+ * @param int $container_guid The container, or 0 for the current page owner.
+ * @param string $type The type of entity we're looking to write
+ * @param string $subtype The subtype of the entity we're looking to write
+ *
+ * @return bool
+ * @link http://docs.elgg.org/DataModel/Containers
+ */
+function can_write_to_container($user_guid = 0, $container_guid = 0, $type = 'all', $subtype = 'all') {
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $container_guid = (int)$container_guid;
+ if (!$container_guid) {
+ $container_guid = elgg_get_page_owner_guid();
+ }
+
+ $return = false;
+
+ if (!$container_guid) {
+ $return = true;
+ }
+
+ $container = get_entity($container_guid);
+
+ if ($container) {
+ // If the user can edit the container, they can also write to it
+ if ($container->canEdit($user_guid)) {
+ $return = true;
+ }
+
+ // If still not approved, see if the user is a member of the group
+ // @todo this should be moved to the groups plugin/library
+ if (!$return && $user && $container instanceof ElggGroup) {
+ /* @var ElggGroup $container */
+ if ($container->isMember($user)) {
+ $return = true;
+ }
+ }
+ }
+
+ // See if anyone else has anything to say
+ return elgg_trigger_plugin_hook(
+ 'container_permissions_check',
+ $type,
+ array(
+ 'container' => $container,
+ 'user' => $user,
+ 'subtype' => $subtype
+ ),
+ $return);
+}
+
+/**
+ * Create a new entry in the entities table.
+ *
+ * Saves the base information in the entities table for the entity. Saving
+ * the type information is handled in the calling class method.
+ *
+ * @warning Plugin authors should never call this directly. Always use entity objects.
+ *
+ * @warning Entities must have an entry in both the entities table and their type table
+ * or they will throw an exception when loaded.
+ *
+ * @param string $type The type of the entity (site, user, object, group).
+ * @param string $subtype The subtype of the entity.
+ * @param int $owner_guid The GUID of the object's owner.
+ * @param int $access_id The access control group to create the entity with.
+ * @param int $site_guid The site to add this entity to. 0 for current.
+ * @param int $container_guid The container GUID
+ *
+ * @return int|false The new entity's GUID, or false on failure
+ * @throws InvalidParameterException
+ * @link http://docs.elgg.org/DataModel/Entities
+ * @access private
+ */
+function create_entity($type, $subtype, $owner_guid, $access_id, $site_guid = 0,
+$container_guid = 0) {
+
+ global $CONFIG;
+
+ $type = sanitise_string($type);
+ $subtype_id = add_subtype($type, $subtype);
+ $owner_guid = (int)$owner_guid;
+ $time = time();
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+ $site_guid = (int) $site_guid;
+ if ($container_guid == 0) {
+ $container_guid = $owner_guid;
+ }
+ $access_id = (int)$access_id;
+ if ($access_id == ACCESS_DEFAULT) {
+ throw new InvalidParameterException('ACCESS_DEFAULT is not a valid access level. See its documentation in elgglib.h');
+ }
+
+ $user_guid = elgg_get_logged_in_user_guid();
+ if (!can_write_to_container($user_guid, $owner_guid, $type, $subtype)) {
+ return false;
+ }
+ if ($owner_guid != $container_guid) {
+ if (!can_write_to_container($user_guid, $container_guid, $type, $subtype)) {
+ return false;
+ }
+ }
+ if ($type == "") {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:EntityTypeNotSet'));
+ }
+
+ return insert_data("INSERT into {$CONFIG->dbprefix}entities
+ (type, subtype, owner_guid, site_guid, container_guid,
+ access_id, time_created, time_updated, last_action)
+ values
+ ('$type',$subtype_id, $owner_guid, $site_guid, $container_guid,
+ $access_id, $time, $time, $time)");
+}
+
+/**
+ * Returns a database row from the entities table.
+ *
+ * @tip Use get_entity() to return the fully loaded entity.
+ *
+ * @warning This will only return results if a) it exists, b) you have access to it.
+ * see {@link get_access_sql_suffix()}.
+ *
+ * @param int $guid The GUID of the object to extract
+ *
+ * @return stdClass|false
+ * @link http://docs.elgg.org/DataModel/Entities
+ * @see entity_row_to_elggstar()
+ * @access private
+ */
+function get_entity_as_row($guid) {
+ global $CONFIG;
+
+ if (!$guid) {
+ return false;
+ }
+
+ $guid = (int) $guid;
+ $access = get_access_sql_suffix();
+
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}entities where guid=$guid and $access");
+}
+
+/**
+ * Create an Elgg* object from a given entity row.
+ *
+ * Handles loading all tables into the correct class.
+ *
+ * @param stdClass $row The row of the entry in the entities table.
+ *
+ * @return ElggEntity|false
+ * @link http://docs.elgg.org/DataModel/Entities
+ * @see get_entity_as_row()
+ * @see add_subtype()
+ * @see get_entity()
+ * @access private
+ *
+ * @throws ClassException|InstallationException
+ */
+function entity_row_to_elggstar($row) {
+ if (!($row instanceof stdClass)) {
+ return $row;
+ }
+
+ if ((!isset($row->guid)) || (!isset($row->subtype))) {
+ return $row;
+ }
+
+ $new_entity = false;
+
+ // Create a memcache cache if we can
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+ if ($newentity_cache) {
+ $new_entity = $newentity_cache->load($row->guid);
+ }
+ if ($new_entity) {
+ return $new_entity;
+ }
+
+ // load class for entity if one is registered
+ $classname = get_subtype_class_from_id($row->subtype);
+ if ($classname != "") {
+ if (class_exists($classname)) {
+ $new_entity = new $classname($row);
+
+ if (!($new_entity instanceof ElggEntity)) {
+ $msg = elgg_echo('ClassException:ClassnameNotClass', array($classname, 'ElggEntity'));
+ throw new ClassException($msg);
+ }
+ } else {
+ error_log(elgg_echo('ClassNotFoundException:MissingClass', array($classname)));
+ }
+ }
+
+ if (!$new_entity) {
+ //@todo Make this into a function
+ switch ($row->type) {
+ case 'object' :
+ $new_entity = new ElggObject($row);
+ break;
+ case 'user' :
+ $new_entity = new ElggUser($row);
+ break;
+ case 'group' :
+ $new_entity = new ElggGroup($row);
+ break;
+ case 'site' :
+ $new_entity = new ElggSite($row);
+ break;
+ default:
+ $msg = elgg_echo('InstallationException:TypeNotSupported', array($row->type));
+ throw new InstallationException($msg);
+ }
+ }
+
+ // Cache entity if we have a cache available
+ if (($newentity_cache) && ($new_entity)) {
+ $newentity_cache->save($new_entity->guid, $new_entity);
+ }
+
+ return $new_entity;
+}
+
+/**
+ * Loads and returns an entity object from a guid.
+ *
+ * @param int $guid The GUID of the entity
+ *
+ * @return ElggEntity The correct Elgg or custom object based upon entity type and subtype
+ * @link http://docs.elgg.org/DataModel/Entities
+ */
+function get_entity($guid) {
+ // This should not be a static local var. Notice that cache writing occurs in a completely
+ // different instance outside this function.
+ // @todo We need a single Memcache instance with a shared pool of namespace wrappers. This function would pull an instance from the pool.
+ static $shared_cache;
+
+ // We could also use: if (!(int) $guid) { return FALSE },
+ // but that evaluates to a false positive for $guid = TRUE.
+ // This is a bit slower, but more thorough.
+ if (!is_numeric($guid) || $guid === 0 || $guid === '0') {
+ return false;
+ }
+
+ // Check local cache first
+ $new_entity = _elgg_retrieve_cached_entity($guid);
+ if ($new_entity) {
+ return $new_entity;
+ }
+
+ // Check shared memory cache, if available
+ if (null === $shared_cache) {
+ if (is_memcache_available()) {
+ $shared_cache = new ElggMemcache('new_entity_cache');
+ } else {
+ $shared_cache = false;
+ }
+ }
+
+ // until ACLs in memcache, DB query is required to determine access
+ $entity_row = get_entity_as_row($guid);
+ if (!$entity_row) {
+ return false;
+ }
+
+ if ($shared_cache) {
+ $cached_entity = $shared_cache->load($guid);
+ // @todo store ACLs in memcache https://github.com/elgg/elgg/issues/3018#issuecomment-13662617
+ if ($cached_entity) {
+ // @todo use ACL and cached entity access_id to determine if user can see it
+ return $cached_entity;
+ }
+ }
+
+ // don't let incomplete entities cause fatal exceptions
+ try {
+ $new_entity = entity_row_to_elggstar($entity_row);
+ } catch (IncompleteEntityException $e) {
+ return false;
+ }
+
+ if ($new_entity) {
+ _elgg_cache_entity($new_entity);
+ }
+ return $new_entity;
+}
+
+/**
+ * Does an entity exist?
+ *
+ * This function checks for the existence of an entity independent of access
+ * permissions. It is useful for situations when a user cannot access an entity
+ * and it must be determined whether entity has been deleted or the access level
+ * has changed.
+ *
+ * @param int $guid The GUID of the entity
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_entity_exists($guid) {
+ global $CONFIG;
+
+ $guid = sanitize_int($guid);
+
+ $query = "SELECT count(*) as total FROM {$CONFIG->dbprefix}entities WHERE guid = $guid";
+ $result = get_data_row($query);
+ if ($result->total == 0) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+/**
+ * Returns an array of entities with optional filtering.
+ *
+ * Entities are the basic unit of storage in Elgg. This function
+ * provides the simplest way to get an array of entities. There
+ * are many options available that can be passed to filter
+ * what sorts of entities are returned.
+ *
+ * @tip To output formatted strings of entities, use {@link elgg_list_entities()} and
+ * its cousins.
+ *
+ * @tip Plural arguments can be written as singular if only specifying a
+ * single element. ('type' => 'object' vs 'types' => array('object')).
+ *
+ * @param array $options Array in format:
+ *
+ * types => NULL|STR entity type (type IN ('type1', 'type2')
+ * Joined with subtypes by AND. See below)
+ *
+ * subtypes => NULL|STR entity subtype (SQL: subtype IN ('subtype1', 'subtype2))
+ * Use ELGG_ENTITIES_NO_VALUE for no subtype.
+ *
+ * type_subtype_pairs => NULL|ARR (array('type' => 'subtype'))
+ * (type = '$type' AND subtype = '$subtype') pairs
+ *
+ * guids => NULL|ARR Array of entity guids
+ *
+ * owner_guids => NULL|ARR Array of owner guids
+ *
+ * container_guids => NULL|ARR Array of container_guids
+ *
+ * site_guids => NULL (current_site)|ARR Array of site_guid
+ *
+ * order_by => NULL (time_created desc)|STR SQL order by clause
+ *
+ * reverse_order_by => BOOL Reverse the default order by clause
+ *
+ * limit => NULL (10)|INT SQL limit clause (0 means no limit)
+ *
+ * offset => NULL (0)|INT SQL offset clause
+ *
+ * created_time_lower => NULL|INT Created time lower boundary in epoch time
+ *
+ * created_time_upper => NULL|INT Created time upper boundary in epoch time
+ *
+ * modified_time_lower => NULL|INT Modified time lower boundary in epoch time
+ *
+ * modified_time_upper => NULL|INT Modified time upper boundary in epoch time
+ *
+ * count => TRUE|FALSE return a count instead of entities
+ *
+ * wheres => array() Additional where clauses to AND together
+ *
+ * joins => array() Additional joins
+ *
+ * callback => string A callback function to pass each row through
+ *
+ * @return mixed If count, int. If not count, array. false on errors.
+ * @since 1.7.0
+ * @see elgg_get_entities_from_metadata()
+ * @see elgg_get_entities_from_relationship()
+ * @see elgg_get_entities_from_access_id()
+ * @see elgg_get_entities_from_annotations()
+ * @see elgg_list_entities()
+ * @link http://docs.elgg.org/DataModel/Entities/Getters
+ */
+function elgg_get_entities(array $options = array()) {
+ global $CONFIG;
+
+ $defaults = array(
+ 'types' => ELGG_ENTITIES_ANY_VALUE,
+ 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
+ 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'container_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'site_guids' => $CONFIG->site_guid,
+
+ 'modified_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'modified_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'reverse_order_by' => false,
+ 'order_by' => 'e.time_created desc',
+ 'group_by' => ELGG_ENTITIES_ANY_VALUE,
+ 'limit' => 10,
+ 'offset' => 0,
+ 'count' => FALSE,
+ 'selects' => array(),
+ 'wheres' => array(),
+ 'joins' => array(),
+
+ 'callback' => 'entity_row_to_elggstar',
+
+ '__ElggBatch' => null,
+ );
+
+ $options = array_merge($defaults, $options);
+
+ // can't use helper function with type_subtype_pair because
+ // it's already an array...just need to merge it
+ if (isset($options['type_subtype_pair'])) {
+ if (isset($options['type_subtype_pairs'])) {
+ $options['type_subtype_pairs'] = array_merge($options['type_subtype_pairs'],
+ $options['type_subtype_pair']);
+ } else {
+ $options['type_subtype_pairs'] = $options['type_subtype_pair'];
+ }
+ }
+
+ $singulars = array('type', 'subtype', 'guid', 'owner_guid', 'container_guid', 'site_guid');
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ // evaluate where clauses
+ if (!is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ }
+
+ $wheres = $options['wheres'];
+
+ $wheres[] = elgg_get_entity_type_subtype_where_sql('e', $options['types'],
+ $options['subtypes'], $options['type_subtype_pairs']);
+
+ $wheres[] = elgg_get_guid_based_where_sql('e.guid', $options['guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.owner_guid', $options['owner_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.container_guid', $options['container_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.site_guid', $options['site_guids']);
+
+ $wheres[] = elgg_get_entity_time_where_sql('e', $options['created_time_upper'],
+ $options['created_time_lower'], $options['modified_time_upper'], $options['modified_time_lower']);
+
+ // see if any functions failed
+ // remove empty strings on successful functions
+ foreach ($wheres as $i => $where) {
+ if ($where === FALSE) {
+ return FALSE;
+ } elseif (empty($where)) {
+ unset($wheres[$i]);
+ }
+ }
+
+ // remove identical where clauses
+ $wheres = array_unique($wheres);
+
+ // evaluate join clauses
+ if (!is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ }
+
+ // remove identical join clauses
+ $joins = array_unique($options['joins']);
+
+ foreach ($joins as $i => $join) {
+ if ($join === FALSE) {
+ return FALSE;
+ } elseif (empty($join)) {
+ unset($joins[$i]);
+ }
+ }
+
+ // evalutate selects
+ if ($options['selects']) {
+ $selects = '';
+ foreach ($options['selects'] as $select) {
+ $selects .= ", $select";
+ }
+ } else {
+ $selects = '';
+ }
+
+ if (!$options['count']) {
+ $query = "SELECT DISTINCT e.*{$selects} FROM {$CONFIG->dbprefix}entities e ";
+ } else {
+ $query = "SELECT count(DISTINCT e.guid) as total FROM {$CONFIG->dbprefix}entities e ";
+ }
+
+ // add joins
+ foreach ($joins as $j) {
+ $query .= " $j ";
+ }
+
+ // add wheres
+ $query .= ' WHERE ';
+
+ foreach ($wheres as $w) {
+ $query .= " $w AND ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix('e');
+
+ // reverse order by
+ if ($options['reverse_order_by']) {
+ $options['order_by'] = elgg_sql_reverse_order_by_clause($options['order_by']);
+ }
+
+ if (!$options['count']) {
+ if ($options['group_by']) {
+ $query .= " GROUP BY {$options['group_by']}";
+ }
+
+ if ($options['order_by']) {
+ $query .= " ORDER BY {$options['order_by']}";
+ }
+
+ if ($options['limit']) {
+ $limit = sanitise_int($options['limit'], false);
+ $offset = sanitise_int($options['offset'], false);
+ $query .= " LIMIT $offset, $limit";
+ }
+
+ if ($options['callback'] === 'entity_row_to_elggstar') {
+ $dt = _elgg_fetch_entities_from_sql($query, $options['__ElggBatch']);
+ } else {
+ $dt = get_data($query, $options['callback']);
+ }
+
+ if ($dt) {
+ // populate entity and metadata caches
+ $guids = array();
+ foreach ($dt as $item) {
+ // A custom callback could result in items that aren't ElggEntity's, so check for them
+ if ($item instanceof ElggEntity) {
+ _elgg_cache_entity($item);
+ // plugins usually have only settings
+ if (!$item instanceof ElggPlugin) {
+ $guids[] = $item->guid;
+ }
+ }
+ }
+ // @todo Without this, recursive delete fails. See #4568
+ reset($dt);
+
+ if ($guids) {
+ elgg_get_metadata_cache()->populateFromEntities($guids);
+ }
+ }
+ return $dt;
+ } else {
+ $total = get_data_row($query);
+ return (int)$total->total;
+ }
+}
+
+/**
+ * Return entities from an SQL query generated by elgg_get_entities.
+ *
+ * @param string $sql
+ * @param ElggBatch $batch
+ * @return ElggEntity[]
+ *
+ * @access private
+ * @throws LogicException
+ */
+function _elgg_fetch_entities_from_sql($sql, ElggBatch $batch = null) {
+ static $plugin_subtype;
+ if (null === $plugin_subtype) {
+ $plugin_subtype = get_subtype_id('object', 'plugin');
+ }
+
+ // Keys are types, values are columns that, if present, suggest that the secondary
+ // table is already JOINed
+ $types_to_optimize = array(
+ 'object' => 'title',
+ 'user' => 'password',
+ 'group' => 'name',
+ );
+
+ $rows = get_data($sql);
+
+ // guids to look up in each type
+ $lookup_types = array();
+ // maps GUIDs to the $rows key
+ $guid_to_key = array();
+
+ if (isset($rows[0]->type, $rows[0]->subtype)
+ && $rows[0]->type === 'object'
+ && $rows[0]->subtype == $plugin_subtype) {
+ // Likely the entire resultset is plugins, which have already been optimized
+ // to JOIN the secondary table. In this case we allow retrieving from cache,
+ // but abandon the extra queries.
+ $types_to_optimize = array();
+ }
+
+ // First pass: use cache where possible, gather GUIDs that we're optimizing
+ foreach ($rows as $i => $row) {
+ if (empty($row->guid) || empty($row->type)) {
+ throw new LogicException('Entity row missing guid or type');
+ }
+ if ($entity = _elgg_retrieve_cached_entity($row->guid)) {
+ $rows[$i] = $entity;
+ continue;
+ }
+ if (isset($types_to_optimize[$row->type])) {
+ // check if row already looks JOINed.
+ if (isset($row->{$types_to_optimize[$row->type]})) {
+ // Row probably already contains JOINed secondary table. Don't make another query just
+ // to pull data that's already there
+ continue;
+ }
+ $lookup_types[$row->type][] = $row->guid;
+ $guid_to_key[$row->guid] = $i;
+ }
+ }
+ // Do secondary queries and merge rows
+ if ($lookup_types) {
+ $dbprefix = elgg_get_config('dbprefix');
+
+ foreach ($lookup_types as $type => $guids) {
+ $set = "(" . implode(',', $guids) . ")";
+ $sql = "SELECT * FROM {$dbprefix}{$type}s_entity WHERE guid IN $set";
+ $secondary_rows = get_data($sql);
+ if ($secondary_rows) {
+ foreach ($secondary_rows as $secondary_row) {
+ $key = $guid_to_key[$secondary_row->guid];
+ // cast to arrays to merge then cast back
+ $rows[$key] = (object)array_merge((array)$rows[$key], (array)$secondary_row);
+ }
+ }
+ }
+ }
+ // Second pass to finish conversion
+ foreach ($rows as $i => $row) {
+ if ($row instanceof ElggEntity) {
+ continue;
+ } else {
+ try {
+ $rows[$i] = entity_row_to_elggstar($row);
+ } catch (IncompleteEntityException $e) {
+ // don't let incomplete entities throw fatal errors
+ unset($rows[$i]);
+
+ // report incompletes to the batch process that spawned this query
+ if ($batch) {
+ $batch->reportIncompleteEntity($row);
+ }
+ }
+ }
+ }
+ return $rows;
+}
+
+/**
+ * Returns SQL where clause for type and subtype on main entity table
+ *
+ * @param string $table Entity table prefix as defined in SELECT...FROM entities $table
+ * @param NULL|array $types Array of types or NULL if none.
+ * @param NULL|array $subtypes Array of subtypes or NULL if none
+ * @param NULL|array $pairs Array of pairs of types and subtypes
+ *
+ * @return FALSE|string
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_type_subtype_where_sql($table, $types, $subtypes, $pairs) {
+ // subtype depends upon type.
+ if ($subtypes && !$types) {
+ elgg_log("Cannot set subtypes without type.", 'WARNING');
+ return FALSE;
+ }
+
+ // short circuit if nothing is requested
+ if (!$types && !$subtypes && !$pairs) {
+ return '';
+ }
+
+ // these are the only valid types for entities in elgg
+ $valid_types = elgg_get_config('entity_types');
+
+ // pairs override
+ $wheres = array();
+ if (!is_array($pairs)) {
+ if (!is_array($types)) {
+ $types = array($types);
+ }
+
+ if ($subtypes && !is_array($subtypes)) {
+ $subtypes = array($subtypes);
+ }
+
+ // decrementer for valid types. Return FALSE if no valid types
+ $valid_types_count = count($types);
+ $valid_subtypes_count = 0;
+ // remove invalid types to get an accurate count of
+ // valid types for the invalid subtype detection to use
+ // below.
+ // also grab the count of ALL subtypes on valid types to decrement later on
+ // and check against.
+ //
+ // yes this is duplicating a foreach on $types.
+ foreach ($types as $type) {
+ if (!in_array($type, $valid_types)) {
+ $valid_types_count--;
+ unset($types[array_search($type, $types)]);
+ } else {
+ // do the checking (and decrementing) in the subtype section.
+ $valid_subtypes_count += count($subtypes);
+ }
+ }
+
+ // return false if nothing is valid.
+ if (!$valid_types_count) {
+ return FALSE;
+ }
+
+ // subtypes are based upon types, so we need to look at each
+ // type individually to get the right subtype id.
+ foreach ($types as $type) {
+ $subtype_ids = array();
+ if ($subtypes) {
+ foreach ($subtypes as $subtype) {
+ // check that the subtype is valid
+ if (!$subtype && ELGG_ENTITIES_NO_VALUE === $subtype) {
+ // subtype value is 0
+ $subtype_ids[] = ELGG_ENTITIES_NO_VALUE;
+ } elseif (!$subtype) {
+ // subtype is ignored.
+ // this handles ELGG_ENTITIES_ANY_VALUE, '', and anything falsy that isn't 0
+ continue;
+ } else {
+ $subtype_id = get_subtype_id($type, $subtype);
+
+ if ($subtype_id) {
+ $subtype_ids[] = $subtype_id;
+ } else {
+ $valid_subtypes_count--;
+ elgg_log("Type-subtype '$type:$subtype' does not exist!", 'NOTICE');
+ continue;
+ }
+ }
+ }
+
+ // return false if we're all invalid subtypes in the only valid type
+ if ($valid_subtypes_count <= 0) {
+ return FALSE;
+ }
+ }
+
+ if (is_array($subtype_ids) && count($subtype_ids)) {
+ $subtype_ids_str = implode(',', $subtype_ids);
+ $wheres[] = "({$table}.type = '$type' AND {$table}.subtype IN ($subtype_ids_str))";
+ } else {
+ $wheres[] = "({$table}.type = '$type')";
+ }
+ }
+ } else {
+ // using type/subtype pairs
+ $valid_pairs_count = count($pairs);
+ $valid_pairs_subtypes_count = 0;
+
+ // same deal as above--we need to know how many valid types
+ // and subtypes we have before hitting the subtype section.
+ // also normalize the subtypes into arrays here.
+ foreach ($pairs as $paired_type => $paired_subtypes) {
+ if (!in_array($paired_type, $valid_types)) {
+ $valid_pairs_count--;
+ unset($pairs[array_search($paired_type, $pairs)]);
+ } else {
+ if ($paired_subtypes && !is_array($paired_subtypes)) {
+ $pairs[$paired_type] = array($paired_subtypes);
+ }
+ $valid_pairs_subtypes_count += count($paired_subtypes);
+ }
+ }
+
+ if ($valid_pairs_count <= 0) {
+ return FALSE;
+ }
+ foreach ($pairs as $paired_type => $paired_subtypes) {
+ // this will always be an array because of line 2027, right?
+ // no...some overly clever person can say pair => array('object' => null)
+ if (is_array($paired_subtypes)) {
+ $paired_subtype_ids = array();
+ foreach ($paired_subtypes as $paired_subtype) {
+ if (ELGG_ENTITIES_NO_VALUE === $paired_subtype
+ || ($paired_subtype_id = get_subtype_id($paired_type, $paired_subtype))) {
+
+ $paired_subtype_ids[] = (ELGG_ENTITIES_NO_VALUE === $paired_subtype) ?
+ ELGG_ENTITIES_NO_VALUE : $paired_subtype_id;
+ } else {
+ $valid_pairs_subtypes_count--;
+ elgg_log("Type-subtype '$paired_type:$paired_subtype' does not exist!", 'NOTICE');
+ // return false if we're all invalid subtypes in the only valid type
+ continue;
+ }
+ }
+
+ // return false if there are no valid subtypes.
+ if ($valid_pairs_subtypes_count <= 0) {
+ return FALSE;
+ }
+
+
+ if ($paired_subtype_ids_str = implode(',', $paired_subtype_ids)) {
+ $wheres[] = "({$table}.type = '$paired_type'"
+ . " AND {$table}.subtype IN ($paired_subtype_ids_str))";
+ }
+ } else {
+ $wheres[] = "({$table}.type = '$paired_type')";
+ }
+ }
+ }
+
+ // pairs override the above. return false if they don't exist.
+ if (is_array($wheres) && count($wheres)) {
+ $where = implode(' OR ', $wheres);
+ return "($where)";
+ }
+
+ return '';
+}
+
+/**
+ * Returns SQL where clause for owner and containers.
+ *
+ * @param string $column Column name the guids should be checked against. Usually
+ * best to provide in table.column format.
+ * @param NULL|array $guids Array of GUIDs.
+ *
+ * @return false|string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_guid_based_where_sql($column, $guids) {
+ // short circuit if nothing requested
+ // 0 is a valid guid
+ if (!$guids && $guids !== 0) {
+ return '';
+ }
+
+ // normalize and sanitise owners
+ if (!is_array($guids)) {
+ $guids = array($guids);
+ }
+
+ $guids_sanitized = array();
+ foreach ($guids as $guid) {
+ if ($guid !== ELGG_ENTITIES_NO_VALUE) {
+ $guid = sanitise_int($guid);
+
+ if (!$guid) {
+ return false;
+ }
+ }
+ $guids_sanitized[] = $guid;
+ }
+
+ $where = '';
+ $guid_str = implode(',', $guids_sanitized);
+
+ // implode(',', 0) returns 0.
+ if ($guid_str !== FALSE && $guid_str !== '') {
+ $where = "($column IN ($guid_str))";
+ }
+
+ return $where;
+}
+
+/**
+ * Returns SQL where clause for entity time limits.
+ *
+ * @param string $table Entity table prefix as defined in
+ * SELECT...FROM entities $table
+ * @param NULL|int $time_created_upper Time created upper limit
+ * @param NULL|int $time_created_lower Time created lower limit
+ * @param NULL|int $time_updated_upper Time updated upper limit
+ * @param NULL|int $time_updated_lower Time updated lower limit
+ *
+ * @return FALSE|string FALSE on fail, string on success.
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_time_where_sql($table, $time_created_upper = NULL,
+$time_created_lower = NULL, $time_updated_upper = NULL, $time_updated_lower = NULL) {
+
+ $wheres = array();
+
+ // exploit PHP's loose typing (quack) to check that they are INTs and not str cast to 0
+ if ($time_created_upper && $time_created_upper == sanitise_int($time_created_upper)) {
+ $wheres[] = "{$table}.time_created <= $time_created_upper";
+ }
+
+ if ($time_created_lower && $time_created_lower == sanitise_int($time_created_lower)) {
+ $wheres[] = "{$table}.time_created >= $time_created_lower";
+ }
+
+ if ($time_updated_upper && $time_updated_upper == sanitise_int($time_updated_upper)) {
+ $wheres[] = "{$table}.time_updated <= $time_updated_upper";
+ }
+
+ if ($time_updated_lower && $time_updated_lower == sanitise_int($time_updated_lower)) {
+ $wheres[] = "{$table}.time_updated >= $time_updated_lower";
+ }
+
+ if (is_array($wheres) && count($wheres) > 0) {
+ $where_str = implode(' AND ', $wheres);
+ return "($where_str)";
+ }
+
+ return '';
+}
+
+/**
+ * Returns a string of parsed entities.
+ *
+ * Displays list of entities with formatting specified
+ * by the entity view.
+ *
+ * @tip Pagination is handled automatically.
+ *
+ * @internal This also provides the views for elgg_view_annotation().
+ *
+ * @param array $options Any options from $getter options plus:
+ * full_view => BOOL Display full view entities
+ * list_type => STR 'list' or 'gallery'
+ * list_type_toggle => BOOL Display gallery / list switch
+ * pagination => BOOL Display pagination links
+ *
+ * @param mixed $getter The entity getter function to use to fetch the entities
+ * @param mixed $viewer The function to use to view the entity list.
+ *
+ * @return string
+ * @since 1.7
+ * @see elgg_get_entities()
+ * @see elgg_view_entity_list()
+ * @link http://docs.elgg.org/Entities/Output
+ */
+function elgg_list_entities(array $options = array(), $getter = 'elgg_get_entities',
+ $viewer = 'elgg_view_entity_list') {
+
+ global $autofeed;
+ $autofeed = true;
+
+ $offset_key = isset($options['offset_key']) ? $options['offset_key'] : 'offset';
+
+ $defaults = array(
+ 'offset' => (int) max(get_input($offset_key, 0), 0),
+ 'limit' => (int) max(get_input('limit', 10), 0),
+ 'full_view' => TRUE,
+ 'list_type_toggle' => FALSE,
+ 'pagination' => TRUE,
+ );
+
+ $options = array_merge($defaults, $options);
+
+ //backwards compatibility
+ if (isset($options['view_type_toggle'])) {
+ $options['list_type_toggle'] = $options['view_type_toggle'];
+ }
+
+ $options['count'] = TRUE;
+ $count = $getter($options);
+
+ $options['count'] = FALSE;
+ $entities = $getter($options);
+
+ $options['count'] = $count;
+
+ return $viewer($entities, $options);
+}
+
+/**
+ * Returns a list of months in which entities were updated or created.
+ *
+ * @tip Use this to generate a list of archives by month for when entities were added or updated.
+ *
+ * @todo document how to pass in array for $subtype
+ *
+ * @warning Months are returned in the form YYYYMM.
+ *
+ * @param string $type The type of entity
+ * @param string $subtype The subtype of entity
+ * @param int $container_guid The container GUID that the entities belong to
+ * @param int $site_guid The site GUID
+ * @param string $order_by Order_by SQL order by clause
+ *
+ * @return array|false Either an array months as YYYYMM, or false on failure
+ */
+function get_entity_dates($type = '', $subtype = '', $container_guid = 0, $site_guid = 0,
+$order_by = 'time_created') {
+
+ global $CONFIG;
+
+ $site_guid = (int) $site_guid;
+ if ($site_guid == 0) {
+ $site_guid = $CONFIG->site_guid;
+ }
+ $where = array();
+
+ if ($type != "") {
+ $type = sanitise_string($type);
+ $where[] = "type='$type'";
+ }
+
+ if (is_array($subtype)) {
+ $tempwhere = "";
+ if (sizeof($subtype)) {
+ foreach ($subtype as $typekey => $subtypearray) {
+ foreach ($subtypearray as $subtypeval) {
+ $typekey = sanitise_string($typekey);
+ if (!empty($subtypeval)) {
+ if (!$subtypeval = (int) get_subtype_id($typekey, $subtypeval)) {
+ return false;
+ }
+ } else {
+ $subtypeval = 0;
+ }
+ if (!empty($tempwhere)) {
+ $tempwhere .= " or ";
+ }
+ $tempwhere .= "(type = '{$typekey}' and subtype = {$subtypeval})";
+ }
+ }
+ }
+ if (!empty($tempwhere)) {
+ $where[] = "({$tempwhere})";
+ }
+ } else {
+ if ($subtype) {
+ if (!$subtype_id = get_subtype_id($type, $subtype)) {
+ return FALSE;
+ } else {
+ $where[] = "subtype=$subtype_id";
+ }
+ }
+ }
+
+ if ($container_guid !== 0) {
+ if (is_array($container_guid)) {
+ foreach ($container_guid as $key => $val) {
+ $container_guid[$key] = (int) $val;
+ }
+ $where[] = "container_guid in (" . implode(",", $container_guid) . ")";
+ } else {
+ $container_guid = (int) $container_guid;
+ $where[] = "container_guid = {$container_guid}";
+ }
+ }
+
+ if ($site_guid > 0) {
+ $where[] = "site_guid = {$site_guid}";
+ }
+
+ $where[] = get_access_sql_suffix();
+
+ $sql = "SELECT DISTINCT EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(time_created)) AS yearmonth
+ FROM {$CONFIG->dbprefix}entities where ";
+
+ foreach ($where as $w) {
+ $sql .= " $w and ";
+ }
+
+ $sql .= "1=1 ORDER BY $order_by";
+ if ($result = get_data($sql)) {
+ $endresult = array();
+ foreach ($result as $res) {
+ $endresult[] = $res->yearmonth;
+ }
+ return $endresult;
+ }
+ return false;
+}
+
+/**
+ * Disable an entity.
+ *
+ * Disabled entities do not show up in list or elgg_get_entity()
+ * calls, but still exist in the database.
+ *
+ * Entities are disabled by setting disabled = yes in the
+ * entities table.
+ *
+ * You can ignore the disabled field by using {@link access_show_hidden_entities()}.
+ *
+ * @note Use ElggEntity::disable() instead.
+ *
+ * @param int $guid The guid
+ * @param string $reason Optional reason
+ * @param bool $recursive Recursively disable all entities owned or contained by $guid?
+ *
+ * @return bool
+ * @see access_show_hidden_entities()
+ * @link http://docs.elgg.org/Entities
+ * @access private
+ */
+function disable_entity($guid, $reason = "", $recursive = true) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $reason = sanitise_string($reason);
+
+ if ($entity = get_entity($guid)) {
+ if (elgg_trigger_event('disable', $entity->type, $entity)) {
+ if ($entity->canEdit()) {
+ if ($reason) {
+ create_metadata($guid, 'disable_reason', $reason, '', 0, ACCESS_PUBLIC);
+ }
+
+ if ($recursive) {
+ $hidden = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $ia = elgg_set_ignore_access(true);
+
+ $sub_entities = get_data("SELECT * FROM {$CONFIG->dbprefix}entities
+ WHERE (
+ container_guid = $guid
+ OR owner_guid = $guid
+ OR site_guid = $guid
+ ) AND enabled='yes'", 'entity_row_to_elggstar');
+
+ if ($sub_entities) {
+ foreach ($sub_entities as $e) {
+ add_entity_relationship($e->guid, 'disabled_with', $entity->guid);
+ $e->disable($reason);
+ }
+ }
+ access_show_hidden_entities($hidden);
+ elgg_set_ignore_access($ia);
+ }
+
+ $entity->disableMetadata();
+ $entity->disableAnnotations();
+ _elgg_invalidate_cache_for_entity($guid);
+
+ $res = update_data("UPDATE {$CONFIG->dbprefix}entities
+ SET enabled = 'no'
+ WHERE guid = $guid");
+
+ return $res;
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Enable an entity.
+ *
+ * @warning In order to enable an entity, you must first use
+ * {@link access_show_hidden_entities()}.
+ *
+ * @param int $guid GUID of entity to enable
+ * @param bool $recursive Recursively enable all entities disabled with the entity?
+ *
+ * @return bool
+ */
+function enable_entity($guid, $recursive = true) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+
+ // Override access only visible entities
+ $old_access_status = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+
+ $result = false;
+ if ($entity = get_entity($guid)) {
+ if (elgg_trigger_event('enable', $entity->type, $entity)) {
+ if ($entity->canEdit()) {
+
+ $result = update_data("UPDATE {$CONFIG->dbprefix}entities
+ SET enabled = 'yes'
+ WHERE guid = $guid");
+
+ $entity->deleteMetadata('disable_reason');
+ $entity->enableMetadata();
+ $entity->enableAnnotations();
+
+ if ($recursive) {
+ $disabled_with_it = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'disabled_with',
+ 'relationship_guid' => $entity->guid,
+ 'inverse_relationship' => true,
+ 'limit' => 0,
+ ));
+
+ foreach ($disabled_with_it as $e) {
+ $e->enable();
+ remove_entity_relationship($e->guid, 'disabled_with', $entity->guid);
+ }
+ }
+ }
+ }
+ }
+
+ access_show_hidden_entities($old_access_status);
+ return $result;
+}
+
+/**
+ * Delete an entity.
+ *
+ * Removes an entity and its metadata, annotations, relationships, river entries,
+ * and private data.
+ *
+ * Optionally can remove entities contained and owned by $guid.
+ *
+ * @tip Use ElggEntity::delete() instead.
+ *
+ * @warning If deleting recursively, this bypasses ownership of items contained by
+ * the entity. That means that if the container_guid = $guid, the item will be deleted
+ * regardless of who owns it.
+ *
+ * @param int $guid The guid of the entity to delete
+ * @param bool $recursive If true (default) then all entities which are
+ * owned or contained by $guid will also be deleted.
+ *
+ * @return bool
+ * @access private
+ */
+function delete_entity($guid, $recursive = true) {
+ global $CONFIG, $ENTITY_CACHE;
+
+ $guid = (int)$guid;
+ if ($entity = get_entity($guid)) {
+ if (elgg_trigger_event('delete', $entity->type, $entity)) {
+ if ($entity->canEdit()) {
+
+ // delete cache
+ if (isset($ENTITY_CACHE[$guid])) {
+ _elgg_invalidate_cache_for_entity($guid);
+ }
+
+ // If memcache is available then delete this entry from the cache
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+ if ($newentity_cache) {
+ $newentity_cache->delete($guid);
+ }
+
+ // Delete contained owned and otherwise releated objects (depth first)
+ if ($recursive) {
+ // Temporary token overriding access controls
+ // @todo Do this better.
+ static $__RECURSIVE_DELETE_TOKEN;
+ // Make it slightly harder to guess
+ $__RECURSIVE_DELETE_TOKEN = md5(elgg_get_logged_in_user_guid());
+
+ $entity_disable_override = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $ia = elgg_set_ignore_access(true);
+
+ // @todo there was logic in the original code that ignored
+ // entities with owner or container guids of themselves.
+ // this should probably be prevented in ElggEntity instead of checked for here
+ $options = array(
+ 'wheres' => array(
+ "((container_guid = $guid OR owner_guid = $guid OR site_guid = $guid)"
+ . " AND guid != $guid)"
+ ),
+ 'limit' => 0
+ );
+
+ $batch = new ElggBatch('elgg_get_entities', $options);
+ $batch->setIncrementOffset(false);
+
+ foreach ($batch as $e) {
+ $e->delete(true);
+ }
+
+ access_show_hidden_entities($entity_disable_override);
+ $__RECURSIVE_DELETE_TOKEN = null;
+ elgg_set_ignore_access($ia);
+ }
+
+ $entity_disable_override = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $ia = elgg_set_ignore_access(true);
+
+ // Now delete the entity itself
+ $entity->deleteMetadata();
+ $entity->deleteOwnedMetadata();
+ $entity->deleteAnnotations();
+ $entity->deleteOwnedAnnotations();
+ $entity->deleteRelationships();
+
+ access_show_hidden_entities($entity_disable_override);
+ elgg_set_ignore_access($ia);
+
+ elgg_delete_river(array('subject_guid' => $guid));
+ elgg_delete_river(array('object_guid' => $guid));
+ remove_all_private_settings($guid);
+
+ $res = delete_data("DELETE from {$CONFIG->dbprefix}entities where guid={$guid}");
+ if ($res) {
+ $sub_table = "";
+
+ // Where appropriate delete the sub table
+ switch ($entity->type) {
+ case 'object' :
+ $sub_table = $CONFIG->dbprefix . 'objects_entity';
+ break;
+ case 'user' :
+ $sub_table = $CONFIG->dbprefix . 'users_entity';
+ break;
+ case 'group' :
+ $sub_table = $CONFIG->dbprefix . 'groups_entity';
+ break;
+ case 'site' :
+ $sub_table = $CONFIG->dbprefix . 'sites_entity';
+ break;
+ }
+
+ if ($sub_table) {
+ delete_data("DELETE from $sub_table where guid={$guid}");
+ }
+ }
+
+ return (bool)$res;
+ }
+ }
+ }
+ return false;
+
+}
+
+/**
+ * Exports attributes generated on the fly (volatile) about an entity.
+ *
+ * @param string $hook volatile
+ * @param string $entity_type metadata
+ * @param string $returnvalue Return value from previous hook
+ * @param array $params The parameters, passed 'guid' and 'varname'
+ *
+ * @return ElggMetadata|null
+ * @elgg_plugin_hook_handler volatile metadata
+ * @todo investigate more.
+ * @access private
+ * @todo document
+ */
+function volatile_data_export_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $guid = (int)$params['guid'];
+ $variable_name = sanitise_string($params['varname']);
+
+ if (($hook == 'volatile') && ($entity_type == 'metadata')) {
+ if (($guid) && ($variable_name)) {
+ switch ($variable_name) {
+ case 'renderedentity' :
+ elgg_set_viewtype('default');
+ $view = elgg_view_entity(get_entity($guid));
+ elgg_set_viewtype();
+
+ $tmp = new ElggMetadata();
+ $tmp->type = 'volatile';
+ $tmp->name = 'renderedentity';
+ $tmp->value = $view;
+ $tmp->entity_guid = $guid;
+
+ return $tmp;
+
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * Exports all attributes of an entity.
+ *
+ * @warning Only exports fields in the entity and entity type tables.
+ *
+ * @param string $hook export
+ * @param string $entity_type all
+ * @param mixed $returnvalue Previous hook return value
+ * @param array $params Parameters
+ *
+ * @elgg_event_handler export all
+ * @return mixed
+ * @access private
+ *
+ * @throws InvalidParameterException|InvalidClassException
+ */
+function export_entity_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ // Sanity check values
+ if ((!is_array($params)) && (!isset($params['guid']))) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
+ }
+
+ if (!is_array($returnvalue)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
+ }
+
+ $guid = (int)$params['guid'];
+
+ // Get the entity
+ $entity = get_entity($guid);
+ if (!($entity instanceof ElggEntity)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($guid, get_class()));
+ throw new InvalidClassException($msg);
+ }
+
+ $export = $entity->export();
+
+ if (is_array($export)) {
+ foreach ($export as $e) {
+ $returnvalue[] = $e;
+ }
+ } else {
+ $returnvalue[] = $export;
+ }
+
+ return $returnvalue;
+}
+
+/**
+ * Utility function used by import_entity_plugin_hook() to
+ * process an ODDEntity into an unsaved ElggEntity.
+ *
+ * @param ODDEntity $element The OpenDD element
+ *
+ * @return ElggEntity the unsaved entity which should be populated by items.
+ * @todo Remove this.
+ * @access private
+ *
+ * @throws ClassException|InstallationException|ImportException
+ */
+function oddentity_to_elggentity(ODDEntity $element) {
+ $class = $element->getAttribute('class');
+ $subclass = $element->getAttribute('subclass');
+
+ // See if we already have imported this uuid
+ $tmp = get_entity_from_uuid($element->getAttribute('uuid'));
+
+ if (!$tmp) {
+ // Construct new class with owner from session
+ $classname = get_subtype_class($class, $subclass);
+ if ($classname) {
+ if (class_exists($classname)) {
+ $tmp = new $classname();
+
+ if (!($tmp instanceof ElggEntity)) {
+ $msg = elgg_echo('ClassException:ClassnameNotClass', array($classname, get_class()));
+ throw new ClassException($msg);
+ }
+ } else {
+ error_log(elgg_echo('ClassNotFoundException:MissingClass', array($classname)));
+ }
+ } else {
+ switch ($class) {
+ case 'object' :
+ $tmp = new ElggObject($row);
+ break;
+ case 'user' :
+ $tmp = new ElggUser($row);
+ break;
+ case 'group' :
+ $tmp = new ElggGroup($row);
+ break;
+ case 'site' :
+ $tmp = new ElggSite($row);
+ break;
+ default:
+ $msg = elgg_echo('InstallationException:TypeNotSupported', array($class));
+ throw new InstallationException($msg);
+ }
+ }
+ }
+
+ if ($tmp) {
+ if (!$tmp->import($element)) {
+ $msg = elgg_echo('ImportException:ImportFailed', array($element->getAttribute('uuid')));
+ throw new ImportException($msg);
+ }
+
+ return $tmp;
+ }
+
+ return NULL;
+}
+
+/**
+ * Import an entity.
+ *
+ * This function checks the passed XML doc (as array) to see if it is
+ * a user, if so it constructs a new elgg user and returns "true"
+ * to inform the importer that it's been handled.
+ *
+ * @param string $hook import
+ * @param string $entity_type all
+ * @param mixed $returnvalue Value from previous hook
+ * @param mixed $params Array of params
+ *
+ * @return mixed
+ * @elgg_plugin_hook_handler import all
+ * @todo document
+ * @access private
+ *
+ * @throws ImportException
+ */
+function import_entity_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $element = $params['element'];
+
+ $tmp = null;
+
+ if ($element instanceof ODDEntity) {
+ $tmp = oddentity_to_elggentity($element);
+
+ if ($tmp) {
+ // Make sure its saved
+ if (!$tmp->save()) {
+ $msg = elgg_echo('ImportException:ProblemSaving', array($element->getAttribute('uuid')));
+ throw new ImportException($msg);
+ }
+
+ // Belts and braces
+ if (!$tmp->guid) {
+ throw new ImportException(elgg_echo('ImportException:NoGUID'));
+ }
+
+ // We have saved, so now tag
+ add_uuid_to_guid($tmp->guid, $element->getAttribute('uuid'));
+
+ return $tmp;
+ }
+ }
+}
+
+/**
+ * Returns if $user_guid is able to edit $entity_guid.
+ *
+ * @tip Can be overridden by by registering for the permissions_check
+ * plugin hook.
+ *
+ * @warning If a $user_guid is not passed it will default to the logged in user.
+ *
+ * @tip Use ElggEntity::canEdit() instead.
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param int $user_guid The GUID of the user
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Entities/AccessControl
+ */
+function can_edit_entity($entity_guid, $user_guid = 0) {
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $return = false;
+ if ($entity = get_entity($entity_guid)) {
+
+ // Test user if possible - should default to false unless a plugin hook says otherwise
+ if ($user) {
+ if ($entity->getOwnerGUID() == $user->getGUID()) {
+ $return = true;
+ }
+ if ($entity->container_guid == $user->getGUID()) {
+ $return = true;
+ }
+ if ($entity->type == "user" && $entity->getGUID() == $user->getGUID()) {
+ $return = true;
+ }
+ if ($container_entity = get_entity($entity->container_guid)) {
+ if ($container_entity->canEdit($user->getGUID())) {
+ $return = true;
+ }
+ }
+ }
+ }
+
+ return elgg_trigger_plugin_hook('permissions_check', $entity->type,
+ array('entity' => $entity, 'user' => $user), $return);
+}
+
+/**
+ * Returns if $user_guid can edit the metadata on $entity_guid.
+ *
+ * @tip Can be overridden by by registering for the permissions_check:metadata
+ * plugin hook.
+ *
+ * @warning If a $user_guid isn't specified, the currently logged in user is used.
+ *
+ * @param int $entity_guid The GUID of the entity
+ * @param int $user_guid The GUID of the user
+ * @param ElggMetadata $metadata The metadata to specifically check (if any; default null)
+ *
+ * @return bool
+ * @see elgg_register_plugin_hook_handler()
+ */
+function can_edit_entity_metadata($entity_guid, $user_guid = 0, $metadata = null) {
+ if ($entity = get_entity($entity_guid)) {
+
+ $return = null;
+
+ if ($metadata && ($metadata->owner_guid == 0)) {
+ $return = true;
+ }
+ if (is_null($return)) {
+ $return = can_edit_entity($entity_guid, $user_guid);
+ }
+
+ if ($user_guid) {
+ $user = get_entity($user_guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $params = array('entity' => $entity, 'user' => $user, 'metadata' => $metadata);
+ $return = elgg_trigger_plugin_hook('permissions_check:metadata', $entity->type, $params, $return);
+ return $return;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Returns the URL for an entity.
+ *
+ * @tip Can be overridden with {@link register_entity_url_handler()}.
+ *
+ * @param int $entity_guid The GUID of the entity
+ *
+ * @return string The URL of the entity
+ * @see register_entity_url_handler()
+ */
+function get_entity_url($entity_guid) {
+ global $CONFIG;
+
+ if ($entity = get_entity($entity_guid)) {
+ $url = "";
+
+ if (isset($CONFIG->entity_url_handler[$entity->getType()][$entity->getSubType()])) {
+ $function = $CONFIG->entity_url_handler[$entity->getType()][$entity->getSubType()];
+ if (is_callable($function)) {
+ $url = call_user_func($function, $entity);
+ }
+ } elseif (isset($CONFIG->entity_url_handler[$entity->getType()]['all'])) {
+ $function = $CONFIG->entity_url_handler[$entity->getType()]['all'];
+ if (is_callable($function)) {
+ $url = call_user_func($function, $entity);
+ }
+ } elseif (isset($CONFIG->entity_url_handler['all']['all'])) {
+ $function = $CONFIG->entity_url_handler['all']['all'];
+ if (is_callable($function)) {
+ $url = call_user_func($function, $entity);
+ }
+ }
+
+ if ($url == "") {
+ $url = "view/" . $entity_guid;
+ }
+
+ return elgg_normalize_url($url);
+ }
+
+ return false;
+}
+
+/**
+ * Sets the URL handler for a particular entity type and subtype
+ *
+ * @param string $entity_type The entity type
+ * @param string $entity_subtype The entity subtype
+ * @param string $function_name The function to register
+ *
+ * @return bool Depending on success
+ * @see get_entity_url()
+ * @see ElggEntity::getURL()
+ * @since 1.8.0
+ */
+function elgg_register_entity_url_handler($entity_type, $entity_subtype, $function_name) {
+ global $CONFIG;
+
+ if (!is_callable($function_name, true)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->entity_url_handler)) {
+ $CONFIG->entity_url_handler = array();
+ }
+
+ if (!isset($CONFIG->entity_url_handler[$entity_type])) {
+ $CONFIG->entity_url_handler[$entity_type] = array();
+ }
+
+ $CONFIG->entity_url_handler[$entity_type][$entity_subtype] = $function_name;
+
+ return true;
+}
+
+/**
+ * Registers an entity type and subtype as a public-facing entity that should
+ * be shown in search and by {@link elgg_list_registered_entities()}.
+ *
+ * @warning Entities that aren't registered here will not show up in search.
+ *
+ * @tip Add a language string item:type:subtype to make sure the items are display properly.
+ *
+ * @param string $type The type of entity (object, site, user, group)
+ * @param string $subtype The subtype to register (may be blank)
+ *
+ * @return bool Depending on success
+ * @see get_registered_entity_types()
+ * @link http://docs.elgg.org/Search
+ * @link http://docs.elgg.org/Tutorials/Search
+ */
+function elgg_register_entity_type($type, $subtype = null) {
+ global $CONFIG;
+
+ $type = strtolower($type);
+ if (!in_array($type, $CONFIG->entity_types)) {
+ return FALSE;
+ }
+
+ if (!isset($CONFIG->registered_entities)) {
+ $CONFIG->registered_entities = array();
+ }
+
+ if (!isset($CONFIG->registered_entities[$type])) {
+ $CONFIG->registered_entities[$type] = array();
+ }
+
+ if ($subtype) {
+ $CONFIG->registered_entities[$type][] = $subtype;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Unregisters an entity type and subtype as a public-facing entity.
+ *
+ * @warning With a blank subtype, it unregisters that entity type including
+ * all subtypes. This must be called after all subtypes have been registered.
+ *
+ * @param string $type The type of entity (object, site, user, group)
+ * @param string $subtype The subtype to register (may be blank)
+ *
+ * @return bool Depending on success
+ * @see elgg_register_entity_type()
+ */
+function unregister_entity_type($type, $subtype) {
+ global $CONFIG;
+
+ $type = strtolower($type);
+ if (!in_array($type, $CONFIG->entity_types)) {
+ return FALSE;
+ }
+
+ if (!isset($CONFIG->registered_entities)) {
+ return FALSE;
+ }
+
+ if (!isset($CONFIG->registered_entities[$type])) {
+ return FALSE;
+ }
+
+ if ($subtype) {
+ if (in_array($subtype, $CONFIG->registered_entities[$type])) {
+ $key = array_search($subtype, $CONFIG->registered_entities[$type]);
+ unset($CONFIG->registered_entities[$type][$key]);
+ } else {
+ return FALSE;
+ }
+ } else {
+ unset($CONFIG->registered_entities[$type]);
+ }
+
+ return TRUE;
+}
+
+/**
+ * Returns registered entity types and subtypes
+ *
+ * @param string $type The type of entity (object, site, user, group) or blank for all
+ *
+ * @return array|false Depending on whether entities have been registered
+ * @see elgg_register_entity_type()
+ */
+function get_registered_entity_types($type = null) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->registered_entities)) {
+ return false;
+ }
+ if ($type) {
+ $type = strtolower($type);
+ }
+ if (!empty($type) && empty($CONFIG->registered_entities[$type])) {
+ return false;
+ }
+
+ if (empty($type)) {
+ return $CONFIG->registered_entities;
+ }
+
+ return $CONFIG->registered_entities[$type];
+}
+
+/**
+ * Returns if the entity type and subtype have been registered with {@see elgg_register_entity_type()}.
+ *
+ * @param string $type The type of entity (object, site, user, group)
+ * @param string $subtype The subtype (may be blank)
+ *
+ * @return bool Depending on whether or not the type has been registered
+ */
+function is_registered_entity_type($type, $subtype = null) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->registered_entities)) {
+ return false;
+ }
+
+ $type = strtolower($type);
+
+ // @todo registering a subtype implicitly registers the type.
+ // see #2684
+ if (!isset($CONFIG->registered_entities[$type])) {
+ return false;
+ }
+
+ if ($subtype && !in_array($subtype, $CONFIG->registered_entities[$type])) {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Page handler for generic entities view system
+ *
+ * @param array $page Page elements from pain page handler
+ *
+ * @return bool
+ * @elgg_page_handler view
+ * @access private
+ */
+function entities_page_handler($page) {
+ if (isset($page[0])) {
+ global $CONFIG;
+ set_input('guid', $page[0]);
+ include($CONFIG->path . "pages/entities/index.php");
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Returns a viewable list of entities based on the registered types.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param array $options Any elgg_get_entity() options plus:
+ *
+ * full_view => BOOL Display full view entities
+ *
+ * list_type_toggle => BOOL Display gallery / list switch
+ *
+ * allowed_types => TRUE|ARRAY True to show all types or an array of valid types.
+ *
+ * pagination => BOOL Display pagination links
+ *
+ * @return string A viewable list of entities
+ * @since 1.7.0
+ */
+function elgg_list_registered_entities(array $options = array()) {
+ global $autofeed;
+ $autofeed = true;
+
+ $defaults = array(
+ 'full_view' => TRUE,
+ 'allowed_types' => TRUE,
+ 'list_type_toggle' => FALSE,
+ 'pagination' => TRUE,
+ 'offset' => 0,
+ 'types' => array(),
+ 'type_subtype_pairs' => array()
+ );
+
+ $options = array_merge($defaults, $options);
+
+ //backwards compatibility
+ if (isset($options['view_type_toggle'])) {
+ $options['list_type_toggle'] = $options['view_type_toggle'];
+ }
+
+ $types = get_registered_entity_types();
+
+ foreach ($types as $type => $subtype_array) {
+ if (in_array($type, $options['allowed_types']) || $options['allowed_types'] === TRUE) {
+ // you must explicitly register types to show up in here and in search for objects
+ if ($type == 'object') {
+ if (is_array($subtype_array) && count($subtype_array)) {
+ $options['type_subtype_pairs'][$type] = $subtype_array;
+ }
+ } else {
+ if (is_array($subtype_array) && count($subtype_array)) {
+ $options['type_subtype_pairs'][$type] = $subtype_array;
+ } else {
+ $options['type_subtype_pairs'][$type] = ELGG_ENTITIES_ANY_VALUE;
+ }
+ }
+ }
+ }
+
+ if (!empty($options['type_subtype_pairs'])) {
+ $count = elgg_get_entities(array_merge(array('count' => TRUE), $options));
+ $entities = elgg_get_entities($options);
+ } else {
+ $count = 0;
+ $entities = array();
+ }
+
+ $options['count'] = $count;
+ return elgg_view_entity_list($entities, $options);
+}
+
+/**
+ * Checks if $entity is an ElggEntity and optionally for type and subtype.
+ *
+ * @tip Use this function in actions and views to check that you are dealing
+ * with the correct type of entity.
+ *
+ * @param mixed $entity Entity
+ * @param string $type Entity type
+ * @param string $subtype Entity subtype
+ * @param string $class Class name
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_instanceof($entity, $type = NULL, $subtype = NULL, $class = NULL) {
+ $return = ($entity instanceof ElggEntity);
+
+ if ($type) {
+ /* @var ElggEntity $entity */
+ $return = $return && ($entity->getType() == $type);
+ }
+
+ if ($subtype) {
+ $return = $return && ($entity->getSubtype() == $subtype);
+ }
+
+ if ($class) {
+ $return = $return && ($entity instanceof $class);
+ }
+
+ return $return;
+}
+
+/**
+ * Update the last_action column in the entities table for $guid.
+ *
+ * @warning This is different to time_updated. Time_updated is automatically set,
+ * while last_action is only set when explicitly called.
+ *
+ * @param int $guid Entity annotation|relationship action carried out on
+ * @param int $posted Timestamp of last action
+ *
+ * @return bool
+ * @access private
+ */
+function update_entity_last_action($guid, $posted = NULL) {
+ global $CONFIG;
+ $guid = (int)$guid;
+ $posted = (int)$posted;
+
+ if (!$posted) {
+ $posted = time();
+ }
+
+ if ($guid) {
+ //now add to the river updated table
+ $query = "UPDATE {$CONFIG->dbprefix}entities SET last_action = {$posted} WHERE guid = {$guid}";
+ $result = update_data($query);
+ if ($result) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ return FALSE;
+ }
+}
+
+/**
+ * Garbage collect stub and fragments from any broken delete/create calls
+ *
+ * @return void
+ * @elgg_plugin_hook_handler gc system
+ * @access private
+ */
+function entities_gc() {
+ global $CONFIG;
+
+ $tables = array(
+ 'site' => 'sites_entity',
+ 'object' => 'objects_entity',
+ 'group' => 'groups_entity',
+ 'user' => 'users_entity'
+ );
+
+ foreach ($tables as $type => $table) {
+ delete_data("DELETE FROM {$CONFIG->dbprefix}{$table}
+ WHERE guid NOT IN (SELECT guid FROM {$CONFIG->dbprefix}entities)");
+ delete_data("DELETE FROM {$CONFIG->dbprefix}entities
+ WHERE type = '$type' AND guid NOT IN (SELECT guid FROM {$CONFIG->dbprefix}{$table})");
+ }
+}
+
+/**
+ * Runs unit tests for the entity objects.
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function entities_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/objects/entities.php';
+ return $value;
+}
+
+/**
+ * Entities init function; establishes the default entity page handler
+ *
+ * @return void
+ * @elgg_event_handler init system
+ * @access private
+ */
+function entities_init() {
+ elgg_register_page_handler('view', 'entities_page_handler');
+
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'entities_test');
+
+ elgg_register_plugin_hook_handler('gc', 'system', 'entities_gc');
+}
+
+/** Register the import hook */
+elgg_register_plugin_hook_handler("import", "all", "import_entity_plugin_hook", 0);
+
+/** Register the hook, ensuring entities are serialised first */
+elgg_register_plugin_hook_handler("export", "all", "export_entity_plugin_hook", 0);
+
+/** Hook to get certain named bits of volatile data about an entity */
+elgg_register_plugin_hook_handler('volatile', 'metadata', 'volatile_data_export_plugin_hook');
+
+/** Register init system event **/
+elgg_register_event_handler('init', 'system', 'entities_init');
+
diff --git a/engine/lib/export.php b/engine/lib/export.php
new file mode 100644
index 000000000..ecc894e63
--- /dev/null
+++ b/engine/lib/export.php
@@ -0,0 +1,223 @@
+<?php
+/**
+ * Elgg Data import export functionality.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Export
+ */
+
+/**
+ * Get a UUID from a given object.
+ *
+ * @param mixed $object The object either an ElggEntity, ElggRelationship or ElggExtender
+ *
+ * @return string|false the UUID or false
+ */
+function get_uuid_from_object($object) {
+ if ($object instanceof ElggEntity) {
+ return guid_to_uuid($object->guid);
+ } else if ($object instanceof ElggExtender) {
+ $type = $object->type;
+ if ($type == 'volatile') {
+ $uuid = guid_to_uuid($object->entity_guid) . $type . "/{$object->name}/";
+ } else {
+ $uuid = guid_to_uuid($object->entity_guid) . $type . "/{$object->id}/";
+ }
+
+ return $uuid;
+ } else if ($object instanceof ElggRelationship) {
+ return guid_to_uuid($object->guid_one) . "relationship/{$object->id}/";
+ }
+
+ return false;
+}
+
+/**
+ * Generate a UUID from a given GUID.
+ *
+ * @param int $guid The GUID of an object.
+ *
+ * @return string
+ */
+function guid_to_uuid($guid) {
+ return elgg_get_site_url() . "export/opendd/$guid/";
+}
+
+/**
+ * Test to see if a given uuid is for this domain, returning true if so.
+ *
+ * @param string $uuid A unique ID
+ *
+ * @return bool
+ */
+function is_uuid_this_domain($uuid) {
+ if (strpos($uuid, elgg_get_site_url()) === 0) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * This function attempts to retrieve a previously imported entity via its UUID.
+ *
+ * @param string $uuid A unique ID
+ *
+ * @return ElggEntity|false
+ */
+function get_entity_from_uuid($uuid) {
+ $uuid = sanitise_string($uuid);
+
+ $options = array('metadata_name' => 'import_uuid', 'metadata_value' => $uuid);
+ $entities = elgg_get_entities_from_metadata($options);
+
+ if ($entities) {
+ return $entities[0];
+ }
+
+ return false;
+}
+
+/**
+ * Tag a previously created guid with the uuid it was imported on.
+ *
+ * @param int $guid A GUID
+ * @param string $uuid A Unique ID
+ *
+ * @return bool
+ */
+function add_uuid_to_guid($guid, $uuid) {
+ $guid = (int)$guid;
+ $uuid = sanitise_string($uuid);
+
+ $result = create_metadata($guid, "import_uuid", $uuid);
+ return (bool)$result;
+}
+
+
+$IMPORTED_DATA = array();
+$IMPORTED_OBJECT_COUNTER = 0;
+
+/**
+ * This function processes an element, passing elements to the plugin stack to see if someone will
+ * process it.
+ *
+ * If nobody processes the top level element, the sub level elements are processed.
+ *
+ * @param ODD $odd The odd element to process
+ *
+ * @return bool
+ * @access private
+ */
+function _process_element(ODD $odd) {
+ global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER;
+
+ // See if anyone handles this element, return true if it is.
+ $to_be_serialised = null;
+ if ($odd) {
+ $handled = elgg_trigger_plugin_hook("import", "all", array("element" => $odd), $to_be_serialised);
+
+ // If not, then see if any of its sub elements are handled
+ if ($handled) {
+ // Increment validation counter
+ $IMPORTED_OBJECT_COUNTER ++;
+ // Return the constructed object
+ $IMPORTED_DATA[] = $handled;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Exports an entity as an array
+ *
+ * @param int $guid Entity GUID
+ *
+ * @return array
+ * @throws ExportException
+ * @access private
+ */
+function exportAsArray($guid) {
+ $guid = (int)$guid;
+
+ // Trigger a hook to
+ $to_be_serialised = elgg_trigger_plugin_hook("export", "all", array("guid" => $guid), array());
+
+ // Sanity check
+ if ((!is_array($to_be_serialised)) || (count($to_be_serialised) == 0)) {
+ throw new ExportException(elgg_echo('ExportException:NoSuchEntity', array($guid)));
+ }
+
+ return $to_be_serialised;
+}
+
+/**
+ * Export a GUID.
+ *
+ * This function exports a GUID and all information related to it in an XML format.
+ *
+ * This function makes use of the "serialise" plugin hook, which is passed an array to which plugins
+ * should add data to be serialised to.
+ *
+ * @param int $guid The GUID.
+ *
+ * @return string XML
+ * @see ElggEntity for an example of its usage.
+ * @access private
+ */
+function export($guid) {
+ $odd = new ODDDocument(exportAsArray($guid));
+
+ return ODD_Export($odd);
+}
+
+/**
+ * Import an XML serialisation of an object.
+ * This will make a best attempt at importing a given xml doc.
+ *
+ * @param string $xml XML string
+ *
+ * @return bool
+ * @throws ImportException if there was a problem importing the data.
+ * @access private
+ */
+function import($xml) {
+ global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER;
+
+ $IMPORTED_DATA = array();
+ $IMPORTED_OBJECT_COUNTER = 0;
+
+ $document = ODD_Import($xml);
+ if (!$document) {
+ throw new ImportException(elgg_echo('ImportException:NoODDElements'));
+ }
+
+ foreach ($document as $element) {
+ _process_element($element);
+ }
+
+ if ($IMPORTED_OBJECT_COUNTER != count($IMPORTED_DATA)) {
+ throw new ImportException(elgg_echo('ImportException:NotAllImported'));
+ }
+
+ return true;
+}
+
+
+/**
+ * Register the OpenDD import action
+ *
+ * @return void
+ * @access private
+ */
+function export_init() {
+ global $CONFIG;
+
+ elgg_register_action("import/opendd");
+}
+
+// Register a startup event
+elgg_register_event_handler('init', 'system', 'export_init', 100);
diff --git a/engine/lib/extender.php b/engine/lib/extender.php
new file mode 100644
index 000000000..8323bd3ce
--- /dev/null
+++ b/engine/lib/extender.php
@@ -0,0 +1,249 @@
+<?php
+/**
+ * Elgg Entity Extender.
+ * This file contains ways of extending an Elgg entity in custom ways.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Extender
+ */
+
+/**
+ * Detect the value_type for a given value.
+ * Currently this is very crude.
+ *
+ * @todo Make better!
+ *
+ * @param mixed $value The value
+ * @param string $value_type If specified, overrides the detection.
+ *
+ * @return string
+ */
+function detect_extender_valuetype($value, $value_type = "") {
+ if ($value_type != "" && ($value_type == 'integer' || $value_type == 'text')) {
+ return $value_type;
+ }
+
+ // This is crude
+ if (is_int($value)) {
+ return 'integer';
+ }
+ // Catch floating point values which are not integer
+ if (is_numeric($value)) {
+ return 'text';
+ }
+
+ return 'text';
+}
+
+/**
+ * Utility function used by import_extender_plugin_hook() to process
+ * an ODDMetaData and add it to an entity. This function does not
+ * hit ->save() on the entity (this lets you construct in memory)
+ *
+ * @param ElggEntity $entity The entity to add the data to.
+ * @param ODDMetaData $element The OpenDD element
+ *
+ * @return bool
+ * @access private
+ */
+function oddmetadata_to_elggextender(ElggEntity $entity, ODDMetaData $element) {
+ // Get the type of extender (metadata, type, attribute etc)
+ $type = $element->getAttribute('type');
+ $attr_name = $element->getAttribute('name');
+ $attr_val = $element->getBody();
+
+ switch ($type) {
+ // Ignore volatile items
+ case 'volatile' :
+ break;
+ case 'annotation' :
+ $entity->annotate($attr_name, $attr_val);
+ break;
+ case 'metadata' :
+ $entity->setMetaData($attr_name, $attr_val, "", true);
+ break;
+ default : // Anything else assume attribute
+ $entity->set($attr_name, $attr_val);
+ }
+
+ // Set time if appropriate
+ $attr_time = $element->getAttribute('published');
+ if ($attr_time) {
+ $entity->set('time_updated', $attr_time);
+ }
+
+ return true;
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "import" event.
+ *
+ * @param string $hook volatile
+ * @param string $entity_type metadata
+ * @param string $returnvalue Return value from previous hook
+ * @param array $params The parameters
+ *
+ * @return null
+ * @elgg_plugin_hook_handler volatile metadata
+ * @todo investigate more.
+ * @throws ImportException
+ * @access private
+ */
+function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $element = $params['element'];
+
+ $tmp = NULL;
+
+ if ($element instanceof ODDMetaData) {
+ /* @var ODDMetaData $element */
+ // Recall entity
+ $entity_uuid = $element->getAttribute('entity_uuid');
+ $entity = get_entity_from_uuid($entity_uuid);
+ if (!$entity) {
+ throw new ImportException(elgg_echo('ImportException:GUIDNotFound', array($entity_uuid)));
+ }
+
+ oddmetadata_to_elggextender($entity, $element);
+
+ // Save
+ if (!$entity->save()) {
+ $attr_name = $element->getAttribute('name');
+ $msg = elgg_echo('ImportException:ProblemUpdatingMeta', array($attr_name, $entity_uuid));
+ throw new ImportException($msg);
+ }
+
+ return true;
+ }
+}
+
+/**
+ * Determines whether or not the specified user can edit the specified piece of extender
+ *
+ * @param int $extender_id The ID of the piece of extender
+ * @param string $type 'metadata' or 'annotation'
+ * @param int $user_guid The GUID of the user
+ *
+ * @return bool
+ */
+function can_edit_extender($extender_id, $type, $user_guid = 0) {
+ // @todo Since Elgg 1.0, Elgg has returned false from can_edit_extender()
+ // if no user was logged in. This breaks the access override. This is a
+ // temporary work around. This function needs to be rewritten in Elgg 1.9
+ if (!elgg_check_access_overrides($user_guid)) {
+ if (!elgg_is_logged_in()) {
+ return false;
+ }
+ }
+
+ $user_guid = (int)$user_guid;
+ $user = get_user($user_guid);
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $functionname = "elgg_get_{$type}_from_id";
+ if (is_callable($functionname)) {
+ $extender = call_user_func($functionname, $extender_id);
+ } else {
+ return false;
+ }
+
+ if (!($extender instanceof ElggExtender)) {
+ return false;
+ }
+ /* @var ElggExtender $extender */
+
+ // If the owner is the specified user, great! They can edit.
+ if ($extender->getOwnerGUID() == $user_guid) {
+ return true;
+ }
+
+ // If the user can edit the entity this is attached to, great! They can edit.
+ if (can_edit_entity($extender->entity_guid, $user_guid)) {
+ return true;
+ }
+
+ // Trigger plugin hook - note that $user may be null
+ $params = array('entity' => $extender->getEntity(), 'user' => $user);
+ return elgg_trigger_plugin_hook('permissions_check', $type, $params, false);
+}
+
+/**
+ * Sets the URL handler for a particular extender type and name.
+ * It is recommended that you do not call this directly, instead use
+ * one of the wrapper functions such as elgg_register_annotation_url_handler().
+ *
+ * @param string $extender_type Extender type ('annotation', 'metadata')
+ * @param string $extender_name The name of the extender
+ * @param string $function_name The function to register
+ *
+ * @return bool
+ */
+function elgg_register_extender_url_handler($extender_type, $extender_name, $function_name) {
+
+ global $CONFIG;
+
+ if (!is_callable($function_name, true)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->extender_url_handler)) {
+ $CONFIG->extender_url_handler = array();
+ }
+ if (!isset($CONFIG->extender_url_handler[$extender_type])) {
+ $CONFIG->extender_url_handler[$extender_type] = array();
+ }
+ $CONFIG->extender_url_handler[$extender_type][$extender_name] = $function_name;
+
+ return true;
+}
+
+/**
+ * Get the URL of a given elgg extender.
+ * Used by get_annotation_url and get_metadata_url.
+ *
+ * @param ElggExtender $extender An extender object
+ *
+ * @return string
+ */
+function get_extender_url(ElggExtender $extender) {
+ global $CONFIG;
+
+ $view = elgg_get_viewtype();
+
+ $guid = $extender->entity_guid;
+ $type = $extender->type;
+
+ $url = "";
+
+ $function = "";
+ if (isset($CONFIG->extender_url_handler[$type][$extender->name])) {
+ $function = $CONFIG->extender_url_handler[$type][$extender->name];
+ }
+
+ if (isset($CONFIG->extender_url_handler[$type]['all'])) {
+ $function = $CONFIG->extender_url_handler[$type]['all'];
+ }
+
+ if (isset($CONFIG->extender_url_handler['all']['all'])) {
+ $function = $CONFIG->extender_url_handler['all']['all'];
+ }
+
+ if (is_callable($function)) {
+ $url = call_user_func($function, $extender);
+ }
+
+ if ($url == "") {
+ $nameid = $extender->id;
+ if ($type == 'volatile') {
+ $nameid = $extender->name;
+ }
+ $url = "export/$view/$guid/$type/$nameid/";
+ }
+
+ return elgg_normalize_url($url);
+}
+
+/** Register the hook */
+elgg_register_plugin_hook_handler("import", "all", "import_extender_plugin_hook", 2);
diff --git a/engine/lib/filestore.php b/engine/lib/filestore.php
new file mode 100644
index 000000000..a3c7ba439
--- /dev/null
+++ b/engine/lib/filestore.php
@@ -0,0 +1,520 @@
+<?php
+/**
+ * Elgg filestore.
+ * This file contains classes, interfaces and functions for
+ * saving and retrieving data to various file stores.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.FileStorage
+ */
+
+/**
+ * Get the size of the specified directory.
+ *
+ * @param string $dir The full path of the directory
+ * @param int $totalsize Add to current dir size
+ *
+ * @return int The size of the directory.
+ */
+function get_dir_size($dir, $totalsize = 0) {
+ $handle = @opendir($dir);
+ while ($file = @readdir($handle)) {
+ if (eregi("^\.{1,2}$", $file)) {
+ continue;
+ }
+ if (is_dir($dir . $file)) {
+ $totalsize = get_dir_size($dir . $file . "/", $totalsize);
+ } else {
+ $totalsize += filesize($dir . $file);
+ }
+ }
+ @closedir($handle);
+
+ return($totalsize);
+}
+
+/**
+ * Get the contents of an uploaded file.
+ * (Returns false if there was an issue.)
+ *
+ * @param string $input_name The name of the file input field on the submission form
+ *
+ * @return mixed|false The contents of the file, or false on failure.
+ */
+function get_uploaded_file($input_name) {
+ // If the file exists ...
+ if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
+ return file_get_contents($_FILES[$input_name]['tmp_name']);
+ }
+ return false;
+}
+
+/**
+ * Gets the jpeg contents of the resized version of an uploaded image
+ * (Returns false if the uploaded file was not an image)
+ *
+ * @param string $input_name The name of the file input field on the submission form
+ * @param int $maxwidth The maximum width of the resized image
+ * @param int $maxheight The maximum height of the resized image
+ * @param bool $square If set to true, will take the smallest
+ * of maxwidth and maxheight and use it to set the
+ * dimensions on all size; the image will be cropped.
+ * @param bool $upscale Resize images smaller than $maxwidth x $maxheight?
+ *
+ * @return false|mixed The contents of the resized image, or false on failure
+ */
+function get_resized_image_from_uploaded_file($input_name, $maxwidth, $maxheight,
+$square = false, $upscale = false) {
+
+ // If our file exists ...
+ if (isset($_FILES[$input_name]) && $_FILES[$input_name]['error'] == 0) {
+ return get_resized_image_from_existing_file($_FILES[$input_name]['tmp_name'], $maxwidth,
+ $maxheight, $square, 0, 0, 0, 0, $upscale);
+ }
+
+ return false;
+}
+
+/**
+ * Gets the jpeg contents of the resized version of an already uploaded image
+ * (Returns false if the file was not an image)
+ *
+ * @param string $input_name The name of the file on the disk
+ * @param int $maxwidth The desired width of the resized image
+ * @param int $maxheight The desired height of the resized image
+ * @param bool $square If set to true, takes the smallest of maxwidth and
+ * maxheight and use it to set the dimensions on the new image.
+ * If no crop parameters are set, the largest square that fits
+ * in the image centered will be used for the resize. If square,
+ * the crop must be a square region.
+ * @param int $x1 x coordinate for top, left corner
+ * @param int $y1 y coordinate for top, left corner
+ * @param int $x2 x coordinate for bottom, right corner
+ * @param int $y2 y coordinate for bottom, right corner
+ * @param bool $upscale Resize images smaller than $maxwidth x $maxheight?
+ *
+ * @return false|mixed The contents of the resized image, or false on failure
+ */
+function get_resized_image_from_existing_file($input_name, $maxwidth, $maxheight, $square = FALSE,
+$x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0, $upscale = FALSE) {
+
+ // Get the size information from the image
+ $imgsizearray = getimagesize($input_name);
+ if ($imgsizearray == FALSE) {
+ return FALSE;
+ }
+
+ $width = $imgsizearray[0];
+ $height = $imgsizearray[1];
+
+ $accepted_formats = array(
+ 'image/jpeg' => 'jpeg',
+ 'image/pjpeg' => 'jpeg',
+ 'image/png' => 'png',
+ 'image/x-png' => 'png',
+ 'image/gif' => 'gif'
+ );
+
+ // make sure the function is available
+ $load_function = "imagecreatefrom" . $accepted_formats[$imgsizearray['mime']];
+ if (!is_callable($load_function)) {
+ return FALSE;
+ }
+
+ // get the parameters for resizing the image
+ $options = array(
+ 'maxwidth' => $maxwidth,
+ 'maxheight' => $maxheight,
+ 'square' => $square,
+ 'upscale' => $upscale,
+ 'x1' => $x1,
+ 'y1' => $y1,
+ 'x2' => $x2,
+ 'y2' => $y2,
+ );
+ $params = get_image_resize_parameters($width, $height, $options);
+ if ($params == FALSE) {
+ return FALSE;
+ }
+
+ // load original image
+ $original_image = $load_function($input_name);
+ if (!$original_image) {
+ return FALSE;
+ }
+
+ // allocate the new image
+ $new_image = imagecreatetruecolor($params['newwidth'], $params['newheight']);
+ if (!$new_image) {
+ return FALSE;
+ }
+
+ // color transparencies white (default is black)
+ imagefilledrectangle(
+ $new_image, 0, 0, $params['newwidth'], $params['newheight'],
+ imagecolorallocate($new_image, 255, 255, 255)
+ );
+
+ $rtn_code = imagecopyresampled( $new_image,
+ $original_image,
+ 0,
+ 0,
+ $params['xoffset'],
+ $params['yoffset'],
+ $params['newwidth'],
+ $params['newheight'],
+ $params['selectionwidth'],
+ $params['selectionheight']);
+ if (!$rtn_code) {
+ return FALSE;
+ }
+
+ // grab a compressed jpeg version of the image
+ ob_start();
+ imagejpeg($new_image, NULL, 90);
+ $jpeg = ob_get_clean();
+
+ imagedestroy($new_image);
+ imagedestroy($original_image);
+
+ return $jpeg;
+}
+
+/**
+ * Calculate the parameters for resizing an image
+ *
+ * @param int $width Width of the original image
+ * @param int $height Height of the original image
+ * @param array $options See $defaults for the options
+ *
+ * @return array or FALSE
+ * @since 1.7.2
+ */
+function get_image_resize_parameters($width, $height, $options) {
+
+ $defaults = array(
+ 'maxwidth' => 100,
+ 'maxheight' => 100,
+
+ 'square' => FALSE,
+ 'upscale' => FALSE,
+
+ 'x1' => 0,
+ 'y1' => 0,
+ 'x2' => 0,
+ 'y2' => 0,
+ );
+
+ $options = array_merge($defaults, $options);
+
+ extract($options);
+
+ // crop image first?
+ $crop = TRUE;
+ if ($x1 == 0 && $y1 == 0 && $x2 == 0 && $y2 == 0) {
+ $crop = FALSE;
+ }
+
+ // how large a section of the image has been selected
+ if ($crop) {
+ $selection_width = $x2 - $x1;
+ $selection_height = $y2 - $y1;
+ } else {
+ // everything selected if no crop parameters
+ $selection_width = $width;
+ $selection_height = $height;
+ }
+
+ // determine cropping offsets
+ if ($square) {
+ // asking for a square image back
+
+ // detect case where someone is passing crop parameters that are not for a square
+ if ($crop == TRUE && $selection_width != $selection_height) {
+ return FALSE;
+ }
+
+ // size of the new square image
+ $new_width = $new_height = min($maxwidth, $maxheight);
+
+ // find largest square that fits within the selected region
+ $selection_width = $selection_height = min($selection_width, $selection_height);
+
+ // set offsets for crop
+ if ($crop) {
+ $widthoffset = $x1;
+ $heightoffset = $y1;
+ $width = $x2 - $x1;
+ $height = $width;
+ } else {
+ // place square region in the center
+ $widthoffset = floor(($width - $selection_width) / 2);
+ $heightoffset = floor(($height - $selection_height) / 2);
+ }
+ } else {
+ // non-square new image
+ $new_width = $maxwidth;
+ $new_height = $maxheight;
+
+ // maintain aspect ratio of original image/crop
+ if (($selection_height / (float)$new_height) > ($selection_width / (float)$new_width)) {
+ $new_width = floor($new_height * $selection_width / (float)$selection_height);
+ } else {
+ $new_height = floor($new_width * $selection_height / (float)$selection_width);
+ }
+
+ // by default, use entire image
+ $widthoffset = 0;
+ $heightoffset = 0;
+
+ if ($crop) {
+ $widthoffset = $x1;
+ $heightoffset = $y1;
+ }
+ }
+
+ if (!$upscale && ($selection_height < $new_height || $selection_width < $new_width)) {
+ // we cannot upscale and selected area is too small so we decrease size of returned image
+ if ($square) {
+ $new_height = $selection_height;
+ $new_width = $selection_width;
+ } else {
+ if ($selection_height < $new_height && $selection_width < $new_width) {
+ $new_height = $selection_height;
+ $new_width = $selection_width;
+ }
+ }
+ }
+
+ $params = array(
+ 'newwidth' => $new_width,
+ 'newheight' => $new_height,
+ 'selectionwidth' => $selection_width,
+ 'selectionheight' => $selection_height,
+ 'xoffset' => $widthoffset,
+ 'yoffset' => $heightoffset,
+ );
+
+ return $params;
+}
+
+/**
+ * Delete an ElggFile file
+ *
+ * @param int $guid ElggFile GUID
+ *
+ * @return bool
+ */
+function file_delete($guid) {
+ if ($file = get_entity($guid)) {
+ if ($file->canEdit()) {
+ $thumbnail = $file->thumbnail;
+ $smallthumb = $file->smallthumb;
+ $largethumb = $file->largethumb;
+ if ($thumbnail) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($thumbnail);
+ $delfile->delete();
+ }
+ if ($smallthumb) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($smallthumb);
+ $delfile->delete();
+ }
+ if ($largethumb) {
+ $delfile = new ElggFile();
+ $delfile->owner_guid = $file->owner_guid;
+ $delfile->setFilename($largethumb);
+ $delfile->delete();
+ }
+
+ return $file->delete();
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Returns an overall file type from the mimetype
+ *
+ * @param string $mimetype The MIME type
+ *
+ * @return string The overall type
+ */
+function file_get_general_file_type($mimetype) {
+ switch($mimetype) {
+
+ case "application/msword":
+ return "document";
+ break;
+ case "application/pdf":
+ return "document";
+ break;
+ }
+
+ if (substr_count($mimetype, 'text/')) {
+ return "document";
+ }
+
+ if (substr_count($mimetype, 'audio/')) {
+ return "audio";
+ }
+
+ if (substr_count($mimetype, 'image/')) {
+ return "image";
+ }
+
+ if (substr_count($mimetype, 'video/')) {
+ return "video";
+ }
+
+ if (substr_count($mimetype, 'opendocument')) {
+ return "document";
+ }
+
+ return "general";
+}
+
+/**
+ * Delete a directory and all its contents
+ *
+ * @param string $directory Directory to delete
+ *
+ * @return bool
+ */
+function delete_directory($directory) {
+ // sanity check: must be a directory
+ if (!$handle = opendir($directory)) {
+ return FALSE;
+ }
+
+ // loop through all files
+ while (($file = readdir($handle)) !== FALSE) {
+ if (in_array($file, array('.', '..'))) {
+ continue;
+ }
+
+ $path = "$directory/$file";
+ if (is_dir($path)) {
+ // recurse down through directory
+ if (!delete_directory($path)) {
+ return FALSE;
+ }
+ } else {
+ // delete file
+ unlink($path);
+ }
+ }
+
+ // remove empty directory
+ closedir($handle);
+ return rmdir($directory);
+}
+
+/**
+ * Removes all user files
+ *
+ * @warning This only deletes the physical files and not their entities.
+ * This will result in FileExceptions being thrown. Don't use this function.
+ *
+ * @param ElggUser $user And ElggUser
+ *
+ * @return void
+ */
+function clear_user_files($user) {
+ global $CONFIG;
+
+ $time_created = date('Y/m/d', (int)$user->time_created);
+ $file_path = "$CONFIG->dataroot$time_created/$user->guid";
+ if (file_exists($file_path)) {
+ delete_directory($file_path);
+ }
+}
+
+
+/// Variable holding the default datastore
+$DEFAULT_FILE_STORE = NULL;
+
+/**
+ * Return the default filestore.
+ *
+ * @return ElggFilestore
+ */
+function get_default_filestore() {
+ global $DEFAULT_FILE_STORE;
+
+ return $DEFAULT_FILE_STORE;
+}
+
+/**
+ * Set the default filestore for the system.
+ *
+ * @param ElggFilestore $filestore An ElggFilestore object.
+ *
+ * @return true
+ */
+function set_default_filestore(ElggFilestore $filestore) {
+ global $DEFAULT_FILE_STORE;
+
+ $DEFAULT_FILE_STORE = $filestore;
+
+ return true;
+}
+
+/**
+ * Register entity type objects, subtype file as
+ * ElggFile.
+ *
+ * @return void
+ * @access private
+ */
+function filestore_run_once() {
+ // Register a class
+ add_subtype("object", "file", "ElggFile");
+}
+
+/**
+ * Initialise the file modules.
+ * Listens to system init and configures the default filestore
+ *
+ * @return void
+ * @access private
+ */
+function filestore_init() {
+ global $CONFIG;
+
+ // Now register a default filestore
+ if (isset($CONFIG->dataroot)) {
+ set_default_filestore(new ElggDiskFilestore($CONFIG->dataroot));
+ }
+
+ // Now run this stuff, but only once
+ run_function_once("filestore_run_once");
+}
+
+/**
+ * Unit tests for files
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function filestore_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = "{$CONFIG->path}engine/tests/objects/filestore.php";
+ return $value;
+}
+
+
+// Register a startup event
+elgg_register_event_handler('init', 'system', 'filestore_init', 100);
+
+// Unit testing
+elgg_register_plugin_hook_handler('unit_test', 'system', 'filestore_test');
diff --git a/engine/lib/group.php b/engine/lib/group.php
new file mode 100644
index 000000000..6ded8a825
--- /dev/null
+++ b/engine/lib/group.php
@@ -0,0 +1,341 @@
+<?php
+/**
+ * Elgg Groups.
+ * Groups contain other entities, or rather act as a placeholder for other entities to
+ * mark any given container as their container.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Group
+ */
+
+/**
+ * Get the group entity.
+ *
+ * @param int $guid GUID for a group
+ *
+ * @return array|false
+ * @access private
+ */
+function get_group_entity_as_row($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}groups_entity where guid=$guid");
+}
+
+/**
+ * Create or update the entities table for a given group.
+ * Call create_entity first.
+ *
+ * @param int $guid GUID
+ * @param string $name Name
+ * @param string $description Description
+ *
+ * @return bool
+ * @access private
+ */
+function create_group_entity($guid, $name, $description) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $name = sanitise_string($name);
+ $description = sanitise_string($description);
+
+ $row = get_entity_as_row($guid);
+
+ if ($row) {
+ // Exists and you have access to it
+ $exists = get_data_row("SELECT guid from {$CONFIG->dbprefix}groups_entity WHERE guid = {$guid}");
+ if ($exists) {
+ $query = "UPDATE {$CONFIG->dbprefix}groups_entity set"
+ . " name='$name', description='$description' where guid=$guid";
+ $result = update_data($query);
+ if ($result != false) {
+ // Update succeeded, continue
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('update', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ } else {
+ // Update failed, attempt an insert.
+ $query = "INSERT into {$CONFIG->dbprefix}groups_entity"
+ . " (guid, name, description) values ($guid, '$name', '$description')";
+
+ $result = insert_data($query);
+ if ($result !== false) {
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('create', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Add an object to the given group.
+ *
+ * @param int $group_guid The group to add the object to.
+ * @param int $object_guid The guid of the elgg object (must be ElggObject or a child thereof)
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+function add_object_to_group($group_guid, $object_guid) {
+ $group_guid = (int)$group_guid;
+ $object_guid = (int)$object_guid;
+
+ $group = get_entity($group_guid);
+ $object = get_entity($object_guid);
+
+ if ((!$group) || (!$object)) {
+ return false;
+ }
+
+ if (!($group instanceof ElggGroup)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($group_guid, 'ElggGroup'));
+ throw new InvalidClassException($msg);
+ }
+
+ if (!($object instanceof ElggObject)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($object_guid, 'ElggObject'));
+ throw new InvalidClassException($msg);
+ }
+
+ $object->container_guid = $group_guid;
+ return $object->save();
+}
+
+/**
+ * Remove an object from the given group.
+ *
+ * @param int $group_guid The group to remove the object from
+ * @param int $object_guid The object to remove
+ *
+ * @return bool
+ * @throws InvalidClassException
+ */
+function remove_object_from_group($group_guid, $object_guid) {
+ $group_guid = (int)$group_guid;
+ $object_guid = (int)$object_guid;
+
+ $group = get_entity($group_guid);
+ $object = get_entity($object_guid);
+
+ if ((!$group) || (!$object)) {
+ return false;
+ }
+
+ if (!($group instanceof ElggGroup)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($group_guid, 'ElggGroup'));
+ throw new InvalidClassException($msg);
+ }
+
+ if (!($object instanceof ElggObject)) {
+ $msg = elgg_echo('InvalidClassException:NotValidElggStar', array($object_guid, 'ElggObject'));
+ throw new InvalidClassException($msg);
+ }
+
+ $object->container_guid = $object->owner_guid;
+ return $object->save();
+}
+
+/**
+ * Return a list of this group's members.
+ *
+ * @param int $group_guid The ID of the container/group.
+ * @param int $limit The limit
+ * @param int $offset The offset
+ * @param int $site_guid The site
+ * @param bool $count Return the users (false) or the count of them (true)
+ *
+ * @return mixed
+ */
+function get_group_members($group_guid, $limit = 10, $offset = 0, $site_guid = 0, $count = false) {
+
+ // in 1.7 0 means "not set." rewrite to make sense.
+ if (!$site_guid) {
+ $site_guid = ELGG_ENTITIES_ANY_VALUE;
+ }
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member',
+ 'relationship_guid' => $group_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'count' => $count,
+ 'site_guid' => $site_guid
+ ));
+}
+
+/**
+ * Return whether a given user is a member of the group or not.
+ *
+ * @param int $group_guid The group ID
+ * @param int $user_guid The user guid
+ *
+ * @return bool
+ */
+function is_group_member($group_guid, $user_guid) {
+ $object = check_entity_relationship($user_guid, 'member', $group_guid);
+ if ($object) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Join a user to a group.
+ *
+ * @param int $group_guid The group GUID.
+ * @param int $user_guid The user GUID.
+ *
+ * @return bool
+ */
+function join_group($group_guid, $user_guid) {
+ $result = add_entity_relationship($user_guid, 'member', $group_guid);
+
+ if ($result) {
+ $params = array('group' => get_entity($group_guid), 'user' => get_entity($user_guid));
+ elgg_trigger_event('join', 'group', $params);
+ }
+
+ return $result;
+}
+
+/**
+ * Remove a user from a group.
+ *
+ * @param int $group_guid The group.
+ * @param int $user_guid The user.
+ *
+ * @return bool
+ */
+function leave_group($group_guid, $user_guid) {
+ // event needs to be triggered while user is still member of group to have access to group acl
+ $params = array('group' => get_entity($group_guid), 'user' => get_entity($user_guid));
+
+ elgg_trigger_event('leave', 'group', $params);
+ $result = remove_entity_relationship($user_guid, 'member', $group_guid);
+ return $result;
+}
+
+/**
+ * Return all groups a user is a member of.
+ *
+ * @param int $user_guid GUID of user
+ *
+ * @return array|false
+ */
+function get_users_membership($user_guid) {
+ $options = array(
+ 'type' => 'group',
+ 'relationship' => 'member',
+ 'relationship_guid' => $user_guid,
+ 'inverse_relationship' => false,
+ 'limit' => false,
+ );
+ return elgg_get_entities_from_relationship($options);
+}
+
+/**
+ * May the current user access item(s) on this page? If the page owner is a group,
+ * membership, visibility, and logged in status are taken into account.
+ *
+ * @param boolean $forward If set to true (default), will forward the page;
+ * if set to false, will return true or false.
+ *
+ * @return bool If $forward is set to false.
+ */
+function group_gatekeeper($forward = true) {
+
+ $page_owner_guid = elgg_get_page_owner_guid();
+ if (!$page_owner_guid) {
+ return true;
+ }
+ $visibility = ElggGroupItemVisibility::factory($page_owner_guid);
+
+ if (!$visibility->shouldHideItems) {
+ return true;
+ }
+ if ($forward) {
+ // only forward to group if user can see it
+ $group = get_entity($page_owner_guid);
+ $forward_url = $group ? $group->getURL() : '';
+
+ if (!elgg_is_logged_in()) {
+ $_SESSION['last_forward_from'] = current_page_url();
+ $forward_reason = 'login';
+ } else {
+ $forward_reason = 'member';
+ }
+
+ register_error(elgg_echo($visibility->reasonHidden));
+ forward($forward_url, $forward_reason);
+ }
+
+ return false;
+}
+
+/**
+ * Adds a group tool option
+ *
+ * @see remove_group_tool_option().
+ *
+ * @param string $name Name of the group tool option
+ * @param string $label Used for the group edit form
+ * @param bool $default_on True if this option should be active by default
+ *
+ * @return void
+ * @since 1.5.0
+ */
+function add_group_tool_option($name, $label, $default_on = true) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->group_tool_options)) {
+ $CONFIG->group_tool_options = array();
+ }
+
+ $group_tool_option = new stdClass;
+
+ $group_tool_option->name = $name;
+ $group_tool_option->label = $label;
+ $group_tool_option->default_on = $default_on;
+
+ $CONFIG->group_tool_options[] = $group_tool_option;
+}
+
+/**
+ * Removes a group tool option based on name
+ *
+ * @see add_group_tool_option()
+ *
+ * @param string $name Name of the group tool option
+ *
+ * @return void
+ * @since 1.7.5
+ */
+function remove_group_tool_option($name) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->group_tool_options)) {
+ return;
+ }
+
+ foreach ($CONFIG->group_tool_options as $i => $option) {
+ if ($option->name == $name) {
+ unset($CONFIG->group_tool_options[$i]);
+ }
+ }
+}
diff --git a/engine/lib/input.php b/engine/lib/input.php
new file mode 100644
index 000000000..80b0b8766
--- /dev/null
+++ b/engine/lib/input.php
@@ -0,0 +1,520 @@
+<?php
+/**
+ * Parameter input functions.
+ * This file contains functions for getting input from get/post variables.
+ *
+ * @package Elgg.Core
+ * @subpackage Input
+ */
+
+/**
+ * Get some input from variables passed submitted through GET or POST.
+ *
+ * If using any data obtained from get_input() in a web page, please be aware that
+ * it is a possible vector for a reflected XSS attack. If you are expecting an
+ * integer, cast it to an int. If it is a string, escape quotes.
+ *
+ * Note: this function does not handle nested arrays (ex: form input of param[m][n])
+ * because of the filtering done in htmlawed from the filter_tags call.
+ * @todo Is this ^ still true?
+ *
+ * @param string $variable The variable name we want.
+ * @param mixed $default A default value for the variable if it is not found.
+ * @param bool $filter_result If true, then the result is filtered for bad tags.
+ *
+ * @return mixed
+ */
+function get_input($variable, $default = NULL, $filter_result = TRUE) {
+
+ global $CONFIG;
+
+ $result = $default;
+
+ elgg_push_context('input');
+
+ if (isset($CONFIG->input[$variable])) {
+ $result = $CONFIG->input[$variable];
+
+ if ($filter_result) {
+ $result = filter_tags($result);
+ }
+ } elseif (isset($_REQUEST[$variable])) {
+ if (is_array($_REQUEST[$variable])) {
+ $result = $_REQUEST[$variable];
+ } else {
+ $result = trim($_REQUEST[$variable]);
+ }
+
+ if ($filter_result) {
+ $result = filter_tags($result);
+ }
+ }
+
+ elgg_pop_context();
+
+ return $result;
+}
+
+/**
+ * Sets an input value that may later be retrieved by get_input
+ *
+ * Note: this function does not handle nested arrays (ex: form input of param[m][n])
+ *
+ * @param string $variable The name of the variable
+ * @param string|string[] $value The value of the variable
+ *
+ * @return void
+ */
+function set_input($variable, $value) {
+ global $CONFIG;
+ if (!isset($CONFIG->input)) {
+ $CONFIG->input = array();
+ }
+
+ if (is_array($value)) {
+ array_walk_recursive($value, create_function('&$v, $k', '$v = trim($v);'));
+ $CONFIG->input[trim($variable)] = $value;
+ } else {
+ $CONFIG->input[trim($variable)] = trim($value);
+ }
+}
+
+/**
+ * Filter tags from a given string based on registered hooks.
+ *
+ * @param mixed $var Anything that does not include an object (strings, ints, arrays)
+ * This includes multi-dimensional arrays.
+ *
+ * @return mixed The filtered result - everything will be strings
+ */
+function filter_tags($var) {
+ return elgg_trigger_plugin_hook('validate', 'input', null, $var);
+}
+
+/**
+ * Validates an email address.
+ *
+ * @param string $address Email address.
+ *
+ * @return bool
+ */
+function is_email_address($address) {
+ return filter_var($address, FILTER_VALIDATE_EMAIL) === $address;
+}
+
+/**
+ * Load all the REQUEST variables into the sticky form cache
+ *
+ * Call this from an action when you want all your submitted variables
+ * available if the submission fails validation and is sent back to the form
+ *
+ * @param string $form_name Name of the sticky form
+ *
+ * @return void
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ * @since 1.8.0
+ */
+function elgg_make_sticky_form($form_name) {
+
+ elgg_clear_sticky_form($form_name);
+
+ if (!isset($_SESSION['sticky_forms'])) {
+ $_SESSION['sticky_forms'] = array();
+ }
+ $_SESSION['sticky_forms'][$form_name] = array();
+
+ foreach ($_REQUEST as $key => $var) {
+ // will go through XSS filtering on the get function
+ $_SESSION['sticky_forms'][$form_name][$key] = $var;
+ }
+}
+
+/**
+ * Clear the sticky form cache
+ *
+ * Call this if validation is successful in the action handler or
+ * when they sticky values have been used to repopulate the form
+ * after a validation error.
+ *
+ * @param string $form_name Form namespace
+ *
+ * @return void
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ * @since 1.8.0
+ */
+function elgg_clear_sticky_form($form_name) {
+ unset($_SESSION['sticky_forms'][$form_name]);
+}
+
+/**
+ * Has this form been made sticky?
+ *
+ * @param string $form_name Form namespace
+ *
+ * @return boolean
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ * @since 1.8.0
+ */
+function elgg_is_sticky_form($form_name) {
+ return isset($_SESSION['sticky_forms'][$form_name]);
+}
+
+/**
+ * Get a specific sticky variable
+ *
+ * @param string $form_name The name of the form
+ * @param string $variable The name of the variable
+ * @param mixed $default Default value if the variable does not exist in sticky cache
+ * @param boolean $filter_result Filter for bad input if true
+ *
+ * @return mixed
+ *
+ * @todo should this filter the default value?
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ * @since 1.8.0
+ */
+function elgg_get_sticky_value($form_name, $variable = '', $default = NULL, $filter_result = true) {
+ if (isset($_SESSION['sticky_forms'][$form_name][$variable])) {
+ $value = $_SESSION['sticky_forms'][$form_name][$variable];
+ if ($filter_result) {
+ // XSS filter result
+ $value = filter_tags($value);
+ }
+ return $value;
+ }
+ return $default;
+}
+
+/**
+ * Get all the values in a sticky form in an array
+ *
+ * @param string $form_name The name of the form
+ * @param bool $filter_result Filter for bad input if true
+ *
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_sticky_values($form_name, $filter_result = true) {
+ if (!isset($_SESSION['sticky_forms'][$form_name])) {
+ return array();
+ }
+
+ $values = $_SESSION['sticky_forms'][$form_name];
+ if ($filter_result) {
+ foreach ($values as $key => $value) {
+ // XSS filter result
+ $values[$key] = filter_tags($value);
+ }
+ }
+ return $values;
+}
+
+/**
+ * Clear a specific sticky variable
+ *
+ * @param string $form_name The name of the form
+ * @param string $variable The name of the variable to clear
+ *
+ * @return void
+ * @link http://docs.elgg.org/Tutorials/UI/StickyForms
+ * @since 1.8.0
+ */
+function elgg_clear_sticky_value($form_name, $variable) {
+ unset($_SESSION['sticky_forms'][$form_name][$variable]);
+}
+
+/**
+ * Page handler for autocomplete endpoint.
+ *
+ * @todo split this into functions/objects, this is way too big
+ *
+ * /livesearch?q=<query>
+ *
+ * Other options include:
+ * match_on string all or array(groups|users|friends)
+ * match_owner int 0/1
+ * limit int default is 10
+ *
+ * @param array $page
+ * @return string JSON string is returned and then exit
+ * @access private
+ */
+function input_livesearch_page_handler($page) {
+ global $CONFIG;
+
+ // only return results to logged in users.
+ if (!$user = elgg_get_logged_in_user_entity()) {
+ exit;
+ }
+
+ if (!$q = get_input('term', get_input('q'))) {
+ exit;
+ }
+
+ $q = sanitise_string($q);
+
+ // replace mysql vars with escaped strings
+ $q = str_replace(array('_', '%'), array('\_', '\%'), $q);
+
+ $match_on = get_input('match_on', 'all');
+
+ if (!is_array($match_on)) {
+ $match_on = array($match_on);
+ }
+
+ // all = users and groups
+ if (in_array('all', $match_on)) {
+ $match_on = array('users', 'groups');
+ }
+
+ if (get_input('match_owner', false)) {
+ $owner_where = 'AND e.owner_guid = ' . $user->getGUID();
+ } else {
+ $owner_where = '';
+ }
+
+ $limit = sanitise_int(get_input('limit', 10));
+
+ // grab a list of entities and send them in json.
+ $results = array();
+ foreach ($match_on as $match_type) {
+ switch ($match_type) {
+ case 'users':
+ $query = "SELECT * FROM {$CONFIG->dbprefix}users_entity as ue, {$CONFIG->dbprefix}entities as e
+ WHERE e.guid = ue.guid
+ AND e.enabled = 'yes'
+ AND ue.banned = 'no'
+ AND (ue.name LIKE '$q%' OR ue.name LIKE '% $q%' OR ue.username LIKE '$q%')
+ LIMIT $limit
+ ";
+
+ if ($entities = get_data($query)) {
+ foreach ($entities as $entity) {
+ // @todo use elgg_get_entities (don't query in a loop!)
+ $entity = get_entity($entity->guid);
+ /* @var ElggUser $entity */
+ if (!$entity) {
+ continue;
+ }
+
+ if (in_array('groups', $match_on)) {
+ $value = $entity->guid;
+ } else {
+ $value = $entity->username;
+ }
+
+ $output = elgg_view_list_item($entity, array(
+ 'use_hover' => false,
+ 'class' => 'elgg-autocomplete-item',
+ ));
+
+ $icon = elgg_view_entity_icon($entity, 'tiny', array(
+ 'use_hover' => false,
+ ));
+
+ $result = array(
+ 'type' => 'user',
+ 'name' => $entity->name,
+ 'desc' => $entity->username,
+ 'guid' => $entity->guid,
+ 'label' => $output,
+ 'value' => $value,
+ 'icon' => $icon,
+ 'url' => $entity->getURL(),
+ );
+ $results[$entity->name . rand(1, 100)] = $result;
+ }
+ }
+ break;
+
+ case 'groups':
+ // don't return results if groups aren't enabled.
+ if (!elgg_is_active_plugin('groups')) {
+ continue;
+ }
+ $query = "SELECT * FROM {$CONFIG->dbprefix}groups_entity as ge, {$CONFIG->dbprefix}entities as e
+ WHERE e.guid = ge.guid
+ AND e.enabled = 'yes'
+ $owner_where
+ AND (ge.name LIKE '$q%' OR ge.name LIKE '% $q%' OR ge.description LIKE '% $q%')
+ LIMIT $limit
+ ";
+ if ($entities = get_data($query)) {
+ foreach ($entities as $entity) {
+ // @todo use elgg_get_entities (don't query in a loop!)
+ $entity = get_entity($entity->guid);
+ /* @var ElggGroup $entity */
+ if (!$entity) {
+ continue;
+ }
+
+ $output = elgg_view_list_item($entity, array(
+ 'use_hover' => false,
+ 'class' => 'elgg-autocomplete-item',
+ ));
+
+ $icon = elgg_view_entity_icon($entity, 'tiny', array(
+ 'use_hover' => false,
+ ));
+
+ $result = array(
+ 'type' => 'group',
+ 'name' => $entity->name,
+ 'desc' => strip_tags($entity->description),
+ 'guid' => $entity->guid,
+ 'label' => $output,
+ 'value' => $entity->guid,
+ 'icon' => $icon,
+ 'url' => $entity->getURL(),
+ );
+
+ $results[$entity->name . rand(1, 100)] = $result;
+ }
+ }
+ break;
+
+ case 'friends':
+ $query = "SELECT * FROM
+ {$CONFIG->dbprefix}users_entity as ue,
+ {$CONFIG->dbprefix}entity_relationships as er,
+ {$CONFIG->dbprefix}entities as e
+ WHERE er.relationship = 'friend'
+ AND er.guid_one = {$user->getGUID()}
+ AND er.guid_two = ue.guid
+ AND e.guid = ue.guid
+ AND e.enabled = 'yes'
+ AND ue.banned = 'no'
+ AND (ue.name LIKE '$q%' OR ue.name LIKE '% $q%' OR ue.username LIKE '$q%')
+ LIMIT $limit
+ ";
+
+ if ($entities = get_data($query)) {
+ foreach ($entities as $entity) {
+ // @todo use elgg_get_entities (don't query in a loop!)
+ $entity = get_entity($entity->guid);
+ /* @var ElggUser $entity */
+ if (!$entity) {
+ continue;
+ }
+
+ $output = elgg_view_list_item($entity, array(
+ 'use_hover' => false,
+ 'class' => 'elgg-autocomplete-item',
+ ));
+
+ $icon = elgg_view_entity_icon($entity, 'tiny', array(
+ 'use_hover' => false,
+ ));
+
+ $result = array(
+ 'type' => 'user',
+ 'name' => $entity->name,
+ 'desc' => $entity->username,
+ 'guid' => $entity->guid,
+ 'label' => $output,
+ 'value' => $entity->username,
+ 'icon' => $icon,
+ 'url' => $entity->getURL(),
+ );
+ $results[$entity->name . rand(1, 100)] = $result;
+ }
+ }
+ break;
+
+ default:
+ header("HTTP/1.0 400 Bad Request", true);
+ echo "livesearch: unknown match_on of $match_type";
+ exit;
+ break;
+ }
+ }
+
+ ksort($results);
+ header("Content-Type: application/json");
+ echo json_encode(array_values($results));
+ exit;
+}
+
+/**
+ * Register input functions and sanitize input
+ *
+ * @return void
+ * @access private
+ */
+function input_init() {
+ // register an endpoint for live search / autocomplete.
+ elgg_register_page_handler('livesearch', 'input_livesearch_page_handler');
+
+ if (ini_get_bool('magic_quotes_gpc')) {
+
+ /**
+ * do keys as well, cos array_map ignores them
+ *
+ * @param array $array Array of values
+ *
+ * @return array Sanitized array
+ */
+ function stripslashes_arraykeys($array) {
+ if (is_array($array)) {
+ $array2 = array();
+ foreach ($array as $key => $data) {
+ if ($key != stripslashes($key)) {
+ $array2[stripslashes($key)] = $data;
+ } else {
+ $array2[$key] = $data;
+ }
+ }
+ return $array2;
+ } else {
+ return $array;
+ }
+ }
+
+ /**
+ * Strip slashes on everything
+ *
+ * @param mixed $value The value to remove slashes from
+ *
+ * @return mixed
+ */
+ function stripslashes_deep($value) {
+ if (is_array($value)) {
+ $value = stripslashes_arraykeys($value);
+ $value = array_map('stripslashes_deep', $value);
+ } else {
+ $value = stripslashes($value);
+ }
+ return $value;
+ }
+
+ $_POST = stripslashes_arraykeys($_POST);
+ $_GET = stripslashes_arraykeys($_GET);
+ $_COOKIE = stripslashes_arraykeys($_COOKIE);
+ $_REQUEST = stripslashes_arraykeys($_REQUEST);
+
+ $_POST = array_map('stripslashes_deep', $_POST);
+ $_GET = array_map('stripslashes_deep', $_GET);
+ $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
+ $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
+ if (!empty($_SERVER['REQUEST_URI'])) {
+ $_SERVER['REQUEST_URI'] = stripslashes($_SERVER['REQUEST_URI']);
+ }
+ if (!empty($_SERVER['QUERY_STRING'])) {
+ $_SERVER['QUERY_STRING'] = stripslashes($_SERVER['QUERY_STRING']);
+ }
+ if (!empty($_SERVER['HTTP_REFERER'])) {
+ $_SERVER['HTTP_REFERER'] = stripslashes($_SERVER['HTTP_REFERER']);
+ }
+ if (!empty($_SERVER['PATH_INFO'])) {
+ $_SERVER['PATH_INFO'] = stripslashes($_SERVER['PATH_INFO']);
+ }
+ if (!empty($_SERVER['PHP_SELF'])) {
+ $_SERVER['PHP_SELF'] = stripslashes($_SERVER['PHP_SELF']);
+ }
+ if (!empty($_SERVER['PATH_TRANSLATED'])) {
+ $_SERVER['PATH_TRANSLATED'] = stripslashes($_SERVER['PATH_TRANSLATED']);
+ }
+ }
+}
+
+elgg_register_event_handler('init', 'system', 'input_init');
diff --git a/engine/lib/languages.php b/engine/lib/languages.php
new file mode 100644
index 000000000..61ba91ddb
--- /dev/null
+++ b/engine/lib/languages.php
@@ -0,0 +1,354 @@
+<?php
+/**
+ * Elgg language module
+ * Functions to manage language and translations.
+ *
+ * @package Elgg.Core
+ * @subpackage Languages
+ */
+
+/**
+ * Given a message key, returns an appropriately translated full-text string
+ *
+ * @param string $message_key The short message code
+ * @param array $args An array of arguments to pass through vsprintf().
+ * @param string $language Optionally, the standard language code
+ * (defaults to site/user default, then English)
+ *
+ * @return string Either the translated string, the English string,
+ * or the original language string.
+ */
+function elgg_echo($message_key, $args = array(), $language = "") {
+ global $CONFIG;
+
+ static $CURRENT_LANGUAGE;
+
+ // old param order is deprecated
+ if (!is_array($args)) {
+ elgg_deprecated_notice(
+ 'As of Elgg 1.8, the 2nd arg to elgg_echo() is an array of string replacements and the 3rd arg is the language.',
+ 1.8
+ );
+
+ $language = $args;
+ $args = array();
+ }
+
+ if (!isset($CONFIG->translations)) {
+ // this means we probably had an exception before translations were initialized
+ register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/");
+ }
+
+ if (!$CURRENT_LANGUAGE) {
+ $CURRENT_LANGUAGE = get_language();
+ }
+ if (!$language) {
+ $language = $CURRENT_LANGUAGE;
+ }
+
+ if (isset($CONFIG->translations[$language][$message_key])) {
+ $string = $CONFIG->translations[$language][$message_key];
+ } else if (isset($CONFIG->translations["en"][$message_key])) {
+ $string = $CONFIG->translations["en"][$message_key];
+ $lang = $CONFIG->translations["en"][$language];
+ elgg_log(sprintf('Missing %s translation for "%s" language key', $lang, $message_key), 'NOTICE');
+ } else {
+ $string = $message_key;
+ elgg_log(sprintf('Missing English translation for "%s" language key', $message_key), 'NOTICE');
+ }
+
+ // only pass through if we have arguments to allow backward compatibility
+ // with manual sprintf() calls.
+ if ($args) {
+ $string = vsprintf($string, $args);
+ }
+
+ return $string;
+}
+
+/**
+ * Add a translation.
+ *
+ * Translations are arrays in the Zend Translation array format, eg:
+ *
+ * $english = array('message1' => 'message1', 'message2' => 'message2');
+ * $german = array('message1' => 'Nachricht1','message2' => 'Nachricht2');
+ *
+ * @param string $country_code Standard country code (eg 'en', 'nl', 'es')
+ * @param array $language_array Formatted array of strings
+ *
+ * @return bool Depending on success
+ */
+function add_translation($country_code, $language_array) {
+ global $CONFIG;
+ if (!isset($CONFIG->translations)) {
+ $CONFIG->translations = array();
+ }
+
+ $country_code = strtolower($country_code);
+ $country_code = trim($country_code);
+ if (is_array($language_array) && sizeof($language_array) > 0 && $country_code != "") {
+ if (!isset($CONFIG->translations[$country_code])) {
+ $CONFIG->translations[$country_code] = $language_array;
+ } else {
+ $CONFIG->translations[$country_code] = $language_array + $CONFIG->translations[$country_code];
+ }
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Detect the current language being used by the current site or logged in user.
+ *
+ * @return string The language code for the site/user or "en" if not set
+ */
+function get_current_language() {
+ $language = get_language();
+
+ if (!$language) {
+ $language = 'en';
+ }
+
+ return $language;
+}
+
+/**
+ * Gets the current language in use by the system or user.
+ *
+ * @return string The language code (eg "en") or false if not set
+ */
+function get_language() {
+ global $CONFIG;
+
+ $user = elgg_get_logged_in_user_entity();
+ $language = false;
+
+ if (($user) && ($user->language)) {
+ $language = $user->language;
+ }
+
+ if ((!$language) && (isset($CONFIG->language)) && ($CONFIG->language)) {
+ $language = $CONFIG->language;
+ }
+
+ if ($language) {
+ return $language;
+ }
+
+ return false;
+}
+
+/**
+ * @access private
+ */
+function _elgg_load_translations() {
+ global $CONFIG;
+
+ if ($CONFIG->system_cache_enabled) {
+ $loaded = true;
+ $languages = array_unique(array('en', get_current_language()));
+ foreach ($languages as $language) {
+ $data = elgg_load_system_cache("$language.lang");
+ if ($data) {
+ add_translation($language, unserialize($data));
+ } else {
+ $loaded = false;
+ }
+ }
+
+ if ($loaded) {
+ $CONFIG->i18n_loaded_from_cache = true;
+ // this is here to force
+ $CONFIG->language_paths[dirname(dirname(dirname(__FILE__))) . "/languages/"] = true;
+ return;
+ }
+ }
+
+ // load core translations from languages directory
+ register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/");
+}
+
+
+
+/**
+ * When given a full path, finds translation files and loads them
+ *
+ * @param string $path Full path
+ * @param bool $load_all If true all languages are loaded, if
+ * false only the current language + en are loaded
+ *
+ * @return bool success
+ */
+function register_translations($path, $load_all = false) {
+ global $CONFIG;
+
+ $path = sanitise_filepath($path);
+
+ // Make a note of this path just incase we need to register this language later
+ if (!isset($CONFIG->language_paths)) {
+ $CONFIG->language_paths = array();
+ }
+ $CONFIG->language_paths[$path] = true;
+
+ // Get the current language based on site defaults and user preference
+ $current_language = get_current_language();
+ elgg_log("Translations loaded from: $path");
+
+ // only load these files unless $load_all is true.
+ $load_language_files = array(
+ 'en.php',
+ "$current_language.php"
+ );
+
+ $load_language_files = array_unique($load_language_files);
+
+ $handle = opendir($path);
+ if (!$handle) {
+ elgg_log("Could not open language path: $path", 'ERROR');
+ return false;
+ }
+
+ $return = true;
+ while (false !== ($language = readdir($handle))) {
+ // ignore bad files
+ if (substr($language, 0, 1) == '.' || substr($language, -4) !== '.php') {
+ continue;
+ }
+
+ if (in_array($language, $load_language_files) || $load_all) {
+ if (!include_once($path . $language)) {
+ $return = false;
+ continue;
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Reload all translations from all registered paths.
+ *
+ * This is only called by functions which need to know all possible translations.
+ *
+ * @todo Better on demand loading based on language_paths array
+ *
+ * @return void
+ */
+function reload_all_translations() {
+ global $CONFIG;
+
+ static $LANG_RELOAD_ALL_RUN;
+ if ($LANG_RELOAD_ALL_RUN) {
+ return;
+ }
+
+ if ($CONFIG->i18n_loaded_from_cache) {
+ $cache = elgg_get_system_cache();
+ $cache_dir = $cache->getVariable("cache_path");
+ $filenames = elgg_get_file_list($cache_dir, array(), array(), array(".lang"));
+ foreach ($filenames as $filename) {
+ if (preg_match('/([a-z]+)\.[^.]+$/', $filename, $matches)) {
+ $language = $matches[1];
+ $data = elgg_load_system_cache("$language.lang");
+ if ($data) {
+ add_translation($language, unserialize($data));
+ }
+ }
+ }
+ } else {
+ foreach ($CONFIG->language_paths as $path => $dummy) {
+ register_translations($path, true);
+ }
+ }
+
+ $LANG_RELOAD_ALL_RUN = true;
+}
+
+/**
+ * Return an array of installed translations as an associative
+ * array "two letter code" => "native language name".
+ *
+ * @return array
+ */
+function get_installed_translations() {
+ global $CONFIG;
+
+ // Ensure that all possible translations are loaded
+ reload_all_translations();
+
+ $installed = array();
+
+ foreach ($CONFIG->translations as $k => $v) {
+ $installed[$k] = elgg_echo($k, array(), $k);
+ if (elgg_is_admin_logged_in()) {
+ $completeness = get_language_completeness($k);
+ if (($completeness < 100) && ($k != 'en')) {
+ $installed[$k] .= " (" . $completeness . "% " . elgg_echo('complete') . ")";
+ }
+ }
+ }
+
+ return $installed;
+}
+
+/**
+ * Return the level of completeness for a given language code (compared to english)
+ *
+ * @param string $language Language
+ *
+ * @return int
+ */
+function get_language_completeness($language) {
+ global $CONFIG;
+
+ // Ensure that all possible translations are loaded
+ reload_all_translations();
+
+ $language = sanitise_string($language);
+
+ $en = count($CONFIG->translations['en']);
+
+ $missing = get_missing_language_keys($language);
+ if ($missing) {
+ $missing = count($missing);
+ } else {
+ $missing = 0;
+ }
+
+ //$lang = count($CONFIG->translations[$language]);
+ $lang = $en - $missing;
+
+ return round(($lang / $en) * 100, 2);
+}
+
+/**
+ * Return the translation keys missing from a given language,
+ * or those that are identical to the english version.
+ *
+ * @param string $language The language
+ *
+ * @return mixed
+ */
+function get_missing_language_keys($language) {
+ global $CONFIG;
+
+ // Ensure that all possible translations are loaded
+ reload_all_translations();
+
+ $missing = array();
+
+ foreach ($CONFIG->translations['en'] as $k => $v) {
+ if ((!isset($CONFIG->translations[$language][$k]))
+ || ($CONFIG->translations[$language][$k] == $CONFIG->translations['en'][$k])) {
+ $missing[] = $k;
+ }
+ }
+
+ if (count($missing)) {
+ return $missing;
+ }
+
+ return false;
+}
diff --git a/engine/lib/location.php b/engine/lib/location.php
new file mode 100644
index 000000000..1534c7d7b
--- /dev/null
+++ b/engine/lib/location.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Elgg geo-location tagging library.
+ *
+ * @package Elgg.Core
+ * @subpackage Location
+ */
+
+/**
+ * Encode a location into a latitude and longitude, caching the result.
+ *
+ * Works by triggering the 'geocode' 'location' plugin
+ * hook, and requires a geocoding plugin to be installed.
+ *
+ * @param string $location The location, e.g. "London", or "24 Foobar Street, Gotham City"
+ * @return string|false
+ */
+function elgg_geocode_location($location) {
+ global $CONFIG;
+
+ if (is_array($location)) {
+ return false;
+ }
+
+ $location = sanitise_string($location);
+
+ // Look for cached version
+ $query = "SELECT * from {$CONFIG->dbprefix}geocode_cache WHERE location='$location'";
+ $cached_location = get_data_row($query);
+
+ if ($cached_location) {
+ return array('lat' => $cached_location->lat, 'long' => $cached_location->long);
+ }
+
+ // Trigger geocode event if not cached
+ $return = false;
+ $return = elgg_trigger_plugin_hook('geocode', 'location', array('location' => $location), $return);
+
+ // If returned, cache and return value
+ if (($return) && (is_array($return))) {
+ $lat = (float)$return['lat'];
+ $long = (float)$return['long'];
+
+ // Put into cache at the end of the page since we don't really care that much
+ $query = "INSERT DELAYED INTO {$CONFIG->dbprefix}geocode_cache "
+ . " (location, lat, `long`) VALUES ('$location', '{$lat}', '{$long}')"
+ . " ON DUPLICATE KEY UPDATE lat='{$lat}', `long`='{$long}'";
+ execute_delayed_write_query($query);
+ }
+
+ return $return;
+}
+
+/**
+ * Return entities within a given geographic area.
+ *
+ * Also accepts all options available to elgg_get_entities().
+ *
+ * @see elgg_get_entities
+ *
+ * @param array $options Array in format:
+ *
+ * latitude => FLOAT Latitude of the location
+ *
+ * longitude => FLOAT Longitude of the location
+ *
+ * distance => FLOAT/ARR (
+ * latitude => float,
+ * longitude => float,
+ * )
+ * The distance in degrees that determines the search box. A
+ * single float will result in a square in degrees.
+ * @warning The Earth is round.
+ *
+ * @see ElggEntity::setLatLong()
+ *
+ * @return mixed If count, int. If not count, array. false on errors.
+ * @since 1.8.0
+ */
+function elgg_get_entities_from_location(array $options = array()) {
+
+ global $CONFIG;
+
+ if (!isset($options['latitude']) || !isset($options['longitude']) ||
+ !isset($options['distance'])) {
+ return false;
+ }
+
+ if (!is_array($options['distance'])) {
+ $lat_distance = (float)$options['distance'];
+ $long_distance = (float)$options['distance'];
+ } else {
+ $lat_distance = (float)$options['distance']['latitude'];
+ $long_distance = (float)$options['distance']['longitude'];
+ }
+
+ $lat = (float)$options['latitude'];
+ $long = (float)$options['longitude'];
+ $lat_min = $lat - $lat_distance;
+ $lat_max = $lat + $lat_distance;
+ $long_min = $long - $long_distance;
+ $long_max = $long + $long_distance;
+
+ $wheres = array();
+ $wheres[] = "lat_name.string='geo:lat'";
+ $wheres[] = "lat_value.string >= $lat_min";
+ $wheres[] = "lat_value.string <= $lat_max";
+ $wheres[] = "lon_name.string='geo:long'";
+ $wheres[] = "lon_value.string >= $long_min";
+ $wheres[] = "lon_value.string <= $long_max";
+
+ $joins = array();
+ $joins[] = "JOIN {$CONFIG->dbprefix}metadata lat on e.guid=lat.entity_guid";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings lat_name on lat.name_id=lat_name.id";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings lat_value on lat.value_id=lat_value.id";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metadata lon on e.guid=lon.entity_guid";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings lon_name on lon.name_id=lon_name.id";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings lon_value on lon.value_id=lon_value.id";
+
+ // merge wheres to pass to get_entities()
+ if (isset($options['wheres']) && !is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ } elseif (!isset($options['wheres'])) {
+ $options['wheres'] = array();
+ }
+ $options['wheres'] = array_merge($options['wheres'], $wheres);
+
+ // merge joins to pass to get_entities()
+ if (isset($options['joins']) && !is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ } elseif (!isset($options['joins'])) {
+ $options['joins'] = array();
+ }
+ $options['joins'] = array_merge($options['joins'], $joins);
+
+ return elgg_get_entities_from_relationship($options);
+}
+
+/**
+ * Returns a viewable list of entities from location
+ *
+ * @param array $options Options array
+ *
+ * @see elgg_list_entities()
+ * @see elgg_get_entities_from_location()
+ *
+ * @return string The viewable list of entities
+ * @since 1.8.0
+ */
+function elgg_list_entities_from_location(array $options = array()) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_location');
+}
+
+// Some distances in degrees (approximate)
+// @todo huh? see warning on elgg_get_entities_from_location()
+define("MILE", 0.01515);
+define("KILOMETER", 0.00932);
diff --git a/engine/lib/mb_wrapper.php b/engine/lib/mb_wrapper.php
new file mode 100644
index 000000000..68fa69005
--- /dev/null
+++ b/engine/lib/mb_wrapper.php
@@ -0,0 +1,233 @@
+<?php
+
+// if mb functions are available, set internal encoding to UTF8
+if (is_callable('mb_internal_encoding')) {
+ mb_internal_encoding("UTF-8");
+ ini_set("mbstring.internal_encoding", 'UTF-8');
+}
+
+/**
+ * Parses a string using mb_parse_str() if available.
+ * NOTE: This differs from parse_str() by returning the results
+ * instead of placing them in the local scope!
+ *
+ * @param string $str The string
+ *
+ * @return array
+ * @since 1.7.0
+ */
+function elgg_parse_str($str) {
+ if (is_callable('mb_parse_str')) {
+ mb_parse_str($str, $results);
+ } else {
+ parse_str($str, $results);
+ }
+
+ return $results;
+}
+
+
+
+/**
+ * Wrapper function for mb_split(). Falls back to split() if
+ * mb_split() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_split() {
+ $args = func_get_args();
+ if (is_callable('mb_split')) {
+ return call_user_func_array('mb_split', $args);
+ }
+ return call_user_func_array('split', $args);
+}
+
+/**
+ * Wrapper function for mb_stristr(). Falls back to stristr() if
+ * mb_stristr() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_stristr() {
+ $args = func_get_args();
+ if (is_callable('mb_stristr')) {
+ return call_user_func_array('mb_stristr', $args);
+ }
+ return call_user_func_array('stristr', $args);
+}
+
+/**
+ * Wrapper function for mb_strlen(). Falls back to strlen() if
+ * mb_strlen() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_strlen() {
+ $args = func_get_args();
+ if (is_callable('mb_strlen')) {
+ return call_user_func_array('mb_strlen', $args);
+ }
+ return call_user_func_array('strlen', $args);
+}
+
+/**
+ * Wrapper function for mb_strpos(). Falls back to strpos() if
+ * mb_strpos() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_strpos() {
+ $args = func_get_args();
+ if (is_callable('mb_strpos')) {
+ return call_user_func_array('mb_strpos', $args);
+ }
+ return call_user_func_array('strpos', $args);
+}
+
+/**
+ * Wrapper function for mb_strrchr(). Falls back to strrchr() if
+ * mb_strrchr() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_strrchr() {
+ $args = func_get_args();
+ if (is_callable('mb_strrchr')) {
+ return call_user_func_array('mb_strrchr', $args);
+ }
+ return call_user_func_array('strrchr', $args);
+}
+
+/**
+ * Wrapper function for mb_strripos(). Falls back to strripos() if
+ * mb_strripos() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return int
+ * @since 1.7.0
+ */
+function elgg_strripos() {
+ $args = func_get_args();
+ if (is_callable('mb_strripos')) {
+ return call_user_func_array('mb_strripos', $args);
+ }
+ return call_user_func_array('strripos', $args);
+}
+
+/**
+ * Wrapper function for mb_strrpos(). Falls back to strrpos() if
+ * mb_strrpos() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return int
+ * @since 1.7.0
+ */
+function elgg_strrpos() {
+ $args = func_get_args();
+ if (is_callable('mb_strrpos')) {
+ return call_user_func_array('mb_strrpos', $args);
+ }
+ return call_user_func_array('strrpos', $args);
+}
+
+/**
+ * Wrapper function for mb_strstr(). Falls back to strstr() if
+ * mb_strstr() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function elgg_strstr() {
+ $args = func_get_args();
+ if (is_callable('mb_strstr')) {
+ return call_user_func_array('mb_strstr', $args);
+ }
+ return call_user_func_array('strstr', $args);
+}
+
+/**
+ * Wrapper function for mb_strtolower(). Falls back to strtolower() if
+ * mb_strtolower() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_strtolower() {
+ $args = func_get_args();
+ if (is_callable('mb_strtolower')) {
+ return call_user_func_array('mb_strtolower', $args);
+ }
+ return call_user_func_array('strtolower', $args);
+}
+
+/**
+ * Wrapper function for mb_strtoupper(). Falls back to strtoupper() if
+ * mb_strtoupper() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_strtoupper() {
+ $args = func_get_args();
+ if (is_callable('mb_strtoupper')) {
+ return call_user_func_array('mb_strtoupper', $args);
+ }
+ return call_user_func_array('strtoupper', $args);
+}
+
+/**
+ * Wrapper function for mb_substr_count(). Falls back to substr_count() if
+ * mb_substr_count() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return int
+ * @since 1.7.0
+ */
+function elgg_substr_count() {
+ $args = func_get_args();
+ if (is_callable('mb_substr_count')) {
+ return call_user_func_array('mb_substr_count', $args);
+ }
+ return call_user_func_array('substr_count', $args);
+}
+
+/**
+ * Wrapper function for mb_substr(). Falls back to substr() if
+ * mb_substr() isn't available. Parameters are passed to the
+ * wrapped function in the same order they are passed to this
+ * function.
+ *
+ * @return string
+ * @since 1.7.0
+ */
+function elgg_substr() {
+ $args = func_get_args();
+ if (is_callable('mb_substr')) {
+ return call_user_func_array('mb_substr', $args);
+ }
+ return call_user_func_array('substr', $args);
+}
diff --git a/engine/lib/memcache.php b/engine/lib/memcache.php
new file mode 100644
index 000000000..79b87e850
--- /dev/null
+++ b/engine/lib/memcache.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Elgg memcache support.
+ *
+ * Requires php5-memcache to work.
+ *
+ * @package Elgg.Core
+ * @subpackage Cache.Memcache
+ */
+
+/**
+ * Return true if memcache is available and configured.
+ *
+ * @return bool
+ */
+function is_memcache_available() {
+ global $CONFIG;
+
+ static $memcache_available;
+
+ if ((!isset($CONFIG->memcache)) || (!$CONFIG->memcache)) {
+ return false;
+ }
+
+ // If we haven't set variable to something
+ if (($memcache_available !== true) && ($memcache_available !== false)) {
+ try {
+ $tmp = new ElggMemcache();
+ // No exception thrown so we have memcache available
+ $memcache_available = true;
+ } catch (Exception $e) {
+ $memcache_available = false;
+ }
+ }
+
+ return $memcache_available;
+}
+
+/**
+ * Invalidate an entity in memcache
+ *
+ * @param int $entity_guid The GUID of the entity to invalidate
+ *
+ * @return void
+ * @access private
+ */
+function _elgg_invalidate_memcache_for_entity($entity_guid) {
+ static $newentity_cache;
+
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+
+ if ($newentity_cache) {
+ $newentity_cache->delete($entity_guid);
+ }
+} \ No newline at end of file
diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php
new file mode 100644
index 000000000..fdb1b85f6
--- /dev/null
+++ b/engine/lib/metadata.php
@@ -0,0 +1,978 @@
+<?php
+/**
+ * Elgg metadata
+ * Functions to manage entity metadata.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Metadata
+ */
+
+/**
+ * Convert a database row to a new ElggMetadata
+ *
+ * @param stdClass $row An object from the database
+ *
+ * @return stdClass|ElggMetadata
+ * @access private
+ */
+function row_to_elggmetadata($row) {
+ if (!($row instanceof stdClass)) {
+ return $row;
+ }
+
+ return new ElggMetadata($row);
+}
+
+/**
+ * Get a specific metadata object by its id.
+ * If you want multiple metadata objects, use
+ * {@link elgg_get_metadata()}.
+ *
+ * @param int $id The id of the metadata object being retrieved.
+ *
+ * @return ElggMetadata|false FALSE if not found
+ */
+function elgg_get_metadata_from_id($id) {
+ return elgg_get_metastring_based_object_from_id($id, 'metadata');
+}
+
+/**
+ * Deletes metadata using its ID.
+ *
+ * @param int $id The metadata ID to delete.
+ * @return bool
+ */
+function elgg_delete_metadata_by_id($id) {
+ $metadata = elgg_get_metadata_from_id($id);
+ if (!$metadata) {
+ return false;
+ }
+ return $metadata->delete();
+}
+
+/**
+ * Create a new metadata object, or update an existing one.
+ *
+ * Metadata can be an array by setting allow_multiple to TRUE, but it is an
+ * indexed array with no control over the indexing.
+ *
+ * @param int $entity_guid The entity to attach the metadata to
+ * @param string $name Name of the metadata
+ * @param string $value Value of the metadata
+ * @param string $value_type 'text', 'integer', or '' for automatic detection
+ * @param int $owner_guid GUID of entity that owns the metadata
+ * @param int $access_id Default is ACCESS_PRIVATE
+ * @param bool $allow_multiple Allow multiple values for one key. Default is FALSE
+ *
+ * @return int|false id of metadata or FALSE if failure
+ */
+function create_metadata($entity_guid, $name, $value, $value_type = '', $owner_guid = 0,
+ $access_id = ACCESS_PRIVATE, $allow_multiple = false) {
+
+ global $CONFIG;
+
+ $entity_guid = (int)$entity_guid;
+ // name and value are encoded in add_metastring()
+ //$name = sanitise_string(trim($name));
+ //$value = sanitise_string(trim($value));
+ $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
+ $time = time();
+ $owner_guid = (int)$owner_guid;
+ $allow_multiple = (boolean)$allow_multiple;
+
+ if (!isset($value)) {
+ return FALSE;
+ }
+
+ if ($owner_guid == 0) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $access_id = (int)$access_id;
+
+ $query = "SELECT * from {$CONFIG->dbprefix}metadata"
+ . " WHERE entity_guid = $entity_guid and name_id=" . add_metastring($name) . " limit 1";
+
+ $existing = get_data_row($query);
+ if ($existing && !$allow_multiple) {
+ $id = (int)$existing->id;
+ $result = update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id);
+
+ if (!$result) {
+ return false;
+ }
+ } else {
+ // Support boolean types
+ if (is_bool($value)) {
+ $value = (int) $value;
+ }
+
+ // Add the metastrings
+ $value_id = add_metastring($value);
+ if (!$value_id) {
+ return false;
+ }
+
+ $name_id = add_metastring($name);
+ if (!$name_id) {
+ return false;
+ }
+
+ // If ok then add it
+ $query = "INSERT into {$CONFIG->dbprefix}metadata"
+ . " (entity_guid, name_id, value_id, value_type, owner_guid, time_created, access_id)"
+ . " VALUES ($entity_guid, '$name_id','$value_id','$value_type', $owner_guid, $time, $access_id)";
+
+ $id = insert_data($query);
+
+ if ($id !== false) {
+ $obj = elgg_get_metadata_from_id($id);
+ if (elgg_trigger_event('create', 'metadata', $obj)) {
+
+ elgg_get_metadata_cache()->save($entity_guid, $name, $value, $allow_multiple);
+
+ return $id;
+ } else {
+ elgg_delete_metadata_by_id($id);
+ }
+ }
+ }
+
+ return $id;
+}
+
+/**
+ * Update a specific piece of metadata.
+ *
+ * @param int $id ID of the metadata to update
+ * @param string $name Metadata name
+ * @param string $value Metadata value
+ * @param string $value_type Value type
+ * @param int $owner_guid Owner guid
+ * @param int $access_id Access ID
+ *
+ * @return bool
+ */
+function update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ if (!$md = elgg_get_metadata_from_id($id)) {
+ return false;
+ }
+ if (!$md->canEdit()) {
+ return false;
+ }
+
+ // If memcached then we invalidate the cache for this entry
+ static $metabyname_memcache;
+ if ((!$metabyname_memcache) && (is_memcache_available())) {
+ $metabyname_memcache = new ElggMemcache('metabyname_memcache');
+ }
+
+ if ($metabyname_memcache) {
+ // @todo fix memcache (name_id is not a property of ElggMetadata)
+ $metabyname_memcache->delete("{$md->entity_guid}:{$md->name_id}");
+ }
+
+ $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
+
+ $owner_guid = (int)$owner_guid;
+ if ($owner_guid == 0) {
+ $owner_guid = elgg_get_logged_in_user_guid();
+ }
+
+ $access_id = (int)$access_id;
+
+ // Support boolean types (as integers)
+ if (is_bool($value)) {
+ $value = (int) $value;
+ }
+
+ // Add the metastring
+ $value_id = add_metastring($value);
+ if (!$value_id) {
+ return false;
+ }
+
+ $name_id = add_metastring($name);
+ if (!$name_id) {
+ return false;
+ }
+
+ // If ok then add it
+ $query = "UPDATE {$CONFIG->dbprefix}metadata"
+ . " set name_id='$name_id', value_id='$value_id', value_type='$value_type', access_id=$access_id,"
+ . " owner_guid=$owner_guid where id=$id";
+
+ $result = update_data($query);
+ if ($result !== false) {
+
+ elgg_get_metadata_cache()->save($md->entity_guid, $name, $value);
+
+ // @todo this event tells you the metadata has been updated, but does not
+ // let you do anything about it. What is needed is a plugin hook before
+ // the update that passes old and new values.
+ $obj = elgg_get_metadata_from_id($id);
+ elgg_trigger_event('update', 'metadata', $obj);
+ }
+
+ return $result;
+}
+
+/**
+ * This function creates metadata from an associative array of "key => value" pairs.
+ *
+ * To achieve an array for a single key, pass in the same key multiple times with
+ * allow_multiple set to TRUE. This creates an indexed array. It does not support
+ * associative arrays and there is no guarantee on the ordering in the array.
+ *
+ * @param int $entity_guid The entity to attach the metadata to
+ * @param array $name_and_values Associative array - a value can be a string, number, bool
+ * @param string $value_type 'text', 'integer', or '' for automatic detection
+ * @param int $owner_guid GUID of entity that owns the metadata
+ * @param int $access_id Default is ACCESS_PRIVATE
+ * @param bool $allow_multiple Allow multiple values for one key. Default is FALSE
+ *
+ * @return bool
+ */
+function create_metadata_from_array($entity_guid, array $name_and_values, $value_type, $owner_guid,
+$access_id = ACCESS_PRIVATE, $allow_multiple = false) {
+
+ foreach ($name_and_values as $k => $v) {
+ $result = create_metadata($entity_guid, $k, $v, $value_type, $owner_guid,
+ $access_id, $allow_multiple);
+ if (!$result) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * Returns metadata. Accepts all elgg_get_entities() options for entity
+ * restraints.
+ *
+ * @see elgg_get_entities
+ *
+ * @warning 1.7's find_metadata() didn't support limits and returned all metadata.
+ * This function defaults to a limit of 25. There is probably not a reason
+ * for you to return all metadata unless you're exporting an entity,
+ * have other restraints in place, or are doing something horribly
+ * wrong in your code.
+ *
+ * @param array $options Array in format:
+ *
+ * metadata_names => NULL|ARR metadata names
+ * metadata_values => NULL|ARR metadata values
+ * metadata_ids => NULL|ARR metadata ids
+ * metadata_case_sensitive => BOOL Overall Case sensitive
+ * metadata_owner_guids => NULL|ARR guids for metadata owners
+ * metadata_created_time_lower => INT Lower limit for created time.
+ * metadata_created_time_upper => INT Upper limit for created time.
+ * metadata_calculation => STR Perform the MySQL function on the metadata values returned.
+ * The "metadata_calculation" option causes this function to
+ * return the result of performing a mathematical calculation on
+ * all metadata that match the query instead of returning
+ * ElggMetadata objects.
+ *
+ * @return ElggMetadata[]|mixed
+ * @since 1.8.0
+ */
+function elgg_get_metadata(array $options = array()) {
+
+ // @todo remove support for count shortcut - see #4393
+ // support shortcut of 'count' => true for 'metadata_calculation' => 'count'
+ if (isset($options['count']) && $options['count']) {
+ $options['metadata_calculation'] = 'count';
+ unset($options['count']);
+ }
+
+ $options['metastring_type'] = 'metadata';
+ return elgg_get_metastring_based_objects($options);
+}
+
+/**
+ * Deletes metadata based on $options.
+ *
+ * @warning Unlike elgg_get_metadata() this will not accept an empty options array!
+ * This requires at least one constraint: metadata_owner_guid(s),
+ * metadata_name(s), metadata_value(s), or guid(s) must be set.
+ *
+ * @param array $options An options array. {@see elgg_get_metadata()}
+ * @return bool|null true on success, false on failure, null if no metadata to delete.
+ * @since 1.8.0
+ */
+function elgg_delete_metadata(array $options) {
+ if (!elgg_is_valid_options_for_batch_operation($options, 'metadata')) {
+ return false;
+ }
+ $options['metastring_type'] = 'metadata';
+ $result = elgg_batch_metastring_based_objects($options, 'elgg_batch_delete_callback', false);
+
+ // This moved last in case an object's constructor sets metadata. Currently the batch
+ // delete process has to create the entity to delete its metadata. See #5214
+ elgg_get_metadata_cache()->invalidateByOptions('delete', $options);
+
+ return $result;
+}
+
+/**
+ * Disables metadata based on $options.
+ *
+ * @warning Unlike elgg_get_metadata() this will not accept an empty options array!
+ *
+ * @param array $options An options array. {@See elgg_get_metadata()}
+ * @return bool|null true on success, false on failure, null if no metadata disabled.
+ * @since 1.8.0
+ */
+function elgg_disable_metadata(array $options) {
+ if (!elgg_is_valid_options_for_batch_operation($options, 'metadata')) {
+ return false;
+ }
+
+ elgg_get_metadata_cache()->invalidateByOptions('disable', $options);
+
+ // if we can see hidden (disabled) we need to use the offset
+ // otherwise we risk an infinite loop if there are more than 50
+ $inc_offset = access_get_show_hidden_status();
+
+ $options['metastring_type'] = 'metadata';
+ return elgg_batch_metastring_based_objects($options, 'elgg_batch_disable_callback', $inc_offset);
+}
+
+/**
+ * Enables metadata based on $options.
+ *
+ * @warning Unlike elgg_get_metadata() this will not accept an empty options array!
+ *
+ * @warning In order to enable metadata, you must first use
+ * {@link access_show_hidden_entities()}.
+ *
+ * @param array $options An options array. {@See elgg_get_metadata()}
+ * @return bool|null true on success, false on failure, null if no metadata enabled.
+ * @since 1.8.0
+ */
+function elgg_enable_metadata(array $options) {
+ if (!$options || !is_array($options)) {
+ return false;
+ }
+
+ elgg_get_metadata_cache()->invalidateByOptions('enable', $options);
+
+ $options['metastring_type'] = 'metadata';
+ return elgg_batch_metastring_based_objects($options, 'elgg_batch_enable_callback');
+}
+
+/**
+ * ElggEntities interfaces
+ */
+
+/**
+ * Returns entities based upon metadata. Also accepts all
+ * options available to elgg_get_entities(). Supports
+ * the singular option shortcut.
+ *
+ * @note Using metadata_names and metadata_values results in a
+ * "names IN (...) AND values IN (...)" clause. This is subtly
+ * differently than default multiple metadata_name_value_pairs, which use
+ * "(name = value) AND (name = value)" clauses.
+ *
+ * When in doubt, use name_value_pairs.
+ *
+ * To ask for entities that do not have a metadata value, use a custom
+ * where clause like this:
+ *
+ * $options['wheres'][] = "NOT EXISTS (
+ * SELECT 1 FROM {$dbprefix}metadata md
+ * WHERE md.entity_guid = e.guid
+ * AND md.name_id = $name_metastring_id
+ * AND md.value_id = $value_metastring_id)";
+ *
+ * Note the metadata name and value has been denormalized in the above example.
+ *
+ * @see elgg_get_entities
+ *
+ * @param array $options Array in format:
+ *
+ * metadata_names => NULL|ARR metadata names
+ *
+ * metadata_values => NULL|ARR metadata values
+ *
+ * metadata_name_value_pairs => NULL|ARR (
+ * name => 'name',
+ * value => 'value',
+ * 'operand' => '=',
+ * 'case_sensitive' => TRUE
+ * )
+ * Currently if multiple values are sent via
+ * an array (value => array('value1', 'value2')
+ * the pair's operand will be forced to "IN".
+ * If passing "IN" as the operand and a string as the value,
+ * the value must be a properly quoted and escaped string.
+ *
+ * metadata_name_value_pairs_operator => NULL|STR The operator to use for combining
+ * (name = value) OPERATOR (name = value); default AND
+ *
+ * metadata_case_sensitive => BOOL Overall Case sensitive
+ *
+ * order_by_metadata => NULL|ARR array(
+ * 'name' => 'metadata_text1',
+ * 'direction' => ASC|DESC,
+ * 'as' => text|integer
+ * )
+ * Also supports array('name' => 'metadata_text1')
+ *
+ * metadata_owner_guids => NULL|ARR guids for metadata owners
+ *
+ * @return ElggEntity[]|mixed If count, int. If not count, array. false on errors.
+ * @since 1.7.0
+ */
+function elgg_get_entities_from_metadata(array $options = array()) {
+ $defaults = array(
+ 'metadata_names' => ELGG_ENTITIES_ANY_VALUE,
+ 'metadata_values' => ELGG_ENTITIES_ANY_VALUE,
+ 'metadata_name_value_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'metadata_name_value_pairs_operator' => 'AND',
+ 'metadata_case_sensitive' => TRUE,
+ 'order_by_metadata' => array(),
+
+ 'metadata_owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('metadata_name', 'metadata_value',
+ 'metadata_name_value_pair', 'metadata_owner_guid');
+
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ if (!$options = elgg_entities_get_metastrings_options('metadata', $options)) {
+ return FALSE;
+ }
+
+ return elgg_get_entities($options);
+}
+
+/**
+ * Returns metadata name and value SQL where for entities.
+ * NB: $names and $values are not paired. Use $pairs for this.
+ * Pairs default to '=' operand.
+ *
+ * This function is reused for annotations because the tables are
+ * exactly the same.
+ *
+ * @param string $e_table Entities table name
+ * @param string $n_table Normalized metastrings table name (Where entities,
+ * values, and names are joined. annotations / metadata)
+ * @param array|null $names Array of names
+ * @param array|null $values Array of values
+ * @param array|null $pairs Array of names / values / operands
+ * @param string $pair_operator ("AND" or "OR") Operator to use to join the where clauses for pairs
+ * @param bool $case_sensitive Case sensitive metadata names?
+ * @param array|null $order_by_metadata Array of names / direction
+ * @param array|null $owner_guids Array of owner GUIDs
+ *
+ * @return false|array False on fail, array('joins', 'wheres')
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_metadata_where_sql($e_table, $n_table, $names = NULL, $values = NULL,
+$pairs = NULL, $pair_operator = 'AND', $case_sensitive = TRUE, $order_by_metadata = NULL,
+$owner_guids = NULL) {
+
+ global $CONFIG;
+
+ // short circuit if nothing requested
+ // 0 is a valid (if not ill-conceived) metadata name.
+ // 0 is also a valid metadata value for FALSE, NULL, or 0
+ // 0 is also a valid(ish) owner_guid
+ if ((!$names && $names !== 0)
+ && (!$values && $values !== 0)
+ && (!$pairs && $pairs !== 0)
+ && (!$owner_guids && $owner_guids !== 0)
+ && !$order_by_metadata) {
+ return '';
+ }
+
+ // join counter for incremental joins.
+ $i = 1;
+
+ // binary forces byte-to-byte comparision of strings, making
+ // it case- and diacritical-mark- sensitive.
+ // only supported on values.
+ $binary = ($case_sensitive) ? ' BINARY ' : '';
+
+ $access = get_access_sql_suffix('n_table');
+
+ $return = array (
+ 'joins' => array (),
+ 'wheres' => array(),
+ 'orders' => array()
+ );
+
+ // will always want to join these tables if pulling metastrings.
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}{$n_table} n_table on
+ {$e_table}.guid = n_table.entity_guid";
+
+ $wheres = array();
+
+ // get names wheres and joins
+ $names_where = '';
+ if ($names !== NULL) {
+ if (!is_array($names)) {
+ $names = array($names);
+ }
+
+ $sanitised_names = array();
+ foreach ($names as $name) {
+ // normalise to 0.
+ if (!$name) {
+ $name = '0';
+ }
+ $sanitised_names[] = '\'' . sanitise_string($name) . '\'';
+ }
+
+ if ($names_str = implode(',', $sanitised_names)) {
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msn on n_table.name_id = msn.id";
+ $names_where = "(msn.string IN ($names_str))";
+ }
+ }
+
+ // get values wheres and joins
+ $values_where = '';
+ if ($values !== NULL) {
+ if (!is_array($values)) {
+ $values = array($values);
+ }
+
+ $sanitised_values = array();
+ foreach ($values as $value) {
+ // normalize to 0
+ if (!$value) {
+ $value = 0;
+ }
+ $sanitised_values[] = '\'' . sanitise_string($value) . '\'';
+ }
+
+ if ($values_str = implode(',', $sanitised_values)) {
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msv on n_table.value_id = msv.id";
+ $values_where = "({$binary}msv.string IN ($values_str))";
+ }
+ }
+
+ if ($names_where && $values_where) {
+ $wheres[] = "($names_where AND $values_where AND $access)";
+ } elseif ($names_where) {
+ $wheres[] = "($names_where AND $access)";
+ } elseif ($values_where) {
+ $wheres[] = "($values_where AND $access)";
+ }
+
+ // add pairs
+ // pairs must be in arrays.
+ if (is_array($pairs)) {
+ // check if this is an array of pairs or just a single pair.
+ if (isset($pairs['name']) || isset($pairs['value'])) {
+ $pairs = array($pairs);
+ }
+
+ $pair_wheres = array();
+
+ // @todo when the pairs are > 3 should probably split the query up to
+ // denormalize the strings table.
+
+ foreach ($pairs as $index => $pair) {
+ // @todo move this elsewhere?
+ // support shortcut 'n' => 'v' method.
+ if (!is_array($pair)) {
+ $pair = array(
+ 'name' => $index,
+ 'value' => $pair
+ );
+ }
+
+ // must have at least a name and value
+ if (!isset($pair['name']) || !isset($pair['value'])) {
+ // @todo should probably return false.
+ continue;
+ }
+
+ // case sensitivity can be specified per pair.
+ // default to higher level setting.
+ if (isset($pair['case_sensitive'])) {
+ $pair_binary = ($pair['case_sensitive']) ? ' BINARY ' : '';
+ } else {
+ $pair_binary = $binary;
+ }
+
+ if (isset($pair['operand'])) {
+ $operand = sanitise_string($pair['operand']);
+ } else {
+ $operand = ' = ';
+ }
+
+ // for comparing
+ $trimmed_operand = trim(strtolower($operand));
+
+ $access = get_access_sql_suffix("n_table{$i}");
+ // if the value is an int, don't quote it because str '15' < str '5'
+ // if the operand is IN don't quote it because quoting should be done already.
+ if (is_numeric($pair['value'])) {
+ $value = sanitise_string($pair['value']);
+ } else if (is_bool($pair['value'])) {
+ $value = (int) $pair['value'];
+ } else if (is_array($pair['value'])) {
+ $values_array = array();
+
+ foreach ($pair['value'] as $pair_value) {
+ if (is_numeric($pair_value)) {
+ $values_array[] = sanitise_string($pair_value);
+ } else {
+ $values_array[] = "'" . sanitise_string($pair_value) . "'";
+ }
+ }
+
+ if ($values_array) {
+ $value = '(' . implode(', ', $values_array) . ')';
+ }
+
+ // @todo allow support for non IN operands with array of values.
+ // will have to do more silly joins.
+ $operand = 'IN';
+ } else if ($trimmed_operand == 'in') {
+ $value = "({$pair['value']})";
+ } else {
+ $value = "'" . sanitise_string($pair['value']) . "'";
+ }
+
+ $name = sanitise_string($pair['name']);
+
+ // @todo The multiple joins are only needed when the operator is AND
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}{$n_table} n_table{$i}
+ on {$e_table}.guid = n_table{$i}.entity_guid";
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msn{$i}
+ on n_table{$i}.name_id = msn{$i}.id";
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msv{$i}
+ on n_table{$i}.value_id = msv{$i}.id";
+
+ $pair_wheres[] = "(msn{$i}.string = '$name' AND {$pair_binary}msv{$i}.string
+ $operand $value AND $access)";
+
+ $i++;
+ }
+
+ if ($where = implode(" $pair_operator ", $pair_wheres)) {
+ $wheres[] = "($where)";
+ }
+ }
+
+ // add owner_guids
+ if ($owner_guids) {
+ if (is_array($owner_guids)) {
+ $sanitised = array_map('sanitise_int', $owner_guids);
+ $owner_str = implode(',', $sanitised);
+ } else {
+ $owner_str = sanitise_int($owner_guids);
+ }
+
+ $wheres[] = "(n_table.owner_guid IN ($owner_str))";
+ }
+
+ if ($where = implode(' AND ', $wheres)) {
+ $return['wheres'][] = "($where)";
+ }
+
+ if (is_array($order_by_metadata)) {
+ if ((count($order_by_metadata) > 0) && !isset($order_by_metadata[0])) {
+ // singleton, so fix
+ $order_by_metadata = array($order_by_metadata);
+ }
+ foreach ($order_by_metadata as $order_by) {
+ if (is_array($order_by) && isset($order_by['name'])) {
+ $name = sanitise_string($order_by['name']);
+ if (isset($order_by['direction'])) {
+ $direction = sanitise_string($order_by['direction']);
+ } else {
+ $direction = 'ASC';
+ }
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}{$n_table} n_table{$i}
+ on {$e_table}.guid = n_table{$i}.entity_guid";
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msn{$i}
+ on n_table{$i}.name_id = msn{$i}.id";
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}metastrings msv{$i}
+ on n_table{$i}.value_id = msv{$i}.id";
+
+ $access = get_access_sql_suffix("n_table{$i}");
+
+ $return['wheres'][] = "(msn{$i}.string = '$name' AND $access)";
+ if (isset($order_by['as']) && $order_by['as'] == 'integer') {
+ $return['orders'][] = "CAST(msv{$i}.string AS SIGNED) $direction";
+ } else {
+ $return['orders'][] = "msv{$i}.string $direction";
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Returns a list of entities filtered by provided metadata.
+ *
+ * @see elgg_get_entities_from_metadata
+ *
+ * @param array $options Options array
+ *
+ * @return array
+ * @since 1.7.0
+ */
+function elgg_list_entities_from_metadata($options) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_metadata');
+}
+
+/**
+ * Other functions
+ */
+
+/**
+ * Handler called by trigger_plugin_hook on the "export" event.
+ *
+ * @param string $hook export
+ * @param string $entity_type all
+ * @param mixed $returnvalue Value returned from previous hook
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ *
+ * @throws InvalidParameterException
+ */
+function export_metadata_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ // Sanity check values
+ if ((!is_array($params)) && (!isset($params['guid']))) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
+ }
+
+ if (!is_array($returnvalue)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
+ }
+
+ $result = elgg_get_metadata(array(
+ 'guid' => (int)$params['guid'],
+ 'limit' => 0,
+ ));
+
+ if ($result) {
+ /* @var ElggMetadata[] $result */
+ foreach ($result as $r) {
+ $returnvalue[] = $r->export();
+ }
+ }
+
+ return $returnvalue;
+}
+
+/**
+ * Takes in a comma-separated string and returns an array of tags
+ * which have been trimmed
+ *
+ * @param string $string Comma-separated tag string
+ *
+ * @return array|false An array of strings, or false on failure
+ */
+function string_to_tag_array($string) {
+ if (is_string($string)) {
+ $ar = explode(",", $string);
+ $ar = array_map('trim', $ar);
+ $ar = array_filter($ar, 'is_not_null');
+ $ar = array_map('strip_tags', $ar);
+ return $ar;
+ }
+ return false;
+}
+
+/**
+ * Takes a metadata array (which has all kinds of properties)
+ * and turns it into a simple array of strings
+ *
+ * @param array $array Metadata array
+ *
+ * @return array Array of strings
+ */
+function metadata_array_to_values($array) {
+ $valuearray = array();
+
+ if (is_array($array)) {
+ foreach ($array as $element) {
+ $valuearray[] = $element->value;
+ }
+ }
+
+ return $valuearray;
+}
+
+/**
+ * Get the URL for this metadata
+ *
+ * By default this links to the export handler in the current view.
+ *
+ * @param int $id Metadata ID
+ *
+ * @return mixed
+ */
+function get_metadata_url($id) {
+ $id = (int)$id;
+
+ if ($extender = elgg_get_metadata_from_id($id)) {
+ return get_extender_url($extender);
+ }
+ return false;
+}
+
+/**
+ * Mark entities with a particular type and subtype as having access permissions
+ * that can be changed independently from their parent entity
+ *
+ * @param string $type The type - object, user, etc
+ * @param string $subtype The subtype; all subtypes by default
+ *
+ * @return void
+ */
+function register_metadata_as_independent($type, $subtype = '*') {
+ global $CONFIG;
+ if (!isset($CONFIG->independents)) {
+ $CONFIG->independents = array();
+ }
+ $CONFIG->independents[$type][$subtype] = true;
+}
+
+/**
+ * Determines whether entities of a given type and subtype should not change
+ * their metadata in line with their parent entity
+ *
+ * @param string $type The type - object, user, etc
+ * @param string $subtype The entity subtype
+ *
+ * @return bool
+ */
+function is_metadata_independent($type, $subtype) {
+ global $CONFIG;
+ if (empty($CONFIG->independents)) {
+ return false;
+ }
+ if (!empty($CONFIG->independents[$type][$subtype])
+ || !empty($CONFIG->independents[$type]['*'])) {
+ return true;
+ }
+ return false;
+}
+
+/**
+ * When an entity is updated, resets the access ID on all of its child metadata
+ *
+ * @param string $event The name of the event
+ * @param string $object_type The type of object
+ * @param ElggEntity $object The entity itself
+ *
+ * @return true
+ */
+function metadata_update($event, $object_type, $object) {
+ if ($object instanceof ElggEntity) {
+ if (!is_metadata_independent($object->getType(), $object->getSubtype())) {
+ $db_prefix = elgg_get_config('dbprefix');
+ $access_id = (int) $object->access_id;
+ $guid = (int) $object->getGUID();
+ $query = "update {$db_prefix}metadata set access_id = {$access_id} where entity_guid = {$guid}";
+ update_data($query);
+ }
+ }
+ return true;
+}
+
+/**
+ * Register a metadata url handler.
+ *
+ * @param string $extender_name The name, default 'all'.
+ * @param string $function The function name.
+ *
+ * @return bool
+ */
+function elgg_register_metadata_url_handler($extender_name, $function) {
+ return elgg_register_extender_url_handler('metadata', $extender_name, $function);
+}
+
+/**
+ * Get the global metadata cache instance
+ *
+ * @return ElggVolatileMetadataCache
+ *
+ * @access private
+ */
+function elgg_get_metadata_cache() {
+ global $CONFIG;
+ if (empty($CONFIG->local_metadata_cache)) {
+ $CONFIG->local_metadata_cache = new ElggVolatileMetadataCache();
+ }
+ return $CONFIG->local_metadata_cache;
+}
+
+/**
+ * Invalidate the metadata cache based on options passed to various *_metadata functions
+ *
+ * @param string $action Action performed on metadata. "delete", "disable", or "enable"
+ * @param array $options Options passed to elgg_(delete|disable|enable)_metadata
+ * @return void
+ */
+function elgg_invalidate_metadata_cache($action, array $options) {
+ // remove as little as possible, optimizing for common cases
+ $cache = elgg_get_metadata_cache();
+ if (empty($options['guid'])) {
+ // safest to clear everything unless we want to make this even more complex :(
+ $cache->flush();
+ } else {
+ if (empty($options['metadata_name'])) {
+ // safest to clear the whole entity
+ $cache->clear($options['guid']);
+ } else {
+ switch ($action) {
+ case 'delete':
+ $cache->markEmpty($options['guid'], $options['metadata_name']);
+ break;
+ default:
+ $cache->markUnknown($options['guid'], $options['metadata_name']);
+ }
+ }
+ }
+}
+
+/** Register the hook */
+elgg_register_plugin_hook_handler("export", "all", "export_metadata_plugin_hook", 2);
+
+/** Call a function whenever an entity is updated **/
+elgg_register_event_handler('update', 'all', 'metadata_update');
+
+// unit testing
+elgg_register_plugin_hook_handler('unit_test', 'system', 'metadata_test');
+
+/**
+ * Metadata unit test
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of other tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function metadata_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/metadata.php';
+ $value[] = $CONFIG->path . 'engine/tests/api/metadata_cache.php';
+ return $value;
+}
diff --git a/engine/lib/metastrings.php b/engine/lib/metastrings.php
new file mode 100644
index 000000000..57d876c06
--- /dev/null
+++ b/engine/lib/metastrings.php
@@ -0,0 +1,903 @@
+<?php
+/**
+ * Elgg metastrngs
+ * Functions to manage object metastrings.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.MetaStrings
+ */
+
+/** Cache metastrings for a page */
+global $METASTRINGS_CACHE;
+$METASTRINGS_CACHE = array();
+
+/** Keep a record of strings we know don't exist */
+global $METASTRINGS_DEADNAME_CACHE;
+$METASTRINGS_DEADNAME_CACHE = array();
+
+
+
+/**
+ * Return the meta string id for a given tag, or false.
+ *
+ * @param string $string The value to store
+ * @param bool $case_sensitive Do we want to make the query case sensitive?
+ * If not there may be more than one result
+ *
+ * @return int|array|false meta string id, array of ids or false if none found
+ */
+function get_metastring_id($string, $case_sensitive = TRUE) {
+ global $CONFIG, $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE;
+
+ $string = sanitise_string($string);
+
+ // caching doesn't work for case insensitive searches
+ if ($case_sensitive) {
+ $result = array_search($string, $METASTRINGS_CACHE, true);
+
+ if ($result !== false) {
+ elgg_log("** Returning id for string:$string from cache.");
+ return $result;
+ }
+
+ // See if we have previously looked for this and found nothing
+ if (in_array($string, $METASTRINGS_DEADNAME_CACHE, true)) {
+ return false;
+ }
+
+ // Experimental memcache
+ $msfc = null;
+ static $metastrings_memcache;
+ if ((!$metastrings_memcache) && (is_memcache_available())) {
+ $metastrings_memcache = new ElggMemcache('metastrings_memcache');
+ }
+ if ($metastrings_memcache) {
+ $msfc = $metastrings_memcache->load($string);
+ }
+ if ($msfc) {
+ return $msfc;
+ }
+ }
+
+ // Case sensitive
+ if ($case_sensitive) {
+ $query = "SELECT * from {$CONFIG->dbprefix}metastrings where string= BINARY '$string' limit 1";
+ } else {
+ $query = "SELECT * from {$CONFIG->dbprefix}metastrings where string = '$string'";
+ }
+
+ $row = FALSE;
+ $metaStrings = get_data($query);
+ if (is_array($metaStrings)) {
+ if (sizeof($metaStrings) > 1) {
+ $ids = array();
+ foreach ($metaStrings as $metaString) {
+ $ids[] = $metaString->id;
+ }
+ return $ids;
+ } else if (isset($metaStrings[0])) {
+ $row = $metaStrings[0];
+ }
+ }
+
+ if ($row) {
+ $METASTRINGS_CACHE[$row->id] = $row->string; // Cache it
+
+ // Attempt to memcache it if memcache is available
+ if ($metastrings_memcache) {
+ $metastrings_memcache->save($row->string, $row->id);
+ }
+
+ elgg_log("** Cacheing string '{$row->string}'");
+
+ return $row->id;
+ } else {
+ $METASTRINGS_DEADNAME_CACHE[$string] = $string;
+ }
+
+ return false;
+}
+
+/**
+ * When given an ID, returns the corresponding metastring
+ *
+ * @param int $id Metastring ID
+ *
+ * @return string Metastring
+ */
+function get_metastring($id) {
+ global $CONFIG, $METASTRINGS_CACHE;
+
+ $id = (int) $id;
+
+ if (isset($METASTRINGS_CACHE[$id])) {
+ elgg_log("** Returning string for id:$id from cache.");
+
+ return $METASTRINGS_CACHE[$id];
+ }
+
+ $row = get_data_row("SELECT * from {$CONFIG->dbprefix}metastrings where id='$id' limit 1");
+ if ($row) {
+ $METASTRINGS_CACHE[$id] = $row->string; // Cache it
+ elgg_log("** Cacheing string '{$row->string}'");
+
+ return $row->string;
+ }
+
+ return false;
+}
+
+/**
+ * Add a metastring.
+ * It returns the id of the tag, whether by creating it or updating it.
+ *
+ * @param string $string The value (whatever that is) to be stored
+ * @param bool $case_sensitive Do we want to make the query case sensitive?
+ *
+ * @return mixed Integer tag or false.
+ */
+function add_metastring($string, $case_sensitive = true) {
+ global $CONFIG, $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE;
+
+ $sanstring = sanitise_string($string);
+
+ $id = get_metastring_id($string, $case_sensitive);
+ if ($id) {
+ return $id;
+ }
+
+ $result = insert_data("INSERT into {$CONFIG->dbprefix}metastrings (string) values ('$sanstring')");
+ if ($result) {
+ $METASTRINGS_CACHE[$result] = $string;
+ if (isset($METASTRINGS_DEADNAME_CACHE[$string])) {
+ unset($METASTRINGS_DEADNAME_CACHE[$string]);
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Delete any orphaned entries in metastrings. This is run by the garbage collector.
+ *
+ * @return bool
+ * @access private
+ */
+function delete_orphaned_metastrings() {
+ global $CONFIG;
+
+ // If memcache is enabled then we need to flush it of deleted values
+ if (is_memcache_available()) {
+ $select_query = "
+ SELECT *
+ from {$CONFIG->dbprefix}metastrings where
+ (
+ (id not in (select name_id from {$CONFIG->dbprefix}metadata)) AND
+ (id not in (select value_id from {$CONFIG->dbprefix}metadata)) AND
+ (id not in (select name_id from {$CONFIG->dbprefix}annotations)) AND
+ (id not in (select value_id from {$CONFIG->dbprefix}annotations))
+ )";
+
+ $dead = get_data($select_query);
+ if ($dead) {
+ static $metastrings_memcache;
+ if (!$metastrings_memcache) {
+ $metastrings_memcache = new ElggMemcache('metastrings_memcache');
+ }
+
+ foreach ($dead as $d) {
+ $metastrings_memcache->delete($d->string);
+ }
+ }
+ }
+
+ $query = "
+ DELETE
+ from {$CONFIG->dbprefix}metastrings where
+ (
+ (id not in (select name_id from {$CONFIG->dbprefix}metadata)) AND
+ (id not in (select value_id from {$CONFIG->dbprefix}metadata)) AND
+ (id not in (select name_id from {$CONFIG->dbprefix}annotations)) AND
+ (id not in (select value_id from {$CONFIG->dbprefix}annotations))
+ )";
+
+ return delete_data($query);
+}
+
+/**
+ * Returns an array of either ElggAnnotation or ElggMetadata objects.
+ * Accepts all elgg_get_entities() options for entity restraints.
+ *
+ * @see elgg_get_entities
+ *
+ * @param array $options Array in format:
+ *
+ * metastring_names => NULL|ARR metastring names
+ *
+ * metastring_values => NULL|ARR metastring values
+ *
+ * metastring_ids => NULL|ARR metastring ids
+ *
+ * metastring_case_sensitive => BOOL Overall Case sensitive
+ *
+ * metastring_owner_guids => NULL|ARR Guids for metadata owners
+ *
+ * metastring_created_time_lower => INT Lower limit for created time.
+ *
+ * metastring_created_time_upper => INT Upper limit for created time.
+ *
+ * metastring_calculation => STR Perform the MySQL function on the metastring values
+ * returned.
+ * This differs from egef_annotation_calculation in that
+ * it returns only the calculation of all annotation values.
+ * You can sum, avg, count, etc. egef_annotation_calculation()
+ * returns ElggEntities ordered by a calculation on their
+ * annotation values.
+ *
+ * metastring_type => STR metadata or annotation(s)
+ *
+ * @return mixed
+ * @access private
+ */
+function elgg_get_metastring_based_objects($options) {
+ $options = elgg_normalize_metastrings_options($options);
+
+ switch ($options['metastring_type']) {
+ case 'metadata':
+ $type = 'metadata';
+ $callback = 'row_to_elggmetadata';
+ break;
+
+ case 'annotations':
+ case 'annotation':
+ $type = 'annotations';
+ $callback = 'row_to_elggannotation';
+ break;
+
+ default:
+ return false;
+ }
+
+ $defaults = array(
+ // entities
+ 'types' => ELGG_ENTITIES_ANY_VALUE,
+ 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
+ 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'container_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'site_guids' => get_config('site_guid'),
+
+ 'modified_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'modified_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ // options are normalized to the plural in case we ever add support for them.
+ 'metastring_names' => ELGG_ENTITIES_ANY_VALUE,
+ 'metastring_values' => ELGG_ENTITIES_ANY_VALUE,
+ //'metastring_name_value_pairs' => ELGG_ENTITIES_ANY_VALUE,
+ //'metastring_name_value_pairs_operator' => 'AND',
+
+ 'metastring_case_sensitive' => TRUE,
+ //'order_by_metastring' => array(),
+ 'metastring_calculation' => ELGG_ENTITIES_NO_VALUE,
+
+ 'metastring_created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'metastring_created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'metastring_owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'metastring_ids' => ELGG_ENTITIES_ANY_VALUE,
+
+ // sql
+ 'order_by' => 'n_table.time_created asc',
+ 'limit' => 10,
+ 'offset' => 0,
+ 'count' => FALSE,
+ 'selects' => array(),
+ 'wheres' => array(),
+ 'joins' => array(),
+
+ 'callback' => $callback
+ );
+
+ // @todo Ignore site_guid right now because of #2910
+ $options['site_guid'] = ELGG_ENTITIES_ANY_VALUE;
+
+ $options = array_merge($defaults, $options);
+
+ // can't use helper function with type_subtype_pair because
+ // it's already an array...just need to merge it
+ if (isset($options['type_subtype_pair'])) {
+ if (isset($options['type_subtype_pairs'])) {
+ $options['type_subtype_pairs'] = array_merge($options['type_subtype_pairs'],
+ $options['type_subtype_pair']);
+ } else {
+ $options['type_subtype_pairs'] = $options['type_subtype_pair'];
+ }
+ }
+
+ $singulars = array(
+ 'type', 'subtype', 'type_subtype_pair',
+ 'guid', 'owner_guid', 'container_guid', 'site_guid',
+ 'metastring_name', 'metastring_value',
+ 'metastring_owner_guid', 'metastring_id',
+ 'select', 'where', 'join'
+ );
+
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ if (!$options) {
+ return false;
+ }
+
+ $db_prefix = elgg_get_config('dbprefix');
+
+ // evaluate where clauses
+ if (!is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ }
+
+ $wheres = $options['wheres'];
+
+ // entities
+ $wheres[] = elgg_get_entity_type_subtype_where_sql('e', $options['types'],
+ $options['subtypes'], $options['type_subtype_pairs']);
+
+ $wheres[] = elgg_get_guid_based_where_sql('e.guid', $options['guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.owner_guid', $options['owner_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.container_guid', $options['container_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.site_guid', $options['site_guids']);
+
+ $wheres[] = elgg_get_entity_time_where_sql('e', $options['created_time_upper'],
+ $options['created_time_lower'], $options['modified_time_upper'], $options['modified_time_lower']);
+
+
+ $wheres[] = elgg_get_entity_time_where_sql('n_table', $options['metastring_created_time_upper'],
+ $options['metastring_created_time_lower'], null, null);
+
+ $wheres[] = elgg_get_guid_based_where_sql('n_table.owner_guid',
+ $options['metastring_owner_guids']);
+
+ // see if any functions failed
+ // remove empty strings on successful functions
+ foreach ($wheres as $i => $where) {
+ if ($where === FALSE) {
+ return FALSE;
+ } elseif (empty($where)) {
+ unset($wheres[$i]);
+ }
+ }
+
+ // remove identical where clauses
+ $wheres = array_unique($wheres);
+
+ // evaluate join clauses
+ if (!is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ }
+
+ $joins = $options['joins'];
+ $joins[] = "JOIN {$db_prefix}entities e ON n_table.entity_guid = e.guid";
+
+ // evaluate selects
+ if (!is_array($options['selects'])) {
+ $options['selects'] = array($options['selects']);
+ }
+
+ $selects = $options['selects'];
+
+ // For performance reasons we don't want the joins required for metadata / annotations
+ // unless we're going through one of their callbacks.
+ // this means we expect the functions passing different callbacks to pass their required joins.
+ // If we're doing a calculation
+ $custom_callback = ($options['callback'] == 'row_to_elggmetadata'
+ || $options['callback'] == 'row_to_elggannotation');
+ $is_calculation = $options['metastring_calculation'] ? true : false;
+
+ if ($custom_callback || $is_calculation) {
+ $joins[] = "JOIN {$db_prefix}metastrings n on n_table.name_id = n.id";
+ $joins[] = "JOIN {$db_prefix}metastrings v on n_table.value_id = v.id";
+
+ $selects[] = 'n.string as name';
+ $selects[] = 'v.string as value';
+ }
+
+ foreach ($joins as $i => $join) {
+ if ($join === FALSE) {
+ return FALSE;
+ } elseif (empty($join)) {
+ unset($joins[$i]);
+ }
+ }
+
+ // metastrings
+ $metastring_clauses = elgg_get_metastring_sql('n_table', $options['metastring_names'],
+ $options['metastring_values'], null, $options['metastring_ids'],
+ $options['metastring_case_sensitive']);
+
+ if ($metastring_clauses) {
+ $wheres = array_merge($wheres, $metastring_clauses['wheres']);
+ $joins = array_merge($joins, $metastring_clauses['joins']);
+ } else {
+ $wheres[] = get_access_sql_suffix('n_table');
+ }
+
+ if ($options['metastring_calculation'] === ELGG_ENTITIES_NO_VALUE && !$options['count']) {
+ $selects = array_unique($selects);
+ // evalutate selects
+ $select_str = '';
+ if ($selects) {
+ foreach ($selects as $select) {
+ $select_str .= ", $select";
+ }
+ }
+
+ $query = "SELECT DISTINCT n_table.*{$select_str} FROM {$db_prefix}$type n_table";
+ } elseif ($options['count']) {
+ // count is over the entities
+ $query = "SELECT count(DISTINCT e.guid) as calculation FROM {$db_prefix}$type n_table";
+ } else {
+ $query = "SELECT {$options['metastring_calculation']}(v.string) as calculation FROM {$db_prefix}$type n_table";
+ }
+
+ // remove identical join clauses
+ $joins = array_unique($joins);
+
+ // add joins
+ foreach ($joins as $j) {
+ $query .= " $j ";
+ }
+
+ // add wheres
+ $query .= ' WHERE ';
+
+ foreach ($wheres as $w) {
+ $query .= " $w AND ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix('e');
+
+ // reverse order by
+ if (isset($options['reverse_order_by']) && $options['reverse_order_by']) {
+ $options['order_by'] = elgg_sql_reverse_order_by_clause($options['order_by'],
+ $defaults['order_by']);
+ }
+
+ if ($options['metastring_calculation'] === ELGG_ENTITIES_NO_VALUE && !$options['count']) {
+ if (isset($options['group_by'])) {
+ $options['group_by'] = sanitise_string($options['group_by']);
+ $query .= " GROUP BY {$options['group_by']}";
+ }
+
+ if (isset($options['order_by']) && $options['order_by']) {
+ $options['order_by'] = sanitise_string($options['order_by']);
+ $query .= " ORDER BY {$options['order_by']}, n_table.id";
+ }
+
+ if ($options['limit']) {
+ $limit = sanitise_int($options['limit']);
+ $offset = sanitise_int($options['offset'], false);
+ $query .= " LIMIT $offset, $limit";
+ }
+
+ $dt = get_data($query, $options['callback']);
+ return $dt;
+ } else {
+ $result = get_data_row($query);
+ return $result->calculation;
+ }
+}
+
+/**
+ * Returns an array of joins and wheres for use in metastrings.
+ *
+ * @note The $pairs is reserved for name/value pairs if we want to implement those.
+ *
+ * @param string $table The annotation or metadata table name or alias
+ * @param array $names An array of names
+ * @param array $values An array of values
+ * @param array $pairs Name / value pairs. Not currently used.
+ * @param array $ids Metastring IDs
+ * @param bool $case_sensitive Should name and values be case sensitive?
+ *
+ * @return array
+ * @access private
+ */
+function elgg_get_metastring_sql($table, $names = null, $values = null,
+ $pairs = null, $ids = null, $case_sensitive = false) {
+
+ if ((!$names && $names !== 0)
+ && (!$values && $values !== 0)
+ && !$ids
+ && (!$pairs && $pairs !== 0)) {
+
+ return array();
+ }
+
+ $db_prefix = elgg_get_config('dbprefix');
+
+ // binary forces byte-to-byte comparision of strings, making
+ // it case- and diacritical-mark- sensitive.
+ // only supported on values.
+ $binary = ($case_sensitive) ? ' BINARY ' : '';
+
+ $return = array (
+ 'joins' => array (),
+ 'wheres' => array()
+ );
+
+ $wheres = array();
+
+ // get names wheres and joins
+ $names_where = '';
+ if ($names !== NULL) {
+ if (!is_array($names)) {
+ $names = array($names);
+ }
+
+ $sanitised_names = array();
+ foreach ($names as $name) {
+ // normalise to 0.
+ if (!$name) {
+ $name = '0';
+ }
+ $sanitised_names[] = '\'' . sanitise_string($name) . '\'';
+ }
+
+ if ($names_str = implode(',', $sanitised_names)) {
+ $return['joins'][] = "JOIN {$db_prefix}metastrings msn on $table.name_id = msn.id";
+ $names_where = "(msn.string IN ($names_str))";
+ }
+ }
+
+ // get values wheres and joins
+ $values_where = '';
+ if ($values !== NULL) {
+ if (!is_array($values)) {
+ $values = array($values);
+ }
+
+ $sanitised_values = array();
+ foreach ($values as $value) {
+ // normalize to 0
+ if (!$value) {
+ $value = 0;
+ }
+ $sanitised_values[] = '\'' . sanitise_string($value) . '\'';
+ }
+
+ if ($values_str = implode(',', $sanitised_values)) {
+ $return['joins'][] = "JOIN {$db_prefix}metastrings msv on $table.value_id = msv.id";
+ $values_where = "({$binary}msv.string IN ($values_str))";
+ }
+ }
+
+ if ($ids !== NULL) {
+ if (!is_array($ids)) {
+ $ids = array($ids);
+ }
+
+ $ids_str = implode(',', $ids);
+
+ if ($ids_str) {
+ $wheres[] = "n_table.id IN ($ids_str)";
+ }
+ }
+
+ if ($names_where && $values_where) {
+ $wheres[] = "($names_where AND $values_where)";
+ } elseif ($names_where) {
+ $wheres[] = $names_where;
+ } elseif ($values_where) {
+ $wheres[] = $values_where;
+ }
+
+ $wheres[] = get_access_sql_suffix($table);
+
+ if ($where = implode(' AND ', $wheres)) {
+ $return['wheres'][] = "($where)";
+ }
+
+ return $return;
+}
+
+/**
+ * Normalizes metadata / annotation option names to their corresponding metastrings name.
+ *
+ * @param array $options An options array
+ * @since 1.8.0
+ * @return array
+ * @access private
+ */
+function elgg_normalize_metastrings_options(array $options = array()) {
+
+ // support either metastrings_type or metastring_type
+ // because I've made this mistake many times and hunting it down is a pain...
+ $type = elgg_extract('metastring_type', $options, null);
+ $type = elgg_extract('metastrings_type', $options, $type);
+
+ $options['metastring_type'] = $type;
+
+ // support annotation_ and annotations_ because they're way too easy to confuse
+ $prefixes = array('metadata_', 'annotation_', 'annotations_');
+
+ // map the metadata_* options to metastring_* options
+ $map = array(
+ 'names' => 'metastring_names',
+ 'values' => 'metastring_values',
+ 'case_sensitive' => 'metastring_case_sensitive',
+ 'owner_guids' => 'metastring_owner_guids',
+ 'created_time_lower' => 'metastring_created_time_lower',
+ 'created_time_upper' => 'metastring_created_time_upper',
+ 'calculation' => 'metastring_calculation',
+ 'ids' => 'metastring_ids'
+ );
+
+ foreach ($prefixes as $prefix) {
+ $singulars = array("{$prefix}name", "{$prefix}value", "{$prefix}owner_guid", "{$prefix}id");
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ foreach ($map as $specific => $normalized) {
+ $key = $prefix . $specific;
+ if (isset($options[$key])) {
+ $options[$normalized] = $options[$key];
+ }
+ }
+ }
+
+ return $options;
+}
+
+/**
+ * Enables or disables a metastrings-based object by its id.
+ *
+ * @warning To enable disabled metastrings you must first use
+ * {@link access_show_hidden_entities()}.
+ *
+ * @param int $id The object's ID
+ * @param string $enabled Value to set to: yes or no
+ * @param string $type The type of table to use: metadata or annotations
+ *
+ * @return bool
+ * @throws InvalidParameterException
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_metastring_based_object_enabled_by_id($id, $enabled, $type) {
+ $id = (int)$id;
+ $db_prefix = elgg_get_config('dbprefix');
+
+ $object = elgg_get_metastring_based_object_from_id($id, $type);
+
+ switch($type) {
+ case 'annotation':
+ case 'annotations':
+ $table = "{$db_prefix}annotations";
+ break;
+
+ case 'metadata':
+ $table = "{$db_prefix}metadata";
+ break;
+ }
+
+ if ($enabled === 'yes' || $enabled === 1 || $enabled === true) {
+ $enabled = 'yes';
+ $event = 'enable';
+ } elseif ($enabled === 'no' || $enabled === 0 || $enabled === false) {
+ $enabled = 'no';
+ $event = 'disable';
+ } else {
+ return false;
+ }
+
+ $return = false;
+
+ if ($object) {
+ // don't set it if it's already set.
+ if ($object->enabled == $enabled) {
+ $return = false;
+ } elseif ($object->canEdit() && (elgg_trigger_event($event, $type, $object))) {
+ $return = update_data("UPDATE $table SET enabled = '$enabled' where id = $id");
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Runs metastrings-based objects found using $options through $callback
+ *
+ * @warning Unlike elgg_get_metastring_based_objects() this will not accept an
+ * empty options array!
+ *
+ * @warning This returns null on no ops.
+ *
+ * @param array $options An options array. {@See elgg_get_metastring_based_objects()}
+ * @param string $callback The callback to pass each result through
+ * @param bool $inc_offset Increment the offset? Pass false for callbacks that delete / disable
+ *
+ * @return bool|null true on success, false on failure, null if no objects are found.
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_batch_metastring_based_objects(array $options, $callback, $inc_offset = true) {
+ if (!$options || !is_array($options)) {
+ return false;
+ }
+
+ $batch = new ElggBatch('elgg_get_metastring_based_objects', $options, $callback, 50, $inc_offset);
+ return $batch->callbackResult;
+}
+
+/**
+ * Returns a singular metastring-based object by its ID.
+ *
+ * @param int $id The metastring-based object's ID
+ * @param string $type The type: annotation or metadata
+ * @return ElggMetadata|ElggAnnotation
+ *
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_metastring_based_object_from_id($id, $type) {
+ $id = (int)$id;
+ if (!$id) {
+ return false;
+ }
+
+ $options = array(
+ 'metastring_type' => $type,
+ 'metastring_id' => $id
+ );
+
+ $obj = elgg_get_metastring_based_objects($options);
+
+ if ($obj && count($obj) == 1) {
+ return $obj[0];
+ }
+
+ return false;
+}
+
+/**
+ * Deletes a metastring-based object by its id
+ *
+ * @param int $id The object's ID
+ * @param string $type The object's metastring type: annotation or metadata
+ * @return bool
+ *
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_delete_metastring_based_object_by_id($id, $type) {
+ $id = (int)$id;
+ $db_prefix = elgg_get_config('dbprefix');
+
+ switch ($type) {
+ case 'annotation':
+ case 'annotations':
+ $type = 'annotations';
+ break;
+
+ case 'metadata':
+ $type = 'metadata';
+ break;
+
+ default:
+ return false;
+ }
+
+ $obj = elgg_get_metastring_based_object_from_id($id, $type);
+ $table = $db_prefix . $type;
+
+ if ($obj) {
+ // Tidy up if memcache is enabled.
+ // @todo only metadata is supported
+ if ($type == 'metadata') {
+ static $metabyname_memcache;
+ if ((!$metabyname_memcache) && (is_memcache_available())) {
+ $metabyname_memcache = new ElggMemcache('metabyname_memcache');
+ }
+
+ if ($metabyname_memcache) {
+ // @todo why name_id? is that even populated?
+ $metabyname_memcache->delete("{$obj->entity_guid}:{$obj->name_id}");
+ }
+ }
+
+ if (($obj->canEdit()) && (elgg_trigger_event('delete', $type, $obj))) {
+ return (bool)delete_data("DELETE from $table where id=$id");
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Entities interface helpers
+ */
+
+/**
+ * Returns options to pass to elgg_get_entities() for metastrings operations.
+ *
+ * @param string $type Metastring type: annotations or metadata
+ * @param array $options Options
+ *
+ * @return array
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_entities_get_metastrings_options($type, $options) {
+ $valid_types = array('metadata', 'annotation');
+ if (!in_array($type, $valid_types)) {
+ return FALSE;
+ }
+
+ // the options for annotations are singular (annotation_name) but the table
+ // is plural (elgg_annotations) so rewrite for the table name.
+ $n_table = ($type == 'annotation') ? 'annotations' : $type;
+
+ $singulars = array("{$type}_name", "{$type}_value",
+ "{$type}_name_value_pair", "{$type}_owner_guid");
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ $clauses = elgg_get_entity_metadata_where_sql('e', $n_table, $options["{$type}_names"],
+ $options["{$type}_values"], $options["{$type}_name_value_pairs"],
+ $options["{$type}_name_value_pairs_operator"], $options["{$type}_case_sensitive"],
+ $options["order_by_{$type}"], $options["{$type}_owner_guids"]);
+
+ if ($clauses) {
+ // merge wheres to pass to get_entities()
+ if (isset($options['wheres']) && !is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ } elseif (!isset($options['wheres'])) {
+ $options['wheres'] = array();
+ }
+
+ $options['wheres'] = array_merge($options['wheres'], $clauses['wheres']);
+
+ // merge joins to pass to get_entities()
+ if (isset($options['joins']) && !is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ } elseif (!isset($options['joins'])) {
+ $options['joins'] = array();
+ }
+
+ $options['joins'] = array_merge($options['joins'], $clauses['joins']);
+
+ if ($clauses['orders']) {
+ $order_by_metadata = implode(", ", $clauses['orders']);
+ if (isset($options['order_by']) && $options['order_by']) {
+ $options['order_by'] = "$order_by_metadata, {$options['order_by']}";
+ } else {
+ $options['order_by'] = "$order_by_metadata, e.time_created DESC";
+ }
+ }
+ }
+
+ return $options;
+}
+
+// unit testing
+elgg_register_plugin_hook_handler('unit_test', 'system', 'metastrings_test');
+
+/**
+ * Metadata unit test
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of other tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function metastrings_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/metastrings.php';
+ return $value;
+}
diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php
new file mode 100644
index 000000000..ab9cc05e8
--- /dev/null
+++ b/engine/lib/navigation.php
@@ -0,0 +1,527 @@
+<?php
+/**
+ * Elgg navigation library
+ * Functions for managing menus and other navigational elements
+ *
+ * Breadcrumbs
+ * Elgg uses a breadcrumb stack. The page handlers (controllers in MVC terms)
+ * push the breadcrumb links onto the stack. @see elgg_push_breadcrumb()
+ *
+ *
+ * Pagination
+ * Automatically handled by Elgg when using elgg_list_entities* functions.
+ * @see elgg_list_entities()
+ *
+ *
+ * Tabs
+ * @see navigation/tabs view
+ *
+ *
+ * Menus
+ * Elgg uses a single interface to manage its menus. Menu items are added with
+ * {@link elgg_register_menu_item()}. This is generally used for menus that
+ * appear only once per page. For dynamic menus (such as the hover
+ * menu for user's avatar), a plugin hook is emitted when the menu is being
+ * created. The hook is 'register', 'menu:<menu_name>'. For more details on this,
+ * @see elgg_view_menu().
+ *
+ * Menus supported by the Elgg core
+ * Standard menus:
+ * site Site navigation shown on every page.
+ * page Page menu usually shown in a sidebar. Uses Elgg's context.
+ * topbar Topbar menu shown on every page. The default has two sections.
+ * footer Like the topbar but in the footer.
+ * extras Links about content on the page. The RSS link is added to this.
+ *
+ * Dynamic menus (also called just-in-time menus):
+ * user_hover Avatar hover menu. The user entity is passed as a parameter.
+ * entity The set of links shown in the summary of an entity.
+ * river Links shown on river items.
+ * owner_block Links shown for a user or group in their owner block.
+ * filter The tab filter for content (all, mine, friends)
+ * title The buttons shown next to a content title.
+ * long-text The links shown above the input/longtext view.
+ *
+ * @package Elgg.Core
+ * @subpackage Navigation
+ */
+
+/**
+ * Register an item for an Elgg menu
+ *
+ * @warning Generally you should not use this in response to the plugin hook:
+ * 'register', 'menu:<menu_name>'. If you do, you may end up with many incorrect
+ * links on a dynamic menu.
+ *
+ * @warning A menu item's name must be unique per menu. If more than one menu
+ * item with the same name are registered, the last menu item takes priority.
+ *
+ * @see elgg_view_menu() for the plugin hooks available for modifying a menu as
+ * it is being rendered.
+ *
+ * @param string $menu_name The name of the menu: site, page, userhover,
+ * userprofile, groupprofile, or any custom menu
+ * @param mixed $menu_item A ElggMenuItem object or an array of options in format:
+ * name => STR Menu item identifier (required)
+ * text => STR Menu item display text (required)
+ * href => STR Menu item URL (required) (false for non-links.
+ * @warning If you disable the href the <a> tag will
+ * not appear, so the link_class will not apply. If you
+ * put <a> tags in manually through the 'text' option
+ * the default CSS selector .elgg-menu-$menu > li > a
+ * may affect formatting. Wrap in a <span> if it does.)
+ * contexts => ARR Page context strings
+ * section => STR Menu section identifier
+ * title => STR Menu item tooltip
+ * selected => BOOL Is this menu item currently selected
+ * parent_name => STR Identifier of the parent menu item
+ * link_class => STR A class or classes for the <a> tag
+ * item_class => STR A class or classes for the <li> tag
+ *
+ * Additional options that the view output/url takes can be
+ * passed in the array. If the 'confirm' key is passed, the
+ * menu link uses the 'output/confirmlink' view. Custom
+ * options can be added by using the 'data' key with the
+ * value being an associative array.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_menu_item($menu_name, $menu_item) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->menus[$menu_name])) {
+ $CONFIG->menus[$menu_name] = array();
+ }
+
+ if (is_array($menu_item)) {
+ $item = ElggMenuItem::factory($menu_item);
+ if (!$item) {
+ elgg_log("Unable to add menu item '{$menu_item['name']}' to '$menu_name' menu", 'WARNING');
+ elgg_log(print_r($menu_item, true), 'DEBUG');
+ return false;
+ }
+ } else {
+ $item = $menu_item;
+ }
+
+ $CONFIG->menus[$menu_name][] = $item;
+ return true;
+}
+
+/**
+ * Remove an item from a menu
+ *
+ * @param string $menu_name The name of the menu
+ * @param string $item_name The unique identifier for this menu item
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unregister_menu_item($menu_name, $item_name) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->menus[$menu_name])) {
+ return false;
+ }
+
+ foreach ($CONFIG->menus[$menu_name] as $index => $menu_object) {
+ /* @var ElggMenuItem $menu_object */
+ if ($menu_object->getName() == $item_name) {
+ unset($CONFIG->menus[$menu_name][$index]);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Check if a menu item has been registered
+ *
+ * @param string $menu_name The name of the menu
+ * @param string $item_name The unique identifier for this menu item
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_is_menu_item_registered($menu_name, $item_name) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->menus[$menu_name])) {
+ return false;
+ }
+
+ foreach ($CONFIG->menus[$menu_name] as $menu_object) {
+ /* @var ElggMenuItem $menu_object */
+ if ($menu_object->getName() == $item_name) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Convenience function for registering a button to title menu
+ *
+ * The URL must be $handler/$name/$guid where $guid is the guid of the page owner.
+ * The label of the button is "$handler:$name" so that must be defined in a
+ * language file.
+ *
+ * This is used primarily to support adding an add content button
+ *
+ * @param string $handler The handler to use or null to autodetect from context
+ * @param string $name Name of the button
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_register_title_button($handler = null, $name = 'add') {
+ if (elgg_is_logged_in()) {
+
+ if (!$handler) {
+ $handler = elgg_get_context();
+ }
+
+ $owner = elgg_get_page_owner_entity();
+ if (!$owner) {
+ // no owns the page so this is probably an all site list page
+ $owner = elgg_get_logged_in_user_entity();
+ }
+ if ($owner && $owner->canWriteToContainer()) {
+ $guid = $owner->getGUID();
+ elgg_register_menu_item('title', array(
+ 'name' => $name,
+ 'href' => "$handler/$name/$guid",
+ 'text' => elgg_echo("$handler:$name"),
+ 'link_class' => 'elgg-button elgg-button-action',
+ ));
+ }
+ }
+}
+
+/**
+ * Adds a breadcrumb to the breadcrumbs stack.
+ *
+ * @param string $title The title to display
+ * @param string $link Optional. The link for the title.
+ *
+ * @return void
+ * @since 1.8.0
+ *
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_push_breadcrumb($title, $link = NULL) {
+ global $CONFIG;
+ if (!isset($CONFIG->breadcrumbs)) {
+ $CONFIG->breadcrumbs = array();
+ }
+
+ // avoid key collisions.
+ $CONFIG->breadcrumbs[] = array('title' => elgg_get_excerpt($title, 100), 'link' => $link);
+}
+
+/**
+ * Removes last breadcrumb entry.
+ *
+ * @return array popped item.
+ * @since 1.8.0
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_pop_breadcrumb() {
+ global $CONFIG;
+
+ if (is_array($CONFIG->breadcrumbs)) {
+ return array_pop($CONFIG->breadcrumbs);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Returns all breadcrumbs as an array of array('title' => 'Readable Title', 'link' => 'URL')
+ *
+ * @return array Breadcrumbs
+ * @since 1.8.0
+ * @link http://docs.elgg.org/Tutorials/UI/Breadcrumbs
+ */
+function elgg_get_breadcrumbs() {
+ global $CONFIG;
+
+ if (isset($CONFIG->breadcrumbs) && is_array($CONFIG->breadcrumbs)) {
+ return $CONFIG->breadcrumbs;
+ }
+
+ return array();
+}
+
+/**
+ * Set up the site menu
+ *
+ * Handles default, featured, and custom menu items
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return Menu array
+ * @param array $params
+ * @return array
+ * @access private
+ */
+function elgg_site_menu_setup($hook, $type, $return, $params) {
+
+ $featured_menu_names = elgg_get_config('site_featured_menu_names');
+ $custom_menu_items = elgg_get_config('site_custom_menu_items');
+ if ($featured_menu_names || $custom_menu_items) {
+ // we have featured or custom menu items
+
+ $registered = $return['default'];
+
+ // set up featured menu items
+ $featured = array();
+ foreach ($featured_menu_names as $name) {
+ foreach ($registered as $index => $item) {
+ if ($item->getName() == $name) {
+ $featured[] = $item;
+ unset($registered[$index]);
+ }
+ }
+ }
+
+ // add custom menu items
+ $n = 1;
+ foreach ($custom_menu_items as $title => $url) {
+ $item = new ElggMenuItem("custom$n", $title, $url);
+ $featured[] = $item;
+ $n++;
+ }
+
+ $return['default'] = $featured;
+ if (count($registered) > 0) {
+ $return['more'] = $registered;
+ }
+ } else {
+ // no featured menu items set
+ $max_display_items = 5;
+
+ // the first n are shown, rest added to more list
+ // if only one item on more menu, stick it with the rest
+ $num_menu_items = count($return['default']);
+ if ($num_menu_items > ($max_display_items + 1)) {
+ $return['more'] = array_splice($return['default'], $max_display_items);
+ }
+ }
+
+ // check if we have anything selected
+ $selected = false;
+ foreach ($return as $section) {
+ foreach ($section as $item) {
+ if ($item->getSelected()) {
+ $selected = true;
+ break 2;
+ }
+ }
+ }
+
+ if (!$selected) {
+ // nothing selected, match name to context or match url
+ $current_url = current_page_url();
+ foreach ($return as $section_name => $section) {
+ foreach ($section as $key => $item) {
+ // only highlight internal links
+ if (strpos($item->getHref(), elgg_get_site_url()) === 0) {
+ if ($item->getName() == elgg_get_context()) {
+ $return[$section_name][$key]->setSelected(true);
+ break 2;
+ }
+ if ($item->getHref() == $current_url) {
+ $return[$section_name][$key]->setSelected(true);
+ break 2;
+ }
+ }
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Add the comment and like links to river actions menu
+ * @access private
+ */
+function elgg_river_menu_setup($hook, $type, $return, $params) {
+ if (elgg_is_logged_in()) {
+ $item = $params['item'];
+ /* @var ElggRiverItem $item */
+ $object = $item->getObjectEntity();
+ // comments and non-objects cannot be commented on or liked
+ if (!elgg_in_context('widgets') && $item->annotation_id == 0) {
+ // comments
+ if ($object->canComment()) {
+ $options = array(
+ 'name' => 'comment',
+ 'href' => "#comments-add-$object->guid",
+ 'text' => elgg_view_icon('speech-bubble'),
+ 'title' => elgg_echo('comment:this'),
+ 'rel' => 'toggle',
+ 'priority' => 50,
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+ }
+
+ if (elgg_is_admin_logged_in()) {
+ $options = array(
+ 'name' => 'delete',
+ 'href' => elgg_add_action_tokens_to_url("action/river/delete?id=$item->id"),
+ 'text' => elgg_view_icon('delete'),
+ 'title' => elgg_echo('delete'),
+ 'confirm' => elgg_echo('deleteconfirm'),
+ 'priority' => 200,
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Entity menu is list of links and info on any entity
+ * @access private
+ */
+function elgg_entity_menu_setup($hook, $type, $return, $params) {
+ if (elgg_in_context('widgets')) {
+ return $return;
+ }
+
+ $entity = $params['entity'];
+ /* @var ElggEntity $entity */
+ $handler = elgg_extract('handler', $params, false);
+
+ // access
+ $access = elgg_view('output/access', array('entity' => $entity));
+ $options = array(
+ 'name' => 'access',
+ 'text' => $access,
+ 'href' => false,
+ 'priority' => 100,
+ );
+ $return[] = ElggMenuItem::factory($options);
+
+ if ($entity->canEdit() && $handler) {
+ // edit link
+ $options = array(
+ 'name' => 'edit',
+ 'text' => elgg_echo('edit'),
+ 'title' => elgg_echo('edit:this'),
+ 'href' => "$handler/edit/{$entity->getGUID()}",
+ 'priority' => 200,
+ );
+ $return[] = ElggMenuItem::factory($options);
+
+ // delete link
+ $options = array(
+ 'name' => 'delete',
+ 'text' => elgg_view_icon('delete'),
+ 'title' => elgg_echo('delete:this'),
+ 'href' => "action/$handler/delete?guid={$entity->getGUID()}",
+ 'confirm' => elgg_echo('deleteconfirm'),
+ 'priority' => 300,
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+
+ return $return;
+}
+
+/**
+ * Widget menu is a set of widget controls
+ * @access private
+ */
+function elgg_widget_menu_setup($hook, $type, $return, $params) {
+
+ $widget = $params['entity'];
+ /* @var ElggWidget $widget */
+ $show_edit = elgg_extract('show_edit', $params, true);
+
+ $collapse = array(
+ 'name' => 'collapse',
+ 'text' => ' ',
+ 'href' => "#elgg-widget-content-$widget->guid",
+ 'class' => 'elgg-widget-collapse-button',
+ 'rel' => 'toggle',
+ 'priority' => 1
+ );
+ $return[] = ElggMenuItem::factory($collapse);
+
+ if ($widget->canEdit()) {
+ $delete = array(
+ 'name' => 'delete',
+ 'text' => elgg_view_icon('delete-alt'),
+ 'title' => elgg_echo('widget:delete', array($widget->getTitle())),
+ 'href' => "action/widgets/delete?widget_guid=$widget->guid",
+ 'is_action' => true,
+ 'class' => 'elgg-widget-delete-button',
+ 'id' => "elgg-widget-delete-button-$widget->guid",
+ 'priority' => 900
+ );
+ $return[] = ElggMenuItem::factory($delete);
+
+ if ($show_edit) {
+ $edit = array(
+ 'name' => 'settings',
+ 'text' => elgg_view_icon('settings-alt'),
+ 'title' => elgg_echo('widget:edit'),
+ 'href' => "#widget-edit-$widget->guid",
+ 'class' => "elgg-widget-edit-button",
+ 'rel' => 'toggle',
+ 'priority' => 800,
+ );
+ $return[] = ElggMenuItem::factory($edit);
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Adds a delete link to "generic_comment" annotations
+ * @access private
+ */
+function elgg_annotation_menu_setup($hook, $type, $return, $params) {
+ $annotation = $params['annotation'];
+ /* @var ElggAnnotation $annotation */
+
+ if ($annotation->name == 'generic_comment' && $annotation->canEdit()) {
+ $url = elgg_http_add_url_query_elements('action/comments/delete', array(
+ 'annotation_id' => $annotation->id,
+ ));
+
+ $options = array(
+ 'name' => 'delete',
+ 'href' => $url,
+ 'text' => "<span class=\"elgg-icon elgg-icon-delete\"></span>",
+ 'confirm' => elgg_echo('deleteconfirm'),
+ 'encode_text' => false
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+
+ return $return;
+}
+
+
+/**
+ * Navigation initialization
+ * @access private
+ */
+function elgg_nav_init() {
+ elgg_register_plugin_hook_handler('prepare', 'menu:site', 'elgg_site_menu_setup');
+ elgg_register_plugin_hook_handler('register', 'menu:river', 'elgg_river_menu_setup');
+ elgg_register_plugin_hook_handler('register', 'menu:entity', 'elgg_entity_menu_setup');
+ elgg_register_plugin_hook_handler('register', 'menu:widget', 'elgg_widget_menu_setup');
+ elgg_register_plugin_hook_handler('register', 'menu:annotation', 'elgg_annotation_menu_setup');
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_nav_init');
diff --git a/engine/lib/notification.php b/engine/lib/notification.php
new file mode 100644
index 000000000..be0c359d4
--- /dev/null
+++ b/engine/lib/notification.php
@@ -0,0 +1,536 @@
+<?php
+/**
+ * Notifications
+ * This file contains classes and functions which allow plugins to register and send notifications.
+ *
+ * There are notification methods which are provided out of the box
+ * (see notification_init() ). Each method is identified by a string, e.g. "email".
+ *
+ * To register an event use register_notification_handler() and pass the method name and a
+ * handler function.
+ *
+ * To send a notification call notify() passing it the method you wish to use combined with a
+ * number of method specific addressing parameters.
+ *
+ * Catch NotificationException to trap errors.
+ *
+ * @package Elgg.Core
+ * @subpackage Notifications
+ */
+
+/** Notification handlers */
+global $NOTIFICATION_HANDLERS;
+$NOTIFICATION_HANDLERS = array();
+
+/**
+ * This function registers a handler for a given notification type (eg "email")
+ *
+ * @param string $method The method
+ * @param string $handler The handler function, in the format
+ * "handler(ElggEntity $from, ElggUser $to, $subject,
+ * $message, array $params = NULL)". This function should
+ * return false on failure, and true/a tracking message ID on success.
+ * @param array $params An associated array of other parameters for this handler
+ * defining some properties eg. supported msg length or rich text support.
+ *
+ * @return bool
+ */
+function register_notification_handler($method, $handler, $params = NULL) {
+ global $NOTIFICATION_HANDLERS;
+
+ if (is_callable($handler, true)) {
+ $NOTIFICATION_HANDLERS[$method] = new stdClass;
+
+ $NOTIFICATION_HANDLERS[$method]->handler = $handler;
+ if ($params) {
+ foreach ($params as $k => $v) {
+ $NOTIFICATION_HANDLERS[$method]->$k = $v;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * This function unregisters a handler for a given notification type (eg "email")
+ *
+ * @param string $method The method
+ *
+ * @return void
+ * @since 1.7.1
+ */
+function unregister_notification_handler($method) {
+ global $NOTIFICATION_HANDLERS;
+
+ if (isset($NOTIFICATION_HANDLERS[$method])) {
+ unset($NOTIFICATION_HANDLERS[$method]);
+ }
+}
+
+/**
+ * Notify a user via their preferences.
+ *
+ * @param mixed $to Either a guid or an array of guid's to notify.
+ * @param int $from GUID of the sender, which may be a user, site or object.
+ * @param string $subject Message subject.
+ * @param string $message Message body.
+ * @param array $params Misc additional parameters specific to various methods.
+ * @param mixed $methods_override A string, or an array of strings specifying the delivery
+ * methods to use - or leave blank for delivery using the
+ * user's chosen delivery methods.
+ *
+ * @return array Compound array of each delivery user/delivery method's success or failure.
+ * @throws NotificationException
+ */
+function notify_user($to, $from, $subject, $message, array $params = NULL, $methods_override = "") {
+ global $NOTIFICATION_HANDLERS;
+
+ // Sanitise
+ if (!is_array($to)) {
+ $to = array((int)$to);
+ }
+ $from = (int)$from;
+ //$subject = sanitise_string($subject);
+
+ // Get notification methods
+ if (($methods_override) && (!is_array($methods_override))) {
+ $methods_override = array($methods_override);
+ }
+
+ $result = array();
+
+ foreach ($to as $guid) {
+ // Results for a user are...
+ $result[$guid] = array();
+
+ if ($guid) { // Is the guid > 0?
+ // Are we overriding delivery?
+ $methods = $methods_override;
+ if (!$methods) {
+ $tmp = get_user_notification_settings($guid);
+ $methods = array();
+ // $tmp may be false. don't cast
+ if (is_object($tmp)) {
+ foreach ($tmp as $k => $v) {
+ // Add method if method is turned on for user!
+ if ($v) {
+ $methods[] = $k;
+ }
+ }
+ }
+ }
+
+ if ($methods) {
+ // Deliver
+ foreach ($methods as $method) {
+
+ if (!isset($NOTIFICATION_HANDLERS[$method])) {
+ continue;
+ }
+
+ // Extract method details from list
+ $details = $NOTIFICATION_HANDLERS[$method];
+ $handler = $details->handler;
+ /* @var callable $handler */
+
+ if ((!$NOTIFICATION_HANDLERS[$method]) || (!$handler) || (!is_callable($handler))) {
+ error_log(elgg_echo('NotificationException:NoHandlerFound', array($method)));
+ }
+
+ elgg_log("Sending message to $guid using $method");
+
+ // Trigger handler and retrieve result.
+ try {
+ $result[$guid][$method] = call_user_func($handler,
+ $from ? get_entity($from) : NULL, // From entity
+ get_entity($guid), // To entity
+ $subject, // The subject
+ $message, // Message
+ $params // Params
+ );
+ } catch (Exception $e) {
+ error_log($e->getMessage());
+ }
+
+ }
+ }
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Get the notification settings for a given user.
+ *
+ * @param int $user_guid The user id
+ *
+ * @return stdClass|false
+ */
+function get_user_notification_settings($user_guid = 0) {
+ $user_guid = (int)$user_guid;
+
+ if ($user_guid == 0) {
+ $user_guid = elgg_get_logged_in_user_guid();
+ }
+
+ // @todo: there should be a better way now that metadata is cached. E.g. just query for MD names, then
+ // query user object directly
+ $all_metadata = elgg_get_metadata(array(
+ 'guid' => $user_guid,
+ 'limit' => 0
+ ));
+ if ($all_metadata) {
+ $prefix = "notification:method:";
+ $return = new stdClass;
+
+ foreach ($all_metadata as $meta) {
+ $name = substr($meta->name, strlen($prefix));
+ $value = $meta->value;
+
+ if (strpos($meta->name, $prefix) === 0) {
+ $return->$name = $value;
+ }
+ }
+
+ return $return;
+ }
+
+ return false;
+}
+
+/**
+ * Set a user notification pref.
+ *
+ * @param int $user_guid The user id.
+ * @param string $method The delivery method (eg. email)
+ * @param bool $value On(true) or off(false).
+ *
+ * @return bool
+ */
+function set_user_notification_setting($user_guid, $method, $value) {
+ $user_guid = (int)$user_guid;
+ $method = sanitise_string($method);
+
+ $user = get_entity($user_guid);
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ if (($user) && ($user instanceof ElggUser)) {
+ $prefix = "notification:method:$method";
+ $user->$prefix = $value;
+ $user->save();
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Send a notification via email.
+ *
+ * @param ElggEntity $from The from user/site/object
+ * @param ElggUser $to To which user?
+ * @param string $subject The subject of the message.
+ * @param string $message The message body
+ * @param array $params Optional parameters (none taken in this instance)
+ *
+ * @return bool
+ * @throws NotificationException
+ * @access private
+ */
+function email_notify_handler(ElggEntity $from, ElggUser $to, $subject, $message,
+array $params = NULL) {
+
+ global $CONFIG;
+
+ if (!$from) {
+ $msg = elgg_echo('NotificationException:MissingParameter', array('from'));
+ throw new NotificationException($msg);
+ }
+
+ if (!$to) {
+ $msg = elgg_echo('NotificationException:MissingParameter', array('to'));
+ throw new NotificationException($msg);
+ }
+
+ if ($to->email == "") {
+ $msg = elgg_echo('NotificationException:NoEmailAddress', array($to->guid));
+ throw new NotificationException($msg);
+ }
+
+ // To
+ $to = $to->email;
+
+ // From
+ $site = elgg_get_site_entity();
+ // If there's an email address, use it - but only if its not from a user.
+ if (!($from instanceof ElggUser) && $from->email) {
+ $from = $from->email;
+ } else if ($site && $site->email) {
+ // Use email address of current site if we cannot use sender's email
+ $from = $site->email;
+ } else {
+ // If all else fails, use the domain of the site.
+ $from = 'noreply@' . get_site_domain($CONFIG->site_guid);
+ }
+
+ return elgg_send_email($from, $to, $subject, $message);
+}
+
+/**
+ * Send an email to any email address
+ *
+ * @param string $from Email address or string: "name <email>"
+ * @param string $to Email address or string: "name <email>"
+ * @param string $subject The subject of the message
+ * @param string $body The message body
+ * @param array $params Optional parameters (none used in this function)
+ *
+ * @return bool
+ * @throws NotificationException
+ * @since 1.7.2
+ */
+function elgg_send_email($from, $to, $subject, $body, array $params = NULL) {
+ global $CONFIG;
+
+ if (!$from) {
+ $msg = elgg_echo('NotificationException:MissingParameter', array('from'));
+ throw new NotificationException($msg);
+ }
+
+ if (!$to) {
+ $msg = elgg_echo('NotificationException:MissingParameter', array('to'));
+ throw new NotificationException($msg);
+ }
+
+ // return TRUE/FALSE to stop elgg_send_email() from sending
+ $mail_params = array(
+ 'to' => $to,
+ 'from' => $from,
+ 'subject' => $subject,
+ 'body' => $body,
+ 'params' => $params
+ );
+
+ $result = elgg_trigger_plugin_hook('email', 'system', $mail_params, NULL);
+ if ($result !== NULL) {
+ return $result;
+ }
+
+ $header_eol = "\r\n";
+ if (isset($CONFIG->broken_mta) && $CONFIG->broken_mta) {
+ // Allow non-RFC 2822 mail headers to support some broken MTAs
+ $header_eol = "\n";
+ }
+
+ // Windows is somewhat broken, so we use just address for to and from
+ if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
+ // strip name from to and from
+ if (strpos($to, '<')) {
+ preg_match('/<(.*)>/', $to, $matches);
+ $to = $matches[1];
+ }
+ if (strpos($from, '<')) {
+ preg_match('/<(.*)>/', $from, $matches);
+ $from = $matches[1];
+ }
+ }
+
+ $headers = "From: $from{$header_eol}"
+ . "Content-Type: text/plain; charset=UTF-8; format=flowed{$header_eol}"
+ . "MIME-Version: 1.0{$header_eol}"
+ . "Content-Transfer-Encoding: 8bit{$header_eol}";
+
+
+ // Sanitise subject by stripping line endings
+ $subject = preg_replace("/(\r\n|\r|\n)/", " ", $subject);
+ // this is because Elgg encodes everything and matches what is done with body
+ $subject = html_entity_decode($subject, ENT_COMPAT, 'UTF-8'); // Decode any html entities
+ if (is_callable('mb_encode_mimeheader')) {
+ $subject = mb_encode_mimeheader($subject, "UTF-8", "B");
+ }
+
+ // Format message
+ $body = html_entity_decode($body, ENT_COMPAT, 'UTF-8'); // Decode any html entities
+ $body = elgg_strip_tags($body); // Strip tags from message
+ $body = preg_replace("/(\r\n|\r)/", "\n", $body); // Convert to unix line endings in body
+ $body = preg_replace("/^From/", ">From", $body); // Change lines starting with From to >From
+
+ return mail($to, $subject, wordwrap($body), $headers);
+}
+
+/**
+ * Correctly initialise notifications and register the email handler.
+ *
+ * @return void
+ * @access private
+ */
+function notification_init() {
+ // Register a notification handler for the default email method
+ register_notification_handler("email", "email_notify_handler");
+
+ // Add settings view to user settings & register action
+ elgg_extend_view('forms/account/settings', 'core/settings/account/notifications');
+
+ elgg_register_plugin_hook_handler('usersettings:save', 'user', 'notification_user_settings_save');
+}
+
+/**
+ * Includes the action to save user notifications
+ *
+ * @return void
+ * @todo why can't this call action(...)?
+ * @access private
+ */
+function notification_user_settings_save() {
+ global $CONFIG;
+ //@todo Wha??
+ include($CONFIG->path . "actions/notifications/settings/usersettings/save.php");
+}
+
+/**
+ * Register an entity type and subtype to be eligible for notifications
+ *
+ * @param string $entity_type The type of entity
+ * @param string $object_subtype Its subtype
+ * @param string $language_name Its localized notification string (eg "New blog post")
+ *
+ * @return void
+ */
+function register_notification_object($entity_type, $object_subtype, $language_name) {
+ global $CONFIG;
+
+ if ($entity_type == '') {
+ $entity_type = '__BLANK__';
+ }
+ if ($object_subtype == '') {
+ $object_subtype = '__BLANK__';
+ }
+
+ if (!isset($CONFIG->register_objects)) {
+ $CONFIG->register_objects = array();
+ }
+
+ if (!isset($CONFIG->register_objects[$entity_type])) {
+ $CONFIG->register_objects[$entity_type] = array();
+ }
+
+ $CONFIG->register_objects[$entity_type][$object_subtype] = $language_name;
+}
+
+/**
+ * Establish a 'notify' relationship between the user and a content author
+ *
+ * @param int $user_guid The GUID of the user who wants to follow a user's content
+ * @param int $author_guid The GUID of the user whose content the user wants to follow
+ *
+ * @return bool Depending on success
+ */
+function register_notification_interest($user_guid, $author_guid) {
+ return add_entity_relationship($user_guid, 'notify', $author_guid);
+}
+
+/**
+ * Remove a 'notify' relationship between the user and a content author
+ *
+ * @param int $user_guid The GUID of the user who is following a user's content
+ * @param int $author_guid The GUID of the user whose content the user wants to unfollow
+ *
+ * @return bool Depending on success
+ */
+function remove_notification_interest($user_guid, $author_guid) {
+ return remove_entity_relationship($user_guid, 'notify', $author_guid);
+}
+
+/**
+ * Automatically triggered notification on 'create' events that looks at registered
+ * objects and attempts to send notifications to anybody who's interested
+ *
+ * @see register_notification_object
+ *
+ * @param string $event create
+ * @param string $object_type mixed
+ * @param mixed $object The object created
+ *
+ * @return bool
+ * @access private
+ */
+function object_notifications($event, $object_type, $object) {
+ // We only want to trigger notification events for ElggEntities
+ if ($object instanceof ElggEntity) {
+ /* @var ElggEntity $object */
+
+ // Get config data
+ global $CONFIG, $SESSION, $NOTIFICATION_HANDLERS;
+
+ $hookresult = elgg_trigger_plugin_hook('object:notifications', $object_type, array(
+ 'event' => $event,
+ 'object_type' => $object_type,
+ 'object' => $object,
+ ), false);
+ if ($hookresult === true) {
+ return true;
+ }
+
+ // Have we registered notifications for this type of entity?
+ $object_type = $object->getType();
+ if (empty($object_type)) {
+ $object_type = '__BLANK__';
+ }
+
+ $object_subtype = $object->getSubtype();
+ if (empty($object_subtype)) {
+ $object_subtype = '__BLANK__';
+ }
+
+ if (isset($CONFIG->register_objects[$object_type][$object_subtype])) {
+ $subject = $CONFIG->register_objects[$object_type][$object_subtype];
+ $string = $subject . ": " . $object->getURL();
+
+ // Get users interested in content from this person and notify them
+ // (Person defined by container_guid so we can also subscribe to groups if we want)
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $interested_users = elgg_get_entities_from_relationship(array(
+ 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'relationship' => 'notify' . $method,
+ 'relationship_guid' => $object->container_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ 'limit' => false
+ ));
+ /* @var ElggUser[] $interested_users */
+
+ if ($interested_users && is_array($interested_users)) {
+ foreach ($interested_users as $user) {
+ if ($user instanceof ElggUser && !$user->isBanned()) {
+ if (($user->guid != $SESSION['user']->guid) && has_access_to_entity($object, $user)
+ && $object->access_id != ACCESS_PRIVATE) {
+ $body = elgg_trigger_plugin_hook('notify:entity:message', $object->getType(), array(
+ 'entity' => $object,
+ 'to_entity' => $user,
+ 'method' => $method), $string);
+ if (empty($body) && $body !== false) {
+ $body = $string;
+ }
+ if ($body !== false) {
+ notify_user($user->guid, $object->container_guid, $subject, $body,
+ null, array($method));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// Register a startup event
+elgg_register_event_handler('init', 'system', 'notification_init', 0);
+elgg_register_event_handler('create', 'object', 'object_notifications');
diff --git a/engine/lib/objects.php b/engine/lib/objects.php
new file mode 100644
index 000000000..ff3cc733f
--- /dev/null
+++ b/engine/lib/objects.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Elgg objects
+ * Functions to manage multiple or single objects in an Elgg install
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+/**
+ * Return the object specific details of a object by a row.
+ *
+ * @param int $guid The guid to retreive
+ *
+ * @return bool
+ * @access private
+ */
+function get_object_entity_as_row($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}objects_entity where guid=$guid");
+}
+
+/**
+ * Create or update the extras table for a given object.
+ * Call create_entity first.
+ *
+ * @param int $guid The guid of the entity you're creating (as obtained by create_entity)
+ * @param string $title The title of the object
+ * @param string $description The object's description
+ *
+ * @return bool
+ * @access private
+ */
+function create_object_entity($guid, $title, $description) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $title = sanitise_string($title);
+ $description = sanitise_string($description);
+
+ $row = get_entity_as_row($guid);
+
+ if ($row) {
+ // Core entities row exists and we have access to it
+ $query = "SELECT guid from {$CONFIG->dbprefix}objects_entity where guid = {$guid}";
+ if ($exists = get_data_row($query)) {
+ $query = "UPDATE {$CONFIG->dbprefix}objects_entity
+ set title='$title', description='$description' where guid=$guid";
+
+ $result = update_data($query);
+ if ($result != false) {
+ // Update succeeded, continue
+ $entity = get_entity($guid);
+ elgg_trigger_event('update', $entity->type, $entity);
+ return $guid;
+ }
+ } else {
+ // Update failed, attempt an insert.
+ $query = "INSERT into {$CONFIG->dbprefix}objects_entity
+ (guid, title, description) values ($guid, '$title','$description')";
+
+ $result = insert_data($query);
+ if ($result !== false) {
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('create', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Get the sites this object is part of
+ *
+ * @param int $object_guid The object's GUID
+ * @param int $limit Number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return false|array On success, an array of ElggSites
+ */
+function get_object_sites($object_guid, $limit = 10, $offset = 0) {
+ $object_guid = (int)$object_guid;
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $object_guid,
+ 'type' => 'site',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ ));
+}
+
+/**
+ * Runs unit tests for ElggObject
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function objects_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = "{$CONFIG->path}engine/tests/objects/objects.php";
+ return $value;
+}
+
+elgg_register_event_handler('init', 'system', 'objects_init', 0);
+elgg_register_plugin_hook_handler('unit_test', 'system', 'objects_test');
diff --git a/engine/lib/opendd.php b/engine/lib/opendd.php
new file mode 100644
index 000000000..7d635a295
--- /dev/null
+++ b/engine/lib/opendd.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * OpenDD PHP Library.
+ *
+ * @package Elgg.Core
+ * @subpackage ODD
+ * @version 0.4
+ */
+
+// @codingStandardsIgnoreStart
+
+/**
+ * Attempt to construct an ODD object out of a XmlElement or sub-elements.
+ *
+ * @param XmlElement $element The element(s)
+ *
+ * @return mixed An ODD object if the element can be handled, or false.
+ * @access private
+ */
+function ODD_factory (XmlElement $element) {
+ $name = $element->name;
+ $odd = false;
+
+ switch ($name) {
+ case 'entity' :
+ $odd = new ODDEntity("", "", "");
+ break;
+ case 'metadata' :
+ $odd = new ODDMetaData("", "", "", "");
+ break;
+ case 'relationship' :
+ $odd = new ODDRelationship("", "", "");
+ break;
+ }
+
+ // Now populate values
+ if ($odd) {
+ // Attributes
+ foreach ($element->attributes as $k => $v) {
+ $odd->setAttribute($k, $v);
+ }
+
+ // Body
+ $body = $element->content;
+ $a = stripos($body, "<![CDATA");
+ $b = strripos($body, "]]>");
+ if (($body) && ($a !== false) && ($b !== false)) {
+ $body = substr($body, $a + 8, $b - ($a + 8));
+ }
+
+ $odd->setBody($body);
+ }
+
+ return $odd;
+}
+
+/**
+ * Import an ODD document.
+ *
+ * @param string $xml The XML ODD.
+ *
+ * @return ODDDocument
+ * @access private
+ */
+function ODD_Import($xml) {
+ // Parse XML to an array
+ $elements = xml_to_object($xml);
+
+ // Sanity check 1, was this actually XML?
+ if ((!$elements) || (!$elements->children)) {
+ return false;
+ }
+
+ // Create ODDDocument
+ $document = new ODDDocument();
+
+ // Itterate through array of elements and construct ODD document
+ $cnt = 0;
+
+ foreach ($elements->children as $child) {
+ $odd = ODD_factory($child);
+
+ if ($odd) {
+ $document->addElement($odd);
+ $cnt++;
+ }
+ }
+
+ // Check that we actually found something
+ if ($cnt == 0) {
+ return false;
+ }
+
+ return $document;
+}
+
+/**
+ * Export an ODD Document.
+ *
+ * @param ODDDocument $document The Document.
+ *
+ * @return string
+ * @access private
+ */
+function ODD_Export(ODDDocument $document) {
+ return "$document";
+}
+
+// @codingStandardsIgnoreEnd
diff --git a/engine/lib/output.php b/engine/lib/output.php
new file mode 100644
index 000000000..de4f911fb
--- /dev/null
+++ b/engine/lib/output.php
@@ -0,0 +1,469 @@
+<?php
+/**
+ * Output functions
+ * Processing text for output such as pulling out URLs and extracting excerpts
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+/**
+ * Takes a string and turns any URLs into formatted links
+ *
+ * @param string $text The input string
+ *
+ * @return string The output string with formatted links
+ */
+function parse_urls($text) {
+
+ // URI specification: http://www.ietf.org/rfc/rfc3986.txt
+ // This varies from the specification in the following ways:
+ // * Supports non-ascii characters
+ // * Does not allow parentheses and single quotes
+ // * Cuts off commas, exclamation points, and periods off as last character
+
+ // @todo this causes problems with <attr = "val">
+ // must be in <attr="val"> format (no space).
+ // By default htmlawed rewrites tags to this format.
+ // if PHP supported conditional negative lookbehinds we could use this:
+ // $r = preg_replace_callback('/(?<!=)(?<![ ])?(?<!["\'])((ht|f)tps?:\/\/[^\s\r\n\t<>"\'\!\(\),]+)/i',
+ $r = preg_replace_callback('/(?<![=\/"\'])((ht|f)tps?:\/\/[^\s\r\n\t<>"\']+)/i',
+ create_function(
+ '$matches',
+ '
+ $url = $matches[1];
+ $punc = "";
+ $last = substr($url, -1, 1);
+ if (in_array($last, array(".", "!", ",", "(", ")"))) {
+ $punc = $last;
+ $url = rtrim($url, ".!,()");
+ }
+ $urltext = str_replace("/", "/<wbr />", $url);
+ return "<a href=\"$url\" rel=\"nofollow\">$urltext</a>$punc";
+ '
+ ), $text);
+
+ return $r;
+}
+
+/**
+ * Create paragraphs from text with line spacing
+ *
+ * @param string $pee The string
+ * @deprecated Use elgg_autop instead
+ * @todo Add deprecation warning in 1.9
+ *
+ * @return string
+ **/
+function autop($pee) {
+ return elgg_autop($pee);
+}
+
+/**
+ * Create paragraphs from text with line spacing
+ *
+ * @param string $string The string
+ *
+ * @return string
+ **/
+function elgg_autop($string) {
+ return ElggAutoP::getInstance()->process($string);
+}
+
+/**
+ * Returns an excerpt.
+ * Will return up to n chars stopping at the nearest space.
+ * If no spaces are found (like in Japanese) will crop off at the
+ * n char mark. Adds ... if any text was chopped.
+ *
+ * @param string $text The full text to excerpt
+ * @param int $num_chars Return a string up to $num_chars long
+ *
+ * @return string
+ * @since 1.7.2
+ */
+function elgg_get_excerpt($text, $num_chars = 250) {
+ $text = trim(elgg_strip_tags($text));
+ $string_length = elgg_strlen($text);
+
+ if ($string_length <= $num_chars) {
+ return $text;
+ }
+
+ // handle cases
+ $excerpt = elgg_substr($text, 0, $num_chars);
+ $space = elgg_strrpos($excerpt, ' ', 0);
+
+ // don't crop if can't find a space.
+ if ($space === FALSE) {
+ $space = $num_chars;
+ }
+ $excerpt = trim(elgg_substr($excerpt, 0, $space));
+
+ if ($string_length != elgg_strlen($excerpt)) {
+ $excerpt .= '...';
+ }
+
+ return $excerpt;
+}
+
+/**
+ * Handles formatting of ampersands in urls
+ *
+ * @param string $url The URL
+ *
+ * @return string
+ * @since 1.7.1
+ */
+function elgg_format_url($url) {
+ return preg_replace('/&(?!amp;)/', '&amp;', $url);
+}
+
+/**
+ * Converts an associative array into a string of well-formed attributes
+ *
+ * @note usually for HTML, but could be useful for XML too...
+ *
+ * @param array $attrs An associative array of attr => val pairs
+ *
+ * @return string HTML attributes to be inserted into a tag (e.g., <tag $attrs>)
+ */
+function elgg_format_attributes(array $attrs) {
+ $attrs = elgg_clean_vars($attrs);
+ $attributes = array();
+
+ if (isset($attrs['js'])) {
+ //@todo deprecated notice?
+
+ if (!empty($attrs['js'])) {
+ $attributes[] = $attrs['js'];
+ }
+
+ unset($attrs['js']);
+ }
+
+ foreach ($attrs as $attr => $val) {
+ $attr = strtolower($attr);
+
+ if ($val === TRUE) {
+ $val = $attr; //e.g. checked => TRUE ==> checked="checked"
+ }
+
+ // ignore $vars['entity'] => ElggEntity stuff
+ if ($val !== NULL && $val !== false && (is_array($val) || !is_object($val))) {
+
+ // allow $vars['class'] => array('one', 'two');
+ // @todo what about $vars['style']? Needs to be semi-colon separated...
+ if (is_array($val)) {
+ $val = implode(' ', $val);
+ }
+
+ $val = htmlspecialchars($val, ENT_QUOTES, 'UTF-8', false);
+ $attributes[] = "$attr=\"$val\"";
+ }
+ }
+
+ return implode(' ', $attributes);
+}
+
+/**
+ * Preps an associative array for use in {@link elgg_format_attributes()}.
+ *
+ * Removes all the junk that {@link elgg_view()} puts into $vars.
+ * Maintains backward compatibility with attributes like 'internalname' and 'internalid'
+ *
+ * @note This function is called automatically by elgg_format_attributes(). No need to
+ * call it yourself before using elgg_format_attributes().
+ *
+ * @param array $vars The raw $vars array with all it's dirtiness (config, url, etc.)
+ *
+ * @return array The array, ready to be used in elgg_format_attributes().
+ * @access private
+ */
+function elgg_clean_vars(array $vars = array()) {
+ unset($vars['config']);
+ unset($vars['url']);
+ unset($vars['user']);
+
+ // backwards compatibility code
+ if (isset($vars['internalname'])) {
+ $vars['name'] = $vars['internalname'];
+ unset($vars['internalname']);
+ }
+
+ if (isset($vars['internalid'])) {
+ $vars['id'] = $vars['internalid'];
+ unset($vars['internalid']);
+ }
+
+ if (isset($vars['__ignoreInternalid'])) {
+ unset($vars['__ignoreInternalid']);
+ }
+
+ if (isset($vars['__ignoreInternalname'])) {
+ unset($vars['__ignoreInternalname']);
+ }
+
+ return $vars;
+}
+
+/**
+ * Converts shorthand urls to absolute urls.
+ *
+ * If the url is already absolute or protocol-relative, no change is made.
+ *
+ * @example
+ * elgg_normalize_url(''); // 'http://my.site.com/'
+ * elgg_normalize_url('dashboard'); // 'http://my.site.com/dashboard'
+ * elgg_normalize_url('http://google.com/'); // no change
+ * elgg_normalize_url('//google.com/'); // no change
+ *
+ * @param string $url The URL to normalize
+ *
+ * @return string The absolute url
+ */
+function elgg_normalize_url($url) {
+ // see https://bugs.php.net/bug.php?id=51192
+ // from the bookmarks save action.
+ $php_5_2_13_and_below = version_compare(PHP_VERSION, '5.2.14', '<');
+ $php_5_3_0_to_5_3_2 = version_compare(PHP_VERSION, '5.3.0', '>=') &&
+ version_compare(PHP_VERSION, '5.3.3', '<');
+
+ if ($php_5_2_13_and_below || $php_5_3_0_to_5_3_2) {
+ $tmp_address = str_replace("-", "", $url);
+ $validated = filter_var($tmp_address, FILTER_VALIDATE_URL);
+ } else {
+ $validated = filter_var($url, FILTER_VALIDATE_URL);
+ }
+
+ // work around for handling absoluate IRIs (RFC 3987) - see #4190
+ if (!$validated && (strpos($url, 'http:') === 0) || (strpos($url, 'https:') === 0)) {
+ $validated = true;
+ }
+
+ if ($validated) {
+ // all normal URLs including mailto:
+ return $url;
+
+ } elseif (preg_match("#^(\#|\?|//)#i", $url)) {
+ // '//example.com' (Shortcut for protocol.)
+ // '?query=test', #target
+ return $url;
+
+ } elseif (stripos($url, 'javascript:') === 0 || stripos($url, 'mailto:') === 0) {
+ // 'javascript:' and 'mailto:'
+ // Not covered in FILTER_VALIDATE_URL
+ return $url;
+
+ } elseif (preg_match("#^[^/]*\.php(\?.*)?$#i", $url)) {
+ // 'install.php', 'install.php?step=step'
+ return elgg_get_site_url() . $url;
+
+ } elseif (preg_match("#^[^/]*\.#i", $url)) {
+ // 'example.com', 'example.com/subpage'
+ return "http://$url";
+
+ } else {
+ // 'page/handler', 'mod/plugin/file.php'
+
+ // trim off any leading / because the site URL is stored
+ // with a trailing /
+ return elgg_get_site_url() . ltrim($url, '/');
+ }
+}
+
+/**
+ * When given a title, returns a version suitable for inclusion in a URL
+ *
+ * @param string $title The title
+ *
+ * @return string The optimised title
+ * @since 1.7.2
+ */
+function elgg_get_friendly_title($title) {
+
+ // return a URL friendly title to short circuit normal title formatting
+ $params = array('title' => $title);
+ $result = elgg_trigger_plugin_hook('format', 'friendly:title', $params, NULL);
+ if ($result) {
+ return $result;
+ }
+
+ // titles are often stored HTML encoded
+ $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
+
+ $title = ElggTranslit::urlize($title);
+
+ return $title;
+}
+
+/**
+ * Formats a UNIX timestamp in a friendly way (eg "less than a minute ago")
+ *
+ * @see elgg_view_friendly_time()
+ *
+ * @param int $time A UNIX epoch timestamp
+ *
+ * @return string The friendly time string
+ * @since 1.7.2
+ */
+function elgg_get_friendly_time($time) {
+
+ // return a time string to short circuit normal time formatting
+ $params = array('time' => $time);
+ $result = elgg_trigger_plugin_hook('format', 'friendly:time', $params, NULL);
+ if ($result) {
+ return $result;
+ }
+
+ $diff = time() - (int)$time;
+
+ $minute = 60;
+ $hour = $minute * 60;
+ $day = $hour * 24;
+
+ if ($diff < $minute) {
+ return elgg_echo("friendlytime:justnow");
+ } else if ($diff < $hour) {
+ $diff = round($diff / $minute);
+ if ($diff == 0) {
+ $diff = 1;
+ }
+
+ if ($diff > 1) {
+ return elgg_echo("friendlytime:minutes", array($diff));
+ } else {
+ return elgg_echo("friendlytime:minutes:singular", array($diff));
+ }
+ } else if ($diff < $day) {
+ $diff = round($diff / $hour);
+ if ($diff == 0) {
+ $diff = 1;
+ }
+
+ if ($diff > 1) {
+ return elgg_echo("friendlytime:hours", array($diff));
+ } else {
+ return elgg_echo("friendlytime:hours:singular", array($diff));
+ }
+ } else {
+ $diff = round($diff / $day);
+ if ($diff == 0) {
+ $diff = 1;
+ }
+
+ if ($diff > 1) {
+ return elgg_echo("friendlytime:days", array($diff));
+ } else {
+ return elgg_echo("friendlytime:days:singular", array($diff));
+ }
+ }
+}
+
+/**
+ * Strip tags and offer plugins the chance.
+ * Plugins register for output:strip_tags plugin hook.
+ * Original string included in $params['original_string']
+ *
+ * @param string $string Formatted string
+ *
+ * @return string String run through strip_tags() and any plugin hooks.
+ */
+function elgg_strip_tags($string) {
+ $params['original_string'] = $string;
+
+ $string = strip_tags($string);
+ $string = elgg_trigger_plugin_hook('format', 'strip_tags', $params, $string);
+
+ return $string;
+}
+
+/**
+ * Apply html_entity_decode() to a string while re-entitising HTML
+ * special char entities to prevent them from being decoded back to their
+ * unsafe original forms.
+ *
+ * This relies on html_entity_decode() not translating entities when
+ * doing so leaves behind another entity, e.g. &amp;gt; if decoded would
+ * create &gt; which is another entity itself. This seems to escape the
+ * usual behaviour where any two paired entities creating a HTML tag are
+ * usually decoded, i.e. a lone &gt; is not decoded, but &lt;foo&gt; would
+ * be decoded to <foo> since it creates a full tag.
+ *
+ * Note: This function is poorly explained in the manual - which is really
+ * bad given its potential for misuse on user input already escaped elsewhere.
+ * Stackoverflow is littered with advice to use this function in the precise
+ * way that would lead to user input being capable of injecting arbitrary HTML.
+ *
+ * @param string $string
+ *
+ * @return string
+ *
+ * @author Pádraic Brady
+ * @copyright Copyright (c) 2010 Pádraic Brady (http://blog.astrumfutura.com)
+ * @license Released under dual-license GPL2/MIT by explicit permission of Pádraic Brady
+ *
+ * @access private
+ */
+function _elgg_html_decode($string) {
+ $string = str_replace(
+ array('&gt;', '&lt;', '&amp;', '&quot;', '&#039;'),
+ array('&amp;gt;', '&amp;lt;', '&amp;amp;', '&amp;quot;', '&amp;#039;'),
+ $string
+ );
+ $string = html_entity_decode($string, ENT_NOQUOTES, 'UTF-8');
+ $string = str_replace(
+ array('&amp;gt;', '&amp;lt;', '&amp;amp;', '&amp;quot;', '&amp;#039;'),
+ array('&gt;', '&lt;', '&amp;', '&quot;', '&#039;'),
+ $string
+ );
+ return $string;
+}
+
+/**
+ * Prepares query string for output to prevent CSRF attacks.
+ *
+ * @param string $string
+ * @return string
+ *
+ * @access private
+ */
+function _elgg_get_display_query($string) {
+ //encode <,>,&, quotes and characters above 127
+ if (function_exists('mb_convert_encoding')) {
+ $display_query = mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-8');
+ } else {
+ // if no mbstring extension, we just strip characters
+ $display_query = preg_replace("/[^\x01-\x7F]/", "", $string);
+ }
+ return htmlspecialchars($display_query, ENT_QUOTES, 'UTF-8', false);
+}
+
+/**
+ * Unit tests for Output
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function output_unit_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/output.php';
+ return $value;
+}
+
+/**
+ * Initialise the Output subsystem.
+ *
+ * @return void
+ * @access private
+ */
+function output_init() {
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'output_unit_test');
+}
+
+elgg_register_event_handler('init', 'system', 'output_init');
diff --git a/engine/lib/pagehandler.php b/engine/lib/pagehandler.php
new file mode 100644
index 000000000..0cf99b6fe
--- /dev/null
+++ b/engine/lib/pagehandler.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Elgg page handler functions
+ *
+ * @package Elgg.Core
+ * @subpackage Routing
+ */
+
+/**
+ * Routes the request to a registered page handler
+ *
+ * This function sets the context based on the handler name (first segment of the
+ * URL). It also triggers a plugin hook 'route', $handler so that plugins can
+ * modify the routing or handle a request.
+ *
+ * @param string $handler The name of the handler type (eg 'blog')
+ * @param array $page The parameters to the page, as an array (exploded by '/' slashes)
+ *
+ * @return bool
+ * @access private
+ */
+function page_handler($handler, $page) {
+ global $CONFIG;
+
+ elgg_set_context($handler);
+
+ $page = explode('/', $page);
+ // remove empty array element when page url ends in a / (see #1480)
+ if ($page[count($page) - 1] === '') {
+ array_pop($page);
+ }
+
+ // return false to stop processing the request (because you handled it)
+ // return a new $request array if you want to route the request differently
+ $request = array(
+ 'handler' => $handler,
+ 'segments' => $page,
+ );
+ $request = elgg_trigger_plugin_hook('route', $handler, null, $request);
+ if ($request === false) {
+ return true;
+ }
+
+ $handler = $request['handler'];
+ $page = $request['segments'];
+
+ $result = false;
+ if (isset($CONFIG->pagehandler)
+ && !empty($handler)
+ && isset($CONFIG->pagehandler[$handler])
+ && is_callable($CONFIG->pagehandler[$handler])) {
+ $function = $CONFIG->pagehandler[$handler];
+ $result = call_user_func($function, $page, $handler);
+ }
+
+ return $result || headers_sent();
+}
+
+/**
+ * Registers a page handler for a particular identifier
+ *
+ * For example, you can register a function called 'blog_page_handler' for handler type 'blog'
+ * For all URLs http://yoururl/blog/*, the blog_page_handler() function will be called.
+ * The part of the URL marked with * above will be exploded on '/' characters and passed as an
+ * array to that function.
+ * For example, the URL http://yoururl/blog/username/friends/ would result in the call:
+ * blog_page_handler(array('username','friends'), blog);
+ *
+ * A request to register a page handler with the same identifier as previously registered
+ * handler will replace the previous one.
+ *
+ * The context is set to the page handler identifier before the registered
+ * page handler function is called. For the above example, the context is set to 'blog'.
+ *
+ * Page handlers should return true to indicate that they handled the request.
+ * Requests not handled are forwarded to the front page with a reason of 404.
+ * Plugins can register for the 'forward', '404' plugin hook. @see forward()
+ *
+ * @param string $handler The page type to handle
+ * @param string $function Your function name
+ *
+ * @return bool Depending on success
+ */
+function elgg_register_page_handler($handler, $function) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->pagehandler)) {
+ $CONFIG->pagehandler = array();
+ }
+ if (is_callable($function, true)) {
+ $CONFIG->pagehandler[$handler] = $function;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Unregister a page handler for an identifier
+ *
+ * Note: to replace a page handler, call elgg_register_page_handler()
+ *
+ * @param string $handler The page type identifier
+ *
+ * @since 1.7.2
+ * @return void
+ */
+function elgg_unregister_page_handler($handler) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->pagehandler)) {
+ return;
+ }
+
+ unset($CONFIG->pagehandler[$handler]);
+}
+
+/**
+ * Serve an error page
+ *
+ * @todo not sending status codes yet
+ *
+ * @param string $hook The name of the hook
+ * @param string $type The type of the hook
+ * @param bool $result The current value of the hook
+ * @param array $params Parameters related to the hook
+ * @return void
+ */
+function elgg_error_page_handler($hook, $type, $result, $params) {
+ if (elgg_view_exists("errors/$type")) {
+ $content = elgg_view("errors/$type", $params);
+ } else {
+ $content = elgg_view("errors/default", $params);
+ }
+ $body = elgg_view_layout('error', array('content' => $content));
+ echo elgg_view_page('', $body, 'error');
+ exit;
+}
+
+/**
+ * Initializes the page handler/routing system
+ *
+ * @return void
+ * @access private
+ */
+function page_handler_init() {
+ elgg_register_plugin_hook_handler('forward', '404', 'elgg_error_page_handler');
+}
+
+elgg_register_event_handler('init', 'system', 'page_handler_init');
diff --git a/engine/lib/pageowner.php b/engine/lib/pageowner.php
new file mode 100644
index 000000000..4aaffc160
--- /dev/null
+++ b/engine/lib/pageowner.php
@@ -0,0 +1,297 @@
+<?php
+/**
+ * Elgg page owner library
+ * Contains functions for managing page ownership and context
+ *
+ * @package Elgg.Core
+ * @subpackage PageOwner
+ */
+
+/**
+ * Gets the guid of the entity that owns the current page.
+ *
+ * @param int $guid Optional parameter used by elgg_set_page_owner_guid().
+ *
+ * @return int The current page owner guid (0 if none).
+ * @since 1.8.0
+ */
+function elgg_get_page_owner_guid($guid = 0) {
+ static $page_owner_guid;
+
+ if ($guid) {
+ $page_owner_guid = $guid;
+ }
+
+ if (isset($page_owner_guid)) {
+ return $page_owner_guid;
+ }
+
+ // return guid of page owner entity
+ $guid = elgg_trigger_plugin_hook('page_owner', 'system', NULL, 0);
+
+ if ($guid) {
+ $page_owner_guid = $guid;
+ }
+
+ return $guid;
+}
+
+/**
+ * Gets the owner entity for the current page.
+ *
+ * @note Access is disabled when getting the page owner entity.
+ *
+ * @return ElggUser|ElggGroup|false The current page owner or false if none.
+ *
+ * @since 1.8.0
+ */
+function elgg_get_page_owner_entity() {
+ $guid = elgg_get_page_owner_guid();
+ if ($guid > 0) {
+ $ia = elgg_set_ignore_access(true);
+ $owner = get_entity($guid);
+ elgg_set_ignore_access($ia);
+
+ return $owner;
+ }
+
+ return false;
+}
+
+/**
+ * Set the guid of the entity that owns this page
+ *
+ * @param int $guid The guid of the page owner
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_set_page_owner_guid($guid) {
+ elgg_get_page_owner_guid($guid);
+}
+
+/**
+ * Sets the page owner based on request
+ *
+ * Tries to figure out the page owner by looking at the URL or a request
+ * parameter. The request parameters used are 'username' and 'owner_guid'. If
+ * the page request is going through the page handling system, this function
+ * attempts to figure out the owner if the url fits the patterns of:
+ * <handler>/owner/<username>
+ * <handler>/friends/<username>
+ * <handler>/view/<entity guid>
+ * <handler>/add/<container guid>
+ * <handler>/edit/<entity guid>
+ * <handler>/group/<group guid>
+ *
+ * @note Access is disabled while finding the page owner for the group gatekeeper functions.
+ *
+ *
+ * @param string $hook 'page_owner'
+ * @param string $entity_type 'system'
+ * @param int $returnvalue Previous function's return value
+ * @param array $params no parameters
+ *
+ * @return int GUID
+ * @access private
+ */
+function default_page_owner_handler($hook, $entity_type, $returnvalue, $params) {
+
+ if ($returnvalue) {
+ return $returnvalue;
+ }
+
+ $ia = elgg_set_ignore_access(true);
+
+ $username = get_input("username");
+ if ($username) {
+ // @todo using a username of group:<guid> is deprecated
+ if (substr_count($username, 'group:')) {
+ preg_match('/group\:([0-9]+)/i', $username, $matches);
+ $guid = $matches[1];
+ if ($entity = get_entity($guid)) {
+ elgg_set_ignore_access($ia);
+ return $entity->getGUID();
+ }
+ }
+
+ if ($user = get_user_by_username($username)) {
+ elgg_set_ignore_access($ia);
+ return $user->getGUID();
+ }
+ }
+
+ $owner = get_input("owner_guid");
+ if ($owner) {
+ if ($user = get_entity($owner)) {
+ elgg_set_ignore_access($ia);
+ return $user->getGUID();
+ }
+ }
+
+ // ignore root and query
+ $uri = current_page_url();
+ $path = str_replace(elgg_get_site_url(), '', $uri);
+ $path = trim($path, "/");
+ if (strpos($path, "?")) {
+ $path = substr($path, 0, strpos($path, "?"));
+ }
+
+ // @todo feels hacky
+ if (get_input('page', FALSE)) {
+ $segments = explode('/', $path);
+ if (isset($segments[1]) && isset($segments[2])) {
+ switch ($segments[1]) {
+ case 'owner':
+ case 'friends':
+ $user = get_user_by_username(urldecode($segments[2]));
+ if ($user) {
+ elgg_set_ignore_access($ia);
+ return $user->getGUID();
+ }
+ break;
+ case 'view':
+ case 'edit':
+ $entity = get_entity($segments[2]);
+ if ($entity) {
+ elgg_set_ignore_access($ia);
+ return $entity->getContainerGUID();
+ }
+ break;
+ case 'add':
+ case 'group':
+ $entity = get_entity($segments[2]);
+ if ($entity) {
+ elgg_set_ignore_access($ia);
+ return $entity->getGUID();
+ }
+ break;
+ }
+ }
+ }
+
+ elgg_set_ignore_access($ia);
+}
+
+/**
+ * Sets the page context
+ *
+ * Views can modify their output based on the local context. You may want to
+ * display a list of blogs on a blog page or in a small widget. The rendered
+ * output could be different for those two contexts ('blog' vs 'widget').
+ *
+ * Pages that pass through the page handling system set the context to the
+ * first string after the root url. Example: http://example.org/elgg/bookmarks/
+ * results in the initial context being set to 'bookmarks'.
+ *
+ * The context is a stack so that for a widget on a profile, the context stack
+ * may contain first 'profile' and then 'widget'.
+ *
+ * If no context was been set, the default context returned is 'main'.
+ *
+ * @warning The context is not available until the page_handler runs (after
+ * the 'init, system' event processing has completed).
+ *
+ * @param string $context The context of the page
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_set_context($context) {
+ global $CONFIG;
+
+ $context = trim($context);
+
+ if (empty($context)) {
+ return false;
+ }
+
+ $context = strtolower($context);
+
+ array_pop($CONFIG->context);
+ array_push($CONFIG->context, $context);
+
+ return true;
+}
+
+/**
+ * Get the current context.
+ *
+ * Since context is a stack, this is equivalent to a peek.
+ *
+ * @return string|NULL
+ * @since 1.8.0
+ */
+function elgg_get_context() {
+ global $CONFIG;
+
+ if (!$CONFIG->context) {
+ return null;
+ }
+
+ return $CONFIG->context[count($CONFIG->context) - 1];
+}
+
+/**
+ * Push a context onto the top of the stack
+ *
+ * @param string $context The context string to add to the context stack
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_push_context($context) {
+ global $CONFIG;
+
+ array_push($CONFIG->context, $context);
+}
+
+/**
+ * Removes and returns the top context string from the stack
+ *
+ * @return string|NULL
+ * @since 1.8.0
+ */
+function elgg_pop_context() {
+ global $CONFIG;
+
+ return array_pop($CONFIG->context);
+}
+
+/**
+ * Check if this context exists anywhere in the stack
+ *
+ * This is useful for situations with more than one element in the stack. For
+ * example, a widget has a context of 'widget'. If a widget view needs to render
+ * itself differently based on being on the dashboard or profile pages, it
+ * can check the stack.
+ *
+ * @param string $context The context string to check for
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_in_context($context) {
+ global $CONFIG;
+
+ return in_array($context, $CONFIG->context);
+}
+
+/**
+ * Initializes the page owner functions
+ *
+ * @note This is on the 'boot, system' event so that the context is set up quickly.
+ *
+ * @return void
+ * @access private
+ */
+function page_owner_boot() {
+
+ elgg_register_plugin_hook_handler('page_owner', 'system', 'default_page_owner_handler');
+
+ // Bootstrap the context stack by setting its first entry to the handler.
+ // This is the first segment of the URL and the handler is set by the rewrite rules.
+ // @todo this does not work for actions
+ $handler = get_input('handler', FALSE);
+ if ($handler) {
+ elgg_set_context($handler);
+ }
+}
+
+elgg_register_event_handler('boot', 'system', 'page_owner_boot');
diff --git a/engine/lib/pam.php b/engine/lib/pam.php
new file mode 100644
index 000000000..1c9c3bfe1
--- /dev/null
+++ b/engine/lib/pam.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Elgg Simple PAM library
+ * Contains functions for managing authentication.
+ * This is not a full implementation of PAM. It supports a single facility
+ * (authentication) and allows multiple policies (user authentication is the
+ * default). There are two control flags possible for each module: sufficient
+ * or required. The entire chain for a policy is processed (or until a
+ * required module fails). A module fails by returning false or throwing an
+ * exception. The order that modules are processed is determined by the order
+ * they are registered. For an example of a PAM, see pam_auth_userpass() in
+ * sessions.php.
+ *
+ * For more information on PAMs see:
+ * http://www.freebsd.org/doc/en/articles/pam/index.html
+ *
+ * @see ElggPAM
+ *
+ * @package Elgg.Core
+ * @subpackage Authentication.PAM
+ */
+
+global $_PAM_HANDLERS;
+$_PAM_HANDLERS = array();
+
+/**
+ * Register a PAM handler.
+ *
+ * A PAM handler should return true if the authentication attempt passed. For a
+ * failure, return false or throw an exception. Returning nothing indicates that
+ * the handler wants to be skipped.
+ *
+ * Note, $handler must be string callback (not an array/Closure).
+ *
+ * @param string $handler Callable global handler function in the format ()
+ * pam_handler($credentials = NULL);
+ * @param string $importance The importance - "sufficient" (default) or "required"
+ * @param string $policy The policy type, default is "user"
+ *
+ * @return bool
+ */
+function register_pam_handler($handler, $importance = "sufficient", $policy = "user") {
+ global $_PAM_HANDLERS;
+
+ // setup array for this type of pam if not already set
+ if (!isset($_PAM_HANDLERS[$policy])) {
+ $_PAM_HANDLERS[$policy] = array();
+ }
+
+ // @todo remove requirement that $handle be a global function
+ if (is_string($handler) && is_callable($handler, true)) {
+ $_PAM_HANDLERS[$policy][$handler] = new stdClass;
+
+ $_PAM_HANDLERS[$policy][$handler]->handler = $handler;
+ $_PAM_HANDLERS[$policy][$handler]->importance = strtolower($importance);
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Unregisters a PAM handler.
+ *
+ * @param string $handler The PAM handler function name
+ * @param string $policy The policy type, default is "user"
+ *
+ * @return void
+ * @since 1.7.0
+ */
+function unregister_pam_handler($handler, $policy = "user") {
+ global $_PAM_HANDLERS;
+
+ unset($_PAM_HANDLERS[$policy][$handler]);
+}
diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php
new file mode 100644
index 000000000..d5d3db466
--- /dev/null
+++ b/engine/lib/plugins.php
@@ -0,0 +1,1179 @@
+<?php
+/**
+ * Elgg plugins library
+ * Contains functions for managing plugins
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins
+ */
+
+/**
+ * Tells ElggPlugin::start() to include the start.php file.
+ */
+define('ELGG_PLUGIN_INCLUDE_START', 1);
+
+/**
+ * Tells ElggPlugin::start() to automatically register the plugin's views.
+ */
+define('ELGG_PLUGIN_REGISTER_VIEWS', 2);
+
+/**
+ * Tells ElggPlugin::start() to automatically register the plugin's languages.
+ */
+define('ELGG_PLUGIN_REGISTER_LANGUAGES', 4);
+
+/**
+ * Tells ElggPlugin::start() to automatically register the plugin's classes.
+ */
+define('ELGG_PLUGIN_REGISTER_CLASSES', 8);
+
+/**
+ * Prefix for plugin setting names
+ *
+ * @todo Can't namespace these because many plugins directly call
+ * private settings via $entity->$name.
+ */
+//define('ELGG_PLUGIN_SETTING_PREFIX', 'plugin:setting:');
+
+/**
+ * Prefix for plugin user setting names
+ */
+define('ELGG_PLUGIN_USER_SETTING_PREFIX', 'plugin:user_setting:');
+
+/**
+ * Internal settings prefix
+ *
+ * @todo This could be resolved by promoting ElggPlugin to a 5th type.
+ */
+define('ELGG_PLUGIN_INTERNAL_PREFIX', 'elgg:internal:');
+
+
+/**
+ * Returns a list of plugin IDs (dir names) from a dir.
+ *
+ * @param string $dir A dir to scan for plugins. Defaults to config's plugins_path.
+ *
+ * @return array
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_plugin_ids_in_dir($dir = null) {
+ if (!$dir) {
+ $dir = elgg_get_plugins_path();
+ }
+
+ $plugin_ids = array();
+ $handle = opendir($dir);
+
+ if ($handle) {
+ while ($plugin_id = readdir($handle)) {
+ // must be directory and not begin with a .
+ if (substr($plugin_id, 0, 1) !== '.' && is_dir($dir . $plugin_id)) {
+ $plugin_ids[] = $plugin_id;
+ }
+ }
+ }
+
+ sort($plugin_ids);
+
+ return $plugin_ids;
+}
+
+/**
+ * Discovers plugins in the plugins_path setting and creates ElggPlugin
+ * entities for them if they don't exist. If there are plugins with entities
+ * but not actual files, will disable the ElggPlugin entities and mark as inactive.
+ * The ElggPlugin object holds config data, so don't delete.
+ *
+ * @todo Crappy name?
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_generate_plugin_entities() {
+ // @todo $site unused, can remove?
+ $site = get_config('site');
+
+ $dir = elgg_get_plugins_path();
+ $db_prefix = elgg_get_config('dbprefix');
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'plugin',
+ 'selects' => array('plugin_oe.*'),
+ 'joins' => array("JOIN {$db_prefix}objects_entity plugin_oe on plugin_oe.guid = e.guid"),
+ 'limit' => ELGG_ENTITIES_NO_VALUE
+ );
+
+ $old_ia = elgg_set_ignore_access(true);
+ $old_access = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $known_plugins = elgg_get_entities_from_relationship($options);
+ /* @var ElggPlugin[] $known_plugins */
+
+ if (!$known_plugins) {
+ $known_plugins = array();
+ }
+
+ // map paths to indexes
+ $id_map = array();
+ foreach ($known_plugins as $i => $plugin) {
+ // if the ID is wrong, delete the plugin because we can never load it.
+ $id = $plugin->getID();
+ if (!$id) {
+ $plugin->delete();
+ unset($known_plugins[$i]);
+ continue;
+ }
+ $id_map[$plugin->getID()] = $i;
+ }
+
+ $physical_plugins = elgg_get_plugin_ids_in_dir($dir);
+
+ if (!$physical_plugins) {
+ return false;
+ }
+
+ // check real plugins against known ones
+ foreach ($physical_plugins as $plugin_id) {
+ // is this already in the db?
+ if (array_key_exists($plugin_id, $id_map)) {
+ $index = $id_map[$plugin_id];
+ $plugin = $known_plugins[$index];
+ // was this plugin deleted and its entity disabled?
+ if (!$plugin->isEnabled()) {
+ $plugin->enable();
+ $plugin->deactivate();
+ $plugin->setPriority('last');
+ }
+
+ // remove from the list of plugins to disable
+ unset($known_plugins[$index]);
+ } else {
+ // add new plugins
+ // priority is force to last in save() if not set.
+ $plugin = new ElggPlugin($plugin_id);
+ $plugin->save();
+ }
+ }
+
+ // everything remaining in $known_plugins needs to be disabled
+ // because they are entities, but their dirs were removed.
+ // don't delete the entities because they hold settings.
+ foreach ($known_plugins as $plugin) {
+ if ($plugin->isActive()) {
+ $plugin->deactivate();
+ }
+ // remove the priority.
+ $name = elgg_namespace_plugin_private_setting('internal', 'priority');
+ remove_private_setting($plugin->guid, $name);
+ $plugin->disable();
+ }
+
+ access_show_hidden_entities($old_access);
+ elgg_set_ignore_access($old_ia);
+
+ elgg_reindex_plugin_priorities();
+
+ return true;
+}
+
+/**
+ * Cache a reference to this plugin by its ID
+ *
+ * @param ElggPlugin $plugin
+ *
+ * @access private
+ */
+function _elgg_cache_plugin_by_id(ElggPlugin $plugin) {
+ $map = (array) elgg_get_config('plugins_by_id_map');
+ $map[$plugin->getID()] = $plugin;
+ elgg_set_config('plugins_by_id_map', $map);
+}
+
+/**
+ * Returns an ElggPlugin object with the path $path.
+ *
+ * @param string $plugin_id The id (dir name) of the plugin. NOT the guid.
+ * @return ElggPlugin|false
+ * @since 1.8.0
+ */
+function elgg_get_plugin_from_id($plugin_id) {
+ $map = (array) elgg_get_config('plugins_by_id_map');
+ if (isset($map[$plugin_id])) {
+ return $map[$plugin_id];
+ }
+
+ $plugin_id = sanitize_string($plugin_id);
+ $db_prefix = get_config('dbprefix');
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'plugin',
+ 'joins' => array("JOIN {$db_prefix}objects_entity oe on oe.guid = e.guid"),
+ 'selects' => array("oe.title", "oe.description"),
+ 'wheres' => array("oe.title = '$plugin_id'"),
+ 'limit' => 1
+ );
+
+ $plugins = elgg_get_entities($options);
+
+ if ($plugins) {
+ return $plugins[0];
+ }
+
+ return false;
+}
+
+/**
+ * Returns if a plugin exists in the system.
+ *
+ * @warning This checks only plugins that are registered in the system!
+ * If the plugin cache is outdated, be sure to regenerate it with
+ * {@link elgg_generate_plugin_objects()} first.
+ *
+ * @param string $id The plugin ID.
+ * @since 1.8.0
+ * @return bool
+ */
+function elgg_plugin_exists($id) {
+ $plugin = elgg_get_plugin_from_id($id);
+
+ return ($plugin) ? true : false;
+}
+
+/**
+ * Returns the highest priority of the plugins
+ *
+ * @return int
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_max_plugin_priority() {
+ $db_prefix = get_config('dbprefix');
+ $priority = elgg_namespace_plugin_private_setting('internal', 'priority');
+ $plugin_subtype = get_subtype_id('object', 'plugin');
+
+ $q = "SELECT MAX(CAST(ps.value AS unsigned)) as max
+ FROM {$db_prefix}entities e, {$db_prefix}private_settings ps
+ WHERE ps.name = '$priority'
+ AND ps.entity_guid = e.guid
+ AND e.type = 'object' and e.subtype = $plugin_subtype";
+
+ $data = get_data($q);
+ if ($data) {
+ $max = $data[0]->max;
+ } else {
+ $max = 1;
+ }
+
+ // can't have a priority of 0.
+ return ($max) ? $max : 1;
+}
+
+/**
+ * Returns if a plugin is active for a current site.
+ *
+ * @param string $plugin_id The plugin ID
+ * @param int $site_guid The site guid
+ * @since 1.8.0
+ * @return bool
+ */
+function elgg_is_active_plugin($plugin_id, $site_guid = null) {
+ if ($site_guid) {
+ $site = get_entity($site_guid);
+ } else {
+ $site = elgg_get_site_entity();
+ }
+
+ if (!($site instanceof ElggSite)) {
+ return false;
+ }
+
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->isActive($site->guid);
+}
+
+/**
+ * Loads all active plugins in the order specified in the tool admin panel.
+ *
+ * @note This is called on every page load. If a plugin is active and problematic, it
+ * will be disabled and a visible error emitted. This does not check the deps system because
+ * that was too slow.
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_load_plugins() {
+ $plugins_path = elgg_get_plugins_path();
+ $start_flags = ELGG_PLUGIN_INCLUDE_START |
+ ELGG_PLUGIN_REGISTER_VIEWS |
+ ELGG_PLUGIN_REGISTER_LANGUAGES |
+ ELGG_PLUGIN_REGISTER_CLASSES;
+
+ if (!$plugins_path) {
+ return false;
+ }
+
+ // temporary disable all plugins if there is a file called 'disabled' in the plugin dir
+ if (file_exists("$plugins_path/disabled")) {
+ if (elgg_is_admin_logged_in() && elgg_in_context('admin')) {
+ system_message(elgg_echo('plugins:disabled'));
+ }
+ return false;
+ }
+
+ if (elgg_get_config('system_cache_loaded')) {
+ $start_flags = $start_flags & ~ELGG_PLUGIN_REGISTER_VIEWS;
+ }
+
+ if (elgg_get_config('i18n_loaded_from_cache')) {
+ $start_flags = $start_flags & ~ELGG_PLUGIN_REGISTER_LANGUAGES;
+ }
+
+ $return = true;
+ $plugins = elgg_get_plugins('active');
+ if ($plugins) {
+ foreach ($plugins as $plugin) {
+ try {
+ $plugin->start($start_flags);
+ } catch (Exception $e) {
+ $plugin->deactivate();
+ $msg = elgg_echo('PluginException:CannotStart',
+ array($plugin->getID(), $plugin->guid, $e->getMessage()));
+ elgg_add_admin_notice('cannot_start' . $plugin->getID(), $msg);
+ $return = false;
+
+ continue;
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Returns an ordered list of plugins
+ *
+ * @param string $status The status of the plugins. active, inactive, or all.
+ * @param mixed $site_guid Optional site guid
+ * @return ElggPlugin[]
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_plugins($status = 'active', $site_guid = null) {
+ $db_prefix = get_config('dbprefix');
+ $priority = elgg_namespace_plugin_private_setting('internal', 'priority');
+
+ if (!$site_guid) {
+ $site = get_config('site');
+ $site_guid = $site->guid;
+ }
+
+ // grab plugins
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'plugin',
+ 'limit' => ELGG_ENTITIES_NO_VALUE,
+ 'selects' => array('plugin_oe.*'),
+ 'joins' => array(
+ "JOIN {$db_prefix}private_settings ps on ps.entity_guid = e.guid",
+ "JOIN {$db_prefix}objects_entity plugin_oe on plugin_oe.guid = e.guid"
+ ),
+ 'wheres' => array("ps.name = '$priority'"),
+ 'order_by' => "CAST(ps.value as unsigned), e.guid"
+ );
+
+ switch ($status) {
+ case 'active':
+ $options['relationship'] = 'active_plugin';
+ $options['relationship_guid'] = $site_guid;
+ $options['inverse_relationship'] = true;
+ break;
+
+ case 'inactive':
+ $options['wheres'][] = "NOT EXISTS (
+ SELECT 1 FROM {$db_prefix}entity_relationships active_er
+ WHERE active_er.guid_one = e.guid
+ AND active_er.relationship = 'active_plugin'
+ AND active_er.guid_two = $site_guid)";
+ break;
+
+ case 'all':
+ default:
+ break;
+ }
+
+ $old_ia = elgg_set_ignore_access(true);
+ $plugins = elgg_get_entities_from_relationship($options);
+ elgg_set_ignore_access($old_ia);
+
+ return $plugins;
+}
+
+/**
+ * Reorder plugins to an order specified by the array.
+ * Plugins not included in this array will be appended to the end.
+ *
+ * @note This doesn't use the ElggPlugin->setPriority() method because
+ * all plugins are being changed and we don't want it to automatically
+ * reorder plugins.
+ *
+ * @param array $order An array of plugin ids in the order to set them
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_plugin_priorities(array $order) {
+ $name = elgg_namespace_plugin_private_setting('internal', 'priority');
+
+ $plugins = elgg_get_plugins('any');
+ if (!$plugins) {
+ return false;
+ }
+
+ $return = true;
+
+ // reindex to get standard counting. no need to increment by 10.
+ // though we do start with 1
+ $order = array_values($order);
+
+ $missing_plugins = array();
+ foreach ($plugins as $plugin) {
+ $plugin_id = $plugin->getID();
+
+ if (!in_array($plugin_id, $order)) {
+ $missing_plugins[] = $plugin;
+ continue;
+ }
+
+ $priority = array_search($plugin_id, $order) + 1;
+
+ if (!$plugin->set($name, $priority)) {
+ $return = false;
+ break;
+ }
+ }
+
+ // set the missing plugins' priorities
+ if ($return && $missing_plugins) {
+ if (!isset($priority)) {
+ $priority = 0;
+ }
+ foreach ($missing_plugins as $plugin) {
+ $priority++;
+ if (!$plugin->set($name, $priority)) {
+ $return = false;
+ break;
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Reindexes all plugin priorities starting at 1.
+ *
+ * @todo Can this be done in a single sql command?
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_reindex_plugin_priorities() {
+ return elgg_set_plugin_priorities(array());
+}
+
+/**
+ * Namespaces a string to be used as a private setting for a plugin.
+ *
+ * @param string $type The type of value: user_setting or internal.
+ * @param string $name The name to namespace.
+ * @param string $id The plugin's ID to namespace with. Required for user_setting.
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_namespace_plugin_private_setting($type, $name, $id = null) {
+ switch ($type) {
+ // commented out because it breaks $plugin->$name access to variables
+ //case 'setting':
+ // $name = ELGG_PLUGIN_SETTING_PREFIX . $name;
+ // break;
+
+ case 'user_setting':
+ if (!$id) {
+ $id = elgg_get_calling_plugin_id();
+ }
+ $name = ELGG_PLUGIN_USER_SETTING_PREFIX . "$id:$name";
+ break;
+
+ case 'internal':
+ $name = ELGG_PLUGIN_INTERNAL_PREFIX . $name;
+ break;
+ }
+
+ return $name;
+}
+
+/**
+ * Get the name of the most recent plugin to be called in the
+ * call stack (or the plugin that owns the current page, if any).
+ *
+ * i.e., if the last plugin was in /mod/foobar/, this would return foo_bar.
+ *
+ * @param boolean $mainfilename If set to true, this will instead determine the
+ * context from the main script filename called by
+ * the browser. Default = false.
+ *
+ * @return string|false Plugin name, or false if no plugin name was called
+ * @since 1.8.0
+ * @access private
+ *
+ * @todo get rid of this
+ */
+function elgg_get_calling_plugin_id($mainfilename = false) {
+ if (!$mainfilename) {
+ if ($backtrace = debug_backtrace()) {
+ foreach ($backtrace as $step) {
+ $file = $step['file'];
+ $file = str_replace("\\", "/", $file);
+ $file = str_replace("//", "/", $file);
+ if (preg_match("/mod\/([a-zA-Z0-9\-\_]*)\/start\.php$/", $file, $matches)) {
+ return $matches[1];
+ }
+ }
+ }
+ } else {
+ //@todo this is a hack -- plugins do not have to match their page handler names!
+ if ($handler = get_input('handler', FALSE)) {
+ return $handler;
+ } else {
+ $file = $_SERVER["SCRIPT_NAME"];
+ $file = str_replace("\\", "/", $file);
+ $file = str_replace("//", "/", $file);
+ if (preg_match("/mod\/([a-zA-Z0-9\-\_]*)\//", $file, $matches)) {
+ return $matches[1];
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Returns an array of all provides from all active plugins.
+ *
+ * Array in the form array(
+ * 'provide_type' => array(
+ * 'provided_name' => array(
+ * 'version' => '1.8',
+ * 'provided_by' => 'provider_plugin_id'
+ * )
+ * )
+ * )
+ *
+ * @param string $type The type of provides to return
+ * @param string $name A specific provided name to return. Requires $provide_type.
+ *
+ * @return array
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_plugins_provides($type = null, $name = null) {
+ static $provides = null;
+ $active_plugins = elgg_get_plugins('active');
+
+ if (!isset($provides)) {
+ $provides = array();
+
+ foreach ($active_plugins as $plugin) {
+ $plugin_provides = array();
+ $manifest = $plugin->getManifest();
+ if ($manifest instanceof ElggPluginManifest) {
+ $plugin_provides = $plugin->getManifest()->getProvides();
+ }
+ if ($plugin_provides) {
+ foreach ($plugin_provides as $provided) {
+ $provides[$provided['type']][$provided['name']] = array(
+ 'version' => $provided['version'],
+ 'provided_by' => $plugin->getID()
+ );
+ }
+ }
+ }
+ }
+
+ if ($type && $name) {
+ if (isset($provides[$type][$name])) {
+ return $provides[$type][$name];
+ } else {
+ return false;
+ }
+ } elseif ($type) {
+ if (isset($provides[$type])) {
+ return $provides[$type];
+ } else {
+ return false;
+ }
+ }
+
+ return $provides;
+}
+
+/**
+ * Checks if a plugin is currently providing $type and $name, and optionally
+ * checking a version.
+ *
+ * @param string $type The type of the provide
+ * @param string $name The name of the provide
+ * @param string $version A version to check against
+ * @param string $comparison The comparison operator to use in version_compare()
+ *
+ * @return array An array in the form array(
+ * 'status' => bool Does the provide exist?,
+ * 'value' => string The version provided
+ * )
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_check_plugins_provides($type, $name, $version = null, $comparison = 'ge') {
+ $provided = elgg_get_plugins_provides($type, $name);
+ if (!$provided) {
+ return array(
+ 'status' => false,
+ 'version' => ''
+ );
+ }
+
+ if ($version) {
+ $status = version_compare($provided['version'], $version, $comparison);
+ } else {
+ $status = true;
+ }
+
+ return array(
+ 'status' => $status,
+ 'value' => $provided['version']
+ );
+}
+
+/**
+ * Returns an array of parsed strings for a dependency in the
+ * format: array(
+ * 'type' => requires, conflicts, or provides.
+ * 'name' => The name of the requirement / conflict
+ * 'value' => A string representing the expected value: <1, >=3, !=enabled
+ * 'local_value' => The current value, ("Not installed")
+ * 'comment' => Free form text to help resovle the problem ("Enable / Search for plugin <link>")
+ * )
+ *
+ * @param array $dep An ElggPluginPackage dependency array
+ * @return array
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_plugin_dependency_strings($dep) {
+ $dep_system = elgg_extract('type', $dep);
+ $info = elgg_extract('dep', $dep);
+ $type = elgg_extract('type', $info);
+
+ if (!$dep_system || !$info || !$type) {
+ return false;
+ }
+
+ // rewrite some of these to be more readable
+ switch($info['comparison']) {
+ case 'lt':
+ $comparison = '<';
+ break;
+ case 'gt':
+ $comparison = '>';
+ break;
+ case 'ge':
+ $comparison = '>=';
+ break;
+ case 'le':
+ $comparison = '<=';
+ break;
+ default;
+ $comparison = $info['comparison'];
+ break;
+ }
+
+ /*
+ 'requires' 'plugin oauth_lib' <1.3 1.3 'downgrade'
+ 'requires' 'php setting bob' >3 3 'change it'
+ 'conflicts' 'php setting' >3 4 'change it'
+ 'conflicted''plugin profile' any 1.8 'disable profile'
+ 'provides' 'plugin oauth_lib' 1.3 -- --
+ 'priority' 'before blog' -- after 'move it'
+ */
+ $strings = array();
+ $strings['type'] = elgg_echo('ElggPlugin:Dependencies:' . ucwords($dep_system));
+
+ switch ($type) {
+ case 'elgg_version':
+ case 'elgg_release':
+ // 'Elgg Version'
+ $strings['name'] = elgg_echo('ElggPlugin:Dependencies:Elgg');
+ $strings['expected_value'] = "$comparison {$info['version']}";
+ $strings['local_value'] = $dep['value'];
+ $strings['comment'] = '';
+ break;
+
+ case 'php_extension':
+ // PHP Extension %s [version]
+ $strings['name'] = elgg_echo('ElggPlugin:Dependencies:PhpExtension', array($info['name']));
+ if ($info['version']) {
+ $strings['expected_value'] = "$comparison {$info['version']}";
+ $strings['local_value'] = $dep['value'];
+ } else {
+ $strings['expected_value'] = '';
+ $strings['local_value'] = '';
+ }
+ $strings['comment'] = '';
+ break;
+
+ case 'php_ini':
+ $strings['name'] = elgg_echo('ElggPlugin:Dependencies:PhpIni', array($info['name']));
+ $strings['expected_value'] = "$comparison {$info['value']}";
+ $strings['local_value'] = $dep['value'];
+ $strings['comment'] = '';
+ break;
+
+ case 'plugin':
+ $strings['name'] = elgg_echo('ElggPlugin:Dependencies:Plugin', array($info['name']));
+ $expected = $info['version'] ? "$comparison {$info['version']}" : elgg_echo('any');
+ $strings['expected_value'] = $expected;
+ $strings['local_value'] = $dep['value'] ? $dep['value'] : '--';
+ $strings['comment'] = '';
+ break;
+
+ case 'priority':
+ $expected_priority = ucwords($info['priority']);
+ $real_priority = ucwords($dep['value']);
+ $strings['name'] = elgg_echo('ElggPlugin:Dependencies:Priority');
+ $strings['expected_value'] = elgg_echo("ElggPlugin:Dependencies:Priority:$expected_priority", array($info['plugin']));
+ $strings['local_value'] = elgg_echo("ElggPlugin:Dependencies:Priority:$real_priority", array($info['plugin']));
+ $strings['comment'] = '';
+ break;
+ }
+
+ if ($dep['type'] == 'suggests') {
+ if ($dep['status']) {
+ $strings['comment'] = elgg_echo('ok');
+ } else {
+ $strings['comment'] = elgg_echo('ElggPlugin:Dependencies:Suggests:Unsatisfied');
+ }
+ } else {
+ if ($dep['status']) {
+ $strings['comment'] = elgg_echo('ok');
+ } else {
+ $strings['comment'] = elgg_echo('error');
+ }
+ }
+
+ return $strings;
+}
+
+/**
+ * Returns the ElggPlugin entity of the last plugin called.
+ *
+ * @return mixed ElggPlugin or false
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_calling_plugin_entity() {
+ $plugin_id = elgg_get_calling_plugin_id();
+
+ if ($plugin_id) {
+ return elgg_get_plugin_from_id($plugin_id);
+ }
+
+ return false;
+}
+
+/**
+ * Returns an array of all plugin settings for a user.
+ *
+ * @param mixed $user_guid The user GUID or null for the currently logged in user.
+ * @param string $plugin_id The plugin ID
+ * @param bool $return_obj Return settings as an object? This can be used to in reusable
+ * views where the settings are passed as $vars['entity'].
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_all_plugin_user_settings($user_guid = null, $plugin_id = null, $return_obj = false) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin instanceof ElggPlugin) {
+ return false;
+ }
+
+ $settings = $plugin->getAllUserSettings($user_guid);
+
+ if ($settings && $return_obj) {
+ $return = new stdClass;
+
+ foreach ($settings as $k => $v) {
+ $return->$k = $v;
+ }
+
+ return $return;
+ } else {
+ return $settings;
+ }
+}
+
+/**
+ * Set a user specific setting for a plugin.
+ *
+ * @param string $name The name - note, can't be "title".
+ * @param mixed $value The value.
+ * @param int $user_guid Optional user.
+ * @param string $plugin_id Optional plugin name, if not specified then it
+ * is detected from where you are calling from.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_set_plugin_user_setting($name, $value, $user_guid = null, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->setUserSetting($name, $value, $user_guid);
+}
+
+/**
+ * Unsets a user-specific plugin setting
+ *
+ * @param string $name Name of the setting
+ * @param int $user_guid Defaults to logged in user
+ * @param string $plugin_id Defaults to contextual plugin name
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unset_plugin_user_setting($name, $user_guid = null, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->unsetUserSetting($name, $user_guid);
+}
+
+/**
+ * Get a user specific setting for a plugin.
+ *
+ * @param string $name The name of the setting.
+ * @param int $user_guid Guid of owning user
+ * @param string $plugin_id Optional plugin name, if not specified
+ * it is detected from where you are calling.
+ *
+ * @return mixed
+ * @since 1.8.0
+ */
+function elgg_get_plugin_user_setting($name, $user_guid = null, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->getUserSetting($name, $user_guid);
+}
+
+/**
+ * Set a setting for a plugin.
+ *
+ * @param string $name The name of the setting - note, can't be "title".
+ * @param mixed $value The value.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_set_plugin_setting($name, $value, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->setSetting($name, $value);
+}
+
+/**
+ * Get setting for a plugin.
+ *
+ * @param string $name The name of the setting.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @return mixed
+ * @since 1.8.0
+ * @todo make $plugin_id required in future version
+ */
+function elgg_get_plugin_setting($name, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->getSetting($name);
+}
+
+/**
+ * Unsets a plugin setting.
+ *
+ * @param string $name The name of the setting.
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unset_plugin_setting($name, $plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->unsetSetting($name);
+}
+
+/**
+ * Unsets all plugin settings for a plugin.
+ *
+ * @param string $plugin_id Optional plugin name, if not specified
+ * then it is detected from where you are calling from.
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_unset_all_plugin_settings($plugin_id = null) {
+ if ($plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+ } else {
+ $plugin = elgg_get_calling_plugin_entity();
+ }
+
+ if (!$plugin) {
+ return false;
+ }
+
+ return $plugin->unsetAllSettings();
+}
+
+/**
+ * Returns entities based upon plugin settings.
+ * Takes all the options for {@see elgg_get_entities_from_private_settings()}
+ * in addition to the ones below.
+ *
+ * @param array $options Array in the format:
+ *
+ * plugin_id => NULL|STR The plugin id. Defaults to calling plugin
+ *
+ * plugin_user_setting_names => NULL|ARR private setting names
+ *
+ * plugin_user_setting_values => NULL|ARR metadata values
+ *
+ * plugin_user_setting_name_value_pairs => NULL|ARR (
+ * name => 'name',
+ * value => 'value',
+ * 'operand' => '=',
+ * )
+ * Currently if multiple values are sent via
+ * an array (value => array('value1', 'value2')
+ * the pair's operand will be forced to "IN".
+ *
+ * plugin_user_setting_name_value_pairs_operator => NULL|STR The operator to use for combining
+ * (name = value) OPERATOR (name = value); default AND
+ *
+ * @return mixed int If count, int. If not count, array. false on errors.
+ */
+function elgg_get_entities_from_plugin_user_settings(array $options = array()) {
+ // if they're passing it don't bother
+ if (!isset($options['plugin_id'])) {
+ $options['plugin_id'] = elgg_get_calling_plugin_id();
+ }
+
+ $singulars = array('plugin_user_setting_name', 'plugin_user_setting_value',
+ 'plugin_user_setting_name_value_pair');
+
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ // rewrite plugin_user_setting_name_* to the right PS ones.
+ $map = array(
+ 'plugin_user_setting_names' => 'private_setting_names',
+ 'plugin_user_setting_values' => 'private_setting_values',
+ 'plugin_user_setting_name_value_pairs' => 'private_setting_name_value_pairs',
+ 'plugin_user_setting_name_value_pairs_operator' => 'private_setting_name_value_pairs_operator'
+ );
+
+ foreach ($map as $plugin => $private) {
+ if (!isset($options[$plugin])) {
+ continue;
+ }
+
+ if (isset($options[$private])) {
+ if (!is_array($options[$private])) {
+ $options[$private] = array($options[$private]);
+ }
+
+ $options[$private] = array_merge($options[$private], $options[$plugin]);
+ } else {
+ $options[$private] = $options[$plugin];
+ }
+ }
+
+
+ $plugin_id = $options['plugin_id'];
+ $prefix = elgg_namespace_plugin_private_setting('user_setting', '', $plugin_id);
+ $options['private_setting_name_prefix'] = $prefix;
+
+ return elgg_get_entities_from_private_settings($options);
+}
+
+/**
+ * Register object, plugin entities as ElggPlugin classes
+ *
+ * @return void
+ * @access private
+ */
+function plugin_run_once() {
+ add_subtype("object", "plugin", "ElggPlugin");
+}
+
+/**
+ * Runs unit tests for the entity objects.
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function plugins_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/plugins.php';
+ return $value;
+}
+
+/**
+ * Checks on deactivate plugin event if disabling it won't create unmet dependencies and blocks disable in such case.
+ *
+ * @param string $event deactivate
+ * @param string $type plugin
+ * @param array $params Parameters array containing entry with ELggPlugin instance under 'plugin_entity' key
+ * @return bool false to block plugin deactivation action
+ *
+ * @access private
+ */
+function _plugins_deactivate_dependency_check($event, $type, $params) {
+ $plugin_id = $params['plugin_entity']->getManifest()->getPluginID();
+ $plugin_name = $params['plugin_entity']->getManifest()->getName();
+
+ $active_plugins = elgg_get_plugins();
+
+ $dependents = array();
+ foreach ($active_plugins as $plugin) {
+ $manifest = $plugin->getManifest();
+ $requires = $manifest->getRequires();
+
+ foreach ($requires as $required) {
+ if ($required['type'] == 'plugin' && $required['name'] == $plugin_id) {
+ // there are active dependents
+ $dependents[$manifest->getPluginID()] = $plugin;
+ }
+ }
+ }
+
+ if ($dependents) {
+ $list = '<ul>';
+ // construct error message and prevent disabling
+ foreach ($dependents as $dependent) {
+ $list .= '<li>' . $dependent->getManifest()->getName() . '</li>';
+ }
+ $list .= '</ul>';
+
+ register_error(elgg_echo('ElggPlugin:Dependencies:ActiveDependent', array($plugin_name, $list)));
+
+ return false;
+ }
+}
+
+/**
+ * Initialize the plugin system
+ * Listens to system init and registers actions
+ *
+ * @return void
+ * @access private
+ */
+function plugin_init() {
+ run_function_once("plugin_run_once");
+
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'plugins_test');
+
+ // note - plugins are booted by the time this handler is registered
+ // deactivation due to error may have already occurred
+ elgg_register_event_handler('deactivate', 'plugin', '_plugins_deactivate_dependency_check');
+
+ elgg_register_action("plugins/settings/save", '', 'admin');
+ elgg_register_action("plugins/usersettings/save");
+
+ elgg_register_action('admin/plugins/activate', '', 'admin');
+ elgg_register_action('admin/plugins/deactivate', '', 'admin');
+ elgg_register_action('admin/plugins/activate_all', '', 'admin');
+ elgg_register_action('admin/plugins/deactivate_all', '', 'admin');
+
+ elgg_register_action('admin/plugins/set_priority', '', 'admin');
+
+ elgg_register_library('elgg:markdown', elgg_get_root_path() . 'vendors/markdown/markdown.php');
+}
+
+elgg_register_event_handler('init', 'system', 'plugin_init');
diff --git a/engine/lib/private_settings.php b/engine/lib/private_settings.php
new file mode 100644
index 000000000..7541f7b3b
--- /dev/null
+++ b/engine/lib/private_settings.php
@@ -0,0 +1,414 @@
+<?php
+/**
+ * Private settings for entities
+ * Private settings provide metadata like storage of settings for plugins
+ * and users.
+ *
+ * @package Elgg.Core
+ * @subpackage PrivateSettings
+ */
+
+/**
+ * Returns entities based upon private settings. Also accepts all
+ * options available to elgg_get_entities(). Supports
+ * the singular option shortcut.
+ *
+ * @see elgg_get_entities
+ *
+ * @param array $options Array in format:
+ *
+ * private_setting_names => NULL|ARR private setting names
+ *
+ * private_setting_values => NULL|ARR metadata values
+ *
+ * private_setting_name_value_pairs => NULL|ARR (
+ * name => 'name',
+ * value => 'value',
+ * 'operand' => '=',
+ * )
+ * Currently if multiple values are sent via
+ * an array (value => array('value1', 'value2')
+ * the pair's operand will be forced to "IN".
+ *
+ * private_setting_name_value_pairs_operator => NULL|STR The operator to use for combining
+ * (name = value) OPERATOR (name = value); default AND
+ *
+ * private_setting_name_prefix => STR A prefix to apply to all private settings. Used to
+ * namespace plugin user settings or by plugins to namespace
+ * their own settings.
+ *
+ *
+ * @return mixed int If count, int. If not count, array. false on errors.
+ * @since 1.8.0
+ */
+function elgg_get_entities_from_private_settings(array $options = array()) {
+ $defaults = array(
+ 'private_setting_names' => ELGG_ENTITIES_ANY_VALUE,
+ 'private_setting_values' => ELGG_ENTITIES_ANY_VALUE,
+ 'private_setting_name_value_pairs' => ELGG_ENTITIES_ANY_VALUE,
+ 'private_setting_name_value_pairs_operator' => 'AND',
+ 'private_setting_name_prefix' => '',
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('private_setting_name', 'private_setting_value',
+ 'private_setting_name_value_pair');
+
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ $clauses = elgg_get_entity_private_settings_where_sql('e', $options['private_setting_names'],
+ $options['private_setting_values'], $options['private_setting_name_value_pairs'],
+ $options['private_setting_name_value_pairs_operator'], $options['private_setting_name_prefix']);
+
+ if ($clauses) {
+ // merge wheres to pass to get_entities()
+ if (isset($options['wheres']) && !is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ } elseif (!isset($options['wheres'])) {
+ $options['wheres'] = array();
+ }
+
+ $options['wheres'] = array_merge($options['wheres'], $clauses['wheres']);
+
+ // merge joins to pass to get_entities()
+ if (isset($options['joins']) && !is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ } elseif (!isset($options['joins'])) {
+ $options['joins'] = array();
+ }
+
+ $options['joins'] = array_merge($options['joins'], $clauses['joins']);
+ }
+
+ return elgg_get_entities($options);
+}
+
+/**
+ * Returns private setting name and value SQL where/join clauses for entities.
+ *
+ * @param string $table Entities table name
+ * @param array|null $names Array of names
+ * @param array|null $values Array of values
+ * @param array|null $pairs Array of names / values / operands
+ * @param string $pair_operator Operator for joining pairs where clauses
+ * @param string $name_prefix A string to prefix all names with
+ * @return array
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_entity_private_settings_where_sql($table, $names = NULL, $values = NULL,
+$pairs = NULL, $pair_operator = 'AND', $name_prefix = '') {
+
+ global $CONFIG;
+
+ // @todo short circuit test
+
+ $return = array (
+ 'joins' => array (),
+ 'wheres' => array(),
+ );
+
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}private_settings ps on
+ {$table}.guid = ps.entity_guid";
+
+ $wheres = array();
+
+ // get names wheres
+ $names_where = '';
+ if ($names !== NULL) {
+ if (!is_array($names)) {
+ $names = array($names);
+ }
+
+ $sanitised_names = array();
+ foreach ($names as $name) {
+ $name = $name_prefix . $name;
+ $sanitised_names[] = '\'' . sanitise_string($name) . '\'';
+ }
+
+ $names_str = implode(',', $sanitised_names);
+ if ($names_str) {
+ $names_where = "(ps.name IN ($names_str))";
+ }
+ }
+
+ // get values wheres
+ $values_where = '';
+ if ($values !== NULL) {
+ if (!is_array($values)) {
+ $values = array($values);
+ }
+
+ $sanitised_values = array();
+ foreach ($values as $value) {
+ // normalize to 0
+ if (!$value) {
+ $value = 0;
+ }
+ $sanitised_values[] = '\'' . sanitise_string($value) . '\'';
+ }
+
+ $values_str = implode(',', $sanitised_values);
+ if ($values_str) {
+ $values_where = "(ps.value IN ($values_str))";
+ }
+ }
+
+ if ($names_where && $values_where) {
+ $wheres[] = "($names_where AND $values_where)";
+ } elseif ($names_where) {
+ $wheres[] = "($names_where)";
+ } elseif ($values_where) {
+ $wheres[] = "($values_where)";
+ }
+
+ // add pairs which must be in arrays.
+ if (is_array($pairs)) {
+ // join counter for incremental joins in pairs
+ $i = 1;
+
+ // check if this is an array of pairs or just a single pair.
+ if (isset($pairs['name']) || isset($pairs['value'])) {
+ $pairs = array($pairs);
+ }
+
+ $pair_wheres = array();
+
+ foreach ($pairs as $index => $pair) {
+ // @todo move this elsewhere?
+ // support shortcut 'n' => 'v' method.
+ if (!is_array($pair)) {
+ $pair = array(
+ 'name' => $index,
+ 'value' => $pair
+ );
+ }
+
+ // must have at least a name and value
+ if (!isset($pair['name']) || !isset($pair['value'])) {
+ // @todo should probably return false.
+ continue;
+ }
+
+ if (isset($pair['operand'])) {
+ $operand = sanitise_string($pair['operand']);
+ } else {
+ $operand = ' = ';
+ }
+
+ // for comparing
+ $trimmed_operand = trim(strtolower($operand));
+
+ // if the value is an int, don't quote it because str '15' < str '5'
+ // if the operand is IN don't quote it because quoting should be done already.
+ if (is_numeric($pair['value'])) {
+ $value = sanitise_string($pair['value']);
+ } else if (is_array($pair['value'])) {
+ $values_array = array();
+
+ foreach ($pair['value'] as $pair_value) {
+ if (is_numeric($pair_value)) {
+ $values_array[] = sanitise_string($pair_value);
+ } else {
+ $values_array[] = "'" . sanitise_string($pair_value) . "'";
+ }
+ }
+
+ if ($values_array) {
+ $value = '(' . implode(', ', $values_array) . ')';
+ }
+
+ // @todo allow support for non IN operands with array of values.
+ // will have to do more silly joins.
+ $operand = 'IN';
+ } else if ($trimmed_operand == 'in') {
+ $value = "({$pair['value']})";
+ } else {
+ $value = "'" . sanitise_string($pair['value']) . "'";
+ }
+
+ $name = sanitise_string($name_prefix . $pair['name']);
+
+ // @todo The multiple joins are only needed when the operator is AND
+ $return['joins'][] = "JOIN {$CONFIG->dbprefix}private_settings ps{$i}
+ on {$table}.guid = ps{$i}.entity_guid";
+
+ $pair_wheres[] = "(ps{$i}.name = '$name' AND ps{$i}.value
+ $operand $value)";
+
+ $i++;
+ }
+
+ $where = implode(" $pair_operator ", $pair_wheres);
+ if ($where) {
+ $wheres[] = "($where)";
+ }
+ }
+
+ $where = implode(' AND ', $wheres);
+ if ($where) {
+ $return['wheres'][] = "($where)";
+ }
+
+ return $return;
+}
+
+/**
+ * Gets a private setting for an entity.
+ *
+ * Plugin authors can set private data on entities. By default
+ * private data will not be searched or exported.
+ *
+ * @internal Private data is used to store settings for plugins
+ * and user settings.
+ *
+ * @param int $entity_guid The entity GUID
+ * @param string $name The name of the setting
+ *
+ * @return mixed The setting value, or false on failure
+ * @see set_private_setting()
+ * @see get_all_private_settings()
+ * @see remove_private_setting()
+ * @see remove_all_private_settings()
+ * @link http://docs.elgg.org/DataModel/Entities/PrivateSettings
+ */
+function get_private_setting($entity_guid, $name) {
+ global $CONFIG;
+ $entity_guid = (int) $entity_guid;
+ $name = sanitise_string($name);
+
+ $entity = get_entity($entity_guid);
+ if (!$entity instanceof ElggEntity) {
+ return false;
+ }
+
+ $query = "SELECT value from {$CONFIG->dbprefix}private_settings
+ where name = '{$name}' and entity_guid = {$entity_guid}";
+ $setting = get_data_row($query);
+
+ if ($setting) {
+ return $setting->value;
+ }
+ return false;
+}
+
+/**
+ * Return an array of all private settings.
+ *
+ * @param int $entity_guid The entity GUID
+ *
+ * @return array|false
+ * @see set_private_setting()
+ * @see get_private_settings()
+ * @see remove_private_setting()
+ * @see remove_all_private_settings()
+ * @link http://docs.elgg.org/DataModel/Entities/PrivateSettings
+ */
+function get_all_private_settings($entity_guid) {
+ global $CONFIG;
+
+ $entity_guid = (int) $entity_guid;
+ $entity = get_entity($entity_guid);
+ if (!$entity instanceof ElggEntity) {
+ return false;
+ }
+
+ $query = "SELECT * from {$CONFIG->dbprefix}private_settings where entity_guid = {$entity_guid}";
+ $result = get_data($query);
+ if ($result) {
+ $return = array();
+ foreach ($result as $r) {
+ $return[$r->name] = $r->value;
+ }
+
+ return $return;
+ }
+
+ return false;
+}
+
+/**
+ * Sets a private setting for an entity.
+ *
+ * @param int $entity_guid The entity GUID
+ * @param string $name The name of the setting
+ * @param string $value The value of the setting
+ *
+ * @return bool
+ * @see get_private_setting()
+ * @see get_all_private_settings()
+ * @see remove_private_setting()
+ * @see remove_all_private_settings()
+ * @link http://docs.elgg.org/DataModel/Entities/PrivateSettings
+ */
+function set_private_setting($entity_guid, $name, $value) {
+ global $CONFIG;
+
+ $entity_guid = (int) $entity_guid;
+ $name = sanitise_string($name);
+ $value = sanitise_string($value);
+
+ $result = insert_data("INSERT into {$CONFIG->dbprefix}private_settings
+ (entity_guid, name, value) VALUES
+ ($entity_guid, '$name', '$value')
+ ON DUPLICATE KEY UPDATE value='$value'");
+
+ return $result !== false;
+}
+
+/**
+ * Deletes a private setting for an entity.
+ *
+ * @param int $entity_guid The Entity GUID
+ * @param string $name The name of the setting
+ *
+ * @return bool
+ * @see get_private_setting()
+ * @see get_all_private_settings()
+ * @see set_private_setting()
+ * @see remove_all_private_settings()
+ * @link http://docs.elgg.org/DataModel/Entities/PrivateSettings
+ */
+function remove_private_setting($entity_guid, $name) {
+ global $CONFIG;
+
+ $entity_guid = (int) $entity_guid;
+
+ $entity = get_entity($entity_guid);
+ if (!$entity instanceof ElggEntity) {
+ return false;
+ }
+
+ $name = sanitise_string($name);
+
+ return delete_data("DELETE from {$CONFIG->dbprefix}private_settings
+ WHERE name = '{$name}'
+ AND entity_guid = {$entity_guid}");
+}
+
+/**
+ * Deletes all private settings for an entity.
+ *
+ * @param int $entity_guid The Entity GUID
+ *
+ * @return bool
+ * @see get_private_setting()
+ * @see get_all_private_settings()
+ * @see set_private_setting()
+ * @see remove_private_settings()
+ * @link http://docs.elgg.org/DataModel/Entities/PrivateSettings
+ */
+function remove_all_private_settings($entity_guid) {
+ global $CONFIG;
+
+ $entity_guid = (int) $entity_guid;
+
+ $entity = get_entity($entity_guid);
+ if (!$entity instanceof ElggEntity) {
+ return false;
+ }
+
+ return delete_data("DELETE from {$CONFIG->dbprefix}private_settings
+ WHERE entity_guid = {$entity_guid}");
+}
diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php
new file mode 100644
index 000000000..b0cd627fc
--- /dev/null
+++ b/engine/lib/relationships.php
@@ -0,0 +1,643 @@
+<?php
+/**
+ * Elgg relationships.
+ * Stub containing relationship functions, making import and export easier.
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Relationship
+ */
+
+/**
+ * Convert a database row to a new ElggRelationship
+ *
+ * @param stdClass $row Database row from the relationship table
+ *
+ * @return ElggRelationship|stdClass
+ * @access private
+ */
+function row_to_elggrelationship($row) {
+ if (!($row instanceof stdClass)) {
+ return $row;
+ }
+
+ return new ElggRelationship($row);
+}
+
+/**
+ * Return a relationship.
+ *
+ * @param int $id The ID of a relationship
+ *
+ * @return ElggRelationship|false
+ */
+function get_relationship($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ $query = "SELECT * from {$CONFIG->dbprefix}entity_relationships where id=$id";
+ return row_to_elggrelationship(get_data_row($query));
+}
+
+/**
+ * Delete a specific relationship.
+ *
+ * @param int $id The relationship ID
+ *
+ * @return bool
+ */
+function delete_relationship($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ $relationship = get_relationship($id);
+
+ if (elgg_trigger_event('delete', 'relationship', $relationship)) {
+ return delete_data("delete from {$CONFIG->dbprefix}entity_relationships where id=$id");
+ }
+
+ return FALSE;
+}
+
+/**
+ * Define an arbitrary relationship between two entities.
+ * This relationship could be a friendship, a group membership or a site membership.
+ *
+ * This function lets you make the statement "$guid_one is a $relationship of $guid_two".
+ *
+ * @param int $guid_one First GUID
+ * @param string $relationship Relationship name
+ * @param int $guid_two Second GUID
+ *
+ * @return bool
+ */
+function add_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+ $time = time();
+
+ // Check for duplicates
+ if (check_entity_relationship($guid_one, $relationship, $guid_two)) {
+ return false;
+ }
+
+ $result = insert_data("INSERT into {$CONFIG->dbprefix}entity_relationships
+ (guid_one, relationship, guid_two, time_created)
+ values ($guid_one, '$relationship', $guid_two, $time)");
+
+ if ($result !== false) {
+ $obj = get_relationship($result);
+ if (elgg_trigger_event('create', $relationship, $obj)) {
+ return true;
+ } else {
+ delete_relationship($result);
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Determine if a relationship between two entities exists
+ * and returns the relationship object if it does
+ *
+ * @param int $guid_one The GUID of the entity "owning" the relationship
+ * @param string $relationship The type of relationship
+ * @param int $guid_two The GUID of the entity the relationship is with
+ *
+ * @return ElggRelationship|false Depending on success
+ */
+function check_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+
+ $query = "SELECT * FROM {$CONFIG->dbprefix}entity_relationships
+ WHERE guid_one=$guid_one
+ AND relationship='$relationship'
+ AND guid_two=$guid_two limit 1";
+
+ $row = row_to_elggrelationship(get_data_row($query));
+ if ($row) {
+ return $row;
+ }
+
+ return false;
+}
+
+/**
+ * Remove an arbitrary relationship between two entities.
+ *
+ * @param int $guid_one First GUID
+ * @param string $relationship Relationship name
+ * @param int $guid_two Second GUID
+ *
+ * @return bool
+ */
+function remove_entity_relationship($guid_one, $relationship, $guid_two) {
+ global $CONFIG;
+
+ $guid_one = (int)$guid_one;
+ $relationship = sanitise_string($relationship);
+ $guid_two = (int)$guid_two;
+
+ $obj = check_entity_relationship($guid_one, $relationship, $guid_two);
+ if ($obj == false) {
+ return false;
+ }
+
+ if (elgg_trigger_event('delete', $relationship, $obj)) {
+ $query = "DELETE from {$CONFIG->dbprefix}entity_relationships
+ where guid_one=$guid_one
+ and relationship='$relationship'
+ and guid_two=$guid_two";
+
+ return (bool)delete_data($query);
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Removes all arbitrary relationships originating from a particular entity
+ *
+ * @param int $guid_one The GUID of the entity
+ * @param string $relationship The name of the relationship (optional)
+ * @param bool $inverse Whether we're deleting inverse relationships (default false)
+ * @param string $type The type of entity to the delete to (defaults to all)
+ *
+ * @return bool Depending on success
+ */
+function remove_entity_relationships($guid_one, $relationship = "", $inverse = false, $type = '') {
+ global $CONFIG;
+
+ $guid_one = (int) $guid_one;
+
+ if (!empty($relationship)) {
+ $relationship = sanitise_string($relationship);
+ $where = "and er.relationship='$relationship'";
+ } else {
+ $where = "";
+ }
+
+ if (!empty($type)) {
+ $type = sanitise_string($type);
+ if (!$inverse) {
+ $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_two ";
+ } else {
+ $join = " join {$CONFIG->dbprefix}entities e on e.guid = er.guid_one ";
+ $where .= " and ";
+ }
+ $where .= " and e.type = '{$type}' ";
+ } else {
+ $join = "";
+ }
+
+ if (!$inverse) {
+ $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er
+ {$join}
+ where guid_one={$guid_one} {$where}";
+
+ return delete_data($sql);
+ } else {
+ $sql = "DELETE er from {$CONFIG->dbprefix}entity_relationships as er
+ {$join} where
+ guid_two={$guid_one} {$where}";
+
+ return delete_data($sql);
+ }
+}
+
+/**
+ * Get all the relationships for a given guid.
+ *
+ * @param int $guid The GUID of the relationship owner
+ * @param bool $inverse_relationship Inverse relationship owners?
+ *
+ * @return ElggRelationship[]
+ */
+function get_entity_relationships($guid, $inverse_relationship = FALSE) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+
+ $where = ($inverse_relationship ? "guid_two='$guid'" : "guid_one='$guid'");
+
+ $query = "SELECT * from {$CONFIG->dbprefix}entity_relationships where {$where}";
+
+ return get_data($query, "row_to_elggrelationship");
+}
+
+/**
+ * Return entities matching a given query joining against a relationship.
+ * Also accepts all options available to elgg_get_entities() and
+ * elgg_get_entities_from_metadata().
+ *
+ * To ask for entities that do not have a particulat relationship to an entity,
+ * use a custom where clause like the following:
+ *
+ * $options['wheres'][] = "NOT EXISTS (
+ * SELECT 1 FROM {$db_prefix}entity_relationships
+ * WHERE guid_one = e.guid
+ * AND relationship = '$relationship'
+ * )";
+ *
+ * @see elgg_get_entities
+ * @see elgg_get_entities_from_metadata
+ *
+ * @param array $options Array in format:
+ *
+ * relationship => NULL|STR relationship
+ *
+ * relationship_guid => NULL|INT Guid of relationship to test
+ *
+ * inverse_relationship => BOOL Inverse the relationship
+ *
+ * @return ElggEntity[]|mixed If count, int. If not count, array. false on errors.
+ * @since 1.7.0
+ */
+function elgg_get_entities_from_relationship($options) {
+ $defaults = array(
+ 'relationship' => NULL,
+ 'relationship_guid' => NULL,
+ 'inverse_relationship' => FALSE
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $clauses = elgg_get_entity_relationship_where_sql('e.guid', $options['relationship'],
+ $options['relationship_guid'], $options['inverse_relationship']);
+
+ if ($clauses) {
+ // merge wheres to pass to get_entities()
+ if (isset($options['wheres']) && !is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ } elseif (!isset($options['wheres'])) {
+ $options['wheres'] = array();
+ }
+
+ $options['wheres'] = array_merge($options['wheres'], $clauses['wheres']);
+
+ // merge joins to pass to get_entities()
+ if (isset($options['joins']) && !is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ } elseif (!isset($options['joins'])) {
+ $options['joins'] = array();
+ }
+
+ $options['joins'] = array_merge($options['joins'], $clauses['joins']);
+
+ if (isset($options['selects']) && !is_array($options['selects'])) {
+ $options['selects'] = array($options['selects']);
+ } elseif (!isset($options['selects'])) {
+ $options['selects'] = array();
+ }
+
+ $select = array('r.id');
+
+ $options['selects'] = array_merge($options['selects'], $select);
+ }
+
+ return elgg_get_entities_from_metadata($options);
+}
+
+/**
+ * Returns sql appropriate for relationship joins and wheres
+ *
+ * @todo add support for multiple relationships and guids.
+ *
+ * @param string $column Column name the guid should be checked against.
+ * Provide in table.column format.
+ * @param string $relationship Relationship string
+ * @param int $relationship_guid Entity guid to check
+ * @param bool $inverse_relationship Inverse relationship check?
+ *
+ * @return mixed
+ * @since 1.7.0
+ * @access private
+ */
+function elgg_get_entity_relationship_where_sql($column, $relationship = NULL,
+$relationship_guid = NULL, $inverse_relationship = FALSE) {
+
+ if ($relationship == NULL && $relationship_guid == NULL) {
+ return '';
+ }
+
+ global $CONFIG;
+
+ $wheres = array();
+ $joins = array();
+
+ if ($inverse_relationship) {
+ $joins[] = "JOIN {$CONFIG->dbprefix}entity_relationships r on r.guid_one = $column";
+ } else {
+ $joins[] = "JOIN {$CONFIG->dbprefix}entity_relationships r on r.guid_two = $column";
+ }
+
+ if ($relationship) {
+ $wheres[] = "r.relationship = '" . sanitise_string($relationship) . "'";
+ }
+
+ if ($relationship_guid) {
+ if ($inverse_relationship) {
+ $wheres[] = "r.guid_two = '$relationship_guid'";
+ } else {
+ $wheres[] = "r.guid_one = '$relationship_guid'";
+ }
+ }
+
+ if ($where_str = implode(' AND ', $wheres)) {
+
+ return array('wheres' => array("($where_str)"), 'joins' => $joins);
+ }
+
+ return '';
+}
+
+/**
+ * Returns a viewable list of entities by relationship
+ *
+ * @param array $options Options array for retrieval of entities
+ *
+ * @see elgg_list_entities()
+ * @see elgg_get_entities_from_relationship()
+ *
+ * @return string The viewable list of entities
+ */
+function elgg_list_entities_from_relationship(array $options = array()) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_relationship');
+}
+
+/**
+ * Gets the number of entities by a the number of entities related to them in a particular way.
+ * This is a good way to get out the users with the most friends, or the groups with the
+ * most members.
+ *
+ * @param array $options An options array compatible with
+ * elgg_get_entities_from_relationship()
+ * @return ElggEntity[]|mixed int If count, int. If not count, array. false on errors.
+ * @since 1.8.0
+ */
+function elgg_get_entities_from_relationship_count(array $options = array()) {
+ $options['selects'][] = "COUNT(e.guid) as total";
+ $options['group_by'] = 'r.guid_two';
+ $options['order_by'] = 'total desc';
+ return elgg_get_entities_from_relationship($options);
+}
+
+/**
+ * Returns a list of entities by relationship count
+ *
+ * @see elgg_get_entities_from_relationship_count()
+ *
+ * @param array $options Options array
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_list_entities_from_relationship_count($options) {
+ return elgg_list_entities($options, 'elgg_get_entities_from_relationship_count');
+}
+
+/**
+ * Sets the URL handler for a particular relationship type
+ *
+ * @param string $relationship_type The relationship type.
+ * @param string $function_name The function to register
+ *
+ * @return bool Depending on success
+ */
+function elgg_register_relationship_url_handler($relationship_type, $function_name) {
+ global $CONFIG;
+
+ if (!is_callable($function_name, true)) {
+ return false;
+ }
+
+ if (!isset($CONFIG->relationship_url_handler)) {
+ $CONFIG->relationship_url_handler = array();
+ }
+
+ $CONFIG->relationship_url_handler[$relationship_type] = $function_name;
+
+ return true;
+}
+
+/**
+ * Get the url for a given relationship.
+ *
+ * @param int $id Relationship ID
+ *
+ * @return string
+ */
+function get_relationship_url($id) {
+ global $CONFIG;
+
+ $id = (int)$id;
+
+ if ($relationship = get_relationship($id)) {
+ $view = elgg_get_viewtype();
+
+ $guid = $relationship->guid_one;
+ $type = $relationship->relationship;
+
+ $url = "";
+
+ $function = "";
+ if (isset($CONFIG->relationship_url_handler[$type])) {
+ $function = $CONFIG->relationship_url_handler[$type];
+ }
+ if (isset($CONFIG->relationship_url_handler['all'])) {
+ $function = $CONFIG->relationship_url_handler['all'];
+ }
+
+ if (is_callable($function)) {
+ $url = call_user_func($function, $relationship);
+ }
+
+ if ($url == "") {
+ $nameid = $relationship->id;
+
+ $url = elgg_get_site_url() . "export/$view/$guid/relationship/$nameid/";
+ }
+
+ return $url;
+ }
+
+ return false;
+}
+
+/**** HELPER FUNCTIONS FOR RELATIONSHIPS OF TYPE 'ATTACHED' ****/
+// @todo what is this?
+
+/**
+ * Function to determine if the object trying to attach to other, has already done so
+ *
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object trying to attach to $guid_one
+ *
+ * @return bool
+ * @access private
+ */
+function already_attached($guid_one, $guid_two) {
+ if ($attached = check_entity_relationship($guid_one, "attached", $guid_two)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Function to get all objects attached to a particular object
+ *
+ * @param int $guid Entity GUID
+ * @param string $type The type of object to return e.g. 'file', 'friend_of' etc
+ *
+ * @return ElggEntity[]
+ * @access private
+ */
+function get_attachments($guid, $type = "") {
+ $options = array(
+ 'relationship' => 'attached',
+ 'relationship_guid' => $guid,
+ 'inverse_relationship' => false,
+ 'type' => $type,
+ 'subtypes' => '',
+ 'owner_guid' => 0,
+ 'order_by' => 'time_created desc',
+ 'limit' => 10,
+ 'offset' => 0,
+ 'count' => false,
+ 'site_guid' => 0
+ );
+ $attached = elgg_get_entities_from_relationship($options);
+ return $attached;
+}
+
+/**
+ * Function to remove a particular attachment between two objects
+ *
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object to remove from $guid_one
+ *
+ * @return void
+ * @access private
+ */
+function remove_attachment($guid_one, $guid_two) {
+ if (already_attached($guid_one, $guid_two)) {
+ remove_entity_relationship($guid_one, "attached", $guid_two);
+ }
+}
+
+/**
+ * Function to start the process of attaching one object to another
+ *
+ * @param int $guid_one This is the target object
+ * @param int $guid_two This is the object trying to attach to $guid_one
+ *
+ * @return true|void
+ * @access private
+ */
+function make_attachment($guid_one, $guid_two) {
+ if (!(already_attached($guid_one, $guid_two))) {
+ if (add_entity_relationship($guid_one, "attached", $guid_two)) {
+ return true;
+ }
+ }
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "import" event.
+ *
+ * @param string $hook import
+ * @param string $entity_type all
+ * @param mixed $returnvalue Value from previous hook
+ * @param mixed $params Array of params
+ *
+ * @return mixed
+ * @access private
+ */
+function import_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ $element = $params['element'];
+
+ $tmp = NULL;
+
+ if ($element instanceof ODDRelationship) {
+ $tmp = new ElggRelationship();
+ $tmp->import($element);
+ }
+ return $tmp;
+}
+
+/**
+ * Handler called by trigger_plugin_hook on the "export" event.
+ *
+ * @param string $hook export
+ * @param string $entity_type all
+ * @param mixed $returnvalue Previous hook return value
+ * @param array $params Parameters
+ *
+ * @elgg_event_handler export all
+ * @return mixed
+ * @throws InvalidParameterException
+ * @access private
+ */
+function export_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params) {
+ // Sanity check values
+ if ((!is_array($params)) && (!isset($params['guid']))) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport'));
+ }
+
+ if (!is_array($returnvalue)) {
+ throw new InvalidParameterException(elgg_echo('InvalidParameterException:NonArrayReturnValue'));
+ }
+
+ $guid = (int)$params['guid'];
+
+ $result = get_entity_relationships($guid);
+
+ if ($result) {
+ foreach ($result as $r) {
+ $returnvalue[] = $r->export();
+ }
+ }
+
+ return $returnvalue;
+}
+
+/**
+ * Notify user that someone has friended them
+ *
+ * @param string $event Event name
+ * @param string $type Object type
+ * @param mixed $object Object
+ *
+ * @return bool
+ * @access private
+ */
+function relationship_notification_hook($event, $type, $object) {
+ /* @var ElggRelationship $object */
+ $user_one = get_entity($object->guid_one);
+ /* @var ElggUser $user_one */
+
+ return notify_user($object->guid_two,
+ $object->guid_one,
+ elgg_echo('friend:newfriend:subject', array($user_one->name)),
+ elgg_echo("friend:newfriend:body", array($user_one->name, $user_one->getURL()))
+ );
+}
+
+// Register the import hook
+elgg_register_plugin_hook_handler("import", "all", "import_relationship_plugin_hook", 3);
+
+// Register the hook, ensuring entities are serialised first
+elgg_register_plugin_hook_handler("export", "all", "export_relationship_plugin_hook", 3);
+
+// Register event to listen to some events
+elgg_register_event_handler('create', 'friend', 'relationship_notification_hook');
diff --git a/engine/lib/river.php b/engine/lib/river.php
new file mode 100644
index 000000000..e92040eb7
--- /dev/null
+++ b/engine/lib/river.php
@@ -0,0 +1,703 @@
+<?php
+/**
+ * Elgg river.
+ * Activity stream functions.
+ *
+ * @package Elgg.Core
+ * @subpackage SocialModel.River
+ */
+
+/**
+ * Adds an item to the river.
+ *
+ * @param string $view The view that will handle the river item (must exist)
+ * @param string $action_type An arbitrary string to define the action (eg 'comment', 'create')
+ * @param int $subject_guid The GUID of the entity doing the action
+ * @param int $object_guid The GUID of the entity being acted upon
+ * @param int $access_id The access ID of the river item (default: same as the object)
+ * @param int $posted The UNIX epoch timestamp of the river item (default: now)
+ * @param int $annotation_id The annotation ID associated with this river entry
+ *
+ * @return int/bool River ID or false on failure
+ */
+function add_to_river($view, $action_type, $subject_guid, $object_guid, $access_id = "",
+$posted = 0, $annotation_id = 0) {
+
+ global $CONFIG;
+
+ // use default viewtype for when called from web services api
+ if (!elgg_view_exists($view, 'default')) {
+ return false;
+ }
+ if (!($subject = get_entity($subject_guid))) {
+ return false;
+ }
+ if (!($object = get_entity($object_guid))) {
+ return false;
+ }
+ if (empty($action_type)) {
+ return false;
+ }
+ if ($posted == 0) {
+ $posted = time();
+ }
+ if ($access_id === "") {
+ $access_id = $object->access_id;
+ }
+ $type = $object->getType();
+ $subtype = $object->getSubtype();
+
+ $view = sanitise_string($view);
+ $action_type = sanitise_string($action_type);
+ $subject_guid = sanitise_int($subject_guid);
+ $object_guid = sanitise_int($object_guid);
+ $access_id = sanitise_int($access_id);
+ $posted = sanitise_int($posted);
+ $annotation_id = sanitise_int($annotation_id);
+
+ $values = array(
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'action_type' => $action_type,
+ 'access_id' => $access_id,
+ 'view' => $view,
+ 'subject_guid' => $subject_guid,
+ 'object_guid' => $object_guid,
+ 'annotation_id' => $annotation_id,
+ 'posted' => $posted,
+ );
+
+ // return false to stop insert
+ $values = elgg_trigger_plugin_hook('creating', 'river', null, $values);
+ if ($values == false) {
+ // inserting did not fail - it was just prevented
+ return true;
+ }
+
+ extract($values);
+
+ // Attempt to save river item; return success status
+ $id = insert_data("insert into {$CONFIG->dbprefix}river " .
+ " set type = '$type', " .
+ " subtype = '$subtype', " .
+ " action_type = '$action_type', " .
+ " access_id = $access_id, " .
+ " view = '$view', " .
+ " subject_guid = $subject_guid, " .
+ " object_guid = $object_guid, " .
+ " annotation_id = $annotation_id, " .
+ " posted = $posted");
+
+ // update the entities which had the action carried out on it
+ // @todo shouldn't this be down elsewhere? Like when an annotation is saved?
+ if ($id) {
+ update_entity_last_action($object_guid, $posted);
+
+ $river_items = elgg_get_river(array('id' => $id));
+ if ($river_items) {
+ elgg_trigger_event('created', 'river', $river_items[0]);
+ }
+ return $id;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Delete river items
+ *
+ * @warning not checking access (should we?)
+ *
+ * @param array $options Parameters:
+ * ids => INT|ARR River item id(s)
+ * subject_guids => INT|ARR Subject guid(s)
+ * object_guids => INT|ARR Object guid(s)
+ * annotation_ids => INT|ARR The identifier of the annotation(s)
+ * action_types => STR|ARR The river action type(s) identifier
+ * views => STR|ARR River view(s)
+ *
+ * types => STR|ARR Entity type string(s)
+ * subtypes => STR|ARR Entity subtype string(s)
+ * type_subtype_pairs => ARR Array of type => subtype pairs where subtype
+ * can be an array of subtype strings
+ *
+ * posted_time_lower => INT The lower bound on the time posted
+ * posted_time_upper => INT The upper bound on the time posted
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_delete_river(array $options = array()) {
+ global $CONFIG;
+
+ $defaults = array(
+ 'ids' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'subject_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'object_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'annotation_ids' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'views' => ELGG_ENTITIES_ANY_VALUE,
+ 'action_types' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'types' => ELGG_ENTITIES_ANY_VALUE,
+ 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
+ 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'posted_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'posted_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'wheres' => array(),
+ 'joins' => array(),
+
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('id', 'subject_guid', 'object_guid', 'annotation_id', 'action_type', 'view', 'type', 'subtype');
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ $wheres = $options['wheres'];
+
+ $wheres[] = elgg_get_guid_based_where_sql('rv.id', $options['ids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.subject_guid', $options['subject_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.object_guid', $options['object_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.annotation_id', $options['annotation_ids']);
+ $wheres[] = elgg_river_get_action_where_sql($options['action_types']);
+ $wheres[] = elgg_river_get_view_where_sql($options['views']);
+ $wheres[] = elgg_get_river_type_subtype_where_sql('rv', $options['types'],
+ $options['subtypes'], $options['type_subtype_pairs']);
+
+ if ($options['posted_time_lower'] && is_int($options['posted_time_lower'])) {
+ $wheres[] = "rv.posted >= {$options['posted_time_lower']}";
+ }
+
+ if ($options['posted_time_upper'] && is_int($options['posted_time_upper'])) {
+ $wheres[] = "rv.posted <= {$options['posted_time_upper']}";
+ }
+
+ // see if any functions failed
+ // remove empty strings on successful functions
+ foreach ($wheres as $i => $where) {
+ if ($where === FALSE) {
+ return FALSE;
+ } elseif (empty($where)) {
+ unset($wheres[$i]);
+ }
+ }
+
+ // remove identical where clauses
+ $wheres = array_unique($wheres);
+
+ $query = "DELETE rv.* FROM {$CONFIG->dbprefix}river rv ";
+
+ // remove identical join clauses
+ $joins = array_unique($options['joins']);
+
+ // add joins
+ foreach ($joins as $j) {
+ $query .= " $j ";
+ }
+
+ // add wheres
+ $query .= ' WHERE ';
+
+ foreach ($wheres as $w) {
+ $query .= " $w AND ";
+ }
+ $query .= "1=1";
+
+ return delete_data($query);
+}
+
+/**
+ * Get river items
+ *
+ * @note If using types and subtypes in a query, they are joined with an AND.
+ *
+ * @param array $options Parameters:
+ * ids => INT|ARR River item id(s)
+ * subject_guids => INT|ARR Subject guid(s)
+ * object_guids => INT|ARR Object guid(s)
+ * annotation_ids => INT|ARR The identifier of the annotation(s)
+ * action_types => STR|ARR The river action type(s) identifier
+ * posted_time_lower => INT The lower bound on the time posted
+ * posted_time_upper => INT The upper bound on the time posted
+ *
+ * types => STR|ARR Entity type string(s)
+ * subtypes => STR|ARR Entity subtype string(s)
+ * type_subtype_pairs => ARR Array of type => subtype pairs where subtype
+ * can be an array of subtype strings
+ *
+ * relationship => STR Relationship identifier
+ * relationship_guid => INT|ARR Entity guid(s)
+ * inverse_relationship => BOOL Subject or object of the relationship (false)
+ *
+ * limit => INT Number to show per page (20)
+ * offset => INT Offset in list (0)
+ * count => BOOL Count the river items? (false)
+ * order_by => STR Order by clause (rv.posted desc)
+ * group_by => STR Group by clause
+ *
+ * @return array|int
+ * @since 1.8.0
+ */
+function elgg_get_river(array $options = array()) {
+ global $CONFIG;
+
+ $defaults = array(
+ 'ids' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'subject_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'object_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'annotation_ids' => ELGG_ENTITIES_ANY_VALUE,
+ 'action_types' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'relationship' => NULL,
+ 'relationship_guid' => NULL,
+ 'inverse_relationship' => FALSE,
+
+ 'types' => ELGG_ENTITIES_ANY_VALUE,
+ 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
+ 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'posted_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'posted_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'limit' => 20,
+ 'offset' => 0,
+ 'count' => FALSE,
+
+ 'order_by' => 'rv.posted desc',
+ 'group_by' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'wheres' => array(),
+ 'joins' => array(),
+ );
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('id', 'subject_guid', 'object_guid', 'annotation_id', 'action_type', 'type', 'subtype');
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ $wheres = $options['wheres'];
+
+ $wheres[] = elgg_get_guid_based_where_sql('rv.id', $options['ids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.subject_guid', $options['subject_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.object_guid', $options['object_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('rv.annotation_id', $options['annotation_ids']);
+ $wheres[] = elgg_river_get_action_where_sql($options['action_types']);
+ $wheres[] = elgg_get_river_type_subtype_where_sql('rv', $options['types'],
+ $options['subtypes'], $options['type_subtype_pairs']);
+
+ if ($options['posted_time_lower'] && is_int($options['posted_time_lower'])) {
+ $wheres[] = "rv.posted >= {$options['posted_time_lower']}";
+ }
+
+ if ($options['posted_time_upper'] && is_int($options['posted_time_upper'])) {
+ $wheres[] = "rv.posted <= {$options['posted_time_upper']}";
+ }
+
+ $joins = $options['joins'];
+
+ if ($options['relationship_guid']) {
+ $clauses = elgg_get_entity_relationship_where_sql(
+ 'rv.subject_guid',
+ $options['relationship'],
+ $options['relationship_guid'],
+ $options['inverse_relationship']);
+ if ($clauses) {
+ $wheres = array_merge($wheres, $clauses['wheres']);
+ $joins = array_merge($joins, $clauses['joins']);
+ }
+ }
+
+ // see if any functions failed
+ // remove empty strings on successful functions
+ foreach ($wheres as $i => $where) {
+ if ($where === FALSE) {
+ return FALSE;
+ } elseif (empty($where)) {
+ unset($wheres[$i]);
+ }
+ }
+
+ // remove identical where clauses
+ $wheres = array_unique($wheres);
+
+ if (!$options['count']) {
+ $query = "SELECT DISTINCT rv.* FROM {$CONFIG->dbprefix}river rv ";
+ } else {
+ $query = "SELECT count(DISTINCT rv.id) as total FROM {$CONFIG->dbprefix}river rv ";
+ }
+
+ // add joins
+ foreach ($joins as $j) {
+ $query .= " $j ";
+ }
+
+ // add wheres
+ $query .= ' WHERE ';
+
+ foreach ($wheres as $w) {
+ $query .= " $w AND ";
+ }
+
+ $query .= elgg_river_get_access_sql();
+
+ if (!$options['count']) {
+ $options['group_by'] = sanitise_string($options['group_by']);
+ if ($options['group_by']) {
+ $query .= " GROUP BY {$options['group_by']}";
+ }
+
+ $options['order_by'] = sanitise_string($options['order_by']);
+ $query .= " ORDER BY {$options['order_by']}";
+
+ if ($options['limit']) {
+ $limit = sanitise_int($options['limit']);
+ $offset = sanitise_int($options['offset'], false);
+ $query .= " LIMIT $offset, $limit";
+ }
+
+ $river_items = get_data($query, 'elgg_row_to_elgg_river_item');
+ _elgg_prefetch_river_entities($river_items);
+
+ return $river_items;
+ } else {
+ $total = get_data_row($query);
+ return (int)$total->total;
+ }
+}
+
+/**
+ * Prefetch entities that will be displayed in the river.
+ *
+ * @param ElggRiverItem[] $river_items
+ * @access private
+ */
+function _elgg_prefetch_river_entities(array $river_items) {
+ // prefetch objects and subjects
+ $guids = array();
+ foreach ($river_items as $item) {
+ if ($item->subject_guid && !_elgg_retrieve_cached_entity($item->subject_guid)) {
+ $guids[$item->subject_guid] = true;
+ }
+ if ($item->object_guid && !_elgg_retrieve_cached_entity($item->object_guid)) {
+ $guids[$item->object_guid] = true;
+ }
+ }
+ if ($guids) {
+ // avoid creating oversized query
+ // @todo how to better handle this?
+ $guids = array_slice($guids, 0, 300, true);
+ // return value unneeded, just priming cache
+ elgg_get_entities(array(
+ 'guids' => array_keys($guids),
+ 'limit' => 0,
+ ));
+ }
+
+ // prefetch object containers
+ $guids = array();
+ foreach ($river_items as $item) {
+ $object = $item->getObjectEntity();
+ if ($object->container_guid && !_elgg_retrieve_cached_entity($object->container_guid)) {
+ $guids[$object->container_guid] = true;
+ }
+ }
+ if ($guids) {
+ $guids = array_slice($guids, 0, 300, true);
+ elgg_get_entities(array(
+ 'guids' => array_keys($guids),
+ 'limit' => 0,
+ ));
+ }
+}
+
+/**
+ * List river items
+ *
+ * @param array $options Any options from elgg_get_river() plus:
+ * pagination => BOOL Display pagination links (true)
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_list_river(array $options = array()) {
+ global $autofeed;
+ $autofeed = true;
+
+ $defaults = array(
+ 'offset' => (int) max(get_input('offset', 0), 0),
+ 'limit' => (int) max(get_input('limit', 20), 0),
+ 'pagination' => TRUE,
+ 'list_class' => 'elgg-list-river elgg-river', // @todo remove elgg-river in Elgg 1.9
+ );
+
+ $options = array_merge($defaults, $options);
+
+ if (!$options["limit"] && !$options["offset"]) {
+ // no need for pagination if listing is unlimited
+ $options["pagination"] = false;
+ }
+
+ $options['count'] = TRUE;
+ $count = elgg_get_river($options);
+
+ $options['count'] = FALSE;
+ $items = elgg_get_river($options);
+
+ $options['count'] = $count;
+ $options['items'] = $items;
+
+ return elgg_view('page/components/list', $options);
+}
+
+/**
+ * Convert a database row to a new ElggRiverItem
+ *
+ * @param stdClass $row Database row from the river table
+ *
+ * @return ElggRiverItem
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_row_to_elgg_river_item($row) {
+ if (!($row instanceof stdClass)) {
+ return NULL;
+ }
+
+ return new ElggRiverItem($row);
+}
+
+/**
+ * Get the river's access where clause
+ *
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_river_get_access_sql() {
+ // rewrite default access where clause to work with river table
+ return str_replace("and enabled='yes'", '',
+ str_replace('owner_guid', 'rv.subject_guid',
+ str_replace('access_id', 'rv.access_id', get_access_sql_suffix())));
+}
+
+/**
+ * Returns SQL where clause for type and subtype on river table
+ *
+ * @internal This is a simplified version of elgg_get_entity_type_subtype_where_sql()
+ * which could be used for all queries once the subtypes have been denormalized.
+ *
+ * @param string $table 'rv'
+ * @param NULL|array $types Array of types or NULL if none.
+ * @param NULL|array $subtypes Array of subtypes or NULL if none
+ * @param NULL|array $pairs Array of pairs of types and subtypes
+ *
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_river_type_subtype_where_sql($table, $types, $subtypes, $pairs) {
+ // short circuit if nothing is requested
+ if (!$types && !$subtypes && !$pairs) {
+ return '';
+ }
+
+ $wheres = array();
+ $types_wheres = array();
+ $subtypes_wheres = array();
+
+ // if no pairs, use types and subtypes
+ if (!is_array($pairs)) {
+ if ($types) {
+ if (!is_array($types)) {
+ $types = array($types);
+ }
+ foreach ($types as $type) {
+ $type = sanitise_string($type);
+ $types_wheres[] = "({$table}.type = '$type')";
+ }
+ }
+
+ if ($subtypes) {
+ if (!is_array($subtypes)) {
+ $subtypes = array($subtypes);
+ }
+ foreach ($subtypes as $subtype) {
+ $subtype = sanitise_string($subtype);
+ $subtypes_wheres[] = "({$table}.subtype = '$subtype')";
+ }
+ }
+
+ if (is_array($types_wheres) && count($types_wheres)) {
+ $types_wheres = array(implode(' OR ', $types_wheres));
+ }
+
+ if (is_array($subtypes_wheres) && count($subtypes_wheres)) {
+ $subtypes_wheres = array('(' . implode(' OR ', $subtypes_wheres) . ')');
+ }
+
+ $wheres = array(implode(' AND ', array_merge($types_wheres, $subtypes_wheres)));
+
+ } else {
+ // using type/subtype pairs
+ foreach ($pairs as $paired_type => $paired_subtypes) {
+ $paired_type = sanitise_string($paired_type);
+ if (is_array($paired_subtypes)) {
+ $paired_subtypes = array_map('sanitise_string', $paired_subtypes);
+ $paired_subtype_str = implode("','", $paired_subtypes);
+ if ($paired_subtype_str) {
+ $wheres[] = "({$table}.type = '$paired_type'"
+ . " AND {$table}.subtype IN ('$paired_subtype_str'))";
+ }
+ } else {
+ $paired_subtype = sanitise_string($paired_subtypes);
+ $wheres[] = "({$table}.type = '$paired_type'"
+ . " AND {$table}.subtype = '$paired_subtype')";
+ }
+ }
+ }
+
+ if (is_array($wheres) && count($wheres)) {
+ $where = implode(' OR ', $wheres);
+ return "($where)";
+ }
+
+ return '';
+}
+
+/**
+ * Get the where clause based on river action type strings
+ *
+ * @param array $types Array of action type strings
+ *
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_river_get_action_where_sql($types) {
+ if (!$types) {
+ return '';
+ }
+
+ if (!is_array($types)) {
+ $types = sanitise_string($types);
+ return "(rv.action_type = '$types')";
+ }
+
+ // sanitize types array
+ $types_sanitized = array();
+ foreach ($types as $type) {
+ $types_sanitized[] = sanitise_string($type);
+ }
+
+ $type_str = implode("','", $types_sanitized);
+ return "(rv.action_type IN ('$type_str'))";
+}
+
+/**
+ * Get the where clause based on river view strings
+ *
+ * @param array $views Array of view strings
+ *
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_river_get_view_where_sql($views) {
+ if (!$views) {
+ return '';
+ }
+
+ if (!is_array($views)) {
+ $views = sanitise_string($views);
+ return "(rv.view = '$views')";
+ }
+
+ // sanitize views array
+ $views_sanitized = array();
+ foreach ($views as $view) {
+ $views_sanitized[] = sanitise_string($view);
+ }
+
+ $view_str = implode("','", $views_sanitized);
+ return "(rv.view IN ('$view_str'))";
+}
+
+/**
+ * Sets the access ID on river items for a particular object
+ *
+ * @param int $object_guid The GUID of the entity
+ * @param int $access_id The access ID
+ *
+ * @return bool Depending on success
+ */
+function update_river_access_by_object($object_guid, $access_id) {
+ // Sanitise
+ $object_guid = (int) $object_guid;
+ $access_id = (int) $access_id;
+
+ // Load config
+ global $CONFIG;
+
+ // Remove
+ $query = "update {$CONFIG->dbprefix}river
+ set access_id = {$access_id}
+ where object_guid = {$object_guid}";
+ return update_data($query);
+}
+
+/**
+ * Page handler for activity
+ *
+ * @param array $page
+ * @return bool
+ * @access private
+ */
+function elgg_river_page_handler($page) {
+ global $CONFIG;
+
+ elgg_set_page_owner_guid(elgg_get_logged_in_user_guid());
+
+ // make a URL segment available in page handler script
+ $page_type = elgg_extract(0, $page, 'all');
+ $page_type = preg_replace('[\W]', '', $page_type);
+ if ($page_type == 'owner') {
+ $page_type = 'mine';
+ }
+ set_input('page_type', $page_type);
+
+ require_once("{$CONFIG->path}pages/river.php");
+ return true;
+}
+
+/**
+ * Register river unit tests
+ * @access private
+ */
+function elgg_river_test($hook, $type, $value) {
+ global $CONFIG;
+ $value[] = $CONFIG->path . 'engine/tests/api/river.php';
+ return $value;
+}
+
+/**
+ * Initialize river library
+ * @access private
+ */
+function elgg_river_init() {
+ elgg_register_page_handler('activity', 'elgg_river_page_handler');
+ $item = new ElggMenuItem('activity', elgg_echo('activity'), 'activity');
+ elgg_register_menu_item('site', $item);
+
+ elgg_register_widget_type('river_widget', elgg_echo('river:widget:title'), elgg_echo('river:widget:description'));
+
+ elgg_register_action('river/delete', '', 'admin');
+
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'elgg_river_test');
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_river_init');
diff --git a/engine/lib/sessions.php b/engine/lib/sessions.php
new file mode 100644
index 000000000..e3d5ce9cd
--- /dev/null
+++ b/engine/lib/sessions.php
@@ -0,0 +1,656 @@
+<?php
+
+/**
+ * Elgg session management
+ * Functions to manage logins
+ *
+ * @package Elgg.Core
+ * @subpackage Session
+ */
+
+/** Elgg magic session */
+global $SESSION;
+
+/**
+ * Return the current logged in user, or NULL if no user is logged in.
+ *
+ * If no user can be found in the current session, a plugin
+ * hook - 'session:get' 'user' to give plugin authors another
+ * way to provide user details to the ACL system without touching the session.
+ *
+ * @return ElggUser
+ */
+function elgg_get_logged_in_user_entity() {
+ global $SESSION;
+
+ if (isset($SESSION)) {
+ return $SESSION['user'];
+ }
+
+ return NULL;
+}
+
+/**
+ * Return the current logged in user by id.
+ *
+ * @see elgg_get_logged_in_user_entity()
+ * @return int
+ */
+function elgg_get_logged_in_user_guid() {
+ $user = elgg_get_logged_in_user_entity();
+ if ($user) {
+ return $user->guid;
+ }
+
+ return 0;
+}
+
+/**
+ * Returns whether or not the user is currently logged in
+ *
+ * @return bool
+ */
+function elgg_is_logged_in() {
+ $user = elgg_get_logged_in_user_entity();
+
+ if ((isset($user)) && ($user instanceof ElggUser) && ($user->guid > 0)) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Returns whether or not the user is currently logged in and that they are an admin user.
+ *
+ * @return bool
+ */
+function elgg_is_admin_logged_in() {
+ $user = elgg_get_logged_in_user_entity();
+
+ if ((elgg_is_logged_in()) && $user->isAdmin()) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Check if the given user has full access.
+ *
+ * @todo: Will always return full access if the user is an admin.
+ *
+ * @param int $user_guid The user to check
+ *
+ * @return bool
+ * @since 1.7.1
+ */
+function elgg_is_admin_user($user_guid) {
+ global $CONFIG;
+
+ $user_guid = (int)$user_guid;
+
+ // cannot use magic metadata here because of recursion
+
+ // must support the old way of getting admin from metadata
+ // in order to run the upgrade to move it into the users table.
+ $version = (int) datalist_get('version');
+
+ if ($version < 2010040201) {
+ $admin = get_metastring_id('admin');
+ $yes = get_metastring_id('yes');
+ $one = get_metastring_id('1');
+
+ $query = "SELECT * FROM {$CONFIG->dbprefix}users_entity as e,
+ {$CONFIG->dbprefix}metadata as md
+ WHERE (
+ md.name_id = '$admin'
+ AND md.value_id IN ('$yes', '$one')
+ AND e.guid = md.entity_guid
+ AND e.guid = {$user_guid}
+ AND e.banned = 'no'
+ )";
+ } else {
+ $query = "SELECT * FROM {$CONFIG->dbprefix}users_entity as e
+ WHERE (
+ e.guid = {$user_guid}
+ AND e.admin = 'yes'
+ )";
+ }
+
+ // normalizing the results from get_data()
+ // See #1242
+ $info = get_data($query);
+ if (!((is_array($info) && count($info) < 1) || $info === FALSE)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * Perform user authentication with a given username and password.
+ *
+ * @warning This returns an error message on failure. Use the identical operator to check
+ * for access: if (true === elgg_authenticate()) { ... }.
+ *
+ *
+ * @see login
+ *
+ * @param string $username The username
+ * @param string $password The password
+ *
+ * @return true|string True or an error message on failure
+ * @access private
+ */
+function elgg_authenticate($username, $password) {
+ $pam = new ElggPAM('user');
+ $credentials = array('username' => $username, 'password' => $password);
+ $result = $pam->authenticate($credentials);
+ if (!$result) {
+ return $pam->getFailureMessage();
+ }
+ return true;
+}
+
+/**
+ * Hook into the PAM system which accepts a username and password and attempts to authenticate
+ * it against a known user.
+ *
+ * @param array $credentials Associated array of credentials passed to
+ * Elgg's PAM system. This function expects
+ * 'username' and 'password' (cleartext).
+ *
+ * @return bool
+ * @throws LoginException
+ * @access private
+ */
+function pam_auth_userpass(array $credentials = array()) {
+
+ if (!isset($credentials['username']) || !isset($credentials['password'])) {
+ return false;
+ }
+
+ $user = get_user_by_username($credentials['username']);
+ if (!$user) {
+ throw new LoginException(elgg_echo('LoginException:UsernameFailure'));
+ }
+
+ if (check_rate_limit_exceeded($user->guid)) {
+ throw new LoginException(elgg_echo('LoginException:AccountLocked'));
+ }
+
+ if ($user->password !== generate_user_password($user, $credentials['password'])) {
+ log_login_failure($user->guid);
+ throw new LoginException(elgg_echo('LoginException:PasswordFailure'));
+ }
+
+ return true;
+}
+
+/**
+ * Log a failed login for $user_guid
+ *
+ * @param int $user_guid User GUID
+ *
+ * @return bool
+ */
+function log_login_failure($user_guid) {
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+
+ if (($user_guid) && ($user) && ($user instanceof ElggUser)) {
+ $fails = (int)$user->getPrivateSetting("login_failures");
+ $fails++;
+
+ $user->setPrivateSetting("login_failures", $fails);
+ $user->setPrivateSetting("login_failure_$fails", time());
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Resets the fail login count for $user_guid
+ *
+ * @param int $user_guid User GUID
+ *
+ * @return bool true on success (success = user has no logged failed attempts)
+ */
+function reset_login_failure_count($user_guid) {
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+
+ if (($user_guid) && ($user) && ($user instanceof ElggUser)) {
+ $fails = (int)$user->getPrivateSetting("login_failures");
+
+ if ($fails) {
+ for ($n = 1; $n <= $fails; $n++) {
+ $user->removePrivateSetting("login_failure_$n");
+ }
+
+ $user->removePrivateSetting("login_failures");
+
+ return true;
+ }
+
+ // nothing to reset
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Checks if the rate limit of failed logins has been exceeded for $user_guid.
+ *
+ * @param int $user_guid User GUID
+ *
+ * @return bool on exceeded limit.
+ */
+function check_rate_limit_exceeded($user_guid) {
+ // 5 failures in 5 minutes causes temporary block on logins
+ $limit = 5;
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+
+ if (($user_guid) && ($user) && ($user instanceof ElggUser)) {
+ $fails = (int)$user->getPrivateSetting("login_failures");
+ if ($fails >= $limit) {
+ $cnt = 0;
+ $time = time();
+ for ($n = $fails; $n > 0; $n--) {
+ $f = $user->getPrivateSetting("login_failure_$n");
+ if ($f > $time - (60 * 5)) {
+ $cnt++;
+ }
+
+ if ($cnt == $limit) {
+ // Limit reached
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Logs in a specified ElggUser. For standard registration, use in conjunction
+ * with elgg_authenticate.
+ *
+ * @see elgg_authenticate
+ *
+ * @param ElggUser $user A valid Elgg user object
+ * @param boolean $persistent Should this be a persistent login?
+ *
+ * @return true or throws exception
+ * @throws LoginException
+ */
+function login(ElggUser $user, $persistent = false) {
+ // User is banned, return false.
+ if ($user->isBanned()) {
+ throw new LoginException(elgg_echo('LoginException:BannedUser'));
+ }
+
+ $_SESSION['user'] = $user;
+ $_SESSION['guid'] = $user->getGUID();
+ $_SESSION['id'] = $_SESSION['guid'];
+ $_SESSION['username'] = $user->username;
+ $_SESSION['name'] = $user->name;
+
+ // if remember me checked, set cookie with token and store token on user
+ if (($persistent)) {
+ $code = (md5($user->name . $user->username . time() . rand()));
+ $_SESSION['code'] = $code;
+ $user->code = md5($code);
+ setcookie("elggperm", $code, (time() + (86400 * 30)), "/");
+ }
+
+ if (!$user->save() || !elgg_trigger_event('login', 'user', $user)) {
+ unset($_SESSION['username']);
+ unset($_SESSION['name']);
+ unset($_SESSION['code']);
+ unset($_SESSION['guid']);
+ unset($_SESSION['id']);
+ unset($_SESSION['user']);
+ setcookie("elggperm", "", (time() - (86400 * 30)), "/");
+ throw new LoginException(elgg_echo('LoginException:Unknown'));
+ }
+
+ // Users privilege has been elevated, so change the session id (prevents session fixation)
+ session_regenerate_id();
+
+ // Update statistics
+ set_last_login($_SESSION['guid']);
+ reset_login_failure_count($user->guid); // Reset any previous failed login attempts
+
+ // if memcache is enabled, invalidate the user in memcache @see https://github.com/Elgg/Elgg/issues/3143
+ if (is_memcache_available()) {
+ // this needs to happen with a shutdown function because of the timing with set_last_login()
+ register_shutdown_function("_elgg_invalidate_memcache_for_entity", $_SESSION['guid']);
+ }
+
+ return true;
+}
+
+/**
+ * Log the current user out
+ *
+ * @return bool
+ */
+function logout() {
+ if (isset($_SESSION['user'])) {
+ if (!elgg_trigger_event('logout', 'user', $_SESSION['user'])) {
+ return false;
+ }
+ $_SESSION['user']->code = "";
+ $_SESSION['user']->save();
+ }
+
+ unset($_SESSION['username']);
+ unset($_SESSION['name']);
+ unset($_SESSION['code']);
+ unset($_SESSION['guid']);
+ unset($_SESSION['id']);
+ unset($_SESSION['user']);
+
+ setcookie("elggperm", "", (time() - (86400 * 30)), "/");
+
+ // pass along any messages
+ $old_msg = $_SESSION['msg'];
+
+ session_destroy();
+
+ // starting a default session to store any post-logout messages.
+ _elgg_session_boot(NULL, NULL, NULL);
+ $_SESSION['msg'] = $old_msg;
+
+ return TRUE;
+}
+
+/**
+ * Initialises the system session and potentially logs the user in
+ *
+ * This function looks for:
+ *
+ * 1. $_SESSION['id'] - if not present, we're logged out, and this is set to 0
+ * 2. The cookie 'elggperm' - if present, checks it for an authentication
+ * token, validates it, and potentially logs the user in
+ *
+ * @uses $_SESSION
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_session_boot() {
+ global $DB_PREFIX, $CONFIG;
+
+ // Use database for sessions
+ // HACK to allow access to prefix after object destruction
+ $DB_PREFIX = $CONFIG->dbprefix;
+ if ((!isset($CONFIG->use_file_sessions))) {
+ session_set_save_handler("_elgg_session_open",
+ "_elgg_session_close",
+ "_elgg_session_read",
+ "_elgg_session_write",
+ "_elgg_session_destroy",
+ "_elgg_session_gc");
+ }
+
+ session_name('Elgg');
+ session_start();
+
+ // Generate a simple token (private from potentially public session id)
+ if (!isset($_SESSION['__elgg_session'])) {
+ $_SESSION['__elgg_session'] = md5(microtime() . rand());
+ }
+
+ // test whether we have a user session
+ if (empty($_SESSION['guid'])) {
+
+ // clear session variables before checking cookie
+ unset($_SESSION['user']);
+ unset($_SESSION['id']);
+ unset($_SESSION['guid']);
+ unset($_SESSION['code']);
+
+ // is there a remember me cookie
+ if (isset($_COOKIE['elggperm'])) {
+ // we have a cookie, so try to log the user in
+ $code = $_COOKIE['elggperm'];
+ $code = md5($code);
+ if ($user = get_user_by_code($code)) {
+ // we have a user, log him in
+ $_SESSION['user'] = $user;
+ $_SESSION['id'] = $user->getGUID();
+ $_SESSION['guid'] = $_SESSION['id'];
+ $_SESSION['code'] = $_COOKIE['elggperm'];
+ }
+ }
+ } else {
+ // we have a session and we have already checked the fingerprint
+ // reload the user object from database in case it has changed during the session
+ if ($user = get_user($_SESSION['guid'])) {
+ $_SESSION['user'] = $user;
+ $_SESSION['id'] = $user->getGUID();
+ $_SESSION['guid'] = $_SESSION['id'];
+ } else {
+ // user must have been deleted with a session active
+ unset($_SESSION['user']);
+ unset($_SESSION['id']);
+ unset($_SESSION['guid']);
+ unset($_SESSION['code']);
+ }
+ }
+
+ if (isset($_SESSION['guid'])) {
+ set_last_action($_SESSION['guid']);
+ }
+
+ elgg_register_action('login', '', 'public');
+ elgg_register_action('logout');
+
+ // Register a default PAM handler
+ register_pam_handler('pam_auth_userpass');
+
+ // Initialise the magic session
+ global $SESSION;
+ $SESSION = new ElggSession();
+
+ // Finally we ensure that a user who has been banned with an open session is kicked.
+ if ((isset($_SESSION['user'])) && ($_SESSION['user']->isBanned())) {
+ session_destroy();
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Used at the top of a page to mark it as logged in users only.
+ *
+ * @return void
+ */
+function gatekeeper() {
+ if (!elgg_is_logged_in()) {
+ $_SESSION['last_forward_from'] = current_page_url();
+ register_error(elgg_echo('loggedinrequired'));
+ forward('', 'login');
+ }
+}
+
+/**
+ * Used at the top of a page to mark it as logged in admin or siteadmin only.
+ *
+ * @return void
+ */
+function admin_gatekeeper() {
+ gatekeeper();
+
+ if (!elgg_is_admin_logged_in()) {
+ $_SESSION['last_forward_from'] = current_page_url();
+ register_error(elgg_echo('adminrequired'));
+ forward('', 'admin');
+ }
+}
+
+/**
+ * Handles opening a session in the DB
+ *
+ * @param string $save_path The path to save the sessions
+ * @param string $session_name The name of the session
+ *
+ * @return true
+ * @todo Document
+ * @access private
+ */
+function _elgg_session_open($save_path, $session_name) {
+ global $sess_save_path;
+ $sess_save_path = $save_path;
+
+ return true;
+}
+
+/**
+ * Closes a session
+ *
+ * @todo implement
+ * @todo document
+ *
+ * @return true
+ * @access private
+ */
+function _elgg_session_close() {
+ return true;
+}
+
+/**
+ * Read the session data from DB failing back to file.
+ *
+ * @param string $id The session ID
+ *
+ * @return string
+ * @access private
+ */
+function _elgg_session_read($id) {
+ global $DB_PREFIX;
+
+ $id = sanitise_string($id);
+
+ try {
+ $result = get_data_row("SELECT * from {$DB_PREFIX}users_sessions where session='$id'");
+
+ if ($result) {
+ return (string)$result->data;
+ }
+
+ } catch (DatabaseException $e) {
+
+ // Fall back to file store in this case, since this likely means
+ // that the database hasn't been upgraded
+ global $sess_save_path;
+
+ $sess_file = "$sess_save_path/sess_$id";
+ return (string) @file_get_contents($sess_file);
+ }
+
+ return '';
+}
+
+/**
+ * Write session data to the DB falling back to file.
+ *
+ * @param string $id The session ID
+ * @param mixed $sess_data Session data
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_session_write($id, $sess_data) {
+ global $DB_PREFIX;
+
+ $id = sanitise_string($id);
+ $time = time();
+
+ try {
+ $sess_data_sanitised = sanitise_string($sess_data);
+
+ $q = "REPLACE INTO {$DB_PREFIX}users_sessions
+ (session, ts, data) VALUES
+ ('$id', '$time', '$sess_data_sanitised')";
+
+ if (insert_data($q) !== false) {
+ return true;
+ }
+ } catch (DatabaseException $e) {
+ // Fall back to file store in this case, since this likely means
+ // that the database hasn't been upgraded
+ global $sess_save_path;
+
+ $sess_file = "$sess_save_path/sess_$id";
+ if ($fp = @fopen($sess_file, "w")) {
+ $return = fwrite($fp, $sess_data);
+ fclose($fp);
+ return $return;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Destroy a DB session, falling back to file.
+ *
+ * @param string $id Session ID
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_session_destroy($id) {
+ global $DB_PREFIX;
+
+ $id = sanitise_string($id);
+
+ try {
+ return (bool)delete_data("DELETE from {$DB_PREFIX}users_sessions where session='$id'");
+ } catch (DatabaseException $e) {
+ // Fall back to file store in this case, since this likely means that
+ // the database hasn't been upgraded
+ global $sess_save_path;
+
+ $sess_file = "$sess_save_path/sess_$id";
+ return @unlink($sess_file);
+ }
+}
+
+/**
+ * Perform garbage collection on session table / files
+ *
+ * @param int $maxlifetime Max age of a session
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_session_gc($maxlifetime) {
+ global $DB_PREFIX;
+
+ $life = time() - $maxlifetime;
+
+ try {
+ return (bool)delete_data("DELETE from {$DB_PREFIX}users_sessions where ts<'$life'");
+ } catch (DatabaseException $e) {
+ // Fall back to file store in this case, since this likely means that the database
+ // hasn't been upgraded
+ global $sess_save_path;
+
+ foreach (glob("$sess_save_path/sess_*") as $filename) {
+ if (filemtime($filename) < $life) {
+ @unlink($filename);
+ }
+ }
+ }
+
+ return true;
+}
diff --git a/engine/lib/sites.php b/engine/lib/sites.php
new file mode 100644
index 000000000..3de0eccc2
--- /dev/null
+++ b/engine/lib/sites.php
@@ -0,0 +1,256 @@
+<?php
+/**
+ * Elgg sites
+ * Functions to manage multiple or single sites in an Elgg install
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.Site
+ */
+
+/**
+ * Get an ElggSite entity (default is current site)
+ *
+ * @param int $site_guid Optional. Site GUID.
+ *
+ * @return ElggSite
+ * @since 1.8.0
+ */
+function elgg_get_site_entity($site_guid = 0) {
+ global $CONFIG;
+
+ $result = false;
+
+ if ($site_guid == 0) {
+ $site = $CONFIG->site;
+ } else {
+ $site = get_entity($site_guid);
+ }
+
+ if ($site instanceof ElggSite) {
+ $result = $site;
+ }
+
+ return $result;
+}
+
+/**
+ * Return the site specific details of a site by a row.
+ *
+ * @param int $guid The site GUID
+ *
+ * @return mixed
+ * @access private
+ */
+function get_site_entity_as_row($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}sites_entity where guid=$guid");
+}
+
+/**
+ * Create or update the entities table for a given site.
+ * Call create_entity first.
+ *
+ * @param int $guid Site GUID
+ * @param string $name Site name
+ * @param string $description Site Description
+ * @param string $url URL of the site
+ *
+ * @return bool
+ * @access private
+ */
+function create_site_entity($guid, $name, $description, $url) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $name = sanitise_string($name);
+ $description = sanitise_string($description);
+ $url = sanitise_string($url);
+
+ $row = get_entity_as_row($guid);
+
+ if ($row) {
+ // Exists and you have access to it
+ $query = "SELECT guid from {$CONFIG->dbprefix}sites_entity where guid = {$guid}";
+ if ($exists = get_data_row($query)) {
+ $query = "UPDATE {$CONFIG->dbprefix}sites_entity
+ set name='$name', description='$description', url='$url' where guid=$guid";
+ $result = update_data($query);
+
+ if ($result != false) {
+ // Update succeeded, continue
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('update', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ //delete_entity($guid);
+ }
+ }
+ } else {
+ // Update failed, attempt an insert.
+ $query = "INSERT into {$CONFIG->dbprefix}sites_entity
+ (guid, name, description, url) values ($guid, '$name', '$description', '$url')";
+ $result = insert_data($query);
+
+ if ($result !== false) {
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('create', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ //delete_entity($guid);
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Add a user to a site.
+ *
+ * @param int $site_guid Site guid
+ * @param int $user_guid User guid
+ *
+ * @return bool
+ */
+function add_site_user($site_guid, $user_guid) {
+ $site_guid = (int)$site_guid;
+ $user_guid = (int)$user_guid;
+
+ return add_entity_relationship($user_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Remove a user from a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $user_guid User GUID
+ *
+ * @return bool
+ */
+function remove_site_user($site_guid, $user_guid) {
+ $site_guid = (int)$site_guid;
+ $user_guid = (int)$user_guid;
+
+ return remove_entity_relationship($user_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Add an object to a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $object_guid Object GUID
+ *
+ * @return mixed
+ */
+function add_site_object($site_guid, $object_guid) {
+ $site_guid = (int)$site_guid;
+ $object_guid = (int)$object_guid;
+
+ return add_entity_relationship($object_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Remove an object from a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param int $object_guid Object GUID
+ *
+ * @return bool
+ */
+function remove_site_object($site_guid, $object_guid) {
+ $site_guid = (int)$site_guid;
+ $object_guid = (int)$object_guid;
+
+ return remove_entity_relationship($object_guid, "member_of_site", $site_guid);
+}
+
+/**
+ * Get the objects belonging to a site.
+ *
+ * @param int $site_guid Site GUID
+ * @param string $subtype Subtype
+ * @param int $limit Limit
+ * @param int $offset Offset
+ *
+ * @return mixed
+ */
+function get_site_objects($site_guid, $subtype = "", $limit = 10, $offset = 0) {
+ $site_guid = (int)$site_guid;
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $site_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+}
+
+/**
+ * Return the site via a url.
+ *
+ * @param string $url The URL of a site
+ *
+ * @return mixed
+ */
+function get_site_by_url($url) {
+ global $CONFIG;
+
+ $url = sanitise_string($url);
+
+ $row = get_data_row("SELECT * from {$CONFIG->dbprefix}sites_entity where url='$url'");
+
+ if ($row) {
+ return get_entity($row->guid);
+ }
+
+ return false;
+}
+
+/**
+ * Retrieve a site and return the domain portion of its url.
+ *
+ * @param int $guid ElggSite GUID
+ *
+ * @return string
+ */
+function get_site_domain($guid) {
+ $guid = (int)$guid;
+
+ $site = get_entity($guid);
+ if ($site instanceof ElggSite) {
+ $breakdown = parse_url($site->url);
+ return $breakdown['host'];
+ }
+
+ return false;
+}
+
+/**
+ * Unit tests for sites
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function sites_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = "{$CONFIG->path}engine/tests/objects/sites.php";
+ return $value;
+}
+
+// Register with unit test
+elgg_register_plugin_hook_handler('unit_test', 'system', 'sites_test');
diff --git a/engine/lib/statistics.php b/engine/lib/statistics.php
new file mode 100644
index 000000000..4cb0bb0b8
--- /dev/null
+++ b/engine/lib/statistics.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Elgg statistics library.
+ *
+ * This file contains a number of functions for obtaining statistics about the running system.
+ * These statistics are mainly used by the administration pages, and is also where the basic
+ * views for statistics are added.
+ *
+ * @package Elgg.Core
+ * @subpackage Statistics
+ */
+
+/**
+ * Return an array reporting the number of various entities in the system.
+ *
+ * @param int $owner_guid Optional owner of the statistics
+ *
+ * @return array
+ */
+function get_entity_statistics($owner_guid = 0) {
+ global $CONFIG;
+
+ $entity_stats = array();
+ $owner_guid = (int)$owner_guid;
+
+ $query = "SELECT distinct e.type,s.subtype,e.subtype as subtype_id
+ from {$CONFIG->dbprefix}entities e left
+ join {$CONFIG->dbprefix}entity_subtypes s on e.subtype=s.id";
+
+ $owner_query = "";
+ if ($owner_guid) {
+ $query .= " where owner_guid=$owner_guid";
+ $owner_query = "and owner_guid=$owner_guid ";
+ }
+
+ // Get a list of major types
+
+ $types = get_data($query);
+ foreach ($types as $type) {
+ // assume there are subtypes for now
+ if (!is_array($entity_stats[$type->type])) {
+ $entity_stats[$type->type] = array();
+ }
+
+ $query = "SELECT count(*) as count
+ from {$CONFIG->dbprefix}entities where type='{$type->type}' $owner_query";
+
+ if ($type->subtype) {
+ $query .= " and subtype={$type->subtype_id}";
+ }
+
+ $subtype_cnt = get_data_row($query);
+
+ if ($type->subtype) {
+ $entity_stats[$type->type][$type->subtype] = $subtype_cnt->count;
+ } else {
+ $entity_stats[$type->type]['__base__'] = $subtype_cnt->count;
+ }
+ }
+
+ return $entity_stats;
+}
+
+/**
+ * Return the number of users registered in the system.
+ *
+ * @param bool $show_deactivated Count not enabled users?
+ *
+ * @return int
+ */
+function get_number_users($show_deactivated = false) {
+ global $CONFIG;
+
+ $access = "";
+
+ if (!$show_deactivated) {
+ $access = "and " . get_access_sql_suffix();
+ }
+
+ $query = "SELECT count(*) as count
+ from {$CONFIG->dbprefix}entities where type='user' $access";
+
+ $result = get_data_row($query);
+
+ if ($result) {
+ return $result->count;
+ }
+
+ return false;
+}
+
+/**
+ * Return a list of how many users are currently online, rendered as a view.
+ *
+ * @return string
+ */
+function get_online_users() {
+ $limit = max(0, (int) get_input("limit", 10));
+ $offset = max(0, (int) get_input("offset", 0));
+
+ $count = find_active_users(600, $limit, $offset, true);
+ $objects = find_active_users(600, $limit, $offset);
+
+ if ($objects) {
+ return elgg_view_entity_list($objects, array(
+ 'count' => $count,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+ }
+ return '';
+}
+
+/**
+ * Initialise the statistics admin page.
+ *
+ * @return void
+ * @access private
+ */
+function statistics_init() {
+ elgg_extend_view('core/settings/statistics', 'core/settings/statistics/online');
+ elgg_extend_view('core/settings/statistics', 'core/settings/statistics/numentities');
+}
+
+/// Register init function
+elgg_register_event_handler('init', 'system', 'statistics_init');
diff --git a/engine/lib/system_log.php b/engine/lib/system_log.php
new file mode 100644
index 000000000..84302632e
--- /dev/null
+++ b/engine/lib/system_log.php
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Elgg system log.
+ * Listens to events and writes crud events into the system log database.
+ *
+ * @package Elgg.Core
+ * @subpackage Logging
+ */
+
+/**
+ * Retrieve the system log based on a number of parameters.
+ *
+ * @todo too many args, and the first arg is too confusing
+ *
+ * @param int|array $by_user The guid(s) of the user(s) who initiated the event.
+ * Use 0 for unowned entries. Anything else falsey means anyone.
+ * @param string $event The event you are searching on.
+ * @param string $class The class of object it effects.
+ * @param string $type The type
+ * @param string $subtype The subtype.
+ * @param int $limit Maximum number of responses to return.
+ * @param int $offset Offset of where to start.
+ * @param bool $count Return count or not
+ * @param int $timebefore Lower time limit
+ * @param int $timeafter Upper time limit
+ * @param int $object_id GUID of an object
+ * @param string $ip_address The IP address.
+ * @return mixed
+ */
+function get_system_log($by_user = "", $event = "", $class = "", $type = "", $subtype = "", $limit = 10,
+ $offset = 0, $count = false, $timebefore = 0, $timeafter = 0, $object_id = 0,
+ $ip_address = "") {
+
+ global $CONFIG;
+
+ $by_user_orig = $by_user;
+ if (is_array($by_user) && sizeof($by_user) > 0) {
+ foreach ($by_user as $key => $val) {
+ $by_user[$key] = (int) $val;
+ }
+ } else {
+ $by_user = (int)$by_user;
+ }
+
+ $event = sanitise_string($event);
+ $class = sanitise_string($class);
+ $type = sanitise_string($type);
+ $subtype = sanitise_string($subtype);
+ $ip_address = sanitise_string($ip_address);
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ $where = array();
+
+ if ($by_user_orig !== "" && $by_user_orig !== false && $by_user_orig !== null) {
+ if (is_int($by_user)) {
+ $where[] = "performed_by_guid=$by_user";
+ } else if (is_array($by_user)) {
+ $where [] = "performed_by_guid in (" . implode(",", $by_user) . ")";
+ }
+ }
+ if ($event != "") {
+ $where[] = "event='$event'";
+ }
+ if ($class !== "") {
+ $where[] = "object_class='$class'";
+ }
+ if ($type != "") {
+ $where[] = "object_type='$type'";
+ }
+ if ($subtype !== "") {
+ $where[] = "object_subtype='$subtype'";
+ }
+
+ if ($timebefore) {
+ $where[] = "time_created < " . ((int) $timebefore);
+ }
+ if ($timeafter) {
+ $where[] = "time_created > " . ((int) $timeafter);
+ }
+ if ($object_id) {
+ $where[] = "object_id = " . ((int) $object_id);
+ }
+ if ($ip_address) {
+ $where[] = "ip_address = '$ip_address'";
+ }
+
+ $select = "*";
+ if ($count) {
+ $select = "count(*) as count";
+ }
+ $query = "SELECT $select from {$CONFIG->dbprefix}system_log where 1 ";
+ foreach ($where as $w) {
+ $query .= " and $w";
+ }
+
+ if (!$count) {
+ $query .= " order by time_created desc";
+ $query .= " limit $offset, $limit"; // Add order and limit
+ }
+
+ if ($count) {
+ $numrows = get_data_row($query);
+ if ($numrows) {
+ return $numrows->count;
+ }
+ } else {
+ return get_data($query);
+ }
+
+ return false;
+}
+
+/**
+ * Return a specific log entry.
+ *
+ * @param int $entry_id The log entry
+ *
+ * @return mixed
+ */
+function get_log_entry($entry_id) {
+ global $CONFIG;
+
+ $entry_id = (int)$entry_id;
+
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}system_log where id=$entry_id");
+}
+
+/**
+ * Return the object referred to by a given log entry
+ *
+ * @param int $entry_id The log entry
+ *
+ * @return mixed
+ */
+function get_object_from_log_entry($entry_id) {
+ $entry = get_log_entry($entry_id);
+
+ if ($entry) {
+ $class = $entry->object_class;
+ // surround with try/catch because object could be disabled
+ try {
+ $object = new $class($entry->object_id);
+ } catch (Exception $e) {
+
+ }
+ if ($object) {
+ return $object;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Log a system event related to a specific object.
+ *
+ * This is called by the event system and should not be called directly.
+ *
+ * @param object $object The object you're talking about.
+ * @param string $event The event being logged
+ * @return void
+ */
+function system_log($object, $event) {
+ global $CONFIG;
+ static $log_cache;
+ static $cache_size = 0;
+
+ if ($object instanceof Loggable) {
+
+ /* @var ElggEntity|ElggExtender $object */
+ if (datalist_get('version') < 2012012000) {
+ // this is a site that doesn't have the ip_address column yet
+ return;
+ }
+
+ // reset cache if it has grown too large
+ if (!is_array($log_cache) || $cache_size > 500) {
+ $log_cache = array();
+ $cache_size = 0;
+ }
+
+ // Has loggable interface, extract the necessary information and store
+ $object_id = (int)$object->getSystemLogID();
+ $object_class = $object->getClassName();
+ $object_type = $object->getType();
+ $object_subtype = $object->getSubtype();
+ $event = sanitise_string($event);
+ $time = time();
+
+ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+ $ip_address = array_pop(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
+ } elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) {
+ $ip_address = array_pop(explode(',', $_SERVER['HTTP_X_REAL_IP']));
+ } else {
+ $ip_address = $_SERVER['REMOTE_ADDR'];
+ }
+ $ip_address = sanitise_string($ip_address);
+
+ $performed_by = elgg_get_logged_in_user_guid();
+
+ if (isset($object->access_id)) {
+ $access_id = $object->access_id;
+ } else {
+ $access_id = ACCESS_PUBLIC;
+ }
+ if (isset($object->enabled)) {
+ $enabled = $object->enabled;
+ } else {
+ $enabled = 'yes';
+ }
+
+ if (isset($object->owner_guid)) {
+ $owner_guid = $object->owner_guid;
+ } else {
+ $owner_guid = 0;
+ }
+
+ // Create log if we haven't already created it
+ if (!isset($log_cache[$time][$object_id][$event])) {
+ $query = "INSERT DELAYED into {$CONFIG->dbprefix}system_log
+ (object_id, object_class, object_type, object_subtype, event,
+ performed_by_guid, owner_guid, access_id, enabled, time_created, ip_address)
+ VALUES
+ ('$object_id','$object_class','$object_type', '$object_subtype', '$event',
+ $performed_by, $owner_guid, $access_id, '$enabled', '$time', '$ip_address')";
+
+ insert_data($query);
+
+ $log_cache[$time][$object_id][$event] = true;
+ $cache_size += 1;
+ }
+ }
+}
+
+/**
+ * This function creates an archive copy of the system log.
+ *
+ * @param int $offset An offset in seconds from now to archive (useful for log rotation)
+ *
+ * @return bool
+ */
+function archive_log($offset = 0) {
+ global $CONFIG;
+
+ $offset = (int)$offset;
+ $now = time(); // Take a snapshot of now
+
+ $ts = $now - $offset;
+
+ // create table
+ $query = "CREATE TABLE {$CONFIG->dbprefix}system_log_$now as
+ SELECT * from {$CONFIG->dbprefix}system_log WHERE time_created<$ts";
+
+ if (!update_data($query)) {
+ return false;
+ }
+
+ // delete
+ // Don't delete on time since we are running in a concurrent environment
+ if (delete_data("DELETE from {$CONFIG->dbprefix}system_log WHERE time_created<$ts") === false) {
+ return false;
+ }
+
+ // alter table to engine
+ if (!update_data("ALTER TABLE {$CONFIG->dbprefix}system_log_$now engine=archive")) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Default system log handler, allows plugins to override, extend or disable logging.
+ *
+ * @param string $event Event name
+ * @param string $object_type Object type
+ * @param Loggable $object Object to log
+ *
+ * @return true
+ */
+function system_log_default_logger($event, $object_type, $object) {
+ system_log($object['object'], $object['event']);
+
+ return true;
+}
+
+/**
+ * System log listener.
+ * This function listens to all events in the system and logs anything appropriate.
+ *
+ * @param String $event Event name
+ * @param String $object_type Type of object
+ * @param Loggable $object Object to log
+ *
+ * @return true
+ * @access private
+ */
+function system_log_listener($event, $object_type, $object) {
+ if (($object_type != 'systemlog') && ($event != 'log')) {
+ elgg_trigger_event('log', 'systemlog', array('object' => $object, 'event' => $event));
+ }
+
+ return true;
+}
+
+/** Register event to listen to all events **/
+elgg_register_event_handler('all', 'all', 'system_log_listener', 400);
+
+/** Register a default system log handler */
+elgg_register_event_handler('log', 'systemlog', 'system_log_default_logger', 999);
diff --git a/engine/lib/tags.php b/engine/lib/tags.php
new file mode 100644
index 000000000..586a9b9e4
--- /dev/null
+++ b/engine/lib/tags.php
@@ -0,0 +1,354 @@
+<?php
+/**
+ * Elgg tags
+ * Functions for managing tags and tag clouds.
+ *
+ * @package Elgg.Core
+ * @subpackage Tags
+ */
+
+/**
+ * The algorithm working out the size of font based on the number of tags.
+ * This is quick and dirty.
+ *
+ * @param int $min Min size
+ * @param int $max Max size
+ * @param int $number_of_tags The number of tags
+ * @param int $buckets The number of buckets
+ *
+ * @return int
+ * @access private
+ */
+function calculate_tag_size($min, $max, $number_of_tags, $buckets = 6) {
+ $delta = (($max - $min) / $buckets);
+ $thresholds = array();
+
+ for ($n = 1; $n <= $buckets; $n++) {
+ $thresholds[$n - 1] = ($min + $n) * $delta;
+ }
+
+ // Correction
+ if ($thresholds[$buckets - 1] > $max) {
+ $thresholds[$buckets - 1] = $max;
+ }
+
+ $size = 0;
+ for ($n = 0; $n < count($thresholds); $n++) {
+ if ($number_of_tags >= $thresholds[$n]) {
+ $size = $n;
+ }
+ }
+
+ return $size;
+}
+
+/**
+ * This function generates an array of tags with a weighting.
+ *
+ * @param array $tags The array of tags.
+ * @param int $buckets The number of buckets
+ *
+ * @return array An associated array of tags with a weighting, this can then be mapped to a display class.
+ * @access private
+ */
+function generate_tag_cloud(array $tags, $buckets = 6) {
+ $cloud = array();
+
+ $min = 65535;
+ $max = 0;
+
+ foreach ($tags as $tag) {
+ $cloud[$tag]++;
+
+ if ($cloud[$tag] > $max) {
+ $max = $cloud[$tag];
+ }
+
+ if ($cloud[$tag] < $min) {
+ $min = $cloud[$tag];
+ }
+ }
+
+ foreach ($cloud as $k => $v) {
+ $cloud[$k] = calculate_tag_size($min, $max, $v, $buckets);
+ }
+
+ return $cloud;
+}
+
+/**
+ * Get popular tags and their frequencies
+ *
+ * Supports similar arguments as elgg_get_entities()
+ *
+ * @param array $options Array in format:
+ *
+ * threshold => INT minimum tag count
+ *
+ * tag_names => array() metadata tag names - must be registered tags
+ *
+ * limit => INT number of tags to return
+ *
+ * types => NULL|STR entity type (SQL: type = '$type')
+ *
+ * subtypes => NULL|STR entity subtype (SQL: subtype = '$subtype')
+ *
+ * type_subtype_pairs => NULL|ARR (array('type' => 'subtype'))
+ * (SQL: type = '$type' AND subtype = '$subtype') pairs
+ *
+ * owner_guids => NULL|INT entity guid
+ *
+ * container_guids => NULL|INT container_guid
+ *
+ * site_guids => NULL (current_site)|INT site_guid
+ *
+ * created_time_lower => NULL|INT Created time lower boundary in epoch time
+ *
+ * created_time_upper => NULL|INT Created time upper boundary in epoch time
+ *
+ * modified_time_lower => NULL|INT Modified time lower boundary in epoch time
+ *
+ * modified_time_upper => NULL|INT Modified time upper boundary in epoch time
+ *
+ * wheres => array() Additional where clauses to AND together
+ *
+ * joins => array() Additional joins
+ *
+ * @return object[]|false If no tags or error, false
+ * otherwise, array of objects with ->tag and ->total values
+ * @since 1.7.1
+ */
+function elgg_get_tags(array $options = array()) {
+ global $CONFIG;
+
+ $defaults = array(
+ 'threshold' => 1,
+ 'tag_names' => array(),
+ 'limit' => 10,
+
+ 'types' => ELGG_ENTITIES_ANY_VALUE,
+ 'subtypes' => ELGG_ENTITIES_ANY_VALUE,
+ 'type_subtype_pairs' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'owner_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'container_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'site_guids' => $CONFIG->site_guid,
+
+ 'modified_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'modified_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_lower' => ELGG_ENTITIES_ANY_VALUE,
+ 'created_time_upper' => ELGG_ENTITIES_ANY_VALUE,
+
+ 'joins' => array(),
+ 'wheres' => array(),
+ );
+
+
+ $options = array_merge($defaults, $options);
+
+ $singulars = array('type', 'subtype', 'owner_guid', 'container_guid', 'site_guid', 'tag_name');
+ $options = elgg_normalise_plural_options_array($options, $singulars);
+
+ $registered_tags = elgg_get_registered_tag_metadata_names();
+
+ if (!is_array($options['tag_names'])) {
+ return false;
+ }
+
+ // empty array so use all registered tag names
+ if (count($options['tag_names']) == 0) {
+ $options['tag_names'] = $registered_tags;
+ }
+
+ $diff = array_diff($options['tag_names'], $registered_tags);
+ if (count($diff) > 0) {
+ elgg_deprecated_notice('Tag metadata names must be registered by elgg_register_tag_metadata_name()', 1.7);
+ // return false;
+ }
+
+
+ $wheres = $options['wheres'];
+
+ // catch for tags that were spaces
+ $wheres[] = "msv.string != ''";
+
+ $sanitised_tags = array();
+ foreach ($options['tag_names'] as $tag) {
+ $sanitised_tags[] = '"' . sanitise_string($tag) . '"';
+ }
+ $tags_in = implode(',', $sanitised_tags);
+ $wheres[] = "(msn.string IN ($tags_in))";
+
+ $wheres[] = elgg_get_entity_type_subtype_where_sql('e', $options['types'],
+ $options['subtypes'], $options['type_subtype_pairs']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.site_guid', $options['site_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.owner_guid', $options['owner_guids']);
+ $wheres[] = elgg_get_guid_based_where_sql('e.container_guid', $options['container_guids']);
+ $wheres[] = elgg_get_entity_time_where_sql('e', $options['created_time_upper'],
+ $options['created_time_lower'], $options['modified_time_upper'], $options['modified_time_lower']);
+
+ // see if any functions failed
+ // remove empty strings on successful functions
+ foreach ($wheres as $i => $where) {
+ if ($where === FALSE) {
+ return FALSE;
+ } elseif (empty($where)) {
+ unset($wheres[$i]);
+ }
+ }
+
+ // remove identical where clauses
+ $wheres = array_unique($wheres);
+
+ $joins = $options['joins'];
+
+ $joins[] = "JOIN {$CONFIG->dbprefix}metadata md on md.entity_guid = e.guid";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings msv on msv.id = md.value_id";
+ $joins[] = "JOIN {$CONFIG->dbprefix}metastrings msn on md.name_id = msn.id";
+
+ // remove identical join clauses
+ $joins = array_unique($joins);
+
+ foreach ($joins as $i => $join) {
+ if ($join === FALSE) {
+ return FALSE;
+ } elseif (empty($join)) {
+ unset($joins[$i]);
+ }
+ }
+
+
+ $query = "SELECT msv.string as tag, count(msv.id) as total ";
+ $query .= "FROM {$CONFIG->dbprefix}entities e ";
+
+ // add joins
+ foreach ($joins as $j) {
+ $query .= " $j ";
+ }
+
+ // add wheres
+ $query .= ' WHERE ';
+
+ foreach ($wheres as $w) {
+ $query .= " $w AND ";
+ }
+
+ // Add access controls
+ $query .= get_access_sql_suffix('e');
+
+ $threshold = sanitise_int($options['threshold']);
+ $query .= " GROUP BY msv.string HAVING total >= {$threshold} ";
+ $query .= " ORDER BY total DESC ";
+
+ $limit = sanitise_int($options['limit']);
+ $query .= " LIMIT {$limit} ";
+
+ return get_data($query);
+}
+
+/**
+ * Returns viewable tagcloud
+ *
+ * @see elgg_get_tags
+ *
+ * @param array $options Any elgg_get_tags() options except:
+ *
+ * type => must be single entity type
+ *
+ * subtype => must be single entity subtype
+ *
+ * @return string
+ * @since 1.7.1
+ */
+function elgg_view_tagcloud(array $options = array()) {
+
+ $type = $subtype = '';
+ if (isset($options['type'])) {
+ $type = $options['type'];
+ }
+ if (isset($options['subtype'])) {
+ $subtype = $options['subtype'];
+ }
+
+ $tag_data = elgg_get_tags($options);
+ return elgg_view("output/tagcloud", array(
+ 'value' => $tag_data,
+ 'type' => $type,
+ 'subtype' => $subtype,
+ ));
+}
+
+/**
+ * Registers a metadata name as containing tags for an entity.
+ * This is required if you are using a non-standard metadata name
+ * for your tags.
+ *
+ * @param string $name Tag name
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function elgg_register_tag_metadata_name($name) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->registered_tag_metadata_names)) {
+ $CONFIG->registered_tag_metadata_names = array();
+ }
+
+ if (!in_array($name, $CONFIG->registered_tag_metadata_names)) {
+ $CONFIG->registered_tag_metadata_names[] = $name;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Returns an array of valid metadata names for tags.
+ *
+ * @return array
+ * @since 1.7.0
+ */
+function elgg_get_registered_tag_metadata_names() {
+ global $CONFIG;
+
+ $names = (isset($CONFIG->registered_tag_metadata_names))
+ ? $CONFIG->registered_tag_metadata_names : array();
+
+ return $names;
+}
+
+/**
+ * Page hander for tags
+ *
+ * @param array $page Page array
+ *
+ * @return bool
+ * @access private
+ */
+function elgg_tagcloud_page_handler($page) {
+
+ $title = elgg_view_title(elgg_echo('tags:site_cloud'));
+ $options = array(
+ 'threshold' => 0,
+ 'limit' => 100,
+ 'tag_name' => 'tags',
+ );
+ $tags = elgg_view_tagcloud($options);
+ $content = $title . $tags;
+ $body = elgg_view_layout('one_sidebar', array('content' => $content));
+
+ echo elgg_view_page(elgg_echo('tags:site_cloud'), $body);
+ return true;
+}
+
+/**
+ * @access private
+ */
+function elgg_tags_init() {
+ // register the standard tags metadata name
+ elgg_register_tag_metadata_name('tags');
+
+ elgg_register_page_handler('tags', 'elgg_tagcloud_page_handler');
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_tags_init'); \ No newline at end of file
diff --git a/engine/lib/upgrade.php b/engine/lib/upgrade.php
new file mode 100644
index 000000000..158ec9ec1
--- /dev/null
+++ b/engine/lib/upgrade.php
@@ -0,0 +1,365 @@
+<?php
+/**
+ * Elgg upgrade library.
+ * Contains code for handling versioning and upgrades.
+ *
+ * @package Elgg.Core
+ * @subpackage Upgrade
+ */
+
+/**
+ * Run any php upgrade scripts which are required
+ *
+ * @param int $version Version upgrading from.
+ * @param bool $quiet Suppress errors. Don't use this.
+ *
+ * @return bool
+ * @access private
+ */
+function upgrade_code($version, $quiet = FALSE) {
+ // do not remove - upgrade scripts depend on this
+ global $CONFIG;
+
+ $version = (int) $version;
+ $upgrade_path = elgg_get_config('path') . 'engine/lib/upgrades/';
+ $processed_upgrades = elgg_get_processed_upgrades();
+
+ // upgrading from 1.7 to 1.8. Need to bootstrap.
+ if (!$processed_upgrades) {
+ elgg_upgrade_bootstrap_17_to_18();
+
+ // grab accurate processed upgrades
+ $processed_upgrades = elgg_get_processed_upgrades();
+ }
+
+ $upgrade_files = elgg_get_upgrade_files($upgrade_path);
+
+ if ($upgrade_files === false) {
+ return false;
+ }
+
+ $upgrades = elgg_get_unprocessed_upgrades($upgrade_files, $processed_upgrades);
+
+ // Sort and execute
+ sort($upgrades);
+
+ foreach ($upgrades as $upgrade) {
+ $upgrade_version = elgg_get_upgrade_file_version($upgrade);
+ $success = true;
+
+ // hide all errors.
+ if ($quiet) {
+ // hide include errors as well as any exceptions that might happen
+ try {
+ if (!@include("$upgrade_path/$upgrade")) {
+ $success = false;
+ error_log("Could not include $upgrade_path/$upgrade");
+ }
+ } catch (Exception $e) {
+ $success = false;
+ error_log($e->getmessage());
+ }
+ } else {
+ if (!include("$upgrade_path/$upgrade")) {
+ $success = false;
+ error_log("Could not include $upgrade_path/$upgrade");
+ }
+ }
+
+ if ($success) {
+ // incrementally set upgrade so we know where to start if something fails.
+ $processed_upgrades[] = $upgrade;
+
+ // don't set the version to a lower number in instances where an upgrade
+ // has been merged from a lower version of Elgg
+ if ($upgrade_version > $version) {
+ datalist_set('version', $upgrade_version);
+ }
+
+ elgg_set_processed_upgrades($processed_upgrades);
+ } else {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Saves the processed upgrades to a dataset.
+ *
+ * @param array $processed_upgrades An array of processed upgrade filenames
+ * (not the path, just the file)
+ * @return bool
+ * @access private
+ */
+function elgg_set_processed_upgrades(array $processed_upgrades) {
+ $processed_upgrades = array_unique($processed_upgrades);
+ return datalist_set('processed_upgrades', serialize($processed_upgrades));
+}
+
+/**
+ * Gets a list of processes upgrades
+ *
+ * @return mixed Array of processed upgrade filenames or false
+ * @access private
+ */
+function elgg_get_processed_upgrades() {
+ $upgrades = datalist_get('processed_upgrades');
+ $unserialized = unserialize($upgrades);
+ return $unserialized;
+}
+
+/**
+ * Returns the version of the upgrade filename.
+ *
+ * @param string $filename The upgrade filename. No full path.
+ * @return int|false
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_get_upgrade_file_version($filename) {
+ preg_match('/^([0-9]{10})([\.a-z0-9-_]+)?\.(php)$/i', $filename, $matches);
+
+ if (isset($matches[1])) {
+ return (int) $matches[1];
+ }
+
+ return false;
+}
+
+/**
+ * Returns a list of upgrade files relative to the $upgrade_path dir.
+ *
+ * @param string $upgrade_path The up
+ * @return array|false
+ * @access private
+ */
+function elgg_get_upgrade_files($upgrade_path = null) {
+ if (!$upgrade_path) {
+ $upgrade_path = elgg_get_config('path') . 'engine/lib/upgrades/';
+ }
+ $upgrade_path = sanitise_filepath($upgrade_path);
+ $handle = opendir($upgrade_path);
+
+ if (!$handle) {
+ return false;
+ }
+
+ $upgrade_files = array();
+
+ while ($upgrade_file = readdir($handle)) {
+ // make sure this is a wellformed upgrade.
+ if (is_dir($upgrade_path . '$upgrade_file')) {
+ continue;
+ }
+ $upgrade_version = elgg_get_upgrade_file_version($upgrade_file);
+ if (!$upgrade_version) {
+ continue;
+ }
+ $upgrade_files[] = $upgrade_file;
+ }
+
+ sort($upgrade_files);
+
+ return $upgrade_files;
+}
+
+/**
+ * Get the current Elgg version information
+ *
+ * @param bool $humanreadable Whether to return a human readable version (default: false)
+ *
+ * @return string|false Depending on success
+ */
+function get_version($humanreadable = false) {
+ global $CONFIG;
+
+ static $version, $release;
+
+ if (isset($CONFIG->path)) {
+ if (!isset($version) || !isset($release)) {
+ if (!include($CONFIG->path . "version.php")) {
+ return false;
+ }
+ }
+ return (!$humanreadable) ? $version : $release;
+ }
+
+ return false;
+}
+
+/**
+ * Checks if any upgrades need to be run.
+ *
+ * @param null|array $upgrade_files Optional upgrade files
+ * @param null|array $processed_upgrades Optional processed upgrades
+ *
+ * @return array
+ * @access private
+ */
+function elgg_get_unprocessed_upgrades($upgrade_files = null, $processed_upgrades = null) {
+ if ($upgrade_files === null) {
+ $upgrade_files = elgg_get_upgrade_files();
+ }
+
+ if ($processed_upgrades === null) {
+ $processed_upgrades = unserialize(datalist_get('processed_upgrades'));
+ if (!is_array($processed_upgrades)) {
+ $processed_upgrades = array();
+ }
+ }
+
+ $unprocessed = array_diff($upgrade_files, $processed_upgrades);
+ return $unprocessed;
+}
+
+/**
+ * Determines whether or not the database needs to be upgraded.
+ *
+ * @return bool Depending on whether or not the db version matches the code version
+ * @access private
+ */
+function version_upgrade_check() {
+ $dbversion = (int) datalist_get('version');
+ $version = get_version();
+
+ if ($version > $dbversion) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Upgrades Elgg Database and code
+ *
+ * @return bool
+ * @access private
+ */
+function version_upgrade() {
+ // It's possible large upgrades could exceed the max execution time.
+ set_time_limit(0);
+
+ $dbversion = (int) datalist_get('version');
+
+ // No version number? Oh snap...this is an upgrade from a clean installation < 1.7.
+ // Run all upgrades without error reporting and hope for the best.
+ // See https://github.com/elgg/elgg/issues/1432 for more.
+ $quiet = !$dbversion;
+
+ // Note: Database upgrades are deprecated as of 1.8. Use code upgrades. See #1433
+ if (db_upgrade($dbversion, '', $quiet)) {
+ system_message(elgg_echo('upgrade:db'));
+ }
+
+ if (upgrade_code($dbversion, $quiet)) {
+ system_message(elgg_echo('upgrade:core'));
+
+ // Now we trigger an event to give the option for plugins to do something
+ $upgrade_details = new stdClass;
+ $upgrade_details->from = $dbversion;
+ $upgrade_details->to = get_version();
+
+ elgg_trigger_event('upgrade', 'upgrade', $upgrade_details);
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Boot straps into 1.8 upgrade system from 1.7
+ *
+ * This runs all the 1.7 upgrades, then sets the processed_upgrades to all existing 1.7 upgrades.
+ * Control is then passed back to the main upgrade function which detects and runs the
+ * 1.8 upgrades, regardless of filename convention.
+ *
+ * @return bool
+ * @access private
+ */
+function elgg_upgrade_bootstrap_17_to_18() {
+ $db_version = (int) datalist_get('version');
+
+ // the 1.8 upgrades before the upgrade system change that are interspersed with 1.7 upgrades.
+ $upgrades_18 = array(
+ '2010111501.php',
+ '2010121601.php',
+ '2010121602.php',
+ '2010121701.php',
+ '2010123101.php',
+ '2011010101.php',
+ );
+
+ $upgrade_files = elgg_get_upgrade_files();
+ $processed_upgrades = array();
+
+ foreach ($upgrade_files as $upgrade_file) {
+ // ignore if not in 1.7 format or if it's a 1.8 upgrade
+ if (in_array($upgrade_file, $upgrades_18) || !preg_match("/[0-9]{10}\.php/", $upgrade_file)) {
+ continue;
+ }
+
+ $upgrade_version = elgg_get_upgrade_file_version($upgrade_file);
+
+ // this has already been run in a previous 1.7.X -> 1.7.X upgrade
+ if ($upgrade_version < $db_version) {
+ $processed_upgrades[] = $upgrade_file;
+ }
+ }
+
+ return elgg_set_processed_upgrades($processed_upgrades);
+}
+
+/**
+ * Creates a table {prefix}upgrade_lock that is used as a mutex for upgrades.
+ *
+ * @see _elgg_upgrade_lock()
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_upgrade_lock() {
+ global $CONFIG;
+
+ if (!_elgg_upgrade_is_locked()) {
+ // lock it
+ insert_data("create table {$CONFIG->dbprefix}upgrade_lock (id INT)");
+ elgg_log('Locked for upgrade.', 'NOTICE');
+ return true;
+ }
+
+ elgg_log('Cannot lock for upgrade: already locked.', 'WARNING');
+ return false;
+}
+
+/**
+ * Unlocks upgrade.
+ *
+ * @see _elgg_upgrade_lock()
+ *
+ * @access private
+ */
+function _elgg_upgrade_unlock() {
+ global $CONFIG;
+ delete_data("drop table {$CONFIG->dbprefix}upgrade_lock");
+ elgg_log('Upgrade unlocked.', 'NOTICE');
+}
+
+/**
+ * Checks if upgrade is locked
+ *
+ * @return bool
+ * @access private
+ */
+function _elgg_upgrade_is_locked() {
+ global $CONFIG;
+
+ $is_locked = count(get_data("show tables like '{$CONFIG->dbprefix}upgrade_lock'"));
+
+ // @todo why?
+ _elgg_invalidate_query_cache();
+
+ return $is_locked;
+}
diff --git a/engine/lib/upgrades/2008100701.php b/engine/lib/upgrades/2008100701.php
new file mode 100644
index 000000000..b8d4dfdbc
--- /dev/null
+++ b/engine/lib/upgrades/2008100701.php
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * Because Elgg now has a plugable account activation process we need to activate
+ * the email account activation plugin for existing installs.
+ */
+enable_plugin('uservalidationbyemail', $CONFIG->site->guid);
diff --git a/engine/lib/upgrades/2008101303.php b/engine/lib/upgrades/2008101303.php
new file mode 100644
index 000000000..69e44e3a0
--- /dev/null
+++ b/engine/lib/upgrades/2008101303.php
@@ -0,0 +1,9 @@
+<?php
+
+// Upgrade to solve login issue
+
+if ($users = get_entities_from_metadata('validated_email', '', 'user', '', 0, 9999)) {
+ foreach ($users as $user) {
+ set_user_validation_status($user->guid, true, 'email');
+ }
+}
diff --git a/engine/lib/upgrades/2009022701.php b/engine/lib/upgrades/2009022701.php
new file mode 100644
index 000000000..54083a34d
--- /dev/null
+++ b/engine/lib/upgrades/2009022701.php
@@ -0,0 +1,7 @@
+<?php
+global $CONFIG;
+
+/**
+ * Disable update client since this has now been removed.
+ */
+disable_plugin('updateclient', $CONFIG->site->guid);
diff --git a/engine/lib/upgrades/2009041701.php b/engine/lib/upgrades/2009041701.php
new file mode 100644
index 000000000..7b31a3bc9
--- /dev/null
+++ b/engine/lib/upgrades/2009041701.php
@@ -0,0 +1,8 @@
+<?php
+
+global $CONFIG;
+
+/**
+ * Elgg now has kses tag filtering built as a plugin. This needs to be enabled.
+ */
+enable_plugin('kses', $CONFIG->site->guid);
diff --git a/engine/lib/upgrades/2009070101.php b/engine/lib/upgrades/2009070101.php
new file mode 100644
index 000000000..d0eae9b91
--- /dev/null
+++ b/engine/lib/upgrades/2009070101.php
@@ -0,0 +1,9 @@
+<?php
+
+global $CONFIG;
+
+/**
+ * Kses appears to be a dead project so we are deprecating it in favour of htmlawed.
+ */
+disable_plugin('kses', $CONFIG->site->guid);
+enable_plugin('htmlawed', $CONFIG->site->guid);
diff --git a/engine/lib/upgrades/2009102801.php b/engine/lib/upgrades/2009102801.php
new file mode 100644
index 000000000..3ad113fb2
--- /dev/null
+++ b/engine/lib/upgrades/2009102801.php
@@ -0,0 +1,222 @@
+<?php
+
+/**
+ * Move user's data directories from using username to registration date
+ */
+
+/**
+ * Generates a file matrix like Elgg 1.0 did
+ *
+ * @param string $username Username of user
+ *
+ * @return string File matrix path
+ */
+function file_matrix_1_0($username) {
+ $matrix = "";
+
+ $len = strlen($username);
+ if ($len > 5) {
+ $len = 5;
+ }
+
+ for ($n = 0; $n < $len; $n++) {
+ if (ctype_alnum($username[$n])) {
+ $matrix .= $username[$n] . "/";
+ }
+ }
+
+ return $matrix . $username . "/";
+}
+
+
+/**
+ * Generate a file matrix like Elgg 1.1, 1.2 and 1.5
+ *
+ * @param string $filename The filename
+ *
+ * @return string
+ */
+function file_matrix_1_1($filename) {
+ $matrix = "";
+
+ $name = $filename;
+ $filename = mb_str_split($filename);
+ if (!$filename) {
+ return false;
+ }
+
+ $len = count($filename);
+ if ($len > 5) {
+ $len = 5;
+ }
+
+ for ($n = 0; $n < $len; $n++) {
+ $matrix .= $filename[$n] . "/";
+ }
+
+ return $matrix . $name . "/";
+}
+
+/**
+ * Handle splitting multibyte strings
+ *
+ * @param string $string String to split.
+ * @param string $charset Charset to use.
+ *
+ * @return array|false
+ */
+function mb_str_split($string, $charset = 'UTF8') {
+ if (is_callable('mb_substr')) {
+ $length = mb_strlen($string);
+ $array = array();
+
+ while ($length) {
+ $array[] = mb_substr($string, 0, 1, $charset);
+ $string = mb_substr($string, 1, $length, $charset);
+
+ $length = mb_strlen($string);
+ }
+
+ return $array;
+ } else {
+ return str_split($string);
+ }
+
+ return false;
+}
+
+
+/**
+ * 1.6 style file matrix
+ *
+ * @param string $filename The filename
+ *
+ * @return string
+ */
+function file_matrix_1_6($filename) {
+ $invalid_fs_chars = '*\'\\/"!$%^&*.%(){}[]#~?<>;|¬`@-+=';
+
+ $matrix = "";
+
+ $name = $filename;
+ $filename = mb_str_split($filename);
+ if (!$filename) {
+ return false;
+ }
+
+ $len = count($filename);
+ if ($len > 5) {
+ $len = 5;
+ }
+
+ for ($n = 0; $n < $len; $n++) {
+
+ // Prevent a matrix being formed with unsafe characters
+ $char = $filename[$n];
+ if (strpos($invalid_fs_chars, $char) !== false) {
+ $char = '_';
+ }
+
+ $matrix .= $char . "/";
+ }
+
+ return $matrix . $name . "/";
+}
+
+
+/**
+ * Scans a directory and moves any files from $from to $to
+ * preserving structure and handling existing paths.
+ * Will no overwrite files in $to.
+ *
+ * TRAILING SLASHES REQUIRED.
+ *
+ * @param string $from From dir.
+ * @param string $to To dir.
+ * @param bool $move True to move, false to copy.
+ * @param string $preference to|from If file collisions, which dir has preference.
+ *
+ * @return bool
+ */
+function merge_directories($from, $to, $move = false, $preference = 'to') {
+ if (!$entries = scandir($from)) {
+ return false;
+ }
+
+ // character filtering needs to be elsewhere.
+ if (!is_dir($to)) {
+ mkdir($to, 0700, true);
+ }
+
+ if ($move === true) {
+ $f = 'rename';
+ } else {
+ $f = 'copy';
+ }
+
+ foreach ($entries as $entry) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+
+ $from_path = $from . $entry;
+ $to_path = $to . $entry;
+
+ // check to see if the path exists and is a dir, if so, recurse.
+ if (is_dir($from_path) && is_dir($to_path)) {
+ $from_path .= '/';
+ $to_path .= '/';
+ merge_directories($from_path, $to_path, $move, $preference);
+
+ // since it's a dir that already exists we don't need to move it
+ continue;
+ }
+
+ // only move if target doesn't exist or if preference is for the from dir
+ if (!file_exists($to_path) || $preference == 'from') {
+
+ if ($f($from_path, $to_path)) {
+ //elgg_dump("Moved/Copied $from_path to $to_path");
+ }
+ } else {
+ //elgg_dump("Ignoring $from_path -> $to_path");
+ }
+ }
+}
+
+/**
+ * Create a 1.7 style user file matrix based upon date.
+ *
+ * @param int $guid Guid of owner
+ *
+ * @return string File matrix path
+ */
+function user_file_matrix($guid) {
+ // lookup the entity
+ $user = get_entity($guid);
+ if ($user->type != 'user') {
+ // only to be used for user directories
+ return FALSE;
+ }
+
+ $time_created = date('Y/m/d', $user->time_created);
+ return "$time_created/$user->guid/";
+}
+
+global $ENTITY_CACHE, $CONFIG;
+/**
+ * Upgrade file locations
+ */
+$users = mysql_query("SELECT guid, username
+ FROM {$CONFIG->dbprefix}users_entity WHERE username != ''");
+while ($user = mysql_fetch_object($users)) {
+ $ENTITY_CACHE = array();
+ _elgg_invalidate_query_cache();
+
+ $to = $CONFIG->dataroot . user_file_matrix($user->guid);
+ foreach (array('1_0', '1_1', '1_6') as $version) {
+ $function = "file_matrix_$version";
+ $from = $CONFIG->dataroot . $function($user->username);
+ merge_directories($from, $to, $move = TRUE, $preference = 'from');
+ }
+}
diff --git a/engine/lib/upgrades/2010010501.php b/engine/lib/upgrades/2010010501.php
new file mode 100644
index 000000000..1e83caa55
--- /dev/null
+++ b/engine/lib/upgrades/2010010501.php
@@ -0,0 +1,8 @@
+<?php
+
+global $CONFIG;
+
+/**
+ * Enable the search plugin
+ */
+enable_plugin('search', $CONFIG->site->guid);
diff --git a/engine/lib/upgrades/2010033101.php b/engine/lib/upgrades/2010033101.php
new file mode 100644
index 000000000..4779295fd
--- /dev/null
+++ b/engine/lib/upgrades/2010033101.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Conditional upgrade for UTF8 as described in https://github.com/elgg/elgg/issues/1928
+ */
+
+// get_version() returns the code version.
+// we want the DB version.
+$dbversion = (int) datalist_get('version');
+
+// 2009100701 was the utf8 upgrade for 1.7.
+// if we've already upgraded, don't try again.
+if ($dbversion < 2009100701) {
+ // if the default client connection is utf8 there is no reason
+ // to run this upgrade because the strings are already stored correctly.
+
+ // start a new link to the DB to see what its defaults are.
+ $link = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, TRUE);
+ mysql_select_db($CONFIG->dbname, $link);
+
+ $q = "SHOW VARIABLES LIKE 'character_set_client'";
+ $r = mysql_query($q);
+ $client = mysql_fetch_assoc($r);
+
+ $q = "SHOW VARIABLES LIKE 'character_set_connection'";
+ $r = mysql_query($q);
+ $connection = mysql_fetch_assoc($r);
+
+ // only run upgrade if not already talking utf8.
+ if ($client['Value'] != 'utf8' && $connection['Value'] != 'utf8') {
+ $qs = array();
+ $qs[] = "SET NAMES utf8";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}metastrings DISABLE KEYS";
+ $qs[] = "REPLACE INTO {$CONFIG->dbprefix}metastrings (id, string)
+ SELECT id, unhex(hex(convert(string using latin1)))
+ FROM {$CONFIG->dbprefix}metastrings";
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}metastrings ENABLE KEYS";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}groups_entity DISABLE KEYS";
+ $qs[] = "REPLACE INTO {$CONFIG->dbprefix}groups_entity (guid, name, description)
+ SELECT guid, unhex(hex(convert(name using latin1))),
+ unhex(hex(convert(description using latin1)))
+ FROM {$CONFIG->dbprefix}groups_entity";
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}groups_entity ENABLE KEYS";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}objects_entity DISABLE KEYS";
+ $qs[] = "REPLACE INTO {$CONFIG->dbprefix}objects_entity (guid, title, description)
+ SELECT guid, unhex(hex(convert(title using latin1))),
+ unhex(hex(convert(description using latin1)))
+ FROM {$CONFIG->dbprefix}objects_entity";
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}objects_entity ENABLE KEYS";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity DISABLE KEYS";
+ $qs[] = "REPLACE INTO {$CONFIG->dbprefix}users_entity
+ (guid, name, username, password, salt, email, language, code,
+ banned, last_action, prev_last_action, last_login, prev_last_login)
+ SELECT guid, unhex(hex(convert(name using latin1))),
+ username, password, salt, email, language, code,
+ banned, last_action, prev_last_action, last_login, prev_last_login
+ FROM {$CONFIG->dbprefix}users_entity";
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity ENABLE KEYS";
+
+ foreach ($qs as $q) {
+ if (!update_data($q)) {
+ throw new Exception('Couldn\'t execute upgrade query: ' . $q);
+ }
+ }
+ }
+}
diff --git a/engine/lib/upgrades/2010040201.php b/engine/lib/upgrades/2010040201.php
new file mode 100644
index 000000000..789bf5dfc
--- /dev/null
+++ b/engine/lib/upgrades/2010040201.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Pull admin metadata setting into users_entity table column
+ */
+
+$siteadmin = get_metastring_id('siteadmin');
+$admin = get_metastring_id('admin');
+$yes = get_metastring_id('yes');
+$one = get_metastring_id('1');
+
+$qs = array();
+
+$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity DISABLE KEYS";
+
+$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity
+ ADD admin ENUM('yes', 'no') NOT NULL DEFAULT 'no' AFTER `banned`";
+
+$qs[] = "UPDATE {$CONFIG->dbprefix}users_entity SET admin = 'yes' where guid IN (select x.guid FROM(
+SELECT * FROM {$CONFIG->dbprefix}users_entity as e,
+ {$CONFIG->dbprefix}metadata as md
+ WHERE (
+ md.name_id IN ('$admin', '$siteadmin')
+ AND md.value_id IN ('$yes', '$one')
+ AND e.guid = md.entity_guid
+ AND e.banned = 'no'
+ )) as x)";
+
+$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity ADD KEY admin (admin)";
+
+$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity ENABLE KEYS";
+
+$qs[] = "DELETE FROM {$CONFIG->dbprefix}metadata
+ WHERE (
+ name_id IN ('$admin', '$siteadmin')
+ AND value_id IN ('$yes', '$one')
+ )";
+
+foreach ($qs as $q) {
+ update_data($q);
+}
diff --git a/engine/lib/upgrades/2010052601.php b/engine/lib/upgrades/2010052601.php
new file mode 100644
index 000000000..a9cca6dc5
--- /dev/null
+++ b/engine/lib/upgrades/2010052601.php
@@ -0,0 +1,27 @@
+<?php
+
+// Upgrade to fix encoding issues on group data: #1963
+
+elgg_set_ignore_access(TRUE);
+
+$params = array('type' => 'group',
+ 'limit' => 0);
+$groups = elgg_get_entities($params);
+if ($groups) {
+ foreach ($groups as $group) {
+ $group->name = _elgg_html_decode($group->name);
+ $group->description = _elgg_html_decode($group->description);
+ $group->briefdescription = _elgg_html_decode($group->briefdescription);
+ $group->website = _elgg_html_decode($group->website);
+ if ($group->interests) {
+ $tags = $group->interests;
+ foreach ($tags as $index => $tag) {
+ $tags[$index] = _elgg_html_decode($tag);
+ }
+ $group->interests = $tags;
+ }
+
+ $group->save();
+ }
+}
+elgg_set_ignore_access(FALSE);
diff --git a/engine/lib/upgrades/2010060101.php b/engine/lib/upgrades/2010060101.php
new file mode 100644
index 000000000..bb7f7c1a6
--- /dev/null
+++ b/engine/lib/upgrades/2010060101.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Clears old simplecache variables out of database
+ */
+
+$query = "DELETE FROM {$CONFIG->dbprefix}datalists WHERE name LIKE 'simplecache%'";
+
+delete_data($query);
+
+if ($CONFIG->simplecache_enabled) {
+ datalist_set('simplecache_enabled', 1);
+ elgg_regenerate_simplecache();
+} else {
+ datalist_set('simplecache_enabled', 0);
+}
diff --git a/engine/lib/upgrades/2010060401.php b/engine/lib/upgrades/2010060401.php
new file mode 100644
index 000000000..6d628b8eb
--- /dev/null
+++ b/engine/lib/upgrades/2010060401.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Get each user's notify* relationships and confirm that they have a friend
+ * or member relationship depending on type. This fixes the notify relationships
+ * that were not updated to due to #1837
+ */
+
+$count = 0;
+
+$user_guids = mysql_query("SELECT guid FROM {$CONFIG->dbprefix}users_entity");
+while ($user = mysql_fetch_object($user_guids)) {
+
+ $query = "SELECT * FROM {$CONFIG->dbprefix}entity_relationships
+ WHERE guid_one=$user->guid AND relationship LIKE 'notify%'";
+ $relationships = mysql_query($query);
+ if (mysql_num_rows($relationships) == 0) {
+ // no notify relationships for this user
+ continue;
+ }
+
+ while ($obj = mysql_fetch_object($relationships)) {
+ $query = "SELECT type FROM {$CONFIG->dbprefix}entities WHERE guid=$obj->guid_two";
+ $results = mysql_query($query);
+ if (mysql_num_rows($results) == 0) {
+ // entity doesn't exist - shouldn't be possible
+ continue;
+ }
+
+ $entity = mysql_fetch_object($results);
+
+ switch ($entity->type) {
+ case 'user':
+ $relationship_type = 'friend';
+ break;
+ case 'group':
+ $relationship_type = 'member';
+ break;
+ }
+
+ if (isset($relationship_type)) {
+ $query = "SELECT * FROM {$CONFIG->dbprefix}entity_relationships
+ WHERE guid_one=$user->guid AND relationship='$relationship_type'
+ AND guid_two=$obj->guid_two";
+ $results = mysql_query($query);
+
+ if (mysql_num_rows($results) == 0) {
+ $query = "DELETE FROM {$CONFIG->dbprefix}entity_relationships WHERE id=$obj->id";
+ mysql_query($query);
+ $count++;
+ }
+ }
+ }
+
+}
+
+if (is_callable('error_log')) {
+ error_log("Deleted $count notify relationships in upgrade");
+}
diff --git a/engine/lib/upgrades/2010061501.php b/engine/lib/upgrades/2010061501.php
new file mode 100644
index 000000000..744c28fd5
--- /dev/null
+++ b/engine/lib/upgrades/2010061501.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * utf8 database conversion and file merging for usernames with multibyte chars
+ *
+ */
+
+
+// check that we need to do the utf8 conversion
+// C&P logic from 2010033101
+$dbversion = (int) datalist_get('version');
+
+if ($dbversion < 2009100701) {
+ // start a new link to the DB to see what its defaults are.
+ $link = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, TRUE);
+ mysql_select_db($CONFIG->dbname, $link);
+
+ $q = "SHOW VARIABLES LIKE 'character_set_client'";
+ $r = mysql_query($q);
+ $client = mysql_fetch_assoc($r);
+
+ $q = "SHOW VARIABLES LIKE 'character_set_connection'";
+ $r = mysql_query($q);
+ $connection = mysql_fetch_assoc($r);
+
+ // only run upgrade if not already talking utf8
+ if ($client['Value'] != 'utf8' && $connection['Value'] != 'utf8') {
+ $qs = array();
+ $qs[] = "SET NAMES utf8";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity DISABLE KEYS";
+ $qs[] = "REPLACE INTO {$CONFIG->dbprefix}users_entity
+ (guid, name, username, password, salt, email, language, code,
+ banned, admin, last_action, prev_last_action, last_login, prev_last_login)
+
+ SELECT guid, name, unhex(hex(convert(username using latin1))),
+ password, salt, email, language, code,
+ banned, admin, last_action, prev_last_action, last_login, prev_last_login
+ FROM {$CONFIG->dbprefix}users_entity";
+
+ $qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity ENABLE KEYS";
+
+ foreach ($qs as $q) {
+ if (!update_data($q)) {
+ throw new Exception('Couldn\'t execute upgrade query: ' . $q);
+ }
+ }
+
+ global $ENTITY_CACHE;
+
+ /**
+ Upgrade file locations
+ */
+ // new connection to force into utf8 mode to get the old name
+ $link = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, TRUE);
+ mysql_select_db($CONFIG->dbname, $link);
+
+ // must be the first command
+ mysql_query("SET NAMES utf8");
+
+ $users = mysql_query("SELECT guid, username FROM {$CONFIG->dbprefix}users_entity
+ WHERE username != ''", $link);
+ while ($user = mysql_fetch_object($users)) {
+ $ENTITY_CACHE = array();
+ _elgg_invalidate_query_cache();
+
+
+ $to = $CONFIG->dataroot . user_file_matrix($user->guid);
+ foreach (array('1_0', '1_1', '1_6') as $version) {
+ $function = "file_matrix_$version";
+ $from = $CONFIG->dataroot . $function($user->username);
+ merge_directories($from, $to, $move = TRUE, $preference = 'from');
+ }
+ }
+ }
+}
diff --git a/engine/lib/upgrades/2010062301.php b/engine/lib/upgrades/2010062301.php
new file mode 100644
index 000000000..f679fa46d
--- /dev/null
+++ b/engine/lib/upgrades/2010062301.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Change ownership of group ACLs to group entity
+ */
+
+elgg_set_ignore_access(TRUE);
+
+$params = array('type' => 'group',
+ 'limit' => 0);
+$groups = elgg_get_entities($params);
+if ($groups) {
+ foreach ($groups as $group) {
+ $acl = $group->group_acl;
+
+ try {
+ $query = "UPDATE {$CONFIG->dbprefix}access_collections
+ SET owner_guid = $group->guid WHERE id = $acl";
+ update_data($query);
+ } catch (Exception $e) {
+ // no acl so create one
+ $ac_name = elgg_echo('groups:group') . ": " . $group->name;
+ $group_acl = create_access_collection($ac_name, $group->guid);
+ if ($group_acl) {
+ create_metadata($group->guid, 'group_acl', $group_acl, 'integer', $group->owner_guid);
+ $object->group_acl = $group_id;
+ }
+ }
+
+ }
+}
+elgg_set_ignore_access(FALSE);
+
diff --git a/engine/lib/upgrades/2010062302.php b/engine/lib/upgrades/2010062302.php
new file mode 100644
index 000000000..fe33e12ea
--- /dev/null
+++ b/engine/lib/upgrades/2010062302.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Make sure that everyone who belongs to a group is a member of the group's access collection
+ */
+
+
+elgg_set_ignore_access(TRUE);
+
+$params = array('type' => 'group', 'limit' => 0);
+$groups = elgg_get_entities($params);
+if ($groups) {
+ foreach ($groups as $group) {
+ $acl = $group->group_acl;
+
+ $query = "SELECT u.guid FROM {$CONFIG->dbprefix}users_entity u
+ JOIN {$CONFIG->dbprefix}entity_relationships r
+ ON u.guid = r.guid_one AND r.relationship = 'member' AND r.guid_two = $group->guid
+ LEFT JOIN {$CONFIG->dbprefix}access_collection_membership a
+ ON u.guid = a.user_guid AND a.access_collection_id = $acl
+ WHERE a.user_guid IS NULL";
+
+ $results = get_data($query);
+ if ($results != FALSE) {
+ foreach ($results as $user) {
+ $insert = "INSERT INTO {$CONFIG->dbprefix}access_collection_membership
+ (user_guid, access_collection_id) VALUES ($user->guid, $acl)";
+ insert_data($insert);
+ }
+ }
+ }
+}
+elgg_set_ignore_access(FALSE);
diff --git a/engine/lib/upgrades/2010070301.php b/engine/lib/upgrades/2010070301.php
new file mode 100644
index 000000000..af5c80419
--- /dev/null
+++ b/engine/lib/upgrades/2010070301.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * Group join river view has been renamed
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river SET view='river/relationship/member/create'
+ WHERE view='river/group/create' AND action_type='join'";
+update_data($query);
diff --git a/engine/lib/upgrades/2010071001.php b/engine/lib/upgrades/2010071001.php
new file mode 100644
index 000000000..5594493a8
--- /dev/null
+++ b/engine/lib/upgrades/2010071001.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Change profile image names to use guid rather than username
+ */
+
+/**
+ * Need the same function to generate a user matrix, but can't call it
+ * the same thing as the previous update.
+ *
+ * @param int $guid User guid.
+ *
+ * @return string File matrix
+ */
+function user_file_matrix_2010071001($guid) {
+ // lookup the entity
+ $user = get_entity($guid);
+ if ($user->type != 'user') {
+ // only to be used for user directories
+ return FALSE;
+ }
+
+ if (!$user->time_created) {
+ // no idea where this user has its files
+ return FALSE;
+ }
+
+ $time_created = date('Y/m/d', $user->time_created);
+ return "$time_created/$user->guid/";
+}
+
+$sizes = array('large', 'medium', 'small', 'tiny', 'master', 'topbar');
+
+global $ENTITY_CACHE, $CONFIG;
+$users = mysql_query("SELECT guid, username FROM {$CONFIG->dbprefix}users_entity
+ WHERE username != ''");
+while ($user = mysql_fetch_object($users)) {
+ $ENTITY_CACHE = array();
+ _elgg_invalidate_query_cache();
+
+ $user_directory = user_file_matrix_2010071001($user->guid);
+ if (!$user_directory) {
+ continue;
+ }
+ $profile_directory = $CONFIG->dataroot . $user_directory . "profile/";
+ if (!file_exists($profile_directory)) {
+ continue;
+ }
+
+ foreach ($sizes as $size) {
+ $old_filename = "$profile_directory{$user->username}{$size}.jpg";
+ $new_filename = "$profile_directory{$user->guid}{$size}.jpg";
+ if (file_exists($old_filename)) {
+ if (!rename($old_filename, $new_filename)) {
+ error_log("Failed to rename profile photo for $user->username");
+ }
+ }
+ }
+}
diff --git a/engine/lib/upgrades/2010071002.php b/engine/lib/upgrades/2010071002.php
new file mode 100644
index 000000000..52aa15ef5
--- /dev/null
+++ b/engine/lib/upgrades/2010071002.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Update the notifications based on all friends and access collections
+ */
+
+// loop through all users checking collections and notifications
+global $ENTITY_CACHE, $CONFIG;
+global $NOTIFICATION_HANDLERS;
+$users = mysql_query("SELECT guid, username FROM {$CONFIG->dbprefix}users_entity
+ WHERE username != ''");
+while ($user = mysql_fetch_object($users)) {
+ $ENTITY_CACHE = array();
+ _elgg_invalidate_query_cache();
+
+ $user = get_entity($user->guid);
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ $notify = "notify$method";
+ $metaname = "collections_notifications_preferences_$method";
+ $collections_preferences = $user->$metaname;
+ if (!$collections_preferences) {
+ continue;
+ }
+ if (!is_array($collections_preferences)) {
+ $collections_preferences = array($collections_preferences);
+ }
+ foreach ($collections_preferences as $collection_id) {
+ // check the all friends notifications
+ if ($collection_id == -1) {
+ $options = array(
+ 'relationship' => 'friend',
+ 'relationship_guid' => $user->guid,
+ 'limit' => 0
+ );
+ $friends = elgg_get_entities_from_relationship($options);
+ foreach ($friends as $friend) {
+ if (!check_entity_relationship($user->guid, $notify, $friend->guid)) {
+ add_entity_relationship($user->guid, $notify, $friend->guid);
+ }
+ }
+ } else {
+ $members = get_members_of_access_collection($collection_id, TRUE);
+ foreach ($members as $member) {
+ if (!check_entity_relationship($user->guid, $notify, $members)) {
+ add_entity_relationship($user->guid, $notify, $member);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/engine/lib/upgrades/2010111501.php b/engine/lib/upgrades/2010111501.php
new file mode 100644
index 000000000..15e4a7d35
--- /dev/null
+++ b/engine/lib/upgrades/2010111501.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Set validation metadata on unvalidated users to false rather than
+ * not existing. This is needed because of the change in how validation is
+ * being handled.
+ */
+
+// turn off system log because of all the metadata this can create
+elgg_unregister_event_handler('all', 'all', 'system_log_listener');
+elgg_unregister_event_handler('log', 'systemlog', 'system_log_default_logger');
+
+$ia = elgg_set_ignore_access(TRUE);
+$hidden_entities = access_get_show_hidden_status();
+access_show_hidden_entities(TRUE);
+
+$validated_id = get_metastring_id('validated');
+$one_id = get_metastring_id(1);
+
+$query = "SELECT guid FROM {$CONFIG->dbprefix}entities e
+ WHERE e.type = 'user' AND e.enabled = 'no' AND
+ NOT EXISTS (
+ SELECT 1 FROM {$CONFIG->dbprefix}metadata md
+ WHERE md.entity_guid = e.guid
+ AND md.name_id = $validated_id
+ AND md.value_id = $one_id)";
+
+$user_guids = mysql_query($query);
+while ($user_guid = mysql_fetch_object($user_guids)) {
+ create_metadata($user_guid->guid, 'validated', false, '', 0, ACCESS_PUBLIC, false);
+}
+
+access_show_hidden_entities($hidden_entities);
+elgg_set_ignore_access($ia);
diff --git a/engine/lib/upgrades/2010121601.php b/engine/lib/upgrades/2010121601.php
new file mode 100644
index 000000000..ad7d26adb
--- /dev/null
+++ b/engine/lib/upgrades/2010121601.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Create friends river view has been changed
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river
+ SET view='river/relationship/friend/create', action_type='create'
+ WHERE view='friends/river/create' AND action_type='friend'";
+update_data($query);
diff --git a/engine/lib/upgrades/2010121602.php b/engine/lib/upgrades/2010121602.php
new file mode 100644
index 000000000..5b0996b5e
--- /dev/null
+++ b/engine/lib/upgrades/2010121602.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Create comment river view has been changed
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river
+ SET view='river/annotation/generic_comment/create'
+ WHERE view='annotation/annotate' AND action_type='comment'";
+update_data($query);
+
diff --git a/engine/lib/upgrades/2010121701.php b/engine/lib/upgrades/2010121701.php
new file mode 100644
index 000000000..375654bac
--- /dev/null
+++ b/engine/lib/upgrades/2010121701.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Create group forum topic river view has been changed
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river
+ SET view='river/object/groupforumtopic/create'
+ WHERE view='river/forum/topic/create' AND action_type='create'";
+update_data($query);
+
diff --git a/engine/lib/upgrades/2010123101.php b/engine/lib/upgrades/2010123101.php
new file mode 100644
index 000000000..f4befd1a8
--- /dev/null
+++ b/engine/lib/upgrades/2010123101.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Set default access for older sites
+ */
+
+$access = elgg_get_config('default_access');
+if ($access == false) {
+ elgg_save_config('default_access', ACCESS_LOGGED_IN);
+}
diff --git a/engine/lib/upgrades/2011010101.php b/engine/lib/upgrades/2011010101.php
new file mode 100644
index 000000000..f4411ee20
--- /dev/null
+++ b/engine/lib/upgrades/2011010101.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Migrate plugins to the new system using ElggPlugin and private settings
+ */
+
+$old_ia = elgg_set_ignore_access(true);
+
+$site = get_config('site');
+$old_plugin_order = unserialize($site->pluginorder);
+$old_enabled_plugins = $site->enabled_plugins;
+
+$db_prefix = get_config('dbprefix');
+$plugin_subtype_id = get_subtype_id('object', 'plugin');
+
+// easy one first: make sure the the site owns all plugin entities.
+$q = "UPDATE {$db_prefix}entities e
+ SET owner_guid = $site->guid, container_guid = $site->guid
+ WHERE e.type = 'object' AND e.subtype = $plugin_subtype_id";
+
+$r = update_data($q);
+
+// rewrite all plugin:setting:* to ELGG_PLUGIN_USER_SETTING_PREFIX . *
+$q = "UPDATE {$db_prefix}private_settings
+ SET name = replace(name, 'plugin:settings:', '" . ELGG_PLUGIN_USER_SETTING_PREFIX . "')
+ WHERE name LIKE 'plugin:settings:%'";
+
+$r = update_data($q);
+
+// grab current plugin GUIDs to add a temp priority
+$q = "SELECT * FROM {$db_prefix}entities e
+ JOIN {$db_prefix}objects_entity oe ON e.guid = oe.guid
+ WHERE e.type = 'object' AND e.subtype = $plugin_subtype_id";
+
+$plugins = get_data($q);
+
+foreach ($plugins as $plugin) {
+ $priority = elgg_namespace_plugin_private_setting('internal', 'priority');
+ set_private_setting($plugin->guid, $priority, 0);
+}
+
+// force regenerating plugin entities
+elgg_generate_plugin_entities();
+
+// set the priorities for all plugins
+// this function rewrites it to a normal index so use the current one.
+elgg_set_plugin_priorities($old_plugin_order);
+
+// add relationships for enabled plugins
+if ($old_enabled_plugins) {
+ // they might only have one plugin enabled.
+ if (!is_array($old_enabled_plugins)) {
+ $old_enabled_plugins = array($old_enabled_plugins);
+ }
+
+ // sometimes there were problems and you'd get 1000s of enabled plugins.
+ $old_enabled_plugins = array_unique($old_enabled_plugins);
+
+ foreach ($old_enabled_plugins as $plugin_id) {
+ $plugin = elgg_get_plugin_from_id($plugin_id);
+
+ if ($plugin) {
+ $plugin->activate();
+ }
+ }
+}
+
+// invalidate caches
+elgg_invalidate_simplecache();
+elgg_reset_system_cache();
+
+// clean up.
+remove_metadata($site->guid, 'pluginorder');
+remove_metadata($site->guid, 'enabled_plugins');
+
+elgg_set_ignore_access($old_id);
+
+/**
+ * @hack
+ *
+ * We stop the upgrade at this point because plugins weren't given the chance to
+ * load due to the new plugin code introduced with Elgg 1.8. Instead, we manually
+ * set the version and start the upgrade process again.
+ *
+ * The variables from upgrade_code() are available because this script was included
+ */
+if ($upgrade_version > $version) {
+ datalist_set('version', $upgrade_version);
+}
+
+// add ourselves to the processed_upgrades.
+$processed_upgrades[] = '2011010101.php';
+
+$processed_upgrades = array_unique($processed_upgrades);
+elgg_set_processed_upgrades($processed_upgrades);
+
+_elgg_upgrade_unlock();
+
+forward('upgrade.php');
diff --git a/engine/lib/upgrades/2011021800-1.8_svn-goodbye_walled_garden-083121a656d06894.php b/engine/lib/upgrades/2011021800-1.8_svn-goodbye_walled_garden-083121a656d06894.php
new file mode 100644
index 000000000..40b2c71d5
--- /dev/null
+++ b/engine/lib/upgrades/2011021800-1.8_svn-goodbye_walled_garden-083121a656d06894.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011021800
+ * goodbye_walled_garden
+ *
+ * Removes the Walled Garden plugin in favor of new system settings
+ */
+
+global $CONFIG;
+
+$access = elgg_set_ignore_access(TRUE);
+
+if (elgg_is_active_plugin('walledgarden')) {
+ disable_plugin('walledgarden');
+ set_config('allow_registration', FALSE);
+ set_config('walled_garden', TRUE);
+} else {
+ set_config('allow_registration', TRUE);
+ set_config('walled_garden', FALSE);
+}
+
+// this was for people who manually set the config option
+$disable_registration = elgg_get_config('disable_registration');
+if ($disable_registration !== null) {
+ $allow_registration = !$disable_registration;
+ elgg_save_config('allow_registration', $allow_registration);
+
+ $site = elgg_get_site_entity();
+ $query = "DELETE FROM {$CONFIG->dbprefix}config
+ WHERE name = 'disable_registration' AND site_guid = $site->guid";
+ delete_data($query);
+}
+
+elgg_set_ignore_access($access);
diff --git a/engine/lib/upgrades/2011022000-1.8_svn-custom_profile_fields-390ac967b0bb5665.php b/engine/lib/upgrades/2011022000-1.8_svn-custom_profile_fields-390ac967b0bb5665.php
new file mode 100644
index 000000000..7561b84ba
--- /dev/null
+++ b/engine/lib/upgrades/2011022000-1.8_svn-custom_profile_fields-390ac967b0bb5665.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Elgg 2011010401 upgrade 00
+ * custom_profile_fields
+ *
+ * Migrate 1.7 style custom profile fields to 1.8
+ */
+
+$plugin = elgg_get_plugin_from_id('profile');
+
+// plugin not installed
+if (!$plugin) {
+ return true;
+}
+
+$settings = $plugin->getAllSettings();
+// no fields to migrate
+if (!$settings['user_defined_fields']) {
+ return true;
+}
+
+$order = array();
+$remove_settings = array();
+
+// make sure we have a name and type
+foreach ($settings as $k => $v) {
+ if (!preg_match('/admin_defined_profile_([0-9]+)/i', $k, $matches)) {
+ continue;
+ }
+
+ $i = $matches[1];
+ $type_name = "admin_defined_profile_type_$i";
+ $type = elgg_extract($type_name, $settings, null);
+
+ if ($type) {
+ // field name
+ elgg_save_config($k, $v);
+ // field value
+ elgg_save_config($type_name, $type);
+
+ $order[] = $i;
+ $remove_settings[] = $k;
+ $remove_settings[] = $type_name;
+ }
+}
+
+if ($order) {
+ // these will always need to be in order, but there might be gaps
+ ksort($order);
+
+ $order_str = implode(',', $order);
+ elgg_save_config('profile_custom_fields', $order_str);
+
+ foreach ($remove_settings as $name) {
+ $plugin->unsetSetting($name);
+ }
+
+ $plugin->unsetSetting('user_defined_fields');
+} \ No newline at end of file
diff --git a/engine/lib/upgrades/2011030700-1.8_svn-blog_status_metadata-4645225d7b440876.php b/engine/lib/upgrades/2011030700-1.8_svn-blog_status_metadata-4645225d7b440876.php
new file mode 100644
index 000000000..fe2af9928
--- /dev/null
+++ b/engine/lib/upgrades/2011030700-1.8_svn-blog_status_metadata-4645225d7b440876.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011030700
+ * blog_status_metadata
+ *
+ * Add a "status" metadata entry to every blog entity because in 1.8 you can have status = draft or
+ * status = published
+ */
+$ia = elgg_set_ignore_access(true);
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'limit' => 0,
+);
+$batch = new ElggBatch('elgg_get_entities', $options);
+
+foreach ($batch as $entity) {
+ if (!$entity->status) {
+ // create metadata owned by the original owner
+ create_metadata($entity->getGUID(), 'status', 'published', '', $entity->owner_guid,
+ $entity->access_id);
+ }
+}
+elgg_set_ignore_access($ia); \ No newline at end of file
diff --git a/engine/lib/upgrades/2011031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php b/engine/lib/upgrades/2011031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php
new file mode 100644
index 000000000..df60892a6
--- /dev/null
+++ b/engine/lib/upgrades/2011031300-1.8_svn-twitter_api-12b832a5a7a3e1bd.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011031300
+ * twitter_api
+ *
+ * Updates the database for twitterservice to twitter_api changes.
+ */
+
+
+$ia = elgg_set_ignore_access(true);
+
+// make sure we have updated plugins
+elgg_generate_plugin_entities();
+
+$show_hidden = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$db_prefix = elgg_get_config('dbprefix');
+$site_guid = elgg_get_site_entity()->getGUID();
+$old = elgg_get_plugin_from_id('twitterservice');
+$new = elgg_get_plugin_from_id('twitter_api');
+$has_settings = false;
+
+// if not loaded, don't bother.
+if (!$old || !$new) {
+ return true;
+}
+
+$settings = array('consumer_key', 'consumer_secret', 'sign_on', 'new_users');
+
+foreach ($settings as $setting) {
+ $value = $old->getSetting($setting);
+ if ($value) {
+ $has_settings = true;
+ $new->setSetting($setting, $value);
+ }
+}
+
+// update the user settings
+$q = "UPDATE {$db_prefix}private_settings
+ SET name = replace(name, 'twitterservice', 'twitter_api')
+ WHERE name like '%twitterservice%'";
+
+update_data($q);
+
+// if there were settings, emit a notice to re-enable twitter_api
+if ($has_settings) {
+ elgg_add_admin_notice('twitter_api:disabled', elgg_echo('update:twitter_api:deactivated'));
+}
+
+$old->delete();
+
+access_show_hidden_entities($show_hidden);
+elgg_set_ignore_access($ia); \ No newline at end of file
diff --git a/engine/lib/upgrades/2011031600-1.8_svn-datalist_grows_up-0b8aec5a55cc1e1c.php b/engine/lib/upgrades/2011031600-1.8_svn-datalist_grows_up-0b8aec5a55cc1e1c.php
new file mode 100644
index 000000000..379244b36
--- /dev/null
+++ b/engine/lib/upgrades/2011031600-1.8_svn-datalist_grows_up-0b8aec5a55cc1e1c.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011031600
+ * datalist_grows_up
+ *
+ * Ups the varchar to 256 for the datalist and config table.
+ *
+ * Keeping it as a varchar because of the trailing whitespace trimming it apparently does:
+ * http://dev.mysql.com/doc/refman/5.0/en/char.html
+ */
+
+$db_prefix = elgg_get_config('dbprefix');
+
+$q = "ALTER TABLE {$db_prefix}datalists CHANGE name name VARCHAR(255)";
+update_data($q);
+
+$q = "ALTER TABLE {$db_prefix}config CHANGE name name VARCHAR(255)";
+update_data($q);
diff --git a/engine/lib/upgrades/2011032000-1.8_svn-widgets_arent_plugins-61836261fa280a5c.php b/engine/lib/upgrades/2011032000-1.8_svn-widgets_arent_plugins-61836261fa280a5c.php
new file mode 100644
index 000000000..a20970d79
--- /dev/null
+++ b/engine/lib/upgrades/2011032000-1.8_svn-widgets_arent_plugins-61836261fa280a5c.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011031800
+ * widgets_arent_plugins
+ *
+ * At some point in Elgg's history subtype widget was registered with class ElggPlugin.
+ * Fix that.
+ */
+
+update_subtype('object', 'widget', 'ElggWidget');
diff --git a/engine/lib/upgrades/2011032200-1.8_svn-admins_like_widgets-7f19d2783c1680d3.php b/engine/lib/upgrades/2011032200-1.8_svn-admins_like_widgets-7f19d2783c1680d3.php
new file mode 100644
index 000000000..592adb403
--- /dev/null
+++ b/engine/lib/upgrades/2011032200-1.8_svn-admins_like_widgets-7f19d2783c1680d3.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg 1.8-svn upgrade 2011032200
+ * admins_like_widgets
+ *
+ * Give current admins widgets for those pre-1.8
+ */
+
+$admins = elgg_get_admins(array('limit' => 0));
+foreach ($admins as $admin) {
+ // call the admin handler for the make_admin event
+ elgg_add_admin_widgets('make_admin', 'user', $admin);
+}
diff --git a/engine/lib/upgrades/2011052801.php b/engine/lib/upgrades/2011052801.php
new file mode 100644
index 000000000..b5a8e1018
--- /dev/null
+++ b/engine/lib/upgrades/2011052801.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Make sure all users have the relationship member_of_site
+ */
+global $ENTITY_CACHE;
+$db_prefix = get_config('dbprefix');
+
+$limit = 100;
+
+$q = "SELECT e.* FROM {$db_prefix}entities e
+ WHERE e.type = 'user' AND e.guid NOT IN (
+ SELECT guid_one FROM {$db_prefix}entity_relationships
+ WHERE guid_two = 1 AND relationship = 'member_of_site'
+ )
+ LIMIT $limit";
+
+$users = get_data($q);
+
+while ($users) {
+ $ENTITY_CACHE = array();
+ _elgg_invalidate_query_cache();
+
+ // do manually to not trigger any events because these aren't new users.
+ foreach ($users as $user) {
+ $rel_q = "INSERT INTO {$db_prefix}entity_relationships VALUES (
+ '',
+ '$user->guid',
+ 'member_of_site',
+ '$user->site_guid',
+ '$user->time_created'
+ )";
+
+ insert_data($rel_q);
+ }
+
+ // every time we run this query we've just reduced the rows it returns by $limit
+ // so don't pass an offset.
+ $q = "SELECT e.* FROM {$db_prefix}entities e
+ WHERE e.type = 'user' AND e.guid NOT IN (
+ SELECT guid_one FROM {$db_prefix}entity_relationships
+ WHERE guid_two = 1 AND relationship = 'member_of_site'
+ )
+ LIMIT $limit";
+
+ $users = get_data($q);
+} \ No newline at end of file
diff --git a/engine/lib/upgrades/2011061200-1.8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php b/engine/lib/upgrades/2011061200-1.8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php
new file mode 100644
index 000000000..41ab29998
--- /dev/null
+++ b/engine/lib/upgrades/2011061200-1.8b1-sites_need_a_site_guid-6d9dcbf46c0826cc.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Elgg 1.8b1 upgrade 2011061200
+ * sites_need_a_site_guid
+ *
+ * Sites did not have a site guid. This causes problems with getting
+ * metadata on site objects since we default to the current site.
+ */
+
+global $CONFIG;
+
+$ia = elgg_set_ignore_access(true);
+$access_status = access_get_show_hidden_status();
+access_show_hidden_entities(true);
+
+$options = array(
+ 'type' => 'site',
+ 'site_guid' => 0,
+ 'limit' => 0,
+);
+$batch = new ElggBatch('elgg_get_entities', $options);
+
+foreach ($batch as $entity) {
+ if (!$entity->site_guid) {
+ update_data("UPDATE {$CONFIG->dbprefix}entities SET site_guid=$entity->guid
+ WHERE guid=$entity->guid");
+ }
+}
+
+access_show_hidden_entities($access_status);
+elgg_set_ignore_access($ia);
diff --git a/engine/lib/upgrades/2011092500-1.8.0.1-forum_reply_river_view-5758ce8d86ac56ce.php b/engine/lib/upgrades/2011092500-1.8.0.1-forum_reply_river_view-5758ce8d86ac56ce.php
new file mode 100644
index 000000000..3a9200b51
--- /dev/null
+++ b/engine/lib/upgrades/2011092500-1.8.0.1-forum_reply_river_view-5758ce8d86ac56ce.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg 1.8.0.1 upgrade 2011092500
+ * forum_reply_river_view
+ *
+ * The forum reply river view is in a new location in Elgg 1.8
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river SET view='river/annotation/group_topic_post/reply',
+ action_type='reply'
+ WHERE view='river/forum/create' AND action_type='create'";
+update_data($query);
diff --git a/engine/lib/upgrades/2011123100-1.8.2-fix_friend_river-b17e7ff8345c2269.php b/engine/lib/upgrades/2011123100-1.8.2-fix_friend_river-b17e7ff8345c2269.php
new file mode 100644
index 000000000..4dc43cd32
--- /dev/null
+++ b/engine/lib/upgrades/2011123100-1.8.2-fix_friend_river-b17e7ff8345c2269.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg 1.8.2 upgrade 2011123100
+ * fix_friend_river
+ *
+ * Action type was incorrect due to previoud friends river upgrade
+ */
+
+$query = "UPDATE {$CONFIG->dbprefix}river
+ SET action_type='friend'
+ WHERE view='river/relationship/friend/create' AND action_type='create'";
+update_data($query);
diff --git a/engine/lib/upgrades/2011123101-1.8.2-fix_blog_status-b14c2a0e7b9e7d55.php b/engine/lib/upgrades/2011123101-1.8.2-fix_blog_status-b14c2a0e7b9e7d55.php
new file mode 100644
index 000000000..e351c6ac9
--- /dev/null
+++ b/engine/lib/upgrades/2011123101-1.8.2-fix_blog_status-b14c2a0e7b9e7d55.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Elgg 1.8.2 upgrade 2011123101
+ * fix_blog_status
+ *
+ * Most blog posts did not have their status properly set with 1.8 upgrade so we run
+ * the blog status upgrade again
+ */
+
+$ia = elgg_set_ignore_access(true);
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'limit' => 0,
+);
+$batch = new ElggBatch('elgg_get_entities', $options);
+
+foreach ($batch as $entity) {
+ if (!$entity->status) {
+ // create metadata owned by the original owner
+ create_metadata($entity->getGUID(), 'status', 'published', '', $entity->owner_guid,
+ $entity->access_id);
+ }
+}
+elgg_set_ignore_access($ia); \ No newline at end of file
diff --git a/engine/lib/upgrades/2012012000-1.8.3-ip_in_syslog-87fe0f068cf62428.php b/engine/lib/upgrades/2012012000-1.8.3-ip_in_syslog-87fe0f068cf62428.php
new file mode 100644
index 000000000..b9514e156
--- /dev/null
+++ b/engine/lib/upgrades/2012012000-1.8.3-ip_in_syslog-87fe0f068cf62428.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg 1.8.3 upgrade 2012012000
+ * ip_in_syslog
+ *
+ * Adds a field for an IP address in the system log table
+ */
+
+$db_prefix = elgg_get_config('dbprefix');
+$q = "ALTER TABLE {$db_prefix}system_log ADD ip_address VARCHAR(15) NOT NULL AFTER time_created";
+
+update_data($q); \ No newline at end of file
diff --git a/engine/lib/upgrades/2012012100-1.8.3-system_cache-93100e7d55a24a11.php b/engine/lib/upgrades/2012012100-1.8.3-system_cache-93100e7d55a24a11.php
new file mode 100644
index 000000000..3a9aae2a1
--- /dev/null
+++ b/engine/lib/upgrades/2012012100-1.8.3-system_cache-93100e7d55a24a11.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg 1.8.3 upgrade 2012012100
+ * system_cache
+ *
+ * Convert viewpath cache to system cache
+ */
+
+$value = datalist_get('viewpath_cache_enabled');
+datalist_set('system_cache_enabled', $value);
+
+$query = "DELETE FROM {$CONFIG->dbprefix}datalists WHERE name='viewpath_cache_enabled'";
+delete_data($query);
diff --git a/engine/lib/upgrades/2012041800-1.8.3-dont_filter_passwords-c0ca4a18b38ae2bc.php b/engine/lib/upgrades/2012041800-1.8.3-dont_filter_passwords-c0ca4a18b38ae2bc.php
new file mode 100644
index 000000000..b82ffbebf
--- /dev/null
+++ b/engine/lib/upgrades/2012041800-1.8.3-dont_filter_passwords-c0ca4a18b38ae2bc.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Elgg 1.8.3 upgrade 2012041800
+ * dont_filter_passwords
+ *
+ * Add admin notice that password handling has changed and if
+ * users can't login to have them reset their passwords.
+ */
+elgg_add_admin_notice('dont_filter_passwords', 'Password handling has been updated to be more secure and flexible. '
+ . 'This change may prevent a small number of users from logging in with their existing passwords. '
+ . 'If a user is unable to log in, please advise him or her to reset their password, or reset it as an admin user.');
diff --git a/engine/lib/upgrades/2012041801-1.8.3-multiple_user_tokens-852225f7fd89f6c5.php b/engine/lib/upgrades/2012041801-1.8.3-multiple_user_tokens-852225f7fd89f6c5.php
new file mode 100644
index 000000000..780038c32
--- /dev/null
+++ b/engine/lib/upgrades/2012041801-1.8.3-multiple_user_tokens-852225f7fd89f6c5.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg 1.8.3 upgrade 2012041801
+ * multiple_user_tokens
+ *
+ * Fixes https://github.com/elgg/elgg/issues/4291
+ * Removes the unique index on users_apisessions for user_guid and site_guid
+ */
+
+$db_prefix = elgg_get_config('dbprefix');
+$q = "ALTER TABLE {$db_prefix}users_apisessions DROP INDEX user_guid,
+ ADD INDEX user_guid (user_guid, site_guid)";
+update_data($q); \ No newline at end of file
diff --git a/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php b/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php
new file mode 100644
index 000000000..8eccf05e2
--- /dev/null
+++ b/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Elgg 1.8.14 upgrade 2013030600
+ * update_user_location
+ *
+ * Before Elgg 1.8, a location like "London, England" would be stored as an array.
+ * This script turns that back into a string.
+ */
+
+$ia = elgg_set_ignore_access(true);
+$options = array(
+ 'type' => 'user',
+ 'limit' => 0,
+);
+$batch = new ElggBatch('elgg_get_entities', $options);
+
+foreach ($batch as $entity) {
+ _elgg_invalidate_query_cache();
+
+ if (is_array($entity->location)) {
+ $entity->location = implode(', ', $entity->location);
+ }
+}
+elgg_set_ignore_access($ia);
diff --git a/engine/lib/upgrades/2013051700-1.8.15-add_missing_group_index-52a63a3a3ffaced2.php b/engine/lib/upgrades/2013051700-1.8.15-add_missing_group_index-52a63a3a3ffaced2.php
new file mode 100644
index 000000000..ee99bdbc8
--- /dev/null
+++ b/engine/lib/upgrades/2013051700-1.8.15-add_missing_group_index-52a63a3a3ffaced2.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Elgg 1.8.15 upgrade 2013051700
+ * add_missing_group_index
+ *
+ * Some Elgg sites are missing the groups_entity full text index on name and
+ * description. This checks if it exists and adds it if it does not.
+ */
+
+$db_prefix = elgg_get_config('dbprefix');
+
+$full_text_index_exists = false;
+$results = get_data("SHOW INDEX FROM {$db_prefix}groups_entity");
+if ($results) {
+ foreach ($results as $result) {
+ if ($result->Index_type === 'FULLTEXT') {
+ $full_text_index_exists = true;
+ }
+ }
+}
+
+if ($full_text_index_exists == false) {
+ $query = "ALTER TABLE {$db_prefix}groups_entity
+ ADD FULLTEXT name_2 (name, description)";
+ if (!update_data($query)) {
+ elgg_log("Failed to add full text index to groups_entity table", 'ERROR');
+ }
+}
diff --git a/engine/lib/upgrades/2013052900-1.8.15-ipv6_in_syslog-f5c2cc0196e9e731.php b/engine/lib/upgrades/2013052900-1.8.15-ipv6_in_syslog-f5c2cc0196e9e731.php
new file mode 100644
index 000000000..d333a6cd2
--- /dev/null
+++ b/engine/lib/upgrades/2013052900-1.8.15-ipv6_in_syslog-f5c2cc0196e9e731.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Elgg 1.8.15 upgrade 2013052900
+ * ipv6_in_syslog
+ *
+ * Upgrade the ip column in system_log to be able to store ipv6 addresses
+ */
+
+$db_prefix = elgg_get_config('dbprefix');
+$q = "ALTER TABLE {$db_prefix}system_log MODIFY COLUMN ip_address varchar(46) NOT NULL";
+
+update_data($q); \ No newline at end of file
diff --git a/engine/lib/upgrades/2013060900-1.8.15-site_secret-404fc165cf9e0ac9.php b/engine/lib/upgrades/2013060900-1.8.15-site_secret-404fc165cf9e0ac9.php
new file mode 100644
index 000000000..538d74dd6
--- /dev/null
+++ b/engine/lib/upgrades/2013060900-1.8.15-site_secret-404fc165cf9e0ac9.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Elgg 1.8.15 upgrade 2013060900
+ * site_secret
+ *
+ * Description
+ */
+
+$strength = _elgg_get_site_secret_strength();
+
+if ($strength !== 'strong') {
+ // a new key is needed immediately
+ register_translations(elgg_get_root_path() . 'languages/');
+
+ elgg_add_admin_notice('weak_site_key', elgg_echo("upgrade:site_secret_warning:$strength"));
+}
diff --git a/engine/lib/upgrades/create_upgrade.php b/engine/lib/upgrades/create_upgrade.php
new file mode 100644
index 000000000..b34f31b7e
--- /dev/null
+++ b/engine/lib/upgrades/create_upgrade.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Creates an upgrade file for Elgg.
+ *
+ * Run this from the command line:
+ * php create_upgrade.php upgrade_name
+ */
+
+error_reporting(E_NOTICE);
+
+// only allow from the command line.
+if (php_sapi_name() != 'cli') {
+ die('Upgrades can only be created from the command line.');
+}
+
+if (count($argv) < 2) {
+ elgg_create_upgrade_show_usage('No upgrade name.');
+}
+
+$name = $argv[1];
+
+if (strlen($name) > 24) {
+ elgg_create_upgrade_show_usage('Upgrade names cannot be longer than 24 characters.');
+}
+
+require_once '../../../version.php';
+require_once '../elgglib.php';
+$upgrade_path = dirname(__FILE__);
+
+$upgrade_name = strtolower($name);
+$upgrade_name = str_replace(array(' ', '-'), '_', $upgrade_name);
+$upgrade_release = str_replace(array(' ', '-'), '_', $release);
+$time = time();
+$upgrade_rnd = substr(md5($time), 0, 16);
+$upgrade_date = date('Ymd', $time);
+
+// determine the inc count
+$upgrade_inc = 0;
+$files = elgg_get_file_list($upgrade_path);
+sort($files);
+
+foreach ($files as $filename) {
+ $filename = basename($filename);
+ $date = (int)substr($filename, 0, 8);
+ $inc = (int)substr($filename, 8, 2);
+
+ if ($upgrade_date == $date) {
+ if ($inc >= $upgrade_inc) {
+ $upgrade_inc = $inc + 1;
+ }
+ }
+}
+
+// zero-pad
+// if there are more than 10 upgrades in a day, someone needs talking to.
+if ($upgrade_inc < 10) {
+ $upgrade_inc = "0$upgrade_inc";
+}
+
+$upgrade_version = $upgrade_date . $upgrade_inc;
+
+// make filename
+if (substr($release, 0, 3) == '1.7') {
+ // 1.7 upgrades are YYYYMMDDXX
+ $upgrade_name = $upgrade_version . '.php';
+} else {
+ // 1.8+ upgrades are YYYYMMDDXX-release-friendly_name-rnd
+ $upgrade_name = $upgrade_version . "-$upgrade_release-$name-$upgrade_rnd.php";
+}
+
+$upgrade_file = $upgrade_path . '/' . $upgrade_name;
+
+if (is_file($upgrade_file)) {
+ elgg_create_upgrade_show_usage("Upgrade file $upgrade_file already exists. This script has failed you.");
+}
+
+$upgrade_code = <<<___UPGRADE
+<?php
+/**
+ * Elgg $release upgrade $upgrade_version
+ * $name
+ *
+ * Description
+ */
+
+// upgrade code here.
+
+___UPGRADE;
+
+$h = fopen($upgrade_file, 'wb');
+
+if (!$h) {
+ die("Could not open file $upgrade_file");
+}
+
+if (!fwrite($h, $upgrade_code)) {
+ die("Could not write to $upgrade_file");
+} else {
+ elgg_set_version_dot_php_version($upgrade_version);
+ echo <<<___MSG
+
+Created upgrade file and updated version.php.
+
+Upgrade file: $upgrade_name
+Version: $upgrade_version
+
+___MSG;
+}
+
+fclose($h);
+
+
+function elgg_set_version_dot_php_version($version) {
+ $file = '../../../version.php';
+ $h = fopen($file, 'r+b');
+
+ if (!$h) {
+ return false;
+ }
+
+ $out = '';
+
+ while (($line = fgets($h)) !== false) {
+ $find = "/\\\$version[ ]?=[ ]?[0-9]{10};/";
+ $replace = "\$version = $version;";
+ $out .= preg_replace($find, $replace, $line);
+ }
+
+ rewind($h);
+
+ fwrite($h, $out);
+ fclose($h);
+ return true;
+}
+
+/**
+ * Shows the usage for the create_upgrade script and dies().
+ *
+ * @param string $msg Optional message to display
+ * @return void
+ */
+function elgg_create_upgrade_show_usage($msg = '') {
+ $text = <<<___MSG
+$msg
+
+Example:
+ php create_upgrade.php my_upgrade
+
+___MSG;
+
+ die($text);
+}
diff --git a/engine/lib/user_settings.php b/engine/lib/user_settings.php
new file mode 100644
index 000000000..0e36dc46d
--- /dev/null
+++ b/engine/lib/user_settings.php
@@ -0,0 +1,360 @@
+<?php
+/**
+ * Elgg user settings functions.
+ * Functions for adding and manipulating options on the user settings panel.
+ *
+ * @package Elgg.Core
+ * @subpackage Settings.User
+ */
+
+/**
+ * Saves user settings.
+ *
+ * @todo this assumes settings are coming in on a GET/POST request
+ *
+ * @note This is a handler for the 'usersettings:save', 'user' plugin hook
+ *
+ * @return void
+ * @access private
+ */
+function users_settings_save() {
+ elgg_set_user_language();
+ elgg_set_user_password();
+ elgg_set_user_default_access();
+ elgg_set_user_name();
+ elgg_set_user_email();
+}
+
+/**
+ * Set a user's password
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_user_password() {
+ $current_password = get_input('current_password', null, false);
+ $password = get_input('password', null, false);
+ $password2 = get_input('password2', null, false);
+ $user_guid = get_input('guid');
+
+ if (!$user_guid) {
+ $user = elgg_get_logged_in_user_entity();
+ } else {
+ $user = get_entity($user_guid);
+ }
+
+ if ($user && $password) {
+ // let admin user change anyone's password without knowing it except his own.
+ if (!elgg_is_admin_logged_in() || elgg_is_admin_logged_in() && $user->guid == elgg_get_logged_in_user_guid()) {
+ $credentials = array(
+ 'username' => $user->username,
+ 'password' => $current_password
+ );
+
+ try {
+ pam_auth_userpass($credentials);
+ } catch (LoginException $e) {
+ register_error(elgg_echo('LoginException:ChangePasswordFailure'));
+ return false;
+ }
+ }
+
+ try {
+ $result = validate_password($password);
+ } catch (RegistrationException $e) {
+ register_error($e->getMessage());
+ return false;
+ }
+
+ if ($result) {
+ if ($password == $password2) {
+ $user->salt = generate_random_cleartext_password(); // Reset the salt
+ $user->password = generate_user_password($user, $password);
+ if ($user->save()) {
+ system_message(elgg_echo('user:password:success'));
+ return true;
+ } else {
+ register_error(elgg_echo('user:password:fail'));
+ }
+ } else {
+ register_error(elgg_echo('user:password:fail:notsame'));
+ }
+ } else {
+ register_error(elgg_echo('user:password:fail:tooshort'));
+ }
+ } else {
+ // no change
+ return null;
+ }
+
+ return false;
+}
+
+/**
+ * Set a user's display name
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_user_name() {
+ $name = strip_tags(get_input('name'));
+ $user_id = get_input('guid');
+
+ if (!$user_id) {
+ $user = elgg_get_logged_in_user_entity();
+ } else {
+ $user = get_entity($user_id);
+ }
+
+ if (elgg_strlen($name) > 50) {
+ register_error(elgg_echo('user:name:fail'));
+ return false;
+ }
+
+ if (($user) && ($user->canEdit()) && ($name)) {
+ if ($name != $user->name) {
+ $user->name = $name;
+ if ($user->save()) {
+ system_message(elgg_echo('user:name:success'));
+ return true;
+ } else {
+ register_error(elgg_echo('user:name:fail'));
+ }
+ } else {
+ // no change
+ return null;
+ }
+ } else {
+ register_error(elgg_echo('user:name:fail'));
+ }
+ return false;
+}
+
+/**
+ * Set a user's language
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_user_language() {
+ $language = get_input('language');
+ $user_id = get_input('guid');
+
+ if (!$user_id) {
+ $user = elgg_get_logged_in_user_entity();
+ } else {
+ $user = get_entity($user_id);
+ }
+
+ if (($user) && ($language)) {
+ if (strcmp($language, $user->language) != 0) {
+ $user->language = $language;
+ if ($user->save()) {
+ system_message(elgg_echo('user:language:success'));
+ return true;
+ } else {
+ register_error(elgg_echo('user:language:fail'));
+ }
+ } else {
+ // no change
+ return null;
+ }
+ } else {
+ register_error(elgg_echo('user:language:fail'));
+ }
+ return false;
+}
+
+/**
+ * Set a user's email address
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_user_email() {
+ $email = get_input('email');
+ $user_id = get_input('guid');
+
+ if (!$user_id) {
+ $user = elgg_get_logged_in_user_entity();
+ } else {
+ $user = get_entity($user_id);
+ }
+
+ if (!is_email_address($email)) {
+ register_error(elgg_echo('email:save:fail'));
+ return false;
+ }
+
+ if ($user) {
+ if (strcmp($email, $user->email) != 0) {
+ if (!get_user_by_email($email)) {
+ if ($user->email != $email) {
+
+ $user->email = $email;
+ if ($user->save()) {
+ system_message(elgg_echo('email:save:success'));
+ return true;
+ } else {
+ register_error(elgg_echo('email:save:fail'));
+ }
+ }
+ } else {
+ register_error(elgg_echo('registration:dupeemail'));
+ }
+ } else {
+ // no change
+ return null;
+ }
+ } else {
+ register_error(elgg_echo('email:save:fail'));
+ }
+ return false;
+}
+
+/**
+ * Set a user's default access level
+ *
+ * @return bool
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_set_user_default_access() {
+
+ if (!elgg_get_config('allow_user_default_access')) {
+ return false;
+ }
+
+ $default_access = get_input('default_access');
+ $user_id = get_input('guid');
+
+ if (!$user_id) {
+ $user = elgg_get_logged_in_user_entity();
+ } else {
+ $user = get_entity($user_id);
+ }
+
+ if ($user) {
+ $current_default_access = $user->getPrivateSetting('elgg_default_access');
+ if ($default_access !== $current_default_access) {
+ if ($user->setPrivateSetting('elgg_default_access', $default_access)) {
+ system_message(elgg_echo('user:default_access:success'));
+ return true;
+ } else {
+ register_error(elgg_echo('user:default_access:fail'));
+ }
+ } else {
+ // no change
+ return null;
+ }
+ } else {
+ register_error(elgg_echo('user:default_access:fail'));
+ }
+
+ return false;
+}
+
+/**
+ * Set up the menu for user settings
+ *
+ * @return void
+ * @access private
+ */
+function usersettings_pagesetup() {
+ $user = elgg_get_page_owner_entity();
+
+ if ($user && elgg_get_context() == "settings") {
+ $params = array(
+ 'name' => '1_account',
+ 'text' => elgg_echo('usersettings:user:opt:linktext'),
+ 'href' => "settings/user/{$user->username}",
+ );
+ elgg_register_menu_item('page', $params);
+ $params = array(
+ 'name' => '1_plugins',
+ 'text' => elgg_echo('usersettings:plugins:opt:linktext'),
+ 'href' => "settings/plugins/{$user->username}",
+ );
+ elgg_register_menu_item('page', $params);
+ $params = array(
+ 'name' => '1_statistics',
+ 'text' => elgg_echo('usersettings:statistics:opt:linktext'),
+ 'href' => "settings/statistics/{$user->username}",
+ );
+ elgg_register_menu_item('page', $params);
+ }
+}
+
+/**
+ * Page handler for user settings
+ *
+ * @param array $page Pages array
+ *
+ * @return bool
+ * @access private
+ */
+function usersettings_page_handler($page) {
+ global $CONFIG;
+
+ if (!isset($page[0])) {
+ $page[0] = 'user';
+ }
+
+ if (isset($page[1])) {
+ $user = get_user_by_username($page[1]);
+ elgg_set_page_owner_guid($user->guid);
+ } else {
+ $user = elgg_get_logged_in_user_entity();
+ elgg_set_page_owner_guid($user->guid);
+ }
+
+ elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username");
+
+ switch ($page[0]) {
+ case 'statistics':
+ elgg_push_breadcrumb(elgg_echo('usersettings:statistics:opt:linktext'));
+ $path = $CONFIG->path . "pages/settings/statistics.php";
+ break;
+ case 'plugins':
+ elgg_push_breadcrumb(elgg_echo('usersettings:plugins:opt:linktext'));
+ $path = $CONFIG->path . "pages/settings/tools.php";
+ break;
+ case 'user':
+ $path = $CONFIG->path . "pages/settings/account.php";
+ break;
+ }
+
+ if (isset($path)) {
+ require $path;
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Initialize the user settings library
+ *
+ * @return void
+ * @access private
+ */
+function usersettings_init() {
+ elgg_register_page_handler('settings', 'usersettings_page_handler');
+
+ elgg_register_plugin_hook_handler('usersettings:save', 'user', 'users_settings_save');
+
+ elgg_register_action("usersettings/save");
+
+ // extend the account settings form
+ elgg_extend_view('forms/account/settings', 'core/settings/account/name', 100);
+ elgg_extend_view('forms/account/settings', 'core/settings/account/password', 100);
+ elgg_extend_view('forms/account/settings', 'core/settings/account/email', 100);
+ elgg_extend_view('forms/account/settings', 'core/settings/account/language', 100);
+ elgg_extend_view('forms/account/settings', 'core/settings/account/default_access', 100);
+}
+
+elgg_register_event_handler('init', 'system', 'usersettings_init');
+elgg_register_event_handler('pagesetup', 'system', 'usersettings_pagesetup');
diff --git a/engine/lib/users.php b/engine/lib/users.php
new file mode 100644
index 000000000..a8fb9121c
--- /dev/null
+++ b/engine/lib/users.php
@@ -0,0 +1,1611 @@
+<?php
+/**
+ * Elgg users
+ * Functions to manage multiple or single users in an Elgg install
+ *
+ * @package Elgg.Core
+ * @subpackage DataModel.User
+ */
+
+/// Map a username to a cached GUID
+global $USERNAME_TO_GUID_MAP_CACHE;
+$USERNAME_TO_GUID_MAP_CACHE = array();
+
+/// Map a user code to a cached GUID
+global $CODE_TO_GUID_MAP_CACHE;
+$CODE_TO_GUID_MAP_CACHE = array();
+
+/**
+ * Return the user specific details of a user by a row.
+ *
+ * @param int $guid The ElggUser guid
+ *
+ * @return mixed
+ * @access private
+ */
+function get_user_entity_as_row($guid) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ return get_data_row("SELECT * from {$CONFIG->dbprefix}users_entity where guid=$guid");
+}
+
+/**
+ * Create or update the entities table for a given user.
+ * Call create_entity first.
+ *
+ * @param int $guid The user's GUID
+ * @param string $name The user's display name
+ * @param string $username The username
+ * @param string $password The password
+ * @param string $salt A salt for the password
+ * @param string $email The user's email address
+ * @param string $language The user's default language
+ * @param string $code A code
+ *
+ * @return bool
+ * @access private
+ */
+function create_user_entity($guid, $name, $username, $password, $salt, $email, $language, $code) {
+ global $CONFIG;
+
+ $guid = (int)$guid;
+ $name = sanitise_string($name);
+ $username = sanitise_string($username);
+ $password = sanitise_string($password);
+ $salt = sanitise_string($salt);
+ $email = sanitise_string($email);
+ $language = sanitise_string($language);
+ $code = sanitise_string($code);
+
+ $row = get_entity_as_row($guid);
+ if ($row) {
+ // Exists and you have access to it
+ $query = "SELECT guid from {$CONFIG->dbprefix}users_entity where guid = {$guid}";
+ if ($exists = get_data_row($query)) {
+ $query = "UPDATE {$CONFIG->dbprefix}users_entity
+ SET name='$name', username='$username', password='$password', salt='$salt',
+ email='$email', language='$language', code='$code'
+ WHERE guid = $guid";
+
+ $result = update_data($query);
+ if ($result != false) {
+ // Update succeeded, continue
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('update', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ } else {
+ // Exists query failed, attempt an insert.
+ $query = "INSERT into {$CONFIG->dbprefix}users_entity
+ (guid, name, username, password, salt, email, language, code)
+ values ($guid, '$name', '$username', '$password', '$salt', '$email', '$language', '$code')";
+
+ $result = insert_data($query);
+ if ($result !== false) {
+ $entity = get_entity($guid);
+ if (elgg_trigger_event('create', $entity->type, $entity)) {
+ return $guid;
+ } else {
+ $entity->delete();
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Disables all of a user's entities
+ *
+ * @param int $owner_guid The owner GUID
+ *
+ * @return bool Depending on success
+ */
+function disable_user_entities($owner_guid) {
+ global $CONFIG;
+ $owner_guid = (int) $owner_guid;
+ if ($entity = get_entity($owner_guid)) {
+ if (elgg_trigger_event('disable', $entity->type, $entity)) {
+ if ($entity->canEdit()) {
+ $query = "UPDATE {$CONFIG->dbprefix}entities
+ set enabled='no' where owner_guid={$owner_guid}
+ or container_guid = {$owner_guid}";
+
+ $res = update_data($query);
+ return $res;
+ }
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Ban a user
+ *
+ * @param int $user_guid The user guid
+ * @param string $reason A reason
+ *
+ * @return bool
+ */
+function ban_user($user_guid, $reason = "") {
+ global $CONFIG;
+
+ $user_guid = (int)$user_guid;
+
+ $user = get_entity($user_guid);
+
+ if (($user) && ($user->canEdit()) && ($user instanceof ElggUser)) {
+ if (elgg_trigger_event('ban', 'user', $user)) {
+ // Add reason
+ if ($reason) {
+ create_metadata($user_guid, 'ban_reason', $reason, '', 0, ACCESS_PUBLIC);
+ }
+
+ // clear "remember me" cookie code so user cannot login in using it
+ $user->code = "";
+ $user->save();
+
+ // invalidate memcache for this user
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+
+ if ($newentity_cache) {
+ $newentity_cache->delete($user_guid);
+ }
+
+ // Set ban flag
+ $query = "UPDATE {$CONFIG->dbprefix}users_entity set banned='yes' where guid=$user_guid";
+ return update_data($query);
+ }
+
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Unban a user.
+ *
+ * @param int $user_guid Unban a user.
+ *
+ * @return bool
+ */
+function unban_user($user_guid) {
+ global $CONFIG;
+
+ $user_guid = (int)$user_guid;
+
+ $user = get_entity($user_guid);
+
+ if (($user) && ($user->canEdit()) && ($user instanceof ElggUser)) {
+ if (elgg_trigger_event('unban', 'user', $user)) {
+ create_metadata($user_guid, 'ban_reason', '', '', 0, ACCESS_PUBLIC);
+
+ // invalidate memcache for this user
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+
+ if ($newentity_cache) {
+ $newentity_cache->delete($user_guid);
+ }
+
+
+ $query = "UPDATE {$CONFIG->dbprefix}users_entity set banned='no' where guid=$user_guid";
+ return update_data($query);
+ }
+
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Makes user $guid an admin.
+ *
+ * @param int $user_guid User guid
+ *
+ * @return bool
+ */
+function make_user_admin($user_guid) {
+ global $CONFIG;
+
+ $user = get_entity((int)$user_guid);
+
+ if (($user) && ($user instanceof ElggUser) && ($user->canEdit())) {
+ if (elgg_trigger_event('make_admin', 'user', $user)) {
+
+ // invalidate memcache for this user
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+
+ if ($newentity_cache) {
+ $newentity_cache->delete($user_guid);
+ }
+
+ $r = update_data("UPDATE {$CONFIG->dbprefix}users_entity set admin='yes' where guid=$user_guid");
+ _elgg_invalidate_cache_for_entity($user_guid);
+ return $r;
+ }
+
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Removes user $guid's admin flag.
+ *
+ * @param int $user_guid User GUID
+ *
+ * @return bool
+ */
+function remove_user_admin($user_guid) {
+ global $CONFIG;
+
+ $user = get_entity((int)$user_guid);
+
+ if (($user) && ($user instanceof ElggUser) && ($user->canEdit())) {
+ if (elgg_trigger_event('remove_admin', 'user', $user)) {
+
+ // invalidate memcache for this user
+ static $newentity_cache;
+ if ((!$newentity_cache) && (is_memcache_available())) {
+ $newentity_cache = new ElggMemcache('new_entity_cache');
+ }
+
+ if ($newentity_cache) {
+ $newentity_cache->delete($user_guid);
+ }
+
+ $r = update_data("UPDATE {$CONFIG->dbprefix}users_entity set admin='no' where guid=$user_guid");
+ _elgg_invalidate_cache_for_entity($user_guid);
+ return $r;
+ }
+
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Get the sites this user is part of
+ *
+ * @param int $user_guid The user's GUID
+ * @param int $limit Number of results to return
+ * @param int $offset Any indexing offset
+ *
+ * @return ElggSite[]|false On success, an array of ElggSites
+ */
+function get_user_sites($user_guid, $limit = 10, $offset = 0) {
+ $user_guid = (int)$user_guid;
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+
+ return elgg_get_entities_from_relationship(array(
+ 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
+ 'relationship' => 'member_of_site',
+ 'relationship_guid' => $user_guid,
+ 'inverse_relationship' => FALSE,
+ 'type' => 'site',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ ));
+}
+
+/**
+ * Adds a user to another user's friends list.
+ *
+ * @param int $user_guid The GUID of the friending user
+ * @param int $friend_guid The GUID of the user to friend
+ *
+ * @return bool Depending on success
+ */
+function user_add_friend($user_guid, $friend_guid) {
+ $user_guid = (int) $user_guid;
+ $friend_guid = (int) $friend_guid;
+ if ($user_guid == $friend_guid) {
+ return false;
+ }
+ if (!$friend = get_entity($friend_guid)) {
+ return false;
+ }
+ if (!$user = get_entity($user_guid)) {
+ return false;
+ }
+ if ((!($user instanceof ElggUser)) || (!($friend instanceof ElggUser))) {
+ return false;
+ }
+ return add_entity_relationship($user_guid, "friend", $friend_guid);
+}
+
+/**
+ * Removes a user from another user's friends list.
+ *
+ * @param int $user_guid The GUID of the friending user
+ * @param int $friend_guid The GUID of the user on the friends list
+ *
+ * @return bool Depending on success
+ */
+function user_remove_friend($user_guid, $friend_guid) {
+ $user_guid = (int) $user_guid;
+ $friend_guid = (int) $friend_guid;
+
+ // perform cleanup for access lists.
+ $collections = get_user_access_collections($user_guid);
+ if ($collections) {
+ foreach ($collections as $collection) {
+ remove_user_from_access_collection($friend_guid, $collection->id);
+ }
+ }
+
+ return remove_entity_relationship($user_guid, "friend", $friend_guid);
+}
+
+/**
+ * Determines whether or not a user is another user's friend.
+ *
+ * @param int $user_guid The GUID of the user
+ * @param int $friend_guid The GUID of the friend
+ *
+ * @return bool
+ */
+function user_is_friend($user_guid, $friend_guid) {
+ return check_entity_relationship($user_guid, "friend", $friend_guid) !== false;
+}
+
+/**
+ * Obtains a given user's friends
+ *
+ * @param int $user_guid The user's GUID
+ * @param string $subtype The subtype of users, if any
+ * @param int $limit Number of results to return (default 10)
+ * @param int $offset Indexing offset, if any
+ *
+ * @return ElggUser[]|false Either an array of ElggUsers or false, depending on success
+ */
+function get_user_friends($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,
+$offset = 0) {
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'friend',
+ 'relationship_guid' => $user_guid,
+ 'type' => 'user',
+ 'subtype' => $subtype,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+}
+
+/**
+ * Obtains the people who have made a given user a friend
+ *
+ * @param int $user_guid The user's GUID
+ * @param string $subtype The subtype of users, if any
+ * @param int $limit Number of results to return (default 10)
+ * @param int $offset Indexing offset, if any
+ *
+ * @return ElggUser[]|false Either an array of ElggUsers or false, depending on success
+ */
+function get_user_friends_of($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,
+$offset = 0) {
+
+ return elgg_get_entities_from_relationship(array(
+ 'relationship' => 'friend',
+ 'relationship_guid' => $user_guid,
+ 'inverse_relationship' => TRUE,
+ 'type' => 'user',
+ 'subtype' => $subtype,
+ 'limit' => $limit,
+ 'offset' => $offset
+ ));
+}
+
+/**
+ * Obtains a list of objects owned by a user's friends
+ *
+ * @param int $user_guid The GUID of the user to get the friends of
+ * @param string $subtype Optionally, the subtype of objects
+ * @param int $limit The number of results to return (default 10)
+ * @param int $offset Indexing offset, if any
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return ElggObject[]|false An array of ElggObjects or false, depending on success
+ */
+function get_user_friends_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,
+$offset = 0, $timelower = 0, $timeupper = 0) {
+
+ if ($friends = get_user_friends($user_guid, "", 999999, 0)) {
+ $friendguids = array();
+ foreach ($friends as $friend) {
+ $friendguids[] = $friend->getGUID();
+ }
+ return elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'owner_guids' => $friendguids,
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'container_guids' => $friendguids,
+ 'created_time_lower' => $timelower,
+ 'created_time_upper' => $timeupper
+ ));
+ }
+ return FALSE;
+}
+
+/**
+ * Counts the number of objects owned by a user's friends
+ *
+ * @param int $user_guid The GUID of the user to get the friends of
+ * @param string $subtype Optionally, the subtype of objects
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return int The number of objects
+ */
+function count_user_friends_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE,
+$timelower = 0, $timeupper = 0) {
+
+ if ($friends = get_user_friends($user_guid, "", 999999, 0)) {
+ $friendguids = array();
+ foreach ($friends as $friend) {
+ $friendguids[] = $friend->getGUID();
+ }
+ return elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'owner_guids' => $friendguids,
+ 'count' => TRUE,
+ 'container_guids' => $friendguids,
+ 'created_time_lower' => $timelower,
+ 'created_time_upper' => $timeupper
+ ));
+ }
+ return 0;
+}
+
+/**
+ * Displays a list of a user's friends' objects of a particular subtype, with navigation.
+ *
+ * @see elgg_view_entity_list
+ *
+ * @param int $user_guid The GUID of the user
+ * @param string $subtype The object subtype
+ * @param int $limit The number of entities to display on a page
+ * @param bool $full_view Whether or not to display the full view (default: true)
+ * @param bool $listtypetoggle Whether or not to allow you to flip to gallery mode (default: true)
+ * @param bool $pagination Whether to display pagination (default: true)
+ * @param int $timelower The earliest time the entity can have been created. Default: all
+ * @param int $timeupper The latest time the entity can have been created. Default: all
+ *
+ * @return string
+ */
+function list_user_friends_objects($user_guid, $subtype = "", $limit = 10, $full_view = true,
+$listtypetoggle = true, $pagination = true, $timelower = 0, $timeupper = 0) {
+
+ $offset = (int)get_input('offset');
+ $limit = (int)$limit;
+ $count = (int)count_user_friends_objects($user_guid, $subtype, $timelower, $timeupper);
+
+ $entities = get_user_friends_objects($user_guid, $subtype, $limit, $offset,
+ $timelower, $timeupper);
+
+ return elgg_view_entity_list($entities, array(
+ 'count' => $count,
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'full_view' => $full_view,
+ 'list_type_toggle' => $listtypetoggle,
+ 'pagination' => $pagination,
+ ));
+}
+
+/**
+ * Get a user object from a GUID.
+ *
+ * This function returns an ElggUser from a given GUID.
+ *
+ * @param int $guid The GUID
+ *
+ * @return ElggUser|false
+ */
+function get_user($guid) {
+ // Fixes "Exception thrown without stack frame" when db_select fails
+ if (!empty($guid)) {
+ $result = get_entity($guid);
+ }
+
+ if ((!empty($result)) && (!($result instanceof ElggUser))) {
+ return false;
+ }
+
+ if (!empty($result)) {
+ return $result;
+ }
+
+ return false;
+}
+
+/**
+ * Get user by username
+ *
+ * @param string $username The user's username
+ *
+ * @return ElggUser|false Depending on success
+ */
+function get_user_by_username($username) {
+ global $CONFIG, $USERNAME_TO_GUID_MAP_CACHE;
+
+ // Fixes #6052. Username is frequently sniffed from the path info, which,
+ // unlike $_GET, is not URL decoded. If the username was not URL encoded,
+ // this is harmless.
+ $username = rawurldecode($username);
+
+ $username = sanitise_string($username);
+ $access = get_access_sql_suffix('e');
+
+ // Caching
+ if ((isset($USERNAME_TO_GUID_MAP_CACHE[$username]))
+ && (_elgg_retrieve_cached_entity($USERNAME_TO_GUID_MAP_CACHE[$username]))) {
+ return _elgg_retrieve_cached_entity($USERNAME_TO_GUID_MAP_CACHE[$username]);
+ }
+
+ $query = "SELECT e.* from {$CONFIG->dbprefix}users_entity u
+ join {$CONFIG->dbprefix}entities e on e.guid=u.guid
+ where u.username='$username' and $access ";
+
+ $entity = get_data_row($query, 'entity_row_to_elggstar');
+ if ($entity) {
+ $USERNAME_TO_GUID_MAP_CACHE[$username] = $entity->guid;
+ } else {
+ $entity = false;
+ }
+
+ return $entity;
+}
+
+/**
+ * Get user by session code
+ *
+ * @param string $code The session code
+ *
+ * @return ElggUser|false Depending on success
+ */
+function get_user_by_code($code) {
+ global $CONFIG, $CODE_TO_GUID_MAP_CACHE;
+
+ $code = sanitise_string($code);
+
+ $access = get_access_sql_suffix('e');
+
+ // Caching
+ if ((isset($CODE_TO_GUID_MAP_CACHE[$code]))
+ && (_elgg_retrieve_cached_entity($CODE_TO_GUID_MAP_CACHE[$code]))) {
+
+ return _elgg_retrieve_cached_entity($CODE_TO_GUID_MAP_CACHE[$code]);
+ }
+
+ $query = "SELECT e.* from {$CONFIG->dbprefix}users_entity u
+ join {$CONFIG->dbprefix}entities e on e.guid=u.guid
+ where u.code='$code' and $access";
+
+ $entity = get_data_row($query, 'entity_row_to_elggstar');
+ if ($entity) {
+ $CODE_TO_GUID_MAP_CACHE[$code] = $entity->guid;
+ }
+
+ return $entity;
+}
+
+/**
+ * Get an array of users from an email address
+ *
+ * @param string $email Email address.
+ *
+ * @return array
+ */
+function get_user_by_email($email) {
+ global $CONFIG;
+
+ $email = sanitise_string($email);
+
+ $access = get_access_sql_suffix('e');
+
+ $query = "SELECT e.* from {$CONFIG->dbprefix}entities e
+ join {$CONFIG->dbprefix}users_entity u on e.guid=u.guid
+ where email='$email' and $access";
+
+ return get_data($query, 'entity_row_to_elggstar');
+}
+
+/**
+ * A function that returns a maximum of $limit users who have done something within the last
+ * $seconds seconds or the total count of active users.
+ *
+ * @param int $seconds Number of seconds (default 600 = 10min)
+ * @param int $limit Limit, default 10.
+ * @param int $offset Offset, default 0.
+ * @param bool $count Count, default false.
+ *
+ * @return mixed
+ */
+function find_active_users($seconds = 600, $limit = 10, $offset = 0, $count = false) {
+ $seconds = (int)$seconds;
+ $limit = (int)$limit;
+ $offset = (int)$offset;
+ $params = array('seconds' => $seconds, 'limit' => $limit, 'offset' => $offset, 'count' => $count);
+ $data = elgg_trigger_plugin_hook('find_active_users', 'system', $params, NULL);
+ if (!$data) {
+ global $CONFIG;
+
+ $time = time() - $seconds;
+
+ $data = elgg_get_entities(array(
+ 'type' => 'user',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'count' => $count,
+ 'joins' => array("join {$CONFIG->dbprefix}users_entity u on e.guid = u.guid"),
+ 'wheres' => array("u.last_action >= {$time}"),
+ 'order_by' => "u.last_action desc"
+ ));
+ }
+ return $data;
+}
+
+/**
+ * Generate and send a password request email to a given user's registered email address.
+ *
+ * @param int $user_guid User GUID
+ *
+ * @return bool
+ */
+function send_new_password_request($user_guid) {
+ $user_guid = (int)$user_guid;
+
+ $user = get_entity($user_guid);
+ if ($user instanceof ElggUser) {
+ // generate code
+ $code = generate_random_cleartext_password();
+ $user->setPrivateSetting('passwd_conf_code', $code);
+
+ // generate link
+ $link = elgg_get_site_url() . "resetpassword?u=$user_guid&c=$code";
+
+ // generate email
+ $email = elgg_echo('email:resetreq:body', array($user->name, $_SERVER['REMOTE_ADDR'], $link));
+
+ return notify_user($user->guid, elgg_get_site_entity()->guid,
+ elgg_echo('email:resetreq:subject'), $email, array(), 'email');
+ }
+
+ return false;
+}
+
+/**
+ * Low level function to reset a given user's password.
+ *
+ * This can only be called from execute_new_password_request().
+ *
+ * @param int $user_guid The user.
+ * @param string $password Text (which will then be converted into a hash and stored)
+ *
+ * @return bool
+ */
+function force_user_password_reset($user_guid, $password) {
+ $user = get_entity($user_guid);
+ if ($user instanceof ElggUser) {
+ $ia = elgg_set_ignore_access();
+
+ $user->salt = generate_random_cleartext_password();
+ $hash = generate_user_password($user, $password);
+ $user->password = $hash;
+ $result = (bool)$user->save();
+
+ elgg_set_ignore_access($ia);
+
+ return $result;
+ }
+
+ return false;
+}
+
+/**
+ * Validate and execute a password reset for a user.
+ *
+ * @param int $user_guid The user id
+ * @param string $conf_code Confirmation code as sent in the request email.
+ *
+ * @return mixed
+ */
+function execute_new_password_request($user_guid, $conf_code) {
+ global $CONFIG;
+
+ $user_guid = (int)$user_guid;
+ $user = get_entity($user_guid);
+
+ if ($user instanceof ElggUser) {
+ $saved_code = $user->getPrivateSetting('passwd_conf_code');
+
+ if ($saved_code && $saved_code == $conf_code) {
+ $password = generate_random_cleartext_password();
+
+ if (force_user_password_reset($user_guid, $password)) {
+ remove_private_setting($user_guid, 'passwd_conf_code');
+ // clean the logins failures
+ reset_login_failure_count($user_guid);
+
+ $email = elgg_echo('email:resetpassword:body', array($user->name, $password));
+
+ return notify_user($user->guid, $CONFIG->site->guid,
+ elgg_echo('email:resetpassword:subject'), $email, array(), 'email');
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ * Simple function that will generate a random clear text password
+ * suitable for feeding into generate_user_password().
+ *
+ * @see generate_user_password
+ *
+ * @return string
+ */
+function generate_random_cleartext_password() {
+ return substr(md5(microtime() . rand()), 0, 8);
+}
+
+/**
+ * Generate a password for a user, currently uses MD5.
+ *
+ * @param ElggUser $user The user this is being generated for.
+ * @param string $password Password in clear text
+ *
+ * @return string
+ */
+function generate_user_password(ElggUser $user, $password) {
+ return md5($password . $user->salt);
+}
+
+/**
+ * Simple function which ensures that a username contains only valid characters.
+ *
+ * This should only permit chars that are valid on the file system as well.
+ *
+ * @param string $username Username
+ *
+ * @return bool
+ * @throws RegistrationException on invalid
+ */
+function validate_username($username) {
+ global $CONFIG;
+
+ // Basic, check length
+ if (!isset($CONFIG->minusername)) {
+ $CONFIG->minusername = 4;
+ }
+
+ if (strlen($username) < $CONFIG->minusername) {
+ $msg = elgg_echo('registration:usernametooshort', array($CONFIG->minusername));
+ throw new RegistrationException($msg);
+ }
+
+ // username in the database has a limit of 128 characters
+ if (strlen($username) > 128) {
+ $msg = elgg_echo('registration:usernametoolong', array(128));
+ throw new RegistrationException($msg);
+ }
+
+ // Blacklist for bad characters (partially nicked from mediawiki)
+ $blacklist = '/[' .
+ '\x{0080}-\x{009f}' . // iso-8859-1 control chars
+ '\x{00a0}' . // non-breaking space
+ '\x{2000}-\x{200f}' . // various whitespace
+ '\x{2028}-\x{202f}' . // breaks and control chars
+ '\x{3000}' . // ideographic space
+ '\x{e000}-\x{f8ff}' . // private use
+ ']/u';
+
+ if (
+ preg_match($blacklist, $username)
+ ) {
+ // @todo error message needs work
+ throw new RegistrationException(elgg_echo('registration:invalidchars'));
+ }
+
+ // Belts and braces
+ // @todo Tidy into main unicode
+ $blacklist2 = '\'/\\"*& ?#%^(){}[]~?<>;|¬`@-+=';
+
+ for ($n = 0; $n < strlen($blacklist2); $n++) {
+ if (strpos($username, $blacklist2[$n]) !== false) {
+ $msg = elgg_echo('registration:invalidchars', array($blacklist2[$n], $blacklist2));
+ $msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8');
+ throw new RegistrationException($msg);
+ }
+ }
+
+ $result = true;
+ return elgg_trigger_plugin_hook('registeruser:validate:username', 'all',
+ array('username' => $username), $result);
+}
+
+/**
+ * Simple validation of a password.
+ *
+ * @param string $password Clear text password
+ *
+ * @return bool
+ * @throws RegistrationException on invalid
+ */
+function validate_password($password) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->min_password_length)) {
+ $CONFIG->min_password_length = 6;
+ }
+
+ if (strlen($password) < $CONFIG->min_password_length) {
+ $msg = elgg_echo('registration:passwordtooshort', array($CONFIG->min_password_length));
+ throw new RegistrationException($msg);
+ }
+
+ $result = true;
+ return elgg_trigger_plugin_hook('registeruser:validate:password', 'all',
+ array('password' => $password), $result);
+}
+
+/**
+ * Simple validation of a email.
+ *
+ * @param string $address Email address
+ *
+ * @throws RegistrationException on invalid
+ * @return bool
+ */
+function validate_email_address($address) {
+ if (!is_email_address($address)) {
+ throw new RegistrationException(elgg_echo('registration:notemail'));
+ }
+
+ // Got here, so lets try a hook (defaulting to ok)
+ $result = true;
+ return elgg_trigger_plugin_hook('registeruser:validate:email', 'all',
+ array('email' => $address), $result);
+}
+
+/**
+ * Registers a user, returning false if the username already exists
+ *
+ * @param string $username The username of the new user
+ * @param string $password The password
+ * @param string $name The user's display name
+ * @param string $email Their email address
+ * @param bool $allow_multiple_emails Allow the same email address to be
+ * registered multiple times?
+ * @param int $friend_guid GUID of a user to friend once fully registered
+ * @param string $invitecode An invite code from a friend
+ *
+ * @return int|false The new user's GUID; false on failure
+ * @throws RegistrationException
+ */
+function register_user($username, $password, $name, $email,
+$allow_multiple_emails = false, $friend_guid = 0, $invitecode = '') {
+
+ // no need to trim password.
+ $username = trim($username);
+ $name = trim(strip_tags($name));
+ $email = trim($email);
+
+ // A little sanity checking
+ if (empty($username)
+ || empty($password)
+ || empty($name)
+ || empty($email)) {
+ return false;
+ }
+
+ // Make sure a user with conflicting details hasn't registered and been disabled
+ $access_status = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+
+ if (!validate_email_address($email)) {
+ throw new RegistrationException(elgg_echo('registration:emailnotvalid'));
+ }
+
+ if (!validate_password($password)) {
+ throw new RegistrationException(elgg_echo('registration:passwordnotvalid'));
+ }
+
+ if (!validate_username($username)) {
+ throw new RegistrationException(elgg_echo('registration:usernamenotvalid'));
+ }
+
+ if ($user = get_user_by_username($username)) {
+ throw new RegistrationException(elgg_echo('registration:userexists'));
+ }
+
+ if ((!$allow_multiple_emails) && (get_user_by_email($email))) {
+ throw new RegistrationException(elgg_echo('registration:dupeemail'));
+ }
+
+ access_show_hidden_entities($access_status);
+
+ // Create user
+ $user = new ElggUser();
+ $user->username = $username;
+ $user->email = $email;
+ $user->name = $name;
+ $user->access_id = ACCESS_PUBLIC;
+ $user->salt = generate_random_cleartext_password(); // Note salt generated before password!
+ $user->password = generate_user_password($user, $password);
+ $user->owner_guid = 0; // Users aren't owned by anyone, even if they are admin created.
+ $user->container_guid = 0; // Users aren't contained by anyone, even if they are admin created.
+ $user->language = get_current_language();
+ $user->save();
+
+ // If $friend_guid has been set, make mutual friends
+ if ($friend_guid) {
+ if ($friend_user = get_user($friend_guid)) {
+ if ($invitecode == generate_invite_code($friend_user->username)) {
+ $user->addFriend($friend_guid);
+ $friend_user->addFriend($user->guid);
+
+ // @todo Should this be in addFriend?
+ add_to_river('river/relationship/friend/create', 'friend', $user->getGUID(), $friend_guid);
+ add_to_river('river/relationship/friend/create', 'friend', $friend_guid, $user->getGUID());
+ }
+ }
+ }
+
+ // Turn on email notifications by default
+ set_user_notification_setting($user->getGUID(), 'email', true);
+
+ return $user->getGUID();
+}
+
+/**
+ * Generates a unique invite code for a user
+ *
+ * @param string $username The username of the user sending the invitation
+ *
+ * @return string Invite code
+ */
+function generate_invite_code($username) {
+ $secret = datalist_get('__site_secret__');
+ return md5($username . $secret);
+}
+
+/**
+ * Set the validation status for a user.
+ *
+ * @param int $user_guid The user's GUID
+ * @param bool $status Validated (true) or unvalidated (false)
+ * @param string $method Optional method to say how a user was validated
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_set_user_validation_status($user_guid, $status, $method = '') {
+ $result1 = create_metadata($user_guid, 'validated', $status, '', 0, ACCESS_PUBLIC, false);
+ $result2 = create_metadata($user_guid, 'validated_method', $method, '', 0, ACCESS_PUBLIC, false);
+ if ($result1 && $result2) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Gets the validation status of a user.
+ *
+ * @param int $user_guid The user's GUID
+ * @return bool|null Null means status was not set for this user.
+ * @since 1.8.0
+ */
+function elgg_get_user_validation_status($user_guid) {
+ $md = elgg_get_metadata(array(
+ 'guid' => $user_guid,
+ 'metadata_name' => 'validated'
+ ));
+ if ($md == false) {
+ return null;
+ }
+
+ if ($md[0]->value) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Adds collection submenu items
+ *
+ * @return void
+ * @access private
+ */
+function collections_submenu_items() {
+
+ $user = elgg_get_logged_in_user_entity();
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'friends:view:collections',
+ 'text' => elgg_echo('friends:collections'),
+ 'href' => "collections/$user->username",
+ ));
+}
+
+/**
+ * Page handler for friends-related pages
+ *
+ * @param array $segments URL segments
+ * @param string $handler The first segment in URL used for routing
+ *
+ * @return bool
+ * @access private
+ */
+function friends_page_handler($segments, $handler) {
+ elgg_set_context('friends');
+
+ if (isset($segments[0]) && $user = get_user_by_username($segments[0])) {
+ elgg_set_page_owner_guid($user->getGUID());
+ }
+ if (elgg_get_logged_in_user_guid() == elgg_get_page_owner_guid()) {
+ collections_submenu_items();
+ }
+
+ switch ($handler) {
+ case 'friends':
+ require_once(dirname(dirname(dirname(__FILE__))) . "/pages/friends/index.php");
+ break;
+ case 'friendsof':
+ require_once(dirname(dirname(dirname(__FILE__))) . "/pages/friends/of.php");
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Page handler for friends collections
+ *
+ * @param array $page_elements Page elements
+ *
+ * @return bool
+ * @access private
+ */
+function collections_page_handler($page_elements) {
+ gatekeeper();
+ elgg_set_context('friends');
+ $base = elgg_get_config('path');
+ if (isset($page_elements[0])) {
+ if ($page_elements[0] == "add") {
+ elgg_set_page_owner_guid(elgg_get_logged_in_user_guid());
+ collections_submenu_items();
+ require_once "{$base}pages/friends/collections/add.php";
+ return true;
+ } else {
+ $user = get_user_by_username($page_elements[0]);
+ if ($user) {
+ elgg_set_page_owner_guid($user->getGUID());
+ if (elgg_get_logged_in_user_guid() == elgg_get_page_owner_guid()) {
+ collections_submenu_items();
+ }
+ require_once "{$base}pages/friends/collections/view.php";
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Page handler for account related pages
+ *
+ * @param array $page_elements Page elements
+ * @param string $handler The handler string
+ *
+ * @return bool
+ * @access private
+ */
+function elgg_user_account_page_handler($page_elements, $handler) {
+
+ $base_dir = elgg_get_root_path() . 'pages/account';
+ switch ($handler) {
+ case 'login':
+ require_once("$base_dir/login.php");
+ break;
+ case 'forgotpassword':
+ require_once("$base_dir/forgotten_password.php");
+ break;
+ case 'resetpassword':
+ require_once("$base_dir/reset_password.php");
+ break;
+ case 'register':
+ require_once("$base_dir/register.php");
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Sets the last action time of the given user to right now.
+ *
+ * @param int $user_guid The user GUID
+ *
+ * @return void
+ */
+function set_last_action($user_guid) {
+ $user_guid = (int) $user_guid;
+ global $CONFIG;
+ $time = time();
+
+ $query = "UPDATE {$CONFIG->dbprefix}users_entity
+ set prev_last_action = last_action,
+ last_action = {$time} where guid = {$user_guid}";
+
+ execute_delayed_write_query($query);
+}
+
+/**
+ * Sets the last logon time of the given user to right now.
+ *
+ * @param int $user_guid The user GUID
+ *
+ * @return void
+ */
+function set_last_login($user_guid) {
+ $user_guid = (int) $user_guid;
+ global $CONFIG;
+ $time = time();
+
+ $query = "UPDATE {$CONFIG->dbprefix}users_entity
+ set prev_last_login = last_login, last_login = {$time} where guid = {$user_guid}";
+
+ execute_delayed_write_query($query);
+}
+
+/**
+ * Creates a relationship between this site and the user.
+ *
+ * @param string $event create
+ * @param string $object_type user
+ * @param ElggUser $object User object
+ *
+ * @return void
+ * @access private
+ */
+function user_create_hook_add_site_relationship($event, $object_type, $object) {
+ add_entity_relationship($object->getGUID(), 'member_of_site', elgg_get_site_entity()->guid);
+}
+
+/**
+ * Serves the user's avatar
+ *
+ * @param string $hook
+ * @param string $entity_type
+ * @param string $returnvalue
+ * @param array $params
+ * @return string
+ * @access private
+ */
+function user_avatar_hook($hook, $entity_type, $returnvalue, $params) {
+ $user = $params['entity'];
+ $size = $params['size'];
+
+ if (isset($user->icontime)) {
+ return "avatar/view/$user->username/$size/$user->icontime";
+ } else {
+ return "_graphics/icons/user/default{$size}.gif";
+ }
+}
+
+/**
+ * Setup the default user hover menu
+ * @access private
+ */
+function elgg_user_hover_menu($hook, $type, $return, $params) {
+ $user = $params['entity'];
+ /* @var ElggUser $user */
+
+ if (elgg_is_logged_in()) {
+ if (elgg_get_logged_in_user_guid() != $user->guid) {
+ if ($user->isFriend()) {
+ $url = "action/friends/remove?friend={$user->guid}";
+ $text = elgg_echo('friend:remove');
+ $name = 'remove_friend';
+ } else {
+ $url = "action/friends/add?friend={$user->guid}";
+ $text = elgg_echo('friend:add');
+ $name = 'add_friend';
+ }
+ $url = elgg_add_action_tokens_to_url($url);
+ $item = new ElggMenuItem($name, $text, $url);
+ $item->setSection('action');
+ $return[] = $item;
+ } else {
+ $url = "profile/$user->username/edit";
+ $item = new ElggMenuItem('profile:edit', elgg_echo('profile:edit'), $url);
+ $item->setSection('action');
+ $return[] = $item;
+
+ $url = "avatar/edit/$user->username";
+ $item = new ElggMenuItem('avatar:edit', elgg_echo('avatar:edit'), $url);
+ $item->setSection('action');
+ $return[] = $item;
+ }
+ }
+
+ // prevent admins from banning or deleting themselves
+ if (elgg_get_logged_in_user_guid() == $user->guid) {
+ return $return;
+ }
+
+ if (elgg_is_admin_logged_in()) {
+ $actions = array();
+ if (!$user->isBanned()) {
+ $actions[] = 'ban';
+ } else {
+ $actions[] = 'unban';
+ }
+ $actions[] = 'delete';
+ $actions[] = 'resetpassword';
+ if (!$user->isAdmin()) {
+ $actions[] = 'makeadmin';
+ } else {
+ $actions[] = 'removeadmin';
+ }
+
+ foreach ($actions as $action) {
+ $url = "action/admin/user/$action?guid={$user->guid}";
+ $url = elgg_add_action_tokens_to_url($url);
+ $item = new ElggMenuItem($action, elgg_echo($action), $url);
+ $item->setSection('admin');
+ $item->setLinkClass('elgg-requires-confirmation');
+
+ $return[] = $item;
+ }
+
+ $url = "profile/$user->username/edit";
+ $item = new ElggMenuItem('profile:edit', elgg_echo('profile:edit'), $url);
+ $item->setSection('admin');
+ $return[] = $item;
+
+ $url = "settings/user/$user->username";
+ $item = new ElggMenuItem('settings:edit', elgg_echo('settings:edit'), $url);
+ $item->setSection('admin');
+ $return[] = $item;
+ }
+
+ return $return;
+}
+
+/**
+ * Setup the menu shown with an entity
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return
+ * @param array $params
+ * @return array
+ *
+ * @access private
+ */
+function elgg_users_setup_entity_menu($hook, $type, $return, $params) {
+ if (elgg_in_context('widgets')) {
+ return $return;
+ }
+
+ $entity = $params['entity'];
+ if (!elgg_instanceof($entity, 'user')) {
+ return $return;
+ }
+ /* @var ElggUser $entity */
+
+ if ($entity->isBanned()) {
+ $banned = elgg_echo('banned');
+ $options = array(
+ 'name' => 'banned',
+ 'text' => "<span>$banned</span>",
+ 'href' => false,
+ 'priority' => 0,
+ );
+ $return = array(ElggMenuItem::factory($options));
+ } else {
+ $return = array();
+ if (isset($entity->location)) {
+ $location = htmlspecialchars($entity->location, ENT_QUOTES, 'UTF-8', false);
+ $options = array(
+ 'name' => 'location',
+ 'text' => "<span>$location</span>",
+ 'href' => false,
+ 'priority' => 150,
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * This function loads a set of default fields into the profile, then triggers a hook letting other plugins to edit
+ * add and delete fields.
+ *
+ * Note: This is a secondary system:init call and is run at a super low priority to guarantee that it is called after all
+ * other plugins have initialised.
+ * @access private
+ */
+function elgg_profile_fields_setup() {
+ global $CONFIG;
+
+ $profile_defaults = array (
+ 'description' => 'longtext',
+ 'briefdescription' => 'text',
+ 'location' => 'location',
+ 'interests' => 'tags',
+ 'skills' => 'tags',
+ 'contactemail' => 'email',
+ 'phone' => 'text',
+ 'mobile' => 'text',
+ 'website' => 'url',
+ 'twitter' => 'text'
+ );
+
+ $loaded_defaults = array();
+ if ($fieldlist = elgg_get_config('profile_custom_fields')) {
+ if (!empty($fieldlist)) {
+ $fieldlistarray = explode(',', $fieldlist);
+ foreach ($fieldlistarray as $listitem) {
+ if ($translation = elgg_get_config("admin_defined_profile_{$listitem}")) {
+ $type = elgg_get_config("admin_defined_profile_type_{$listitem}");
+ $loaded_defaults["admin_defined_profile_{$listitem}"] = $type;
+ add_translation(get_current_language(), array("profile:admin_defined_profile_{$listitem}" => $translation));
+ }
+ }
+ }
+ }
+
+ if (count($loaded_defaults)) {
+ $CONFIG->profile_using_custom = true;
+ $profile_defaults = $loaded_defaults;
+ }
+
+ $CONFIG->profile_fields = elgg_trigger_plugin_hook('profile:fields', 'profile', NULL, $profile_defaults);
+
+ // register any tag metadata names
+ foreach ($CONFIG->profile_fields as $name => $type) {
+ if ($type == 'tags' || $type == 'location' || $type == 'tag') {
+ elgg_register_tag_metadata_name($name);
+ // register a tag name translation
+ add_translation(get_current_language(), array("tag_names:$name" => elgg_echo("profile:$name")));
+ }
+ }
+}
+
+/**
+ * Avatar page handler
+ *
+ * /avatar/edit/<username>
+ * /avatar/view/<username>/<size>/<icontime>
+ *
+ * @param array $page
+ * @return bool
+ * @access private
+ */
+function elgg_avatar_page_handler($page) {
+ global $CONFIG;
+
+ $user = get_user_by_username($page[1]);
+ if ($user) {
+ elgg_set_page_owner_guid($user->getGUID());
+ }
+
+ if ($page[0] == 'edit') {
+ require_once("{$CONFIG->path}pages/avatar/edit.php");
+ return true;
+ } else {
+ set_input('size', $page[2]);
+ require_once("{$CONFIG->path}pages/avatar/view.php");
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Profile page handler
+ *
+ * @param array $page
+ * @return bool
+ * @access private
+ */
+function elgg_profile_page_handler($page) {
+ global $CONFIG;
+
+ $user = get_user_by_username($page[0]);
+ elgg_set_page_owner_guid($user->guid);
+
+ if ($page[1] == 'edit') {
+ require_once("{$CONFIG->path}pages/profile/edit.php");
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Sets up user-related menu items
+ *
+ * @return void
+ * @access private
+ */
+function users_pagesetup() {
+
+ $owner = elgg_get_page_owner_entity();
+ $viewer = elgg_get_logged_in_user_entity();
+
+ if ($owner) {
+ $params = array(
+ 'name' => 'friends',
+ 'text' => elgg_echo('friends'),
+ 'href' => 'friends/' . $owner->username,
+ 'contexts' => array('friends')
+ );
+ elgg_register_menu_item('page', $params);
+
+ $params = array(
+ 'name' => 'friends:of',
+ 'text' => elgg_echo('friends:of'),
+ 'href' => 'friendsof/' . $owner->username,
+ 'contexts' => array('friends')
+ );
+ elgg_register_menu_item('page', $params);
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'edit_avatar',
+ 'href' => "avatar/edit/{$owner->username}",
+ 'text' => elgg_echo('avatar:edit'),
+ 'contexts' => array('profile_edit'),
+ ));
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'edit_profile',
+ 'href' => "profile/{$owner->username}/edit",
+ 'text' => elgg_echo('profile:edit'),
+ 'contexts' => array('profile_edit'),
+ ));
+ }
+
+ // topbar
+ if ($viewer) {
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'profile',
+ 'href' => $viewer->getURL(),
+ 'text' => elgg_view('output/img', array(
+ 'src' => $viewer->getIconURL('topbar'),
+ 'alt' => $viewer->name,
+ 'title' => elgg_echo('profile'),
+ 'class' => 'elgg-border-plain elgg-transition',
+ )),
+ 'priority' => 100,
+ 'link_class' => 'elgg-topbar-avatar',
+ ));
+
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'friends',
+ 'href' => "friends/{$viewer->username}",
+ 'text' => elgg_view_icon('users'),
+ 'title' => elgg_echo('friends'),
+ 'priority' => 300,
+ ));
+
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'usersettings',
+ 'href' => "settings/user/{$viewer->username}",
+ 'text' => elgg_view_icon('settings') . elgg_echo('settings'),
+ 'priority' => 500,
+ 'section' => 'alt',
+ ));
+
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'logout',
+ 'href' => "action/logout",
+ 'text' => elgg_echo('logout'),
+ 'is_action' => TRUE,
+ 'priority' => 1000,
+ 'section' => 'alt',
+ ));
+ }
+}
+
+/**
+ * Users initialisation function, which establishes the page handler
+ *
+ * @return void
+ * @access private
+ */
+function users_init() {
+
+ elgg_register_page_handler('friends', 'friends_page_handler');
+ elgg_register_page_handler('friendsof', 'friends_page_handler');
+ elgg_register_page_handler('register', 'elgg_user_account_page_handler');
+ elgg_register_page_handler('forgotpassword', 'elgg_user_account_page_handler');
+ elgg_register_page_handler('resetpassword', 'elgg_user_account_page_handler');
+ elgg_register_page_handler('login', 'elgg_user_account_page_handler');
+ elgg_register_page_handler('avatar', 'elgg_avatar_page_handler');
+ elgg_register_page_handler('profile', 'elgg_profile_page_handler');
+ elgg_register_page_handler('collections', 'collections_page_handler');
+
+ elgg_register_plugin_hook_handler('register', 'menu:user_hover', 'elgg_user_hover_menu');
+
+ elgg_register_action('register', '', 'public');
+ elgg_register_action('useradd', '', 'admin');
+ elgg_register_action('friends/add');
+ elgg_register_action('friends/remove');
+ elgg_register_action('avatar/upload');
+ elgg_register_action('avatar/crop');
+ elgg_register_action('avatar/remove');
+ elgg_register_action('profile/edit');
+
+ elgg_register_action('friends/collections/add');
+ elgg_register_action('friends/collections/delete');
+ elgg_register_action('friends/collections/edit');
+
+ elgg_register_plugin_hook_handler('entity:icon:url', 'user', 'user_avatar_hook');
+
+ elgg_register_action('user/passwordreset', '', 'public');
+ elgg_register_action('user/requestnewpassword', '', 'public');
+
+ elgg_register_widget_type('friends', elgg_echo('friends'), elgg_echo('friends:widget:description'));
+
+ // Register the user type
+ elgg_register_entity_type('user', '');
+
+ elgg_register_plugin_hook_handler('register', 'menu:entity', 'elgg_users_setup_entity_menu', 501);
+
+ elgg_register_event_handler('create', 'user', 'user_create_hook_add_site_relationship');
+}
+
+/**
+ * Runs unit tests for ElggObject
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function users_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = "{$CONFIG->path}engine/tests/objects/users.php";
+ return $value;
+}
+
+elgg_register_event_handler('init', 'system', 'users_init', 0);
+elgg_register_event_handler('init', 'system', 'elgg_profile_fields_setup', 10000); // Ensure this runs after other plugins
+elgg_register_event_handler('pagesetup', 'system', 'users_pagesetup', 0);
+elgg_register_plugin_hook_handler('unit_test', 'system', 'users_test');
diff --git a/engine/lib/views.php b/engine/lib/views.php
new file mode 100644
index 000000000..1142461fe
--- /dev/null
+++ b/engine/lib/views.php
@@ -0,0 +1,1665 @@
+<?php
+/**
+ * Elgg's view system.
+ *
+ * The view system is the primary templating engine in Elgg and renders
+ * all output. Views are short, parameterised PHP scripts for displaying
+ * output that can be regsitered, overridden, or extended. The view type
+ * determines the output format and location of the files that renders the view.
+ *
+ * Elgg uses a two step process to render full output: first
+ * content-specific elements are rendered, then the resulting
+ * content is inserted into a layout and displayed. This makes it
+ * easy to maintain a consistent look on all pages.
+ *
+ * A view corresponds to a single file on the filesystem and the views
+ * name is its directory structure. A file in
+ * <code>mod/plugins/views/default/myplugin/example.php</code>
+ * is called by saying (with the default viewtype):
+ * <code>echo elgg_view('myplugin/example');</code>
+ *
+ * View names that are registered later override those that are
+ * registered earlier. For plugins this corresponds directly
+ * to their load order: views in plugins lower in the list override
+ * those higher in the list.
+ *
+ * Plugin views belong in the views/ directory under an appropriate
+ * viewtype. Views are automatically registered.
+ *
+ * Views can be embedded-you can call a view from within a view.
+ * Views can also be prepended or extended by any other view.
+ *
+ * Any view can extend any other view if registered with
+ * {@link elgg_extend_view()}.
+ *
+ * View types are set by passing $_REQUEST['view']. The view type
+ * 'default' is a standard HTML view. Types can be defined on the fly
+ * and you can get the current view type with {@link get_current_view()}.
+ *
+ * @internal Plugin views are autoregistered before their init functions
+ * are called, so the init order doesn't affect views.
+ *
+ * @internal The file that determines the output of the view is the last
+ * registered by {@link elgg_set_view_location()}.
+ *
+ * @package Elgg.Core
+ * @subpackage Views
+ * @link http://docs.elgg.org/Views
+ */
+
+/**
+ * The view type override.
+ *
+ * @global string $CURRENT_SYSTEM_VIEWTYPE
+ * @see elgg_set_viewtype()
+ */
+global $CURRENT_SYSTEM_VIEWTYPE;
+$CURRENT_SYSTEM_VIEWTYPE = "";
+
+/**
+ * Manually set the viewtype.
+ *
+ * View types are detected automatically. This function allows
+ * you to force subsequent views to use a different viewtype.
+ *
+ * @tip Call elgg_set_viewtype() with no parameter to reset.
+ *
+ * @param string $viewtype The view type, e.g. 'rss', or 'default'.
+ *
+ * @return bool
+ * @link http://docs.elgg.org/Views/Viewtype
+ * @example views/viewtype.php
+ */
+function elgg_set_viewtype($viewtype = "") {
+ global $CURRENT_SYSTEM_VIEWTYPE;
+
+ $CURRENT_SYSTEM_VIEWTYPE = $viewtype;
+
+ return true;
+}
+
+/**
+ * Return the current view type.
+ *
+ * View types are automatically detected and can be set with $_REQUEST['view']
+ * or {@link elgg_set_viewtype()}.
+ *
+ * @internal View type is determined in this order:
+ * - $CURRENT_SYSTEM_VIEWTYPE Any overrides by {@link elgg_set_viewtype()}
+ * - $CONFIG->view The default view as saved in the DB.
+ * - $_SESSION['view']
+ *
+ * @return string The view.
+ * @see elgg_set_viewtype()
+ * @link http://docs.elgg.org/Views
+ * @todo This function's sessions stuff needs rewritten, removed, or explained.
+ */
+function elgg_get_viewtype() {
+ global $CURRENT_SYSTEM_VIEWTYPE, $CONFIG;
+
+ if ($CURRENT_SYSTEM_VIEWTYPE != "") {
+ return $CURRENT_SYSTEM_VIEWTYPE;
+ }
+
+ $viewtype = get_input('view', '', false);
+ if (is_string($viewtype) && $viewtype !== '') {
+ // only word characters allowed.
+ if (!preg_match('/\W/', $viewtype)) {
+ return $viewtype;
+ }
+ }
+
+ if (!empty($CONFIG->view)) {
+ return $CONFIG->view;
+ }
+
+ return 'default';
+}
+
+/**
+ * Register a view type as valid.
+ *
+ * @param string $view_type The view type to register
+ * @return bool
+ */
+function elgg_register_viewtype($view_type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->view_types) || !is_array($CONFIG->view_types)) {
+ $CONFIG->view_types = array();
+ }
+
+ if (!in_array($view_type, $CONFIG->view_types)) {
+ $CONFIG->view_types[] = $view_type;
+ }
+
+ return true;
+}
+
+/**
+ * Checks if $view_type is valid on this installation.
+ *
+ * @param string $view_type View type
+ *
+ * @return bool
+ * @since 1.7.2
+ * @access private
+ */
+function elgg_is_valid_view_type($view_type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->view_types) || !is_array($CONFIG->view_types)) {
+ return FALSE;
+ }
+
+ return in_array($view_type, $CONFIG->view_types);
+}
+
+/**
+ * Register a viewtype to fall back to a default view if a view isn't
+ * found for that viewtype.
+ *
+ * @tip This is useful for alternate html viewtypes (such as for mobile devices).
+ *
+ * @param string $viewtype The viewtype to register
+ *
+ * @return void
+ * @since 1.7.2
+ * @example views/viewtype_fallback.php Fallback from mobile to default.
+ */
+function elgg_register_viewtype_fallback($viewtype) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->viewtype)) {
+ $CONFIG->viewtype = new stdClass;
+ }
+
+ if (!isset($CONFIG->viewtype->fallback)) {
+ $CONFIG->viewtype->fallback = array();
+ }
+
+ $CONFIG->viewtype->fallback[] = $viewtype;
+}
+
+/**
+ * Checks if a viewtype falls back to default.
+ *
+ * @param string $viewtype Viewtype
+ *
+ * @return boolean
+ * @since 1.7.2
+ */
+function elgg_does_viewtype_fallback($viewtype) {
+ global $CONFIG;
+
+ if (isset($CONFIG->viewtype) && isset($CONFIG->viewtype->fallback)) {
+ return in_array($viewtype, $CONFIG->viewtype->fallback);
+ }
+
+ return FALSE;
+}
+
+/**
+ * Register a view to be available for ajax calls
+ *
+ * @param string $view The view name
+ * @return void
+ * @since 1.8.3
+ */
+function elgg_register_ajax_view($view) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->allowed_ajax_views)) {
+ $CONFIG->allowed_ajax_views = array();
+ }
+
+ $CONFIG->allowed_ajax_views[$view] = true;
+}
+
+/**
+ * Unregister a view for ajax calls
+ *
+ * @param string $view The view name
+ * @return void
+ * @since 1.8.3
+ */
+function elgg_unregister_ajax_view($view) {
+ global $CONFIG;
+
+ if (isset($CONFIG->allowed_ajax_views[$view])) {
+ unset($CONFIG->allowed_ajax_views[$view]);
+ }
+}
+
+/**
+ * Returns the file location for a view.
+ *
+ * @warning This doesn't check if the file exists, but only
+ * constructs (or extracts) the path and returns it.
+ *
+ * @param string $view The view.
+ * @param string $viewtype The viewtype
+ *
+ * @return string
+ */
+function elgg_get_view_location($view, $viewtype = '') {
+ global $CONFIG;
+
+ if (empty($viewtype)) {
+ $viewtype = elgg_get_viewtype();
+ }
+
+ if (!isset($CONFIG->views->locations[$viewtype][$view])) {
+ if (!isset($CONFIG->viewpath)) {
+ return dirname(dirname(dirname(__FILE__))) . "/views/";
+ } else {
+ return $CONFIG->viewpath;
+ }
+ } else {
+ return $CONFIG->views->locations[$viewtype][$view];
+ }
+}
+
+/**
+ * Set an alternative base location for a view.
+ *
+ * Views are expected to be in plugin_name/views/. This function can
+ * be used to change that location.
+ *
+ * @internal Core view locations are stored in $CONFIG->viewpath.
+ *
+ * @tip This is useful to optionally register views in a plugin.
+ *
+ * @param string $view The name of the view
+ * @param string $location The base location path
+ * @param string $viewtype The view type
+ *
+ * @return void
+ */
+function elgg_set_view_location($view, $location, $viewtype = '') {
+ global $CONFIG;
+
+ if (empty($viewtype)) {
+ $viewtype = 'default';
+ }
+
+ if (!isset($CONFIG->views)) {
+ $CONFIG->views = new stdClass;
+ }
+
+ if (!isset($CONFIG->views->locations)) {
+ $CONFIG->views->locations = array($viewtype => array($view => $location));
+
+ } else if (!isset($CONFIG->views->locations[$viewtype])) {
+ $CONFIG->views->locations[$viewtype] = array($view => $location);
+
+ } else {
+ $CONFIG->views->locations[$viewtype][$view] = $location;
+ }
+}
+
+/**
+ * Returns whether the specified view exists
+ *
+ * @note If $recurse is true, also checks if a view exists only as an extension.
+ *
+ * @param string $view The view name
+ * @param string $viewtype If set, forces the viewtype
+ * @param bool $recurse If false, do not check extensions
+ *
+ * @return bool
+ */
+function elgg_view_exists($view, $viewtype = '', $recurse = true) {
+ global $CONFIG;
+
+ // Detect view type
+ if (empty($viewtype)) {
+ $viewtype = elgg_get_viewtype();
+ }
+
+ if (!isset($CONFIG->views->locations[$viewtype][$view])) {
+ if (!isset($CONFIG->viewpath)) {
+ $location = dirname(dirname(dirname(__FILE__))) . "/views/";
+ } else {
+ $location = $CONFIG->viewpath;
+ }
+ } else {
+ $location = $CONFIG->views->locations[$viewtype][$view];
+ }
+
+ if (file_exists("{$location}{$viewtype}/{$view}.php")) {
+ return true;
+ }
+
+ // If we got here then check whether this exists as an extension
+ // We optionally recursively check whether the extended view exists also for the viewtype
+ if ($recurse && isset($CONFIG->views->extensions[$view])) {
+ foreach ($CONFIG->views->extensions[$view] as $view_extension) {
+ // do not recursively check to stay away from infinite loops
+ if (elgg_view_exists($view_extension, $viewtype, false)) {
+ return true;
+ }
+ }
+ }
+
+ // Now check if the default view exists if the view is registered as a fallback
+ if ($viewtype != 'default' && elgg_does_viewtype_fallback($viewtype)) {
+ return elgg_view_exists($view, 'default');
+ }
+
+ return false;
+}
+
+/**
+ * Return a parsed view.
+ *
+ * Views are rendered by a template handler and returned as strings.
+ *
+ * Views are called with a special $vars variable set,
+ * which includes any variables passed as the second parameter.
+ * For backward compatbility, the following variables are also set but we
+ * recommend that you do not use them:
+ * - $vars['config'] The $CONFIG global. (Use {@link elgg_get_config()} instead).
+ * - $vars['url'] The site URL. (use {@link elgg_get_site_url()} instead).
+ * - $vars['user'] The logged in user. (use {@link elgg_get_logged_in_user_entity()} instead).
+ *
+ * Custom template handlers can be set with {@link set_template_handler()}.
+ *
+ * The output of views can be intercepted by registering for the
+ * view, $view_name plugin hook.
+ *
+ * @warning Any variables in $_SESSION will override passed vars
+ * upon name collision. See https://github.com/Elgg/Elgg/issues/2124
+ *
+ * @param string $view The name and location of the view to use
+ * @param array $vars Variables to pass to the view.
+ * @param boolean $bypass If set to true, elgg_view will bypass any specified
+ * alternative template handler; by default, it will
+ * hand off to this if requested (see set_template_handler)
+ * @param boolean $ignored This argument is ignored and will be removed eventually
+ * @param string $viewtype If set, forces the viewtype for the elgg_view call to be
+ * this value (default: standard detection)
+ *
+ * @return string The parsed view
+ * @see set_template_handler()
+ * @example views/elgg_view.php
+ * @link http://docs.elgg.org/View
+ */
+function elgg_view($view, $vars = array(), $bypass = false, $ignored = false, $viewtype = '') {
+ global $CONFIG;
+
+ if (!is_string($view) || !is_string($viewtype)) {
+ elgg_log("View and Viewtype in views must be a strings: $view", 'NOTICE');
+ return '';
+ }
+ // basic checking for bad paths
+ if (strpos($view, '..') !== false) {
+ return '';
+ }
+
+ if (!is_array($vars)) {
+ elgg_log("Vars in views must be an array: $view", 'ERROR');
+ $vars = array();
+ }
+
+ // Get the current viewtype
+ if ($viewtype === '') {
+ $viewtype = elgg_get_viewtype();
+ } elseif (preg_match('/\W/', $viewtype)) {
+ // Viewtypes can only be alphanumeric
+ return '';
+ }
+
+ $view_orig = $view;
+
+ // Trigger the pagesetup event
+ if (!isset($CONFIG->pagesetupdone) && $CONFIG->boot_complete) {
+ $CONFIG->pagesetupdone = true;
+ elgg_trigger_event('pagesetup', 'system');
+ }
+
+ // @warning - plugin authors: do not expect user, config, and url to be
+ // set by elgg_view() in the future. Instead, use elgg_get_logged_in_user_entity(),
+ // elgg_get_config(), and elgg_get_site_url() in your views.
+ if (!isset($vars['user'])) {
+ $vars['user'] = elgg_get_logged_in_user_entity();
+ }
+ if (!isset($vars['config'])) {
+ $vars['config'] = $CONFIG;
+ }
+ if (!isset($vars['url'])) {
+ $vars['url'] = elgg_get_site_url();
+ }
+
+ // full_view is the new preferred key for full view on entities @see elgg_view_entity()
+ // check if full_view is set because that means we've already rewritten it and this is
+ // coming from another view passing $vars directly.
+ if (isset($vars['full']) && !isset($vars['full_view'])) {
+ elgg_deprecated_notice("Use \$vars['full_view'] instead of \$vars['full']", 1.8, 2);
+ $vars['full_view'] = $vars['full'];
+ }
+ if (isset($vars['full_view'])) {
+ $vars['full'] = $vars['full_view'];
+ }
+
+ // internalname => name (1.8)
+ if (isset($vars['internalname']) && !isset($vars['__ignoreInternalname']) && !isset($vars['name'])) {
+ elgg_deprecated_notice('You should pass $vars[\'name\'] now instead of $vars[\'internalname\']', 1.8, 2);
+ $vars['name'] = $vars['internalname'];
+ } elseif (isset($vars['name'])) {
+ if (!isset($vars['internalname'])) {
+ $vars['__ignoreInternalname'] = '';
+ }
+ $vars['internalname'] = $vars['name'];
+ }
+
+ // internalid => id (1.8)
+ if (isset($vars['internalid']) && !isset($vars['__ignoreInternalid']) && !isset($vars['name'])) {
+ elgg_deprecated_notice('You should pass $vars[\'id\'] now instead of $vars[\'internalid\']', 1.8, 2);
+ $vars['id'] = $vars['internalid'];
+ } elseif (isset($vars['id'])) {
+ if (!isset($vars['internalid'])) {
+ $vars['__ignoreInternalid'] = '';
+ }
+ $vars['internalid'] = $vars['id'];
+ }
+
+ // If it's been requested, pass off to a template handler instead
+ if ($bypass == false && isset($CONFIG->template_handler) && !empty($CONFIG->template_handler)) {
+ $template_handler = $CONFIG->template_handler;
+ if (is_callable($template_handler)) {
+ return call_user_func($template_handler, $view, $vars);
+ }
+ }
+
+ // Set up any extensions to the requested view
+ if (isset($CONFIG->views->extensions[$view])) {
+ $viewlist = $CONFIG->views->extensions[$view];
+ } else {
+ $viewlist = array(500 => $view);
+ }
+
+ // Start the output buffer, find the requested view file, and execute it
+ ob_start();
+
+ foreach ($viewlist as $priority => $view) {
+
+ $view_location = elgg_get_view_location($view, $viewtype);
+ $view_file = "$view_location$viewtype/$view.php";
+
+ // try to include view
+ if (!file_exists($view_file) || !include($view_file)) {
+ // requested view does not exist
+ $error = "$viewtype/$view view does not exist.";
+
+ // attempt to load default view
+ if ($viewtype !== 'default' && elgg_does_viewtype_fallback($viewtype)) {
+
+ $default_location = elgg_get_view_location($view, 'default');
+ $default_view_file = "{$default_location}default/$view.php";
+
+ if (file_exists($default_view_file) && include($default_view_file)) {
+ // default view found
+ $error .= " Using default/$view instead.";
+ } else {
+ // no view found at all
+ $error = "Neither $viewtype/$view nor default/$view view exists.";
+ }
+ }
+
+ // log warning
+ elgg_log($error, 'NOTICE');
+ }
+ }
+
+ // Save the output buffer into the $content variable
+ $content = ob_get_clean();
+
+ // Plugin hook
+ $params = array('view' => $view_orig, 'vars' => $vars, 'viewtype' => $viewtype);
+ $content = elgg_trigger_plugin_hook('view', $view_orig, $params, $content);
+
+ // backward compatibility with less granular hook will be gone in 2.0
+ $content_tmp = elgg_trigger_plugin_hook('display', 'view', $params, $content);
+
+ if ($content_tmp !== $content) {
+ $content = $content_tmp;
+ elgg_deprecated_notice('The display:view plugin hook is deprecated by view:view_name', 1.8);
+ }
+
+ return $content;
+}
+
+/**
+ * Extends a view with another view.
+ *
+ * The output of any view can be prepended or appended to any other view.
+ *
+ * The default action is to append a view. If the priority is less than 500,
+ * the output of the extended view will be appended to the original view.
+ *
+ * Priority can be specified and affects the order in which extensions
+ * are appended or prepended.
+ *
+ * @internal View extensions are stored in
+ * $CONFIG->views->extensions[$view][$priority] = $view_extension
+ *
+ * @param string $view The view to extend.
+ * @param string $view_extension This view is added to $view
+ * @param int $priority The priority, from 0 to 1000,
+ * to add at (lowest numbers displayed first)
+ *
+ * @return void
+ * @since 1.7.0
+ * @link http://docs.elgg.org/Views/Extend
+ * @example views/extend.php
+ */
+function elgg_extend_view($view, $view_extension, $priority = 501) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->views)) {
+ $CONFIG->views = (object) array(
+ 'extensions' => array(),
+ );
+ $CONFIG->views->extensions[$view][500] = (string)$view;
+ } else {
+ if (!isset($CONFIG->views->extensions[$view])) {
+ $CONFIG->views->extensions[$view][500] = (string)$view;
+ }
+ }
+
+ // raise priority until it doesn't match one already registered
+ while (isset($CONFIG->views->extensions[$view][$priority])) {
+ $priority++;
+ }
+
+ $CONFIG->views->extensions[$view][$priority] = (string)$view_extension;
+ ksort($CONFIG->views->extensions[$view]);
+}
+
+/**
+ * Unextends a view.
+ *
+ * @param string $view The view that was extended.
+ * @param string $view_extension This view that was added to $view
+ *
+ * @return bool
+ * @since 1.7.2
+ */
+function elgg_unextend_view($view, $view_extension) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->views->extensions[$view])) {
+ return FALSE;
+ }
+
+ $priority = array_search($view_extension, $CONFIG->views->extensions[$view]);
+ if ($priority === FALSE) {
+ return FALSE;
+ }
+
+ unset($CONFIG->views->extensions[$view][$priority]);
+
+ return TRUE;
+}
+
+/**
+ * Assembles and outputs a full page.
+ *
+ * A "page" in Elgg is determined by the current view type and
+ * can be HTML for a browser, RSS for a feed reader, or
+ * Javascript, PHP and a number of other formats.
+ *
+ * @param string $title Title
+ * @param string $body Body
+ * @param string $page_shell Optional page shell to use. See page/shells view directory
+ * @param array $vars Optional vars array to pass to the page
+ * shell. Automatically adds title, body, and sysmessages
+ *
+ * @return string The contents of the page
+ * @since 1.8
+ */
+function elgg_view_page($title, $body, $page_shell = 'default', $vars = array()) {
+
+ $messages = null;
+ if (count_messages()) {
+ // get messages - try for errors first
+ $messages = system_messages(NULL, "error");
+ if (count($messages["error"]) == 0) {
+ // no errors so grab rest of messages
+ $messages = system_messages(null, "");
+ } else {
+ // we have errors - clear out remaining messages
+ system_messages(null, "");
+ }
+ }
+
+ $vars['title'] = $title;
+ $vars['body'] = $body;
+ $vars['sysmessages'] = $messages;
+
+ $vars = elgg_trigger_plugin_hook('output:before', 'page', null, $vars);
+
+ // check for deprecated view
+ if ($page_shell == 'default' && elgg_view_exists('pageshells/pageshell')) {
+ elgg_deprecated_notice("pageshells/pageshell is deprecated by page/$page_shell", 1.8);
+ $output = elgg_view('pageshells/pageshell', $vars);
+ } else {
+ $output = elgg_view("page/$page_shell", $vars);
+ }
+
+ $vars['page_shell'] = $page_shell;
+
+ // Allow plugins to mod output
+ return elgg_trigger_plugin_hook('output', 'page', $vars, $output);
+}
+
+/**
+ * Displays a layout with optional parameters.
+ *
+ * Layouts provide consistent organization of pages and other blocks of content.
+ * There are a few default layouts in core:
+ * - admin A special layout for the admin area.
+ * - one_column A single content column.
+ * - one_sidebar A content column with sidebar.
+ * - two_sidebar A content column with two sidebars.
+ * - widgets A widget canvas.
+ *
+ * The layout views take the form page/layouts/$layout_name
+ * See the individual layouts for what options are supported. The three most
+ * common layouts have these parameters:
+ * one_column
+ * content => string
+ * one_sidebar
+ * content => string
+ * sidebar => string (optional)
+ * content
+ * content => string
+ * sidebar => string (optional)
+ * buttons => string (override the default add button)
+ * title => string (override the default title)
+ * filter_context => string (selected content filter)
+ * See the content layout view for more parameters
+ *
+ * @param string $layout_name The name of the view in page/layouts/.
+ * @param array $vars Associative array of parameters for the layout view
+ *
+ * @return string The layout
+ */
+function elgg_view_layout($layout_name, $vars = array()) {
+
+ if (is_string($vars) || $vars === null) {
+ elgg_deprecated_notice("The use of unlimited optional string arguments in elgg_view_layout() was deprecated in favor of an options array", 1.8);
+ $arg = 1;
+ $param_array = array();
+ while ($arg < func_num_args()) {
+ $param_array['area' . $arg] = func_get_arg($arg);
+ $arg++;
+ }
+ } else {
+ $param_array = $vars;
+ }
+
+ $params = elgg_trigger_plugin_hook('output:before', 'layout', null, $param_array);
+
+ // check deprecated location
+ if (elgg_view_exists("canvas/layouts/$layout_name")) {
+ elgg_deprecated_notice("canvas/layouts/$layout_name is deprecated by page/layouts/$layout_name", 1.8);
+ $output = elgg_view("canvas/layouts/$layout_name", $params);
+ } elseif (elgg_view_exists("page/layouts/$layout_name")) {
+ $output = elgg_view("page/layouts/$layout_name", $params);
+ } else {
+ $output = elgg_view("page/layouts/default", $params);
+ }
+
+ return elgg_trigger_plugin_hook('output:after', 'layout', $params, $output);
+}
+
+/**
+ * Render a menu
+ *
+ * @see elgg_register_menu_item() for documentation on adding menu items and
+ * navigation.php for information on the different menus available.
+ *
+ * This function triggers a 'register', 'menu:<menu name>' plugin hook that enables
+ * plugins to add menu items just before a menu is rendered. This is used by
+ * dynamic menus (menus that change based on some input such as the user hover
+ * menu). Using elgg_register_menu_item() in response to the hook can cause
+ * incorrect links to show up. See the blog plugin's blog_owner_block_menu()
+ * for an example of using this plugin hook.
+ *
+ * An additional hook is the 'prepare', 'menu:<menu name>' which enables plugins
+ * to modify the structure of the menu (sort it, remove items, set variables on
+ * the menu items).
+ *
+ * elgg_view_menu() uses views in navigation/menu
+ *
+ * @param string $menu_name The name of the menu
+ * @param array $vars An associative array of display options for the menu.
+ * Options include:
+ * sort_by => string or php callback
+ * string options: 'name', 'priority', 'title' (default),
+ * 'register' (registration order) or a
+ * php callback (a compare function for usort)
+ * handler: string the page handler to build action URLs
+ * entity: ElggEntity to use to build action URLs
+ * class: string the class for the entire menu.
+ * show_section_headers: bool show headers before menu sections.
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_view_menu($menu_name, array $vars = array()) {
+ global $CONFIG;
+
+ $vars['name'] = $menu_name;
+
+ $sort_by = elgg_extract('sort_by', $vars, 'text');
+
+ if (isset($CONFIG->menus[$menu_name])) {
+ $menu = $CONFIG->menus[$menu_name];
+ } else {
+ $menu = array();
+ }
+
+ // Give plugins a chance to add menu items just before creation.
+ // This supports dynamic menus (example: user_hover).
+ $menu = elgg_trigger_plugin_hook('register', "menu:$menu_name", $vars, $menu);
+
+ $builder = new ElggMenuBuilder($menu);
+ $vars['menu'] = $builder->getMenu($sort_by);
+ $vars['selected_item'] = $builder->getSelected();
+
+ // Let plugins modify the menu
+ $vars['menu'] = elgg_trigger_plugin_hook('prepare', "menu:$menu_name", $vars, $vars['menu']);
+
+ if (elgg_view_exists("navigation/menu/$menu_name")) {
+ return elgg_view("navigation/menu/$menu_name", $vars);
+ } else {
+ return elgg_view("navigation/menu/default", $vars);
+ }
+}
+
+/**
+ * Returns a string of a rendered entity.
+ *
+ * Entity views are either determined by setting the view property on the entity
+ * or by having a view named after the entity $type/$subtype. Entities that have
+ * neither a view property nor a defined $type/$subtype view will fall back to
+ * using the $type/default view.
+ *
+ * The entity view is called with the following in $vars:
+ * - ElggEntity 'entity' The entity being viewed
+ *
+ * Other common view $vars paramters:
+ * - bool 'full_view' Whether to show a full or condensed view.
+ *
+ * @tip This function can automatically appends annotations to entities if in full
+ * view and a handler is registered for the entity:annotate. See https://github.com/Elgg/Elgg/issues/964 and
+ * {@link elgg_view_entity_annotations()}.
+ *
+ * @param ElggEntity $entity The entity to display
+ * @param array $vars Array of variables to pass to the entity view.
+ * In Elgg 1.7 and earlier it was the boolean $full_view
+ * @param boolean $bypass If false, will not pass to a custom template handler.
+ * {@see set_template_handler()}
+ * @param boolean $debug Complain if views are missing
+ *
+ * @return string HTML to display or false
+ * @link http://docs.elgg.org/Views/Entity
+ * @link http://docs.elgg.org/Entities
+ * @todo The annotation hook might be better as a generic plugin hook to append content.
+ */
+function elgg_view_entity(ElggEntity $entity, $vars = array(), $bypass = true, $debug = false) {
+
+ // No point continuing if entity is null
+ if (!$entity || !($entity instanceof ElggEntity)) {
+ return false;
+ }
+
+ global $autofeed;
+ $autofeed = true;
+
+ $defaults = array(
+ 'full_view' => false,
+ );
+
+ if (is_array($vars)) {
+ $vars = array_merge($defaults, $vars);
+ } else {
+ elgg_deprecated_notice("Update your use of elgg_view_entity()", 1.8);
+ $vars = array(
+ 'full_view' => $vars,
+ );
+ }
+
+ $vars['entity'] = $entity;
+
+
+ // if this entity has a view defined, use it
+ $view = $entity->view;
+ if (is_string($view)) {
+ return elgg_view($view, $vars, $bypass, $debug);
+ }
+
+ $entity_type = $entity->getType();
+
+ $subtype = $entity->getSubtype();
+ if (empty($subtype)) {
+ $subtype = 'default';
+ }
+
+ $contents = '';
+ if (elgg_view_exists("$entity_type/$subtype")) {
+ $contents = elgg_view("$entity_type/$subtype", $vars, $bypass, $debug);
+ }
+ if (empty($contents)) {
+ $contents = elgg_view("$entity_type/default", $vars, $bypass, $debug);
+ }
+
+ // Marcus Povey 20090616 : Speculative and low impact approach for fixing #964
+ if ($vars['full_view']) {
+ $annotations = elgg_view_entity_annotations($entity, $vars['full_view']);
+
+ if ($annotations) {
+ $contents .= $annotations;
+ }
+ }
+ return $contents;
+}
+
+/**
+ * View the icon of an entity
+ *
+ * Entity views are determined by having a view named after the entity $type/$subtype.
+ * Entities that do not have a defined icon/$type/$subtype view will fall back to using
+ * the icon/$type/default view.
+ *
+ * @param ElggEntity $entity The entity to display
+ * @param string $size The size: tiny, small, medium, large
+ * @param array $vars An array of variables to pass to the view. Some possible
+ * variables are img_class and link_class. See the
+ * specific icon view for more parameters.
+ *
+ * @return string HTML to display or false
+ */
+function elgg_view_entity_icon(ElggEntity $entity, $size = 'medium', $vars = array()) {
+
+ // No point continuing if entity is null
+ if (!$entity || !($entity instanceof ElggEntity)) {
+ return false;
+ }
+
+ $vars['entity'] = $entity;
+ $vars['size'] = $size;
+
+ $entity_type = $entity->getType();
+
+ $subtype = $entity->getSubtype();
+ if (empty($subtype)) {
+ $subtype = 'default';
+ }
+
+ $contents = '';
+ if (elgg_view_exists("icon/$entity_type/$subtype")) {
+ $contents = elgg_view("icon/$entity_type/$subtype", $vars);
+ }
+ if (empty($contents)) {
+ $contents = elgg_view("icon/$entity_type/default", $vars);
+ }
+ if (empty($contents)) {
+ $contents = elgg_view("icon/default", $vars);
+ }
+
+ return $contents;
+}
+
+/**
+ * Returns a string of a rendered annotation.
+ *
+ * Annotation views are expected to be in annotation/$annotation_name.
+ * If a view is not found for $annotation_name, the default annotation/default
+ * will be used.
+ *
+ * @warning annotation/default is not currently defined in core.
+ *
+ * The annotation view is called with the following in $vars:
+ * - ElggEntity 'annotation' The annotation being viewed.
+ *
+ * @param ElggAnnotation $annotation The annotation to display
+ * @param array $vars Variable array for view.
+ * @param bool $bypass If false, will not pass to a custom
+ * template handler. {@see set_template_handler()}
+ * @param bool $debug Complain if views are missing
+ *
+ * @return string/false Rendered annotation
+ */
+function elgg_view_annotation(ElggAnnotation $annotation, array $vars = array(), $bypass = true, $debug = false) {
+ global $autofeed;
+ $autofeed = true;
+
+ $defaults = array(
+ 'full_view' => true,
+ );
+
+ $vars = array_merge($defaults, $vars);
+ $vars['annotation'] = $annotation;
+
+ // @todo setting the view on an annotation is not advertised anywhere
+ // do we want to keep this?
+ $view = $annotation->view;
+ if (is_string($view)) {
+ return elgg_view($view, $vars, $bypass, $debug);
+ }
+
+ $name = $annotation->name;
+ if (empty($name)) {
+ return false;
+ }
+
+ if (elgg_view_exists("annotation/$name")) {
+ return elgg_view("annotation/$name", $vars, $bypass, $debug);
+ } else {
+ return elgg_view("annotation/default", $vars, $bypass, $debug);
+ }
+}
+
+/**
+ * Returns a rendered list of entities with pagination. This function should be
+ * called by wrapper functions.
+ *
+ * @see elgg_list_entities()
+ * @see list_user_friends_objects()
+ * @see elgg_list_entities_from_metadata()
+ * @see elgg_list_entities_from_relationships()
+ * @see elgg_list_entities_from_annotations()
+ *
+ * @param array $entities Array of entities
+ * @param array $vars Display variables
+ * 'count' The total number of entities across all pages
+ * 'offset' The current indexing offset
+ * 'limit' The number of entities to display per page
+ * 'full_view' Display the full view of the entities?
+ * 'list_class' CSS class applied to the list
+ * 'item_class' CSS class applied to the list items
+ * 'pagination' Display pagination?
+ * 'list_type' List type: 'list' (default), 'gallery'
+ * 'list_type_toggle' Display the list type toggle?
+ *
+ * @return string The rendered list of entities
+ * @access private
+ */
+function elgg_view_entity_list($entities, $vars = array(), $offset = 0, $limit = 10, $full_view = true,
+$list_type_toggle = true, $pagination = true) {
+
+ if (!$vars["limit"] && !$vars["offset"]) {
+ // no need for pagination if listing is unlimited
+ $vars["pagination"] = false;
+ }
+
+ if (!is_int($offset)) {
+ $offset = (int)get_input('offset', 0);
+ }
+
+ // list type can be passed as request parameter
+ $list_type = get_input('list_type', 'list');
+ if (get_input('listtype')) {
+ elgg_deprecated_notice("'listtype' has been deprecated by 'list_type' for lists", 1.8);
+ $list_type = get_input('listtype');
+ }
+
+ if (is_array($vars)) {
+ // new function
+ $defaults = array(
+ 'items' => $entities,
+ 'list_class' => 'elgg-list-entity',
+ 'full_view' => true,
+ 'pagination' => true,
+ 'list_type' => $list_type,
+ 'list_type_toggle' => false,
+ 'offset' => $offset,
+ );
+
+ $vars = array_merge($defaults, $vars);
+
+ } else {
+ // old function parameters
+ elgg_deprecated_notice("Please update your use of elgg_view_entity_list()", 1.8);
+
+ $vars = array(
+ 'items' => $entities,
+ 'count' => (int) $vars, // the old count parameter
+ 'offset' => $offset,
+ 'limit' => (int) $limit,
+ 'full_view' => $full_view,
+ 'pagination' => $pagination,
+ 'list_type' => $list_type,
+ 'list_type_toggle' => $list_type_toggle,
+ 'list_class' => 'elgg-list-entity',
+ );
+ }
+
+ if ($vars['list_type'] != 'list') {
+ return elgg_view('page/components/gallery', $vars);
+ } else {
+ return elgg_view('page/components/list', $vars);
+ }
+}
+
+/**
+ * Returns a rendered list of annotations, plus pagination. This function
+ * should be called by wrapper functions.
+ *
+ * @param array $annotations Array of annotations
+ * @param array $vars Display variables
+ * 'count' The total number of annotations across all pages
+ * 'offset' The current indexing offset
+ * 'limit' The number of annotations to display per page
+ * 'full_view' Display the full view of the annotation?
+ * 'list_class' CSS Class applied to the list
+ * 'offset_key' The url parameter key used for offset
+ *
+ * @return string The list of annotations
+ * @access private
+ */
+function elgg_view_annotation_list($annotations, array $vars = array()) {
+ $defaults = array(
+ 'items' => $annotations,
+ 'list_class' => 'elgg-list-annotation elgg-annotation-list', // @todo remove elgg-annotation-list in Elgg 1.9
+ 'full_view' => true,
+ 'offset_key' => 'annoff',
+ );
+
+ $vars = array_merge($defaults, $vars);
+
+ if (!$vars["limit"] && !$vars["offset"]) {
+ // no need for pagination if listing is unlimited
+ $vars["pagination"] = false;
+ }
+
+ return elgg_view('page/components/list', $vars);
+}
+
+/**
+ * Display a plugin-specified rendered list of annotations for an entity.
+ *
+ * This displays the output of functions registered to the entity:annotation,
+ * $entity_type plugin hook.
+ *
+ * This is called automatically by the framework from {@link elgg_view_entity()}
+ *
+ * @param ElggEntity $entity Entity
+ * @param bool $full_view Display full view?
+ *
+ * @return mixed string or false on failure
+ * @todo Change the hook name.
+ */
+function elgg_view_entity_annotations(ElggEntity $entity, $full_view = true) {
+ if (!($entity instanceof ElggEntity)) {
+ return false;
+ }
+
+ $entity_type = $entity->getType();
+
+ $annotations = elgg_trigger_plugin_hook('entity:annotate', $entity_type,
+ array(
+ 'entity' => $entity,
+ 'full_view' => $full_view,
+ )
+ );
+
+ return $annotations;
+}
+
+/**
+ * Renders a title.
+ *
+ * This is a shortcut for {@elgg_view page/elements/title}.
+ *
+ * @param string $title The page title
+ * @param array $vars View variables (was submenu be displayed? (deprecated))
+ *
+ * @return string The HTML (etc)
+ */
+function elgg_view_title($title, $vars = array()) {
+ if (!is_array($vars)) {
+ elgg_deprecated_notice('setting $submenu in elgg_view_title() is deprecated', 1.8);
+ $vars = array('submenu' => $vars);
+ }
+
+ $vars['title'] = $title;
+
+ return elgg_view('page/elements/title', $vars);
+}
+
+/**
+ * Displays a UNIX timestamp in a friendly way
+ *
+ * @see elgg_get_friendly_time()
+ *
+ * @param int $time A UNIX epoch timestamp
+ *
+ * @return string The friendly time HTML
+ * @since 1.7.2
+ */
+function elgg_view_friendly_time($time) {
+ return elgg_view('output/friendlytime', array('time' => $time));
+}
+
+
+/**
+ * Returns rendered comments and a comment form for an entity.
+ *
+ * @tip Plugins can override the output by registering a handler
+ * for the comments, $entity_type hook. The handler is responsible
+ * for formatting the comments and the add comment form.
+ *
+ * @param ElggEntity $entity The entity to view comments of
+ * @param bool $add_comment Include a form to add comments?
+ * @param array $vars Variables to pass to comment view
+ *
+ * @return string|false Rendered comments or false on failure
+ * @link http://docs.elgg.org/Entities/Comments
+ * @link http://docs.elgg.org/Annotations/Comments
+ */
+function elgg_view_comments($entity, $add_comment = true, array $vars = array()) {
+ if (!($entity instanceof ElggEntity)) {
+ return false;
+ }
+
+ $vars['entity'] = $entity;
+ $vars['show_add_form'] = $add_comment;
+ $vars['class'] = elgg_extract('class', $vars, "{$entity->getSubtype()}-comments");
+
+ $output = elgg_trigger_plugin_hook('comments', $entity->getType(), $vars, false);
+ if ($output) {
+ return $output;
+ } else {
+ return elgg_view('page/elements/comments', $vars);
+ }
+}
+
+/**
+ * Wrapper function for the image block display pattern.
+ *
+ * Fixed width media on the side (image, icon, flash, etc.).
+ * Descriptive content filling the rest of the column.
+ *
+ * This is a shortcut for {@elgg_view page/components/image_block}.
+ *
+ * @param string $image The icon and other information
+ * @param string $body Description content
+ * @param array $vars Additional parameters for the view
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_view_image_block($image, $body, $vars = array()) {
+ $vars['image'] = $image;
+ $vars['body'] = $body;
+ return elgg_view('page/components/image_block', $vars);
+}
+
+/**
+ * Wrapper function for the module display pattern.
+ *
+ * Box with header, body, footer
+ *
+ * This is a shortcut for {@elgg_view page/components/module}.
+ *
+ * @param string $type The type of module (main, info, popup, aside, etc.)
+ * @param string $title A title to put in the header
+ * @param string $body Content of the module
+ * @param array $vars Additional parameters for the module
+ *
+ * @return string
+ * @since 1.8.0
+ */
+function elgg_view_module($type, $title, $body, array $vars = array()) {
+ $vars['class'] = elgg_extract('class', $vars, '') . " elgg-module-$type";
+ $vars['title'] = $title;
+ $vars['body'] = $body;
+ return elgg_view('page/components/module', $vars);
+}
+
+/**
+ * Renders a human-readable representation of a river item
+ *
+ * @param ElggRiverItem $item A river item object
+ * @param array $vars An array of variables for the view
+ *
+ * @return string returns empty string if could not be rendered
+ */
+function elgg_view_river_item($item, array $vars = array()) {
+ if (!($item instanceof ElggRiverItem)) {
+ return '';
+ }
+ // checking default viewtype since some viewtypes do not have unique views per item (rss)
+ $view = $item->getView();
+ if (!$view || !elgg_view_exists($view, 'default')) {
+ return '';
+ }
+
+ $subject = $item->getSubjectEntity();
+ $object = $item->getObjectEntity();
+ if (!$subject || !$object) {
+ // subject is disabled or subject/object deleted
+ return '';
+ }
+
+ // @todo this needs to be cleaned up
+ // Don't hide objects in closed groups that a user can see.
+ // see https://github.com/elgg/elgg/issues/4789
+ // else {
+ // // hide based on object's container
+ // $visibility = ElggGroupItemVisibility::factory($object->container_guid);
+ // if ($visibility->shouldHideItems) {
+ // return '';
+ // }
+ // }
+
+ $vars['item'] = $item;
+
+ return elgg_view('river/item', $vars);
+}
+
+/**
+ * Convenience function for generating a form from a view in a standard location.
+ *
+ * This function assumes that the body of the form is located at "forms/$action" and
+ * sets the action by default to "action/$action". Automatically wraps the forms/$action
+ * view with a <form> tag and inserts the anti-csrf security tokens.
+ *
+ * @tip This automatically appends elgg-form-action-name to the form's class. It replaces any
+ * slashes with dashes (blog/save becomes elgg-form-blog-save)
+ *
+ * @example
+ * <code>echo elgg_view_form('login');</code>
+ *
+ * This would assume a "login" form body to be at "forms/login" and would set the action
+ * of the form to "http://yoursite.com/action/login".
+ *
+ * If elgg_view('forms/login') is:
+ * <input type="text" name="username" />
+ * <input type="password" name="password" />
+ *
+ * Then elgg_view_form('login') generates:
+ * <form action="http://yoursite.com/action/login" method="post">
+ * ...security tokens...
+ * <input type="text" name="username" />
+ * <input type="password" name="password" />
+ * </form>
+ *
+ * @param string $action The name of the action. An action name does not include
+ * the leading "action/". For example, "login" is an action name.
+ * @param array $form_vars $vars environment passed to the "input/form" view
+ * @param array $body_vars $vars environment passed to the "forms/$action" view
+ *
+ * @return string The complete form
+ */
+function elgg_view_form($action, $form_vars = array(), $body_vars = array()) {
+ global $CONFIG;
+
+ $defaults = array(
+ 'action' => $CONFIG->wwwroot . "action/$action",
+ 'body' => elgg_view("forms/$action", $body_vars)
+ );
+
+ $form_class = 'elgg-form-' . preg_replace('/[^a-z0-9]/i', '-', $action);
+
+ // append elgg-form class to any class options set
+ if (isset($form_vars['class'])) {
+ $form_vars['class'] = $form_vars['class'] . " $form_class";
+ } else {
+ $form_vars['class'] = $form_class;
+ }
+
+ return elgg_view('input/form', array_merge($defaults, $form_vars));
+}
+
+/**
+ * View an item in a list
+ *
+ * @param ElggEntity|ElggAnnotation $item
+ * @param array $vars Additional parameters for the rendering
+ *
+ * @return string
+ * @since 1.8.0
+ * @access private
+ */
+function elgg_view_list_item($item, array $vars = array()) {
+ global $CONFIG;
+
+ $type = $item->getType();
+ if (in_array($type, $CONFIG->entity_types)) {
+ return elgg_view_entity($item, $vars);
+ } else if ($type == 'annotation') {
+ return elgg_view_annotation($item, $vars);
+ } else if ($type == 'river') {
+ return elgg_view_river_item($item, $vars);
+ }
+
+ return '';
+}
+
+/**
+ * View one of the elgg sprite icons
+ *
+ * Shorthand for <span class="elgg-icon elgg-icon-$name"></span>
+ *
+ * @param string $name The specific icon to display
+ * @param string $class Additional class: float, float-alt, or custom class
+ *
+ * @return string The html for displaying an icon
+ */
+function elgg_view_icon($name, $class = '') {
+ // @todo deprecate boolean in Elgg 1.9
+ if ($class === true) {
+ $class = 'float';
+ }
+ return "<span class=\"elgg-icon elgg-icon-$name $class\"></span>";
+}
+
+/**
+ * Displays a user's access collections, using the core/friends/collections view
+ *
+ * @param int $owner_guid The GUID of the owning user
+ *
+ * @return string A formatted rendition of the collections
+ * @todo Move to the friends/collection.php page.
+ * @access private
+ */
+function elgg_view_access_collections($owner_guid) {
+ if ($collections = get_user_access_collections($owner_guid)) {
+ foreach ($collections as $key => $collection) {
+ $collections[$key]->members = get_members_of_access_collection($collection->id, true);
+ $collections[$key]->entities = get_user_friends($owner_guid, "", 9999);
+ }
+ }
+
+ return elgg_view('core/friends/collections', array('collections' => $collections));
+}
+
+/**
+ * Registers a function to handle templates.
+ *
+ * Alternative template handlers can be registered to handle
+ * all output functions. By default, {@link elgg_view()} will
+ * simply include the view file. If an alternate template handler
+ * is registered, the view name and passed $vars will be passed to the
+ * registered function, which is then responsible for generating and returning
+ * output.
+ *
+ * Template handlers need to accept two arguments: string $view_name and array
+ * $vars.
+ *
+ * @warning This is experimental.
+ *
+ * @param string $function_name The name of the function to pass to.
+ *
+ * @return bool
+ * @see elgg_view()
+ * @link http://docs.elgg.org/Views/TemplateHandlers
+ */
+function set_template_handler($function_name) {
+ global $CONFIG;
+
+ if (is_callable($function_name)) {
+ $CONFIG->template_handler = $function_name;
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Returns the name of views for in a directory.
+ *
+ * Use this to get all namespaced views under the first element.
+ *
+ * @param string $dir The main directory that holds the views. (mod/profile/views/)
+ * @param string $base The root name of the view to use, without the viewtype. (profile)
+ *
+ * @return array
+ * @since 1.7.0
+ * @todo Why isn't this used anywhere else but in elgg_view_tree()?
+ * Seems like a useful function for autodiscovery.
+ * @access private
+ */
+function elgg_get_views($dir, $base) {
+ $return = array();
+ if (file_exists($dir) && is_dir($dir)) {
+ if ($handle = opendir($dir)) {
+ while ($view = readdir($handle)) {
+ if (!in_array($view, array('.', '..', '.svn', 'CVS'))) {
+ if (is_dir($dir . '/' . $view)) {
+ if ($val = elgg_get_views($dir . '/' . $view, $base . '/' . $view)) {
+ $return = array_merge($return, $val);
+ }
+ } else {
+ $view = str_replace('.php', '', $view);
+ $return[] = $base . '/' . $view;
+ }
+ }
+ }
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Returns all views below a partial view.
+ *
+ * Settings $view_root = 'profile' will show all available views under
+ * the "profile" namespace.
+ *
+ * @param string $view_root The root view
+ * @param string $viewtype Optionally specify a view type
+ * other than the current one.
+ *
+ * @return array A list of view names underneath that root view
+ * @todo This is used once in the deprecated get_activity_stream_data() function.
+ * @access private
+ */
+function elgg_view_tree($view_root, $viewtype = "") {
+ global $CONFIG;
+ static $treecache = array();
+
+ // Get viewtype
+ if (!$viewtype) {
+ $viewtype = elgg_get_viewtype();
+ }
+
+ // A little light internal caching
+ if (!empty($treecache[$view_root])) {
+ return $treecache[$view_root];
+ }
+
+ // Examine $CONFIG->views->locations
+ if (isset($CONFIG->views->locations[$viewtype])) {
+ foreach ($CONFIG->views->locations[$viewtype] as $view => $path) {
+ $pos = strpos($view, $view_root);
+ if ($pos === 0) {
+ $treecache[$view_root][] = $view;
+ }
+ }
+ }
+
+ // Now examine core
+ $location = $CONFIG->viewpath;
+ $viewtype = elgg_get_viewtype();
+ $root = $location . $viewtype . '/' . $view_root;
+
+ if (file_exists($root) && is_dir($root)) {
+ $val = elgg_get_views($root, $view_root);
+ if (!is_array($treecache[$view_root])) {
+ $treecache[$view_root] = array();
+ }
+ $treecache[$view_root] = array_merge($treecache[$view_root], $val);
+ }
+
+ return $treecache[$view_root];
+}
+
+/**
+ * Auto-registers views from a location.
+ *
+ * @note Views in plugin/views/ are automatically registered for active plugins.
+ * Plugin authors would only need to call this if optionally including
+ * an entire views structure.
+ *
+ * @param string $view_base Optional The base of the view name without the view type.
+ * @param string $folder Required The folder to begin looking in
+ * @param string $base_location_path The base views directory to use with elgg_set_view_location()
+ * @param string $viewtype The type of view we're looking at (default, rss, etc)
+ *
+ * @return bool returns false if folder can't be read
+ * @since 1.7.0
+ * @see elgg_set_view_location()
+ * @todo This seems overly complicated.
+ * @access private
+ */
+function autoregister_views($view_base, $folder, $base_location_path, $viewtype) {
+ if ($handle = opendir($folder)) {
+ while ($view = readdir($handle)) {
+ if (!in_array($view, array('.', '..', '.svn', 'CVS')) && !is_dir($folder . "/" . $view)) {
+ // this includes png files because some icons are stored within view directories.
+ // See commit [1705]
+ if ((substr_count($view, ".php") > 0) || (substr_count($view, ".png") > 0)) {
+ if (!empty($view_base)) {
+ $view_base_new = $view_base . "/";
+ } else {
+ $view_base_new = "";
+ }
+
+ elgg_set_view_location($view_base_new . str_replace('.php', '', $view),
+ $base_location_path, $viewtype);
+ }
+ } else if (!in_array($view, array('.', '..', '.svn', 'CVS')) && is_dir($folder . "/" . $view)) {
+ if (!empty($view_base)) {
+ $view_base_new = $view_base . "/";
+ } else {
+ $view_base_new = "";
+ }
+ autoregister_views($view_base_new . $view, $folder . "/" . $view,
+ $base_location_path, $viewtype);
+ }
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Add the rss link to the extras when if needed
+ *
+ * @return void
+ * @access private
+ */
+function elgg_views_add_rss_link() {
+ global $autofeed;
+ if (isset($autofeed) && $autofeed == true) {
+ $url = current_page_url();
+ if (substr_count($url, '?')) {
+ $url .= "&view=rss";
+ } else {
+ $url .= "?view=rss";
+ }
+
+ $url = elgg_format_url($url);
+ elgg_register_menu_item('extras', array(
+ 'name' => 'rss',
+ 'text' => elgg_view_icon('rss'),
+ 'href' => $url,
+ 'title' => elgg_echo('feed:rss'),
+ ));
+ }
+}
+
+/**
+ * Registers deprecated views to avoid making some pages from older plugins
+ * completely empty.
+ *
+ * @access private
+ */
+function elgg_views_handle_deprecated_views() {
+ $location = elgg_get_view_location('page_elements/contentwrapper');
+ if ($location === "/var/www/views/") {
+ elgg_extend_view('page_elements/contentwrapper', 'page/elements/wrapper');
+ }
+}
+
+/**
+ * Initialize viewtypes on system boot event
+ * This ensures simplecache is cleared during upgrades. See #2252
+ *
+ * @return void
+ * @access private
+ * @elgg_event_handler boot system
+ */
+function elgg_views_boot() {
+ global $CONFIG;
+
+ elgg_register_simplecache_view('css/ie');
+ elgg_register_simplecache_view('css/ie6');
+ elgg_register_simplecache_view('css/ie7');
+
+ elgg_register_js('jquery', '/vendors/jquery/jquery-1.6.4.min.js', 'head');
+ elgg_register_js('jquery-ui', '/vendors/jquery/jquery-ui-1.8.16.min.js', 'head');
+ elgg_register_js('jquery.form', '/vendors/jquery/jquery.form.js');
+
+ elgg_register_simplecache_view('js/elgg');
+ $elgg_js_url = elgg_get_simplecache_url('js', 'elgg');
+ elgg_register_js('elgg', $elgg_js_url, 'head');
+
+ elgg_load_js('jquery');
+ elgg_load_js('jquery-ui');
+ elgg_load_js('elgg');
+
+ elgg_register_simplecache_view('js/lightbox');
+ $lightbox_js_url = elgg_get_simplecache_url('js', 'lightbox');
+ elgg_register_js('lightbox', $lightbox_js_url);
+
+ elgg_register_simplecache_view('css/lightbox');
+ $lightbox_css_url = elgg_get_simplecache_url('css', 'lightbox');
+ elgg_register_css('lightbox', $lightbox_css_url);
+
+ elgg_register_simplecache_view('css/elgg');
+ $elgg_css_url = elgg_get_simplecache_url('css', 'elgg');
+ elgg_register_css('elgg', $elgg_css_url);
+
+ elgg_load_css('elgg');
+
+ elgg_register_ajax_view('js/languages');
+
+ elgg_register_plugin_hook_handler('output:before', 'layout', 'elgg_views_add_rss_link');
+
+ // discover the built-in view types
+ // @todo the cache is loaded in load_plugins() but we need to know view_types earlier
+ $view_path = $CONFIG->viewpath;
+
+ $views = scandir($view_path);
+
+ foreach ($views as $view) {
+ if ($view[0] !== '.' && is_dir($view_path . $view)) {
+ elgg_register_viewtype($view);
+ }
+ }
+
+ // set default icon sizes - can be overridden in settings.php or with plugin
+ if (!isset($CONFIG->icon_sizes)) {
+ $icon_sizes = array(
+ 'topbar' => array('w' => 16, 'h' => 16, 'square' => TRUE, 'upscale' => TRUE),
+ 'tiny' => array('w' => 25, 'h' => 25, 'square' => TRUE, 'upscale' => TRUE),
+ 'small' => array('w' => 40, 'h' => 40, 'square' => TRUE, 'upscale' => TRUE),
+ 'medium' => array('w' => 100, 'h' => 100, 'square' => TRUE, 'upscale' => TRUE),
+ 'large' => array('w' => 200, 'h' => 200, 'square' => FALSE, 'upscale' => FALSE),
+ 'master' => array('w' => 550, 'h' => 550, 'square' => FALSE, 'upscale' => FALSE),
+ );
+ elgg_set_config('icon_sizes', $icon_sizes);
+ }
+}
+
+elgg_register_event_handler('boot', 'system', 'elgg_views_boot');
+elgg_register_event_handler('init', 'system', 'elgg_views_handle_deprecated_views');
diff --git a/engine/lib/web_services.php b/engine/lib/web_services.php
new file mode 100644
index 000000000..51cad6f39
--- /dev/null
+++ b/engine/lib/web_services.php
@@ -0,0 +1,1454 @@
+<?php
+/**
+ * Elgg web services API
+ * Functions and objects for exposing custom web services.
+ *
+ * @package Elgg.Core
+ * @subpackage WebServicesAPI
+ */
+
+// Primary Services API Server functions
+
+/**
+ * A global array holding API methods.
+ * The structure of this is
+ * $API_METHODS = array (
+ * $method => array (
+ * "description" => "Some human readable description"
+ * "function" = 'my_function_callback'
+ * "parameters" = array (
+ * "variable" = array ( // the order should be the same as the function callback
+ * type => 'int' | 'bool' | 'float' | 'string'
+ * required => true (default) | false
+ * default => value // optional
+ * )
+ * )
+ * "call_method" = 'GET' | 'POST'
+ * "require_api_auth" => true | false (default)
+ * "require_user_auth" => true | false (default)
+ * )
+ * )
+ */
+global $API_METHODS;
+$API_METHODS = array();
+
+/**
+ * Expose a function as a services api call.
+ *
+ * Limitations: Currently cannot expose functions which expect objects.
+ * It also cannot handle arrays of bools or arrays of arrays.
+ * Also, input will be filtered to protect against XSS attacks through the API.
+ *
+ * @param string $method The api name to expose - for example "myapi.dosomething"
+ * @param string $function Your function callback.
+ * @param array $parameters (optional) List of parameters in the same order as in
+ * your function. Default values may be set for parameters which
+ * allow REST api users flexibility in what parameters are passed.
+ * Generally, optional parameters should be after required
+ * parameters.
+ *
+ * This array should be in the format
+ * "variable" = array (
+ * type => 'int' | 'bool' | 'float' | 'string' | 'array'
+ * required => true (default) | false
+ * default => value (optional)
+ * )
+ * @param string $description (optional) human readable description of the function.
+ * @param string $call_method (optional) Define what http method must be used for
+ * this function. Default: GET
+ * @param bool $require_api_auth (optional) (default is false) Does this method
+ * require API authorization? (example: API key)
+ * @param bool $require_user_auth (optional) (default is false) Does this method
+ * require user authorization?
+ *
+ * @return bool
+ */
+function expose_function($method, $function, array $parameters = NULL, $description = "",
+$call_method = "GET", $require_api_auth = false, $require_user_auth = false) {
+
+ global $API_METHODS;
+
+ if (($method == "") || ($function == "")) {
+ $msg = elgg_echo('InvalidParameterException:APIMethodOrFunctionNotSet');
+ throw new InvalidParameterException($msg);
+ }
+
+ // does not check whether this method has already been exposed - good idea?
+ $API_METHODS[$method] = array();
+
+ $API_METHODS[$method]["description"] = $description;
+
+ // does not check whether callable - done in execute_method()
+ $API_METHODS[$method]["function"] = $function;
+
+ if ($parameters != NULL) {
+ if (!is_array($parameters)) {
+ $msg = elgg_echo('InvalidParameterException:APIParametersArrayStructure', array($method));
+ throw new InvalidParameterException($msg);
+ }
+
+ // catch common mistake of not setting up param array correctly
+ $first = current($parameters);
+ if (!is_array($first)) {
+ $msg = elgg_echo('InvalidParameterException:APIParametersArrayStructure', array($method));
+ throw new InvalidParameterException($msg);
+ }
+ }
+
+ if ($parameters != NULL) {
+ // ensure the required flag is set correctly in default case for each parameter
+ foreach ($parameters as $key => $value) {
+ // check if 'required' was specified - if not, make it true
+ if (!array_key_exists('required', $value)) {
+ $parameters[$key]['required'] = true;
+ }
+ }
+
+ $API_METHODS[$method]["parameters"] = $parameters;
+ }
+
+ $call_method = strtoupper($call_method);
+ switch ($call_method) {
+ case 'POST' :
+ $API_METHODS[$method]["call_method"] = 'POST';
+ break;
+ case 'GET' :
+ $API_METHODS[$method]["call_method"] = 'GET';
+ break;
+ default :
+ $msg = elgg_echo('InvalidParameterException:UnrecognisedHttpMethod',
+ array($call_method, $method));
+
+ throw new InvalidParameterException($msg);
+ }
+
+ $API_METHODS[$method]["require_api_auth"] = $require_api_auth;
+
+ $API_METHODS[$method]["require_user_auth"] = $require_user_auth;
+
+ return true;
+}
+
+/**
+ * Unregister an API method
+ *
+ * @param string $method The api name that was exposed
+ *
+ * @since 1.7.0
+ *
+ * @return void
+ */
+function unexpose_function($method) {
+ global $API_METHODS;
+
+ if (isset($API_METHODS[$method])) {
+ unset($API_METHODS[$method]);
+ }
+}
+
+/**
+ * Check that the method call has the proper API and user authentication
+ *
+ * @param string $method The api name that was exposed
+ *
+ * @return true or throws an exception
+ * @throws APIException
+ * @since 1.7.0
+ * @access private
+ */
+function authenticate_method($method) {
+ global $API_METHODS;
+
+ // method must be exposed
+ if (!isset($API_METHODS[$method])) {
+ throw new APIException(elgg_echo('APIException:MethodCallNotImplemented', array($method)));
+ }
+
+ // check API authentication if required
+ if ($API_METHODS[$method]["require_api_auth"] == true) {
+ $api_pam = new ElggPAM('api');
+ if ($api_pam->authenticate() !== true) {
+ throw new APIException(elgg_echo('APIException:APIAuthenticationFailed'));
+ }
+ }
+
+ $user_pam = new ElggPAM('user');
+ $user_auth_result = $user_pam->authenticate(array());
+
+ // check if user authentication is required
+ if ($API_METHODS[$method]["require_user_auth"] == true) {
+ if ($user_auth_result == false) {
+ throw new APIException($user_pam->getFailureMessage(), ErrorResult::$RESULT_FAIL_AUTHTOKEN);
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Executes a method.
+ * A method is a function which you have previously exposed using expose_function.
+ *
+ * @param string $method Method, e.g. "foo.bar"
+ *
+ * @return GenericResult The result of the execution.
+ * @throws APIException, CallException
+ * @access private
+ */
+function execute_method($method) {
+ global $API_METHODS, $CONFIG;
+
+ // method must be exposed
+ if (!isset($API_METHODS[$method])) {
+ $msg = elgg_echo('APIException:MethodCallNotImplemented', array($method));
+ throw new APIException($msg);
+ }
+
+ // function must be callable
+ if (!(isset($API_METHODS[$method]["function"]))
+ || !(is_callable($API_METHODS[$method]["function"]))) {
+
+ $msg = elgg_echo('APIException:FunctionDoesNotExist', array($method));
+ throw new APIException($msg);
+ }
+
+ // check http call method
+ if (strcmp(get_call_method(), $API_METHODS[$method]["call_method"]) != 0) {
+ $msg = elgg_echo('CallException:InvalidCallMethod', array($method,
+ $API_METHODS[$method]["call_method"]));
+
+ throw new CallException($msg);
+ }
+
+ $parameters = get_parameters_for_method($method);
+
+ if (verify_parameters($method, $parameters) == false) {
+ // if verify_parameters fails, it throws exception which is not caught here
+ }
+
+ $serialised_parameters = serialise_parameters($method, $parameters);
+
+ // Execute function: Construct function and calling parameters
+ $function = $API_METHODS[$method]["function"];
+ $serialised_parameters = trim($serialised_parameters, ", ");
+
+ // @todo document why we cannot use call_user_func_array here
+ $result = eval("return $function($serialised_parameters);");
+
+ // Sanity check result
+ // If this function returns an api result itself, just return it
+ if ($result instanceof GenericResult) {
+ return $result;
+ }
+
+ if ($result === false) {
+ $msg = elgg_echo('APIException:FunctionParseError', array($function, $serialised_parameters));
+ throw new APIException($msg);
+ }
+
+ if ($result === NULL) {
+ // If no value
+ $msg = elgg_echo('APIException:FunctionNoReturn', array($function, $serialised_parameters));
+ throw new APIException($msg);
+ }
+
+ // Otherwise assume that the call was successful and return it as a success object.
+ return SuccessResult::getInstance($result);
+}
+
+/**
+ * Get the request method.
+ *
+ * @return string HTTP request method
+ * @access private
+ */
+function get_call_method() {
+ return $_SERVER['REQUEST_METHOD'];
+}
+
+/**
+ * This function analyses all expected parameters for a given method
+ *
+ * This function sanitizes the input parameters and returns them in
+ * an associated array.
+ *
+ * @param string $method The method
+ *
+ * @return array containing parameters as key => value
+ * @access private
+ */
+function get_parameters_for_method($method) {
+ global $API_METHODS;
+
+ $sanitised = array();
+
+ // if there are parameters, sanitize them
+ if (isset($API_METHODS[$method]['parameters'])) {
+ foreach ($API_METHODS[$method]['parameters'] as $k => $v) {
+ $param = get_input($k); // Make things go through the sanitiser
+ if ($param !== '' && $param !== null) {
+ $sanitised[$k] = $param;
+ } else {
+ // parameter wasn't passed so check for default
+ if (isset($v['default'])) {
+ $sanitised[$k] = $v['default'];
+ }
+ }
+ }
+ }
+
+ return $sanitised;
+}
+
+/**
+ * Get POST data
+ * Since this is called through a handler, we need to manually get the post data
+ *
+ * @return POST data as string encoded as multipart/form-data
+ * @access private
+ */
+function get_post_data() {
+
+ $postdata = file_get_contents('php://input');
+
+ return $postdata;
+}
+
+/**
+ * Verify that the required parameters are present
+ *
+ * @param string $method Method name
+ * @param array $parameters List of expected parameters
+ *
+ * @return true on success or exception
+ * @throws APIException
+ * @since 1.7.0
+ * @access private
+ */
+function verify_parameters($method, $parameters) {
+ global $API_METHODS;
+
+ // are there any parameters for this method
+ if (!(isset($API_METHODS[$method]["parameters"]))) {
+ return true; // no so return
+ }
+
+ // check that the parameters were registered correctly and all required ones are there
+ foreach ($API_METHODS[$method]['parameters'] as $key => $value) {
+ // this tests the expose structure: must be array to describe parameter and type must be defined
+ if (!is_array($value) || !isset($value['type'])) {
+
+ $msg = elgg_echo('APIException:InvalidParameter', array($key, $method));
+ throw new APIException($msg);
+ }
+
+ // Check that the variable is present in the request if required
+ if ($value['required'] && !array_key_exists($key, $parameters)) {
+ $msg = elgg_echo('APIException:MissingParameterInMethod', array($key, $method));
+ throw new APIException($msg);
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Serialize an array of parameters for an API method call
+ *
+ * @param string $method API method name
+ * @param array $parameters Array of parameters
+ *
+ * @return string or exception
+ * @throws APIException
+ * @since 1.7.0
+ * @access private
+ */
+function serialise_parameters($method, $parameters) {
+ global $API_METHODS;
+
+ // are there any parameters for this method
+ if (!(isset($API_METHODS[$method]["parameters"]))) {
+ return ''; // if not, return
+ }
+
+ $serialised_parameters = "";
+ foreach ($API_METHODS[$method]['parameters'] as $key => $value) {
+
+ // avoid warning on parameters that are not required and not present
+ if (!isset($parameters[$key])) {
+ continue;
+ }
+
+ // Set variables casting to type.
+ switch (strtolower($value['type']))
+ {
+ case 'int':
+ case 'integer' :
+ $serialised_parameters .= "," . (int)trim($parameters[$key]);
+ break;
+ case 'bool':
+ case 'boolean':
+ // change word false to boolean false
+ if (strcasecmp(trim($parameters[$key]), "false") == 0) {
+ $serialised_parameters .= ',false';
+ } else if ($parameters[$key] == 0) {
+ $serialised_parameters .= ',false';
+ } else {
+ $serialised_parameters .= ',true';
+ }
+
+ break;
+ case 'string':
+ $serialised_parameters .= ",'" . addcslashes(trim($parameters[$key]), "'") . "'";
+ break;
+ case 'float':
+ $serialised_parameters .= "," . (float)trim($parameters[$key]);
+ break;
+ case 'array':
+ // we can handle an array of strings, maybe ints, definitely not booleans or other arrays
+ if (!is_array($parameters[$key])) {
+ $msg = elgg_echo('APIException:ParameterNotArray', array($key));
+ throw new APIException($msg);
+ }
+
+ $array = "array(";
+
+ foreach ($parameters[$key] as $k => $v) {
+ $k = sanitise_string($k);
+ $v = sanitise_string($v);
+
+ $array .= "'$k'=>'$v',";
+ }
+
+ $array = trim($array, ",");
+
+ $array .= ")";
+ $array = ",$array";
+
+ $serialised_parameters .= $array;
+ break;
+ default:
+ $msg = elgg_echo('APIException:UnrecognisedTypeCast', array($value['type'], $key, $method));
+ throw new APIException($msg);
+ }
+ }
+
+ return $serialised_parameters;
+}
+
+// API authorization handlers /////////////////////////////////////////////////////////////////////
+
+/**
+ * PAM: Confirm that the call includes a valid API key
+ *
+ * @return true if good API key - otherwise throws exception
+ *
+ * @return mixed
+ * @throws APIException
+ * @since 1.7.0
+ * @access private
+ */
+function api_auth_key() {
+ global $CONFIG;
+
+ // check that an API key is present
+ $api_key = get_input('api_key');
+ if ($api_key == "") {
+ throw new APIException(elgg_echo('APIException:MissingAPIKey'));
+ }
+
+ // check that it is active
+ $api_user = get_api_user($CONFIG->site_id, $api_key);
+ if (!$api_user) {
+ // key is not active or does not exist
+ throw new APIException(elgg_echo('APIException:BadAPIKey'));
+ }
+
+ // can be used for keeping stats
+ // plugin can also return false to fail this authentication method
+ return elgg_trigger_plugin_hook('api_key', 'use', $api_key, true);
+}
+
+
+/**
+ * PAM: Confirm the HMAC signature
+ *
+ * @return true if success - otherwise throws exception
+ *
+ * @throws SecurityException
+ * @since 1.7.0
+ * @access private
+ */
+function api_auth_hmac() {
+ global $CONFIG;
+
+ // Get api header
+ $api_header = get_and_validate_api_headers();
+
+ // Pull API user details
+ $api_user = get_api_user($CONFIG->site_id, $api_header->api_key);
+
+ if (!$api_user) {
+ throw new SecurityException(elgg_echo('SecurityException:InvalidAPIKey'),
+ ErrorResult::$RESULT_FAIL_APIKEY_INVALID);
+ }
+
+ // Get the secret key
+ $secret_key = $api_user->secret;
+
+ // get the query string
+ $query = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?') + 1);
+
+ // calculate expected HMAC
+ $hmac = calculate_hmac( $api_header->hmac_algo,
+ $api_header->time,
+ $api_header->nonce,
+ $api_header->api_key,
+ $secret_key,
+ $query,
+ $api_header->method == 'POST' ? $api_header->posthash : "");
+
+
+ if ($api_header->hmac !== $hmac) {
+ throw new SecurityException("HMAC is invalid. {$api_header->hmac} != [calc]$hmac");
+ }
+
+ // Now make sure this is not a replay
+ if (cache_hmac_check_replay($hmac)) {
+ throw new SecurityException(elgg_echo('SecurityException:DupePacket'));
+ }
+
+ // Validate post data
+ if ($api_header->method == "POST") {
+ $postdata = get_post_data();
+ $calculated_posthash = calculate_posthash($postdata, $api_header->posthash_algo);
+
+ if (strcmp($api_header->posthash, $calculated_posthash) != 0) {
+ $msg = elgg_echo('SecurityException:InvalidPostHash',
+ array($calculated_posthash, $api_header->posthash));
+
+ throw new SecurityException($msg);
+ }
+ }
+
+ return true;
+}
+
+// HMAC /////////////////////////////////////////////////////////////////////
+
+/**
+ * This function looks at the super-global variable $_SERVER and extracts the various
+ * header variables needed for the HMAC PAM
+ *
+ * @return stdClass Containing all the values.
+ * @throws APIException Detailing any error.
+ * @access private
+ */
+function get_and_validate_api_headers() {
+ $result = new stdClass;
+
+ $result->method = get_call_method();
+ // Only allow these methods
+ if (($result->method != "GET") && ($result->method != "POST")) {
+ throw new APIException(elgg_echo('APIException:NotGetOrPost'));
+ }
+
+ $result->api_key = $_SERVER['HTTP_X_ELGG_APIKEY'];
+ if ($result->api_key == "") {
+ throw new APIException(elgg_echo('APIException:MissingAPIKey'));
+ }
+
+ $result->hmac = $_SERVER['HTTP_X_ELGG_HMAC'];
+ if ($result->hmac == "") {
+ throw new APIException(elgg_echo('APIException:MissingHmac'));
+ }
+
+ $result->hmac_algo = $_SERVER['HTTP_X_ELGG_HMAC_ALGO'];
+ if ($result->hmac_algo == "") {
+ throw new APIException(elgg_echo('APIException:MissingHmacAlgo'));
+ }
+
+ $result->time = $_SERVER['HTTP_X_ELGG_TIME'];
+ if ($result->time == "") {
+ throw new APIException(elgg_echo('APIException:MissingTime'));
+ }
+
+ // Must have been sent within 25 hour period.
+ // 25 hours is more than enough to handle server clock drift.
+ // This values determines how long the HMAC cache needs to store previous
+ // signatures. Heavy use of HMAC is better handled with a shorter sig lifetime.
+ // See cache_hmac_check_replay()
+ if (($result->time < (time() - 90000)) || ($result->time > (time() + 90000))) {
+ throw new APIException(elgg_echo('APIException:TemporalDrift'));
+ }
+
+ $result->nonce = $_SERVER['HTTP_X_ELGG_NONCE'];
+ if ($result->nonce == "") {
+ throw new APIException(elgg_echo('APIException:MissingNonce'));
+ }
+
+ if ($result->method == "POST") {
+ $result->posthash = $_SERVER['HTTP_X_ELGG_POSTHASH'];
+ if ($result->posthash == "") {
+ throw new APIException(elgg_echo('APIException:MissingPOSTHash'));
+ }
+
+ $result->posthash_algo = $_SERVER['HTTP_X_ELGG_POSTHASH_ALGO'];
+ if ($result->posthash_algo == "") {
+ throw new APIException(elgg_echo('APIException:MissingPOSTAlgo'));
+ }
+
+ $result->content_type = $_SERVER['CONTENT_TYPE'];
+ if ($result->content_type == "") {
+ throw new APIException(elgg_echo('APIException:MissingContentType'));
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * Map various algorithms to their PHP equivs.
+ * This also gives us an easy way to disable algorithms.
+ *
+ * @param string $algo The algorithm
+ *
+ * @return string The php algorithm
+ * @throws APIException if an algorithm is not supported.
+ * @access private
+ */
+function map_api_hash($algo) {
+ $algo = strtolower(sanitise_string($algo));
+ $supported_algos = array(
+ "md5" => "md5", // @todo Consider phasing this out
+ "sha" => "sha1", // alias for sha1
+ "sha1" => "sha1",
+ "sha256" => "sha256"
+ );
+
+ if (array_key_exists($algo, $supported_algos)) {
+ return $supported_algos[$algo];
+ }
+
+ throw new APIException(elgg_echo('APIException:AlgorithmNotSupported', array($algo)));
+}
+
+/**
+ * Calculate the HMAC for the http request.
+ * This function signs an api request using the information provided. The signature returned
+ * has been base64 encoded and then url encoded.
+ *
+ * @param string $algo The HMAC algorithm used
+ * @param string $time String representation of unix time
+ * @param string $nonce Nonce
+ * @param string $api_key Your api key
+ * @param string $secret_key Your private key
+ * @param string $get_variables URLEncoded string representation of the get variable parameters,
+ * eg "method=user&guid=2"
+ * @param string $post_hash Optional sha1 hash of the post data.
+ *
+ * @return string The HMAC signature
+ * @access private
+ */
+function calculate_hmac($algo, $time, $nonce, $api_key, $secret_key,
+$get_variables, $post_hash = "") {
+
+ global $CONFIG;
+
+ elgg_log("HMAC Parts: $algo, $time, $api_key, $secret_key, $get_variables, $post_hash");
+
+ $ctx = hash_init(map_api_hash($algo), HASH_HMAC, $secret_key);
+
+ hash_update($ctx, trim($time));
+ hash_update($ctx, trim($nonce));
+ hash_update($ctx, trim($api_key));
+ hash_update($ctx, trim($get_variables));
+ if (trim($post_hash) != "") {
+ hash_update($ctx, trim($post_hash));
+ }
+
+ return urlencode(base64_encode(hash_final($ctx, true)));
+}
+
+/**
+ * Calculate a hash for some post data.
+ *
+ * @todo Work out how to handle really large bits of data.
+ *
+ * @param string $postdata The post data.
+ * @param string $algo The algorithm used.
+ *
+ * @return string The hash.
+ * @access private
+ */
+function calculate_posthash($postdata, $algo) {
+ $ctx = hash_init(map_api_hash($algo));
+
+ hash_update($ctx, $postdata);
+
+ return hash_final($ctx);
+}
+
+/**
+ * This function will do two things. Firstly it verifies that a HMAC signature
+ * hasn't been seen before, and secondly it will add the given hmac to the cache.
+ *
+ * @param string $hmac The hmac string.
+ *
+ * @return bool True if replay detected, false if not.
+ * @access private
+ */
+function cache_hmac_check_replay($hmac) {
+ // cache lifetime is 25 hours (this should be related to the time drift
+ // allowed in get_and_validate_headers
+ $cache = new ElggHMACCache(90000);
+
+ if (!$cache->load($hmac)) {
+ $cache->save($hmac, $hmac);
+
+ return false;
+ }
+
+ return true;
+}
+
+// API key functions /////////////////////////////////////////////////////////////////////
+
+/**
+ * Generate a new API user for a site, returning a new keypair on success.
+ *
+ * @param int $site_guid The GUID of the site. (default is current site)
+ *
+ * @return stdClass object or false
+ */
+function create_api_user($site_guid) {
+ global $CONFIG;
+
+ if (!isset($site_guid)) {
+ $site_guid = $CONFIG->site_id;
+ }
+
+ $site_guid = (int)$site_guid;
+
+ $public = sha1(rand() . $site_guid . microtime());
+ $secret = sha1(rand() . $site_guid . microtime() . $public);
+
+ $insert = insert_data("INSERT into {$CONFIG->dbprefix}api_users
+ (site_guid, api_key, secret) values
+ ($site_guid, '$public', '$secret')");
+
+ if ($insert) {
+ return get_api_user($site_guid, $public);
+ }
+
+ return false;
+}
+
+/**
+ * Find an API User's details based on the provided public api key.
+ * These users are not users in the traditional sense.
+ *
+ * @param int $site_guid The GUID of the site.
+ * @param string $api_key The API Key
+ *
+ * @return mixed stdClass representing the database row or false.
+ */
+function get_api_user($site_guid, $api_key) {
+ global $CONFIG;
+
+ $api_key = sanitise_string($api_key);
+ $site_guid = (int)$site_guid;
+
+ $query = "SELECT * from {$CONFIG->dbprefix}api_users"
+ . " where api_key='$api_key' and site_guid=$site_guid and active=1";
+
+ return get_data_row($query);
+}
+
+/**
+ * Revoke an api user key.
+ *
+ * @param int $site_guid The GUID of the site.
+ * @param string $api_key The API Key (public).
+ *
+ * @return bool
+ */
+function remove_api_user($site_guid, $api_key) {
+ global $CONFIG;
+
+ $keypair = get_api_user($site_guid, $api_key);
+ if ($keypair) {
+ return delete_data("DELETE from {$CONFIG->dbprefix}api_users where id={$keypair->id}");
+ }
+
+ return false;
+}
+
+
+// User Authorization functions
+
+/**
+ * Check the user token
+ * This examines whether an authentication token is present and returns true if
+ * it is present and is valid. The user gets logged in so with the current
+ * session code of Elgg, that user will be logged out of all other sessions.
+ *
+ * @return bool
+ * @access private
+ */
+function pam_auth_usertoken() {
+ global $CONFIG;
+
+ $token = get_input('auth_token');
+ if (!$token) {
+ return false;
+ }
+
+ $validated_userid = validate_user_token($token, $CONFIG->site_id);
+
+ if ($validated_userid) {
+ $u = get_entity($validated_userid);
+
+ // Could we get the user?
+ if (!$u) {
+ return false;
+ }
+
+ // Not an elgg user
+ if ((!$u instanceof ElggUser)) {
+ return false;
+ }
+
+ // User is banned
+ if ($u->isBanned()) {
+ return false;
+ }
+
+ // Fail if we couldn't log the user in
+ if (!login($u)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * See if the user has a valid login sesson
+ *
+ * @return bool
+ * @access private
+ */
+function pam_auth_session() {
+ return elgg_is_logged_in();
+}
+
+// user token functions
+
+/**
+ * Obtain a token for a user.
+ *
+ * @param string $username The username
+ * @param int $expire Minutes until token expires (default is 60 minutes)
+ *
+ * @return bool
+ */
+function create_user_token($username, $expire = 60) {
+ global $CONFIG;
+
+ $site_guid = $CONFIG->site_id;
+ $user = get_user_by_username($username);
+ $time = time();
+ $time += 60 * $expire;
+ $token = md5(rand() . microtime() . $username . $time . $site_guid);
+
+ if (!$user) {
+ return false;
+ }
+
+ if (insert_data("INSERT into {$CONFIG->dbprefix}users_apisessions
+ (user_guid, site_guid, token, expires) values
+ ({$user->guid}, $site_guid, '$token', '$time')
+ on duplicate key update token='$token', expires='$time'")) {
+ return $token;
+ }
+
+ return false;
+}
+
+/**
+ * Get all tokens attached to a user
+ *
+ * @param int $user_guid The user GUID
+ * @param int $site_guid The ID of the site (default is current site)
+ *
+ * @return false if none available or array of stdClass objects
+ * (see users_apisessions schema for available variables in objects)
+ * @since 1.7.0
+ */
+function get_user_tokens($user_guid, $site_guid) {
+ global $CONFIG;
+
+ if (!isset($site_guid)) {
+ $site_guid = $CONFIG->site_id;
+ }
+
+ $site_guid = (int)$site_guid;
+ $user_guid = (int)$user_guid;
+
+ $tokens = get_data("SELECT * from {$CONFIG->dbprefix}users_apisessions
+ where user_guid=$user_guid and site_guid=$site_guid");
+
+ return $tokens;
+}
+
+/**
+ * Validate a token against a given site.
+ *
+ * A token registered with one site can not be used from a
+ * different apikey(site), so be aware of this during development.
+ *
+ * @param string $token The Token.
+ * @param int $site_guid The ID of the site (default is current site)
+ *
+ * @return mixed The user id attached to the token if not expired or false.
+ */
+function validate_user_token($token, $site_guid) {
+ global $CONFIG;
+
+ if (!isset($site_guid)) {
+ $site_guid = $CONFIG->site_id;
+ }
+
+ $site_guid = (int)$site_guid;
+ $token = sanitise_string($token);
+
+ $time = time();
+
+ $user = get_data_row("SELECT * from {$CONFIG->dbprefix}users_apisessions
+ where token='$token' and site_guid=$site_guid and $time < expires");
+
+ if ($user) {
+ return $user->user_guid;
+ }
+
+ return false;
+}
+
+/**
+ * Remove user token
+ *
+ * @param string $token The toekn
+ * @param int $site_guid The ID of the site (default is current site)
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function remove_user_token($token, $site_guid) {
+ global $CONFIG;
+
+ if (!isset($site_guid)) {
+ $site_guid = $CONFIG->site_id;
+ }
+
+ $site_guid = (int)$site_guid;
+ $token = sanitise_string($token);
+
+ return delete_data("DELETE from {$CONFIG->dbprefix}users_apisessions
+ where site_guid=$site_guid and token='$token'");
+}
+
+/**
+ * Remove expired tokens
+ *
+ * @return bool
+ * @since 1.7.0
+ */
+function remove_expired_user_tokens() {
+ global $CONFIG;
+
+ $site_guid = $CONFIG->site_id;
+
+ $time = time();
+
+ return delete_data("DELETE from {$CONFIG->dbprefix}users_apisessions
+ where site_guid=$site_guid and expires < $time");
+}
+
+// Client api functions
+
+/**
+ * Utility function to serialise a header array into its text representation.
+ *
+ * @param array $headers The array of headers "key" => "value"
+ *
+ * @return string
+ * @access private
+ */
+function serialise_api_headers(array $headers) {
+ $headers_str = "";
+
+ foreach ($headers as $k => $v) {
+ $headers_str .= trim($k) . ": " . trim($v) . "\r\n";
+ }
+
+ return trim($headers_str);
+}
+
+/**
+ * Send a raw API call to an elgg api endpoint.
+ *
+ * @param array $keys The api keys.
+ * @param string $url URL of the endpoint.
+ * @param array $call Associated array of "variable" => "value"
+ * @param string $method GET or POST
+ * @param string $post_data The post data
+ * @param string $content_type The content type
+ *
+ * @return string
+ */
+function send_api_call(array $keys, $url, array $call, $method = 'GET', $post_data = '',
+$content_type = 'application/octet-stream') {
+
+ global $CONFIG;
+
+ $headers = array();
+ $encoded_params = array();
+
+ $method = strtoupper($method);
+ switch (strtoupper($method)) {
+ case 'GET' :
+ case 'POST' :
+ break;
+ default:
+ $msg = elgg_echo('NotImplementedException:CallMethodNotImplemented', array($method));
+ throw new NotImplementedException($msg);
+ }
+
+ // Time
+ $time = time();
+
+ // Nonce
+ $nonce = uniqid('');
+
+ // URL encode all the parameters
+ foreach ($call as $k => $v) {
+ $encoded_params[] = urlencode($k) . '=' . urlencode($v);
+ }
+
+ $params = implode('&', $encoded_params);
+
+ // Put together the query string
+ $url = $url . "?" . $params;
+
+ // Construct headers
+ $posthash = "";
+ if ($method == 'POST') {
+ $posthash = calculate_posthash($post_data, 'md5');
+ }
+
+ if ((isset($keys['public'])) && (isset($keys['private']))) {
+ $headers['X-Elgg-apikey'] = $keys['public'];
+ $headers['X-Elgg-time'] = $time;
+ $headers['X-Elgg-nonce'] = $nonce;
+ $headers['X-Elgg-hmac-algo'] = 'sha1';
+ $headers['X-Elgg-hmac'] = calculate_hmac('sha1',
+ $time,
+ $nonce,
+ $keys['public'],
+ $keys['private'],
+ $params,
+ $posthash
+ );
+ }
+ if ($method == 'POST') {
+ $headers['X-Elgg-posthash'] = $posthash;
+ $headers['X-Elgg-posthash-algo'] = 'md5';
+
+ $headers['Content-type'] = $content_type;
+ $headers['Content-Length'] = strlen($post_data);
+ }
+
+ // Opt array
+ $http_opts = array(
+ 'method' => $method,
+ 'header' => serialise_api_headers($headers)
+ );
+ if ($method == 'POST') {
+ $http_opts['content'] = $post_data;
+ }
+
+ $opts = array('http' => $http_opts);
+
+ // Send context
+ $context = stream_context_create($opts);
+
+ // Send the query and get the result and decode.
+ elgg_log("APICALL: $url");
+ $results = file_get_contents($url, false, $context);
+
+ return $results;
+}
+
+/**
+ * Send a GET call
+ *
+ * @param string $url URL of the endpoint.
+ * @param array $call Associated array of "variable" => "value"
+ * @param array $keys The keys dependant on chosen authentication method
+ *
+ * @return string
+ */
+function send_api_get_call($url, array $call, array $keys) {
+ return send_api_call($keys, $url, $call);
+}
+
+/**
+ * Send a GET call
+ *
+ * @param string $url URL of the endpoint.
+ * @param array $call Associated array of "variable" => "value"
+ * @param array $keys The keys dependant on chosen authentication method
+ * @param string $post_data The post data
+ * @param string $content_type The content type
+ *
+ * @return string
+ */
+function send_api_post_call($url, array $call, array $keys, $post_data,
+$content_type = 'application/octet-stream') {
+
+ return send_api_call($keys, $url, $call, 'POST', $post_data, $content_type);
+}
+
+/**
+ * Return a key array suitable for the API client using the standard
+ * authentication method based on api-keys and secret keys.
+ *
+ * @param string $secret_key Your secret key
+ * @param string $api_key Your api key
+ *
+ * @return array
+ */
+function get_standard_api_key_array($secret_key, $api_key) {
+ return array('public' => $api_key, 'private' => $secret_key);
+}
+
+// System functions
+
+/**
+ * Simple api to return a list of all api's installed on the system.
+ *
+ * @return array
+ * @access private
+ */
+function list_all_apis() {
+ global $API_METHODS;
+
+ // sort first
+ ksort($API_METHODS);
+
+ return $API_METHODS;
+}
+
+/**
+ * The auth.gettoken API.
+ * This API call lets a user log in, returning an authentication token which can be used
+ * to authenticate a user for a period of time. It is passed in future calls as the parameter
+ * auth_token.
+ *
+ * @param string $username Username
+ * @param string $password Clear text password
+ *
+ * @return string Token string or exception
+ * @throws SecurityException
+ * @access private
+ */
+function auth_gettoken($username, $password) {
+ // check if username is an email address
+ if (is_email_address($username)) {
+ $users = get_user_by_email($username);
+
+ // check if we have a unique user
+ if (is_array($users) && (count($users) == 1)) {
+ $username = $users[0]->username;
+ }
+ }
+
+ // validate username and password
+ if (true === elgg_authenticate($username, $password)) {
+ $token = create_user_token($username);
+ if ($token) {
+ return $token;
+ }
+ }
+
+ throw new SecurityException(elgg_echo('SecurityException:authenticationfailed'));
+}
+
+// Error handler functions
+
+/** Define a global array of errors */
+$ERRORS = array();
+
+/**
+ * API PHP Error handler function.
+ * This function acts as a wrapper to catch and report PHP error messages.
+ *
+ * @see http://uk3.php.net/set-error-handler
+ *
+ * @param int $errno Error number
+ * @param string $errmsg Human readable message
+ * @param string $filename Filename
+ * @param int $linenum Line number
+ * @param array $vars Vars
+ *
+ * @return void
+ * @access private
+ *
+ * @throws Exception
+ */
+function _php_api_error_handler($errno, $errmsg, $filename, $linenum, $vars) {
+ global $ERRORS;
+
+ $error = date("Y-m-d H:i:s (T)") . ": \"" . $errmsg . "\" in file "
+ . $filename . " (line " . $linenum . ")";
+
+ switch ($errno) {
+ case E_USER_ERROR:
+ error_log("ERROR: " . $error);
+ $ERRORS[] = "ERROR: " . $error;
+
+ // Since this is a fatal error, we want to stop any further execution but do so gracefully.
+ throw new Exception("ERROR: " . $error);
+ break;
+
+ case E_WARNING :
+ case E_USER_WARNING :
+ error_log("WARNING: " . $error);
+ $ERRORS[] = "WARNING: " . $error;
+ break;
+
+ default:
+ error_log("DEBUG: " . $error);
+ $ERRORS[] = "DEBUG: " . $error;
+ }
+}
+
+/**
+ * API PHP Exception handler.
+ * This is a generic exception handler for PHP exceptions. This will catch any
+ * uncaught exception, end API execution and return the result to the requestor
+ * as an ErrorResult in the requested format.
+ *
+ * @param Exception $exception Exception
+ *
+ * @return void
+ * @access private
+ */
+function _php_api_exception_handler($exception) {
+
+ error_log("*** FATAL EXCEPTION (API) *** : " . $exception);
+
+ $code = $exception->getCode() == 0 ? ErrorResult::$RESULT_FAIL : $exception->getCode();
+ $result = new ErrorResult($exception->getMessage(), $code, NULL);
+
+ echo elgg_view_page($exception->getMessage(), elgg_view("api/output", array("result" => $result)));
+}
+
+
+// Services handler
+
+/**
+ * Services handler - turns request over to the registered handler
+ * If no handler is found, this returns a 404 error
+ *
+ * @param string $handler Handler name
+ * @param array $request Request string
+ *
+ * @return void
+ * @access private
+ */
+function service_handler($handler, $request) {
+ global $CONFIG;
+
+ elgg_set_context('api');
+
+ $request = explode('/', $request);
+
+ // after the handler, the first identifier is response format
+ // ex) http://example.org/services/api/rest/json/?method=test
+ $response_format = array_shift($request);
+ // Which view - xml, json, ...
+ if ($response_format && elgg_is_valid_view_type($response_format)) {
+ elgg_set_viewtype($response_format);
+ } else {
+ // default to json
+ elgg_set_viewtype("json");
+ }
+
+ if (!isset($CONFIG->servicehandler) || empty($handler)) {
+ // no handlers set or bad url
+ header("HTTP/1.0 404 Not Found");
+ exit;
+ } else if (isset($CONFIG->servicehandler[$handler]) && is_callable($CONFIG->servicehandler[$handler])) {
+ $function = $CONFIG->servicehandler[$handler];
+ call_user_func($function, $request, $handler);
+ } else {
+ // no handler for this web service
+ header("HTTP/1.0 404 Not Found");
+ exit;
+ }
+}
+
+/**
+ * Registers a web services handler
+ *
+ * @param string $handler Web services type
+ * @param string $function Your function name
+ *
+ * @return bool Depending on success
+ * @since 1.7.0
+ */
+function register_service_handler($handler, $function) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->servicehandler)) {
+ $CONFIG->servicehandler = array();
+ }
+ if (is_callable($function, true)) {
+ $CONFIG->servicehandler[$handler] = $function;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Remove a web service
+ * To replace a web service handler, register the desired handler over the old on
+ * with register_service_handler().
+ *
+ * @param string $handler web services type
+ *
+ * @return void
+ * @since 1.7.0
+ */
+function unregister_service_handler($handler) {
+ global $CONFIG;
+
+ if (isset($CONFIG->servicehandler, $CONFIG->servicehandler[$handler])) {
+ unset($CONFIG->servicehandler[$handler]);
+ }
+}
+
+/**
+ * REST API handler
+ *
+ * @return void
+ * @access private
+ *
+ * @throws SecurityException|APIException
+ */
+function rest_handler() {
+ global $CONFIG;
+
+ // Register the error handler
+ error_reporting(E_ALL);
+ set_error_handler('_php_api_error_handler');
+
+ // Register a default exception handler
+ set_exception_handler('_php_api_exception_handler');
+
+ // Check to see if the api is available
+ if ((isset($CONFIG->disable_api)) && ($CONFIG->disable_api == true)) {
+ throw new SecurityException(elgg_echo('SecurityException:APIAccessDenied'));
+ }
+
+ // plugins should return true to control what API and user authentication handlers are registered
+ if (elgg_trigger_plugin_hook('rest', 'init', null, false) == false) {
+ // for testing from a web browser, you can use the session PAM
+ // do not use for production sites!!
+ //register_pam_handler('pam_auth_session');
+
+ // user token can also be used for user authentication
+ register_pam_handler('pam_auth_usertoken');
+
+ // simple API key check
+ register_pam_handler('api_auth_key', "sufficient", "api");
+ // hmac
+ register_pam_handler('api_auth_hmac', "sufficient", "api");
+ }
+
+ // Get parameter variables
+ $method = get_input('method');
+ $result = null;
+
+ // this will throw an exception if authentication fails
+ authenticate_method($method);
+
+ $result = execute_method($method);
+
+
+ if (!($result instanceof GenericResult)) {
+ throw new APIException(elgg_echo('APIException:ApiResultUnknown'));
+ }
+
+ // Output the result
+ echo elgg_view_page($method, elgg_view("api/output", array("result" => $result)));
+}
+
+// Initialization
+
+/**
+ * Unit tests for API
+ *
+ * @param string $hook unit_test
+ * @param string $type system
+ * @param mixed $value Array of tests
+ * @param mixed $params Params
+ *
+ * @return array
+ * @access private
+ */
+function api_unit_test($hook, $type, $value, $params) {
+ global $CONFIG;
+
+ $value[] = $CONFIG->path . 'engine/tests/services/api.php';
+ return $value;
+}
+
+/**
+ * Initialise the API subsystem.
+ *
+ * @return void
+ * @access private
+ */
+function api_init() {
+ // Register a page handler, so we can have nice URLs
+ register_service_handler('rest', 'rest_handler');
+
+ elgg_register_plugin_hook_handler('unit_test', 'system', 'api_unit_test');
+
+ // expose the list of api methods
+ expose_function("system.api.list", "list_all_apis", NULL,
+ elgg_echo("system.api.list"), "GET", false, false);
+
+ // The authentication token api
+ expose_function(
+ "auth.gettoken",
+ "auth_gettoken",
+ array(
+ 'username' => array ('type' => 'string'),
+ 'password' => array ('type' => 'string'),
+ ),
+ elgg_echo('auth.gettoken'),
+ 'POST',
+ false,
+ false
+ );
+}
+
+
+elgg_register_event_handler('init', 'system', 'api_init');
diff --git a/engine/lib/widgets.php b/engine/lib/widgets.php
new file mode 100644
index 000000000..86b3e8219
--- /dev/null
+++ b/engine/lib/widgets.php
@@ -0,0 +1,420 @@
+<?php
+/**
+ * Elgg widgets library.
+ * Contains code for handling widgets.
+ *
+ * @package Elgg.Core
+ * @subpackage Widgets
+ */
+
+/**
+ * Get widgets for a particular context
+ *
+ * The widgets are ordered for display and grouped in columns.
+ * $widgets = elgg_get_widgets(elgg_get_logged_in_user_guid(), 'dashboard');
+ * $first_column_widgets = $widgets[1];
+ *
+ * @param int $user_guid The owner user GUID
+ * @param string $context The context (profile, dashboard, etc)
+ *
+ * @return array An 2D array of ElggWidget objects
+ * @since 1.8.0
+ */
+function elgg_get_widgets($user_guid, $context) {
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'widget',
+ 'owner_guid' => $user_guid,
+ 'private_setting_name' => 'context',
+ 'private_setting_value' => $context,
+ 'limit' => 0
+ );
+ $widgets = elgg_get_entities_from_private_settings($options);
+ if (!$widgets) {
+ return array();
+ }
+
+ $sorted_widgets = array();
+ foreach ($widgets as $widget) {
+ if (!isset($sorted_widgets[(int)$widget->column])) {
+ $sorted_widgets[(int)$widget->column] = array();
+ }
+ $sorted_widgets[(int)$widget->column][$widget->order] = $widget;
+ }
+
+ foreach ($sorted_widgets as $col => $widgets) {
+ ksort($sorted_widgets[$col]);
+ }
+
+ return $sorted_widgets;
+}
+
+/**
+ * Create a new widget instance
+ *
+ * @param int $owner_guid GUID of entity that owns this widget
+ * @param string $handler The handler for this widget
+ * @param string $context The context for this widget
+ * @param int $access_id If not specified, it is set to the default access level
+ *
+ * @return int|false Widget GUID or false on failure
+ * @since 1.8.0
+ */
+function elgg_create_widget($owner_guid, $handler, $context, $access_id = null) {
+ if (empty($owner_guid) || empty($handler) || !elgg_is_widget_type($handler)) {
+ return false;
+ }
+
+ $owner = get_entity($owner_guid);
+ if (!$owner) {
+ return false;
+ }
+
+ $widget = new ElggWidget;
+ $widget->owner_guid = $owner_guid;
+ $widget->container_guid = $owner_guid; // @todo - will this work for group widgets
+ if (isset($access_id)) {
+ $widget->access_id = $access_id;
+ } else {
+ $widget->access_id = get_default_access();
+ }
+
+ if (!$widget->save()) {
+ return false;
+ }
+
+ // private settings cannot be set until ElggWidget saved
+ $widget->handler = $handler;
+ $widget->context = $context;
+
+ return $widget->getGUID();
+}
+
+/**
+ * Can the user edit the widget layout
+ *
+ * Triggers a 'permissions_check', 'widget_layout' plugin hook
+ *
+ * @param string $context The widget context
+ * @param int $user_guid The GUID of the user (0 for logged in user)
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_can_edit_widget_layout($context, $user_guid = 0) {
+
+ $user = get_entity((int)$user_guid);
+ if (!$user) {
+ $user = elgg_get_logged_in_user_entity();
+ }
+
+ $return = false;
+ if (elgg_is_admin_logged_in()) {
+ $return = true;
+ }
+ if (elgg_get_page_owner_guid() == $user->guid) {
+ $return = true;
+ }
+
+ $params = array(
+ 'user' => $user,
+ 'context' => $context,
+ 'page_owner' => elgg_get_page_owner_entity()
+ );
+ return elgg_trigger_plugin_hook('permissions_check', 'widget_layout', $params, $return);
+}
+
+/**
+ * Regsiter a widget type
+ *
+ * This should be called by plugins in their init function.
+ *
+ * @param string $handler The identifier for the widget handler
+ * @param string $name The name of the widget type
+ * @param string $description A description for the widget type
+ * @param string $context A comma-separated list of contexts where this
+ * widget is allowed (default: 'all')
+ * @param bool $multiple Whether or not multiple instances of this widget
+ * are allowed in a single layout (default: false)
+ *
+ * @return bool
+ * @since 1.8.0
+ */
+function elgg_register_widget_type($handler, $name, $description, $context = "all", $multiple = false) {
+
+ if (!$handler || !$name) {
+ return false;
+ }
+
+ global $CONFIG;
+
+ if (!isset($CONFIG->widgets)) {
+ $CONFIG->widgets = new stdClass;
+ }
+ if (!isset($CONFIG->widgets->handlers)) {
+ $CONFIG->widgets->handlers = array();
+ }
+
+ $handlerobj = new stdClass;
+ $handlerobj->name = $name;
+ $handlerobj->description = $description;
+ $handlerobj->context = is_array($context) ? $context : explode(",", $context);
+ $handlerobj->multiple = $multiple;
+
+ $CONFIG->widgets->handlers[$handler] = $handlerobj;
+
+ return true;
+}
+
+/**
+ * Remove a widget type
+ *
+ * @param string $handler The identifier for the widget
+ *
+ * @return void
+ * @since 1.8.0
+ */
+function elgg_unregister_widget_type($handler) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->widgets)) {
+ return;
+ }
+
+ if (!isset($CONFIG->widgets->handlers)) {
+ return;
+ }
+
+ if (isset($CONFIG->widgets->handlers[$handler])) {
+ unset($CONFIG->widgets->handlers[$handler]);
+ }
+}
+
+/**
+ * Has a widget type with the specified handler been registered
+ *
+ * @param string $handler The widget handler identifying string
+ *
+ * @return bool Whether or not that widget type exists
+ * @since 1.8.0
+ */
+function elgg_is_widget_type($handler) {
+ global $CONFIG;
+
+ if (!empty($CONFIG->widgets) &&
+ !empty($CONFIG->widgets->handlers) &&
+ is_array($CONFIG->widgets->handlers) &&
+ array_key_exists($handler, $CONFIG->widgets->handlers)) {
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Get the widget types for a context
+ *
+ * The widget types are stdClass objects.
+ *
+ * @param string $context The widget context or empty string for current context
+ * @param bool $exact Only return widgets registered for this context (false)
+ *
+ * @return array
+ * @since 1.8.0
+ */
+function elgg_get_widget_types($context = "", $exact = false) {
+ global $CONFIG;
+
+ if (empty($CONFIG->widgets) ||
+ empty($CONFIG->widgets->handlers) ||
+ !is_array($CONFIG->widgets->handlers)) {
+ // no widgets
+ return array();
+ }
+
+ if (!$context) {
+ $context = elgg_get_context();
+ }
+
+ $widgets = array();
+ foreach ($CONFIG->widgets->handlers as $key => $handler) {
+ if ($exact) {
+ if (in_array($context, $handler->context)) {
+ $widgets[$key] = $handler;
+ }
+ } else {
+ if (in_array('all', $handler->context) || in_array($context, $handler->context)) {
+ $widgets[$key] = $handler;
+ }
+ }
+ }
+
+ return $widgets;
+}
+
+/**
+ * Regsiter entity of object, widget as ElggWidget objects
+ *
+ * @return void
+ * @access private
+ */
+function elgg_widget_run_once() {
+ add_subtype("object", "widget", "ElggWidget");
+}
+
+/**
+ * Function to initialize widgets functionality
+ *
+ * @return void
+ * @access private
+ */
+function elgg_widgets_init() {
+ elgg_register_action('widgets/save');
+ elgg_register_action('widgets/add');
+ elgg_register_action('widgets/move');
+ elgg_register_action('widgets/delete');
+ elgg_register_action('widgets/upgrade', '', 'admin');
+
+ run_function_once("elgg_widget_run_once");
+}
+
+/**
+ * Gets a list of events to create default widgets for and
+ * register menu items for default widgets with the admin section.
+ *
+ * A plugin that wants to register a new context for default widgets should
+ * register for the plugin hook 'get_list', 'default_widgets'. The handler
+ * can register the new type of default widgets by adding an associate array to
+ * the return value array like this:
+ * array(
+ * 'name' => elgg_echo('profile'),
+ * 'widget_context' => 'profile',
+ * 'widget_columns' => 3,
+ *
+ * 'event' => 'create',
+ * 'entity_type' => 'user',
+ * 'entity_subtype' => ELGG_ENTITIES_ANY_VALUE,
+ * );
+ *
+ * The first set of keys define information about the new type of default
+ * widgets and the second set determine what event triggers the creation of the
+ * new widgets.
+ *
+ * @return void
+ * @access private
+ */
+function elgg_default_widgets_init() {
+ global $CONFIG;
+ $default_widgets = elgg_trigger_plugin_hook('get_list', 'default_widgets', null, array());
+
+ $CONFIG->default_widget_info = $default_widgets;
+
+ if ($default_widgets) {
+ elgg_register_admin_menu_item('configure', 'default_widgets', 'appearance');
+
+ // override permissions for creating widget on logged out / just created entities
+ elgg_register_plugin_hook_handler('container_permissions_check', 'object', 'elgg_default_widgets_permissions_override');
+
+ // only register the callback once per event
+ $events = array();
+ foreach ($default_widgets as $info) {
+ $events[$info['event'] . ',' . $info['entity_type']] = $info;
+ }
+ foreach ($events as $info) {
+ elgg_register_event_handler($info['event'], $info['entity_type'], 'elgg_create_default_widgets');
+ }
+ }
+}
+
+/**
+ * Creates default widgets
+ *
+ * This plugin hook handler is registered for events based on what kinds of
+ * default widgets have been registered. See elgg_default_widgets_init() for
+ * information on registering new default widget contexts.
+ *
+ * @param string $event The event
+ * @param string $type The type of object
+ * @param ElggEntity $entity The entity being created
+ * @return void
+ * @access private
+ */
+function elgg_create_default_widgets($event, $type, $entity) {
+ $default_widget_info = elgg_get_config('default_widget_info');
+
+ if (!$default_widget_info || !$entity) {
+ return;
+ }
+
+ $type = $entity->getType();
+ $subtype = $entity->getSubtype();
+
+ // event is already guaranteed by the hook registration.
+ // need to check subtype and type.
+ foreach ($default_widget_info as $info) {
+ if ($info['entity_type'] == $type) {
+ if ($info['entity_subtype'] == ELGG_ENTITIES_ANY_VALUE || $info['entity_subtype'] == $subtype) {
+
+ // need to be able to access everything
+ $old_ia = elgg_set_ignore_access(true);
+ elgg_push_context('create_default_widgets');
+
+ // pull in by widget context with widget owners as the site
+ // not using elgg_get_widgets() because it sorts by columns and we don't care right now.
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'widget',
+ 'owner_guid' => elgg_get_site_entity()->guid,
+ 'private_setting_name' => 'context',
+ 'private_setting_value' => $info['widget_context'],
+ 'limit' => 0
+ );
+
+ $widgets = elgg_get_entities_from_private_settings($options);
+ /* @var ElggWidget[] $widgets */
+
+ foreach ($widgets as $widget) {
+ // change the container and owner
+ $new_widget = clone $widget;
+ $new_widget->container_guid = $entity->guid;
+ $new_widget->owner_guid = $entity->guid;
+
+ // pull in settings
+ $settings = get_all_private_settings($widget->guid);
+
+ foreach ($settings as $name => $value) {
+ $new_widget->$name = $value;
+ }
+
+ $new_widget->save();
+ }
+
+ elgg_set_ignore_access($old_ia);
+ elgg_pop_context();
+ }
+ }
+ }
+}
+
+/**
+ * Overrides permissions checks when creating widgets for logged out users.
+ *
+ * @param string $hook The permissions hook.
+ * @param string $type The type of entity being created.
+ * @param string $return Value
+ * @param mixed $params Params
+ * @return true|null
+ * @access private
+ */
+function elgg_default_widgets_permissions_override($hook, $type, $return, $params) {
+ if ($type == 'object' && $params['subtype'] == 'widget') {
+ return elgg_in_context('create_default_widgets') ? true : null;
+ }
+
+ return null;
+}
+
+elgg_register_event_handler('init', 'system', 'elgg_widgets_init');
+// register default widget hooks from plugins
+elgg_register_event_handler('ready', 'system', 'elgg_default_widgets_init');
diff --git a/engine/lib/xml-rpc.php b/engine/lib/xml-rpc.php
new file mode 100644
index 000000000..bfe1a8645
--- /dev/null
+++ b/engine/lib/xml-rpc.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Elgg XML-RPC library.
+ * Contains functions and classes to handle XML-RPC services, currently only server only.
+ *
+ * @package Elgg.Core
+ * @subpackage XMLRPC
+ */
+
+/**
+ * parse XMLRPCCall parameters
+ *
+ * Convert an XMLRPCCall result array into native data types
+ *
+ * @param array $parameters An array of params
+ *
+ * @return array
+ * @access private
+ */
+function xmlrpc_parse_params($parameters) {
+ $result = array();
+
+ foreach ($parameters as $parameter) {
+ $result[] = xmlrpc_scalar_value($parameter);
+ }
+
+ return $result;
+}
+
+/**
+ * Extract the scalar value of an XMLObject type result array
+ *
+ * @param XMLObject $object And object
+ *
+ * @return mixed
+ * @access private
+ */
+function xmlrpc_scalar_value($object) {
+ if ($object->name == 'param') {
+ $object = $object->children[0]->children[0];
+ }
+
+ switch ($object->name) {
+ case 'string':
+ return $object->content;
+
+ case 'array':
+ foreach ($object->children[0]->children as $child) {
+ $value[] = xmlrpc_scalar_value($child);
+ }
+ return $value;
+
+ case 'struct':
+ foreach ($object->children as $child) {
+ if (isset($child->children[1]->children[0])) {
+ $value[$child->children[0]->content] = xmlrpc_scalar_value($child->children[1]->children[0]);
+ } else {
+ $value[$child->children[0]->content] = $child->children[1]->content;
+ }
+ }
+ return $value;
+
+ case 'boolean':
+ return (boolean) $object->content;
+
+ case 'i4':
+ case 'int':
+ return (int) $object->content;
+
+ case 'double':
+ return (double) $object->content;
+
+ case 'dateTime.iso8601':
+ return (int) strtotime($object->content);
+
+ case 'base64':
+ return base64_decode($object->content);
+
+ case 'value':
+ return xmlrpc_scalar_value($object->children[0]);
+
+ default:
+ // @todo unsupported, throw an error
+ return false;
+ }
+}
+
+// Functions for adding handlers //////////////////////////////////////////////////////////
+
+/** XML-RPC Handlers */
+global $XML_RPC_HANDLERS;
+$XML_RPC_HANDLERS = array();
+
+/**
+ * Register a method handler for a given XML-RPC method.
+ *
+ * @param string $method Method parameter.
+ * @param string $handler The handler function. This function accepts
+ * one XMLRPCCall object and must return a XMLRPCResponse object.
+ *
+ * @return bool
+ */
+function register_xmlrpc_handler($method, $handler) {
+ global $XML_RPC_HANDLERS;
+
+ $XML_RPC_HANDLERS[$method] = $handler;
+}
+
+/**
+ * Trigger a method call and pass the relevant parameters to the funciton.
+ *
+ * @param XMLRPCCall $parameters The call and parameters.
+ *
+ * @return XMLRPCCall
+ * @access private
+ */
+function trigger_xmlrpc_handler(XMLRPCCall $parameters) {
+ global $XML_RPC_HANDLERS;
+
+ // Go through and see if we have a handler
+ if (isset($XML_RPC_HANDLERS[$parameters->getMethodName()])) {
+ $handler = $XML_RPC_HANDLERS[$parameters->getMethodName()];
+ $result = $handler($parameters);
+
+ if (!($result instanceof XMLRPCResponse)) {
+ $msg = elgg_echo('InvalidParameterException:UnexpectedReturnFormat',
+ array($parameters->getMethodName()));
+ throw new InvalidParameterException($msg);
+ }
+
+ // Result in right format, return it.
+ return $result;
+ }
+
+ // if no handler then throw exception
+ $msg = elgg_echo('NotImplementedException:XMLRPCMethodNotImplemented',
+ array($parameters->getMethodName()));
+ throw new NotImplementedException($msg);
+}
+
+/**
+ * PHP Error handler function.
+ * This function acts as a wrapper to catch and report PHP error messages.
+ *
+ * @see http://uk3.php.net/set-error-handler
+ *
+ * @param int $errno Error number
+ * @param string $errmsg Human readable message
+ * @param string $filename Filename
+ * @param int $linenum Line number
+ * @param array $vars Vars
+ *
+ * @return void
+ * @access private
+ */
+function _php_xmlrpc_error_handler($errno, $errmsg, $filename, $linenum, $vars) {
+ $error = date("Y-m-d H:i:s (T)") . ": \"" . $errmsg . "\" in file "
+ . $filename . " (line " . $linenum . ")";
+
+ switch ($errno) {
+ case E_USER_ERROR:
+ error_log("ERROR: " . $error);
+
+ // Since this is a fatal error, we want to stop any further execution but do so gracefully.
+ throw new Exception("ERROR: " . $error);
+ break;
+
+ case E_WARNING :
+ case E_USER_WARNING :
+ error_log("WARNING: " . $error);
+ break;
+
+ default:
+ error_log("DEBUG: " . $error);
+ }
+}
+
+/**
+ * PHP Exception handler for XMLRPC.
+ *
+ * @param Exception $exception The exception
+ *
+ * @return void
+ * @access private
+ */
+function _php_xmlrpc_exception_handler($exception) {
+
+ error_log("*** FATAL EXCEPTION (XML-RPC) *** : " . $exception);
+
+ $code = $exception->getCode();
+
+ if ($code == 0) {
+ $code = -32400;
+ }
+
+ $result = new XMLRPCErrorResponse($exception->getMessage(), $code);
+
+ $vars = array('result' => $result);
+
+ $content = elgg_view("xml-rpc/output", $vars);
+
+ echo elgg_view_page($exception->getMessage(), $content);
+}
diff --git a/engine/lib/xml.php b/engine/lib/xml.php
new file mode 100644
index 000000000..497459d83
--- /dev/null
+++ b/engine/lib/xml.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Elgg XML library.
+ * Contains functions for generating and parsing XML.
+ *
+ * @package Elgg.Core
+ * @subpackage XML
+ */
+
+/**
+ * This function serialises an object recursively into an XML representation.
+ *
+ * The function attempts to call $data->export() which expects a stdClass in return,
+ * otherwise it will attempt to get the object variables using get_object_vars (which
+ * will only return public variables!)
+ *
+ * @param mixed $data The object to serialise.
+ * @param string $name The name?
+ * @param int $n Level, only used for recursion.
+ *
+ * @return string The serialised XML output.
+ */
+function serialise_object_to_xml($data, $name = "", $n = 0) {
+ $classname = ($name == "" ? get_class($data) : $name);
+
+ $vars = method_exists($data, "export") ? get_object_vars($data->export()) : get_object_vars($data);
+
+ $output = "";
+
+ if (($n == 0) || ( is_object($data) && !($data instanceof stdClass))) {
+ $output = "<$classname>";
+ }
+
+ foreach ($vars as $key => $value) {
+ $output .= "<$key type=\"" . gettype($value) . "\">";
+
+ if (is_object($value)) {
+ $output .= serialise_object_to_xml($value, $key, $n + 1);
+ } else if (is_array($value)) {
+ $output .= serialise_array_to_xml($value, $n + 1);
+ } else if (gettype($value) == "boolean") {
+ $output .= $value ? "true" : "false";
+ } else {
+ $output .= htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8');
+ }
+
+ $output .= "</$key>\n";
+ }
+
+ if (($n == 0) || (is_object($data) && !($data instanceof stdClass))) {
+ $output .= "</$classname>\n";
+ }
+
+ return $output;
+}
+
+/**
+ * Serialise an array.
+ *
+ * @param array $data The data to serialize
+ * @param int $n Used for recursion
+ *
+ * @return string
+ */
+function serialise_array_to_xml(array $data, $n = 0) {
+ $output = "";
+
+ if ($n == 0) {
+ $output = "<array>\n";
+ }
+
+ foreach ($data as $key => $value) {
+ $item = "array_item";
+
+ if (is_numeric($key)) {
+ $output .= "<$item name=\"$key\" type=\"" . gettype($value) . "\">";
+ } else {
+ $item = $key;
+ $output .= "<$item type=\"" . gettype($value) . "\">";
+ }
+
+ if (is_object($value)) {
+ $output .= serialise_object_to_xml($value, "", $n + 1);
+ } else if (is_array($value)) {
+ $output .= serialise_array_to_xml($value, $n + 1);
+ } else if (gettype($value) == "boolean") {
+ $output .= $value ? "true" : "false";
+ } else {
+ $output .= htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8');
+ }
+
+ $output .= "</$item>\n";
+ }
+
+ if ($n == 0) {
+ $output .= "</array>\n";
+ }
+
+ return $output;
+}
+
+/**
+ * Parse an XML file into an object.
+ *
+ * @param string $xml The XML
+ *
+ * @return ElggXMLElement
+ */
+function xml_to_object($xml) {
+ return new ElggXMLElement($xml);
+}
diff --git a/engine/schema/mysql.sql b/engine/schema/mysql.sql
new file mode 100644
index 000000000..4714b71bb
--- /dev/null
+++ b/engine/schema/mysql.sql
@@ -0,0 +1,454 @@
+-- MySQL dump 10.13 Distrib 5.1.37, for debian-linux-gnu (i486)
+--
+-- Host: localhost Database: elgg
+-- ------------------------------------------------------
+-- Server version 5.1.37-1ubuntu5
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `prefix_access_collection_membership`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_access_collection_membership` (
+ `user_guid` int(11) NOT NULL,
+ `access_collection_id` int(11) NOT NULL,
+ PRIMARY KEY (`user_guid`,`access_collection_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_access_collections`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_access_collections` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` text NOT NULL,
+ `owner_guid` bigint(20) unsigned NOT NULL,
+ `site_guid` bigint(20) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `owner_guid` (`owner_guid`),
+ KEY `site_guid` (`site_guid`)
+) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_annotations`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_annotations` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `entity_guid` bigint(20) unsigned NOT NULL,
+ `name_id` int(11) NOT NULL,
+ `value_id` int(11) NOT NULL,
+ `value_type` enum('integer','text') NOT NULL,
+ `owner_guid` bigint(20) unsigned NOT NULL,
+ `access_id` int(11) NOT NULL,
+ `time_created` int(11) NOT NULL,
+ `enabled` enum('yes','no') NOT NULL DEFAULT 'yes',
+ PRIMARY KEY (`id`),
+ KEY `entity_guid` (`entity_guid`),
+ KEY `name_id` (`name_id`),
+ KEY `value_id` (`value_id`),
+ KEY `owner_guid` (`owner_guid`),
+ KEY `access_id` (`access_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_api_users`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_api_users` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `site_guid` bigint(20) unsigned DEFAULT NULL,
+ `api_key` varchar(40) DEFAULT NULL,
+ `secret` varchar(40) NOT NULL,
+ `active` int(1) DEFAULT '1',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `api_key` (`api_key`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_config`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_config` (
+ `name` varchar(255) NOT NULL,
+ `value` text NOT NULL,
+ `site_guid` int(11) NOT NULL,
+ PRIMARY KEY (`name`,`site_guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_datalists`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_datalists` (
+ `name` varchar(255) NOT NULL,
+ `value` text NOT NULL,
+ PRIMARY KEY (`name`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_entities`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_entities` (
+ `guid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `type` enum('object','user','group','site') NOT NULL,
+ `subtype` int(11) DEFAULT NULL,
+ `owner_guid` bigint(20) unsigned NOT NULL,
+ `site_guid` bigint(20) unsigned NOT NULL,
+ `container_guid` bigint(20) unsigned NOT NULL,
+ `access_id` int(11) NOT NULL,
+ `time_created` int(11) NOT NULL,
+ `time_updated` int(11) NOT NULL,
+ `last_action` int(11) NOT NULL DEFAULT '0',
+ `enabled` enum('yes','no') NOT NULL DEFAULT 'yes',
+ PRIMARY KEY (`guid`),
+ KEY `type` (`type`),
+ KEY `subtype` (`subtype`),
+ KEY `owner_guid` (`owner_guid`),
+ KEY `site_guid` (`site_guid`),
+ KEY `container_guid` (`container_guid`),
+ KEY `access_id` (`access_id`),
+ KEY `time_created` (`time_created`),
+ KEY `time_updated` (`time_updated`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_entity_relationships`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_entity_relationships` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `guid_one` bigint(20) unsigned NOT NULL,
+ `relationship` varchar(50) NOT NULL,
+ `guid_two` bigint(20) unsigned NOT NULL,
+ `time_created` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `guid_one` (`guid_one`,`relationship`,`guid_two`),
+ KEY `relationship` (`relationship`),
+ KEY `guid_two` (`guid_two`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_entity_subtypes`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_entity_subtypes` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `type` enum('object','user','group','site') NOT NULL,
+ `subtype` varchar(50) NOT NULL,
+ `class` varchar(50) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `type` (`type`,`subtype`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_geocode_cache`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_geocode_cache` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `location` varchar(128) DEFAULT NULL,
+ `lat` varchar(20) DEFAULT NULL,
+ `long` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `location` (`location`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_groups_entity`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_groups_entity` (
+ `guid` bigint(20) unsigned NOT NULL,
+ `name` text NOT NULL,
+ `description` text NOT NULL,
+ PRIMARY KEY (`guid`),
+ KEY `name` (`name`(50)),
+ KEY `description` (`description`(50)),
+ FULLTEXT KEY `name_2` (`name`,`description`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_hmac_cache`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_hmac_cache` (
+ `hmac` varchar(255) NOT NULL,
+ `ts` int(11) NOT NULL,
+ PRIMARY KEY (`hmac`),
+ KEY `ts` (`ts`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_metadata`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_metadata` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `entity_guid` bigint(20) unsigned NOT NULL,
+ `name_id` int(11) NOT NULL,
+ `value_id` int(11) NOT NULL,
+ `value_type` enum('integer','text') NOT NULL,
+ `owner_guid` bigint(20) unsigned NOT NULL,
+ `access_id` int(11) NOT NULL,
+ `time_created` int(11) NOT NULL,
+ `enabled` enum('yes','no') NOT NULL DEFAULT 'yes',
+ PRIMARY KEY (`id`),
+ KEY `entity_guid` (`entity_guid`),
+ KEY `name_id` (`name_id`),
+ KEY `value_id` (`value_id`),
+ KEY `owner_guid` (`owner_guid`),
+ KEY `access_id` (`access_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_metastrings`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_metastrings` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `string` text NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `string` (`string`(50))
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_objects_entity`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_objects_entity` (
+ `guid` bigint(20) unsigned NOT NULL,
+ `title` text NOT NULL,
+ `description` text NOT NULL,
+ PRIMARY KEY (`guid`),
+ FULLTEXT KEY `title` (`title`,`description`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_private_settings`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_private_settings` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `entity_guid` int(11) NOT NULL,
+ `name` varchar(128) NOT NULL,
+ `value` text NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `entity_guid` (`entity_guid`,`name`),
+ KEY `name` (`name`),
+ KEY `value` (`value`(50))
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_river`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_river` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `type` varchar(8) NOT NULL,
+ `subtype` varchar(32) NOT NULL,
+ `action_type` varchar(32) NOT NULL,
+ `access_id` int(11) NOT NULL,
+ `view` text NOT NULL,
+ `subject_guid` int(11) NOT NULL,
+ `object_guid` int(11) NOT NULL,
+ `annotation_id` int(11) NOT NULL,
+ `posted` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `type` (`type`),
+ KEY `action_type` (`action_type`),
+ KEY `access_id` (`access_id`),
+ KEY `subject_guid` (`subject_guid`),
+ KEY `object_guid` (`object_guid`),
+ KEY `annotation_id` (`annotation_id`),
+ KEY `posted` (`posted`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_sites_entity`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_sites_entity` (
+ `guid` bigint(20) unsigned NOT NULL,
+ `name` text NOT NULL,
+ `description` text NOT NULL,
+ `url` varchar(255) NOT NULL,
+ PRIMARY KEY (`guid`),
+ UNIQUE KEY `url` (`url`),
+ FULLTEXT KEY `name` (`name`,`description`,`url`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_system_log`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_system_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `object_id` int(11) NOT NULL,
+ `object_class` varchar(50) NOT NULL,
+ `object_type` varchar(50) NOT NULL,
+ `object_subtype` varchar(50) NOT NULL,
+ `event` varchar(50) NOT NULL,
+ `performed_by_guid` int(11) NOT NULL,
+ `owner_guid` int(11) NOT NULL,
+ `access_id` int(11) NOT NULL,
+ `enabled` enum('yes','no') NOT NULL DEFAULT 'yes',
+ `time_created` int(11) NOT NULL,
+ `ip_address` varchar(46) NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `object_id` (`object_id`),
+ KEY `object_class` (`object_class`),
+ KEY `object_type` (`object_type`),
+ KEY `object_subtype` (`object_subtype`),
+ KEY `event` (`event`),
+ KEY `performed_by_guid` (`performed_by_guid`),
+ KEY `access_id` (`access_id`),
+ KEY `time_created` (`time_created`),
+ KEY `river_key` (`object_type`,`object_subtype`,`event`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_users_apisessions`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_users_apisessions` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `user_guid` bigint(20) unsigned NOT NULL,
+ `site_guid` bigint(20) unsigned NOT NULL,
+ `token` varchar(40) DEFAULT NULL,
+ `expires` int(11) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `user_guid` (`user_guid`,`site_guid`),
+ KEY `token` (`token`)
+) ENGINE=MEMORY DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_users_entity`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_users_entity` (
+ `guid` bigint(20) unsigned NOT NULL,
+ `name` text NOT NULL,
+ `username` varchar(128) NOT NULL DEFAULT '',
+ `password` varchar(32) NOT NULL DEFAULT '',
+ `salt` varchar(8) NOT NULL DEFAULT '',
+ `email` text NOT NULL,
+ `language` varchar(6) NOT NULL DEFAULT '',
+ `code` varchar(32) NOT NULL DEFAULT '',
+ `banned` enum('yes','no') NOT NULL DEFAULT 'no',
+ `admin` enum('yes','no') NOT NULL DEFAULT 'no',
+ `last_action` int(11) NOT NULL DEFAULT '0',
+ `prev_last_action` int(11) NOT NULL DEFAULT '0',
+ `last_login` int(11) NOT NULL DEFAULT '0',
+ `prev_last_login` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`guid`),
+ UNIQUE KEY `username` (`username`),
+ KEY `password` (`password`),
+ KEY `email` (`email`(50)),
+ KEY `code` (`code`),
+ KEY `last_action` (`last_action`),
+ KEY `last_login` (`last_login`),
+ KEY `admin` (`admin`),
+ FULLTEXT KEY `name` (`name`),
+ FULLTEXT KEY `name_2` (`name`,`username`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `prefix_users_sessions`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `prefix_users_sessions` (
+ `session` varchar(255) NOT NULL,
+ `ts` int(11) unsigned NOT NULL DEFAULT '0',
+ `data` mediumblob,
+ PRIMARY KEY (`session`),
+ KEY `ts` (`ts`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2010-01-29 14:28:11
diff --git a/engine/schema/upgrades/2008092301.sql b/engine/schema/upgrades/2008092301.sql
new file mode 100644
index 000000000..2ae52e0c9
--- /dev/null
+++ b/engine/schema/upgrades/2008092301.sql
@@ -0,0 +1,100 @@
+--- Ensure default character set is UTF8
+
+ALTER TABLE `prefix_config` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_entities` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_entity_subtypes` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_entity_relationships` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_access_collections` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_access_collection_membership` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_objects_entity` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_sites_entity` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_users_entity` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_groups_entity` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_annotations` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_metadata` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_metastrings` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_api_users` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_users_apisessions` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_datalists` DEFAULT CHARACTER SET utf8;
+ALTER TABLE `prefix_system_log` DEFAULT CHARACTER SET utf8;
+
+-- Drop keys to avoid errors (grr)
+
+ALTER TABLE `prefix_entities` DROP KEY `type`;
+ALTER TABLE `prefix_entities` DROP KEY `subtype`;
+ALTER TABLE `prefix_entities` DROP KEY `owner_guid`;
+ALTER TABLE `prefix_entities` DROP KEY `container_guid`;
+ALTER TABLE `prefix_entities` DROP KEY `access_id`;
+ALTER TABLE `prefix_entities` DROP KEY `time_created`;
+ALTER TABLE `prefix_entities` DROP KEY `time_updated`;
+
+ALTER TABLE `prefix_users_entity` DROP KEY `email`;
+ALTER TABLE `prefix_users_entity` DROP KEY `code`;
+
+ALTER TABLE `prefix_annotations` DROP KEY `entity_guid`;
+ALTER TABLE `prefix_annotations` DROP KEY `name_id`;
+ALTER TABLE `prefix_annotations` DROP KEY `value_id`;
+ALTER TABLE `prefix_annotations` DROP KEY `owner_guid`;
+ALTER TABLE `prefix_annotations` DROP KEY `access_id`;
+
+ALTER TABLE `prefix_metadata` DROP KEY `entity_guid`;
+ALTER TABLE `prefix_metadata` DROP KEY `name_id`;
+ALTER TABLE `prefix_metadata` DROP KEY `value_id`;
+ALTER TABLE `prefix_metadata` DROP KEY `owner_guid`;
+ALTER TABLE `prefix_metadata` DROP KEY `access_id`;
+
+ALTER TABLE `prefix_users_apisessions` DROP KEY `token`;
+
+ALTER TABLE `prefix_system_log` DROP KEY `object_id`;
+ALTER TABLE `prefix_system_log` DROP KEY `object_class`;
+ALTER TABLE `prefix_system_log` DROP KEY `event`;
+ALTER TABLE `prefix_system_log` DROP KEY `performed_by_guid`;
+ALTER TABLE `prefix_system_log` DROP KEY `time_created`;
+
+-- New keys
+
+ALTER TABLE `prefix_entities` ADD KEY `type` (`type`);
+ALTER TABLE `prefix_entities` ADD KEY `subtype` (`subtype`);
+ALTER TABLE `prefix_entities` ADD KEY `owner_guid` (`owner_guid`);
+ALTER TABLE `prefix_entities` ADD KEY `container_guid` (`container_guid`);
+ALTER TABLE `prefix_entities` ADD KEY `access_id` (`access_id`);
+ALTER TABLE `prefix_entities` ADD KEY `time_created` (`time_created`);
+ALTER TABLE `prefix_entities` ADD KEY `time_updated` (`time_updated`);
+
+ALTER TABLE `prefix_users_entity` ADD KEY `email` (`email`(50));
+ALTER TABLE `prefix_users_entity` ADD KEY `code` (`code`(50));
+
+ALTER TABLE `prefix_annotations` ADD KEY `entity_guid` (`entity_guid`);
+ALTER TABLE `prefix_annotations` ADD KEY `name_id` (`name_id`);
+ALTER TABLE `prefix_annotations` ADD KEY `value_id` (`value_id`);
+ALTER TABLE `prefix_annotations` ADD KEY `owner_guid` (`owner_guid`);
+ALTER TABLE `prefix_annotations` ADD KEY `access_id` (`access_id`);
+
+ALTER TABLE `prefix_metadata` ADD KEY `entity_guid` (`entity_guid`);
+ALTER TABLE `prefix_metadata` ADD KEY `name_id` (`name_id`);
+ALTER TABLE `prefix_metadata` ADD KEY `value_id` (`value_id`);
+ALTER TABLE `prefix_metadata` ADD KEY `owner_guid` (`owner_guid`);
+ALTER TABLE `prefix_metadata` ADD KEY `access_id` (`access_id`);
+
+ALTER TABLE `prefix_metastrings` DROP KEY `string`;
+ALTER TABLE `prefix_metastrings` ADD KEY `string` (`string`(50));
+
+ALTER TABLE `prefix_users_apisessions` ADD KEY `token` (`token`);
+
+ALTER TABLE `prefix_system_log` ADD KEY `object_id` (`object_id`);
+ALTER TABLE `prefix_system_log` ADD KEY `object_class` (`object_class`);
+ALTER TABLE `prefix_system_log` ADD KEY `event` (`event`);
+ALTER TABLE `prefix_system_log` ADD KEY `performed_by_guid` (`performed_by_guid`);
+ALTER TABLE `prefix_system_log` ADD KEY `time_created` (`time_created`);
+
+DROP TABLE `prefix_privileged_paths`;
+
+-- HMAC Cache protecting against Replay attacks
+
+CREATE TABLE IF NOT EXISTS `prefix_hmac_cache` (
+ `hmac` varchar(255) NOT NULL,
+ `ts` int(11) NOT NULL,
+
+ PRIMARY KEY (`hmac`),
+ KEY `ts` (`ts`)
+) ENGINE=MEMORY; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008100601.sql b/engine/schema/upgrades/2008100601.sql
new file mode 100644
index 000000000..d02dd9f6c
--- /dev/null
+++ b/engine/schema/upgrades/2008100601.sql
@@ -0,0 +1,14 @@
+ALTER TABLE `prefix_system_log` ADD COLUMN `object_type` varchar(50) NOT NULL AFTER `object_class`;
+ALTER TABLE `prefix_system_log` ADD COLUMN `object_subtype` varchar(50) NOT NULL AFTER `object_type`;
+ALTER TABLE `prefix_system_log` MODIFY `object_event` varchar(50) NOT NULL;
+ALTER TABLE `prefix_system_log` MODIFY `object_class` varchar(50) NOT NULL;
+
+
+ALTER TABLE `prefix_system_log` DROP KEY `object_type`;
+ALTER TABLE `prefix_system_log` DROP KEY `object_subtype`;
+ALTER TABLE `prefix_system_log` DROP KEY `river_key`;
+
+ALTER TABLE `prefix_system_log` ADD KEY `object_type` (`object_type`);
+ALTER TABLE `prefix_system_log` ADD KEY `object_subtype` (`object_subtype`);
+
+ALTER TABLE `prefix_system_log` ADD KEY `river_key` (`object_type`, `object_subtype`, `event`); \ No newline at end of file
diff --git a/engine/schema/upgrades/2008101601.sql b/engine/schema/upgrades/2008101601.sql
new file mode 100644
index 000000000..cd10eb024
--- /dev/null
+++ b/engine/schema/upgrades/2008101601.sql
@@ -0,0 +1,11 @@
+ALTER TABLE `prefix_system_log` ADD COLUMN `access_id` int(11) NOT NULL AFTER `performed_by_guid`;
+ALTER TABLE `prefix_system_log` ADD COLUMN `enabled` enum ('yes', 'no') NOT NULL default 'yes' AFTER `access_id`;
+
+ALTER TABLE `prefix_system_log` DROP KEY `access_id`;
+ALTER TABLE `prefix_system_log` ADD KEY `access_id` (`access_id`);
+
+ALTER TABLE `prefix_system_log` DROP KEY `enabled`;
+ALTER TABLE `prefix_system_log` ADD KEY `enabled` (`enabled`);
+
+ALTER TABLE `prefix_system_log` DROP KEY `river_key`;
+ALTER TABLE `prefix_system_log` ADD KEY `river_key` (`object_type`, `object_subtype`, `event`, `access_id`, `enabled`); \ No newline at end of file
diff --git a/engine/schema/upgrades/2008101701.sql b/engine/schema/upgrades/2008101701.sql
new file mode 100644
index 000000000..3e6fc9653
--- /dev/null
+++ b/engine/schema/upgrades/2008101701.sql
@@ -0,0 +1,7 @@
+ALTER TABLE `prefix_system_log` ADD COLUMN `owner_guid` int(11) NOT NULL AFTER `performed_by_guid`;
+
+ALTER TABLE `prefix_system_log` DROP KEY `owner_guid`;
+ALTER TABLE `prefix_system_log` ADD KEY `owner_guid` (`owner_guid`);
+
+ALTER TABLE `prefix_system_log` DROP KEY `river_key`;
+ALTER TABLE `prefix_system_log` ADD KEY `river_key` (`object_type`, `object_subtype`, `event`, `access_id`);
diff --git a/engine/schema/upgrades/2008102101.sql b/engine/schema/upgrades/2008102101.sql
new file mode 100644
index 000000000..544f28d2f
--- /dev/null
+++ b/engine/schema/upgrades/2008102101.sql
@@ -0,0 +1,9 @@
+
+CREATE TABLE IF NOT EXISTS `prefix_users_sessions` (
+ `session` varchar(255) NOT NULL,
+ `ts` int(11) unsigned NOT NULL default '0',
+ `data` mediumblob,
+
+ PRIMARY KEY `session` (`session`),
+ KEY `ts` (`ts`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008110301.sql b/engine/schema/upgrades/2008110301.sql
new file mode 100644
index 000000000..8fd0539d2
--- /dev/null
+++ b/engine/schema/upgrades/2008110301.sql
@@ -0,0 +1,17 @@
+
+-- Based on slow query table feedback
+ALTER TABLE `prefix_entity_relationships` DROP KEY `relationship`;
+ALTER TABLE `prefix_entity_relationships` ADD KEY `relationship` (`relationship`);
+
+ALTER TABLE `prefix_entity_relationships` DROP KEY `guid_two`;
+ALTER TABLE `prefix_entity_relationships` ADD KEY `guid_two` (`guid_two`);
+
+-- The following seemed to have been missed off upgrade
+ALTER TABLE `prefix_users_entity` DROP KEY `code`;
+ALTER TABLE `prefix_users_entity` ADD KEY `code` (`code`);
+
+-- Access collections missing keys
+ALTER TABLE `prefix_access_collections` DROP KEY `site_guid`;
+ALTER TABLE `prefix_access_collections` ADD KEY `site_guid` (`site_guid`);
+ALTER TABLE `prefix_access_collections` DROP KEY `owner_guid`;
+ALTER TABLE `prefix_access_collections` ADD KEY `owner_guid` (`owner_guid`);
diff --git a/engine/schema/upgrades/2008110601.sql b/engine/schema/upgrades/2008110601.sql
new file mode 100644
index 000000000..ddd80a91b
--- /dev/null
+++ b/engine/schema/upgrades/2008110601.sql
@@ -0,0 +1,3 @@
+-- Alter datalists to have a primary key
+ALTER TABLE `prefix_datalists` DROP KEY `name`;
+ALTER TABLE `prefix_datalists` ADD PRIMARY KEY `name` (`name`);
diff --git a/engine/schema/upgrades/2008111901.sql b/engine/schema/upgrades/2008111901.sql
new file mode 100644
index 000000000..617678bb6
--- /dev/null
+++ b/engine/schema/upgrades/2008111901.sql
@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS `prefix_private_settings` (
+ `id` INT NOT NULL auto_increment,
+ `entity_guid` INT NOT NULL ,
+ `name` VARCHAR( 128 ) NOT NULL ,
+ `value` TEXT NOT NULL ,
+ PRIMARY KEY ( `id` ) ,
+ UNIQUE KEY ( `entity_guid` , `name` )
+) ENGINE = MYISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008112001.sql b/engine/schema/upgrades/2008112001.sql
new file mode 100644
index 000000000..9159e6c6f
--- /dev/null
+++ b/engine/schema/upgrades/2008112001.sql
@@ -0,0 +1,24 @@
+-- Move plugin settings to private store
+INSERT INTO `prefix_private_settings` (entity_guid, name, `value`)
+ SELECT e.guid as guid, name_string.string as name, value_string.string as `value` FROM `prefix_entities` e
+ JOIN `prefix_metadata` name_val ON e.guid=name_val.entity_guid
+ JOIN `prefix_metastrings` name_string ON name_val.name_id = name_string.id
+ JOIN `prefix_metastrings` value_string ON name_val.value_id = value_string.id
+ WHERE
+ e.type='object' AND
+ e.subtype in (SELECT id from `prefix_entity_subtypes` WHERE subtype='plugin' and type='object');
+
+-- Delete previous settings
+CREATE TEMPORARY TABLE __upgrade_2008112001_1 (
+ SELECT distinct meta.id as id from `prefix_metadata` meta
+ JOIN `prefix_private_settings` settings ON meta.entity_guid = settings.entity_guid
+ JOIN `prefix_entities` e ON e.guid = meta.entity_guid
+ JOIN `prefix_entity_subtypes` subtypes ON subtypes.id = e.subtype
+ WHERE
+ e.type='object' AND
+ subtypes.subtype = 'plugin'
+);
+
+DELETE FROM `prefix_metadata` WHERE id in (SELECT id from __upgrade_2008112001_1);
+
+DROP TABLE __upgrade_2008112001_1; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008112002.sql b/engine/schema/upgrades/2008112002.sql
new file mode 100644
index 000000000..cdd308fe0
--- /dev/null
+++ b/engine/schema/upgrades/2008112002.sql
@@ -0,0 +1,29 @@
+-- Move user plugins settings to new data store
+INSERT INTO `prefix_private_settings` (entity_guid, name, `value`)
+ SELECT e.guid as guid, name_string.string as name, value_string.string as value FROM `prefix_entities` e
+ JOIN `prefix_metadata` name_val ON e.guid=name_val.entity_guid
+ JOIN `prefix_metastrings` name_string ON name_val.name_id = name_string.id
+ JOIN `prefix_metastrings` value_string ON name_val.value_id = value_string.id
+ WHERE
+ e.type='user' AND
+ name_string.string like 'plugin:settings:%';
+
+-- Delete previous settings
+CREATE TEMPORARY TABLE __upgrade_2008112002_1 (
+ SELECT distinct meta.id as id from `prefix_metadata` meta
+ JOIN `prefix_private_settings` settings ON meta.entity_guid = settings.entity_guid
+
+ JOIN `prefix_entities` e ON e.guid = meta.entity_guid
+ JOIN `prefix_metadata` name_val ON e.guid=name_val.entity_guid
+
+ JOIN `prefix_metastrings` name_string ON name_val.name_id = name_string.id
+ JOIN `prefix_metastrings` value_string ON name_val.value_id = value_string.id
+ WHERE
+ e.type='user' AND
+ name_string.string like 'plugin:settings:%' AND
+ meta.name_id = name_string.id
+);
+
+DELETE FROM `prefix_metadata` WHERE id in (SELECT id from __upgrade_2008112002_1);
+
+DROP TABLE __upgrade_2008112002_1; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008112501.sql b/engine/schema/upgrades/2008112501.sql
new file mode 100644
index 000000000..41e41f93e
--- /dev/null
+++ b/engine/schema/upgrades/2008112501.sql
@@ -0,0 +1,10 @@
+CREATE TABLE IF NOT EXISTS `prefix_geocode_cache` (
+ id int(11) auto_increment,
+ location varchar(128),
+ `lat` varchar(20),
+ `long` varchar(20),
+
+ PRIMARY KEY (`id`),
+ KEY `location` (`location`)
+
+) ENGINE=MEMORY; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008112601.sql b/engine/schema/upgrades/2008112601.sql
new file mode 100644
index 000000000..9ca9657de
--- /dev/null
+++ b/engine/schema/upgrades/2008112601.sql
@@ -0,0 +1,27 @@
+-- We now are using a extended class to handle this
+UPDATE `prefix_entity_subtypes` SET class='ElggPlugin' where type='object' and subtype='widget';
+
+-- Move widget settings to private store
+INSERT INTO `prefix_private_settings` (entity_guid, name, `value`)
+ SELECT e.guid as guid, name_string.string as name, value_string.string as `value` FROM `prefix_entities` e
+ JOIN `prefix_metadata` name_val ON e.guid=name_val.entity_guid
+ JOIN `prefix_metastrings` name_string ON name_val.name_id = name_string.id
+ JOIN `prefix_metastrings` value_string ON name_val.value_id = value_string.id
+ WHERE
+ e.type='object' AND
+ e.subtype in (SELECT id from `prefix_entity_subtypes` WHERE subtype='widget' and type='object');
+
+-- Delete previous settings
+CREATE TEMPORARY TABLE __upgrade_2008112601 (
+ SELECT distinct meta.id as id from `prefix_metadata` meta
+ JOIN `prefix_private_settings` settings ON meta.entity_guid = settings.entity_guid
+ JOIN `prefix_entities` e ON e.guid = meta.entity_guid
+ JOIN `prefix_entity_subtypes` subtypes ON subtypes.id = e.subtype
+ WHERE
+ e.type='object' AND
+ subtypes.subtype = 'widget'
+);
+
+DELETE FROM `prefix_metadata` WHERE id in (SELECT id from __upgrade_2008112601);
+
+DROP TABLE __upgrade_2008112001; \ No newline at end of file
diff --git a/engine/schema/upgrades/2008120501.sql b/engine/schema/upgrades/2008120501.sql
new file mode 100644
index 000000000..dd44b96b0
--- /dev/null
+++ b/engine/schema/upgrades/2008120501.sql
@@ -0,0 +1,9 @@
+-- Modify field length in private settings (for people who upgraded while #611 present)
+ALTER TABLE `prefix_private_settings` MODIFY `name` varchar(128) NOT NULL;
+
+-- While we're at it, add some more keys
+ALTER TABLE `prefix_private_settings` DROP KEY `name`;
+ALTER TABLE `prefix_private_settings` ADD KEY `name` (`name`);
+
+ALTER TABLE `prefix_private_settings` DROP KEY `value`;
+ALTER TABLE `prefix_private_settings` ADD KEY `value` (`value` (50)); \ No newline at end of file
diff --git a/engine/schema/upgrades/2009010801.sql b/engine/schema/upgrades/2009010801.sql
new file mode 100644
index 000000000..1e7c020e8
--- /dev/null
+++ b/engine/schema/upgrades/2009010801.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `prefix_users_entity` DROP KEY `last_action`;
+ALTER TABLE `prefix_users_entity` ADD KEY `last_action` (`last_action`);
+
+ALTER TABLE `prefix_users_entity` DROP KEY `last_login`;
+ALTER TABLE `prefix_users_entity` ADD KEY `last_login` (`last_login`); \ No newline at end of file
diff --git a/engine/schema/upgrades/2009010901.sql b/engine/schema/upgrades/2009010901.sql
new file mode 100644
index 000000000..29eb68f29
--- /dev/null
+++ b/engine/schema/upgrades/2009010901.sql
@@ -0,0 +1,3 @@
+-- Add banned column refs #668
+ALTER TABLE `prefix_users_entity` ADD COLUMN `banned` enum ('yes', 'no') NOT NULL default 'no' AFTER `code`;
+
diff --git a/engine/schema/upgrades/2009021201.sql b/engine/schema/upgrades/2009021201.sql
new file mode 100644
index 000000000..e3edf66ba
--- /dev/null
+++ b/engine/schema/upgrades/2009021201.sql
@@ -0,0 +1,19 @@
+-- River
+ CREATE TABLE IF NOT EXISTS `prefix_river` (
+ `id` INT NOT NULL AUTO_INCREMENT ,
+ `type` VARCHAR( 8 ) NOT NULL ,
+ `subtype` VARCHAR( 32 ) NOT NULL ,
+ `action_type` VARCHAR( 32 ) NOT NULL ,
+ `access_id` INT NOT NULL ,
+ `view` TEXT NOT NULL ,
+ `subject_guid` INT NOT NULL ,
+ `object_guid` INT NOT NULL ,
+ `posted` INT NOT NULL ,
+ PRIMARY KEY ( `id` ) ,
+ KEY `type` (`type`),
+ KEY `action_type` (`action_type`),
+ KEY `access_id` (`access_id`),
+ KEY `subject_guid` (`subject_guid`),
+ KEY `object_guid` (`object_guid`),
+ KEY `posted` (`posted`)
+) ENGINE = MYISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/engine/schema/upgrades/2009021301.sql b/engine/schema/upgrades/2009021301.sql
new file mode 100644
index 000000000..efec52b93
--- /dev/null
+++ b/engine/schema/upgrades/2009021301.sql
@@ -0,0 +1,2 @@
+-- Changing the ACLs on existing groups
+UPDATE `prefix_entities` SET access_id=2 WHERE type='group'; \ No newline at end of file
diff --git a/engine/schema/upgrades/2009051401.sql b/engine/schema/upgrades/2009051401.sql
new file mode 100644
index 000000000..57348968e
--- /dev/null
+++ b/engine/schema/upgrades/2009051401.sql
@@ -0,0 +1,5 @@
+-- Fix error in geocode cache table
+DELETE FROM `prefix_geocode_cache`;
+
+ALTER TABLE `prefix_geocode_cache` DROP KEY `location`;
+ALTER TABLE `prefix_geocode_cache` ADD UNIQUE KEY `location` (`location`);
diff --git a/engine/schema/upgrades/2009052201.sql b/engine/schema/upgrades/2009052201.sql
new file mode 100644
index 000000000..b825f9936
--- /dev/null
+++ b/engine/schema/upgrades/2009052201.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `prefix_groups_entity` DROP KEY `name`;
+ALTER TABLE `prefix_groups_entity` ADD KEY `name` (`name`(50));
+
+ALTER TABLE `prefix_groups_entity` DROP KEY `description`;
+ALTER TABLE `prefix_groups_entity` ADD KEY `description` (`description`(50));
diff --git a/engine/schema/upgrades/2009091901.sql b/engine/schema/upgrades/2009091901.sql
new file mode 100644
index 000000000..074d042c3
--- /dev/null
+++ b/engine/schema/upgrades/2009091901.sql
@@ -0,0 +1,3 @@
+-- add an additional column to the river table
+ALTER TABLE `prefix_river` ADD COLUMN `annotation_id` int(11) NOT NULL AFTER `object_guid`;
+ALTER TABLE `prefix_river` ADD KEY `annotation_id` (`annotation_id`); \ No newline at end of file
diff --git a/engine/schema/upgrades/2009100701.sql b/engine/schema/upgrades/2009100701.sql
new file mode 100644
index 000000000..74249e901
--- /dev/null
+++ b/engine/schema/upgrades/2009100701.sql
@@ -0,0 +1,2 @@
+-- Previously was the UTF8 migration that is now in code at engine/lib/upgrades/2010033101.php
+-- Keeping this file to force an overwrite and to avoid confusion with missing migrations.
diff --git a/engine/schema/upgrades/2010012901.sql b/engine/schema/upgrades/2010012901.sql
new file mode 100644
index 000000000..fe5cb6849
--- /dev/null
+++ b/engine/schema/upgrades/2010012901.sql
@@ -0,0 +1 @@
+ALTER TABLE `prefix_entities` ADD `last_action` INT( 11 ) NOT NULL AFTER `time_updated`
diff --git a/engine/schema/upgrades/2010030101.sql b/engine/schema/upgrades/2010030101.sql
new file mode 100644
index 000000000..cc7af98c9
--- /dev/null
+++ b/engine/schema/upgrades/2010030101.sql
@@ -0,0 +1 @@
+ALTER TABLE `prefix_entities` CHANGE `last_action` `last_action` INT( 11 ) NOT NULL DEFAULT '0'
diff --git a/engine/schema/upgrades/2010062401.sql b/engine/schema/upgrades/2010062401.sql
new file mode 100644
index 000000000..fbb49bfcf
--- /dev/null
+++ b/engine/schema/upgrades/2010062401.sql
@@ -0,0 +1 @@
+ALTER TABLE `prefix_entity_relationships` ADD COLUMN `time_created` int(11) NOT NULL AFTER `guid_two`; \ No newline at end of file
diff --git a/engine/settings.example.php b/engine/settings.example.php
new file mode 100644
index 000000000..3b139d710
--- /dev/null
+++ b/engine/settings.example.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Defines database credentials.
+ *
+ * Most of Elgg's configuration is stored in the database. This file contains the
+ * credentials to connect to the database, as well as a few optional configuration
+ * values.
+ *
+ * The Elgg installation attempts to populate this file with the correct settings
+ * and then rename it to settings.php.
+ *
+ * @todo Turn this into something we handle more automatically.
+ * @package Elgg.Core
+ * @subpackage Configuration
+ */
+
+global $CONFIG;
+if (!isset($CONFIG)) {
+ $CONFIG = new stdClass;
+}
+
+/*
+ * Standard configuration
+ *
+ * You will use the same database connection for reads and writes.
+ * This is the easiest configuration, and will suit 99.99% of setups. However, if you're
+ * running a really popular site, you'll probably want to spread out your database connections
+ * and implement database replication. That's beyond the scope of this configuration file
+ * to explain, but if you know you need it, skip past this section.
+ */
+
+/**
+ * The database username
+ *
+ * @global string $CONFIG->dbuser
+ * @name $CONFIG->dbuser
+ */
+$CONFIG->dbuser = '{{dbuser}}';
+
+/**
+ * The database password
+ *
+ * @global string $CONFIG->dbpass
+ */
+$CONFIG->dbpass = '{{dbpassword}}';
+
+/**
+ * The database name
+ *
+ * @global string $CONFIG->dbname
+ */
+$CONFIG->dbname = '{{dbname}}';
+
+/**
+ * The database host.
+ *
+ * For most installations, this is 'localhost'
+ *
+ * @global string $CONFIG->dbhost
+ */
+$CONFIG->dbhost = '{{dbhost}}';
+
+/**
+ * The database prefix
+ *
+ * This prefix will be appended to all Elgg tables. If you're sharing
+ * a database with other applications, use a database prefix to namespace tables
+ * in order to avoid table name collisions.
+ *
+ * @global string $CONFIG->dbprefix
+ */
+$CONFIG->dbprefix = '{{dbprefix}}';
+
+
+/**
+ * Memcache setup (optional)
+ * This is where you may optionally set up memcache.
+ *
+ * Requirements:
+ * 1) One or more memcache servers (http://www.danga.com/memcached/)
+ * 2) PHP memcache wrapper (http://uk.php.net/manual/en/memcache.setup.php)
+ *
+ * Note: Multiple server support is only available on server 1.2.1
+ * or higher with PECL library > 2.0.0
+ */
+//$CONFIG->memcache = true;
+//
+//$CONFIG->memcache_servers = array (
+// array('server1', 11211),
+// array('server2', 11211)
+//);
+
+
+/**
+ * Use non-standard headers for broken MTAs.
+ *
+ * The default header EOL for headers is \r\n. This causes problems
+ * on some broken MTAs. Setting this to TRUE will cause Elgg to use
+ * \n, which will fix some problems sending email on broken MTAs.
+ *
+ * @global bool $CONFIG->broken_mta
+ */
+$CONFIG->broken_mta = FALSE;
+
+/**
+ * Disable the database query cache
+ *
+ * Elgg stores each query and its results in a query cache.
+ * On large sites or long-running scripts, this cache can grow to be
+ * large. To disable query caching, set this to TRUE.
+ *
+ * @global bool $CONFIG->db_disable_query_cache
+ */
+$CONFIG->db_disable_query_cache = FALSE;
+
+/**
+ * Minimum password length
+ *
+ * This value is used when validating a user's password during registration.
+ *
+ * @global int $CONFIG->min_password_length
+ */
+$CONFIG->min_password_length = 6;
diff --git a/engine/start.php b/engine/start.php
new file mode 100644
index 000000000..55b8ffa5b
--- /dev/null
+++ b/engine/start.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Bootstraps the Elgg engine.
+ *
+ * This file loads the full Elgg engine, checks the installation
+ * state, and triggers a series of events to finish booting Elgg:
+ * - {@elgg_event boot system}
+ * - {@elgg_event init system}
+ * - {@elgg_event ready system}
+ *
+ * If Elgg is fully uninstalled, the browser will be redirected to an
+ * installation page.
+ *
+ * @see install.php
+ * @package Elgg.Core
+ * @subpackage Core
+ */
+
+/*
+ * No settings means a fresh install
+ */
+if (!file_exists(dirname(__FILE__) . '/settings.php')) {
+ header("Location: install.php");
+ exit;
+}
+
+/**
+ * The time with microseconds when the Elgg engine was started.
+ *
+ * @global float
+ */
+global $START_MICROTIME;
+$START_MICROTIME = microtime(true);
+
+/**
+ * Configuration values.
+ *
+ * The $CONFIG global contains configuration values required
+ * for running Elgg as defined in the settings.php file.
+ *
+ * Plugin authors are encouraged to use elgg_get_config() instead of accessing
+ * the global directly.
+ *
+ * @see elgg_get_config()
+ * @see engine/settings.php
+ * @global stdClass $CONFIG
+ */
+global $CONFIG;
+if (!isset($CONFIG)) {
+ $CONFIG = new stdClass;
+}
+$CONFIG->boot_complete = false;
+
+$lib_dir = dirname(__FILE__) . '/lib/';
+
+// Load the bootstrapping library
+$path = $lib_dir . 'elgglib.php';
+if (!include_once($path)) {
+ echo "Could not load file '$path'. Please check your Elgg installation for all required files.";
+ exit;
+}
+
+// Load the system settings
+if (!include_once(dirname(__FILE__) . "/settings.php")) {
+ $msg = 'Elgg could not load the settings file. It does not exist or there is a file permissions issue.';
+ throw new InstallationException($msg);
+}
+
+
+// load the rest of the library files from engine/lib/
+$lib_files = array(
+ 'access.php', 'actions.php', 'admin.php', 'annotations.php', 'cache.php',
+ 'calendar.php', 'configuration.php', 'cron.php', 'database.php',
+ 'entities.php', 'export.php', 'extender.php', 'filestore.php', 'group.php',
+ 'input.php', 'languages.php', 'location.php', 'mb_wrapper.php',
+ 'memcache.php', 'metadata.php', 'metastrings.php', 'navigation.php',
+ 'notification.php', 'objects.php', 'opendd.php', 'output.php',
+ 'pagehandler.php', 'pageowner.php', 'pam.php', 'plugins.php',
+ 'private_settings.php', 'relationships.php', 'river.php', 'sessions.php',
+ 'sites.php', 'statistics.php', 'system_log.php', 'tags.php',
+ 'user_settings.php', 'users.php', 'upgrade.php', 'views.php',
+ 'web_services.php', 'widgets.php', 'xml.php', 'xml-rpc.php',
+
+ // backward compatibility
+ 'deprecated-1.7.php', 'deprecated-1.8.php',
+);
+
+foreach ($lib_files as $file) {
+ $file = $lib_dir . $file;
+ elgg_log("Loading $file...");
+ if (!include_once($file)) {
+ $msg = "Could not load $file";
+ throw new InstallationException($msg);
+ }
+}
+
+// Connect to database, load language files, load configuration, init session
+// Plugins can't use this event because they haven't been loaded yet.
+elgg_trigger_event('boot', 'system');
+
+// Load the plugins that are active
+elgg_load_plugins();
+
+// @todo move loading plugins into a single boot function that replaces 'boot', 'system' event
+// and then move this code in there.
+// This validates the view type - first opportunity to do it is after plugins load.
+$view_type = elgg_get_viewtype();
+if (!elgg_is_valid_view_type($view_type)) {
+ elgg_set_viewtype('default');
+}
+
+// @todo deprecate as plugins can use 'init', 'system' event
+elgg_trigger_event('plugins_boot', 'system');
+
+// Complete the boot process for both engine and plugins
+elgg_trigger_event('init', 'system');
+
+$CONFIG->boot_complete = true;
+
+// System loaded and ready
+elgg_trigger_event('ready', 'system');
diff --git a/engine/tests/api/access_collections.php b/engine/tests/api/access_collections.php
new file mode 100644
index 000000000..4acfae596
--- /dev/null
+++ b/engine/tests/api/access_collections.php
@@ -0,0 +1,290 @@
+<?php
+/**
+ * Access Collections tests
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreAccessCollectionsTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ $this->dbPrefix = get_config("dbprefix");
+
+ $user = new ElggUser();
+ $user->username = 'test_user_' . rand();
+ $user->email = 'fake_email@fake.com' . rand();
+ $user->name = 'fake user';
+ $user->access_id = ACCESS_PUBLIC;
+ $user->salt = generate_random_cleartext_password();
+ $user->password = generate_user_password($user, rand());
+ $user->owner_guid = 0;
+ $user->container_guid = 0;
+ $user->save();
+
+ $this->user = $user;
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ // all __destruct() code should go above here
+ $this->user->delete();
+ parent::__destruct();
+ }
+
+ public function testCreateGetDeleteACL() {
+
+ $acl_name = 'test access collection';
+ $acl_id = create_access_collection($acl_name);
+
+ $this->assertTrue(is_int($acl_id));
+
+ $q = "SELECT * FROM {$this->dbPrefix}access_collections WHERE id = $acl_id";
+ $acl = get_data_row($q);
+
+ $this->assertEqual($acl->id, $acl_id);
+
+ if ($acl) {
+ $this->assertEqual($acl->name, $acl_name);
+
+ $result = delete_access_collection($acl_id);
+ $this->assertTrue($result);
+
+ $q = "SELECT * FROM {$this->dbPrefix}access_collections WHERE id = $acl_id";
+ $data = get_data($q);
+ $this->assertIdentical(array(), $data);
+ }
+ }
+
+ public function testAddRemoveUserToACL() {
+ $acl_id = create_access_collection('test acl');
+
+ $result = add_user_to_access_collection($this->user->guid, $acl_id);
+ $this->assertTrue($result);
+
+ if ($result) {
+ $result = remove_user_from_access_collection($this->user->guid, $acl_id);
+ $this->assertIdentical(true, $result);
+ }
+
+ delete_access_collection($acl_id);
+ }
+
+ public function testUpdateACL() {
+ // another fake user to test with
+ $user = new ElggUser();
+ $user->username = 'test_user_' . rand();
+ $user->email = 'fake_email@fake.com' . rand();
+ $user->name = 'fake user';
+ $user->access_id = ACCESS_PUBLIC;
+ $user->salt = generate_random_cleartext_password();
+ $user->password = generate_user_password($user, rand());
+ $user->owner_guid = 0;
+ $user->container_guid = 0;
+ $user->save();
+
+ $acl_id = create_access_collection('test acl');
+
+ $member_lists = array(
+ // adding
+ array(
+ $this->user->guid,
+ $user->guid
+ ),
+ // removing one, keeping one.
+ array(
+ $user->guid
+ ),
+ // removing one, adding one
+ array(
+ $this->user->guid,
+ ),
+ // removing all.
+ array()
+ );
+
+ foreach ($member_lists as $members) {
+ $result = update_access_collection($acl_id, $members);
+ $this->assertTrue($result);
+
+ if ($result) {
+ $q = "SELECT * FROM {$this->dbPrefix}access_collection_membership
+ WHERE access_collection_id = $acl_id";
+ $data = get_data($q);
+
+ if (count($members) == 0) {
+ $this->assertFalse($data);
+ } else {
+ $this->assertEqual(count($members), count($data));
+ }
+ foreach ($data as $row) {
+ $this->assertTrue(in_array($row->user_guid, $members));
+ }
+ }
+ }
+
+ delete_access_collection($acl_id);
+ $user->delete();
+ }
+
+ public function testCanEditACL() {
+ $acl_id = create_access_collection('test acl', $this->user->guid);
+
+ // should be true since it's the owner
+ $result = can_edit_access_collection($acl_id, $this->user->guid);
+ $this->assertTrue($result);
+
+ // should be true since IA is on.
+ $ia = elgg_set_ignore_access(true);
+ $result = can_edit_access_collection($acl_id);
+ $this->assertTrue($result);
+ elgg_set_ignore_access($ia);
+
+ // should be false since IA is off
+ $ia = elgg_set_ignore_access(false);
+ $result = can_edit_access_collection($acl_id);
+ $this->assertFalse($result);
+ elgg_set_ignore_access($ia);
+
+ delete_access_collection($acl_id);
+ }
+
+ public function testCanEditACLHook() {
+ // if only we supported closures!
+ global $acl_test_info;
+
+ $acl_id = create_access_collection('test acl');
+
+ $acl_test_info = array(
+ 'acl_id' => $acl_id,
+ 'user' => $this->user
+ );
+
+ function test_acl_access_hook($hook, $type, $value, $params) {
+ global $acl_test_info;
+ if ($params['user_id'] == $acl_test_info['user']->guid) {
+ $acl = get_access_collection($acl_test_info['acl_id']);
+ $value[$acl->id] = $acl->name;
+ }
+
+ return $value;
+ }
+
+ elgg_register_plugin_hook_handler('access:collections:write', 'all', 'test_acl_access_hook');
+
+ // enable security since we usually run as admin
+ $ia = elgg_set_ignore_access(false);
+ $result = can_edit_access_collection($acl_id, $this->user->guid);
+ $this->assertTrue($result);
+ $ia = elgg_set_ignore_access($ia);
+
+ elgg_unregister_plugin_hook_handler('access:collections:write', 'all', 'test_acl_access_hook');
+
+ delete_access_collection($acl_id);
+ }
+
+ // groups interface
+ // only runs if the groups plugin is enabled because implementation is split between
+ // core and the plugin.
+ public function testCreateDeleteGroupACL() {
+ if (!elgg_is_active_plugin('groups')) {
+ return;
+ }
+
+ $group = new ElggGroup();
+ $group->name = 'Test group';
+ $group->save();
+ $acl = get_access_collection($group->group_acl);
+
+ // ACLs are owned by groups
+ $this->assertEqual($acl->owner_guid, $group->guid);
+
+ // removing group and acl
+ $this->assertTrue($group->delete());
+
+ $acl = get_access_collection($group->group_acl);
+ $this->assertFalse($acl);
+
+ $group->delete();
+ }
+
+ public function testJoinLeaveGroupACL() {
+ if (!elgg_is_active_plugin('groups')) {
+ return;
+ }
+
+ $group = new ElggGroup();
+ $group->name = 'Test group';
+ $group->save();
+
+ $result = $group->join($this->user);
+ $this->assertTrue($result);
+
+ // disable security since we run as admin
+ $ia = elgg_set_ignore_access(false);
+
+ // need to set the page owner to emulate being in a group context.
+ // this is kinda hacky.
+ elgg_set_page_owner_guid($group->getGUID());
+
+ if ($result) {
+ $can_edit = can_edit_access_collection($group->group_acl, $this->user->guid);
+ $this->assertTrue($can_edit);
+ }
+
+ $result = $group->leave($this->user);
+ $this->assertTrue($result);
+
+ if ($result) {
+ $can_edit = can_edit_access_collection($group->group_acl, $this->user->guid);
+ $this->assertFalse($can_edit);
+ }
+
+ elgg_set_ignore_access($ia);
+
+ $group->delete();
+ }
+
+ public function testAccessCaching() {
+ // create a new user to check against
+ $user = new ElggUser();
+ $user->username = 'access_test_user';
+ $user->save();
+
+ foreach (array('get_access_list', 'get_access_array') as $func) {
+ $cache = _elgg_get_access_cache();
+ $cache->clear();
+
+ // admin users run tests, so disable access
+ elgg_set_ignore_access(true);
+ $access = $func($user->getGUID());
+
+ elgg_set_ignore_access(false);
+ $access2 = $func($user->getGUID());
+ $this->assertNotEqual($access, $access2, "Access test for $func");
+ }
+
+ $user->delete();
+ }
+}
diff --git a/engine/tests/api/annotations.php b/engine/tests/api/annotations.php
new file mode 100644
index 000000000..c0b0687cc
--- /dev/null
+++ b/engine/tests/api/annotations.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Elgg Test annotation api
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreAnnotationAPITest extends ElggCoreUnitTest {
+ protected $metastrings;
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->object = new ElggObject();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+
+ unset($this->object);
+ }
+
+ public function testElggGetAnnotationsCount() {
+ $this->object->title = 'Annotation Unit Test';
+ $this->object->save();
+
+ $guid = $this->object->getGUID();
+ create_annotation($guid, 'tested', 'tested1', 'text', 0, ACCESS_PUBLIC);
+ create_annotation($guid, 'tested', 'tested2', 'text', 0, ACCESS_PUBLIC);
+
+ $count = (int)elgg_get_annotations(array(
+ 'annotation_names' => array('tested'),
+ 'guid' => $guid,
+ 'count' => true,
+ ));
+
+ $this->assertIdentical($count, 2);
+
+ $this->object->delete();
+ }
+
+ public function testElggDeleteAnnotations() {
+ $e = new ElggObject();
+ $e->save();
+
+ for ($i=0; $i<30; $i++) {
+ $e->annotate('test_annotation', rand(0,10000));
+ }
+
+ $options = array(
+ 'guid' => $e->getGUID(),
+ 'limit' => 0
+ );
+
+ $annotations = elgg_get_annotations($options);
+ $this->assertIdentical(30, count($annotations));
+
+ $this->assertTrue(elgg_delete_annotations($options));
+
+ $annotations = elgg_get_annotations($options);
+ $this->assertTrue(empty($annotations));
+
+ // nothing to delete so null returned
+ $this->assertNull(elgg_delete_annotations($options));
+
+ $this->assertTrue($e->delete());
+ }
+
+ public function testElggDisableAnnotations() {
+ $e = new ElggObject();
+ $e->save();
+
+ for ($i=0; $i<30; $i++) {
+ $e->annotate('test_annotation', rand(0,10000));
+ }
+
+ $options = array(
+ 'guid' => $e->getGUID(),
+ 'limit' => 0
+ );
+
+ $this->assertTrue(elgg_disable_annotations($options));
+
+ $annotations = elgg_get_annotations($options);
+ $this->assertTrue(empty($annotations));
+
+ access_show_hidden_entities(true);
+ $annotations = elgg_get_annotations($options);
+ $this->assertIdentical(30, count($annotations));
+ access_show_hidden_entities(false);
+
+ $this->assertTrue($e->delete());
+ }
+
+ public function testElggEnableAnnotations() {
+ $e = new ElggObject();
+ $e->save();
+
+ for ($i=0; $i<30; $i++) {
+ $e->annotate('test_annotation', rand(0,10000));
+ }
+
+ $options = array(
+ 'guid' => $e->getGUID(),
+ 'limit' => 0
+ );
+
+ $this->assertTrue(elgg_disable_annotations($options));
+
+ // cannot see any annotations so returns null
+ $this->assertNull(elgg_enable_annotations($options));
+
+ access_show_hidden_entities(true);
+ $this->assertTrue(elgg_enable_annotations($options));
+ access_show_hidden_entities(false);
+
+ $annotations = elgg_get_annotations($options);
+ $this->assertIdentical(30, count($annotations));
+
+ $this->assertTrue($e->delete());
+ }
+
+ public function testElggAnnotationExists() {
+ $e = new ElggObject();
+ $e->save();
+ $guid = $e->getGUID();
+
+ $this->assertFalse(elgg_annotation_exists($guid, 'test_annotation'));
+
+ $e->annotate('test_annotation', rand(0, 10000));
+ $this->assertTrue(elgg_annotation_exists($guid, 'test_annotation'));
+ // this metastring should always exist but an annotation of this name should not
+ $this->assertFalse(elgg_annotation_exists($guid, 'email'));
+
+ $options = array(
+ 'guid' => $guid,
+ 'limit' => 0
+ );
+ $this->assertTrue(elgg_disable_annotations($options));
+ $this->assertTrue(elgg_annotation_exists($guid, 'test_annotation'));
+
+ $this->assertTrue($e->delete());
+ $this->assertFalse(elgg_annotation_exists($guid, 'test_annotation'));
+ }
+}
diff --git a/engine/tests/api/entity_getter_functions.php b/engine/tests/api/entity_getter_functions.php
new file mode 100644
index 000000000..fef9dc0c5
--- /dev/null
+++ b/engine/tests/api/entity_getter_functions.php
@@ -0,0 +1,2884 @@
+<?php
+
+/**
+ * Elgg Test Entity Getter Functions
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ elgg_set_ignore_access(TRUE);
+ $this->entities = array();
+ $this->subtypes = array(
+ 'object' => array(),
+ 'user' => array(),
+ 'group' => array(),
+ //'site' => array()
+ );
+
+ // sites are a bit wonky. Don't use them just now.
+ $this->types = array('object', 'user', 'group');
+
+ // create some fun objects to play with.
+ // 5 with random subtypes
+ for ($i=0; $i<5; $i++) {
+ $subtype = 'test_object_subtype_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->save();
+
+ $this->entities[] = $e;
+ $this->subtypes['object'][] = $subtype;
+ }
+
+ // and users
+ for ($i=0; $i<5; $i++) {
+ $subtype = "test_user_subtype_" . rand();
+ $e = new ElggUser();
+ $e->username = "test_user_" . rand();
+ $e->subtype = $subtype;
+ $e->save();
+
+ $this->entities[] = $e;
+ $this->subtypes['user'][] = $subtype;
+ }
+
+ // and groups
+ for ($i=0; $i<5; $i++) {
+ $subtype = "test_group_subtype_" . rand();
+ $e = new ElggGroup();
+ $e->subtype = $subtype;
+ $e->save();
+
+ $this->entities[] = $e;
+ $this->subtypes['group'][] = $subtype;
+ }
+
+ parent::__construct();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function setUp() {
+ return TRUE;
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ return TRUE;
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ global $CONFIG;
+
+ $this->swallowErrors();
+ foreach ($this->entities as $e) {
+ $e->delete();
+ }
+
+ // manually remove subtype entries since there is no way
+ // to using the API.
+ $subtype_arr = array();
+ foreach ($this->subtypes as $type => $subtypes) {
+ foreach ($subtypes as $subtype) {
+ $subtype_arr[] = "'$subtype'";
+ }
+ }
+
+ $subtype_str = implode(',', $subtype_arr);
+ $q = "DELETE FROM {$CONFIG->dbprefix}entity_subtypes WHERE subtype IN ($subtype_str)";
+ delete_data($q);
+
+ parent::__destruct();
+ }
+
+
+ /*************************************************
+ * Helpers for getting random types and subtypes *
+ *************************************************/
+
+ /**
+ * Get a random valid subtype
+ *
+ * @param int $num
+ * @return array
+ */
+ public function getRandomValidTypes($num = 1) {
+ $r = array();
+
+ for ($i=1; $i<=$num; $i++) {
+ do {
+ $t = $this->types[array_rand($this->types)];
+ } while (in_array($t, $r) && count($r) < count($this->types));
+
+ $r[] = $t;
+ }
+
+ shuffle($r);
+ return $r;
+ }
+
+ /**
+ * Get a random valid subtype (that we just created)
+ *
+ * @param array $type Type of objects to return valid subtypes for.
+ * @param int $num of subtypes.
+ *
+ * @return array
+ */
+ public function getRandomValidSubtypes(array $types, $num = 1) {
+ $r = array();
+
+ for ($i=1; $i<=$num; $i++) {
+ do {
+ // make sure at least one subtype of each type is returned.
+ if ($i-1 < count($types)) {
+ $type = $types[$i-1];
+ } else {
+ $type = $types[array_rand($types)];
+ }
+
+ $k = array_rand($this->subtypes[$type]);
+ $t = $this->subtypes[$type][$k];
+ } while (in_array($t, $r));
+
+ $r[] = $t;
+ }
+
+ shuffle($r);
+ return $r;
+ }
+
+ /**
+ * Return an array of invalid strings for type or subtypes.
+ *
+ * @param int $num
+ * @return arr
+ */
+ public function getRandomInvalids($num = 1) {
+ $r = array();
+
+ for ($i=1; $i<=$num; $i++) {
+ $r[] = 'random_invalid_' . rand();
+ }
+
+ return $r;
+ }
+
+ /**
+ * Get a mix of valid and invalid types
+ *
+ * @param int $num
+ * @return array
+ */
+ public function getRandomMixedTypes($num = 2) {
+ $have_valid = $have_invalid = false;
+ $r = array();
+
+ // need at least one of each type.
+ $valid_n = rand(1, $num-1);
+ $r = array_merge($r, $this->getRandomValidTypes($valid_n));
+ $r = array_merge($r, $this->getRandomInvalids($num - $valid_n));
+
+ shuffle($r);
+ return $r;
+ }
+
+ /**
+ * Get random mix of valid and invalid subtypes for types given.
+ *
+ * @param array $types
+ * @param int $num
+ * @return array
+ */
+ public function getRandomMixedSubtypes(array $types, $num = 2) {
+ $types_c = count($types);
+ $r = array();
+
+ // this can be more efficient but I'm very sleepy...
+
+ // want at least one of valid and invalid of each type sent.
+ for ($i=0; $i < $types_c && $num > 0; $i++) {
+ // make sure we have a valid and invalid for each type
+ if (true) {
+ $type = $types[$i];
+ $r = array_merge($r, $this->getRandomValidSubtypes(array($type), 1));
+ $r = array_merge($r, $this->getRandomInvalids(1));
+
+ $num -= 2;
+ }
+ }
+
+ if ($num > 0) {
+ $valid_n = rand(1, $num);
+ $r = array_merge($r, $this->getRandomValidSubtypes($types, $valid_n));
+ $r = array_merge($r, $this->getRandomInvalids($num - $valid_n));
+ }
+
+ //shuffle($r);
+ return $r;
+ }
+
+ /**
+ * Creates random annotations on $entity
+ *
+ * @param ElggEntity $entity
+ * @param int $max
+ */
+ public function createRandomAnnotations($entity, $max = 1) {
+ $annotations = array();
+ for ($i=0; $i<$max; $i++) {
+ $name = 'test_annotation_name_' . rand();
+ $value = rand();
+ $id = create_annotation($entity->getGUID(), $name, $value, 'integer', $entity->getGUID());
+ $annotations[] = elgg_get_annotation_from_id($id);
+ }
+
+ return $annotations;
+ }
+
+
+ /***********************************
+ * TYPE TESTS
+ ***********************************
+ * check for getting a valid type in all ways we can.
+ * note that these aren't wonderful tests as there will be
+ * existing entities so we can't test against the ones we just created.
+ * So these just test that some are returned and match the type(s) requested.
+ * It could definitely be the case that the first 10 entities retrieved are all
+ * objects. Maybe best to limit to 4 and group by type.
+ */
+ public function testElggAPIGettersValidTypeUsingType() {
+ $type_arr = $this->getRandomValidTypes();
+ $type = $type_arr[0];
+ $options = array(
+ 'type' => $type,
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // should only ever return one object because of group by
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $type_arr));
+ }
+ }
+
+ public function testElggAPIGettersValidTypeUsingTypesAsString() {
+ $type_arr = $this->getRandomValidTypes();
+ $type = $type_arr[0];
+ $options = array(
+ 'types' => $type,
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // should only ever return one object because of group by
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $type_arr));
+ }
+ }
+
+ public function testElggAPIGettersValidTypeUsingTypesAsArray() {
+ $type_arr = $this->getRandomValidTypes();
+ $type = $type_arr[0];
+ $options = array(
+ 'types' => $type_arr,
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // should only ever return one object because of group by
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $type_arr));
+ }
+ }
+
+ public function testElggAPIGettersValidTypeUsingTypesAsArrayPlural() {
+ $num = 2;
+ $types = $this->getRandomValidTypes($num);
+ $options = array(
+ 'types' => $types,
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // one of object and one of group
+ $this->assertIdentical(count($es), $num);
+
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ }
+ }
+
+
+
+ /*
+ * Test mixed valid and invalid types.
+ */
+
+
+ public function testElggAPIGettersValidAndInvalidTypes() {
+ //@todo replace this with $this->getRandomMixedTypes().
+ $t = $this->getRandomValidTypes();
+ $valid = $t[0];
+
+ $t = $this->getRandomInvalids();
+ $invalid = $t[0];
+ $options = array(
+ 'types' => array($invalid, $valid),
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // should only ever return one object because of group by
+ $this->assertIdentical(count($es), 1);
+ $this->assertIdentical($es[0]->getType(), $valid);
+ }
+
+ public function testElggAPIGettersValidAndInvalidTypesPlural() {
+ $valid_num = 2;
+ $invalid_num = 3;
+ $valid = $this->getRandomValidTypes($valid_num);
+ $invalid = $this->getRandomInvalids($invalid_num);
+
+ $types = array();
+ foreach ($valid as $t) {
+ $types[] = $t;
+ }
+
+ foreach ($invalid as $t) {
+ $types[] = $t;
+ }
+
+ shuffle($types);
+ $options = array(
+ 'types' => $types,
+ 'group_by' => 'e.type'
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // should only ever return one object because of group by
+ $this->assertIdentical(count($es), $valid_num);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $valid));
+ }
+ }
+
+
+
+ /**************************************
+ * SUBTYPE TESTS
+ **************************************
+ *
+ * Here we can use the subtypes we created to test more finely.
+ * Subtypes are bound to types, so we must pass a type.
+ * This is where the fun logic starts.
+ */
+
+ public function testElggAPIGettersValidSubtypeUsingSubtypeSingularType() {
+ $types = $this->getRandomValidTypes();
+ $subtypes = $this->getRandomValidSubtypes($types);
+ $subtype = $subtypes[0];
+
+ $options = array(
+ 'types' => $types,
+ 'subtype' => $subtype
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+ public function testElggAPIGettersValidSubtypeUsingSubtypesAsStringSingularType() {
+ $types = $this->getRandomValidTypes();
+ $subtypes = $this->getRandomValidSubtypes($types);
+ $subtype = $subtypes[0];
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtype
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+ public function testElggAPIGettersValidSubtypeUsingSubtypesAsArraySingularType() {
+ $types = $this->getRandomValidTypes();
+ $subtypes = $this->getRandomValidSubtypes($types);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), 1);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+ public function testElggAPIGettersValidSubtypeUsingPluralSubtypesSingularType() {
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes();
+ $subtypes = $this->getRandomValidSubtypes($types, $subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), $subtype_num);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+
+ /*
+ Because we're looking for type OR subtype (sorta)
+ it's possible that we've pulled in entities that aren't
+ of the subtype we've requested.
+ THIS COMBINATION MAKES LITTLE SENSE.
+ There is no mechanism in elgg to retrieve a subtype without a type, so
+ this combo gets trimmed down to only including subtypes that are valid to
+ each particular type.
+ FOR THE LOVE OF ALL GOOD PLEASE JUST USE TYPE_SUBTYPE_PAIRS!
+ */
+ public function testElggAPIGettersValidSubtypeUsingPluralSubtypesPluralTypes() {
+ $type_num = 2;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomValidSubtypes($types, $subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // this will unset all invalid subtypes for each type that that only
+ // one entity exists of each.
+ $this->assertIdentical(count($es), $subtype_num);
+ foreach ($es as $e) {
+ // entities must at least be in the type.
+ $this->assertTrue(in_array($e->getType(), $types));
+
+ // test that this is a valid subtype for the entity type.
+ $this->assertTrue(in_array($e->getSubtype(), $this->subtypes[$e->getType()]));
+ }
+ }
+
+ /*
+ * This combination will remove all invalid subtypes for this type.
+ */
+ public function testElggAPIGettersValidSubtypeUsingPluralMixedSubtypesSingleType() {
+ $type_num = 1;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+
+
+ //@todo replace this with $this->getRandomMixedSubtypes()
+ // we want this to return an invalid subtype for the returned type.
+ $subtype_types = $types;
+ $i = 1;
+ while ($i <= $subtype_num) {
+ $type = $this->types[$i-1];
+
+ if (!in_array($type, $subtype_types)) {
+ $subtype_types[] = $type;
+ }
+ $i++;
+ }
+
+ $subtypes = $this->getRandomValidSubtypes($subtype_types, $type_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ // this will unset all invalid subtypes for each type that that only
+ // one entity exists of each.
+ $this->assertIdentical(count($es), $type_num);
+ foreach ($es as $e) {
+ // entities must at least be in the type.
+ $this->assertTrue(in_array($e->getType(), $types));
+
+ // test that this is a valid subtype for the entity type.
+ $this->assertTrue(in_array($e->getSubtype(), $this->subtypes[$e->getType()]));
+ }
+ }
+
+
+ /***************************
+ * TYPE_SUBTYPE_PAIRS
+ ***************************/
+
+ /**
+ * Valid type, valid subtype pairs
+ */
+ public function testElggAPIGettersTSPValidTypeValidSubtype() {
+ $type_num = 1;
+ $subtype_num = 1;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomValidSubtypes($types, $subtype_num);
+
+ $pair = array($types[0] => $subtypes[0]);
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), $type_num);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+ /**
+ * Valid type, multiple valid subtypes
+ */
+ public function testElggAPIGettersTSPValidTypeValidPluralSubtype() {
+ $type_num = 1;
+ $subtype_num = 3;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomValidSubtypes($types, $subtype_num);
+
+ $pair = array($types[0] => $subtypes);
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), $subtype_num);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $subtypes));
+ }
+ }
+
+ /**
+ * Valid type, both valid and invalid subtypes
+ */
+ public function testElggAPIGettersTSPValidTypeMixedPluralSubtype() {
+ $type_num = 1;
+ $valid_subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $valid = $this->getRandomValidSubtypes($types, $valid_subtype_num);
+ $invalid = $this->getRandomInvalids();
+
+ $subtypes = array_merge($valid, $invalid);
+ shuffle($subtypes);
+
+ $pair = array($types[0] => $subtypes);
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertIsA($es, 'array');
+
+ $this->assertIdentical(count($es), $valid_subtype_num);
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->getType(), $types));
+ $this->assertTrue(in_array($e->getSubtype(), $valid));
+ }
+ }
+
+
+ /****************************
+ * FALSE-RETURNING TESTS
+ ****************************
+ * The original bug corrected returned
+ * all entities when invalid subtypes were passed.
+ * Because there's a huge numer of combinations that
+ * return entities, I'm only writing tests for
+ * things that should return false.
+ *
+ * I'm leaving the above in case anyone is inspired to
+ * write out the rest of the possible combinations
+ */
+
+
+ /**
+ * Test invalid types with singular 'type'.
+ */
+ public function testElggApiGettersInvalidTypeUsingType() {
+ $type_arr = $this->getRandomInvalids();
+ $type = $type_arr[0];
+
+ $options = array(
+ 'type' => $type
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ /**
+ * Test invalid types with plural 'types'.
+ */
+ public function testElggApiGettersInvalidTypeUsingTypesAsString() {
+ $type_arr = $this->getRandomInvalids();
+ $type = $type_arr[0];
+
+ $options = array(
+ 'types' => $type
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ /**
+ * Test invalid types with plural 'types' and an array of a single type
+ */
+ public function testElggApiGettersInvalidTypeUsingTypesAsArray() {
+ $type_arr = $this->getRandomInvalids(1);
+
+ $options = array(
+ 'types' => $type_arr
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ /**
+ * Test invalid types with plural 'types' and an array of a two types
+ */
+ public function testElggApiGettersInvalidTypes() {
+ $type_arr = $this->getRandomInvalids(2);
+
+ $options = array(
+ 'types' => $type_arr
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersInvalidSubtypeValidType() {
+ $type_num = 1;
+ $subtype_num = 1;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersInvalidSubtypeValidTypes() {
+ $type_num = 2;
+ $subtype_num = 1;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersInvalidSubtypesValidType() {
+ $type_num = 1;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersInvalidSubtypesValidTypes() {
+ $type_num = 2;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $options = array(
+ 'types' => $types,
+ 'subtypes' => $subtypes
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersTSPInvalidType() {
+ $type_num = 1;
+ $types = $this->getRandomInvalids($type_num);
+
+ $pair = array();
+
+ foreach ($types as $type) {
+ $pair[$type] = NULL;
+ }
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersTSPInvalidTypes() {
+ $type_num = 2;
+ $types = $this->getRandomInvalids($type_num);
+
+ $pair = array();
+ foreach ($types as $type) {
+ $pair[$type] = NULL;
+ }
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersTSPValidTypeInvalidSubtype() {
+ $type_num = 1;
+ $subtype_num = 1;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $pair = array($types[0] => $subtypes[0]);
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersTSPValidTypeInvalidSubtypes() {
+ $type_num = 1;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $pair = array($types[0] => array($subtypes[0], $subtypes[0]));
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+ public function testElggApiGettersTSPValidTypesInvalidSubtypes() {
+ $type_num = 2;
+ $subtype_num = 2;
+ $types = $this->getRandomValidTypes($type_num);
+ $subtypes = $this->getRandomInvalids($subtype_num);
+
+ $pair = array();
+ foreach ($types as $type) {
+ $pair[$type] = $subtypes;
+ }
+
+ $options = array(
+ 'type_subtype_pairs' => $pair
+ );
+
+ $es = elgg_get_entities($options);
+ $this->assertFalse($es);
+ }
+
+
+
+
+
+
+ public function testElggApiGettersEntityNoSubtype() {
+ // create an entity we can later delete.
+ // order by guid and limit by 1 should == this entity.
+
+ $e = new ElggObject();
+ $e->save();
+
+ $options = array(
+ 'type' => 'object',
+ 'limit' => 1,
+ 'order_by' => 'guid desc'
+ );
+
+ // grab ourself again to fill out attributes.
+ $e = get_entity($e->getGUID());
+
+ $entities = elgg_get_entities($options);
+
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertIdentical($e->getGUID(), $entity->getGUID());
+ }
+
+ $e->delete();
+ }
+
+ public function testElggApiGettersEntityNoValueSubtypeNotSet() {
+ // create an entity we can later delete.
+ // order by time created and limit by 1 should == this entity.
+
+ $e = new ElggObject();
+ $e->save();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => ELGG_ENTITIES_NO_VALUE,
+ 'limit' => 1,
+ 'order_by' => 'guid desc'
+ );
+
+ // grab ourself again to fill out attributes.
+ $e = get_entity($e->getGUID());
+
+ $entities = elgg_get_entities($options);
+
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertIdentical($e->getGUID(), $entity->getGUID());
+ }
+
+ $e->delete();
+ }
+
+ public function testElggApiGettersEntityNoValueSubtypeSet() {
+ global $CONFIG;
+ // create an entity we can later delete.
+ // order by time created and limit by 1 should == this entity.
+
+ $subtype = 'subtype_' . rand();
+
+ $e_subtype = new ElggObject();
+ $e_subtype->subtype = $subtype;
+ $e_subtype->save();
+
+ $e = new ElggObject();
+ $e->save();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => ELGG_ENTITIES_NO_VALUE,
+ 'limit' => 1,
+ 'order_by' => 'guid desc'
+ );
+
+ // grab ourself again to fill out attributes.
+ $e = get_entity($e->getGUID());
+
+ $entities = elgg_get_entities($options);
+
+ $this->assertEqual(count($entities), 1);
+
+ // this entity should NOT be the entity we just created
+ // and should have no subtype
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->subtype_id, 0);
+ }
+
+ $e_subtype->delete();
+ $e->delete();
+
+ $q = "DELETE FROM {$CONFIG->dbprefix}entity_subtypes WHERE subtype = '$subtype'";
+ delete_data($q);
+ }
+
+
+
+ /************
+ * METADATA
+ ************/
+
+ //names
+
+ function testElggApiGettersEntityMetadataNameValidSingle() {
+ // create a new entity with a subtype we know
+ // use an existing type so it will clean up automatically
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name' => $md_name
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $e->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ }
+
+ $e->delete();
+ }
+
+ function testElggApiGettersEntityMetadataNameValidMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_names = array();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_names[] = $md_name;
+ $e_guids = array();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_names[] = $md_name;
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_names' => $md_names
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 2);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $e_guids));
+ $entity->delete();
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNameInvalidSingle() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $md_invalid_name = 'test_metadata_name_' . rand();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name' => $md_invalid_name
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ $e->delete();
+ }
+
+ function testElggApiGettersEntityMetadataNameInvalidMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $md_invalid_names = array();
+ $md_invalid_names[] = 'test_metadata_name_' . rand();
+ $md_invalid_names[] = 'test_metadata_name_' . rand();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_names' => $md_invalid_names
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ $e->delete();
+ }
+
+
+ function testElggApiGettersEntityMetadataNameMixedMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_names = array();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_names[] = $md_name;
+ $e_guids = array();
+
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->save();
+ $e_guids[] = $valid->getGUID();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ // add a random invalid name.
+ $md_names[] = 'test_metadata_name_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_names' => $md_names
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ }
+
+ foreach ($e_guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+
+ // values
+ function testElggApiGettersEntityMetadataValueValidSingle() {
+ // create a new entity with a subtype we know
+ // use an existing type so it will clean up automatically
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_value' => $md_value
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $e->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ }
+
+ $e->delete();
+ }
+
+ function testElggApiGettersEntityMetadataValueValidMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_values = array();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_values[] = $md_value;
+ $e_guids = array();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_values[] = $md_value;
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_values' => $md_values
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 2);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $e_guids));
+ $entity->delete();
+ }
+ }
+
+ function testElggApiGettersEntityMetadataValueInvalidSingle() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $md_invalid_value = 'test_metadata_value_' . rand();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_value' => $md_invalid_value
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ $e->delete();
+ }
+
+ function testElggApiGettersEntityMetadataValueInvalidMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+
+ $md_invalid_values = array();
+ $md_invalid_values[] = 'test_metadata_value_' . rand();
+ $md_invalid_values[] = 'test_metadata_value_' . rand();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_values' => $md_invalid_values
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ $e->delete();
+ }
+
+
+ function testElggApiGettersEntityMetadataValueMixedMultiple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_values = array();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $md_values[] = $md_value;
+ $e_guids = array();
+
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->save();
+ $e_guids[] = $valid->getGUID();
+
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ // add a random invalid value.
+ $md_values[] = 'test_metadata_value_' . rand();
+
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $md_value;
+ $e->save();
+ $e_guids[] = $e->getGUID();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_values' => $md_values
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ }
+
+ foreach ($e_guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+
+ // name_value_pairs
+
+
+ function testElggApiGettersEntityMetadataNVPValidNValidVEquals() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $guids = array();
+
+ // our target
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(array(
+ 'name' => $md_name,
+ 'value' => $md_value
+ ))
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNVPValidNValidVEqualsTriple() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $md_name2 = 'test_metadata_name_' . rand();
+ $md_value2 = 'test_metadata_value_' . rand();
+
+ $md_name3 = 'test_metadata_name_' . rand();
+ $md_value3 = 'test_metadata_value_' . rand();
+
+ $guids = array();
+
+ // our target
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->$md_name2 = $md_value2;
+ $valid->$md_name3 = $md_value3;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $invalid_md_name2 = 'test_metadata_name_' . rand();
+ $invalid_md_name3 = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->$invalid_md_name2 = $md_value2;
+ $e->$invalid_md_name3 = $md_value3;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->$md_name2 = $invalid_md_value;
+ $e->$md_name3 = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(
+ array(
+ 'name' => $md_name,
+ 'value' => $md_value
+ ),
+ array(
+ 'name' => $md_name2,
+ 'value' => $md_value2
+ ),
+ array(
+ 'name' => $md_name3,
+ 'value' => $md_value3
+ )
+ )
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNVPValidNValidVEqualsDouble() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $md_name2 = 'test_metadata_name_' . rand();
+ $md_value2 = 'test_metadata_value_' . rand();
+
+ $guids = array();
+
+ // our target
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->$md_name2 = $md_value2;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $invalid_md_name2 = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->$invalid_md_name2 = $md_value2;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->$md_name2 = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(
+ array(
+ 'name' => $md_name,
+ 'value' => $md_value
+ ),
+ array(
+ 'name' => $md_name2,
+ 'value' => $md_value2
+ )
+ )
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ // this keeps locking up my database...
+ function xtestElggApiGettersEntityMetadataNVPValidNValidVEqualsStupid() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+
+ $md_name2 = 'test_metadata_name_' . rand();
+ $md_value2 = 'test_metadata_value_' . rand();
+
+ $md_name3 = 'test_metadata_name_' . rand();
+ $md_value3 = 'test_metadata_value_' . rand();
+
+ $md_name3 = 'test_metadata_name_' . rand();
+ $md_value3 = 'test_metadata_value_' . rand();
+
+ $md_name4 = 'test_metadata_name_' . rand();
+ $md_value4 = 'test_metadata_value_' . rand();
+
+ $md_name5 = 'test_metadata_name_' . rand();
+ $md_value5 = 'test_metadata_value_' . rand();
+
+ $guids = array();
+
+ // our target
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->$md_name2 = $md_value2;
+ $valid->$md_name3 = $md_value3;
+ $valid->$md_name4 = $md_value4;
+ $valid->$md_name5 = $md_value5;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->$md_name2 = $md_value2;
+ $e->$md_name3 = $md_value3;
+ $e->$md_name4 = $md_value4;
+ $e->$md_name5 = $md_value5;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->$md_name2 = $invalid_md_value;
+ $e->$md_name3 = $invalid_md_value;
+ $e->$md_name4 = $invalid_md_value;
+ $e->$md_name5 = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(
+ array(
+ 'name' => $md_name,
+ 'value' => $md_value
+ ),
+ array(
+ 'name' => $md_name2,
+ 'value' => $md_value2
+ ),
+ array(
+ 'name' => $md_name3,
+ 'value' => $md_value3
+ ),
+ array(
+ 'name' => $md_name4,
+ 'value' => $md_value4
+ ),
+ array(
+ 'name' => $md_name5,
+ 'value' => $md_value5
+ ),
+ )
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 1);
+
+ foreach ($entities as $entity) {
+ $this->assertEqual($entity->getGUID(), $valid->getGUID());
+ $this->assertEqual($entity->$md_name, $md_value);
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ /**
+ * Name value pair with valid name and invalid value
+ */
+ function testElggApiGettersEntityMetadataNVPValidNInvalidV() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $guids = array();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(array(
+ 'name' => $md_name,
+ 'value' => 'test_metadata_value_' . rand()
+ ))
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ /**
+ * Name value pair with invalid name and valid value
+ */
+ function testElggApiGettersEntityMetadataNVPInvalidNValidV() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $guids = array();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_invalid_names = array();
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(array(
+ 'name' => 'test_metadata_name_' . rand(),
+ 'value' => $md_value
+ ))
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIdentical(array(), $entities);
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+
+ function testElggApiGettersEntityMetadataNVPValidNValidVOperandIn() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $guids = array();
+ $valid_guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid->getGUID();
+
+ $md_name2 = 'test_metadata_name_' . rand();
+ $md_value2 = 'test_metadata_value_' . rand();
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->$md_name2 = $md_value2;
+ $valid2->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid2->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_valid_values = "'$md_value', '$md_value2'";
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(
+ array(
+ 'name' => $md_name,
+ 'value' => $md_valid_values,
+ 'operand' => 'IN'
+ ),
+ array(
+ 'name' => $md_name2,
+ 'value' => $md_valid_values,
+ 'operand' => 'IN'
+ ),
+ ),
+ 'metadata_name_value_pairs_operator' => 'OR'
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 2);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNVPValidNValidVPlural() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $md_value = 'test_metadata_value_' . rand();
+ $guids = array();
+ $valid_guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = $md_value;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid->getGUID();
+
+ $md_name2 = 'test_metadata_name_' . rand();
+ $md_value2 = 'test_metadata_value_' . rand();
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->$md_name2 = $md_value2;
+ $valid2->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid2->getGUID();
+
+ // make some bad ones
+ $invalid_md_name = 'test_metadata_name_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$invalid_md_name = $md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $invalid_md_value = 'test_metadata_value_' . rand();
+ $e = new ElggObject();
+ $e->subtype = $subtype;
+ $e->$md_name = $invalid_md_value;
+ $e->save();
+ $guids[] = $e->getGUID();
+
+ $md_valid_values = array($md_value, $md_value2);
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name_value_pairs' => array(
+ array(
+ 'name' => $md_name,
+ 'value' => $md_valid_values,
+ 'operand' => 'IN'
+ ),
+ array(
+ 'name' => $md_name2,
+ 'value' => $md_valid_values,
+ 'operand' => 'IN'
+ ),
+ ),
+ 'metadata_name_value_pairs_operator' => 'OR'
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 2);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNVPOrderByMDText() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $guids = array();
+ $valid_guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = 1;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid->getGUID();
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->$md_name = 2;
+ $valid2->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid2->getGUID();
+
+ $valid3 = new ElggObject();
+ $valid3->subtype = $subtype;
+ $valid3->$md_name = 3;
+ $valid3->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid3->getGUID();
+
+ $md_valid_values = array(1, 2, 3);
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ //'metadata_name' => $md_name,
+ 'order_by_metadata' => array('name' => $md_name, 'as' => 'integer')
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 3);
+
+ $i = 1;
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+ $this->assertEqual($entity->$md_name, $i);
+ $i++;
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ function testElggApiGettersEntityMetadataNVPOrderByMDString() {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $md_name = 'test_metadata_name_' . rand();
+ $guids = array();
+ $valid_guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->$md_name = 'a';
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid->getGUID();
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->$md_name = 'b';
+ $valid2->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid2->getGUID();
+
+ $valid3 = new ElggObject();
+ $valid3->subtype = $subtype;
+ $valid3->$md_name = 'c';
+ $valid3->save();
+ $guids[] = $valid->getGUID();
+ $valid_guids[] = $valid3->getGUID();
+
+ $md_valid_values = array('a', 'b', 'c');
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'metadata_name' => $md_name,
+ 'order_by_metadata' => array('name' => $md_name, 'as' => 'text')
+ );
+
+ $entities = elgg_get_entities_from_metadata($options);
+
+ $this->assertIsa($entities, 'array');
+ $this->assertEqual(count($entities), 3);
+
+ $alpha = array('a', 'b', 'c');
+
+ $i = 0;
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+ $this->assertEqual($entity->$md_name, $alpha[$i]);
+ $i++;
+ $entity->delete();
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ /**
+ * Annotations
+ */
+ public function testElggApiGettersEntitiesFromAnnotation() {
+
+ // grab a few different users to annotation
+ // there will always be at least 2 here because of the construct.
+ $users = elgg_get_entities(array('type' => 'user', 'limit' => 2));
+
+ // create some test annotations
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $annotation_name = 'test_annotation_name_' . rand();
+ $annotation_value = rand(1000, 9999);
+ $annotation_name2 = 'test_annotation_name_' . rand();
+ $annotation_value2 = rand(1000, 9999);
+ $guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ create_annotation($valid->getGUID(), $annotation_name, $annotation_value, 'integer', $users[0]->getGUID());
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->save();
+ $guids[] = $valid2->getGUID();
+ create_annotation($valid2->getGUID(), $annotation_name2, $annotation_value2, 'integer', $users[1]->getGUID());
+
+ $options = array(
+ 'annotation_owner_guid' => $users[0]->getGUID(),
+ 'annotation_name' => $annotation_name
+ );
+
+ $entities = elgg_get_entities_from_annotations($options);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $guids));
+ $annotations = $entity->getAnnotations($annotation_name);
+ $this->assertEqual(count($annotations), 1);
+
+ $this->assertEqual($annotations[0]->name, $annotation_name);
+ $this->assertEqual($annotations[0]->value, $annotation_value);
+ $this->assertEqual($annotations[0]->owner_guid, $users[0]->getGUID());
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ // Make sure metadata doesn't affect getting entities by relationship. See #2274
+ public function testElggApiGettersEntityRelationshipWithMetadata() {
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ add_entity_relationship($guids[0], 'test', $guids[1]);
+
+ $options = array(
+ 'relationship' => 'test',
+ 'relationship_guid' => $guids[0]
+ );
+
+ $es = elgg_get_entities_from_relationship($options);
+ $this->assertTrue(is_array($es));
+ $this->assertIdentical(count($es), 1);
+
+ foreach ($es as $e) {
+ $this->assertEqual($guids[1], $e->guid);
+ }
+
+ foreach ($guids as $guid) {
+ $e = get_entity($guid);
+ $e->delete();
+ }
+ }
+
+ public function testElggApiGettersEntityRelationshipWithOutMetadata() {
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ add_entity_relationship($guids[0], 'test', $guids[1]);
+
+ $options = array(
+ 'relationship' => 'test',
+ 'relationship_guid' => $guids[0]
+ );
+
+ $es = elgg_get_entities_from_relationship($options);
+ $this->assertTrue(is_array($es));
+ $this->assertIdentical(count($es), 1);
+
+ foreach ($es as $e) {
+ $this->assertEqual($guids[1], $e->guid);
+ }
+
+ foreach ($guids as $guid) {
+ $e = get_entity($guid);
+ $e->delete();
+ }
+ }
+
+ public function testElggApiGettersEntityRelationshipWithMetadataIncludingRealMetadata() {
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ add_entity_relationship($guids[0], 'test', $guids[1]);
+
+ $options = array(
+ 'relationship' => 'test',
+ 'relationship_guid' => $guids[0],
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ );
+
+ $es = elgg_get_entities_from_relationship($options);
+ $this->assertTrue(is_array($es));
+ $this->assertIdentical(count($es), 1);
+
+ foreach ($es as $e) {
+ $this->assertEqual($guids[1], $e->guid);
+ }
+
+ foreach ($guids as $guid) {
+ $e = get_entity($guid);
+ $e->delete();
+ }
+ }
+
+ public function testElggApiGettersEntityRelationshipWithMetadataIncludingFakeMetadata() {
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ add_entity_relationship($guids[0], 'test', $guids[1]);
+
+ $options = array(
+ 'relationship' => 'test',
+ 'relationship_guid' => $guids[0],
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'invalid',
+ );
+
+ $es = elgg_get_entities_from_relationship($options);
+
+ $this->assertTrue(empty($es));
+
+ foreach ($guids as $guid) {
+ $e = get_entity($guid);
+ $e->delete();
+ }
+ }
+
+ public function testElggApiGettersEntitySiteSingular() {
+ global $CONFIG;
+
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ // luckily this is never checked.
+ $obj1->site_guid = 2;
+ $obj1->save();
+ $guids[] = $obj1->guid;
+ $right_guid = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->site_guid = $CONFIG->site->guid;
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ $options = array(
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ 'site_guid' => 2
+ );
+
+ $es = elgg_get_entities_from_metadata($options);
+ $this->assertTrue(is_array($es));
+ $this->assertEqual(1, count($es));
+ $this->assertEqual($right_guid, $es[0]->guid);
+
+ foreach ($guids as $guid) {
+ get_entity($guid)->delete();
+ }
+ }
+
+ public function testElggApiGettersEntitySiteSingularAny() {
+ global $CONFIG;
+
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ // luckily this is never checked.
+ $obj1->site_guid = 2;
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->site_guid = $CONFIG->site->guid;
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ $options = array(
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ 'site_guid' => ELGG_ENTITIES_ANY_VALUE,
+ 'limit' => 2,
+ 'order_by' => 'e.guid DESC'
+ );
+
+ $es = elgg_get_entities_from_metadata($options);
+ $this->assertTrue(is_array($es));
+ $this->assertEqual(2, count($es));
+
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->guid, $guids));
+ }
+
+ foreach ($guids as $guid) {
+ get_entity($guid)->delete();
+ }
+ }
+
+ public function testElggApiGettersEntitySitePlural() {
+ global $CONFIG;
+
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ // luckily this is never checked.
+ $obj1->site_guid = 2;
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->site_guid = $CONFIG->site->guid;
+ $obj2->save();
+ $guids[] = $obj2->guid;
+
+ $options = array(
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ 'site_guids' => array($CONFIG->site->guid, 2),
+ 'limit' => 2,
+ 'order_by' => 'e.guid DESC'
+ );
+
+ $es = elgg_get_entities_from_metadata($options);
+ $this->assertTrue(is_array($es));
+ $this->assertEqual(2, count($es));
+
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->guid, $guids));
+ }
+
+ foreach ($guids as $guid) {
+ get_entity($guid)->delete();
+ }
+ }
+
+ public function testElggApiGettersEntitySitePluralSomeInvalid() {
+ global $CONFIG;
+
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ // luckily this is never checked.
+ $obj1->site_guid = 2;
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->save();
+ $guids[] = $obj2->guid;
+ $right_guid = $obj2->guid;
+
+ $options = array(
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ // just created the first entity so nothing will be "sited" by it.
+ 'site_guids' => array($CONFIG->site->guid, $guids[0]),
+ 'limit' => 2,
+ 'order_by' => 'e.guid DESC'
+ );
+
+ $es = elgg_get_entities_from_metadata($options);
+
+ $this->assertTrue(is_array($es));
+ $this->assertEqual(1, count($es));
+ $this->assertEqual($es[0]->guid, $right_guid);
+
+ foreach ($guids as $guid) {
+ get_entity($guid)->delete();
+ }
+ }
+
+ public function testElggApiGettersEntitySitePluralAllInvalid() {
+ global $CONFIG;
+
+ $guids = array();
+
+ $obj1 = new ElggObject();
+ $obj1->test_md = 'test';
+ // luckily this is never checked.
+ $obj1->site_guid = 2;
+ $obj1->save();
+ $guids[] = $obj1->guid;
+
+ $obj2 = new ElggObject();
+ $obj2->test_md = 'test';
+ $obj2->save();
+ $guids[] = $obj2->guid;
+ $right_guid = $obj2->guid;
+
+ $options = array(
+ 'metadata_name' => 'test_md',
+ 'metadata_value' => 'test',
+ // just created the first entity so nothing will be "sited" by it.
+ 'site_guids' => array($guids[0], $guids[1]),
+ 'limit' => 2,
+ 'order_by' => 'e.guid DESC'
+ );
+
+ $es = elgg_get_entities_from_metadata($options);
+
+ $this->assertTrue(empty($es));
+
+ foreach ($guids as $guid) {
+ get_entity($guid)->delete();
+ }
+ }
+
+ /**
+ * Private settings
+ */
+ public function testElggApiGettersEntitiesFromPrivateSettings() {
+
+ // create some test private settings
+ $setting_name = 'test_setting_name_' . rand();
+ $setting_value = rand(1000, 9999);
+ $setting_name2 = 'test_setting_name_' . rand();
+ $setting_value2 = rand(1000, 9999);
+
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $guids = array();
+
+ // our targets
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ set_private_setting($valid->getGUID(), $setting_name, $setting_value);
+ set_private_setting($valid->getGUID(), $setting_name2, $setting_value2);
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->save();
+ $guids[] = $valid2->getGUID();
+ set_private_setting($valid2->getGUID(), $setting_name, $setting_value);
+ set_private_setting($valid2->getGUID(), $setting_name2, $setting_value2);
+
+ // simple test with name
+ $options = array(
+ 'private_setting_name' => $setting_name
+ );
+
+ $entities = elgg_get_entities_from_private_settings($options);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $guids));
+ $value = get_private_setting($entity->getGUID(), $setting_name);
+ $this->assertEqual($value, $setting_value);
+ }
+
+ // simple test with value
+ $options = array(
+ 'private_setting_value' => $setting_value
+ );
+
+ $entities = elgg_get_entities_from_private_settings($options);
+
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $guids));
+ $value = get_private_setting($entity->getGUID(), $setting_name);
+ $this->assertEqual($value, $setting_value);
+ }
+
+ // test pairs
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => $subtype,
+ 'private_setting_name_value_pairs' => array(
+ array(
+ 'name' => $setting_name,
+ 'value' => $setting_value
+ ),
+ array(
+ 'name' => $setting_name2,
+ 'value' => $setting_value2
+ )
+ )
+ );
+
+ $entities = elgg_get_entities_from_private_settings($options);
+ $this->assertEqual(2, count($entities));
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $guids));
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+ /**
+ * Location
+ */
+ public function testElggApiGettersEntitiesFromLocation() {
+
+ // a test location that is out of this world
+ $lat = 500;
+ $long = 500;
+ $delta = 5;
+
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $subtype = $subtypes[0];
+ $guids = array();
+
+ // our objects
+ $valid = new ElggObject();
+ $valid->subtype = $subtype;
+ $valid->save();
+ $guids[] = $valid->getGUID();
+ $valid->setLatLong($lat, $long);
+
+ $valid2 = new ElggObject();
+ $valid2->subtype = $subtype;
+ $valid2->save();
+ $guids[] = $valid2->getGUID();
+ $valid2->setLatLong($lat + 2 * $delta, $long + 2 * $delta);
+
+ // limit to first object
+ $options = array(
+ 'latitude' => $lat,
+ 'longitude' => $long,
+ 'distance' => $delta
+ );
+
+ //global $CONFIG;
+ //$CONFIG->debug = 'NOTICE';
+ $entities = elgg_get_entities_from_location($options);
+ //unset($CONFIG->debug);
+
+ $this->assertEqual(1, count($entities));
+ $this->assertEqual($entities[0]->getGUID(), $valid->getGUID());
+
+ // get both objects
+ $options = array(
+ 'latitude' => $lat,
+ 'longitude' => $long,
+ 'distance' => array('latitude' => 2 * $delta, 'longitude' => 2 * $delta)
+ );
+
+ $entities = elgg_get_entities_from_location($options);
+
+ $this->assertEqual(2, count($entities));
+ foreach ($entities as $entity) {
+ $this->assertTrue(in_array($entity->getGUID(), $guids));
+ }
+
+ foreach ($guids as $guid) {
+ if ($e = get_entity($guid)) {
+ $e->delete();
+ }
+ }
+ }
+
+
+ public function testElggGetEntitiesFromRelationshipCount() {
+ $entities = $this->entities;
+ $relationships = array();
+ $count = count($entities);
+ $max = $count - 1;
+ $relationship_name = 'test_relationship_' . rand(0, 1000);
+
+ for ($i = 0; $i < $count; $i++) {
+ do {
+ $popular_entity = $entities[array_rand($entities)];
+ } while (array_key_exists($popular_entity->guid, $relationships));
+
+ $relationships[$popular_entity->guid] = array();
+
+ for ($c = 0; $c < $max; $c++) {
+ do {
+ $fan_entity = $entities[array_rand($entities)];
+ } while ($fan_entity->guid == $popular_entity->guid || in_array($fan_entity->guid, $relationships[$popular_entity->guid]));
+
+ $relationships[$popular_entity->guid][] = $fan_entity->guid;
+ add_entity_relationship($fan_entity->guid, $relationship_name, $popular_entity->guid);
+ }
+
+ $max--;
+ }
+
+ $options = array(
+ 'relationship' => $relationship_name,
+ 'limit' => $count
+ );
+
+ $entities = elgg_get_entities_from_relationship_count($options);
+
+ foreach ($entities as $e) {
+ $options = array(
+ 'relationship' => $relationship_name,
+ 'limit' => 100,
+ 'relationship_guid' => $e->guid,
+ 'inverse_relationship' => true
+ );
+
+ $fan_entities = elgg_get_entities_from_relationship($options);
+
+ $this->assertEqual(count($fan_entities), count($relationships[$e->guid]));
+
+ foreach ($fan_entities as $fan_entity) {
+ $this->assertTrue(in_array($fan_entity->guid, $relationships[$e->guid]));
+ $this->assertNotIdentical(false, check_entity_relationship($fan_entity->guid, $relationship_name, $e->guid));
+ }
+ }
+ }
+
+ public function testElggGetEntitiesByGuidSingular() {
+ foreach ($this->entities as $e) {
+ $options = array(
+ 'guid' => $e->guid
+ );
+ $es = elgg_get_entities($options);
+
+ $this->assertEqual(count($es), 1);
+ $this->assertEqual($es[0]->guid, $e->guid);
+ }
+ }
+
+ public function testElggGetEntitiesByGuidPlural() {
+ $guids = array();
+
+ foreach ($this->entities as $e) {
+ $guids[] = $e->guid;
+ }
+
+ $options = array(
+ 'guids' => $guids,
+ 'limit' => 100
+ );
+
+ $es = elgg_get_entities($options);
+
+ $this->assertEqual(count($es), count($this->entities));
+
+ foreach ($es as $e) {
+ $this->assertTrue(in_array($e->guid, $guids));
+ }
+ }
+
+ public function testElggGetEntitiesFromAnnotationsCalculateX() {
+ $types = array(
+ 'sum',
+ 'avg',
+ 'min',
+ 'max'
+ );
+
+ foreach ($types as $type) {
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 5);
+ $name = 'test_annotation_' . rand(0, 9999);
+ $values = array();
+ $options = array(
+ 'type' => 'object',
+ 'subtypes' => $subtypes,
+ 'limit' => 5
+ );
+
+ $es = elgg_get_entities($options);
+
+ foreach ($es as $e) {
+ $value = rand(0,9999);
+ $e->annotate($name, $value);
+
+ $value2 = rand(0,9999);
+ $e->annotate($name, $value2);
+
+ switch ($type) {
+ case 'sum':
+ $calc_value = $value + $value2;
+ break;
+
+ case 'avg':
+ $calc_value = ($value + $value2) / 2;
+ break;
+
+ case 'min':
+ $calc_value = min(array($value, $value2));
+ break;
+
+ case 'max':
+ $calc_value = max(array($value, $value2));
+ break;
+ }
+
+ $values[$e->guid] = $calc_value;
+ }
+
+ arsort($values);
+ $order = array_keys($values);
+
+ $options = array(
+ 'type' => 'object',
+ 'subtypes' => $subtypes,
+ 'limit' => 5,
+ 'annotation_name' => $name,
+ 'calculation' => $type
+ );
+
+ $es = elgg_get_entities_from_annotation_calculation($options);
+
+ foreach ($es as $i => $e) {
+ $value = 0;
+ $as = $e->getAnnotations($name);
+ // should only ever be 2
+ $this->assertEqual(2, count($as));
+
+ $value = $as[0]->value;
+ $value2 = $as[1]->value;
+
+ switch ($type) {
+ case 'sum':
+ $calc_value = $value + $value2;
+ break;
+
+ case 'avg':
+ $calc_value = ($value + $value2) / 2;
+ break;
+
+ case 'min':
+ $calc_value = min(array($value, $value2));
+ break;
+
+ case 'max':
+ $calc_value = max(array($value, $value2));
+ break;
+ }
+
+ $this->assertEqual($e->guid, $order[$i]);
+ $this->assertEqual($values[$e->guid], $calc_value);
+ }
+ }
+ }
+
+ public function testElggGetEntitiesFromAnnotationCalculationCount() {
+ // add two annotations with a unique name to an entity
+ // then count the number of entities with that annotation name
+
+ $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+ $name = 'test_annotation_' . rand(0, 9999);
+ $values = array();
+ $options = array(
+ 'type' => 'object',
+ 'subtypes' => $subtypes,
+ 'limit' => 1
+ );
+ $es = elgg_get_entities($options);
+ $entity = $es[0];
+ $value = rand(0, 9999);
+ $entity->annotate($name, $value);
+ $value = rand(0, 9999);
+ $entity->annotate($name, $value);
+
+ $options = array(
+ 'type' => 'object',
+ 'subtypes' => $subtypes,
+ 'annotation_name' => $name,
+ 'calculation' => 'count',
+ 'count' => true,
+ );
+ $count = elgg_get_entities_from_annotation_calculation($options);
+ $this->assertEqual(1, $count);
+ }
+
+ public function testElggGetAnnotationsAnnotationNames() {
+ $options = array('annotation_names' => array());
+ $a_e_map = array();
+
+ // create test annotations on a few entities.
+ for ($i=0; $i<3; $i++) {
+ do {
+ $e = $this->entities[array_rand($this->entities)];
+ } while(in_array($e->guid, $a_e_map));
+ $annotations = $this->createRandomAnnotations($e);
+
+ foreach($annotations as $a) {
+ $options['annotation_names'][] = $a->name;
+ $a_e_map[$a->id] = $e->guid;
+ }
+ }
+
+ $as = elgg_get_annotations($options);
+
+ $this->assertEqual(count($a_e_map), count($as));
+
+ foreach ($as as $a) {
+ $this->assertEqual($a_e_map[$a->id], $a->entity_guid);
+ }
+ }
+
+ public function testElggGetAnnotationsAnnotationValues() {
+ $options = array('annotation_values' => array());
+ $a_e_map = array();
+
+ // create test annotations on a few entities.
+ for ($i=0; $i<3; $i++) {
+ do {
+ $e = $this->entities[array_rand($this->entities)];
+ } while(in_array($e->guid, $a_e_map));
+ $annotations = $this->createRandomAnnotations($e);
+
+ foreach($annotations as $a) {
+ $options['annotation_values'][] = $a->value;
+ $a_e_map[$a->id] = $e->guid;
+ }
+ }
+
+ $as = elgg_get_annotations($options);
+
+ $this->assertEqual(count($a_e_map), count($as));
+
+ foreach ($as as $a) {
+ $this->assertEqual($a_e_map[$a->id], $a->entity_guid);
+ }
+ }
+
+ public function testElggGetAnnotationsAnnotationOwnerGuids() {
+ $options = array('annotation_owner_guids' => array());
+ $a_e_map = array();
+
+ // create test annotations on a single entity
+ for ($i=0; $i<3; $i++) {
+ do {
+ $e = $this->entities[array_rand($this->entities)];
+ } while(in_array($e->guid, $a_e_map));
+
+ // remove annotations left over from previous tests.
+ elgg_delete_annotations(array('annotation_owner_guid' => $e->guid));
+ $annotations = $this->createRandomAnnotations($e);
+
+ foreach($annotations as $a) {
+ $options['annotation_owner_guids'][] = $e->guid;
+ $a_e_map[$a->id] = $e->guid;
+ }
+ }
+
+ $as = elgg_get_annotations($options);
+ $this->assertEqual(count($a_e_map), count($as));
+
+ foreach ($as as $a) {
+ $this->assertEqual($a_e_map[$a->id], $a->owner_guid);
+ }
+ }
+
+ public function testElggGetEntitiesBadWheres() {
+ $options = array(
+ 'container_guid' => 'abc'
+ );
+
+ $entities = elgg_get_entities($options);
+ $this->assertFalse($entities);
+ }
+
+ public function testEGEEmptySubtypePlurality() {
+ $options = array(
+ 'type' => 'user',
+ 'subtypes' => ''
+ );
+
+ $entities = elgg_get_entities($options);
+ $this->assertTrue(is_array($entities));
+
+ $options = array(
+ 'type' => 'user',
+ 'subtype' => ''
+ );
+
+ $entities = elgg_get_entities($options);
+ $this->assertTrue(is_array($entities));
+
+ $options = array(
+ 'type' => 'user',
+ 'subtype' => array('')
+ );
+
+ $entities = elgg_get_entities($options);
+ $this->assertTrue(is_array($entities));
+
+ $options = array(
+ 'type' => 'user',
+ 'subtypes' => array('')
+ );
+
+ $entities = elgg_get_entities($options);
+ $this->assertTrue(is_array($entities));
+ }
+}
diff --git a/engine/tests/api/helpers.php b/engine/tests/api/helpers.php
new file mode 100644
index 000000000..414fb4145
--- /dev/null
+++ b/engine/tests/api/helpers.php
@@ -0,0 +1,705 @@
+<?php
+/**
+ * Elgg Test helper functions
+ *
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreHelpersTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+
+ global $CONFIG;
+ unset($CONFIG->externals);
+ unset($CONFIG->externals_map);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ // all __destruct() code should go above here
+ parent::__destruct();
+ }
+
+ /**
+ * Test elgg_instanceof()
+ */
+ public function testElggInstanceOf() {
+ $entity = new ElggObject();
+ $entity->subtype = 'test_subtype';
+ $entity->save();
+
+ $this->assertTrue(elgg_instanceof($entity));
+ $this->assertTrue(elgg_instanceof($entity, 'object'));
+ $this->assertTrue(elgg_instanceof($entity, 'object', 'test_subtype'));
+
+ $this->assertFalse(elgg_instanceof($entity, 'object', 'invalid_subtype'));
+ $this->assertFalse(elgg_instanceof($entity, 'user', 'test_subtype'));
+
+ $entity->delete();
+
+ $bad_entity = FALSE;
+ $this->assertFalse(elgg_instanceof($bad_entity));
+ $this->assertFalse(elgg_instanceof($bad_entity, 'object'));
+ $this->assertFalse(elgg_instanceof($bad_entity, 'object', 'test_subtype'));
+
+ remove_subtype('object', 'test_subtype');
+ }
+
+ /**
+ * Test elgg_normalize_url()
+ */
+ public function testElggNormalizeURL() {
+ $conversions = array(
+ 'http://example.com' => 'http://example.com',
+ 'https://example.com' => 'https://example.com',
+ 'http://example-time.com' => 'http://example-time.com',
+
+ '//example.com' => '//example.com',
+ 'ftp://example.com/file' => 'ftp://example.com/file',
+ 'mailto:brett@elgg.org' => 'mailto:brett@elgg.org',
+ 'javascript:alert("test")' => 'javascript:alert("test")',
+ 'app://endpoint' => 'app://endpoint',
+
+ 'example.com' => 'http://example.com',
+ 'example.com/subpage' => 'http://example.com/subpage',
+
+ 'page/handler' => elgg_get_site_url() . 'page/handler',
+ 'page/handler?p=v&p2=v2' => elgg_get_site_url() . 'page/handler?p=v&p2=v2',
+ 'mod/plugin/file.php' => elgg_get_site_url() . 'mod/plugin/file.php',
+ 'mod/plugin/file.php?p=v&p2=v2' => elgg_get_site_url() . 'mod/plugin/file.php?p=v&p2=v2',
+ 'rootfile.php' => elgg_get_site_url() . 'rootfile.php',
+ 'rootfile.php?p=v&p2=v2' => elgg_get_site_url() . 'rootfile.php?p=v&p2=v2',
+
+ '/page/handler' => elgg_get_site_url() . 'page/handler',
+ '/page/handler?p=v&p2=v2' => elgg_get_site_url() . 'page/handler?p=v&p2=v2',
+ '/mod/plugin/file.php' => elgg_get_site_url() . 'mod/plugin/file.php',
+ '/mod/plugin/file.php?p=v&p2=v2' => elgg_get_site_url() . 'mod/plugin/file.php?p=v&p2=v2',
+ '/rootfile.php' => elgg_get_site_url() . 'rootfile.php',
+ '/rootfile.php?p=v&p2=v2' => elgg_get_site_url() . 'rootfile.php?p=v&p2=v2',
+ );
+
+ foreach ($conversions as $input => $output) {
+ $this->assertIdentical($output, elgg_normalize_url($input));
+ }
+ }
+
+
+ /**
+ * Test elgg_register_js()
+ */
+ public function testElggRegisterJS() {
+ global $CONFIG;
+
+ // specify name
+ $result = elgg_register_js('key', 'http://test1.com', 'footer');
+ $this->assertTrue($result);
+ $this->assertTrue(isset($CONFIG->externals_map['js']['key']));
+
+ $item = $CONFIG->externals_map['js']['key'];
+ $this->assertTrue($CONFIG->externals['js']->contains($item));
+
+ $priority = $CONFIG->externals['js']->getPriority($item);
+ $this->assertTrue($priority !== false);
+
+ $item = $CONFIG->externals['js']->getElement($priority);
+ $this->assertIdentical('http://test1.com', $item->url);
+
+ // send a bad url
+ $result = elgg_register_js('bad', null);
+ $this->assertFalse($result);
+ }
+
+ /**
+ * Test elgg_register_css()
+ */
+ public function testElggRegisterCSS() {
+ global $CONFIG;
+
+ // specify name
+ $result = elgg_register_css('key', 'http://test1.com');
+ $this->assertTrue($result);
+ $this->assertTrue(isset($CONFIG->externals_map['css']['key']));
+
+ $item = $CONFIG->externals_map['css']['key'];
+ $this->assertTrue($CONFIG->externals['css']->contains($item));
+
+ $priority = $CONFIG->externals['css']->getPriority($item);
+ $this->assertTrue($priority !== false);
+
+ $item = $CONFIG->externals['css']->getElement($priority);
+ $this->assertIdentical('http://test1.com', $item->url);
+ }
+
+ /**
+ * Test elgg_unregister_js()
+ */
+ public function testElggUnregisterJS() {
+ global $CONFIG;
+
+ $base = trim(elgg_get_site_url(), "/");
+
+ $urls = array('id1' => "$base/urla", 'id2' => "$base/urlb", 'id3' => "$base/urlc");
+
+ foreach ($urls as $id => $url) {
+ elgg_register_js($id, $url);
+ }
+
+ $result = elgg_unregister_js('id1');
+ $this->assertTrue($result);
+
+ $js = $CONFIG->externals['js'];
+ $elements = $js->getElements();
+ $this->assertFalse(isset($CONFIG->externals_map['js']['id1']));
+
+ foreach ($elements as $element) {
+ if (isset($element->name)) {
+ $this->assertFalse($element->name == 'id1');
+ }
+ }
+
+ $result = elgg_unregister_js('id1');
+ $this->assertFalse($result);
+
+ $result = elgg_unregister_js('', 'does_not_exist');
+ $this->assertFalse($result);
+
+ $result = elgg_unregister_js('id2');
+ $elements = $js->getElements();
+
+ $this->assertFalse(isset($CONFIG->externals_map['js']['id2']));
+ foreach ($elements as $element) {
+ if (isset($element->name)) {
+ $this->assertFalse($element->name == 'id2');
+ }
+ }
+
+ $this->assertTrue(isset($CONFIG->externals_map['js']['id3']));
+
+ $priority = $CONFIG->externals['js']->getPriority($CONFIG->externals_map['js']['id3']);
+ $this->assertTrue($priority !== false);
+
+ $item = $CONFIG->externals['js']->getElement($priority);
+ $this->assertIdentical($urls['id3'], $item->url);
+ }
+
+ /**
+ * Test elgg_load_js()
+ */
+ public function testElggLoadJS() {
+ global $CONFIG;
+
+ // load before register
+ elgg_load_js('key');
+ $result = elgg_register_js('key', 'http://test1.com', 'footer');
+ $this->assertTrue($result);
+
+ $js_urls = elgg_get_loaded_js('footer');
+ $this->assertIdentical(array(500 => 'http://test1.com'), $js_urls);
+ }
+
+ /**
+ * Test elgg_get_loaded_js()
+ */
+ public function testElggGetJS() {
+ global $CONFIG;
+
+ $base = trim(elgg_get_site_url(), "/");
+
+ $urls = array(
+ 'id1' => "$base/urla",
+ 'id2' => "$base/urlb",
+ 'id3' => "$base/urlc"
+ );
+
+ foreach ($urls as $id => $url) {
+ elgg_register_js($id, $url);
+ elgg_load_js($id);
+ }
+
+ $js_urls = elgg_get_loaded_js('head');
+
+ $this->assertIdentical($js_urls[500], $urls['id1']);
+ $this->assertIdentical($js_urls[501], $urls['id2']);
+ $this->assertIdentical($js_urls[502], $urls['id3']);
+
+ $js_urls = elgg_get_loaded_js('footer');
+ $this->assertIdentical(array(), $js_urls);
+ }
+
+ // test ElggPriorityList
+ public function testElggPriorityListAdd() {
+ $pl = new ElggPriorityList();
+ $elements = array(
+ 'Test value',
+ 'Test value 2',
+ 'Test value 3'
+ );
+
+ shuffle($elements);
+
+ foreach ($elements as $element) {
+ $this->assertTrue($pl->add($element) !== false);
+ }
+
+ $test_elements = $pl->getElements();
+
+ $this->assertTrue(is_array($test_elements));
+
+ foreach ($test_elements as $i => $element) {
+ // should be in the array
+ $this->assertTrue(in_array($element, $elements));
+
+ // should be the only element, so priority 0
+ $this->assertEqual($i, array_search($element, $elements));
+ }
+ }
+
+ public function testElggPriorityListAddWithPriority() {
+ $pl = new ElggPriorityList();
+
+ $elements = array(
+ 10 => 'Test Element 10',
+ 5 => 'Test Element 5',
+ 0 => 'Test Element 0',
+ 100 => 'Test Element 100',
+ -1 => 'Test Element -1',
+ -5 => 'Test Element -5'
+ );
+
+ foreach ($elements as $priority => $element) {
+ $pl->add($element, $priority);
+ }
+
+ $test_elements = $pl->getElements();
+
+ // should be sorted by priority
+ $elements_sorted = array(
+ -5 => 'Test Element -5',
+ -1 => 'Test Element -1',
+ 0 => 'Test Element 0',
+ 5 => 'Test Element 5',
+ 10 => 'Test Element 10',
+ 100 => 'Test Element 100',
+ );
+
+ $this->assertIdentical($elements_sorted, $test_elements);
+
+ foreach ($test_elements as $priority => $element) {
+ $this->assertIdentical($elements[$priority], $element);
+ }
+ }
+
+ public function testElggPriorityListGetNextPriority() {
+ $pl = new ElggPriorityList();
+
+ $elements = array(
+ 2 => 'Test Element',
+ 0 => 'Test Element 2',
+ -2 => 'Test Element 3',
+ );
+
+ foreach ($elements as $priority => $element) {
+ $pl->add($element, $priority);
+ }
+
+ // we're not specifying a priority so it should be the next consecutive to 0.
+ $this->assertEqual(1, $pl->getNextPriority());
+
+ // add another one at priority 1
+ $pl->add('Test Element 1');
+
+ // next consecutive to 0 is now 3.
+ $this->assertEqual(3, $pl->getNextPriority());
+ }
+
+ public function testElggPriorityListRemove() {
+ $pl = new ElggPriorityList();
+
+ $elements = array();
+ for ($i=0; $i<3; $i++) {
+ $element = new stdClass();
+ $element->name = "Test Element $i";
+ $element->someAttribute = rand(0, 9999);
+ $elements[] = $element;
+ $pl->add($element);
+ }
+
+ $pl->remove($elements[1]);
+
+ $test_elements = $pl->getElements();
+
+ // make sure it's gone.
+ $this->assertEqual(2, count($test_elements));
+ $this->assertIdentical($elements[0], $test_elements[0]);
+ $this->assertIdentical($elements[2], $test_elements[2]);
+ }
+
+ public function testElggPriorityListMove() {
+ $pl = new ElggPriorityList();
+
+ $elements = array(
+ -5 => 'Test Element -5',
+ 0 => 'Test Element 0',
+ 5 => 'Test Element 5',
+ );
+
+ foreach ($elements as $priority => $element) {
+ $pl->add($element, $priority);
+ }
+
+ $this->assertEqual($pl->move($elements[-5], 10), 10);
+
+ // check it's at the new place
+ $this->assertIdentical($elements[-5], $pl->getElement(10));
+
+ // check it's not at the old
+ $this->assertFalse($pl->getElement(-5));
+ }
+
+ public function testElggPriorityListConstructor() {
+ $elements = array(
+ 10 => 'Test Element 10',
+ 5 => 'Test Element 5',
+ 0 => 'Test Element 0',
+ 100 => 'Test Element 100',
+ -1 => 'Test Element -1',
+ -5 => 'Test Element -5'
+ );
+
+ $pl = new ElggPriorityList($elements);
+ $test_elements = $pl->getElements();
+
+ $elements_sorted = array(
+ -5 => 'Test Element -5',
+ -1 => 'Test Element -1',
+ 0 => 'Test Element 0',
+ 5 => 'Test Element 5',
+ 10 => 'Test Element 10',
+ 100 => 'Test Element 100',
+ );
+
+ $this->assertIdentical($elements_sorted, $test_elements);
+ }
+
+ public function testElggPriorityListGetPriority() {
+ $pl = new ElggPriorityList();
+
+ $elements = array(
+ 'Test element 0',
+ 'Test element 1',
+ 'Test element 2',
+ );
+
+ foreach ($elements as $element) {
+ $pl->add($element);
+ }
+
+ $this->assertIdentical(0, $pl->getPriority($elements[0]));
+ $this->assertIdentical(1, $pl->getPriority($elements[1]));
+ $this->assertIdentical(2, $pl->getPriority($elements[2]));
+ }
+
+ public function testElggPriorityListGetElement() {
+ $pl = new ElggPriorityList();
+ $priorities = array();
+
+ $elements = array(
+ 'Test element 0',
+ 'Test element 1',
+ 'Test element 2',
+ );
+
+ foreach ($elements as $element) {
+ $priorities[] = $pl->add($element);
+ }
+
+ $this->assertIdentical($elements[0], $pl->getElement($priorities[0]));
+ $this->assertIdentical($elements[1], $pl->getElement($priorities[1]));
+ $this->assertIdentical($elements[2], $pl->getElement($priorities[2]));
+ }
+
+ public function testElggPriorityListPriorityCollision() {
+ $pl = new ElggPriorityList();
+
+ $elements = array(
+ 5 => 'Test element 5',
+ 6 => 'Test element 6',
+ 0 => 'Test element 0',
+ );
+
+ foreach ($elements as $priority => $element) {
+ $pl->add($element, $priority);
+ }
+
+ // add at a colliding priority
+ $pl->add('Colliding element', 5);
+
+ // should float to the top closest to 5, so 7
+ $this->assertEqual(7, $pl->getPriority('Colliding element'));
+ }
+
+ public function testElggPriorityListIterator() {
+ $elements = array(
+ -5 => 'Test element -5',
+ 0 => 'Test element 0',
+ 5 => 'Test element 5'
+ );
+
+ $pl = new ElggPriorityList($elements);
+
+ foreach ($pl as $priority => $element) {
+ $this->assertIdentical($elements[$priority], $element);
+ }
+ }
+
+ public function testElggPriorityListCountable() {
+ $pl = new ElggPriorityList();
+
+ $this->assertEqual(0, count($pl));
+
+ $pl->add('Test element 0');
+ $this->assertEqual(1, count($pl));
+
+ $pl->add('Test element 1');
+ $this->assertEqual(2, count($pl));
+
+ $pl->add('Test element 2');
+ $this->assertEqual(3, count($pl));
+ }
+
+ public function testElggPriorityListUserSort() {
+ $elements = array(
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ 'E',
+ );
+
+ $elements_sorted_string = $elements;
+
+ shuffle($elements);
+ $pl = new ElggPriorityList($elements);
+
+ // will sort by priority
+ $test_elements = $pl->getElements();
+ $this->assertIdentical($elements, $test_elements);
+
+ function test_sort($elements) {
+ sort($elements, SORT_LOCALE_STRING);
+ return $elements;
+ }
+
+ // force a new sort using our function
+ $pl->sort('test_sort');
+ $test_elements = $pl->getElements();
+
+ $this->assertIdentical($elements_sorted_string, $test_elements);
+ }
+
+ // see https://github.com/elgg/elgg/issues/4288
+ public function testElggBatchIncOffset() {
+ // normal increment
+ $options = array(
+ 'offset' => 0,
+ 'limit' => 11
+ );
+ $batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
+ null, 5);
+ $j = 0;
+ foreach ($batch as $e) {
+ $offset = floor($j / 5) * 5;
+ $this->assertEqual($offset, $e['offset']);
+ $this->assertEqual($j + 1, $e['index']);
+ $j++;
+ }
+
+ $this->assertEqual(11, $j);
+
+ // no increment, 0 start
+ ElggCoreHelpersTest::elgg_batch_callback_test(array(), true);
+ $options = array(
+ 'offset' => 0,
+ 'limit' => 11
+ );
+ $batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
+ null, 5);
+ $batch->setIncrementOffset(false);
+
+ $j = 0;
+ foreach ($batch as $e) {
+ $this->assertEqual(0, $e['offset']);
+ // should always be the same 5
+ $this->assertEqual($e['index'], $j + 1 - (floor($j / 5) * 5));
+ $j++;
+ }
+ $this->assertEqual(11, $j);
+
+ // no increment, 3 start
+ ElggCoreHelpersTest::elgg_batch_callback_test(array(), true);
+ $options = array(
+ 'offset' => 3,
+ 'limit' => 11
+ );
+ $batch = new ElggBatch(array('ElggCoreHelpersTest', 'elgg_batch_callback_test'), $options,
+ null, 5);
+ $batch->setIncrementOffset(false);
+
+ $j = 0;
+ foreach ($batch as $e) {
+ $this->assertEqual(3, $e['offset']);
+ // same 5 results
+ $this->assertEqual($e['index'], $j + 4 - (floor($j / 5) * 5));
+ $j++;
+ }
+
+ $this->assertEqual(11, $j);
+ }
+
+ public function testElggBatchReadHandlesBrokenEntities() {
+ $num_test_entities = 8;
+ $guids = array();
+ for ($i = $num_test_entities; $i > 0; $i--) {
+ $entity = new ElggObject();
+ $entity->type = 'object';
+ $entity->subtype = 'test_5357_subtype';
+ $entity->access_id = ACCESS_PUBLIC;
+ $entity->save();
+ $guids[] = $entity->guid;
+ _elgg_invalidate_cache_for_entity($entity->guid);
+ }
+
+ // break entities such that the first fetch has one incomplete
+ // and the second and third fetches have only incompletes!
+ $db_prefix = elgg_get_config('dbprefix');
+ delete_data("
+ DELETE FROM {$db_prefix}objects_entity
+ WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
+ ");
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'test_5357_subtype',
+ 'order_by' => 'e.guid',
+ );
+
+ $entities_visited = array();
+ $batch = new ElggBatch('elgg_get_entities', $options, null, 2);
+ /* @var ElggEntity[] $batch */
+ foreach ($batch as $entity) {
+ $entities_visited[] = $entity->guid;
+ }
+
+ // The broken entities should not have been visited
+ $this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
+
+ // cleanup (including leftovers from previous tests)
+ $entity_rows = elgg_get_entities(array_merge($options, array(
+ 'callback' => '',
+ 'limit' => false,
+ )));
+ $guids = array();
+ foreach ($entity_rows as $row) {
+ $guids[] = $row->guid;
+ }
+ delete_data("DELETE FROM {$db_prefix}entities WHERE guid IN (" . implode(',', $guids) . ")");
+ delete_data("DELETE FROM {$db_prefix}objects_entity WHERE guid IN (" . implode(',', $guids) . ")");
+ }
+
+ public function testElggBatchDeleteHandlesBrokenEntities() {
+ $num_test_entities = 8;
+ $guids = array();
+ for ($i = $num_test_entities; $i > 0; $i--) {
+ $entity = new ElggObject();
+ $entity->type = 'object';
+ $entity->subtype = 'test_5357_subtype';
+ $entity->access_id = ACCESS_PUBLIC;
+ $entity->save();
+ $guids[] = $entity->guid;
+ _elgg_invalidate_cache_for_entity($entity->guid);
+ }
+
+ // break entities such that the first fetch has one incomplete
+ // and the second and third fetches have only incompletes!
+ $db_prefix = elgg_get_config('dbprefix');
+ delete_data("
+ DELETE FROM {$db_prefix}objects_entity
+ WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
+ ");
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'test_5357_subtype',
+ 'order_by' => 'e.guid',
+ );
+
+ $entities_visited = array();
+ $batch = new ElggBatch('elgg_get_entities', $options, null, 2, false);
+ /* @var ElggEntity[] $batch */
+ foreach ($batch as $entity) {
+ $entities_visited[] = $entity->guid;
+ $entity->delete();
+ }
+
+ // The broken entities should not have been visited
+ $this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
+
+ // cleanup (including leftovers from previous tests)
+ $entity_rows = elgg_get_entities(array_merge($options, array(
+ 'callback' => '',
+ 'limit' => false,
+ )));
+ $guids = array();
+ foreach ($entity_rows as $row) {
+ $guids[] = $row->guid;
+ }
+ delete_data("DELETE FROM {$db_prefix}entities WHERE guid IN (" . implode(',', $guids) . ")");
+ delete_data("DELETE FROM {$db_prefix}objects_entity WHERE guid IN (" . implode(',', $guids) . ")");
+ }
+
+ static function elgg_batch_callback_test($options, $reset = false) {
+ static $count = 1;
+
+ if ($reset) {
+ $count = 1;
+ return true;
+ }
+
+ if ($count > 20) {
+ return false;
+ }
+
+ for ($j = 0; ($options['limit'] < 5) ? $j < $options['limit'] : $j < 5; $j++) {
+ $return[] = array(
+ 'offset' => $options['offset'],
+ 'limit' => $options['limit'],
+ 'count' => $count++,
+ 'index' => 1 + $options['offset'] + $j
+ );
+ }
+
+ return $return;
+ }
+} \ No newline at end of file
diff --git a/engine/tests/api/metadata.php b/engine/tests/api/metadata.php
new file mode 100644
index 000000000..d23510c6a
--- /dev/null
+++ b/engine/tests/api/metadata.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * Elgg Test metadata API
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreMetadataAPITest extends ElggCoreUnitTest {
+ protected $metastrings;
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->metastrings = array();
+ $this->object = new ElggObject();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+
+ unset($this->object);
+ }
+
+ public function testGetMetastringById() {
+ foreach (array('metaUnitTest', 'metaunittest', 'METAUNITTEST') as $string) {
+ // since there is no guarantee that metastrings are garbage collected
+ // between unit test runs, we delete before testing
+ $this->delete_metastrings($string);
+ $this->create_metastring($string);
+ }
+
+ // lookup metastring id
+ $cs_ids = get_metastring_id('metaUnitTest', TRUE);
+ $this->assertEqual($cs_ids, $this->metastrings['metaUnitTest']);
+
+ // lookup all metastrings, ignoring case
+ $cs_ids = get_metastring_id('metaUnitTest', FALSE);
+ $this->assertEqual(count($cs_ids), 3);
+ $this->assertEqual(count($cs_ids), count($this->metastrings));
+ foreach ($cs_ids as $string )
+ {
+ $this->assertTrue(in_array($string, $this->metastrings));
+ }
+ }
+
+ public function testElggGetEntitiesFromMetadata() {
+ global $CONFIG, $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE;
+ $METASTRINGS_CACHE = $METASTRINGS_DEADNAME_CACHE = array();
+
+ $this->object->title = 'Meta Unit Test';
+ $this->object->save();
+ $this->create_metastring('metaUnitTest');
+ $this->create_metastring('tested');
+
+ // create_metadata returns id of metadata on success
+ $this->assertNotEqual(false, create_metadata($this->object->guid, 'metaUnitTest', 'tested'));
+
+ // check value with improper case
+ $options = array('metadata_names' => 'metaUnitTest', 'metadata_values' => 'Tested', 'limit' => 10, 'metadata_case_sensitive' => TRUE);
+ $this->assertIdentical(array(), elgg_get_entities_from_metadata($options));
+
+ // compare forced case with ignored case
+ $options = array('metadata_names' => 'metaUnitTest', 'metadata_values' => 'tested', 'limit' => 10, 'metadata_case_sensitive' => TRUE);
+ $case_true = elgg_get_entities_from_metadata($options);
+ $this->assertIsA($case_true, 'array');
+
+ $options = array('metadata_names' => 'metaUnitTest', 'metadata_values' => 'Tested', 'limit' => 10, 'metadata_case_sensitive' => FALSE);
+ $case_false = elgg_get_entities_from_metadata($options);
+ $this->assertIsA($case_false, 'array');
+
+ $this->assertIdentical($case_true, $case_false);
+
+ // clean up
+ $this->object->delete();
+ }
+
+ public function testElggGetMetadataCount() {
+ $this->object->title = 'Meta Unit Test';
+ $this->object->save();
+
+ $guid = $this->object->getGUID();
+ create_metadata($guid, 'tested', 'tested1', 'text', 0, ACCESS_PUBLIC, true);
+ create_metadata($guid, 'tested', 'tested2', 'text', 0, ACCESS_PUBLIC, true);
+
+ $count = (int)elgg_get_metadata(array(
+ 'metadata_names' => array('tested'),
+ 'guid' => $guid,
+ 'count' => true,
+ ));
+
+ $this->assertIdentical($count, 2);
+
+ $this->object->delete();
+ }
+
+ public function testElggDeleteMetadata() {
+ $e = new ElggObject();
+ $e->save();
+
+ for ($i = 0; $i < 30; $i++) {
+ $name = "test_metadata$i";
+ $e->$name = rand(0, 10000);
+ }
+
+ $options = array(
+ 'guid' => $e->getGUID(),
+ 'limit' => 0,
+ );
+
+ $md = elgg_get_metadata($options);
+ $this->assertIdentical(30, count($md));
+
+ $this->assertTrue(elgg_delete_metadata($options));
+
+ $md = elgg_get_metadata($options);
+ $this->assertTrue(empty($md));
+
+ $e->delete();
+ }
+
+ /**
+ * https://github.com/Elgg/Elgg/issues/4867
+ */
+ public function testElggGetEntityMetadataWhereSqlWithFalseValue() {
+ $pair = array('name' => 'test' , 'value' => false);
+ $result = elgg_get_entity_metadata_where_sql('e', 'metadata', null, null, $pair);
+ $where = preg_replace( '/\s+/', ' ', $result['wheres'][0]);
+ $this->assertTrue(strpos($where, "msn1.string = 'test' AND BINARY msv1.string = 0") > 0);
+
+ $result = elgg_get_entity_metadata_where_sql('e', 'metadata', array('test'), array(false));
+ $where = preg_replace( '/\s+/', ' ', $result['wheres'][0]);
+ $this->assertTrue(strpos($where, "msn.string IN ('test')) AND ( BINARY msv.string IN ('0')"));
+ }
+
+ // Make sure metadata with multiple values is correctly deleted when re-written
+ // by another user
+ // https://github.com/elgg/elgg/issues/2776
+ public function test_elgg_metadata_multiple_values() {
+ $u1 = new ElggUser();
+ $u1->username = rand();
+ $u1->save();
+
+ $u2 = new ElggUser();
+ $u2->username = rand();
+ $u2->save();
+
+ $obj = new ElggObject();
+ $obj->owner_guid = $u1->guid;
+ $obj->container_guid = $u1->guid;
+ $obj->access_id = ACCESS_PUBLIC;
+ $obj->save();
+
+ $md_values = array(
+ 'one',
+ 'two',
+ 'three'
+ );
+
+ // need to fake different logins.
+ // good times without mocking.
+ $original_user = elgg_get_logged_in_user_entity();
+ $_SESSION['user'] = $u1;
+
+ elgg_set_ignore_access(false);
+
+ // add metadata as one user
+ $obj->test = $md_values;
+
+ // check only these md exists
+ $db_prefix = elgg_get_config('dbprefix');
+ $q = "SELECT * FROM {$db_prefix}metadata WHERE entity_guid = $obj->guid";
+ $data = get_data($q);
+
+ $this->assertEqual(count($md_values), count($data));
+ foreach ($data as $md_row) {
+ $md = elgg_get_metadata_from_id($md_row->id);
+ $this->assertTrue(in_array($md->value, $md_values));
+ $this->assertEqual('test', $md->name);
+ }
+
+ // add md w/ same name as a different user
+ $_SESSION['user'] = $u2;
+ $md_values2 = array(
+ 'four',
+ 'five',
+ 'six',
+ 'seven'
+ );
+
+ $obj->test = $md_values2;
+
+ $q = "SELECT * FROM {$db_prefix}metadata WHERE entity_guid = $obj->guid";
+ $data = get_data($q);
+
+ $this->assertEqual(count($md_values2), count($data));
+ foreach ($data as $md_row) {
+ $md = elgg_get_metadata_from_id($md_row->id);
+ $this->assertTrue(in_array($md->value, $md_values2));
+ $this->assertEqual('test', $md->name);
+ }
+
+ $_SESSION['user'] = $original_user;
+
+ $obj->delete();
+ $u1->delete();
+ $u2->delete();
+ }
+
+ protected function delete_metastrings($string) {
+ global $CONFIG, $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE;
+ $METASTRINGS_CACHE = $METASTRINGS_DEADNAME_CACHE = array();
+
+ $string = sanitise_string($string);
+ mysql_query("DELETE FROM {$CONFIG->dbprefix}metastrings WHERE string = BINARY '$string'");
+ }
+
+ protected function create_metastring($string) {
+ global $CONFIG, $METASTRINGS_CACHE, $METASTRINGS_DEADNAME_CACHE;
+ $METASTRINGS_CACHE = $METASTRINGS_DEADNAME_CACHE = array();
+
+ $string = sanitise_string($string);
+ mysql_query("INSERT INTO {$CONFIG->dbprefix}metastrings (string) VALUES ('$string')");
+ $this->metastrings[$string] = mysql_insert_id();
+ }
+}
diff --git a/engine/tests/api/metadata_cache.php b/engine/tests/api/metadata_cache.php
new file mode 100644
index 000000000..7fb328169
--- /dev/null
+++ b/engine/tests/api/metadata_cache.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Elgg Test metadata cache
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreMetadataCacheTest extends ElggCoreUnitTest {
+
+ /**
+ * @var ElggVolatileMetadataCache
+ */
+ protected $cache;
+
+ /**
+ * @var ElggObject
+ */
+ protected $obj1;
+
+ /**
+ * @var int
+ */
+ protected $guid1;
+
+ /**
+ * @var ElggObject
+ */
+ protected $obj2;
+
+ /**
+ * @var int
+ */
+ protected $guid2;
+
+ protected $name = 'test';
+ protected $value = 'test';
+ protected $ignoreAccess;
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->ignoreAccess = elgg_set_ignore_access(false);
+
+ $this->cache = elgg_get_metadata_cache();
+
+ $this->obj1 = new ElggObject();
+ $this->obj1->save();
+ $this->guid1 = $this->obj1->guid;
+
+ $this->obj2 = new ElggObject();
+ $this->obj2->save();
+ $this->guid2 = $this->obj2->guid;
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ $this->obj1->delete();
+ $this->obj2->delete();
+
+ elgg_set_ignore_access($this->ignoreAccess);
+ }
+
+ public function testBasicApi() {
+ // test de-coupled instance
+ $cache = new ElggVolatileMetadataCache();
+ $cache->setIgnoreAccess(false);
+ $guid = 1;
+
+ $this->assertFalse($cache->isKnown($guid, $this->name));
+
+ $cache->markEmpty($guid, $this->name);
+ $this->assertTrue($cache->isKnown($guid, $this->name));
+ $this->assertNull($cache->load($guid, $this->name));
+
+ $cache->markUnknown($guid, $this->name);
+ $this->assertFalse($cache->isKnown($guid, $this->name));
+
+ $cache->save($guid, $this->name, $this->value);
+ $this->assertIdentical($cache->load($guid, $this->name), $this->value);
+
+ $cache->save($guid, $this->name, 1, true);
+ $this->assertIdentical($cache->load($guid, $this->name), array($this->value, 1));
+
+ $cache->clear($guid);
+ $this->assertFalse($cache->isKnown($guid, $this->name));
+ }
+
+ public function testReadsAreCached() {
+ // test that reads fill cache
+ $this->obj1->setMetaData($this->name, $this->value);
+ $this->cache->flush();
+
+ $this->obj1->getMetaData($this->name);
+ $this->assertIdentical($this->cache->load($this->guid1, $this->name), $this->value);
+ }
+
+ public function testWritesAreCached() {
+ // delete should mark cache as known to be empty
+ $this->obj1->deleteMetadata($this->name);
+ $this->assertTrue($this->cache->isKnown($this->guid1, $this->name));
+ $this->assertNull($this->cache->load($this->guid1, $this->name));
+
+ // without name, delete should invalidate the entire entity
+ $this->cache->save($this->guid1, $this->name, $this->value);
+ elgg_delete_metadata(array(
+ 'guid' => $this->guid1,
+ ));
+ $this->assertFalse($this->cache->isKnown($this->guid1, $this->name));
+
+ // test set
+ $this->obj1->setMetaData($this->name, $this->value);
+ $this->assertIdentical($this->cache->load($this->guid1, $this->name), $this->value);
+
+ // test set multiple
+ $this->obj1->setMetaData($this->name, 1, 'integer', true);
+ $this->assertIdentical($this->cache->load($this->guid1, $this->name), array($this->value, 1));
+
+ // writes when access is ignore should invalidate
+ $tmp_ignore = elgg_set_ignore_access(true);
+ $this->obj1->setMetaData($this->name, $this->value);
+ $this->assertFalse($this->cache->isKnown($this->guid1, $this->name));
+ elgg_set_ignore_access($tmp_ignore);
+ }
+
+ public function testDisableAndEnable() {
+ // both should mark cache unknown
+ $this->obj1->setMetaData($this->name, $this->value);
+ $this->obj1->disableMetadata($this->name);
+ $this->assertFalse($this->cache->isKnown($this->guid1, $this->name));
+
+ $this->cache->save($this->guid1, $this->name, $this->value);
+ $this->obj1->enableMetadata($this->name);
+ $this->assertFalse($this->cache->isKnown($this->guid1, $this->name));
+ }
+
+ public function testPopulateFromEntities() {
+ // test populating cache from set of entities
+ $this->obj1->setMetaData($this->name, $this->value);
+ $this->obj1->setMetaData($this->name, 4, 'integer', true);
+ $this->obj1->setMetaData("{$this->name}-2", "{$this->value}-2");
+ $this->obj2->setMetaData($this->name, $this->value);
+
+ $this->cache->flush();
+ $this->cache->populateFromEntities(array($this->guid1, $this->guid2));
+
+ $expected = array();
+ $expected[$this->name][] = $this->value;
+ $expected[$this->name][] = 4;
+ $expected["{$this->name}-2"] = "{$this->value}-2";
+ $this->assertIdentical($this->cache->loadAll($this->guid1), $expected);
+
+ $expected = array();
+ $expected[$this->name] = $this->value;
+ $this->assertIdentical($this->cache->loadAll($this->guid2), $expected);
+ }
+
+ public function testFilterHeavyEntities() {
+ $big_str = str_repeat('-', 5000);
+ $this->obj2->setMetaData($this->name, array($big_str, $big_str));
+
+ $guids = array($this->guid1, $this->guid2);
+ $expected = array($this->guid1);
+ $actual = $this->cache->filterMetadataHeavyEntities($guids, 6000);
+ $this->assertIdentical($actual, $expected);
+ }
+
+ public function testCreateMetadataInvalidates() {
+ $this->obj1->foo = 1;
+ create_metadata($this->guid1, 'foo', 2, '', elgg_get_logged_in_user_guid(), ACCESS_FRIENDS);
+
+ $this->assertEqual($this->obj1->foo, 2);
+ }
+}
diff --git a/engine/tests/api/metastrings.php b/engine/tests/api/metastrings.php
new file mode 100644
index 000000000..5efdab972
--- /dev/null
+++ b/engine/tests/api/metastrings.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Elgg Metastrings test
+ *
+ * @package Elgg.Core
+ * @subpackage Metastrings.Test
+ */
+class ElggCoreMetastringsTest extends ElggCoreUnitTest {
+
+ public $metastringTypes = array('metadata', 'annotations');
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ $this->metastrings = array();
+ $this->object = new ElggObject();
+ $this->object->save();
+ }
+
+ public function createAnnotations($max = 1) {
+ $annotations = array();
+ for ($i=0; $i<$max; $i++) {
+ $name = 'test_annotation_name' . rand();
+ $value = 'test_annotation_value' . rand();
+ $id = create_annotation($this->object->guid, $name, $value);
+ $annotations[] = $id;
+ }
+
+ return $annotations;
+ }
+
+ public function createMetadata($max = 1) {
+ $metadata = array();
+ for ($i=0; $i<$max; $i++) {
+ $name = 'test_metadata_name' . rand();
+ $value = 'test_metadata_value' . rand();
+ $id = create_metadata($this->object->guid, $name, $value);
+ $metadata[] = $id;
+ }
+
+ return $metadata;
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ access_show_hidden_entities(true);
+ elgg_delete_annotations(array(
+ 'guid' => $this->object->guid,
+ ));
+ access_show_hidden_entities(false);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ $this->object->delete();
+
+ parent::__destruct();
+ }
+
+ public function testDeleteByID() {
+ $db_prefix = elgg_get_config('dbprefix');
+ $annotations = $this->createAnnotations(1);
+ $metadata = $this->createMetadata(1);
+
+ foreach ($this->metastringTypes as $type) {
+ $id = ${$type}[0];
+ $table = $db_prefix . $type;
+ $q = "SELECT * FROM $table WHERE id = $id";
+ $test = get_data($q);
+
+ $this->assertEqual($test[0]->id, $id);
+ $this->assertIdentical(true, elgg_delete_metastring_based_object_by_id($id, $type));
+ $this->assertIdentical(array(), get_data($q));
+ }
+ }
+
+ public function testGetMetastringObjectFromID() {
+ $db_prefix = elgg_get_config('dbprefix');
+ $annotations = $this->createAnnotations(1);
+ $metadata = $this->createMetadata(1);
+
+ foreach ($this->metastringTypes as $type) {
+ $id = ${$type}[0];
+ $test = elgg_get_metastring_based_object_from_id($id, $type);
+
+ $this->assertEqual($id, $test->id);
+ }
+ }
+
+ public function testGetMetastringObjectFromIDWithDisabledAnnotation() {
+ $name = 'test_annotation_name' . rand();
+ $value = 'test_annotation_value' . rand();
+ $id = create_annotation($this->object->guid, $name, $value);
+ $annotation = elgg_get_annotation_from_id($id);
+ $this->assertTrue($annotation->disable());
+
+ $test = elgg_get_metastring_based_object_from_id($id, 'annotation');
+ $this->assertEqual(false, $test);
+ }
+
+ public function testGetMetastringBasedObjectWithDisabledAnnotation() {
+ $name = 'test_annotation_name' . rand();
+ $value = 'test_annotation_value' . rand();
+ $id = create_annotation($this->object->guid, $name, $value);
+ $annotation = elgg_get_annotation_from_id($id);
+ $this->assertTrue($annotation->disable());
+
+ $test = elgg_get_metastring_based_objects(array(
+ 'metastring_type' => 'annotations',
+ 'guid' => $this->object->guid,
+ ));
+ $this->assertEqual(array(), $test);
+ }
+
+ public function testEnableDisableByID() {
+ $db_prefix = elgg_get_config('dbprefix');
+ $annotations = $this->createAnnotations(1);
+ $metadata = $this->createMetadata(1);
+
+ foreach ($this->metastringTypes as $type) {
+ $id = ${$type}[0];
+ $table = $db_prefix . $type;
+ $q = "SELECT * FROM $table WHERE id = $id";
+ $test = get_data($q);
+
+ // disable
+ $this->assertEqual($test[0]->enabled, 'yes');
+ $this->assertTrue(elgg_set_metastring_based_object_enabled_by_id($id, 'no', $type));
+
+ $test = get_data($q);
+ $this->assertEqual($test[0]->enabled, 'no');
+
+ // enable
+ $ashe = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $this->assertTrue(elgg_set_metastring_based_object_enabled_by_id($id, 'yes', $type));
+
+ $test = get_data($q);
+ $this->assertEqual($test[0]->enabled, 'yes');
+
+ access_show_hidden_entities($ashe);
+ }
+ }
+
+ public function testKeepMeFromDeletingEverything() {
+ foreach ($this->metastringTypes as $type) {
+ $required = array(
+ 'guid', 'guids'
+ );
+
+ switch ($type) {
+ case 'metadata':
+ $metadata_required = array(
+ 'metadata_owner_guid', 'metadata_owner_guids',
+ 'metadata_name', 'metadata_names',
+ 'metadata_value', 'metadata_values'
+ );
+
+ $required = array_merge($required, $metadata_required);
+ break;
+
+ case 'annotations':
+ $annotations_required = array(
+ 'annotation_owner_guid', 'annotation_owner_guids',
+ 'annotation_name', 'annotation_names',
+ 'annotation_value', 'annotation_values'
+ );
+
+ $required = array_merge($required, $annotations_required);
+ break;
+ }
+
+ $options = array();
+ $this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type));
+
+ // limit alone isn't valid:
+ $options = array('limit' => 10);
+ $this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type));
+
+ foreach ($required as $key) {
+ $options = array();
+
+ $options[$key] = ELGG_ENTITIES_ANY_VALUE;
+ $this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = ELGG_ENTITIES_ANY_VALUE");
+
+ $options[$key] = ELGG_ENTITIES_NO_VALUE;
+ $this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = ELGG_ENTITIES_NO_VALUE");
+
+ $options[$key] = false;
+ $this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = bool false");
+
+ $options[$key] = true;
+ $this->assertTrue(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = bool true");
+
+ $options[$key] = 'test';
+ $this->assertTrue(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = 'test'");
+
+ $options[$key] = array('test');
+ $this->assertTrue(elgg_is_valid_options_for_batch_operation($options, $type), "Sent $key = array('test')");
+ }
+ }
+ }
+}
diff --git a/engine/tests/api/output.php b/engine/tests/api/output.php
new file mode 100644
index 000000000..c3d5aa8c6
--- /dev/null
+++ b/engine/tests/api/output.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Test case for ElggAutoP functionality.
+ */
+class ElggCoreOutputAutoPTest extends ElggCoreUnitTest {
+
+ /**
+ * @var ElggAutoP
+ */
+ protected $_autop;
+
+ public function setUp() {
+ $this->_autop = new ElggAutoP();
+ }
+
+ public function testDomRoundtrip() {
+ $d = dir(dirname(dirname(__FILE__)) . '/test_files/output/autop');
+ $in = file_get_contents($d->path . "/domdoc_in.html");
+ $exp = file_get_contents($d->path . "/domdoc_exp.html");
+ $exp = $this->flattenString($exp);
+
+ $doc = new DOMDocument();
+ libxml_use_internal_errors(true);
+ $doc->loadHTML("<html><meta http-equiv='content-type' content='text/html; charset=utf-8'><body>"
+ . $in . '</body></html>');
+ $serialized = $doc->saveHTML();
+ list(,$out) = explode('<body>', $serialized, 2);
+ list($out) = explode('</body>', $out, 2);
+ $out = $this->flattenString($out);
+
+ $this->assertEqual($exp, $out, "DOMDocument's parsing/serialization roundtrip");
+ }
+
+ public function testProcess() {
+ $data = $this->provider();
+ foreach ($data as $row) {
+ list($test, $in, $exp) = $row;
+ $exp = $this->flattenString($exp);
+ $out = $this->_autop->process($in);
+ $out = $this->flattenString($out);
+
+ $this->assertEqual($exp, $out, "Equality case {$test}");
+ }
+ }
+
+ public function provider() {
+ $d = dir(dirname(dirname(__FILE__)) . '/test_files/output/autop');
+ $tests = array();
+ while (false !== ($entry = $d->read())) {
+ if (preg_match('/^([a-z\\-]+)\.in\.html$/i', $entry, $m)) {
+ $tests[] = $m[1];
+ }
+ }
+
+ $data = array();
+ foreach ($tests as $test) {
+ $data[] = array(
+ $test,
+ file_get_contents($d->path . '/' . "{$test}.in.html"),
+ file_get_contents($d->path . '/' . "{$test}.exp.html"),
+ );
+ }
+ return $data;
+ }
+
+ /**
+ * Different versions of PHP return different whitespace between tags.
+ * Removing all line breaks normalizes that.
+ */
+ public function flattenString($string) {
+ $r = preg_replace('/[\n\r]+/', '', $string);
+ return $r;
+ }
+} \ No newline at end of file
diff --git a/engine/tests/api/plugins.php b/engine/tests/api/plugins.php
new file mode 100644
index 000000000..d0f111c48
--- /dev/null
+++ b/engine/tests/api/plugins.php
@@ -0,0 +1,299 @@
+<?php
+/**
+ * Elgg Plugins Test
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins.Test
+ */
+class ElggCorePluginsAPITest extends ElggCoreUnitTest {
+ // 1.8 manifest object
+ var $manifest18;
+
+ // 1.8 package at test_files/plugin_18/
+ var $package18;
+
+ // 1.7 manifest object
+ var $manifest17;
+
+ // 1.7 package at test_files/plugin_17/
+ var $package17;
+
+ public function __construct() {
+ parent::__construct();
+
+ $this->manifest18 = new ElggPluginManifest(get_config('path') . 'engine/tests/test_files/plugin_18/manifest.xml', 'plugin_test_18');
+ $this->manifest17 = new ElggPluginManifest(get_config('path') . 'engine/tests/test_files/plugin_17/manifest.xml', 'plugin_test_17');
+
+ $this->package18 = new ElggPluginPackage(get_config('path') . 'engine/tests/test_files/plugin_18');
+ $this->package17 = new ElggPluginPackage(get_config('path') . 'engine/tests/test_files/plugin_17');
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+ }
+
+ // generic tests
+ public function testElggPluginManifestFromString() {
+ $manifest_file = file_get_contents(get_config('path') . 'engine/tests/test_files/plugin_17/manifest.xml');
+ $manifest = new ElggPluginManifest($manifest_file);
+
+ $this->assertIsA($manifest, 'ElggPluginManifest');
+ }
+
+ public function testElggPluginManifestFromFile() {
+ $file = get_config('path') . 'engine/tests/test_files/plugin_17/manifest.xml';
+ $manifest = new ElggPluginManifest($file);
+
+ $this->assertIsA($manifest, 'ElggPluginManifest');
+ }
+
+ public function testElggPluginManifestFromXMLEntity() {
+ $xml = xml_to_object($manifest_file = file_get_contents(get_config('path') . 'engine/tests/test_files/plugin_17/manifest.xml'));
+ $manifest = new ElggPluginManifest($xml);
+
+ $this->assertIsA($manifest, 'ElggPluginManifest');
+ }
+
+ // exact manifest values
+ // 1.8 interface
+ public function testElggPluginManifest18() {
+ $manifest_array = array(
+ 'name' => 'Test Manifest',
+ 'author' => 'Anyone',
+ 'version' => '1.0',
+ 'blurb' => 'A concise description.',
+ 'description' => 'A longer, more interesting description.',
+ 'website' => 'http://www.elgg.org/',
+ 'repository' => 'https://github.com/Elgg/Elgg',
+ 'bugtracker' => 'https://github.com/elgg/elgg/issues',
+ 'donations' => 'http://elgg.org/supporter.php',
+ 'copyright' => '(C) Elgg Foundation 2011',
+ 'license' => 'GNU General Public License version 2',
+
+ 'requires' => array(
+ array('type' => 'elgg_version', 'version' => '3009030802', 'comparison' => 'lt'),
+ array('type' => 'elgg_release', 'version' => '1.8-svn'),
+ array('type' => 'php_extension', 'name' => 'gd'),
+ array('type' => 'php_ini', 'name' => 'short_open_tag', 'value' => 'off'),
+ array('type' => 'php_extension', 'name' => 'made_up', 'version' => '1.0'),
+ array('type' => 'plugin', 'name' => 'fake_plugin', 'version' => '1.0'),
+ array('type' => 'plugin', 'name' => 'profile', 'version' => '1.0'),
+ array('type' => 'plugin', 'name' => 'profile_api', 'version' => '1.3', 'comparison' => 'lt'),
+ array('type' => 'priority', 'priority' => 'after', 'plugin' => 'profile'),
+ ),
+
+ 'screenshot' => array(
+ array('description' => 'Fun things to do 1', 'path' => 'graphics/plugin_ss1.png'),
+ array('description' => 'Fun things to do 2', 'path' => 'graphics/plugin_ss2.png'),
+ ),
+
+ 'category' => array(
+ 'Admin', 'ServiceAPI'
+ ),
+
+ 'conflicts' => array(
+ array('type' => 'plugin', 'name' => 'profile_api', 'version' => '1.0')
+ ),
+
+ 'provides' => array(
+ array('type' => 'plugin', 'name' => 'profile_api', 'version' => '1.3'),
+ array('type' => 'php_extension', 'name' => 'big_math', 'version' => '1.0')
+ ),
+
+ 'suggests' => array(
+ array('type' => 'plugin', 'name' => 'facebook_connect', 'version' => '1.0'),
+ ),
+
+ // string because we are reading from a file
+ 'activate_on_install' => 'true',
+ );
+
+ $this->assertIdentical($this->manifest18->getManifest(), $manifest_array);
+ }
+
+ public function testElggPluginManifest17() {
+ $manifest_array = array(
+ 'author' => 'Anyone',
+ 'version' => '1.0',
+ 'description' => 'A 1.7-style manifest.',
+ 'website' => 'http://www.elgg.org/',
+ 'copyright' => '(C) Elgg Foundation 2011',
+ 'license' => 'GNU General Public License version 2',
+ 'elgg_version' => '2009030702',
+ 'name' => 'Plugin Test 17',
+ );
+
+ $this->assertIdentical($this->manifest17->getManifest(), $manifest_array);
+ }
+
+
+ public function testElggPluginManifestGetApiVersion() {
+ $this->assertEqual($this->manifest18->getApiVersion(), 1.8);
+ $this->assertEqual($this->manifest17->getApiVersion(), 1.7);
+ }
+
+ public function testElggPluginManifestGetPluginID() {
+ $this->assertEqual($this->manifest18->getPluginID(), 'plugin_test_18');
+ $this->assertEqual($this->manifest17->getPluginID(), 'plugin_test_17');
+ }
+
+
+ // normalized attributes
+ public function testElggPluginManifestGetName() {
+ $this->assertEqual($this->manifest18->getName(), 'Test Manifest');
+ $this->assertEqual($this->manifest17->getName(), 'Plugin Test 17');
+ }
+
+ public function testElggPluginManifestGetAuthor() {
+ $this->assertEqual($this->manifest18->getAuthor(), 'Anyone');
+ $this->assertEqual($this->manifest17->getAuthor(), 'Anyone');
+ }
+
+ public function testElggPluginManifestGetVersion() {
+ $this->assertEqual($this->manifest18->getVersion(), 1.0);
+ $this->assertEqual($this->manifest17->getVersion(), 1.0);
+ }
+
+ public function testElggPluginManifestGetBlurb() {
+ $this->assertEqual($this->manifest18->getBlurb(), 'A concise description.');
+ $this->assertEqual($this->manifest17->getBlurb(), 'A 1.7-style manifest.');
+ }
+
+ public function testElggPluginManifestGetWebsite() {
+ $this->assertEqual($this->manifest18->getWebsite(), 'http://www.elgg.org/');
+ $this->assertEqual($this->manifest17->getWebsite(), 'http://www.elgg.org/');
+ }
+
+ public function testElggPluginManifestGetRepository() {
+ $this->assertEqual($this->manifest18->getRepositoryURL(), 'https://github.com/Elgg/Elgg');
+ $this->assertEqual($this->manifest17->getRepositoryURL(), '');
+ }
+
+ public function testElggPluginManifestGetBugtracker() {
+ $this->assertEqual($this->manifest18->getBugTrackerURL(), 'https://github.com/elgg/elgg/issues');
+ $this->assertEqual($this->manifest17->getBugTrackerURL(), '');
+ }
+
+ public function testElggPluginManifestGetDonationsPage() {
+ $this->assertEqual($this->manifest18->getDonationsPageURL(), 'http://elgg.org/supporter.php');
+ $this->assertEqual($this->manifest17->getDonationsPageURL(), '');
+ }
+
+ public function testElggPluginManifestGetCopyright() {
+ $this->assertEqual($this->manifest18->getCopyright(), '(C) Elgg Foundation 2011');
+ $this->assertEqual($this->manifest18->getCopyright(), '(C) Elgg Foundation 2011');
+ }
+
+ public function testElggPluginManifestGetLicense() {
+ $this->assertEqual($this->manifest18->getLicense(), 'GNU General Public License version 2');
+ $this->assertEqual($this->manifest17->getLicense(), 'GNU General Public License version 2');
+ }
+
+
+ public function testElggPluginManifestGetRequires() {
+ $requires = array(
+ array('type' => 'elgg_version', 'version' => '3009030802', 'comparison' => 'lt'),
+ array('type' => 'elgg_release', 'version' => '1.8-svn', 'comparison' => 'ge'),
+ array('type' => 'php_extension', 'name' => 'gd', 'version' => '', 'comparison' => '='),
+ array('type' => 'php_ini', 'name' => 'short_open_tag', 'value' => 0, 'comparison' => '='),
+ array('type' => 'php_extension', 'name' => 'made_up', 'version' => '1.0', 'comparison' => '='),
+ array('type' => 'plugin', 'name' => 'fake_plugin', 'version' => '1.0', 'comparison' => 'ge'),
+ array('type' => 'plugin', 'name' => 'profile', 'version' => '1.0', 'comparison' => 'ge'),
+ array('type' => 'plugin', 'name' => 'profile_api', 'version' => '1.3', 'comparison' => 'lt'),
+ array('type' => 'priority', 'priority' => 'after', 'plugin' => 'profile'),
+ );
+
+ $this->assertIdentical($this->package18->getManifest()->getRequires(), $requires);
+
+ $requires = array(
+ array('type' => 'elgg_version', 'version' => '2009030702', 'comparison' => 'ge')
+ );
+
+ $this->assertIdentical($this->package17->getManifest()->getRequires(), $requires);
+ }
+
+ public function testElggPluginManifestGetSuggests() {
+ $suggests = array(
+ array('type' => 'plugin', 'name' => 'facebook_connect', 'version' => '1.0', 'comparison' => 'ge'),
+ );
+
+ $this->assertIdentical($this->package18->getManifest()->getSuggests(), $suggests);
+
+ $suggests = array();
+
+ $this->assertIdentical($this->package17->getManifest()->getSuggests(), $suggests);
+ }
+
+ public function testElggPluginManifestGetDescription() {
+ $this->assertEqual($this->package18->getManifest()->getDescription(), 'A longer, more interesting description.');
+ $this->assertEqual($this->package17->getManifest()->getDescription(), 'A 1.7-style manifest.');
+ }
+
+ public function testElggPluginManifestGetCategories() {
+ $categories = array(
+ 'Admin', 'ServiceAPI'
+ );
+
+ $this->assertIdentical($this->package18->getManifest()->getCategories(), $categories);
+ $this->assertIdentical($this->package17->getManifest()->getCategories(), array());
+ }
+
+ public function testElggPluginManifestGetScreenshots() {
+ $screenshots = array(
+ array('description' => 'Fun things to do 1', 'path' => 'graphics/plugin_ss1.png'),
+ array('description' => 'Fun things to do 2', 'path' => 'graphics/plugin_ss2.png'),
+ );
+
+ $this->assertIdentical($this->package18->getManifest()->getScreenshots(), $screenshots);
+ $this->assertIdentical($this->package17->getManifest()->getScreenshots(), array());
+ }
+
+ public function testElggPluginManifestGetProvides() {
+ $provides = array(
+ array('type' => 'plugin', 'name' => 'profile_api', 'version' => '1.3'),
+ array('type' => 'php_extension', 'name' => 'big_math', 'version' => '1.0'),
+ array('type' => 'plugin', 'name' => 'plugin_18', 'version' => '1.0')
+ );
+
+ $this->assertIdentical($this->package18->getManifest()->getProvides(), $provides);
+
+
+ $provides = array(
+ array('type' => 'plugin', 'name' => 'plugin_17', 'version' => '1.0')
+ );
+
+ $this->assertIdentical($this->package17->getManifest()->getProvides(), $provides);
+ }
+
+ public function testElggPluginManifestGetConflicts() {
+ $conflicts = array(
+ array(
+ 'type' => 'plugin',
+ 'name' => 'profile_api',
+ 'version' => '1.0',
+ 'comparison' => '='
+ )
+ );
+
+ $this->assertIdentical($this->manifest18->getConflicts(), $conflicts);
+ $this->assertIdentical($this->manifest17->getConflicts(), array());
+ }
+
+ public function testElggPluginManifestGetActivateOnInstall() {
+ $this->assertIdentical($this->manifest18->getActivateOnInstall(), true);
+ }
+
+ // ElggPluginPackage
+ public function testElggPluginPackageDetectIDFromPath() {
+ $this->assertEqual($this->package18->getID(), 'plugin_18');
+ }
+
+ public function testElggPluginPackageDetectIDFromPluginID() {
+ $package = new ElggPluginPackage('profile');
+ $this->assertEqual($package->getID(), 'profile');
+ }
+}
diff --git a/engine/tests/api/river.php b/engine/tests/api/river.php
new file mode 100644
index 000000000..6931b9f41
--- /dev/null
+++ b/engine/tests/api/river.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Elgg Test river api
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreRiverAPITest extends ElggCoreUnitTest {
+
+ public function testElggTypeSubtypeWhereSQL() {
+ $types = array('object');
+ $subtypes = array('blog');
+ $result = elgg_get_river_type_subtype_where_sql('rv', $types, $subtypes, null);
+ $this->assertIdentical($result, "((rv.type = 'object') AND ((rv.subtype = 'blog')))");
+
+ $types = array('object');
+ $subtypes = array('blog', 'file');
+ $result = elgg_get_river_type_subtype_where_sql('rv', $types, $subtypes, null);
+ $this->assertIdentical($result, "((rv.type = 'object') AND ((rv.subtype = 'blog') OR (rv.subtype = 'file')))");
+ }
+}
diff --git a/engine/tests/elgg_unit_test.php b/engine/tests/elgg_unit_test.php
new file mode 100644
index 000000000..70f8788a0
--- /dev/null
+++ b/engine/tests/elgg_unit_test.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Elgg Core Unit Tester
+ *
+ * This class is to be extended by all Elgg unit tests. As such, any method here
+ * will be available to the tests.
+ */
+abstract class ElggCoreUnitTest extends UnitTestCase
+{
+ /**
+ * Class constructor.
+ *
+ * A simple wrapper to call the parent constructor.
+ */
+ public function __construct()
+ {
+ parent::__construct();
+ }
+
+ /**
+ * Class destructor.
+ *
+ * The parent does not provide a destructor, so including an explicit one here.
+ */
+ public function __destruct()
+ {
+ }
+}
diff --git a/engine/tests/objects/entities.php b/engine/tests/objects/entities.php
new file mode 100644
index 000000000..bac72079e
--- /dev/null
+++ b/engine/tests/objects/entities.php
@@ -0,0 +1,423 @@
+<?php
+/**
+ * Elgg Test ElggEntities
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreEntityTest extends ElggCoreUnitTest {
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->entity = new ElggEntityTest();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ $this->swallowErrors();
+ unset($this->entity);
+ }
+
+ /**
+ * Tests the protected attributes
+ */
+ public function testElggEntityAttributes() {
+ $test_attributes = array();
+ $test_attributes['guid'] = NULL;
+ $test_attributes['type'] = NULL;
+ $test_attributes['subtype'] = NULL;
+ $test_attributes['owner_guid'] = elgg_get_logged_in_user_guid();
+ $test_attributes['container_guid'] = elgg_get_logged_in_user_guid();
+ $test_attributes['site_guid'] = NULL;
+ $test_attributes['access_id'] = ACCESS_PRIVATE;
+ $test_attributes['time_created'] = NULL;
+ $test_attributes['time_updated'] = NULL;
+ $test_attributes['last_action'] = NULL;
+ $test_attributes['enabled'] = 'yes';
+ $test_attributes['tables_split'] = 1;
+ $test_attributes['tables_loaded'] = 0;
+ ksort($test_attributes);
+
+ $entity_attributes = $this->entity->expose_attributes();
+ ksort($entity_attributes);
+
+ $this->assertIdentical($entity_attributes, $test_attributes);
+ }
+
+ public function testElggEntityGetAndSetBaseAttributes() {
+ // explicitly set and get access_id
+ $this->assertIdentical($this->entity->get('access_id'), ACCESS_PRIVATE);
+ $this->assertTrue($this->entity->set('access_id', ACCESS_PUBLIC));
+ $this->assertIdentical($this->entity->get('access_id'), ACCESS_PUBLIC);
+
+ // check internal attributes array
+ $attributes = $this->entity->expose_attributes();
+ $this->assertIdentical($attributes['access_id'], ACCESS_PUBLIC);
+
+ // implicitly set and get access_id
+ $this->entity->access_id = ACCESS_PRIVATE;
+ $this->assertIdentical($this->entity->access_id, ACCESS_PRIVATE);
+
+ // unset access_id
+ unset($this->entity->access_id);
+ $this->assertIdentical($this->entity->access_id, '');
+
+ // unable to directly set guid
+ $this->assertFalse($this->entity->set('guid', 'error'));
+ $this->entity->guid = 'error';
+ $this->assertNotEqual($this->entity->guid, 'error');
+
+ // fail on non-attribute
+ $this->assertNull($this->entity->get('non_existent'));
+
+ // consider helper methods
+ $this->assertIdentical($this->entity->getGUID(), $this->entity->guid );
+ $this->assertIdentical($this->entity->getType(), $this->entity->type );
+ $this->assertIdentical($this->entity->getSubtype(), $this->entity->subtype );
+ $this->assertIdentical($this->entity->getOwnerGUID(), $this->entity->owner_guid );
+ $this->assertIdentical($this->entity->getAccessID(), $this->entity->access_id );
+ $this->assertIdentical($this->entity->getTimeCreated(), $this->entity->time_created );
+ $this->assertIdentical($this->entity->getTimeUpdated(), $this->entity->time_updated );
+ }
+
+ public function testElggEntityGetAndSetMetaData() {
+ // ensure metadata not set
+ $this->assertNull($this->entity->get('non_existent'));
+ $this->assertFalse(isset($this->entity->non_existent));
+
+ // create metadata
+ $this->entity->existent = 'testing';
+ $this->assertIdentical($this->entity->existent, 'testing');
+
+ // check metadata set
+ $this->assertTrue(isset($this->entity->existent));
+ $this->assertIdentical($this->entity->getMetaData('existent'), 'testing');
+
+ // check internal metadata array
+ $metadata = $this->entity->expose_metadata();
+ $this->assertIdentical($metadata['existent'], array('testing'));
+ }
+
+ public function testElggEnityGetAndSetAnnotations() {
+ $this->assertFalse(array_key_exists('non_existent', $this->entity->expose_annotations()));
+ $this->assertIdentical($this->entity->getAnnotations('non_existent'), array());
+
+ // set and check temp annotation
+ $this->assertTrue($this->entity->annotate('non_existent', 'testing'));
+ $this->assertIdentical($this->entity->getAnnotations('non_existent'), array('testing'));
+ $this->assertTrue(array_key_exists('non_existent', $this->entity->expose_annotations()));
+
+ // save entity and check for annotation
+ $this->entity->subtype = 'testing';
+ $this->save_entity();
+ $this->assertFalse(array_key_exists('non_existent', $this->entity->expose_annotations()));
+ $annotations = $this->entity->getAnnotations('non_existent');
+ $this->assertIsA($annotations[0], 'ElggAnnotation');
+ $this->assertIdentical($annotations[0]->name, 'non_existent');
+ $this->assertEqual($this->entity->countAnnotations('non_existent'), 1);
+
+ $this->assertIdentical($annotations, elgg_get_annotations(array('guid' => $this->entity->getGUID())));
+ $this->assertIdentical($annotations, elgg_get_annotations(array('guid' => $this->entity->getGUID(), 'type' => 'site')));
+ $this->assertIdentical($annotations, elgg_get_annotations(array('guid' => $this->entity->getGUID(), 'type' => 'site', 'subtype' => 'testing')));
+ $this->assertIdentical(FALSE, elgg_get_annotations(array('guid' => $this->entity->getGUID(), 'type' => 'site', 'subtype' => 'fail')));
+
+ // clear annotation
+ $this->assertTrue($this->entity->deleteAnnotations());
+ $this->assertEqual($this->entity->countAnnotations('non_existent'), 0);
+
+ $this->assertIdentical(array(), elgg_get_annotations(array('guid' => $this->entity->getGUID())));
+ $this->assertIdentical(array(), elgg_get_annotations(array('guid' => $this->entity->getGUID(), 'type' => 'site')));
+ $this->assertIdentical(array(), elgg_get_annotations(array('guid' => $this->entity->getGUID(), 'type' => 'site', 'subtype' => 'testing')));
+
+ // clean up
+ $this->assertTrue($this->entity->delete());
+ remove_subtype('site', 'testing');
+ }
+
+ public function testElggEntityCache() {
+ global $ENTITY_CACHE;
+ $this->assertIsA($ENTITY_CACHE, 'array');
+ }
+
+ public function testElggEntitySaveAndDelete() {
+ global $ENTITY_CACHE;
+
+ // unable to delete with no guid
+ $this->assertFalse($this->entity->delete());
+
+ // error on save
+ try {
+ $this->entity->save();
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('InvalidParameterException:EntityTypeNotSet'));
+ }
+
+ // set elements
+ $this->entity->type = 'site';
+ $this->entity->non_existent = 'testing';
+
+ // save
+ $this->AssertEqual($this->entity->getGUID(), 0);
+ $guid = $this->entity->save();
+ $this->AssertNotEqual($guid, 0);
+
+ // check guid
+ $this->AssertEqual($this->entity->getGUID(), $guid);
+ $attributes = $this->entity->expose_attributes();
+ $this->AssertEqual($attributes['guid'], $guid);
+ $this->AssertIdentical($ENTITY_CACHE[$guid], $this->entity);
+
+ // check metadata
+ $metadata = $this->entity->expose_metadata();
+ $this->AssertFalse(in_array('non_existent', $metadata));
+ $this->AssertEqual($this->entity->get('non_existent'), 'testing');
+
+ // clean up with delete
+ $this->assertIdentical(true, $this->entity->delete());
+ }
+
+ public function testElggEntityDisableAndEnable() {
+ global $CONFIG;
+
+ // ensure enabled
+ $this->assertTrue($this->entity->isEnabled());
+
+ // false on disable because it's not saved yet.
+ $this->assertFalse($this->entity->disable());
+
+ // save and disable
+ $this->save_entity();
+
+ // add annotations and metadata to check if they're disabled.
+ $annotation_id = create_annotation($this->entity->guid, 'test_annotation_' . rand(), 'test_value_' . rand());
+ $metadata_id = create_metadata($this->entity->guid, 'test_metadata_' . rand(), 'test_value_' . rand());
+
+ $this->assertTrue($this->entity->disable());
+
+ // ensure disabled by comparing directly with database
+ $entity = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid = '{$this->entity->guid}'");
+ $this->assertIdentical($entity->enabled, 'no');
+
+ $annotation = get_data_row("SELECT * FROM {$CONFIG->dbprefix}annotations WHERE id = '$annotation_id'");
+ $this->assertIdentical($annotation->enabled, 'no');
+
+ $metadata = get_data_row("SELECT * FROM {$CONFIG->dbprefix}metadata WHERE id = '$metadata_id'");
+ $this->assertIdentical($metadata->enabled, 'no');
+
+ // re-enable for deletion to work
+ $this->assertTrue($this->entity->enable());
+
+ // check enabled
+ // check annotations and metadata enabled.
+ $entity = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid = '{$this->entity->guid}'");
+ $this->assertIdentical($entity->enabled, 'yes');
+
+ $annotation = get_data_row("SELECT * FROM {$CONFIG->dbprefix}annotations WHERE id = '$annotation_id'");
+ $this->assertIdentical($annotation->enabled, 'yes');
+
+ $metadata = get_data_row("SELECT * FROM {$CONFIG->dbprefix}metadata WHERE id = '$metadata_id'");
+ $this->assertIdentical($metadata->enabled, 'yes');
+
+ $this->assertTrue($this->entity->delete());
+ }
+
+ public function testElggEntityRecursiveDisableAndEnable() {
+ global $CONFIG;
+
+ $this->save_entity();
+ $obj1 = new ElggObject();
+ $obj1->container_guid = $this->entity->getGUID();
+ $obj1->save();
+ $obj2 = new ElggObject();
+ $obj2->container_guid = $this->entity->getGUID();
+ $obj2->save();
+
+ // disable $obj2 before disabling the container
+ $this->assertTrue($obj2->disable());
+
+ // disable entities container by $this->entity
+ $this->assertTrue($this->entity->disable());
+ $entity = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid = '{$obj1->guid}'");
+ $this->assertIdentical($entity->enabled, 'no');
+
+ // enable entities that were disabled with the container (but not $obj2)
+ $this->assertTrue($this->entity->enable());
+ $entity = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid = '{$obj1->guid}'");
+ $this->assertIdentical($entity->enabled, 'yes');
+ $entity = get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid = '{$obj2->guid}'");
+ $this->assertIdentical($entity->enabled, 'no');
+
+ // cleanup
+ $this->assertTrue($obj2->enable());
+ $this->assertTrue($obj2->delete());
+ $this->assertTrue($obj1->delete());
+ $this->assertTrue($this->entity->delete());
+ }
+
+ public function testElggEntityMetadata() {
+ // let's delete a non-existent metadata
+ $this->assertFalse($this->entity->deleteMetadata('important'));
+
+ // let's add the metadata
+ $this->entity->important = 'indeed!';
+ $this->assertIdentical('indeed!', $this->entity->important);
+ $this->entity->less_important = 'true, too!';
+ $this->assertIdentical('true, too!', $this->entity->less_important);
+ $this->save_entity();
+
+ // test deleting incorrectly
+ // @link https://github.com/elgg/elgg/issues/2273
+ $this->assertNull($this->entity->deleteMetadata('impotent'));
+ $this->assertEqual($this->entity->important, 'indeed!');
+
+ // get rid of one metadata
+ $this->assertEqual($this->entity->important, 'indeed!');
+ $this->assertTrue($this->entity->deleteMetadata('important'));
+ $this->assertNull($this->entity->important);
+
+ // get rid of all metadata
+ $this->assertTrue($this->entity->deleteMetadata());
+ $this->assertNull($this->entity->less_important);
+
+ // clean up database
+ $this->assertTrue($this->entity->delete());
+ }
+
+ public function testElggEntityExportables() {
+ $exportables = array(
+ 'guid',
+ 'type',
+ 'subtype',
+ 'time_created',
+ 'time_updated',
+ 'container_guid',
+ 'owner_guid',
+ 'site_guid'
+ );
+
+ $this->assertIdentical($exportables, $this->entity->getExportableValues());
+ }
+
+ public function testElggEntityMultipleMetadata() {
+ foreach (array(false, true) as $save) {
+ if ($save) {
+ $this->save_entity();
+ }
+ $md = array('brett', 'bryan', 'brad');
+ $name = 'test_md_' . rand();
+
+ $this->entity->$name = $md;
+
+ $this->assertEqual($md, $this->entity->$name);
+
+ if ($save) {
+ $this->assertTrue($this->entity->delete());
+ }
+ }
+ }
+
+ public function testElggEntitySingleElementArrayMetadata() {
+ foreach (array(false, true) as $save) {
+ if ($save) {
+ $this->save_entity();
+ }
+ $md = array('test');
+ $name = 'test_md_' . rand();
+
+ $this->entity->$name = $md;
+
+ $this->assertEqual($md[0], $this->entity->$name);
+
+ if ($save) {
+ $this->assertTrue($this->entity->delete());
+ }
+ }
+ }
+
+ public function testElggEntityAppendMetadata() {
+ foreach (array(false, true) as $save) {
+ if ($save) {
+ $this->save_entity();
+ }
+ $md = 'test';
+ $name = 'test_md_' . rand();
+
+ $this->entity->$name = $md;
+ $this->entity->setMetaData($name, 'test2', '', true);
+
+ $this->assertEqual(array('test', 'test2'), $this->entity->$name);
+
+ if ($save) {
+ $this->assertTrue($this->entity->delete());
+ }
+ }
+ }
+
+ public function testElggEntitySingleElementArrayAppendMetadata() {
+ foreach (array(false, true) as $save) {
+ if ($save) {
+ $this->save_entity();
+ }
+ $md = 'test';
+ $name = 'test_md_' . rand();
+
+ $this->entity->$name = $md;
+ $this->entity->setMetaData($name, array('test2'), '', true);
+
+ $this->assertEqual(array('test', 'test2'), $this->entity->$name);
+
+ if ($save) {
+ $this->assertTrue($this->entity->delete());
+ }
+ }
+ }
+
+ public function testElggEntityArrayAppendMetadata() {
+ foreach (array(false, true) as $save) {
+ if ($save) {
+ $this->save_entity();
+ }
+ $md = array('brett', 'bryan', 'brad');
+ $md2 = array('test1', 'test2', 'test3');
+ $name = 'test_md_' . rand();
+
+ $this->entity->$name = $md;
+ $this->entity->setMetaData($name, $md2, '', true);
+
+ $this->assertEqual(array_merge($md, $md2), $this->entity->$name);
+
+ if ($save) {
+ $this->assertTrue($this->entity->delete());
+ }
+ }
+ }
+
+ protected function save_entity($type='site') {
+ $this->entity->type = $type;
+ $this->assertNotEqual($this->entity->save(), 0);
+ }
+}
+
+// ElggEntity is an abstract class with no abstact methods.
+class ElggEntityTest extends ElggEntity {
+ public function __construct() {
+ $this->initializeAttributes();
+ }
+
+ public function expose_attributes() {
+ return $this->attributes;
+ }
+
+ public function expose_metadata() {
+ return $this->temp_metadata;
+ }
+
+ public function expose_annotations() {
+ return $this->temp_annotations;
+ }
+}
diff --git a/engine/tests/objects/filestore.php b/engine/tests/objects/filestore.php
new file mode 100644
index 000000000..9732f0af4
--- /dev/null
+++ b/engine/tests/objects/filestore.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Elgg Test Skeleton
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreFilestoreTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ // all code should come after here
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->filestore = new ElggDiskFilestoreTest();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+
+ unset($this->filestore);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ // all code should go above here
+ parent::__destruct();
+ }
+
+ public function testFileMatrix() {
+ global $CONFIG;
+
+ // create a test user
+ $user = $this->createTestUser();
+ $created = date('Y/m/d', $user->time_created);
+
+ // check matrix with guid
+ $guid_dir = $this->filestore->makeFileMatrix($user->guid);
+ $this->assertIdentical($guid_dir, "$created/$user->guid/");
+
+ // clean up user
+ $user->delete();
+ }
+
+ public function testFilenameOnFilestore() {
+ global $CONFIG;
+
+ // create a user to own the file
+ $user = $this->createTestUser();
+ $created = date('Y/m/d', $user->time_created);
+
+ // setup a test file
+ $file = new ElggFile();
+ $file->owner_guid = $user->guid;
+ $file->setFilename('testing/filestore.txt');
+ $file->open('write');
+ $file->write('Testing!');
+ $this->assertTrue($file->close());
+
+ // ensure filename and path is expected
+ $filename = $file->getFilenameOnFilestore($file);
+ $filepath = "$CONFIG->dataroot$created/$user->guid/testing/filestore.txt";
+ $this->assertIdentical($filename, $filepath);
+ $this->assertTrue(file_exists($filepath));
+
+ // ensure file removed on user delete
+ $user->delete();
+ $this->assertFalse(file_exists($filepath));
+ }
+
+
+ protected function createTestUser($username = 'fileTest') {
+ $user = new ElggUser();
+ $user->username = $username;
+ $guid = $user->save();
+
+ // load user to have access to creation time
+ return get_entity($guid);
+ }
+}
+
+class ElggDiskFilestoreTest extends ElggDiskFilestore {
+ public function makeFileMatrix($guid) {
+ return parent::makeFileMatrix($guid);
+ }
+}
diff --git a/engine/tests/objects/objects.php b/engine/tests/objects/objects.php
new file mode 100644
index 000000000..263ab2414
--- /dev/null
+++ b/engine/tests/objects/objects.php
@@ -0,0 +1,306 @@
+<?php
+/**
+ * Elgg Test ElggObject
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreObjectTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->entity = new ElggObjectTest();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ $this->swallowErrors();
+ unset($this->entity);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ parent::__destruct();
+ }
+
+ public function testElggObjectConstructor() {
+ $attributes = array();
+ $attributes['guid'] = NULL;
+ $attributes['type'] = 'object';
+ $attributes['subtype'] = NULL;
+ $attributes['owner_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['container_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['site_guid'] = NULL;
+ $attributes['access_id'] = ACCESS_PRIVATE;
+ $attributes['time_created'] = NULL;
+ $attributes['time_updated'] = NULL;
+ $attributes['last_action'] = NULL;
+ $attributes['enabled'] = 'yes';
+ $attributes['tables_split'] = 2;
+ $attributes['tables_loaded'] = 0;
+ $attributes['title'] = NULL;
+ $attributes['description'] = NULL;
+ ksort($attributes);
+
+ $entity_attributes = $this->entity->expose_attributes();
+ ksort($entity_attributes);
+
+ $this->assertIdentical($entity_attributes, $attributes);
+ }
+
+ public function testElggObjectSave() {
+ // new object
+ $this->AssertEqual($this->entity->getGUID(), 0);
+ $guid = $this->entity->save();
+ $this->AssertNotEqual($guid, 0);
+
+ $entity_row = $this->get_entity_row($guid);
+ $this->assertIsA($entity_row, 'stdClass');
+
+ // update existing object
+ $this->entity->title = 'testing';
+ $this->entity->description = 'ElggObject';
+ $this->assertEqual($this->entity->save(), $guid);
+
+ $object_row = $this->get_object_row($guid);
+ $this->assertIsA($object_row, 'stdClass');
+ $this->assertIdentical($object_row->title, 'testing');
+ $this->assertIdentical($object_row->description, 'ElggObject');
+
+ // clean up
+ $this->entity->delete();
+ }
+
+ public function testElggObjectLoad() {
+ // fail on wrong type
+ try {
+ $error = new ElggObjectTest(elgg_get_logged_in_user_guid());
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidClassException');
+ $message = sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), elgg_get_logged_in_user_guid(), 'ElggObject');
+ $this->assertIdentical($e->getMessage(), $message);
+ }
+ }
+
+ public function testElggObjectConstructorByGUID() {
+ $guid = $this->entity->save();
+
+ // load a new object using guid
+ $entity = new ElggObjectTest($guid);
+ $this->assertIdentical($this->entity, $entity);
+
+ // clean up
+ $this->entity->delete();
+ }
+
+ public function testElggObjectClone() {
+ $this->entity->title = 'testing';
+ $this->entity->description = 'ElggObject';
+ $this->entity->var1 = "test";
+ $this->entity->var2 = 1;
+ $this->entity->var3 = true;
+ $this->entity->save();
+
+ // add tag array
+ $tag_string = 'tag1, tag2, tag3';
+ $tagarray = string_to_tag_array($tag_string);
+ $this->entity->tags = $tagarray;
+
+ // a cloned ElggEntity has the guid reset
+ $object = clone $this->entity;
+ $this->assertIdentical(0, (int)$object->guid);
+
+ // make sure attributes were copied over
+ $this->assertIdentical($object->title, 'testing');
+ $this->assertIdentical($object->description, 'ElggObject');
+
+ $guid = $object->save();
+ $this->assertTrue($guid !== 0);
+ $this->assertTrue($guid !== $this->entity->guid);
+
+ // test that metadata was transfered
+ $this->assertIdentical($this->entity->var1, $object->var1);
+ $this->assertIdentical($this->entity->var2, $object->var2);
+ $this->assertIdentical($this->entity->var3, $object->var3);
+ $this->assertIdentical($this->entity->tags, $object->tags);
+
+ // clean up
+ $object->delete();
+ $this->entity->delete();
+ }
+
+ public function testElggObjectContainer() {
+ $this->assertEqual($this->entity->getContainerGUID(), elgg_get_logged_in_user_guid());
+
+ // create and save to group
+ $group = new ElggGroup();
+ $guid = $group->save();
+ $this->assertTrue($this->entity->setContainerGUID($guid));
+
+ // check container
+ $this->assertEqual($this->entity->getContainerGUID(), $guid);
+ $this->assertIdentical($group, $this->entity->getContainerEntity());
+
+ // clean up
+ $group->delete();
+ }
+
+ public function testElggObjectExportables() {
+ $exportables = array(
+ 'guid',
+ 'type',
+ 'subtype',
+ 'time_created',
+ 'time_updated',
+ 'container_guid',
+ 'owner_guid',
+ 'site_guid',
+ 'title',
+ 'description'
+ );
+
+ $this->assertIdentical($exportables, $this->entity->getExportableValues());
+ }
+
+ public function xtestElggObjectAccessOverrides() {
+ // set entity to private access with no owner.
+ $entity = $this->entity;
+ $entity->access_id = ACCESS_PRIVATE;
+ $entity->owner_guid = 0;
+ $this->assertTrue($entity->save());
+ $guid = $entity->getGUID();
+
+ var_dump($guid);
+ // try to grab entity
+ $entity = false;
+ $entity = get_entity($guid);
+ var_dump($entity);
+ $this->assertFalse($entity);
+
+ $old = elgg_set_ignore_access(true);
+ }
+
+ // see https://github.com/elgg/elgg/issues/1196
+ public function testElggEntityRecursiveDisableWhenLoggedOut() {
+ $e1 = new ElggObject();
+ $e1->access_id = ACCESS_PUBLIC;
+ $e1->owner_guid = 0;
+ $e1->container_guid = 0;
+ $e1->save();
+ $guid1 = $e1->getGUID();
+
+ $e2 = new ElggObject();
+ $e2->container_guid = $guid1;
+ $e2->access_id = ACCESS_PUBLIC;
+ $e2->owner_guid = 0;
+ $e2->save();
+ $guid2 = $e2->getGUID();
+
+ // fake being logged out
+ $user = $_SESSION['user'];
+ unset($_SESSION['user']);
+ $ia = elgg_set_ignore_access(true);
+
+ $this->assertTrue(disable_entity($guid1, null, true));
+
+ // "log in" original user
+ $_SESSION['user'] = $user;
+ elgg_set_ignore_access($ia);
+
+ $this->assertFalse(get_entity($guid1));
+ $this->assertFalse(get_entity($guid2));
+
+ $db_prefix = get_config('dbprefix');
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $guid1";
+ $r = get_data_row($q);
+ $this->assertEqual('no', $r->enabled);
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $guid2";
+ $r = get_data_row($q);
+ $this->assertEqual('no', $r->enabled);
+
+ access_show_hidden_entities(true);
+ delete_entity($guid1);
+ delete_entity($guid2);
+ access_show_hidden_entities(false);
+ }
+
+ public function testElggRecursiveDelete() {
+ $types = array('ElggGroup', 'ElggObject', 'ElggUser', 'ElggSite');
+ $db_prefix = elgg_get_config('dbprefix');
+
+ foreach ($types as $type) {
+ $parent = new $type();
+ $this->assertTrue($parent->save());
+
+ $child = new ElggObject();
+ $child->container_guid = $parent->guid;
+ $this->assertTrue($child->save());
+
+ $grandchild = new ElggObject();
+ $grandchild->container_guid = $child->guid;
+ $this->assertTrue($grandchild->save());
+
+ $this->assertTrue($parent->delete(true));
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $parent->guid";
+ $r = get_data($q);
+ $this->assertFalse($r);
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $child->guid";
+ $r = get_data($q);
+ $this->assertFalse($r);
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $grandchild->guid";
+ $r = get_data($q);
+ $this->assertFalse($r);
+ }
+
+ // object that owns itself
+ // can't check container_guid because of infinite loops in can_edit_entity()
+ $obj = new ElggObject();
+ $obj->save();
+ $obj->owner_guid = $obj->guid;
+ $obj->save();
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $obj->guid";
+ $r = get_data_row($q);
+ $this->assertEqual($obj->guid, $r->owner_guid);
+
+ $this->assertTrue($obj->delete(true));
+
+ $q = "SELECT * FROM {$db_prefix}entities WHERE guid = $obj->guid";
+ $r = get_data_row($q);
+ $this->assertFalse($r);
+ }
+
+ protected function get_object_row($guid) {
+ global $CONFIG;
+ return get_data_row("SELECT * FROM {$CONFIG->dbprefix}objects_entity WHERE guid='$guid'");
+ }
+
+ protected function get_entity_row($guid) {
+ global $CONFIG;
+ return get_data_row("SELECT * FROM {$CONFIG->dbprefix}entities WHERE guid='$guid'");
+ }
+}
+
+class ElggObjectTest extends ElggObject {
+ public function expose_attributes() {
+ return $this->attributes;
+ }
+}
diff --git a/engine/tests/objects/sites.php b/engine/tests/objects/sites.php
new file mode 100644
index 000000000..a01a661e3
--- /dev/null
+++ b/engine/tests/objects/sites.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Elgg Test ElggSite
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreSiteTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->site = new ElggSiteTest();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ $this->swallowErrors();
+ unset($this->site);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ parent::__destruct();
+ }
+
+ public function testElggSiteConstructor() {
+ $attributes = array();
+ $attributes['guid'] = NULL;
+ $attributes['type'] = 'site';
+ $attributes['subtype'] = NULL;
+ $attributes['owner_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['container_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['site_guid'] = NULL;
+ $attributes['access_id'] = ACCESS_PRIVATE;
+ $attributes['time_created'] = NULL;
+ $attributes['time_updated'] = NULL;
+ $attributes['last_action'] = NULL;
+ $attributes['enabled'] = 'yes';
+ $attributes['tables_split'] = 2;
+ $attributes['tables_loaded'] = 0;
+ $attributes['name'] = NULL;
+ $attributes['description'] = NULL;
+ $attributes['url'] = NULL;
+ ksort($attributes);
+
+ $entity_attributes = $this->site->expose_attributes();
+ ksort($entity_attributes);
+
+ $this->assertIdentical($entity_attributes, $attributes);
+ }
+
+ public function testElggSiteSaveAndDelete() {
+ $guid = $this->site->save();
+ $this->assertIsA($guid, 'int');
+ $this->assertTrue($guid > 0);
+ $this->assertIdentical(true, $this->site->delete());
+ }
+}
+
+class ElggSiteTest extends ElggSite {
+ public function expose_attributes() {
+ return $this->attributes;
+ }
+}
diff --git a/engine/tests/objects/users.php b/engine/tests/objects/users.php
new file mode 100644
index 000000000..8a1033ac4
--- /dev/null
+++ b/engine/tests/objects/users.php
@@ -0,0 +1,250 @@
+<?php
+/**
+ * Elgg Test ElggUser
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreUserTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ // all code should come after here
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+ $this->user = new ElggUserTest();
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+
+ unset($this->user);
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ // all code should go above here
+ parent::__destruct();
+ }
+
+ public function testElggUserConstructor() {
+ $attributes = array();
+ $attributes['guid'] = NULL;
+ $attributes['type'] = 'user';
+ $attributes['subtype'] = NULL;
+ $attributes['owner_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['container_guid'] = elgg_get_logged_in_user_guid();
+ $attributes['site_guid'] = NULL;
+ $attributes['access_id'] = ACCESS_PRIVATE;
+ $attributes['time_created'] = NULL;
+ $attributes['time_updated'] = NULL;
+ $attributes['last_action'] = NULL;
+ $attributes['enabled'] = 'yes';
+ $attributes['tables_split'] = 2;
+ $attributes['tables_loaded'] = 0;
+ $attributes['name'] = NULL;
+ $attributes['username'] = NULL;
+ $attributes['password'] = NULL;
+ $attributes['salt'] = NULL;
+ $attributes['email'] = NULL;
+ $attributes['language'] = NULL;
+ $attributes['code'] = NULL;
+ $attributes['banned'] = 'no';
+ $attributes['admin'] = 'no';
+ $attributes['prev_last_action'] = NULL;
+ $attributes['last_login'] = NULL;
+ $attributes['prev_last_login'] = NULL;
+ ksort($attributes);
+
+ $entity_attributes = $this->user->expose_attributes();
+ ksort($entity_attributes);
+
+ $this->assertIdentical($entity_attributes, $attributes);
+ }
+
+ public function testElggUserLoad() {
+ // new object
+ $object = new ElggObject();
+ $this->AssertEqual($object->getGUID(), 0);
+ $guid = $object->save();
+ $this->AssertNotEqual($guid, 0);
+
+ // fail on wrong type
+ try {
+ $error = new ElggUserTest($guid);
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidClassException');
+ $message = sprintf(elgg_echo('InvalidClassException:NotValidElggStar'), $guid, 'ElggUser');
+ $this->assertIdentical($e->getMessage(), $message);
+ }
+
+ // clean up
+ $object->delete();
+ }
+
+ public function testElggUserConstructorByGuid() {
+ $user = new ElggUser(elgg_get_logged_in_user_guid());
+ $this->assertIdentical($user, $_SESSION['user']);
+
+ // fail with garbage
+ try {
+ $error = new ElggUserTest(array('invalid'));
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $message = sprintf(elgg_echo('InvalidParameterException:UnrecognisedValue'));
+ $this->assertIdentical($e->getMessage(), $message);
+ }
+ }
+
+ public function testElggUserConstructorByDbRow() {
+ $row = $this->fetchUser(elgg_get_logged_in_user_guid());
+ $user = new ElggUser($row);
+ $this->assertIdentical($user, $_SESSION['user']);
+ }
+
+ public function testElggUserConstructorByUsername() {
+ $row = $this->fetchUser(elgg_get_logged_in_user_guid());
+ $user = new ElggUser($row->username);
+ $this->assertIdentical($user, $_SESSION['user']);
+ }
+
+ public function testElggUserSave() {
+ // new object
+ $this->AssertEqual($this->user->getGUID(), 0);
+ $guid = $this->user->save();
+ $this->AssertNotEqual($guid, 0);
+
+ // clean up
+ $this->user->delete();
+ }
+
+ public function testElggUserDelete() {
+ $guid = $this->user->save();
+
+ // delete object
+ $this->assertIdentical(true, $this->user->delete());
+
+ // check GUID not in database
+ $this->assertFalse($this->fetchUser($guid));
+ }
+
+ public function testElggUserNameCache() {
+ // issue https://github.com/elgg/elgg/issues/1305
+
+ // very unlikely a user would have this username
+ $name = (string)time();
+ $this->user->username = $name;
+
+ $guid = $this->user->save();
+
+ $user = get_user_by_username($name);
+ $user->delete();
+ $user = get_user_by_username($name);
+ $this->assertFalse($user);
+ }
+
+ public function testGetUserByUsernameAcceptsUrlEncoded() {
+ $username = (string)time();
+ $this->user->username = $username;
+ $guid = $this->user->save();
+
+ // percent encode first letter
+ $first_letter = $username[0];
+ $first_letter = str_pad('%' . dechex(ord($first_letter)), 2, '0', STR_PAD_LEFT);
+ $username = $first_letter . substr($username, 1);
+
+ $user = get_user_by_username($username);
+ $this->assertTrue((bool) $user);
+ $this->assertEqual($guid, $user->guid);
+
+ $this->user->delete();
+ }
+
+ public function testElggUserMakeAdmin() {
+ global $CONFIG;
+
+ // need to save user to have a guid
+ $guid = $this->user->save();
+
+ $this->assertTrue($this->user->makeAdmin());
+
+ $q = "SELECT admin FROM {$CONFIG->dbprefix}users_entity WHERE guid = $guid";
+ $r = mysql_query($q);
+
+ $admin = mysql_fetch_assoc($r);
+ $this->assertEqual($admin['admin'], 'yes');
+
+ $this->user->delete();
+ }
+
+ public function testElggUserRemoveAdmin() {
+ global $CONFIG;
+
+ // need to save user to have a guid
+ $guid = $this->user->save();
+
+ $this->assertTrue($this->user->removeAdmin());
+
+ $q = "SELECT admin FROM {$CONFIG->dbprefix}users_entity WHERE guid = $guid";
+ $r = mysql_query($q);
+
+ $admin = mysql_fetch_assoc($r);
+ $this->assertEqual($admin['admin'], 'no');
+
+ $this->user->delete();
+ }
+
+ public function testElggUserIsAdmin() {
+ // need to grab a real user with a guid and everything.
+ $guid = $this->user->save();
+
+ $this->assertTrue($this->user->makeAdmin());
+
+ // this is testing the function, not the SQL.
+ // that's been tested above.
+ $this->assertTrue($this->user->isAdmin());
+
+ $this->user->delete();
+ }
+
+ public function testElggUserIsNotAdmin() {
+ // need to grab a real user with a guid and everything.
+ $guid = $this->user->save();
+
+ $this->assertTrue($this->user->removeAdmin());
+
+ // this is testing the function, not the SQL.
+ // that's been tested above.
+ $this->assertFalse($this->user->isAdmin());
+
+ $this->user->delete();
+ }
+
+ protected function fetchUser($guid) {
+ global $CONFIG;
+
+ return get_data_row("SELECT * FROM {$CONFIG->dbprefix}users_entity WHERE guid = '$guid'");
+ }
+}
+
+class ElggUserTest extends ElggUser {
+ public function expose_attributes() {
+ return $this->attributes;
+ }
+}
diff --git a/engine/tests/regression/trac_bugs.php b/engine/tests/regression/trac_bugs.php
new file mode 100644
index 000000000..689275661
--- /dev/null
+++ b/engine/tests/regression/trac_bugs.php
@@ -0,0 +1,405 @@
+<?php
+/**
+ * Elgg Regression Tests -- GitHub Bugfixes
+ * Any bugfixes from GitHub that require testing belong here.
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreRegressionBugsTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ $this->ia = elgg_set_ignore_access(TRUE);
+ parent::__construct();
+
+ // all __construct() code should come after here
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ elgg_set_ignore_access($this->ia);
+ // all __destruct() code should go above here
+ parent::__destruct();
+ }
+
+ /**
+ * #1558
+ */
+ public function testElggObjectDeleteAnnotations() {
+ $this->entity = new ElggObject();
+ $guid = $this->entity->save();
+
+ $this->entity->annotate('test', 'hello', ACCESS_PUBLIC);
+
+ $this->entity->deleteAnnotations('does not exist');
+
+ $num = $this->entity->countAnnotations('test');
+
+ //$this->assertIdentical($num, 1);
+ $this->assertEqual($num, 1);
+
+ // clean up
+ $this->entity->delete();
+ }
+
+ /**
+ * #2063 - get_resized_image_from_existing_file() fails asked for image larger than selection and not scaling an image up
+ * Test get_image_resize_parameters().
+ */
+ public function testElggResizeImage() {
+ $orig_width = 100;
+ $orig_height = 150;
+
+ // test against selection > max
+ $options = array(
+ 'maxwidth' => 50,
+ 'maxheight' => 50,
+ 'square' => TRUE,
+ 'upscale' => FALSE,
+
+ 'x1' => 25,
+ 'y1' => 75,
+ 'x2' => 100,
+ 'y2' => 150
+ );
+
+ // should get back the same x/y offset == x1, y1 and an image of 50x50
+ $params = get_image_resize_parameters($orig_width, $orig_height, $options);
+
+ $this->assertEqual($params['newwidth'], $options['maxwidth']);
+ $this->assertEqual($params['newheight'], $options['maxheight']);
+ $this->assertEqual($params['xoffset'], $options['x1']);
+ $this->assertEqual($params['yoffset'], $options['y1']);
+
+ // test against selection < max
+ $options = array(
+ 'maxwidth' => 50,
+ 'maxheight' => 50,
+ 'square' => TRUE,
+ 'upscale' => FALSE,
+
+ 'x1' => 75,
+ 'y1' => 125,
+ 'x2' => 100,
+ 'y2' => 150
+ );
+
+ // should get back the same x/y offset == x1, y1 and an image of 25x25 because no upscale
+ $params = get_image_resize_parameters($orig_width, $orig_height, $options);
+
+ $this->assertEqual($params['newwidth'], 25);
+ $this->assertEqual($params['newheight'], 25);
+ $this->assertEqual($params['xoffset'], $options['x1']);
+ $this->assertEqual($params['yoffset'], $options['y1']);
+ }
+
+ // #3722 Check canEdit() works for contains regardless of groups
+ function test_can_write_to_container() {
+ $user = new ElggUser();
+ $user->username = 'test_user_' . rand();
+ $user->name = 'test_user_name_' . rand();
+ $user->email = 'test@user.net';
+ $user->container_guid = 0;
+ $user->owner_guid = 0;
+ $user->save();
+
+ $object = new ElggObject();
+ $object->save();
+
+ $group = new ElggGroup();
+ $group->save();
+
+ // disable access overrides because we're admin.
+ $ia = elgg_set_ignore_access(false);
+
+ $this->assertFalse(can_write_to_container($user->guid, $object->guid));
+
+ global $elgg_test_user;
+ $elgg_test_user = $user;
+
+ // register hook to allow access
+ function can_write_to_container_test_hook($hook, $type, $value, $params) {
+ global $elgg_test_user;
+
+ if ($params['user']->getGUID() == $elgg_test_user->getGUID()) {
+ return true;
+ }
+ }
+
+ elgg_register_plugin_hook_handler('container_permissions_check', 'all', 'can_write_to_container_test_hook');
+ $this->assertTrue(can_write_to_container($user->guid, $object->guid));
+ elgg_unregister_plugin_hook_handler('container_permissions_check', 'all', 'can_write_to_container_test_hook');
+
+ $this->assertFalse(can_write_to_container($user->guid, $group->guid));
+ $group->join($user);
+ $this->assertTrue(can_write_to_container($user->guid, $group->guid));
+
+ elgg_set_ignore_access($ia);
+
+ $user->delete();
+ $object->delete();
+ $group->delete();
+ }
+
+ function test_db_shutdown_links() {
+ global $DB_DELAYED_QUERIES, $test_results;
+ $DB_DELAYED_QUERIES = array();
+
+ function test_delayed_results($results) {
+ global $test_results;
+ $test_results = $results;
+ }
+
+ $q = 'SELECT 1 as test';
+
+ $links = array('read', 'write', get_db_link('read'), get_db_link('write'));
+
+ foreach ($links as $link) {
+ $DB_DELAYED_QUERIES = array();
+
+ $result = execute_delayed_query($q, $link, 'test_delayed_results');
+
+ $this->assertTrue($result, "Failed with link = $link");
+ $this->assertEqual(count($DB_DELAYED_QUERIES), 1);
+ $this->assertEqual($DB_DELAYED_QUERIES[0]['q'], $q);
+ $this->assertEqual($DB_DELAYED_QUERIES[0]['l'], $link);
+ $this->assertEqual($DB_DELAYED_QUERIES[0]['h'], 'test_delayed_results');
+
+ db_delayedexecution_shutdown_hook();
+
+ $num_rows = mysql_num_rows($test_results);
+ $this->assertEqual($num_rows, 1);
+ $row = mysql_fetch_assoc($test_results);
+ $this->assertEqual($row['test'], 1);
+ }
+
+ // test bad case
+ $DB_DELAYED_QUERIES = array();
+ $result = execute_delayed_query($q, 'not_a_link', 'test_delayed_results');
+ $this->assertFalse($result);
+ $this->assertEqual(array(), $DB_DELAYED_QUERIES);
+ }
+
+ /**
+ * https://github.com/elgg/elgg/issues/3210 - Don't remove -s in friendly titles
+ * https://github.com/elgg/elgg/issues/2276 - improve char encoding
+ */
+ public function test_friendly_title() {
+ $cases = array(
+ // acid test
+ "B&N > Amazon, OK? <bold> 'hey!' $34"
+ => "bn-amazon-ok-bold-hey-34",
+
+ // hyphen, underscore and ASCII whitespace replaced by separator,
+ // other non-alphanumeric ASCII removed
+ "a-a_a a\na\ra\ta\va!a\"a#a\$a%aa'a(a)a*a+a,a.a/a:a;a=a?a@a[a\\a]a^a`a{a|a}a~a"
+ => "a-a-a-a-a-a-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+
+ // separators trimmed
+ "-_ hello _-"
+ => "hello",
+
+ // accents removed, lower case, other multibyte chars are URL encoded
+ "I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n, AND \xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"
+ // Iñtërnâtiônàlizætiøn, AND 日本語
+ => 'internationalizaetion-and-%E6%97%A5%E6%9C%AC%E8%AA%9E',
+ );
+
+ // where available, string is converted to NFC before transliteration
+ if (ElggTranslit::hasNormalizerSupport()) {
+ $form_d = "A\xCC\x8A"; // A followed by 'COMBINING RING ABOVE' (U+030A)
+ $cases[$form_d] = "a";
+ }
+
+ foreach ($cases as $case => $expected) {
+ $friendly_title = elgg_get_friendly_title($case);
+ $this->assertIdentical($expected, $friendly_title);
+ }
+ }
+
+ /**
+ * Test #5369 -- parse_urls()
+ * https://github.com/Elgg/Elgg/issues/5369
+ */
+ public function test_parse_urls() {
+
+ $cases = array(
+ 'no.link.here' =>
+ 'no.link.here',
+ 'simple link http://example.org test' =>
+ 'simple link <a href="http://example.org" rel="nofollow">http:/<wbr />/<wbr />example.org</a> test',
+ 'non-ascii http://ñew.org/ test' =>
+ 'non-ascii <a href="http://ñew.org/" rel="nofollow">http:/<wbr />/<wbr />ñew.org/<wbr /></a> test',
+
+ // section 2.1
+ 'percent encoded http://example.org/a%20b test' =>
+ 'percent encoded <a href="http://example.org/a%20b" rel="nofollow">http:/<wbr />/<wbr />example.org/<wbr />a%20b</a> test',
+ // section 2.2: skipping single quote and parenthese
+ 'reserved characters http://example.org/:/?#[]@!$&*+,;= test' =>
+ 'reserved characters <a href="http://example.org/:/?#[]@!$&*+,;=" rel="nofollow">http:/<wbr />/<wbr />example.org/<wbr />:/<wbr />?#[]@!$&*+,;=</a> test',
+ // section 2.3
+ 'unreserved characters http://example.org/a1-._~ test' =>
+ 'unreserved characters <a href="http://example.org/a1-._~" rel="nofollow">http:/<wbr />/<wbr />example.org/<wbr />a1-._~</a> test',
+
+ 'parameters http://example.org/?val[]=1&val[]=2 test' =>
+ 'parameters <a href="http://example.org/?val[]=1&val[]=2" rel="nofollow">http:/<wbr />/<wbr />example.org/<wbr />?val[]=1&val[]=2</a> test',
+ 'port http://example.org:80/ test' =>
+ 'port <a href="http://example.org:80/" rel="nofollow">http:/<wbr />/<wbr />example.org:80/<wbr /></a> test',
+
+ 'parentheses (http://www.google.com) test' =>
+ 'parentheses (<a href="http://www.google.com" rel="nofollow">http:/<wbr />/<wbr />www.google.com</a>) test',
+ 'comma http://elgg.org, test' =>
+ 'comma <a href="http://elgg.org" rel="nofollow">http:/<wbr />/<wbr />elgg.org</a>, test',
+ 'period http://elgg.org. test' =>
+ 'period <a href="http://elgg.org" rel="nofollow">http:/<wbr />/<wbr />elgg.org</a>. test',
+ 'exclamation http://elgg.org! test' =>
+ 'exclamation <a href="http://elgg.org" rel="nofollow">http:/<wbr />/<wbr />elgg.org</a>! test',
+
+ 'already anchor <a href="http://twitter.com/">twitter</a> test' =>
+ 'already anchor <a href="http://twitter.com/">twitter</a> test',
+
+ 'ssl https://example.org/ test' =>
+ 'ssl <a href="https://example.org/" rel="nofollow">https:/<wbr />/<wbr />example.org/<wbr /></a> test',
+ 'ftp ftp://example.org/ test' =>
+ 'ftp <a href="ftp://example.org/" rel="nofollow">ftp:/<wbr />/<wbr />example.org/<wbr /></a> test',
+
+ 'web archive anchor <a href="http://web.archive.org/web/20000229040250/http://www.google.com/">google</a>' =>
+ 'web archive anchor <a href="http://web.archive.org/web/20000229040250/http://www.google.com/">google</a>',
+
+ 'single quotes already anchor <a href=\'http://www.yahoo.com\'>yahoo</a>' =>
+ 'single quotes already anchor <a href=\'http://www.yahoo.com\'>yahoo</a>',
+
+ 'unquoted already anchor <a href=http://www.yahoo.com>yahoo</a>' =>
+ 'unquoted already anchor <a href=http://www.yahoo.com>yahoo</a>',
+
+ 'parens in uri http://thedailywtf.com/Articles/A-(Long-Overdue)-BuildMaster-Introduction.aspx' =>
+ 'parens in uri <a href="http://thedailywtf.com/Articles/A-(Long-Overdue)-BuildMaster-Introduction.aspx" rel="nofollow">http:/<wbr />/<wbr />thedailywtf.com/<wbr />Articles/<wbr />A-(Long-Overdue)-BuildMaster-Introduction.aspx</a>'
+ );
+ foreach ($cases as $input => $output) {
+ $this->assertEqual($output, parse_urls($input));
+ }
+ }
+
+ /**
+ * Ensure additional select columns do not end up in entity attributes.
+ *
+ * https://github.com/Elgg/Elgg/issues/5538
+ */
+ public function test_extra_columns_dont_appear_in_attributes() {
+ global $ENTITY_CACHE;
+
+ // may not have groups in DB - let's create one
+ $group = new ElggGroup();
+ $group->name = 'test_group';
+ $group->access_id = ACCESS_PUBLIC;
+ $this->assertTrue($group->save() !== false);
+
+ // entity cache interferes with our test
+ $ENTITY_CACHE = array();
+
+ foreach (array('site', 'user', 'group', 'object') as $type) {
+ $entities = elgg_get_entities(array(
+ 'type' => $type,
+ 'selects' => array('1 as _nonexistent_test_column'),
+ 'limit' => 1,
+ ));
+ if (!$this->assertTrue($entities, "Query for '$type' did not return an entity.")) {
+ continue;
+ }
+ $entity = $entities[0];
+ $this->assertNull($entity->_nonexistent_test_column, "Additional select columns are leaking to attributes for '$type'");
+ }
+
+ $group->delete();
+ }
+
+ /**
+ * Ensure that ElggBatch doesn't go into infinite loop when disabling annotations recursively when show hidden is enabled.
+ *
+ * https://github.com/Elgg/Elgg/issues/5952
+ */
+ public function test_disabling_annotations_infinite_loop() {
+
+ //let's have some entity
+ $group = new ElggGroup();
+ $group->name = 'test_group';
+ $group->access_id = ACCESS_PUBLIC;
+ $this->assertTrue($group->save() !== false);
+
+ $total = 51;
+ //add some annotations
+ for ($cnt = 0; $cnt < $total; $cnt++) {
+ $group->annotate('test_annotation', 'value_' . $total);
+ }
+
+ //disable them
+ $show_hidden = access_get_show_hidden_status();
+ access_show_hidden_entities(true);
+ $options = array(
+ 'guid' => $group->guid,
+ 'limit' => $total, //using strict limit to avoid real infinite loop and just see ElggBatch limiting on it before finishing the work
+ );
+ elgg_disable_annotations($options);
+ access_show_hidden_entities($show_hidden);
+
+ //confirm all being disabled
+ $annotations = $group->getAnnotations(array(
+ 'limit' => $total,
+ ));
+ foreach ($annotations as $annotation) {
+ $this->assertTrue($annotation->enabled == 'no');
+ }
+
+ //delete group and annotations
+ $group->delete();
+ }
+
+ public function test_ElggXMLElement_does_not_load_external_entities() {
+ $elLast = libxml_disable_entity_loader(false);
+
+ // build payload that should trigger loading of external entity
+ $payload = file_get_contents(dirname(dirname(__FILE__)) . '/test_files/xxe/request.xml');
+ $path = realpath(dirname(dirname(__FILE__)) . '/test_files/xxe/external_entity.txt');
+ $path = str_replace('\\', '/', $path);
+ if ($path[0] != '/') {
+ $path = '/' . $path;
+ }
+ $path = 'file://' . $path;
+ $payload = sprintf($payload, $path);
+
+ // make sure we can actually this in this environment
+ $element = new SimpleXMLElement($payload);
+ $can_load_entity = preg_match('/secret/', (string)$element->methodName);
+
+ $this->skipUnless($can_load_entity, "XXE vulnerability cannot be tested on this system");
+
+ if ($can_load_entity) {
+ $el = new ElggXMLElement($payload);
+ $chidren = $el->getChildren();
+ $content = $chidren[0]->getContent();
+ $this->assertNoPattern('/secret/', $content);
+ }
+
+ libxml_disable_entity_loader($elLast);
+ }
+}
diff --git a/engine/tests/services/api.php b/engine/tests/services/api.php
new file mode 100644
index 000000000..3d07c0bbb
--- /dev/null
+++ b/engine/tests/services/api.php
@@ -0,0 +1,324 @@
+<?php
+/**
+ * Elgg Test Services - General API and REST
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreServicesApiTest extends ElggCoreUnitTest {
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ global $API_METHODS;
+ $this->swallowErrors();
+ $API_METHODS = array();
+ }
+
+// expose_function
+ public function testExposeFunctionNoMethod() {
+ try {
+ @expose_function();
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('InvalidParameterException:APIMethodOrFunctionNotSet'));
+ }
+ }
+
+ public function testExposeFunctionNoFunction() {
+ try {
+ @expose_function('test');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('InvalidParameterException:APIMethodOrFunctionNotSet'));
+ }
+ }
+
+ public function testExposeFunctionBadParameters() {
+ try {
+ @expose_function('test', 'test', 'BAD');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('InvalidParameterException:APIParametersArrayStructure'), 'test'));
+ }
+ }
+
+ public function testExposeFunctionParametersBadArray() {
+ try {
+ expose_function('test', 'test', array('param1' => 'string'));
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('InvalidParameterException:APIParametersArrayStructure'), 'test'));
+ }
+ }
+
+ public function testExposeFunctionBadHttpMethod() {
+ try {
+ @expose_function('test', 'test', null, '', 'BAD');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'InvalidParameterException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('InvalidParameterException:UnrecognisedHttpMethod'), 'BAD', 'test'));
+ }
+ }
+
+ public function testExposeFunctionSuccess() {
+ global $API_METHODS;
+ // this is a general test but also tests specifically for setting 'required' correctly
+ $parameters = array('param1' => array('type' => 'int', 'required' => true),
+ 'param2' => array('type' => 'bool'),
+ 'param3' => array('type' => 'string', 'required' => false), );
+
+ $this->assertTrue(expose_function('test', 'foo', $parameters));
+
+ $parameters = array('param1' => array('type' => 'int', 'required' => true),
+ 'param2' => array('type' => 'bool', 'required' => true),
+ 'param3' => array('type' => 'string', 'required' => false), );
+ $method['description'] = '';
+ $method['function'] = 'foo';
+ $method['parameters'] = $parameters;
+ $method['call_method'] = 'GET';
+ $method['require_api_auth'] = false;
+ $method['require_user_auth'] = false;
+
+ $this->assertIdentical($method, $API_METHODS['test']);
+ }
+
+// unexpose_function
+ public function testUnexposeFunction() {
+ global $API_METHODS;
+
+ $this->registerFunction();
+
+ unexpose_function('test');
+ $this->assertIdentical(array(), $API_METHODS);
+ }
+
+// authenticate_method
+ public function testAuthenticateMethodNotImplemented() {
+ try {
+ authenticate_method('BAD');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('APIException:MethodCallNotImplemented'), 'BAD'));
+ }
+ }
+
+ public function testAuthenticateMethodApiAuth() {
+ $this->registerFunction(true);
+ try {
+ authenticate_method('test');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('APIException:APIAuthenticationFailed'));
+ }
+ }
+
+ public function testAuthenticateMethodUserAuth() {
+ $this->registerFunction(false, true);
+ try {
+ authenticate_method('test');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ }
+ }
+
+ public function testAuthenticateMethod() {
+ $this->registerFunction(false, false);
+ // anonymous with no user authentication
+ $this->assertTrue(authenticate_method('test'));
+ }
+
+// execute_method
+ public function testExecuteMethodNotImplemented() {
+ try {
+ execute_method('BAD');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('APIException:MethodCallNotImplemented'), 'BAD'));
+ }
+ }
+
+ public function testExecuteMethodNonCallable() {
+ expose_function('test', 'foo');
+
+ try {
+ execute_method('test');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('APIException:FunctionDoesNotExist'), 'test'));
+ }
+ }
+
+ public function testExecuteMethodWrongMethod() {
+ $this->registerFunction();
+
+ try {
+ // GET when it should be a POST
+ execute_method('test');
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'CallException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('CallException:InvalidCallMethod'), 'test', 'POST'));
+ }
+ }
+
+// verify parameters
+ public function testVerifyParametersTypeNotSet() {
+ $params = array('param1' => array('required' => true));
+ expose_function('test', 'elgg_echo', $params);
+
+ try {
+ verify_parameters('test', array());
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('APIException:InvalidParameter'), 'param1', 'test'));
+ }
+ }
+
+ public function testVerifyParametersMissing() {
+ $params = array('param1' => array('type' => 'int', 'required' => true));
+ expose_function('test', 'elgg_echo', $params);
+
+ try {
+ verify_parameters('test', array());
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), sprintf(elgg_echo('APIException:MissingParameterInMethod'), 'param1', 'test'));
+ }
+ }
+
+ public function testVerifyParameters() {
+ $this->registerFunction();
+
+ $parameters = array('param1' => 0);
+ $this->assertTrue(verify_parameters('test', $parameters));
+ }
+
+ public function testSerialiseParameters() {
+
+ // int and bool
+ $this->registerFunction();
+ $parameters = array('param1' => 1, 'param2' => 0);
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ',1,false');
+
+ // string
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => 'testing');
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",'testing'");
+
+ // test string with " in it
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => 'test"ing');
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ',\'test"ing\'');
+
+ // test string with ' in it
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => 'test\'ing');
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",'test\'ing'");
+
+ // test string with \ in it
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => 'test\ing');
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",'test\\ing'");
+
+ // test string with \' in it
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => "test\'ing");
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",'test\\\\'ing'"); // test\\'ing
+
+ // test string reported by twall in #1364
+ $this->registerFunction(false, false, array('param1' => array('type' => 'string')));
+ $parameters = array('param1' => '{"html":"<div><img src=\\"http://foo.com\\"/>Blah Blah</div>"}');
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",'{\"html\":\"<div><img src=\\\"http://foo.com\\\"/>Blah Blah</div>\"}'");
+
+ // float
+ $this->registerFunction(false, false, array('param1' => array('type' => 'float')));
+ $parameters = array('param1' => 2.5);
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ',2.5');
+
+ // indexed array of strings
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));
+ $parameters = array('param1' => array('one', 'two'));
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",array('0'=>'one','1'=>'two')");
+
+ // associative array of strings
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));
+ $parameters = array('param1' => array('first' => 'one', 'second' => 'two'));
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",array('first'=>'one','second'=>'two')");
+
+ // indexed array of strings
+ $this->registerFunction(false, false, array('param1' => array('type' => 'array')));
+ $parameters = array('param1' => array(1, 2));
+ $s = serialise_parameters('test', $parameters);
+ $this->assertIdentical($s, ",array('0'=>'1','1'=>'2')");
+
+ // test unknown type
+ $this->registerFunction(false, false, array('param1' => array('type' => 'bad')));
+ $parameters = array('param1' => 'test');
+ $this->expectException('APIException');
+ $s = serialise_parameters('test', $parameters);
+ }
+
+// api key methods
+ //public function testApiAuthenticate() {
+ // $this->assertFalse(pam_authenticate(null, "api"));
+ //}
+
+ public function testApiAuthKeyNoKey() {
+ try {
+ api_auth_key();
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('APIException:MissingAPIKey'));
+ }
+ }
+
+ public function testApiAuthKeyBadKey() {
+ global $CONFIG;
+
+ $CONFIG->input['api_key'] = 'BAD';
+ try {
+ api_auth_key();
+ $this->assertTrue(FALSE);
+ } catch (Exception $e) {
+ $this->assertIsA($e, 'APIException');
+ $this->assertIdentical($e->getMessage(), elgg_echo('APIException:BadAPIKey'));
+ }
+ }
+
+ protected function registerFunction($api_auth = false, $user_auth = false, $params = null) {
+ $parameters = array('param1' => array('type' => 'int', 'required' => true),
+ 'param2' => array('type' => 'bool', 'required' => false), );
+
+ if ($params == null) {
+ $params = $parameters;
+ }
+
+ expose_function('test', 'elgg_echo', $params, '', 'POST', $api_auth, $user_auth);
+ }
+
+}
diff --git a/engine/tests/suite.php b/engine/tests/suite.php
new file mode 100644
index 000000000..4203bc5d6
--- /dev/null
+++ b/engine/tests/suite.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Runs unit tests.
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+
+
+require_once(dirname( __FILE__ ) . '/../start.php');
+
+admin_gatekeeper();
+
+$vendor_path = "$CONFIG->path/vendors/simpletest";
+$test_path = "$CONFIG->path/engine/tests";
+
+require_once("$vendor_path/unit_tester.php");
+require_once("$vendor_path/mock_objects.php");
+require_once("$vendor_path/reporter.php");
+require_once("$test_path/elgg_unit_test.php");
+
+// turn off system log
+elgg_unregister_event_handler('all', 'all', 'system_log_listener');
+elgg_unregister_event_handler('log', 'systemlog', 'system_log_default_logger');
+
+// Disable maximum execution time.
+// Tests take a while...
+set_time_limit(0);
+
+$suite = new TestSuite('Elgg Core Unit Tests');
+
+// emit a hook to pull in all tests
+$test_files = elgg_trigger_plugin_hook('unit_test', 'system', null, array());
+foreach ($test_files as $file) {
+ $suite->addTestFile($file);
+}
+
+// Only run tests in debug mode.
+if (!isset($CONFIG->debug)) {
+ exit ('The site must be in debug mode to run unit tests.');
+}
+
+if (TextReporter::inCli()) {
+ // In CLI error codes are returned: 0 is success
+ elgg_set_ignore_access(TRUE);
+ exit ($suite->Run(new TextReporter()) ? 0 : 1 );
+}
+
+// Ensure that only logged-in users can see this page
+//admin_gatekeeper();
+$old = elgg_set_ignore_access(TRUE);
+$suite->Run(new HtmlReporter('utf-8'));
+elgg_set_ignore_access($old);
diff --git a/engine/tests/test_files/output/autop/block-a.exp.norun.html b/engine/tests/test_files/output/autop/block-a.exp.norun.html
new file mode 100644
index 000000000..addf29dec
--- /dev/null
+++ b/engine/tests/test_files/output/autop/block-a.exp.norun.html
@@ -0,0 +1,6 @@
+
+<p>HTML5 allows A to contain block-level content</p>
+<a href="foo"><h3>A treated as block</h3>
+<p>Read more</p>
+</a>
+<p><a href="foo">A treated as<br /> inline</a></p>
diff --git a/engine/tests/test_files/output/autop/block-a.in.norun.html b/engine/tests/test_files/output/autop/block-a.in.norun.html
new file mode 100644
index 000000000..fc2dac43a
--- /dev/null
+++ b/engine/tests/test_files/output/autop/block-a.in.norun.html
@@ -0,0 +1,9 @@
+HTML5 allows A to contain block-level content
+<a href="foo">
+
+ <h3>A treated as block</h3>
+
+ Read more
+</a>
+<a href="foo">A treated as
+ inline</a>
diff --git a/engine/tests/test_files/output/autop/domdoc_exp.html b/engine/tests/test_files/output/autop/domdoc_exp.html
new file mode 100644
index 000000000..8480c1083
--- /dev/null
+++ b/engine/tests/test_files/output/autop/domdoc_exp.html
@@ -0,0 +1,46 @@
+›
+ 
+Vietnamese - Tiếng Việt
+
+<h1>h1</h1>
+<p>Paragraph <a href="http://google.com/">link</a> <strong>Bold</strong> <em>italic</em> <em><strong>bolditalic</strong></em> <span style="background-color: #ffff00; "></span></p>
+<h2>h2</h2>
+<p>Paragraph <span style="font-size: xx-small;">size1</span> <span style="font-size: x-small;">size2</span> <span style="font-size: medium;">size4</span></p>
+<h3>h3</h3>
+<p>Paragraph <span style="text-decoration: underline;">underline</span> <span style="text-decoration: line-through;">strikethrough</span> <span style="color: #ff0000;">color</span> <span style="background-color: #ffff00; ">background</span></p>
+<blockquote>
+ <p>Blockquoted paragraph</p>
+</blockquote>
+<p>Paragraph following blockquote</p>
+<ul><li>Unordered</li>
+ <li>List</li>
+</ul><p>Paragraph between lists</p>
+<ol><li>Ordered</li>
+ <li>List</li>
+</ol><p>Paragraph between lists</p>
+<ul><li>OL list</li>
+ <li>nested<ol><li>inside a</li>
+ <li>UL list</li>
+ </ol></li>
+</ul><p>Paragraph between lists</p>
+<table border="0"><tbody><tr><td>Table with</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>border=0</td>
+ </tr></tbody></table><p>Paragraph</p>
+<ol><li>UL list</li>
+ <li>nested
+ <ul><li>inside a</li>
+ <li>OL list</li>
+ </ul></li>
+</ol><p>Paragraph between tables</p>
+<table border="1" cellpadding="5"><tbody><tr><td>Table with border=1</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>cellpadding = 5</td>
+ </tr></tbody></table><p>Paragraph between tables</p>
+<table border="2"><tbody><tr><td>Table with</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>border=2</td>
+ </tr></tbody></table> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/domdoc_in.html b/engine/tests/test_files/output/autop/domdoc_in.html
new file mode 100644
index 000000000..4c465b435
--- /dev/null
+++ b/engine/tests/test_files/output/autop/domdoc_in.html
@@ -0,0 +1,80 @@
+&#8250;
+&nbsp;
+Vietnamese - Tiếng Việt
+
+<h1>h1</h1>
+<p>Paragraph <a href="http://google.com/">link</a> <strong>Bold</strong> <em>italic</em> <em><strong>bolditalic</strong></em>&nbsp;<span style="background-color: #ffff00; "></span></p>
+<h2>h2</h2>
+<p>Paragraph <span style="font-size: xx-small;">size1</span> <span style="font-size: x-small;">size2</span> <span style="font-size: medium;">size4</span></p>
+<h3>h3</h3>
+<p>Paragraph <span style="text-decoration: underline;">underline</span> <span style="text-decoration: line-through;">strikethrough</span> <span style="color: #ff0000;">color</span> <span style="background-color: #ffff00; ">background</span></p>
+<blockquote>
+ <p>Blockquoted paragraph</p>
+</blockquote>
+<p>Paragraph following blockquote</p>
+<ul>
+ <li>Unordered</li>
+ <li>List</li>
+</ul>
+<p>Paragraph between lists</p>
+<ol>
+ <li>Ordered</li>
+ <li>List</li>
+</ol>
+<p>Paragraph between lists</p>
+<ul>
+ <li>OL list</li>
+ <li>nested<ol>
+ <li>inside a</li>
+ <li>UL list</li>
+ </ol></li>
+</ul>
+<p>Paragraph between lists</p>
+<table border="0">
+ <tbody>
+ <tr>
+ <td>Table with</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>border=0</td>
+ </tr>
+ </tbody>
+</table>
+<p>Paragraph</p>
+<ol>
+ <li>UL list</li>
+ <li>nested
+ <ul>
+ <li>inside a</li>
+ <li>OL list</li>
+ </ul>
+ </li>
+</ol>
+<p>Paragraph between tables</p>
+<table border="1" cellpadding="5">
+ <tbody>
+ <tr>
+ <td>Table with border=1</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>cellpadding = 5</td>
+ </tr>
+ </tbody>
+</table>
+<p>Paragraph between tables</p>
+<table border="2">
+ <tbody>
+ <tr>
+ <td>Table with</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>border=2</td>
+ </tr>
+ </tbody>
+</table> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/typical-post.exp.html b/engine/tests/test_files/output/autop/typical-post.exp.html
new file mode 100644
index 000000000..f9d75a114
--- /dev/null
+++ b/engine/tests/test_files/output/autop/typical-post.exp.html
@@ -0,0 +1,84 @@
+<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
+<p><img class="alignright size-thumbnail wp-image-905" title="Surest Things mixing session in Adobe Audition" src="http://www.mrclay.org/wp-content/uploads/2010/09/surestThings_audition-150x150.png" alt="screenshot of Audition mixing session" width="150" height="150">Vivamus enim ante, <em>mattis eget imperdiet nec, pharetra vel velit.</em> Sed at euismod nibh. Praesent lacus tellus, <a href="http://google.com/">posuere et convallis</a> a, <strong>mollis et tellus. Suspendisse potenti</strong>. Phasellus tincidunt dignissim est eget mattis. Vestibulum lacinia <del>condimentum tellus, non vestibulum erat dapibus</del> quis. Aliquam arcu nibh, viverra adipiscing eleifend quis, pretium vitae ipsum.</p>
+
+<p>Curabitur turpis ante, <span style="color: #993300;">congue ac dapibus quis, vehicula ac orci.</span> Nunc luctus neque non massa porta sed pharetra ante accumsan. <a href="http://google.com/">Nam suscipit</a> risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor.</p>
+<h3>Donec at massa ante, sagittis fermentum urna.</h3><blockquote>
+<p>Mauris volutpat est id massa volutpat lacinia. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In in nisl mauris. In aliquet pretium nisl, vel convallis neque cursus vitae. Curabitur id mauris in urna gravida ornare.</p>
+
+<p>[caption id="attachment_719" align="alignleft" width="150" caption="Ibanez AGB140 Bass"]<img class="size-thumbnail wp-image-719" title="Ibanez AGB140 Bass" src="http://www.mrclay.org/wp-content/uploads/2010/04/agb140-e1271773766573-150x150.jpg" alt="Ibanez AGB140 Bass" width="150" height="150">[/caption]</p>
+
+<p>Aenean <a href="http://google.com/">aliquet cursus purus sed gravida. Cras auctor euismod justo, ac dictum purus facilisis dignissim.</a> Quisque facilisis porta sem, ac suscipit quam molestie nec. Pellentesque quis hendrerit enim. Vivamus tempor erat diam. Sed eu felis nunc. Cras posuere lorem commodo turpis mollis sagittis. Mauris lobortis nunc felis.</p>
+
+<p>Maecenas elit lorem, varius sed condimentum ac, cursus et magna. Nam ut massa id augue consectetur porttitor eleifend in nunc. Curabitur cursus varius dictum. Vestibulum vel justo et neque tempus placerat a vel sapien.</p>
+</blockquote>
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus enim ante, mattis eget imperdiet nec, <a href="http://google.com/">pharetra </a>vel velit. Sed at euismod nibh. Praesent lacus tellus, posuere et convallis a, mollis et tellus.</p>
+<pre><code>&lt;?php
+class DataTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider provider
+ */
+ public function testAdd($a, $b, $c)
+ {
+ $this-&gt;assertEquals($c, $a + $b);
+ }
+
+ public function provider()
+ {
+ return array(
+ array(0, 0, 0),
+ array(0, 1, 1),
+ array(1, 0, 1),
+ array(1, 1, 3)
+ );
+ }
+}</code></pre><ul><li>Suspendisse potenti. Phasellus tincidunt dignissim est eget mattis.</li>
+ <li>Vestibulum lacinia condimentum tellus, non vestibulum erat dapibus quis.</li>
+ <li>Aliquam arcu nibh, <a href="http://google.com/">viverra</a> adipiscing eleifend quis, pretium vitae ipsum.</li>
+ <li>Curabitur turpis ante, congue ac <a href="http://google.com/">dapibus quis</a>, vehicula ac orci.</li>
+</ul>
+<p>Nunc luctus neque non massa porta sed pharetra ante accumsan. Nam suscipit risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor. Donec at massa ante, sagittis fermentum urna.</p>
+
+<p><object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed type="application/x-shockwave-flash" width="480" height="390" src="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
+<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
+<p><img class="alignright size-thumbnail wp-image-905" title="Surest Things mixing session in Adobe Audition" src="http://www.mrclay.org/wp-content/uploads/2010/09/surestThings_audition-150x150.png" alt="screenshot of Audition mixing session" width="150" height="150">Vivamus enim ante, <em>mattis eget imperdiet nec, pharetra vel velit.</em> Sed at euismod nibh. Praesent lacus tellus, <a href="http://google.com/">posuere et convallis</a> a, <strong>mollis et tellus. Suspendisse potenti</strong>. Phasellus tincidunt dignissim est eget mattis. Vestibulum lacinia <del>condimentum tellus, non vestibulum erat dapibus</del> quis. Aliquam arcu nibh, viverra adipiscing eleifend quis, pretium vitae ipsum.</p>
+
+<p>Curabitur turpis ante, <span style="color: #993300;">congue ac dapibus quis, vehicula ac orci.</span> Nunc luctus neque non massa porta sed pharetra ante accumsan. <a href="http://google.com/">Nam suscipit</a> risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor.</p>
+<h3>Donec at massa ante, sagittis fermentum urna.</h3><blockquote>
+<p>Mauris volutpat est id massa volutpat lacinia. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In in nisl mauris. In aliquet pretium nisl, vel convallis neque cursus vitae. Curabitur id mauris in urna gravida ornare.</p>
+
+<p>[caption id="attachment_719" align="alignleft" width="150" caption="Ibanez AGB140 Bass"]<img class="size-thumbnail wp-image-719" title="Ibanez AGB140 Bass" src="http://www.mrclay.org/wp-content/uploads/2010/04/agb140-e1271773766573-150x150.jpg" alt="Ibanez AGB140 Bass" width="150" height="150">[/caption]</p>
+
+<p>Aenean <a href="http://google.com/">aliquet cursus purus sed gravida. Cras auctor euismod justo, ac dictum purus facilisis dignissim.</a> Quisque facilisis porta sem, ac suscipit quam molestie nec. Pellentesque quis hendrerit enim. Vivamus tempor erat diam. Sed eu felis nunc. Cras posuere lorem commodo turpis mollis sagittis. Mauris lobortis nunc felis.</p>
+
+<p>Maecenas elit lorem, varius sed condimentum ac, cursus et magna. Nam ut massa id augue consectetur porttitor eleifend in nunc. Curabitur cursus varius dictum. Vestibulum vel justo et neque tempus placerat a vel sapien.</p>
+</blockquote>
+<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus enim ante, mattis eget imperdiet nec, <a href="http://google.com/">pharetra </a>vel velit. Sed at euismod nibh. Praesent lacus tellus, posuere et convallis a, mollis et tellus.</p>
+<pre><code>&lt;?php
+class DataTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider provider
+ */
+ public function testAdd($a, $b, $c)
+ {
+ $this-&gt;assertEquals($c, $a + $b);
+ }
+
+ public function provider()
+ {
+ return array(
+ array(0, 0, 0),
+ array(0, 1, 1),
+ array(1, 0, 1),
+ array(1, 1, 3)
+ );
+ }
+}</code></pre><ul><li>Suspendisse potenti. Phasellus tincidunt dignissim est eget mattis.</li>
+ <li>Vestibulum lacinia condimentum tellus, non vestibulum erat dapibus quis.</li>
+ <li>Aliquam arcu nibh, <a href="http://google.com/">viverra</a> adipiscing eleifend quis, pretium vitae ipsum.</li>
+ <li>Curabitur turpis ante, congue ac <a href="http://google.com/">dapibus quis</a>, vehicula ac orci.</li>
+</ul>
+<p>Nunc luctus neque non massa porta sed pharetra ante accumsan. Nam suscipit risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor. Donec at massa ante, sagittis fermentum urna.</p>
+
+<p><object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed type="application/x-shockwave-flash" width="480" height="390" src="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
diff --git a/engine/tests/test_files/output/autop/typical-post.in.html b/engine/tests/test_files/output/autop/typical-post.in.html
new file mode 100644
index 000000000..6e4984cc4
--- /dev/null
+++ b/engine/tests/test_files/output/autop/typical-post.in.html
@@ -0,0 +1,89 @@
+<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
+<img class="alignright size-thumbnail wp-image-905" title="Surest Things mixing session in Adobe Audition" src="http://www.mrclay.org/wp-content/uploads/2010/09/surestThings_audition-150x150.png" alt="screenshot of Audition mixing session" width="150" height="150" />Vivamus enim ante, <em>mattis eget imperdiet nec, pharetra vel velit.</em> Sed at euismod nibh. Praesent lacus tellus, <a href="http://google.com/">posuere et convallis</a> a, <strong>mollis et tellus. Suspendisse potenti</strong>. Phasellus tincidunt dignissim est eget mattis. Vestibulum lacinia <del>condimentum tellus, non vestibulum erat dapibus</del> quis. Aliquam arcu nibh, viverra adipiscing eleifend quis, pretium vitae ipsum.
+
+Curabitur turpis ante, <span style="color: #993300;">congue ac dapibus quis, vehicula ac orci.</span> Nunc luctus neque non massa porta sed pharetra ante accumsan. <a href="http://google.com/">Nam suscipit</a> risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor.
+<h3>Donec at massa ante, sagittis fermentum urna.</h3>
+<blockquote>Mauris volutpat est id massa volutpat lacinia. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In in nisl mauris. In aliquet pretium nisl, vel convallis neque cursus vitae. Curabitur id mauris in urna gravida ornare.
+
+[caption id="attachment_719" align="alignleft" width="150" caption="Ibanez AGB140 Bass"]<img class="size-thumbnail wp-image-719" title="Ibanez AGB140 Bass" src="http://www.mrclay.org/wp-content/uploads/2010/04/agb140-e1271773766573-150x150.jpg" alt="Ibanez AGB140 Bass" width="150" height="150" />[/caption]
+
+Aenean <a href="http://google.com/">aliquet cursus purus sed gravida. Cras auctor euismod justo, ac dictum purus facilisis dignissim.</a> Quisque facilisis porta sem, ac suscipit quam molestie nec. Pellentesque quis hendrerit enim. Vivamus tempor erat diam. Sed eu felis nunc. Cras posuere lorem commodo turpis mollis sagittis. Mauris lobortis nunc felis.
+
+Maecenas elit lorem, varius sed condimentum ac, cursus et magna. Nam ut massa id augue consectetur porttitor eleifend in nunc. Curabitur cursus varius dictum. Vestibulum vel justo et neque tempus placerat a vel sapien.</blockquote>
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus enim ante, mattis eget imperdiet nec, <a href="http://google.com/">pharetra </a>vel velit. Sed at euismod nibh. Praesent lacus tellus, posuere et convallis a, mollis et tellus.
+
+<pre><code>&lt;?php
+class DataTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider provider
+ */
+ public function testAdd($a, $b, $c)
+ {
+ $this-&gt;assertEquals($c, $a + $b);
+ }
+
+ public function provider()
+ {
+ return array(
+ array(0, 0, 0),
+ array(0, 1, 1),
+ array(1, 0, 1),
+ array(1, 1, 3)
+ );
+ }
+}</code></pre>
+<ul>
+ <li>Suspendisse potenti. Phasellus tincidunt dignissim est eget mattis.</li>
+ <li>Vestibulum lacinia condimentum tellus, non vestibulum erat dapibus quis.</li>
+ <li>Aliquam arcu nibh, <a href="http://google.com/">viverra</a> adipiscing eleifend quis, pretium vitae ipsum.</li>
+ <li>Curabitur turpis ante, congue ac <a href="http://google.com/">dapibus quis</a>, vehicula ac orci.</li>
+</ul>
+Nunc luctus neque non massa porta sed pharetra ante accumsan. Nam suscipit risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor. Donec at massa ante, sagittis fermentum urna.
+
+<object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="480" height="390" src="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object>
+
+<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
+<img class="alignright size-thumbnail wp-image-905" title="Surest Things mixing session in Adobe Audition" src="http://www.mrclay.org/wp-content/uploads/2010/09/surestThings_audition-150x150.png" alt="screenshot of Audition mixing session" width="150" height="150" />Vivamus enim ante, <em>mattis eget imperdiet nec, pharetra vel velit.</em> Sed at euismod nibh. Praesent lacus tellus, <a href="http://google.com/">posuere et convallis</a> a, <strong>mollis et tellus. Suspendisse potenti</strong>. Phasellus tincidunt dignissim est eget mattis. Vestibulum lacinia <del>condimentum tellus, non vestibulum erat dapibus</del> quis. Aliquam arcu nibh, viverra adipiscing eleifend quis, pretium vitae ipsum.
+
+Curabitur turpis ante, <span style="color: #993300;">congue ac dapibus quis, vehicula ac orci.</span> Nunc luctus neque non massa porta sed pharetra ante accumsan. <a href="http://google.com/">Nam suscipit</a> risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor.
+<h3>Donec at massa ante, sagittis fermentum urna.</h3>
+<blockquote>Mauris volutpat est id massa volutpat lacinia. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In in nisl mauris. In aliquet pretium nisl, vel convallis neque cursus vitae. Curabitur id mauris in urna gravida ornare.
+
+[caption id="attachment_719" align="alignleft" width="150" caption="Ibanez AGB140 Bass"]<img class="size-thumbnail wp-image-719" title="Ibanez AGB140 Bass" src="http://www.mrclay.org/wp-content/uploads/2010/04/agb140-e1271773766573-150x150.jpg" alt="Ibanez AGB140 Bass" width="150" height="150" />[/caption]
+
+Aenean <a href="http://google.com/">aliquet cursus purus sed gravida. Cras auctor euismod justo, ac dictum purus facilisis dignissim.</a> Quisque facilisis porta sem, ac suscipit quam molestie nec. Pellentesque quis hendrerit enim. Vivamus tempor erat diam. Sed eu felis nunc. Cras posuere lorem commodo turpis mollis sagittis. Mauris lobortis nunc felis.
+
+Maecenas elit lorem, varius sed condimentum ac, cursus et magna. Nam ut massa id augue consectetur porttitor eleifend in nunc. Curabitur cursus varius dictum. Vestibulum vel justo et neque tempus placerat a vel sapien.</blockquote>
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus enim ante, mattis eget imperdiet nec, <a href="http://google.com/">pharetra </a>vel velit. Sed at euismod nibh. Praesent lacus tellus, posuere et convallis a, mollis et tellus.
+
+<pre><code>&lt;?php
+class DataTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider provider
+ */
+ public function testAdd($a, $b, $c)
+ {
+ $this-&gt;assertEquals($c, $a + $b);
+ }
+
+ public function provider()
+ {
+ return array(
+ array(0, 0, 0),
+ array(0, 1, 1),
+ array(1, 0, 1),
+ array(1, 1, 3)
+ );
+ }
+}</code></pre>
+<ul>
+ <li>Suspendisse potenti. Phasellus tincidunt dignissim est eget mattis.</li>
+ <li>Vestibulum lacinia condimentum tellus, non vestibulum erat dapibus quis.</li>
+ <li>Aliquam arcu nibh, <a href="http://google.com/">viverra</a> adipiscing eleifend quis, pretium vitae ipsum.</li>
+ <li>Curabitur turpis ante, congue ac <a href="http://google.com/">dapibus quis</a>, vehicula ac orci.</li>
+</ul>
+Nunc luctus neque non massa porta sed pharetra ante accumsan. Nam suscipit risus quis libero convallis viverra. Ut at arcu enim, vel pharetra dolor. Donec at massa ante, sagittis fermentum urna.
+
+<object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed type="application/x-shockwave-flash" width="480" height="390" src="http://www.youtube.com/v/zW9YOMaVTFI?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/wp-welcome.exp.html b/engine/tests/test_files/output/autop/wp-welcome.exp.html
new file mode 100644
index 000000000..2f612e3dd
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wp-welcome.exp.html
@@ -0,0 +1,22 @@
+
+<p>Welcome to WordPress! This post contains important information. After you read it, you can make it private to hide it from visitors but still have the information handy for future reference.</p>
+
+<p>First things first:</p>
+<ul><li><a href="%1%24s" title="Subscribe to the WordPress mailing list for Release Notifications">Subscribe to the WordPress mailing list for release notifications</a></li>
+</ul>
+<p>As a subscriber, you will receive an email every time an update is available (and only then). This will make it easier to keep your site up to date, and secure from evildoers.<br />When a new version is released, <a href="%2%24s" title="If you are already logged in, this will take you directly to the Dashboard">log in to the Dashboard</a> and follow the instructions.<br />Upgrading is a couple of clicks!</p>
+
+<p>Then you can start enjoying the WordPress experience:</p>
+<ul><li>Edit your personal information at <a href="%3%24s" title="Edit settings like your password, your display name and your contact information">Users &#8250; Your Profile</a></li>
+ <li>Start publishing at <a href="%4%24s" title="Create a new post">Posts &#8250; Add New</a> and at <a href="%5%24s" title="Create a new page">Pages &#8250; Add New</a></li>
+ <li>Browse and install plugins at <a href="%6%24s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add New</a></li>
+ <li>Browse and install themes at <a href="%7%24s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add New Themes</a></li>
+ <li>Modify and prettify your website&#8217;s links at <a href="%8%24s" title="For example, select a link structure like: http://example.com/1999/12/post-name">Settings &#8250; Permalinks</a></li>
+ <li>Import content from another system or WordPress site at <a href="%9%24s" title="WordPress comes with importers for the most common publishing systems">Tools &#8250; Import</a></li>
+ <li>Find answers to your questions at the <a href="%10%24s" title="The official WordPress documentation, maintained by the WordPress community">WordPress Codex</a></li>
+</ul>
+<p>To keep this post for reference, <a href="%11%24s" title="Click to edit the content and settings of this post">click to edit it</a>, go to the Publish box and change its Visibility from Public to Private.</p>
+
+<p>Thank you for selecting WordPress. We wish you happy publishing!</p>
+
+<p>PS. Not yet subscribed for update notifications? <a href="%1%24s" title="Subscribe to the WordPress mailing list for Release Notifications">Do it now!</a></p>
diff --git a/engine/tests/test_files/output/autop/wp-welcome.in.html b/engine/tests/test_files/output/autop/wp-welcome.in.html
new file mode 100644
index 000000000..338ede73f
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wp-welcome.in.html
@@ -0,0 +1,25 @@
+Welcome to WordPress! This post contains important information. After you read it, you can make it private to hide it from visitors but still have the information handy for future reference.
+
+First things first:
+<ul>
+ <li><a href="%1$s" title="Subscribe to the WordPress mailing list for Release Notifications">Subscribe to the WordPress mailing list for release notifications</a></li>
+</ul>
+As a subscriber, you will receive an email every time an update is available (and only then). This will make it easier to keep your site up to date, and secure from evildoers.
+When a new version is released, <a href="%2$s" title="If you are already logged in, this will take you directly to the Dashboard">log in to the Dashboard</a> and follow the instructions.
+Upgrading is a couple of clicks!
+
+Then you can start enjoying the WordPress experience:
+<ul>
+ <li>Edit your personal information at <a href="%3$s" title="Edit settings like your password, your display name and your contact information">Users &#8250; Your Profile</a></li>
+ <li>Start publishing at <a href="%4$s" title="Create a new post">Posts &#8250; Add New</a> and at <a href="%5$s" title="Create a new page">Pages &#8250; Add New</a></li>
+ <li>Browse and install plugins at <a href="%6$s" title="Browse and install plugins at the official WordPress repository directly from your Dashboard">Plugins &#8250; Add New</a></li>
+ <li>Browse and install themes at <a href="%7$s" title="Browse and install themes at the official WordPress repository directly from your Dashboard">Appearance &#8250; Add New Themes</a></li>
+ <li>Modify and prettify your website&#8217;s links at <a href="%8$s" title="For example, select a link structure like: http://example.com/1999/12/post-name">Settings &#8250; Permalinks</a></li>
+ <li>Import content from another system or WordPress site at <a href="%9$s" title="WordPress comes with importers for the most common publishing systems">Tools &#8250; Import</a></li>
+ <li>Find answers to your questions at the <a href="%10$s" title="The official WordPress documentation, maintained by the WordPress community">WordPress Codex</a></li>
+</ul>
+To keep this post for reference, <a href="%11$s" title="Click to edit the content and settings of this post">click to edit it</a>, go to the Publish box and change its Visibility from Public to Private.
+
+Thank you for selecting WordPress. We wish you happy publishing!
+
+PS. Not yet subscribed for update notifications? <a href="%1$s" title="Subscribe to the WordPress mailing list for Release Notifications">Do it now!</a>
diff --git a/engine/tests/test_files/output/autop/wpautop-fails.exp.html b/engine/tests/test_files/output/autop/wpautop-fails.exp.html
new file mode 100644
index 000000000..d018db4ff
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wpautop-fails.exp.html
@@ -0,0 +1,31 @@
+
+<p>paragraph</p>
+
+<p>paragraph</p>
+<div class="whatever"><blockquote>
+<p>paragraph</p>
+</blockquote>
+<p>line</p>
+</div>
+<p>paragraph</p>
+<ul><li>line</li>
+<li>paragraph
+
+paragraph</li>
+</ul>
+<p>paragraph<br />line<br />line</p>
+<pre>Honor
+this whitespace
+</pre>
+<p>paragraph</p>
+<style><!--
+Do not alter!
+--></style>
+<p>paragraph <!-- do not alter --></p>
+<dl><dt>term</dt> <dd>paragraph
+
+<a href="xx"> <img src="yy"></a>
+
+paragraph</dd> </dl><div><a href="xx"> <img src="yy"></a></div>
+<p>Hello <a href="link"><br /><br />World</a></p>
+<p id="abc">Paragraph</p><div>Line</div> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/wpautop-fails.in.html b/engine/tests/test_files/output/autop/wpautop-fails.in.html
new file mode 100644
index 000000000..9aa24be59
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wpautop-fails.in.html
@@ -0,0 +1,41 @@
+
+paragraph
+
+paragraph <div class="whatever"><blockquote>
+ paragraph
+ </blockquote>
+ line
+</div>
+
+paragraph
+<ul>
+<li>line</li>
+<li>paragraph
+
+paragraph</li>
+</ul>
+paragraph
+line<br>
+ line
+<pre>Honor
+this whitespace
+</pre>
+paragraph
+<style><!--
+Do not alter!
+--></style>
+paragraph <!-- do not alter -->
+<dl> <dt>term</dt> <dd>paragraph
+
+<a href="xx"> <img src="yy" /> </a>
+
+paragraph</dd> </dl>
+<div><a href="xx"> <img src="yy" /> </a></div>
+
+Hello <a href="link">
+
+World</a>
+
+<p id="abc">Paragraph</p>
+
+<div>Line</div> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/wysiwyg-test.exp.html b/engine/tests/test_files/output/autop/wysiwyg-test.exp.html
new file mode 100644
index 000000000..1f23d6154
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wysiwyg-test.exp.html
@@ -0,0 +1,51 @@
+
+<p>&nbps;<br />&#8820;</p>
+<h1>h1</h1>
+<p>Paragraph <a href="http://google.com/">link</a> <strong>Bold</strong> <em>italic</em> <em><strong>bolditalic</strong></em>&nbsp;<span style="background-color: #ffff00; "></span></p>
+<h2>h2</h2>
+<p>Paragraph <span style="font-size: xx-small;">size1</span> <span style="font-size: x-small;">size2</span> <span style="font-size: medium;">size4</span></p>
+<h3>h3</h3>
+<p>Paragraph <span style="text-decoration: underline;">underline</span> <span style="text-decoration: line-through;">strikethrough</span> <span style="color: #ff0000;">color</span> <span style="background-color: #ffff00; ">background</span></p>
+<blockquote>
+<p>Blockquoted paragraph</p>
+</blockquote>
+<p>Paragraph following blockquote</p>
+<ul><li>Unordered</li>
+ <li>List</li>
+</ul>
+<p>Paragraph between lists</p>
+<ol><li>Ordered</li>
+ <li>List</li>
+</ol>
+<p>Paragraph between lists</p>
+<ul><li>OL list</li>
+ <li>nested
+ <ol><li>inside a</li>
+ <li>UL list</li>
+ </ol></li>
+</ul>
+<p>Paragraph between lists</p>
+<table border="0"><tbody><tr></tr><tr><td>Table with</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>border=0</td>
+ </tr></tbody></table>
+<p>Paragraph</p>
+<ol><li>UL list</li>
+ <li>nested
+ <ul><li>inside a</li>
+ <li>OL list</li>
+ </ul></li>
+</ol>
+<p>Paragraph between tables</p>
+<table border="1" cellpadding="5"><tbody><tr><td>Table with border=1</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>cellpadding = 5</td>
+ </tr></tbody></table>
+<p>Paragraph between tables</p>
+<table border="2"><tbody><tr><td>Table with</td>
+ <td></td>
+ </tr><tr><td></td>
+ <td>border=2</td>
+ </tr></tbody></table> \ No newline at end of file
diff --git a/engine/tests/test_files/output/autop/wysiwyg-test.in.html b/engine/tests/test_files/output/autop/wysiwyg-test.in.html
new file mode 100644
index 000000000..733b0e2ec
--- /dev/null
+++ b/engine/tests/test_files/output/autop/wysiwyg-test.in.html
@@ -0,0 +1,79 @@
+&nbps;
+&#8820;
+<h1>h1</h1>
+Paragraph <a href="http://google.com/">link</a> <strong>Bold</strong> <em>italic</em> <em><strong>bolditalic</strong></em>&nbsp;<span style="background-color: #ffff00; "></span>
+<h2>h2</h2>
+Paragraph <span style="font-size: xx-small;">size1</span> <span style="font-size: x-small;">size2</span> <span style="font-size: medium;">size4</span>
+<h3>h3</h3>
+Paragraph <span style="text-decoration: underline;">underline</span> <span style="text-decoration: line-through;">strikethrough</span> <span style="color: #ff0000;">color</span> <span style="background-color: #ffff00; ">background</span>
+<blockquote>Blockquoted paragraph</blockquote>
+Paragraph following blockquote
+<ul>
+ <li>Unordered</li>
+ <li>List</li>
+</ul>
+Paragraph between lists
+<ol>
+ <li>Ordered</li>
+ <li>List</li>
+</ol>
+Paragraph between lists
+<ul>
+ <li>OL list</li>
+ <li>nested
+ <ol>
+ <li>inside a</li>
+ <li>UL list</li>
+ </ol></li>
+</ul>
+Paragraph between lists
+<table border="0">
+ <tbody>
+ <tr>
+ </tr>
+ <tr>
+ <td>Table with</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>border=0</td>
+ </tr>
+ </tbody>
+</table>
+Paragraph
+<ol>
+ <li>UL list</li>
+ <li>nested
+ <ul>
+ <li>inside a</li>
+ <li>OL list</li>
+ </ul>
+ </li>
+</ol>
+Paragraph between tables
+<table border="1" cellpadding="5">
+ <tbody>
+ <tr>
+ <td>Table with border=1</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>cellpadding = 5</td>
+ </tr>
+ </tbody>
+</table>
+Paragraph between tables
+<table border="2">
+ <tbody>
+ <tr>
+ <td>Table with</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>border=2</td>
+ </tr>
+ </tbody>
+</table> \ No newline at end of file
diff --git a/engine/tests/test_files/plugin_17/manifest.xml b/engine/tests/test_files/plugin_17/manifest.xml
new file mode 100644
index 000000000..706734265
--- /dev/null
+++ b/engine/tests/test_files/plugin_17/manifest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest>
+ <field key="author" value="Anyone" />
+ <field key="version" value="1.0" />
+ <field key="description" value="A 1.7-style manifest." />
+ <field key="website" value="http://www.elgg.org/" />
+ <field key="copyright" value="(C) Elgg Foundation 2011" />
+ <field key="license" value="GNU General Public License version 2" />
+ <field key="elgg_version" value="2009030702" />
+</plugin_manifest> \ No newline at end of file
diff --git a/engine/tests/test_files/plugin_17/start.php b/engine/tests/test_files/plugin_17/start.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/engine/tests/test_files/plugin_17/start.php
diff --git a/engine/tests/test_files/plugin_18/manifest.xml b/engine/tests/test_files/plugin_18/manifest.xml
new file mode 100644
index 000000000..c8b407511
--- /dev/null
+++ b/engine/tests/test_files/plugin_18/manifest.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Test Manifest</name>
+ <author>Anyone</author>
+ <version>1.0</version>
+ <blurb>A concise description.</blurb>
+ <description>A longer, more interesting description.</description>
+ <website>http://www.elgg.org/</website>
+ <repository>https://github.com/Elgg/Elgg</repository>
+ <bugtracker>https://github.com/elgg/elgg/issues</bugtracker>
+ <donations>http://elgg.org/supporter.php</donations>
+ <copyright>(C) Elgg Foundation 2011</copyright>
+ <license>GNU General Public License version 2</license>
+
+ <requires>
+ <type>elgg_version</type>
+ <version>3009030802</version>
+ <comparison>lt</comparison>
+ </requires>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8-svn</version>
+ </requires>
+
+ <screenshot>
+ <description>Fun things to do 1</description>
+ <path>graphics/plugin_ss1.png</path>
+ </screenshot>
+
+ <screenshot>
+ <description>Fun things to do 2</description>
+ <path>graphics/plugin_ss2.png</path>
+ </screenshot>
+
+ <category>Admin</category>
+
+ <category>ServiceAPI</category>
+
+ <requires>
+ <type>php_extension</type>
+ <name>gd</name>
+ </requires>
+
+ <requires>
+ <type>php_ini</type>
+ <name>short_open_tag</name>
+ <value>off</value>
+ </requires>
+
+ <requires>
+ <type>php_extension</type>
+ <name>made_up</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>fake_plugin</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>profile</name>
+ <version>1.0</version>
+ </requires>
+
+ <requires>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.3</version>
+ <comparison>lt</comparison>
+ </requires>
+
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>profile</plugin>
+ </requires>
+
+ <conflicts>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.0</version>
+ </conflicts>
+
+ <provides>
+ <type>plugin</type>
+ <name>profile_api</name>
+ <version>1.3</version>
+ </provides>
+
+ <provides>
+ <type>php_extension</type>
+ <name>big_math</name>
+ <version>1.0</version>
+ </provides>
+
+ <suggests>
+ <type>plugin</type>
+ <name>facebook_connect</name>
+ <version>1.0</version>
+ </suggests>
+
+ <activate_on_install>true</activate_on_install>
+
+</plugin_manifest>
diff --git a/engine/tests/test_files/plugin_18/start.php b/engine/tests/test_files/plugin_18/start.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/engine/tests/test_files/plugin_18/start.php
diff --git a/engine/tests/test_files/xxe/external_entity.txt b/engine/tests/test_files/xxe/external_entity.txt
new file mode 100644
index 000000000..536aca34d
--- /dev/null
+++ b/engine/tests/test_files/xxe/external_entity.txt
@@ -0,0 +1 @@
+secret \ No newline at end of file
diff --git a/engine/tests/test_files/xxe/request.xml b/engine/tests/test_files/xxe/request.xml
new file mode 100644
index 000000000..4390f9db2
--- /dev/null
+++ b/engine/tests/test_files/xxe/request.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!DOCTYPE foo [
+<!ELEMENT methodName ANY >
+<!ENTITY xxe SYSTEM "%s" >
+]>
+<methodCall>
+ <methodName>test&xxe;test</methodName>
+</methodCall>
diff --git a/engine/tests/test_skeleton.php b/engine/tests/test_skeleton.php
new file mode 100644
index 000000000..5a5de89bb
--- /dev/null
+++ b/engine/tests/test_skeleton.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Elgg Test Skeleton
+ *
+ * Plugin authors: copy this file to your plugin's test directory. Register an Elgg
+ * plugin hook and function similar to:
+ *
+ * elgg_register_plugin_hook_handler('unit_test', 'system', 'my_new_unit_test');
+ *
+ * function my_new_unit_test($hook, $type, $value, $params) {
+ * $value[] = "path/to/my/unit_test.php";
+ * return $value;
+ * }
+ *
+ * @package Elgg
+ * @subpackage Test
+ */
+class ElggCoreSkeletonTest extends ElggCoreUnitTest {
+
+ /**
+ * Called before each test object.
+ */
+ public function __construct() {
+ parent::__construct();
+
+ // all __construct() code should come after here
+ }
+
+ /**
+ * Called before each test method.
+ */
+ public function setUp() {
+
+ }
+
+ /**
+ * Called after each test method.
+ */
+ public function tearDown() {
+ // do not allow SimpleTest to interpret Elgg notices as exceptions
+ $this->swallowErrors();
+ }
+
+ /**
+ * Called after each test object.
+ */
+ public function __destruct() {
+ // all __destruct() code should go above here
+ parent::__destruct();
+ }
+
+ public function testFailure() {
+ $this->assertTrue(FALSE);
+ }
+}
diff --git a/gpl-plugins b/gpl-plugins
new file mode 100644
index 000000000..925ca6ec2
--- /dev/null
+++ b/gpl-plugins
@@ -0,0 +1,20 @@
+videolist
+dokuwiki
+friendrequest
+opensearch
+identica
+languages
+registrationterms
+custom_index_widgets
+river_privacy
+habitorio_theme
+lightpics
+colorbox
+event_calendar
+openid_client
+openid_server
+openid_api
+beechat
+simplepie
+profile_widgets
+html5
diff --git a/htaccess_dist b/htaccess_dist
new file mode 100644
index 000000000..44d129475
--- /dev/null
+++ b/htaccess_dist
@@ -0,0 +1,155 @@
+# Elgg htaccess directives
+
+<Files "htaccess_dist">
+ order allow,deny
+ deny from all
+</Files>
+
+# Don't allow listing directories
+Options -Indexes
+
+# Follow symbolic links
+Options +FollowSymLinks
+
+# Default handler
+DirectoryIndex index.php
+
+
+############################
+# BROWSER CACHING
+
+# The expires module controls the Expires and Cache-Control headers. Elgg sets
+# these for dynamically generated files so this is just for static files.
+<IfModule mod_expires.c>
+ ExpiresActive On
+ ExpiresDefault "access plus 1 year"
+</IfModule>
+
+# Conditional requests are controlled through Last-Modified and ETag headers.
+# Elgg sets these on dynamically generated cacheable files so this is just for
+# static files. Note: Apache sends Last-Modified by default on static files so
+# I don't think we need to be sending ETag for these files.
+<FilesMatch "\.(jpg|jpeg|gif|png|mp3|flv|mov|avi|3pg|html|htm|swf|js|css|ico)$">
+ FileETag MTime Size
+</FilesMatch>
+
+
+############################
+# PHP SETTINGS
+<IfModule mod_php5.c>
+ # limit the maximum memory consumed by the php script to 64 MB
+ php_value memory_limit 64M
+ # register_globals is deprecated as of PHP 5.3.0 - disable it for security reasons.
+ php_value register_globals 0
+ # post_max_size is the maximum size of ALL the data that is POST'ed to php at a time (8 MB)
+ php_value post_max_size 8388608
+ # upload_max_filesize is the maximum size of a single uploaded file (5 MB)
+ php_value upload_max_filesize 5242880
+ # on development servers, set to 1 to display errors. Set to 0 on production servers.
+ php_value display_errors 0
+</IfModule>
+
+
+############################
+# COMPRESSION
+
+# Turn on mod_gzip if available
+<IfModule mod_gzip.c>
+ mod_gzip_on yes
+ mod_gzip_dechunk yes
+ mod_gzip_keep_workfiles No
+ mod_gzip_minimum_file_size 1000
+ mod_gzip_maximum_file_size 1000000
+ mod_gzip_maximum_inmem_size 1000000
+ mod_gzip_item_include mime ^text/.*
+ mod_gzip_item_include mime ^application/javascript$
+ mod_gzip_item_include mime ^application/x-javascript$
+ # Exclude old browsers and images since IE has trouble with this
+ mod_gzip_item_exclude reqheader "User-Agent: .*Mozilla/4\..*\["
+ mod_gzip_item_exclude mime ^image/.*
+</IfModule>
+
+## Apache2 deflate support if available
+##
+## Important note: mod_headers is required for correct functioning across proxies.
+##
+<IfModule mod_deflate.c>
+ AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript
+ BrowserMatch ^Mozilla/4 gzip-only-text/html
+ BrowserMatch ^Mozilla/4\.[0678] no-gzip
+ BrowserMatch \bMSIE !no-gzip
+
+<IfModule mod_headers.c>
+ Header append Vary User-Agent env=!dont-vary
+</IfModule>
+
+ # The following is to disable compression for actions. The reason being is that these
+ # may offer direct downloads which (since the initial request comes in as text/html and headers
+ # get changed in the script) get double compressed and become unusable when downloaded by IE.
+ SetEnvIfNoCase Request_URI action\/* no-gzip dont-vary
+ SetEnvIfNoCase Request_URI actions\/* no-gzip dont-vary
+
+</IfModule>
+
+
+############################
+# REWRITE RULES
+
+<IfModule mod_rewrite.c>
+
+RewriteEngine on
+
+# If Elgg is in a subdirectory on your site, you might need to add a RewriteBase line
+# containing the path from your site root to elgg's root. e.g. If your site is
+# http://example.com/ and Elgg is in http://example.com/sites/elgg/, you might need
+#
+#RewriteBase /sites/elgg/
+#
+# here, only without the # in front.
+#
+# If you're not running Elgg in a subdirectory on your site, but still getting lots
+# of 404 errors beyond the front page, you could instead try:
+#
+#RewriteBase /
+
+
+# If your users receive the message "Sorry, logging in from a different domain is not permitted"
+# you must make sure your login form is served from the same hostname as your site pages.
+# See http://docs.elgg.org/wiki/Login_token_mismatch_error for more info.
+#
+# If you must add RewriteRules to change hostname, add them directly below (above all the others)
+
+
+# In for backwards compatibility
+RewriteRule ^pg\/([A-Za-z0-9\_\-]+)$ engine/handlers/page_handler.php?handler=$1&%{QUERY_STRING} [L]
+RewriteRule ^pg\/([A-Za-z0-9\_\-]+)\/(.*)$ engine/handlers/page_handler.php?handler=$1&page=$2&%{QUERY_STRING} [L]
+RewriteRule ^tag\/(.+)\/?$ engine/handlers/page_handler.php?handler=search&page=$1 [L]
+
+
+RewriteRule ^action\/([A-Za-z0-9\_\-\/]+)$ engine/handlers/action_handler.php?action=$1&%{QUERY_STRING} [L]
+
+RewriteRule ^cache\/(.*)$ engine/handlers/cache_handler.php?request=$1&%{QUERY_STRING} [L]
+
+RewriteRule ^services\/api\/([A-Za-z0-9\_\-]+)\/(.*)$ engine/handlers/service_handler.php?handler=$1&request=$2&%{QUERY_STRING} [L]
+
+RewriteRule ^export\/([A-Za-z]+)\/([0-9]+)\/?$ engine/handlers/export_handler.php?view=$1&guid=$2 [L]
+RewriteRule ^export\/([A-Za-z]+)\/([0-9]+)\/([A-Za-z]+)\/([A-Za-z0-9\_]+)\/$ engine/handlers/export_handler.php?view=$1&guid=$2&type=$3&idname=$4 [L]
+
+RewriteRule xml-rpc.php engine/handlers/xml-rpc_handler.php [L]
+RewriteRule mt/mt-xmlrpc.cgi engine/handlers/xml-rpc_handler.php [L]
+
+
+# rule for rewrite module test during install - can be removed after installation
+RewriteRule ^rewrite.php$ install.php [L]
+
+# Everything else that isn't a file gets routed through the page handler
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^([A-Za-z0-9\_\-]+)$ engine/handlers/page_handler.php?handler=$1 [QSA,L]
+
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^([A-Za-z0-9\_\-]+)\/(.*)$ engine/handlers/page_handler.php?handler=$1&page=$2 [QSA,L]
+
+
+</IfModule>
diff --git a/index.php b/index.php
new file mode 100644
index 000000000..708e38ec9
--- /dev/null
+++ b/index.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Elgg index page for web-based applications
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+/**
+ * Start the Elgg engine
+ */
+require_once(dirname(__FILE__) . "/engine/start.php");
+
+elgg_set_context('main');
+
+// allow plugins to override the front page (return true to stop this front page code)
+if (elgg_trigger_plugin_hook('index', 'system', null, FALSE) != FALSE) {
+ exit;
+}
+
+if (elgg_is_logged_in()) {
+ forward('activity');
+}
+
+
+$content = elgg_view_title(elgg_echo('content:latest'));
+$content .= elgg_list_river();
+
+$login_box = elgg_view('core/account/login_box');
+
+$params = array(
+ 'content' => $content,
+ 'sidebar' => $login_box
+);
+$body = elgg_view_layout('one_sidebar', $params);
+echo elgg_view_page(null, $body);
diff --git a/install.php b/install.php
new file mode 100644
index 000000000..a93298216
--- /dev/null
+++ b/install.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Elgg install script
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+// check for PHP 4 before we do anything else
+if (version_compare(PHP_VERSION, '5.0.0', '<')) {
+ echo "Your server's version of PHP (" . PHP_VERSION . ") is too old to run Elgg.\n";
+ exit;
+}
+
+require_once(dirname(__FILE__) . "/install/ElggInstaller.php");
+
+$installer = new ElggInstaller();
+
+$step = get_input('step', 'welcome');
+$installer->run($step);
diff --git a/install/ElggInstaller.php b/install/ElggInstaller.php
new file mode 100644
index 000000000..78cdde90f
--- /dev/null
+++ b/install/ElggInstaller.php
@@ -0,0 +1,1575 @@
+<?php
+
+/**
+ * Elgg Installer.
+ * Controller for installing Elgg. Supports both web-based on CLI installation.
+ *
+ * This controller steps the user through the install process. The method for
+ * each step handles both the GET and POST requests. There is no XSS/CSRF protection
+ * on the POST processing since the installer is only run once by the administrator.
+ *
+ * The installation process can be resumed by hitting the first page. The installer
+ * will try to figure out where to pick up again.
+ *
+ * All the logic for the installation process is in this class, but it depends on
+ * the core libraries. To do this, we selectively load a subset of the core libraries
+ * for the first few steps and then load the entire engine once the database and
+ * site settings are configured. In addition, this controller does its own session
+ * handling until the database is setup.
+ *
+ * There is an aborted attempt in the code at creating the data directory for
+ * users as a subdirectory of Elgg's root. The idea was to protect this directory
+ * through a .htaccess file. The problem is that a malicious user can upload a
+ * .htaccess of his own that overrides the protection for his user directory. The
+ * best solution is server level configuration that turns off AllowOverride for the
+ * data directory. See ticket #3453 for discussion on this.
+ *
+ * @package Elgg.Core
+ * @subpackage Installer
+ */
+class ElggInstaller {
+
+ protected $steps = array(
+ 'welcome',
+ 'requirements',
+ 'database',
+ 'settings',
+ 'admin',
+ 'complete',
+ );
+
+ protected $status = array(
+ 'config' => FALSE,
+ 'database' => FALSE,
+ 'settings' => FALSE,
+ 'admin' => FALSE,
+ );
+
+ protected $isAction = FALSE;
+
+ protected $autoLogin = TRUE;
+
+ /**
+ * Constructor bootstraps the Elgg engine
+ */
+ public function __construct() {
+ // load ElggRewriteTester as we depend on it
+ require_once(dirname(__FILE__) . "/ElggRewriteTester.php");
+
+ $this->isAction = $_SERVER['REQUEST_METHOD'] === 'POST';
+
+ $this->bootstrapConfig();
+
+ $this->bootstrapEngine();
+
+ elgg_set_viewtype('installation');
+
+ set_error_handler('_elgg_php_error_handler');
+ set_exception_handler('_elgg_php_exception_handler');
+
+ register_translations(dirname(__FILE__) . '/languages/', TRUE);
+ }
+
+ /**
+ * Dispatches a request to one of the step controllers
+ *
+ * @param string $step The installation step to run
+ *
+ * @return void
+ */
+ public function run($step) {
+
+ // check if this is a URL rewrite test coming in
+ $this->processRewriteTest();
+
+ if (!in_array($step, $this->getSteps())) {
+ $msg = elgg_echo('InstallationException:UnknownStep', array($step));
+ throw new InstallationException($msg);
+ }
+
+ $this->setInstallStatus();
+
+ $this->checkInstallCompletion($step);
+
+ // check if this is an install being resumed
+ $this->resumeInstall($step);
+
+ $this->finishBootstraping($step);
+
+ $params = $this->getPostVariables();
+ $this->$step($params);
+ }
+
+ /**
+ * Set the auto login flag
+ *
+ * @param bool $flag Auto login
+ *
+ * @return void
+ */
+ public function setAutoLogin(bool $flag) {
+ $this->autoLogin = $value;
+ }
+
+ /**
+ * A batch install of Elgg
+ *
+ * All required parameters must be passed in as an associative array. See
+ * $requiredParams for a list of them. This creates the necessary files,
+ * loads the database, configures the site settings, and creates the admin
+ * account. If it fails, an exception is thrown. It does not check any of
+ * the requirements as the multiple step web installer does.
+ *
+ * If the settings.php file exists, it will use that rather than the parameters
+ * passed to this function.
+ *
+ * @param array $params Array of key value pairs
+ * @param bool $createHtaccess Should .htaccess be created
+ *
+ * @return void
+ * @throws InstallationException
+ */
+ public function batchInstall(array $params, $createHtaccess = FALSE) {
+ global $CONFIG;
+
+ restore_error_handler();
+ restore_exception_handler();
+
+ $defaults = array(
+ 'dbhost' => 'localhost',
+ 'dbprefix' => 'elgg_',
+ 'path' => $CONFIG->path,
+ 'language' => 'en',
+ 'siteaccess' => ACCESS_PUBLIC,
+ );
+ $params = array_merge($defaults, $params);
+
+ $requiredParams = array(
+ 'dbuser',
+ 'dbpassword',
+ 'dbname',
+ 'sitename',
+ 'wwwroot',
+ 'dataroot',
+ 'displayname',
+ 'email',
+ 'username',
+ 'password',
+ );
+ foreach ($requiredParams as $key) {
+ if (empty($params[$key])) {
+ $msg = elgg_echo('install:error:requiredfield', array($key));
+ throw new InstallationException($msg);
+ }
+ }
+
+ // password is passed in once
+ $params['password1'] = $params['password2'] = $params['password'];
+
+ if ($createHtaccess) {
+ $rewriteTester = new ElggRewriteTester();
+ if (!$rewriteTester->createHtaccess($CONFIG->path)) {
+ throw new InstallationException(elgg_echo('install:error:htaccess'));
+ }
+ }
+
+ $this->setInstallStatus();
+
+ if (!$this->status['config']) {
+ if (!$this->createSettingsFile($params)) {
+ throw new InstallationException(elgg_echo('install:error:settings'));
+ }
+ }
+
+ if (!$this->connectToDatabase()) {
+ throw new InstallationException(elgg_echo('install:error:databasesettings'));
+ }
+
+ if (!$this->status['database']) {
+ if (!$this->installDatabase()) {
+ throw new InstallationException(elgg_echo('install:error:cannotloadtables'));
+ }
+ }
+
+ // load remaining core libraries
+ $this->finishBootstraping('settings');
+
+ if (!$this->saveSiteSettings($params)) {
+ throw new InstallationException(elgg_echo('install:error:savesitesettings'));
+ }
+
+ if (!$this->createAdminAccount($params)) {
+ throw new InstallationException(elgg_echo('install:admin:cannot_create'));
+ }
+ }
+
+ /**
+ * Renders the data passed by a controller
+ *
+ * @param string $step The current step
+ * @param array $vars Array of vars to pass to the view
+ *
+ * @return void
+ */
+ protected function render($step, $vars = array()) {
+
+ $vars['next_step'] = $this->getNextStep($step);
+
+ $title = elgg_echo("install:$step");
+ $body = elgg_view("install/pages/$step", $vars);
+ echo elgg_view_page(
+ $title,
+ $body,
+ 'default',
+ array(
+ 'step' => $step,
+ 'steps' => $this->getSteps(),
+ )
+ );
+ exit;
+ }
+
+ /**
+ * Step controllers
+ */
+
+ /**
+ * Welcome controller
+ *
+ * @param array $vars Not used
+ *
+ * @return void
+ */
+ protected function welcome($vars) {
+ $this->render('welcome');
+ }
+
+ /**
+ * Requirements controller
+ *
+ * Checks version of php, libraries, permissions, and rewrite rules
+ *
+ * @param array $vars Vars
+ *
+ * @return void
+ */
+ protected function requirements($vars) {
+
+ $report = array();
+
+ // check PHP parameters and libraries
+ $this->checkPHP($report);
+
+ // check URL rewriting
+ $this->checkRewriteRules($report);
+
+ // check for existence of settings file
+ if ($this->checkSettingsFile($report) != TRUE) {
+ // no file, so check permissions on engine directory
+ $this->checkEngineDir($report);
+ }
+
+ // check the database later
+ $report['database'] = array(array(
+ 'severity' => 'info',
+ 'message' => elgg_echo('install:check:database')
+ ));
+
+ // any failures?
+ $numFailures = $this->countNumConditions($report, 'failure');
+
+ // any warnings
+ $numWarnings = $this->countNumConditions($report, 'warning');
+
+
+ $params = array(
+ 'report' => $report,
+ 'num_failures' => $numFailures,
+ 'num_warnings' => $numWarnings,
+ );
+
+ $this->render('requirements', $params);
+ }
+
+ /**
+ * Database set up controller
+ *
+ * Creates the settings.php file and creates the database tables
+ *
+ * @param array $submissionVars Submitted form variables
+ *
+ * @return void
+ */
+ protected function database($submissionVars) {
+
+ $formVars = array(
+ 'dbuser' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'dbpassword' => array(
+ 'type' => 'password',
+ 'value' => '',
+ 'required' => FALSE,
+ ),
+ 'dbname' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'dbhost' => array(
+ 'type' => 'text',
+ 'value' => 'localhost',
+ 'required' => TRUE,
+ ),
+ 'dbprefix' => array(
+ 'type' => 'text',
+ 'value' => 'elgg_',
+ 'required' => TRUE,
+ ),
+ );
+
+ if ($this->checkSettingsFile()) {
+ // user manually created settings file so we fake out action test
+ $this->isAction = TRUE;
+ }
+
+ if ($this->isAction) {
+ do {
+ // only create settings file if it doesn't exist
+ if (!$this->checkSettingsFile()) {
+ if (!$this->validateDatabaseVars($submissionVars, $formVars)) {
+ // error so we break out of action and serve same page
+ break;
+ }
+
+ if (!$this->createSettingsFile($submissionVars)) {
+ break;
+ }
+ }
+
+ // check db version and connect
+ if (!$this->connectToDatabase()) {
+ break;
+ }
+
+ if (!$this->installDatabase()) {
+ break;
+ }
+
+ system_message(elgg_echo('install:success:database'));
+
+ $this->continueToNextStep('database');
+ } while (FALSE); // PHP doesn't support breaking out of if statements
+ }
+
+ $formVars = $this->makeFormSticky($formVars, $submissionVars);
+
+ $params = array('variables' => $formVars,);
+
+ if ($this->checkSettingsFile()) {
+ // settings file exists and we're here so failed to create database
+ $params['failure'] = TRUE;
+ }
+
+ $this->render('database', $params);
+ }
+
+ /**
+ * Site settings controller
+ *
+ * Sets the site name, URL, data directory, etc.
+ *
+ * @param array $submissionVars Submitted vars
+ *
+ * @return void
+ */
+ protected function settings($submissionVars) {
+ global $CONFIG;
+
+ $formVars = array(
+ 'sitename' => array(
+ 'type' => 'text',
+ 'value' => 'My New Community',
+ 'required' => TRUE,
+ ),
+ 'siteemail' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => FALSE,
+ ),
+ 'wwwroot' => array(
+ 'type' => 'text',
+ 'value' => elgg_get_site_url(),
+ 'required' => TRUE,
+ ),
+ 'path' => array(
+ 'type' => 'text',
+ 'value' => $CONFIG->path,
+ 'required' => TRUE,
+ ),
+ 'dataroot' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'siteaccess' => array(
+ 'type' => 'access',
+ 'value' => ACCESS_PUBLIC,
+ 'required' => TRUE,
+ ),
+ );
+
+ // if Apache, we give user option of having Elgg create data directory
+ //if (ElggRewriteTester::guessWebServer() == 'apache') {
+ // $formVars['dataroot']['type'] = 'combo';
+ // $CONFIG->translations['en']['install:settings:help:dataroot'] =
+ // $CONFIG->translations['en']['install:settings:help:dataroot:apache'];
+ //}
+
+ if ($this->isAction) {
+ do {
+ //if (!$this->createDataDirectory($submissionVars, $formVars)) {
+ // break;
+ //}
+
+ if (!$this->validateSettingsVars($submissionVars, $formVars)) {
+ break;
+ }
+
+ if (!$this->saveSiteSettings($submissionVars)) {
+ break;
+ }
+
+ system_message(elgg_echo('install:success:settings'));
+
+ $this->continueToNextStep('settings');
+
+ } while (FALSE); // PHP doesn't support breaking out of if statements
+ }
+
+ $formVars = $this->makeFormSticky($formVars, $submissionVars);
+
+ $this->render('settings', array('variables' => $formVars));
+ }
+
+ /**
+ * Admin account controller
+ *
+ * Creates an admin user account
+ *
+ * @param array $submissionVars Submitted vars
+ *
+ * @return void
+ */
+ protected function admin($submissionVars) {
+ $formVars = array(
+ 'displayname' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'email' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'username' => array(
+ 'type' => 'text',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'password1' => array(
+ 'type' => 'password',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ 'password2' => array(
+ 'type' => 'password',
+ 'value' => '',
+ 'required' => TRUE,
+ ),
+ );
+
+ if ($this->isAction) {
+ do {
+ if (!$this->validateAdminVars($submissionVars, $formVars)) {
+ break;
+ }
+
+ if (!$this->createAdminAccount($submissionVars, $this->autoLogin)) {
+ break;
+ }
+
+ system_message(elgg_echo('install:success:admin'));
+
+ $this->continueToNextStep('admin');
+
+ } while (FALSE); // PHP doesn't support breaking out of if statements
+ }
+
+ // bit of a hack to get the password help to show right number of characters
+ global $CONFIG;
+ $lang = get_current_language();
+ $CONFIG->translations[$lang]['install:admin:help:password1'] =
+ sprintf($CONFIG->translations[$lang]['install:admin:help:password1'],
+ $CONFIG->min_password_length);
+
+ $formVars = $this->makeFormSticky($formVars, $submissionVars);
+
+ $this->render('admin', array('variables' => $formVars));
+ }
+
+ /**
+ * Controller for last step
+ *
+ * @return void
+ */
+ protected function complete() {
+
+ $params = array();
+ if ($this->autoLogin) {
+ $params['destination'] = 'admin';
+ } else {
+ $params['destination'] = 'index.php';
+ }
+
+ $this->render('complete', $params);
+ }
+
+ /**
+ * Step management
+ */
+
+ /**
+ * Get an array of steps
+ *
+ * @return array
+ */
+ protected function getSteps() {
+ return $this->steps;
+ }
+
+ /**
+ * Forwards the browser to the next step
+ *
+ * @param string $currentStep Current installation step
+ *
+ * @return void
+ */
+ protected function continueToNextStep($currentStep) {
+ $this->isAction = FALSE;
+ forward($this->getNextStepUrl($currentStep));
+ }
+
+ /**
+ * Get the next step as a string
+ *
+ * @param string $currentStep Current installation step
+ *
+ * @return string
+ */
+ protected function getNextStep($currentStep) {
+ $index = 1 + array_search($currentStep, $this->steps);
+ if (isset($this->steps[$index])) {
+ return $this->steps[$index];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get the URL of the next step
+ *
+ * @param string $currentStep Current installation step
+ *
+ * @return string
+ */
+ protected function getNextStepUrl($currentStep) {
+ global $CONFIG;
+ $nextStep = $this->getNextStep($currentStep);
+ return elgg_get_site_url() . "install.php?step=$nextStep";
+ }
+
+ /**
+ * Check the different install steps for completion
+ *
+ * @return void
+ */
+ protected function setInstallStatus() {
+ global $CONFIG;
+
+ if (!is_readable("{$CONFIG->path}engine/settings.php")) {
+ return;
+ }
+
+ $this->loadSettingsFile();
+
+ $this->status['config'] = TRUE;
+
+ // must be able to connect to database to jump install steps
+ $dbSettingsPass = $this->checkDatabaseSettings(
+ $CONFIG->dbuser,
+ $CONFIG->dbpass,
+ $CONFIG->dbname,
+ $CONFIG->dbhost
+ );
+ if ($dbSettingsPass == FALSE) {
+ return;
+ }
+
+ if (!include_once("{$CONFIG->path}engine/lib/database.php")) {
+ $msg = elgg_echo('InstallationException:MissingLibrary', array('database.php'));
+ throw new InstallationException($msg);
+ }
+
+ // check that the config table has been created
+ $query = "show tables";
+ $result = get_data($query);
+ if ($result) {
+ foreach ($result as $table) {
+ $table = (array) $table;
+ if (in_array("{$CONFIG->dbprefix}config", $table)) {
+ $this->status['database'] = TRUE;
+ }
+ }
+ if ($this->status['database'] == FALSE) {
+ return;
+ }
+ } else {
+ // no tables
+ return;
+ }
+
+ // check that the config table has entries
+ $query = "SELECT COUNT(*) AS total FROM {$CONFIG->dbprefix}config";
+ $result = get_data($query);
+ if ($result && $result[0]->total > 0) {
+ $this->status['settings'] = TRUE;
+ } else {
+ return;
+ }
+
+ // check that the users entity table has an entry
+ $query = "SELECT COUNT(*) AS total FROM {$CONFIG->dbprefix}users_entity";
+ $result = get_data($query);
+ if ($result && $result[0]->total > 0) {
+ $this->status['admin'] = TRUE;
+ } else {
+ return;
+ }
+ }
+
+ /**
+ * Security check to ensure the installer cannot be run after installation
+ * has finished. If this is detected, the viewer is sent to the front page.
+ *
+ * @param string $step Installation step to check against
+ *
+ * @return void
+ */
+ protected function checkInstallCompletion($step) {
+ if ($step != 'complete') {
+ if (!in_array(FALSE, $this->status)) {
+ // install complete but someone is trying to view an install page
+ forward();
+ }
+ }
+ }
+
+ /**
+ * Check if this is a case of a install being resumed and figure
+ * out where to continue from. Returns the best guess on the step.
+ *
+ * @param string $step Installation step to resume from
+ *
+ * @return string
+ */
+ protected function resumeInstall($step) {
+ global $CONFIG;
+
+ // only do a resume from the first step
+ if ($step !== 'welcome') {
+ return;
+ }
+
+ if ($this->status['database'] == FALSE) {
+ return;
+ }
+
+ if ($this->status['settings'] == FALSE) {
+ forward("install.php?step=settings");
+ }
+
+ if ($this->status['admin'] == FALSE) {
+ forward("install.php?step=admin");
+ }
+
+ // everything appears to be set up
+ forward("install.php?step=complete");
+ }
+
+ /**
+ * Bootstraping
+ */
+
+ /**
+ * Load the essential libraries of the engine
+ *
+ * @return void
+ */
+ protected function bootstrapEngine() {
+ global $CONFIG;
+
+ $lib_dir = $CONFIG->path . 'engine/lib/';
+
+ // bootstrapping with required files in a required order
+ $required_files = array(
+ 'elgglib.php', 'views.php', 'access.php', 'system_log.php', 'export.php',
+ 'configuration.php', 'sessions.php', 'languages.php', 'pageowner.php',
+ 'input.php', 'cache.php', 'output.php',
+ );
+
+ foreach ($required_files as $file) {
+ $path = $lib_dir . $file;
+ if (!include($path)) {
+ echo "Could not load file '$path'. "
+ . 'Please check your Elgg installation for all required files.';
+ exit;
+ }
+ }
+ }
+
+ /**
+ * Load remaining engine libraries and complete bootstraping (see start.php)
+ *
+ * @param string $step Which step to boot strap for. Required because
+ * boot strapping is different until the DB is populated.
+ *
+ * @return void
+ */
+ protected function finishBootstraping($step) {
+
+ $dbIndex = array_search('database', $this->getSteps());
+ $settingsIndex = array_search('settings', $this->getSteps());
+ $adminIndex = array_search('admin', $this->getSteps());
+ $completeIndex = array_search('complete', $this->getSteps());
+ $stepIndex = array_search($step, $this->getSteps());
+
+ // To log in the user, we need to use the Elgg core session handling.
+ // Otherwise, use default php session handling
+ $useElggSession = ($stepIndex == $adminIndex && $this->isAction) ||
+ $stepIndex == $completeIndex;
+ if (!$useElggSession) {
+ session_name('Elgg_install');
+ session_start();
+ elgg_unregister_event_handler('boot', 'system', 'session_init');
+ }
+
+ if ($stepIndex > $dbIndex) {
+ // once the database has been created, load rest of engine
+ global $CONFIG;
+ $lib_dir = $CONFIG->path . 'engine/lib/';
+
+ $this->loadSettingsFile();
+
+ $lib_files = array(
+ // these want to be loaded first apparently?
+ 'database.php', 'actions.php',
+
+ 'admin.php', 'annotations.php',
+ 'calendar.php', 'cron.php', 'entities.php',
+ 'extender.php', 'filestore.php', 'group.php',
+ 'location.php', 'mb_wrapper.php',
+ 'memcache.php', 'metadata.php', 'metastrings.php',
+ 'navigation.php', 'notification.php',
+ 'objects.php', 'opendd.php', 'pagehandler.php',
+ 'pam.php', 'plugins.php',
+ 'private_settings.php', 'relationships.php', 'river.php',
+ 'sites.php', 'statistics.php', 'tags.php', 'user_settings.php',
+ 'users.php', 'upgrade.php', 'web_services.php',
+ 'widgets.php', 'xml.php', 'xml-rpc.php',
+ 'deprecated-1.7.php', 'deprecated-1.8.php',
+ );
+
+ foreach ($lib_files as $file) {
+ $path = $lib_dir . $file;
+ if (!include_once($path)) {
+ $msg = elgg_echo('InstallationException:MissingLibrary', array($file));
+ throw new InstallationException($msg);
+ }
+ }
+
+ setup_db_connections();
+ register_translations(dirname(dirname(__FILE__)) . "/languages/");
+
+ if ($stepIndex > $settingsIndex) {
+ $CONFIG->site_guid = (int) datalist_get('default_site');
+ $CONFIG->site_id = $CONFIG->site_guid;
+ $CONFIG->site = get_entity($CONFIG->site_guid);
+ $CONFIG->dataroot = datalist_get('dataroot');
+ _elgg_session_boot(NULL, NULL, NULL);
+ }
+
+ elgg_trigger_event('init', 'system');
+ }
+ }
+
+ /**
+ * Set up configuration variables
+ *
+ * @return void
+ */
+ protected function bootstrapConfig() {
+ global $CONFIG;
+ if (!isset($CONFIG)) {
+ $CONFIG = new stdClass;
+ }
+
+ $CONFIG->wwwroot = $this->getBaseUrl();
+ $CONFIG->url = $CONFIG->wwwroot;
+ $CONFIG->path = dirname(dirname(__FILE__)) . '/';
+ $CONFIG->viewpath = $CONFIG->path . 'views/';
+ $CONFIG->pluginspath = $CONFIG->path . 'mod/';
+ $CONFIG->context = array();
+ $CONFIG->entity_types = array('group', 'object', 'site', 'user');
+ }
+
+ /**
+ * Get the best guess at the base URL
+ *
+ * @note Cannot use current_page_url() because it depends on $CONFIG->wwwroot
+ * @todo Should this be a core function?
+ *
+ * @return string
+ */
+ protected function getBaseUrl() {
+ $protocol = 'http';
+ if (!empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {
+ $protocol = 'https';
+ }
+ $port = ':' . $_SERVER["SERVER_PORT"];
+ if ($port == ':80' || $port == ':443') {
+ $port = '';
+ }
+ $uri = $_SERVER['REQUEST_URI'];
+ $cutoff = strpos($uri, 'install.php');
+ $uri = substr($uri, 0, $cutoff);
+
+ $url = "$protocol://{$_SERVER['SERVER_NAME']}$port{$uri}";
+ return $url;
+ }
+
+ /**
+ * Load settings.php
+ *
+ * @return void
+ * @throws InstallationException
+ */
+ protected function loadSettingsFile() {
+ global $CONFIG;
+
+ if (!include_once("{$CONFIG->path}engine/settings.php")) {
+ $msg = elgg_echo('InstallationException:CannotLoadSettings');
+ throw new InstallationException($msg);
+ }
+ }
+
+ /**
+ * Action handling methods
+ */
+
+ /**
+ * Return an associative array of post variables
+ * (could be selective based on expected variables)
+ *
+ * Does not filter as person installing the site should not be attempting
+ * XSS attacks. If filtering is added, it should not be done for passwords.
+ *
+ * @return array
+ */
+ protected function getPostVariables() {
+ $vars = array();
+ foreach ($_POST as $k => $v) {
+ $vars[$k] = $v;
+ }
+ return $vars;
+ }
+
+ /**
+ * If form is reshown, remember previously submitted variables
+ *
+ * @param array $formVars Vars int he form
+ * @param array $submissionVars Submitted vars
+ *
+ * @return array
+ */
+ protected function makeFormSticky($formVars, $submissionVars) {
+ foreach ($submissionVars as $field => $value) {
+ $formVars[$field]['value'] = $value;
+ }
+ return $formVars;
+ }
+
+ /**
+ * Requirement checks support methods
+ */
+
+ /**
+ * Check that the engine dir is writable
+ *
+ * @param array &$report The requirements report object
+ *
+ * @return bool
+ */
+ protected function checkEngineDir(&$report) {
+ global $CONFIG;
+
+ $writable = is_writable("{$CONFIG->path}engine");
+ if (!$writable) {
+ $report['settings'] = array(
+ array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo('install:check:enginedir'),
+ )
+ );
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Check that the settings file exists
+ *
+ * @param array &$report The requirements report array
+ *
+ * @return bool
+ */
+ protected function checkSettingsFile(&$report = array()) {
+ global $CONFIG;
+
+ if (!file_exists("{$CONFIG->path}engine/settings.php")) {
+ return FALSE;
+ }
+
+ if (!is_readable("{$CONFIG->path}engine/settings.php")) {
+ $report['settings'] = array(
+ array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo('install:check:readsettings'),
+ )
+ );
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Check version of PHP, extensions, and variables
+ *
+ * @param array &$report The requirements report array
+ *
+ * @return void
+ */
+ protected function checkPHP(&$report) {
+ $phpReport = array();
+
+ $elgg_php_version = '5.2.0';
+ if (version_compare(PHP_VERSION, $elgg_php_version, '<')) {
+ $phpReport[] = array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo('install:check:php:version', array($elgg_php_version, PHP_VERSION))
+ );
+ }
+
+ $this->checkPhpExtensions($phpReport);
+
+ $this->checkPhpDirectives($phpReport);
+
+ if (count($phpReport) == 0) {
+ $phpReport[] = array(
+ 'severity' => 'pass',
+ 'message' => elgg_echo('install:check:php:success')
+ );
+ }
+
+ $report['php'] = $phpReport;
+ }
+
+ /**
+ * Check the server's PHP extensions
+ *
+ * @param array &$phpReport The PHP requirements report array
+ *
+ * @return void
+ */
+ protected function checkPhpExtensions(&$phpReport) {
+ $extensions = get_loaded_extensions();
+ $requiredExtensions = array(
+ 'mysql',
+ 'json',
+ 'xml',
+ 'gd',
+ );
+ foreach ($requiredExtensions as $extension) {
+ if (!in_array($extension, $extensions)) {
+ $phpReport[] = array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo('install:check:php:extension', array($extension))
+ );
+ }
+ }
+
+ $recommendedExtensions = array(
+ 'mbstring',
+ );
+ foreach ($recommendedExtensions as $extension) {
+ if (!in_array($extension, $extensions)) {
+ $phpReport[] = array(
+ 'severity' => 'warning',
+ 'message' => elgg_echo('install:check:php:extension:recommend', array($extension))
+ );
+ }
+ }
+ }
+
+ /**
+ * Check PHP parameters
+ *
+ * @param array &$phpReport The PHP requirements report array
+ *
+ * @return void
+ */
+ protected function checkPhpDirectives(&$phpReport) {
+ if (ini_get('open_basedir')) {
+ $phpReport[] = array(
+ 'severity' => 'warning',
+ 'message' => elgg_echo("install:check:php:open_basedir")
+ );
+ }
+
+ if (ini_get('safe_mode')) {
+ $phpReport[] = array(
+ 'severity' => 'warning',
+ 'message' => elgg_echo("install:check:php:safe_mode")
+ );
+ }
+
+ if (ini_get('arg_separator.output') !== '&') {
+ $separator = htmlspecialchars(ini_get('arg_separator.output'));
+ $msg = elgg_echo("install:check:php:arg_separator", array($separator));
+ $phpReport[] = array(
+ 'severity' => 'failure',
+ 'message' => $msg,
+ );
+ }
+
+ if (ini_get('register_globals')) {
+ $phpReport[] = array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo("install:check:php:register_globals")
+ );
+ }
+
+ if (ini_get('session.auto_start')) {
+ $phpReport[] = array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo("install:check:php:session.auto_start")
+ );
+ }
+ }
+
+ /**
+ * Confirm that the rewrite rules are firing
+ *
+ * @param array &$report The requirements report array
+ *
+ * @return void
+ */
+ protected function checkRewriteRules(&$report) {
+ global $CONFIG;
+
+ $tester = new ElggRewriteTester();
+ $url = elgg_get_site_url() . "rewrite.php";
+ $report['rewrite'] = array($tester->run($url, $CONFIG->path));
+ }
+
+ /**
+ * Check if the request is coming from the URL rewrite test on the
+ * requirements page.
+ *
+ * @return void
+ */
+ protected function processRewriteTest() {
+ if (strpos($_SERVER['REQUEST_URI'], 'rewrite.php') !== FALSE) {
+ echo 'success';
+ exit;
+ }
+ }
+
+ /**
+ * Count the number of failures in the requirements report
+ *
+ * @param array $report The requirements report array
+ * @param string $condition 'failure' or 'warning'
+ *
+ * @return int
+ */
+ protected function countNumConditions($report, $condition) {
+ $count = 0;
+ foreach ($report as $category => $checks) {
+ foreach ($checks as $check) {
+ if ($check['severity'] === $condition) {
+ $count++;
+ }
+ }
+ }
+
+ return $count;
+ }
+
+
+ /**
+ * Database support methods
+ */
+
+ /**
+ * Validate the variables for the database step
+ *
+ * @param array $submissionVars Submitted vars
+ * @param array $formVars Vars in the form
+ *
+ * @return bool
+ */
+ protected function validateDatabaseVars($submissionVars, $formVars) {
+
+ foreach ($formVars as $field => $info) {
+ if ($info['required'] == TRUE && !$submissionVars[$field]) {
+ $name = elgg_echo("install:database:label:$field");
+ register_error(elgg_echo('install:error:requiredfield', array($name)));
+ return FALSE;
+ }
+ }
+
+ // according to postgres documentation: SQL identifiers and key words must
+ // begin with a letter (a-z, but also letters with diacritical marks and
+ // non-Latin letters) or an underscore (_). Subsequent characters in an
+ // identifier or key word can be letters, underscores, digits (0-9), or dollar signs ($).
+ // Refs #4994
+ if (!preg_match("/^[a-zA-Z_][\w]*$/", $submissionVars['dbprefix'])) {
+ register_error(elgg_echo('install:error:database_prefix'));
+ return FALSE;
+ }
+
+ return $this->checkDatabaseSettings(
+ $submissionVars['dbuser'],
+ $submissionVars['dbpassword'],
+ $submissionVars['dbname'],
+ $submissionVars['dbhost']
+ );
+ }
+
+ /**
+ * Confirm the settings for the database
+ *
+ * @param string $user Username
+ * @param string $password Password
+ * @param string $dbname Database name
+ * @param string $host Host
+ *
+ * @return bool
+ */
+ protected function checkDatabaseSettings($user, $password, $dbname, $host) {
+ $mysql_dblink = mysql_connect($host, $user, $password, true);
+ if ($mysql_dblink == FALSE) {
+ register_error(elgg_echo('install:error:databasesettings'));
+ return $FALSE;
+ }
+
+ $result = mysql_select_db($dbname, $mysql_dblink);
+
+ // check MySQL version - must be 5.0 or >
+ $required_version = 5.0;
+ $version = mysql_get_server_info();
+ $points = explode('.', $version);
+ if ($points[0] < $required_version) {
+ register_error(elgg_echo('install:error:oldmysql', array($version)));
+ return FALSE;
+ }
+
+ mysql_close($mysql_dblink);
+
+ if (!$result) {
+ register_error(elgg_echo('install:error:nodatabase', array($dbname)));
+ }
+
+ return $result;
+ }
+
+ /**
+ * Writes the settings file to the engine directory
+ *
+ * @param array $params Array of inputted params from the user
+ *
+ * @return bool
+ */
+ protected function createSettingsFile($params) {
+ global $CONFIG;
+
+ $templateFile = "{$CONFIG->path}engine/settings.example.php";
+ $template = file_get_contents($templateFile);
+ if (!$template) {
+ register_error(elgg_echo('install:error:readsettingsphp'));
+ return FALSE;
+ }
+
+ foreach ($params as $k => $v) {
+ $template = str_replace("{{" . $k . "}}", $v, $template);
+ }
+
+ $settingsFilename = "{$CONFIG->path}engine/settings.php";
+ $result = file_put_contents($settingsFilename, $template);
+ if (!$result) {
+ register_error(elgg_echo('install:error:writesettingphp'));
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Bootstrap database connection before entire engine is available
+ *
+ * @return bool
+ */
+ protected function connectToDatabase() {
+ global $CONFIG;
+
+ if (!include_once("{$CONFIG->path}engine/settings.php")) {
+ register_error(elgg_echo('InstallationException:CannotLoadSettings'));
+ return FALSE;
+ }
+
+ if (!include_once("{$CONFIG->path}engine/lib/database.php")) {
+ $msg = elgg_echo('InstallationException:MissingLibrary', array('database.php'));
+ register_error($msg);
+ return FALSE;
+ }
+
+ try {
+ setup_db_connections();
+ } catch (Exception $e) {
+ register_error($e->getMessage());
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Create the database tables
+ *
+ * @return bool
+ */
+ protected function installDatabase() {
+ global $CONFIG;
+
+ try {
+ run_sql_script("{$CONFIG->path}engine/schema/mysql.sql");
+ } catch (Exception $e) {
+ $msg = $e->getMessage();
+ if (strpos($msg, 'already exists')) {
+ $msg = elgg_echo('install:error:tables_exist');
+ }
+ register_error($msg);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Site settings support methods
+ */
+
+ /**
+ * Create the data directory if requested
+ *
+ * @param array $submissionVars Submitted vars
+ * @param array $formVars Variables in the form
+ * @return bool
+ */
+ protected function createDataDirectory(&$submissionVars, $formVars) {
+ // did the user have option of Elgg creating the data directory
+ if ($formVars['dataroot']['type'] != 'combo') {
+ return TRUE;
+ }
+
+ // did the user select the option
+ if ($submissionVars['dataroot'] != 'dataroot-checkbox') {
+ return TRUE;
+ }
+
+ $dir = sanitise_filepath($submissionVars['path']) . 'data';
+ if (file_exists($dir) || mkdir($dir, 0700)) {
+ $submissionVars['dataroot'] = $dir;
+ if (!file_exists("$dir/.htaccess")) {
+ $htaccess = "Order Deny,Allow\nDeny from All\n";
+ if (!file_put_contents("$dir/.htaccess", $htaccess)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Validate the site settings form variables
+ *
+ * @param array $submissionVars Submitted vars
+ * @param array $formVars Vars in the form
+ *
+ * @return bool
+ */
+ protected function validateSettingsVars($submissionVars, $formVars) {
+ global $CONFIG;
+
+ foreach ($formVars as $field => $info) {
+ $submissionVars[$field] = trim($submissionVars[$field]);
+ if ($info['required'] == TRUE && $submissionVars[$field] === '') {
+ $name = elgg_echo("install:settings:label:$field");
+ register_error(elgg_echo('install:error:requiredfield', array($name)));
+ return FALSE;
+ }
+ }
+
+ // check that data root is absolute path
+ if (stripos(PHP_OS, 'win') === 0) {
+ if (strpos($submissionVars['dataroot'], ':') !== 1) {
+ $msg = elgg_echo('install:error:relative_path', array($submissionVars['dataroot']));
+ register_error($msg);
+ return FALSE;
+ }
+ } else {
+ if (strpos($submissionVars['dataroot'], '/') !== 0) {
+ $msg = elgg_echo('install:error:relative_path', array($submissionVars['dataroot']));
+ register_error($msg);
+ return FALSE;
+ }
+ }
+
+ // check that data root exists
+ if (!file_exists($submissionVars['dataroot'])) {
+ $msg = elgg_echo('install:error:datadirectoryexists', array($submissionVars['dataroot']));
+ register_error($msg);
+ return FALSE;
+ }
+
+ // check that data root is writable
+ if (!is_writable($submissionVars['dataroot'])) {
+ $msg = elgg_echo('install:error:writedatadirectory', array($submissionVars['dataroot']));
+ register_error($msg);
+ return FALSE;
+ }
+
+ if (!isset($CONFIG->data_dir_override) || !$CONFIG->data_dir_override) {
+ // check that data root is not subdirectory of Elgg root
+ if (stripos($submissionVars['dataroot'], $submissionVars['path']) === 0) {
+ $msg = elgg_echo('install:error:locationdatadirectory', array($submissionVars['dataroot']));
+ register_error($msg);
+ return FALSE;
+ }
+ }
+
+ // check that email address is email address
+ if ($submissionVars['siteemail'] && !is_email_address($submissionVars['siteemail'])) {
+ $msg = elgg_echo('install:error:emailaddress', array($submissionVars['siteemail']));
+ register_error($msg);
+ return FALSE;
+ }
+
+ // @todo check that url is a url
+ // @note filter_var cannot be used because it doesn't work on international urls
+
+ return TRUE;
+ }
+
+ /**
+ * Initialize the site including site entity, plugins, and configuration
+ *
+ * @param array $submissionVars Submitted vars
+ *
+ * @return bool
+ */
+ protected function saveSiteSettings($submissionVars) {
+ global $CONFIG;
+
+ // ensure that file path, data path, and www root end in /
+ $submissionVars['path'] = sanitise_filepath($submissionVars['path']);
+ $submissionVars['dataroot'] = sanitise_filepath($submissionVars['dataroot']);
+ $submissionVars['wwwroot'] = sanitise_filepath($submissionVars['wwwroot']);
+
+ $site = new ElggSite();
+ $site->name = strip_tags($submissionVars['sitename']);
+ $site->url = $submissionVars['wwwroot'];
+ $site->access_id = ACCESS_PUBLIC;
+ $site->email = $submissionVars['siteemail'];
+ $guid = $site->save();
+
+ if (!$guid) {
+ register_error(elgg_echo('install:error:createsite'));
+ return FALSE;
+ }
+
+ // bootstrap site info
+ $CONFIG->site_guid = $guid;
+ $CONFIG->site = $site;
+
+ datalist_set('installed', time());
+ datalist_set('path', $submissionVars['path']);
+ datalist_set('dataroot', $submissionVars['dataroot']);
+ datalist_set('default_site', $site->getGUID());
+ datalist_set('version', get_version());
+ datalist_set('simplecache_enabled', 1);
+ datalist_set('system_cache_enabled', 1);
+
+ // new installations have run all the upgrades
+ $upgrades = elgg_get_upgrade_files($submissionVars['path'] . 'engine/lib/upgrades/');
+ datalist_set('processed_upgrades', serialize($upgrades));
+
+ set_config('view', 'default', $site->getGUID());
+ set_config('language', 'en', $site->getGUID());
+ set_config('default_access', $submissionVars['siteaccess'], $site->getGUID());
+ set_config('allow_registration', TRUE, $site->getGUID());
+ set_config('walled_garden', FALSE, $site->getGUID());
+ set_config('allow_user_default_access', '', $site->getGUID());
+
+ $this->enablePlugins();
+
+ return TRUE;
+ }
+
+ /**
+ * Enable a set of default plugins
+ *
+ * @return void
+ */
+ protected function enablePlugins() {
+ elgg_generate_plugin_entities();
+ $plugins = elgg_get_plugins('any');
+ foreach ($plugins as $plugin) {
+ if ($plugin->getManifest()) {
+ if ($plugin->getManifest()->getActivateOnInstall()) {
+ $plugin->activate();
+ }
+ }
+ }
+ }
+
+ /**
+ * Admin account support methods
+ */
+
+ /**
+ * Validate account form variables
+ *
+ * @param array $submissionVars Submitted vars
+ * @param array $formVars Form vars
+ *
+ * @return bool
+ */
+ protected function validateAdminVars($submissionVars, $formVars) {
+
+ foreach ($formVars as $field => $info) {
+ if ($info['required'] == TRUE && !$submissionVars[$field]) {
+ $name = elgg_echo("install:admin:label:$field");
+ register_error(elgg_echo('install:error:requiredfield', array($name)));
+ return FALSE;
+ }
+ }
+
+ if ($submissionVars['password1'] !== $submissionVars['password2']) {
+ register_error(elgg_echo('install:admin:password:mismatch'));
+ return FALSE;
+ }
+
+ if (trim($submissionVars['password1']) == "") {
+ register_error(elgg_echo('install:admin:password:empty'));
+ return FALSE;
+ }
+
+ $minLength = get_config('min_password_length');
+ if (strlen($submissionVars['password1']) < $minLength) {
+ register_error(elgg_echo('install:admin:password:tooshort'));
+ return FALSE;
+ }
+
+ // check that email address is email address
+ if ($submissionVars['email'] && !is_email_address($submissionVars['email'])) {
+ $msg = elgg_echo('install:error:emailaddress', array($submissionVars['email']));
+ register_error($msg);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Create a user account for the admin
+ *
+ * @param array $submissionVars Submitted vars
+ * @param bool $login Login in the admin user?
+ *
+ * @return bool
+ */
+ protected function createAdminAccount($submissionVars, $login = FALSE) {
+ global $CONFIG;
+
+ try {
+ $guid = register_user(
+ $submissionVars['username'],
+ $submissionVars['password1'],
+ $submissionVars['displayname'],
+ $submissionVars['email']
+ );
+ } catch (Exception $e) {
+ register_error($e->getMessage());
+ return false;
+ }
+
+ if (!$guid) {
+ register_error(elgg_echo('install:admin:cannot_create'));
+ return false;
+ }
+
+ $user = get_entity($guid);
+ if (!$user) {
+ register_error(elgg_echo('install:error:loadadmin'));
+ return false;
+ }
+
+ elgg_set_ignore_access(TRUE);
+ if ($user->makeAdmin() == FALSE) {
+ register_error(elgg_echo('install:error:adminaccess'));
+ } else {
+ datalist_set('admin_registered', 1);
+ }
+ elgg_set_ignore_access(false);
+
+ // add validation data to satisfy user validation plugins
+ create_metadata($guid, 'validated', TRUE, '', 0, ACCESS_PUBLIC);
+ create_metadata($guid, 'validated_method', 'admin_user', '', 0, ACCESS_PUBLIC);
+
+ if ($login) {
+ if (login($user) == FALSE) {
+ register_error(elgg_echo('install:error:adminlogin'));
+ }
+ }
+
+ return TRUE;
+ }
+}
diff --git a/install/ElggRewriteTester.php b/install/ElggRewriteTester.php
new file mode 100644
index 000000000..ab68da2b7
--- /dev/null
+++ b/install/ElggRewriteTester.php
@@ -0,0 +1,199 @@
+<?php
+
+/**
+ * Elgg RewriteTester.
+ * Test if URL rewriting is working.
+ *
+ * @package Elgg.Core
+ * @subpackage Installer
+ */
+class ElggRewriteTester {
+ protected $webserver;
+ protected $serverSupportsRemoteRead;
+ protected $rewriteTestPassed;
+ protected $htaccessIssue;
+
+ /**
+ * Set the webserver as unknown.
+ */
+ public function __construct() {
+ $this->webserver = 'unknown';
+ }
+
+ /**
+ * Run the rewrite test and return a status array
+ *
+ * @param string $url URL of rewrite test
+ * @param string $path Root directory of Elgg with trailing slash
+ *
+ * @return array
+ */
+ public function run($url, $path) {
+
+ $this->webserver = ElggRewriteTester::guessWebServer();
+
+ $this->rewriteTestPassed = $this->runRewriteTest($url);
+
+ if ($this->rewriteTestPassed == FALSE) {
+ if ($this->webserver == 'apache' || $this->webserver == 'unknown') {
+ if ($this->createHtaccess($path)) {
+ $this->rewriteTestPassed = $this->runRewriteTest($url);
+ }
+ }
+ }
+
+ return $this->returnStatus($url);
+ }
+
+ /**
+ * Guess the web server from $_SERVER['SERVER_SOFTWARE']
+ *
+ * @return string
+ */
+ public static function guessWebServer() {
+ $serverString = strtolower($_SERVER['SERVER_SOFTWARE']);
+ $possibleServers = array('apache', 'nginx', 'lighttpd', 'iis');
+ foreach ($possibleServers as $server) {
+ if (strpos($serverString, $server) !== FALSE) {
+ return $server;
+ }
+ }
+ return 'unknown';
+ }
+
+ /**
+ * Hit the rewrite test URL to determine if the rewrite rules are working
+ *
+ * @param string $url Rewrite test URL
+ *
+ * @return bool
+ */
+ protected function runRewriteTest($url) {
+
+ $this->serverSupportsRemoteRead = TRUE;
+
+ if (function_exists('curl_init')) {
+ // try curl if installed
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 10);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ $response = curl_exec($ch);
+ curl_close($ch);
+ return $response === 'success';
+ } else if (ini_get('allow_url_fopen')) {
+ // use file_get_contents as fallback
+ $response = file_get_contents($url);
+ return $response === 'success';
+ } else {
+ $this->serverSupportsRemoteRead = FALSE;
+ return FALSE;
+ }
+ }
+
+ /**
+ * Create Elgg's .htaccess file or confirm that it exists
+ *
+ * @param string $path Elgg's root directory with trailing slash
+ *
+ * @return bool
+ */
+ public function createHtaccess($path) {
+ $filename = "{$path}.htaccess";
+ if (file_exists($filename)) {
+ // check that this is the Elgg .htaccess
+ $data = file_get_contents($filename);
+ if ($data === FALSE) {
+ // don't have permission to read the file
+ $this->htaccessIssue = 'read_permission';
+ return FALSE;
+ }
+ if (strpos($data, 'Elgg') === FALSE) {
+ $this->htaccessIssue = 'non_elgg_htaccess';
+ return FALSE;
+ } else {
+ // check if this is an old Elgg htaccess
+ if (strpos($data, 'RewriteRule ^rewrite.php$ install.php') == FALSE) {
+ $this->htaccessIssue = 'old_elgg_htaccess';
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+
+ if (!is_writable($path)) {
+ $this->htaccessIssue = 'write_permission';
+ return FALSE;
+ }
+
+ // create the .htaccess file
+ $result = copy("{$path}htaccess_dist", $filename);
+ if (!$result) {
+ $this->htaccessIssue = 'cannot_copy';
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Create the status array required by the ElggInstaller
+ *
+ * @param string $url Rewrite test URL
+ *
+ * @return array
+ */
+ protected function returnStatus($url) {
+ if ($this->rewriteTestPassed) {
+ return array(
+ 'severity' => 'pass',
+ 'message' => elgg_echo('install:check:rewrite:success'),
+ );
+ }
+
+ if ($this->serverSupportsRemoteRead == FALSE) {
+ $msg = elgg_echo('install:warning:rewrite:unknown', array($url));
+ $msg .= elgg_view('install/js_rewrite_check', array('url' => $url));
+
+ return array(
+ 'severity' => 'warning',
+ 'message' => $msg,
+ );
+ }
+
+ if ($this->webserver == 'apache') {
+ $serverString = elgg_echo('install:error:rewrite:apache');
+ $msg = "$serverString\n\n";
+ if (!isset($this->htaccessIssue)) {
+ $msg .= elgg_echo('install:error:rewrite:allowoverride');
+ $msg .= elgg_view('install/js_rewrite_check', array('url' => $url));
+
+ return array(
+ 'severity' => 'failure',
+ 'message' => $msg,
+ );
+ }
+ $msg .= elgg_echo("install:error:rewrite:htaccess:{$this->htaccessIssue}");
+ return array(
+ 'severity' => 'failure',
+ 'message' => $msg,
+ );
+ }
+
+ if ($this->webserver != 'unknown') {
+ $serverString = elgg_echo("install:error:rewrite:{$this->webserver}");
+ $msg = "$serverString\n\n";
+ $msg .= elgg_echo("install:error:rewrite:altserver");
+ return array(
+ 'severity' => 'failure',
+ 'message' => $msg,
+ );
+ }
+
+ return array(
+ 'severity' => 'failure',
+ 'message' => elgg_echo('install:error:rewrite:unknown'),
+ );
+ }
+} \ No newline at end of file
diff --git a/install/cli/sample_installer.php b/install/cli/sample_installer.php
new file mode 100644
index 000000000..a51f9aae4
--- /dev/null
+++ b/install/cli/sample_installer.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Sample cli installer script
+ */
+
+// change to true to run this script. Change back to false when done.
+$enabled = false;
+
+// none of the following may be empty
+$params = array(
+ // database parameters
+ 'dbuser' => '',
+ 'dbpassword' => '',
+ 'dbname' => '',
+
+ // site settings
+ 'sitename' => '',
+ 'siteemail' => '',
+ 'wwwroot' => '',
+ 'dataroot' => '',
+
+ // admin account
+ 'displayname' => '',
+ 'email' => '',
+ 'username' => '',
+ 'password' => '',
+);
+
+
+// Do not edit below this line. //////////////////////////////
+
+
+if (!$enabled) {
+ echo "To enable this script, change \$enabled to true.\n";
+ echo "You *must* disable this script after a successful installation.\n";
+ exit;
+}
+
+if (PHP_SAPI !== 'cli') {
+ echo "You must use the command line to run this script.";
+ exit;
+}
+
+require_once(dirname(dirname(__FILE__)) . "/ElggInstaller.php");
+
+$installer = new ElggInstaller();
+
+// install and create the .htaccess file
+$installer->batchInstall($params, TRUE);
+
+// at this point installation has completed (otherwise an exception halted execution).
+// try to rewrite the script to disable it.
+if (is_writable(__FILE__)) {
+ $code = file_get_contents(__FILE__);
+ if (preg_match('~\\$enabled\\s*=\\s*(true|1)\\s*;~i', $code)) {
+ // looks safe to rewrite
+ $code = preg_replace('~\\$enabled\\s*=\\s*(true|1)\\s*;~i', '$enabled = false;', $code);
+ file_put_contents(__FILE__, $code);
+
+ echo "\nNote: This script has been disabled for your safety.\n";
+ exit;
+ }
+}
+
+echo "\nWarning: You *must* disable this script by setting \$enabled = false;.\n";
+echo "Leaving this script enabled could endanger your installation.\n";
diff --git a/install/css/install.css b/install/css/install.css
new file mode 100644
index 000000000..e7290c130
--- /dev/null
+++ b/install/css/install.css
@@ -0,0 +1,295 @@
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 100%;
+ font-family: inherit;
+ vertical-align: baseline;
+}
+
+body {
+ color: #333333;
+ background: #4690d6;
+ font-size: 80%;
+ font-family: "Lucida Grande",Arial,Tahoma,Verdana,sans-serif;
+ text-align: left;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+}
+h1 { font-size: 1.8em; }
+h2 { font-size: 1.5em; }
+h3 { font-size: 1.2em; }
+h4 { font-size: 1.0em; }
+h5 { font-size: 0.9em; }
+h6 { font-size: 0.8em; }
+
+a {
+ color: #4690d6;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #0054a7;
+ text-decoration: underline;
+}
+
+p {
+ margin: 0px 0px 15px 0;
+}
+
+img {
+ border: none;
+}
+
+h2 {
+ border-bottom: 1px solid #555555;
+ margin-bottom: 20px;
+}
+
+ul {
+ list-style: none;
+}
+
+.elgg-page {
+ width: 880px;
+ margin: auto;
+ margin-top: 20px;
+}
+.elgg-page-header {
+ border-right: 1px solid #666666;
+ padding: 15px 50px 10px;
+ background: white;
+}
+.elgg-page-body {
+ border-bottom: 1px solid #666666;
+ border-right: 1px solid #666666;
+ padding: 0 40px 5px;
+ background: white;
+}
+
+.elgg-page-body:after,
+.elgg-page-header:after {
+ display: block;
+ content: '.';
+ line-height: 0;
+ height: 0;
+ visibility: hidden;
+ clear: both;
+}
+
+.elgg-sidebar {
+ float: left;
+ width: 250px;
+}
+.elgg-body {
+ overflow: hidden;
+ min-height: 320px;
+ padding-bottom: 10px;
+ position: relative;
+}
+.elgg-page-footer {
+ width: 800px;
+ height: 20px;
+ clear: both;
+ padding: 10px 20px 0 20px;
+ margin: auto;
+ margin-bottom: 40px;
+}
+
+.elgg-install-nav {
+ width: 100%;
+ text-align: right;
+ position: absolute;
+ bottom: 0px;
+}
+
+.elgg-page-footer a {
+ color: white;
+}
+
+.elgg-page-footer li {
+ float: left;
+ list-style: none;
+ margin-right: 20px;
+}
+
+.elgg-sidebar ol {
+ padding-left: 30px;
+}
+
+.elgg-sidebar li {
+ font-size: 1.2em;
+ margin-bottom: 5px;
+}
+
+.past {
+ text-decoration: line-through;
+}
+.present {
+ font-weight: bold;
+}
+
+.future {
+ color: #cccccc;
+}
+
+h3 {
+ margin: 15px 0 5px;
+}
+
+form > div {
+ margin-bottom: 15px;
+}
+label {
+ font-weight: bold;
+ color: #333333;
+ font-size: 140%;
+}
+.elgg-combo-label {
+ font-size: 120%;
+}
+input[type="text"],
+input[type="password"] {
+ font: 120% Arial, Helvetica, sans-serif;
+ padding: 5px;
+ border: 1px solid #cccccc;
+ color: #666666;
+ width: 96%;
+}
+.database-settings input[type="text"],
+.database-settings input[type="password"] {
+ width: 220px;
+}
+input[type="password"]:focus, input[type="text"]:focus {
+ border: solid 1px #4690d6;
+ background: #e4ecf5;
+ color: #333333;
+}
+input[type="submit"] {
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 16px;
+ font-weight: bold;
+ color: #fff;
+ background: #4690d6;
+ border: 4px solid #4690d6;
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+
+ width: auto;
+ height: 35px;
+ padding: 2px 6px;
+ margin: 10px 0;
+ cursor: pointer;
+ float: right;
+}
+input[type="submit"]:hover {
+ background: #0054a7;
+ border: 4px solid #0054a7;
+}
+select {
+ display: block;
+ padding: 5px;
+}
+
+.install-help {
+ font-size: 90%;
+}
+
+.elgg-require-database {
+ padding-bottom: 50px;
+}
+
+.elgg-install-nav a {
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 16px;
+ font-weight: bold;
+ color: #ffffff;
+ background: #4690d6;
+ border: 4px solid #4690d6;
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+
+ padding: 2px 9px;
+ margin: 10px;
+ cursor: pointer;
+ float: right;
+}
+
+.elgg-install-nav a:hover {
+ text-decoration: none;
+ background: #0054a7;
+ border: 4px solid #0054a7;
+}
+.elgg-install-nav .elgg-state-disabled,
+.elgg-install-nav .elgg-state-disabled:hover {
+ background: #555555;
+ border-color: #555555;
+ cursor: default;
+}
+
+.elgg-system-messages li {
+ padding: 3px 10px 3px 10px;
+ margin-bottom: 20px;
+}
+
+.elgg-state-success {
+ border: 1px solid #00cc00;
+ background: #ccffcc;
+}
+
+.elgg-state-error {
+ border: 1px solid #D3322A;
+ background: #F7DAD8;
+}
+
+.elgg-state-warning {
+ border: 1px solid #ded0a9;
+ background: #FEF5AA;
+}
+
+.elgg-body li {
+ margin-top: 5px;
+ padding: 5px;
+}
+
+.pass {
+ border: 1px solid #00cc00;
+ background: #ccffcc;
+}
+
+.warning {
+ border: 1px solid #ded0a9;
+ background: #FEF5AA;
+}
+
+.failure {
+ border: 1px solid #D3322A;
+ background: #F7DAD8;
+}
+
+.info {
+ border: 1px solid #aaaaaa;
+ background: #ffffff;
+}
+
+.messages {
+ padding: 3px 10px 3px 10px;
+ margin: 20px 0px 10px 0px;
+ width: 95%;
+} \ No newline at end of file
diff --git a/install/js/install.js b/install/js/install.js
new file mode 100644
index 000000000..37e5b0dc3
--- /dev/null
+++ b/install/js/install.js
@@ -0,0 +1,42 @@
+
+$(function() {
+ // prevent double-submission of forms
+ $('form').submit(function() {
+ if ($(this).data('submitted')) {
+ return false;
+ }
+ $(this).data('submitted', true);
+ return true;
+ });
+
+ // toggle the disable attribute of text box based on checkbox
+ $('.elgg-combo-checkbox').click(function() {
+ if ($(this).is(':checked')) {
+ $(this).prev().attr('disabled', true);
+ $(this).prev().val('');
+ } else {
+ $(this).prev().attr('disabled', false);
+ }
+ });
+});
+
+elgg = {
+ installer: {}
+};
+
+/**
+ * Check the rewrite address for "success" and then allows the installation to proceed.
+ */
+elgg.installer.rewriteTest = function(url, success_msg, nextURL) {
+ $.ajax(url, {
+ success: function(data, status, xhr) {
+ if (data == 'success') {
+ $('.elgg-require-rewrite li').attr('class', 'pass');
+ $('.elgg-require-rewrite li').html('<p>' + success_msg + '</p>');
+ $('.elgg-install-nav a.elgg-state-disabled')
+ .removeClass('elgg-state-disabled')
+ .attr('href', nextURL);
+ }
+ }
+ });
+}
diff --git a/install/languages/en.php b/install/languages/en.php
new file mode 100644
index 000000000..531379b1e
--- /dev/null
+++ b/install/languages/en.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * Installer English Language
+ *
+ * @package ElggLanguage
+ * @subpackage Installer
+ */
+
+$english = array(
+ 'install:title' => 'Elgg Install',
+ 'install:welcome' => 'Welcome',
+ 'install:requirements' => 'Requirements check',
+ 'install:database' => 'Database installation',
+ 'install:settings' => 'Configure site',
+ 'install:admin' => 'Create admin account',
+ 'install:complete' => 'Finished',
+
+ 'install:next' => 'Next',
+ 'install:refresh' => 'Refresh',
+
+ 'install:welcome:instructions' => "Installing Elgg has 6 simple steps and reading this welcome is the first one!
+
+If you haven't already, read through the installation instructions included with Elgg (or click the instructions link at the bottom of the page).
+
+If you are ready to proceed, click the Next button.",
+ 'install:requirements:instructions:success' => "Your server passed the requirement checks.",
+ 'install:requirements:instructions:failure' => "Your server failed the requirements check. After you have fixed the below issues, refresh this page. Check the troubleshooting links at the bottom of this page if you need further assistance.",
+ 'install:requirements:instructions:warning' => "Your server passed the requirements check, but there is at least one warning. We recommend that you check the install troubleshooting page for more details.",
+
+ 'install:require:php' => 'PHP',
+ 'install:require:rewrite' => 'Web server',
+ 'install:require:settings' => 'Settings file',
+ 'install:require:database' => 'Database',
+
+ 'install:check:root' => 'Your web server does not have permission to create an .htaccess file in the root directory of Elgg. You have two choices:
+
+ 1. Change the permissions on the root directory
+
+ 2. Copy the file htaccess_dist to .htaccess',
+
+ 'install:check:php:version' => 'Elgg requires PHP %s or above. This server is using version %s.',
+ 'install:check:php:extension' => 'Elgg requires the PHP extension %s.',
+ 'install:check:php:extension:recommend' => 'It is recommended that the PHP extension %s is installed.',
+ 'install:check:php:open_basedir' => 'The open_basedir PHP directive may prevent Elgg from saving files to its data directory.',
+ 'install:check:php:safe_mode' => 'Running PHP in safe mode is not recommened and may cause problems with Elgg.',
+ 'install:check:php:arg_separator' => 'arg_separator.output must be & for Elgg to work and your server\'s value is %s',
+ 'install:check:php:register_globals' => 'Register globals must be turned off.',
+ 'install:check:php:session.auto_start' => "session.auto_start must be off for Elgg to work. Either change the configuration of your server or add this directive to Elgg's .htaccess file.",
+
+ 'install:check:enginedir' => 'Your web server does not have permission to create the settings.php file in the engine directory. You have two choices:
+
+ 1. Change the permissions on the engine directory
+
+ 2. Copy the file settings.example.php to settings.php and follow the instructions in it for setting your database parameters.',
+ 'install:check:readsettings' => 'A settings file exists in the engine directory, but the web server cannot read it. You can delete the file or change the read permissions on it.',
+
+ 'install:check:php:success' => "Your server's PHP satisfies all of Elgg's requirements.",
+ 'install:check:rewrite:success' => 'The test of the rewrite rules was successful.',
+ 'install:check:database' => 'The database requirements are checked when Elgg loads its database.',
+
+ 'install:database:instructions' => "If you haven't already created a database for Elgg, do that now. Then fill in the values below to initialize the Elgg database.",
+ 'install:database:error' => 'There was an error creating the Elgg database and installation cannot continue. Review the message above and correct any problems. If you need more help, visit the Install troubleshooting link below or post to the Elgg community forums.',
+
+ 'install:database:label:dbuser' => 'Database Username',
+ 'install:database:label:dbpassword' => 'Database Password',
+ 'install:database:label:dbname' => 'Database Name',
+ 'install:database:label:dbhost' => 'Database Host',
+ 'install:database:label:dbprefix' => 'Database Table Prefix',
+
+ 'install:database:help:dbuser' => 'User that has full privileges to the MySQL database that you created for Elgg',
+ 'install:database:help:dbpassword' => 'Password for the above database user account',
+ 'install:database:help:dbname' => 'Name of the Elgg database',
+ 'install:database:help:dbhost' => 'Hostname of the MySQL server (usually localhost)',
+ 'install:database:help:dbprefix' => "The prefix given to all of Elgg's tables (usually elgg_)",
+
+ 'install:settings:instructions' => 'We need some information about the site as we configure Elgg. If you haven\'t <a href="http://docs.elgg.org/wiki/Data_directory" target="_blank">created a data directory</a> for Elgg, you need to do so now.',
+
+ 'install:settings:label:sitename' => 'Site Name',
+ 'install:settings:label:siteemail' => 'Site Email Address',
+ 'install:settings:label:wwwroot' => 'Site URL',
+ 'install:settings:label:path' => 'Elgg Install Directory',
+ 'install:settings:label:dataroot' => 'Data Directory',
+ 'install:settings:label:language' => 'Site Language',
+ 'install:settings:label:siteaccess' => 'Default Site Access',
+ 'install:label:combo:dataroot' => 'Elgg creates data directory',
+
+ 'install:settings:help:sitename' => 'The name of your new Elgg site',
+ 'install:settings:help:siteemail' => 'Email address used by Elgg for communication with users',
+ 'install:settings:help:wwwroot' => 'The address of the site (Elgg usually guesses this correctly)',
+ 'install:settings:help:path' => 'The directory where you put the Elgg code (Elgg usually guesses this correctly)',
+ 'install:settings:help:dataroot' => 'The directory that you created for Elgg to save files (the permissions on this directory are checked when you click Next). It must be an absolute path.',
+ 'install:settings:help:dataroot:apache' => 'You have the option of Elgg creating the data directory or entering the directory that you already created for storing user files (the permissions on this directory are checked when you click Next)',
+ 'install:settings:help:language' => 'The default language for the site',
+ 'install:settings:help:siteaccess' => 'The default access level for new user created content',
+
+ 'install:admin:instructions' => "It is now time to create an administrator's account.",
+
+ 'install:admin:label:displayname' => 'Display Name',
+ 'install:admin:label:email' => 'Email Address',
+ 'install:admin:label:username' => 'Username',
+ 'install:admin:label:password1' => 'Password',
+ 'install:admin:label:password2' => 'Password Again',
+
+ 'install:admin:help:displayname' => 'The name that is displayed on the site for this account',
+ 'install:admin:help:email' => '',
+ 'install:admin:help:username' => 'Account username used for logging in',
+ 'install:admin:help:password1' => "Account password must be at least %u characters long",
+ 'install:admin:help:password2' => 'Retype password to confirm',
+
+ 'install:admin:password:mismatch' => 'Password must match.',
+ 'install:admin:password:empty' => 'Password cannot be empty.',
+ 'install:admin:password:tooshort' => 'Your password was too short',
+ 'install:admin:cannot_create' => 'Unable to create an admin account.',
+
+ 'install:complete:instructions' => 'Your Elgg site is now ready to be used. Click the button below to be taken to your site.',
+ 'install:complete:gotosite' => 'Go to site',
+
+ 'InstallationException:UnknownStep' => '%s is an unknown installation step.',
+
+ 'install:success:database' => 'Database has been installed.',
+ 'install:success:settings' => 'Site settings have been saved.',
+ 'install:success:admin' => 'Admin account has been created.',
+
+ 'install:error:htaccess' => 'Unable to create an .htaccess',
+ 'install:error:settings' => 'Unable to create the settings file',
+ 'install:error:databasesettings' => 'Unable to connect to the database with these settings.',
+ 'install:error:database_prefix' => 'Invalid characters in database prefix',
+ 'install:error:oldmysql' => 'MySQL must be version 5.0 or above. Your server is using %s.',
+ 'install:error:nodatabase' => 'Unable to use database %s. It may not exist.',
+ 'install:error:cannotloadtables' => 'Cannot load the database tables',
+ 'install:error:tables_exist' => 'There are already Elgg tables in the database. You need to either drop those tables or restart the installer and we will attempt to use them. To restart the installer, remove \'?step=database\' from the URL in your browser\'s address bar and press Enter.',
+ 'install:error:readsettingsphp' => 'Unable to read engine/settings.example.php',
+ 'install:error:writesettingphp' => 'Unable to write engine/settings.php',
+ 'install:error:requiredfield' => '%s is required',
+ 'install:error:relative_path' => 'We don\'t think "%s" is an absolute path for your data directory',
+ 'install:error:datadirectoryexists' => 'Your data directory %s does not exist.',
+ 'install:error:writedatadirectory' => 'Your data directory %s is not writable by the web server.',
+ 'install:error:locationdatadirectory' => 'Your data directory %s must be outside of your install path for security.',
+ 'install:error:emailaddress' => '%s is not a valid email address',
+ 'install:error:createsite' => 'Unable to create the site.',
+ 'install:error:savesitesettings' => 'Unable to save site settings',
+ 'install:error:loadadmin' => 'Unable to load admin user.',
+ 'install:error:adminaccess' => 'Unable to give new user account admin privileges.',
+ 'install:error:adminlogin' => 'Unable to login the new admin user automatically.',
+ 'install:error:rewrite:apache' => 'We think your server is running the Apache web server.',
+ 'install:error:rewrite:nginx' => 'We think your server is running the Nginx web server.',
+ 'install:error:rewrite:lighttpd' => 'We think your server is running the Lighttpd web server.',
+ 'install:error:rewrite:iis' => 'We think your server is running the IIS web server.',
+ 'install:error:rewrite:allowoverride' => "The rewrite test failed and the most likely cause is that AllowOverride is not set to All for Elgg's directory. This prevents Apache from processing the .htaccess file which contains the rewrite rules.
+ \n\nA less likely cause is Apache is configured with an alias for your Elgg directory and you need to set the RewriteBase in your .htaccess. There are further instructions in the .htaccess file in your Elgg directory.",
+ 'install:error:rewrite:htaccess:write_permission' => 'Your web server does not have permission to create the .htaccess file in Elgg\'s directory. You need to manually copy htaccess_dist to .htaccess or change the permissions on the directory.',
+ 'install:error:rewrite:htaccess:read_permission' => 'There is an .htaccess file in Elgg\'s directory, but your web server does not have permission to read it.',
+ 'install:error:rewrite:htaccess:non_elgg_htaccess' => 'There is an .htaccess file in Elgg\'s directory that was not not created by Elgg. Please remove it.',
+ 'install:error:rewrite:htaccess:old_elgg_htaccess' => 'There appears to be an old Elgg .htaccess file in Elgg\'s directory. It does not contain the rewrite rule for testing the web server.',
+ 'install:error:rewrite:htaccess:cannot_copy' => 'A unknown error occurred while creating the .htaccess file. You need to manually copy htaccess_dist to .htaccess in Elgg\'s directory.',
+ 'install:error:rewrite:altserver' => 'The rewrite rules test failed. You need to configure your web server with Elgg\'s rewrite rules and try again.',
+ 'install:error:rewrite:unknown' => 'Oof. We couldn\'t figure out what kind of web server is running on your server and it failed the rewrite rules. We cannot offer any specific advice. Please check the troubleshooting link.',
+ 'install:warning:rewrite:unknown' => 'Your server does not support automatic testing of the rewrite rules and your browser does not support checking via JavaScript. You can continue the installation, but you may experience problems with your site. You can manually test the rewrite rules by clicking this link: <a href="%s" target="_blank">test</a>. You will see the word success if the rules are working.',
+);
+
+add_translation("en", $english);
diff --git a/js/classes/ElggEntity.js b/js/classes/ElggEntity.js
new file mode 100644
index 000000000..9461a463f
--- /dev/null
+++ b/js/classes/ElggEntity.js
@@ -0,0 +1,20 @@
+/**
+ * Create a new ElggEntity
+ *
+ * @class Represents an ElggEntity
+ * @property {number} guid
+ * @property {string} type
+ * @property {string} subtype
+ * @property {number} owner_guid
+ * @property {number} site_guid
+ * @property {number} container_guid
+ * @property {number} access_id
+ * @property {number} time_created
+ * @property {number} time_updated
+ * @property {number} last_action
+ * @property {string} enabled
+ *
+ */
+elgg.ElggEntity = function(o) {
+ $.extend(this, o);
+}; \ No newline at end of file
diff --git a/js/classes/ElggPriorityList.js b/js/classes/ElggPriorityList.js
new file mode 100644
index 000000000..b4cec5044
--- /dev/null
+++ b/js/classes/ElggPriorityList.js
@@ -0,0 +1,92 @@
+/**
+ * Priority lists allow you to create an indexed list that can be iterated through in a specific
+ * order.
+ */
+elgg.ElggPriorityList = function() {
+ this.length = 0;
+ this.priorities_ = [];
+};
+
+/**
+ * Inserts an element into the priority list at the priority specified.
+ *
+ * @param {Object} obj The object to insert
+ * @param {Number} opt_priority An optional priority to insert at.
+ *
+ * @return {Void}
+ */
+elgg.ElggPriorityList.prototype.insert = function(obj, opt_priority) {
+ var priority = 500;
+ if (arguments.length == 2 && opt_priority != undefined) {
+ priority = parseInt(opt_priority, 10);
+ }
+
+ priority = Math.max(priority, 0);
+
+ if (elgg.isUndefined(this.priorities_[priority])) {
+ this.priorities_[priority] = [];
+ }
+
+ this.priorities_[priority].push(obj);
+ this.length++;
+};
+
+/**
+ * Iterates through each element in order.
+ *
+ * Unlike every, this ignores the return value of the callback.
+ *
+ * @param {Function} callback The callback function to pass each element through. See
+ * Array.prototype.every() for details.
+ * @return {Object}
+ */
+elgg.ElggPriorityList.prototype.forEach = function(callback) {
+ elgg.assertTypeOf('function', callback);
+
+ var index = 0;
+
+ this.priorities_.forEach(function(elems) {
+ elems.forEach(function(elem) {
+ callback(elem, index++);
+ });
+ });
+
+ return this;
+};
+
+/**
+ * Iterates through each element in order.
+ *
+ * Unlike forEach, this returns the value of the callback and will break on false.
+ *
+ * @param {Function} callback The callback function to pass each element through. See
+ * Array.prototype.every() for details.
+ * @return {Object}
+ */
+elgg.ElggPriorityList.prototype.every = function(callback) {
+ elgg.assertTypeOf('function', callback);
+
+ var index = 0;
+
+ return this.priorities_.every(function(elems) {
+ return elems.every(function(elem) {
+ return callback(elem, index++);
+ });
+ });
+};
+
+/**
+ * Removes an element from the priority list
+ *
+ * @param {Object} obj The object to remove.
+ * @return {Void}
+ */
+elgg.ElggPriorityList.prototype.remove = function(obj) {
+ this.priorities_.forEach(function(elems) {
+ var index;
+ while ((index = elems.indexOf(obj)) !== -1) {
+ elems.splice(index, 1);
+ this.length--;
+ }
+ });
+}; \ No newline at end of file
diff --git a/js/classes/ElggUser.js b/js/classes/ElggUser.js
new file mode 100644
index 000000000..b8a976fba
--- /dev/null
+++ b/js/classes/ElggUser.js
@@ -0,0 +1,28 @@
+/**
+ * Create a new ElggUser
+ *
+ * @param {Object} o
+ * @extends ElggEntity
+ * @class Represents an ElggUser
+ * @property {string} name
+ * @property {string} username
+ * @property {string} language
+ * @property {boolean} admin
+ */
+elgg.ElggUser = function(o) {
+ elgg.ElggEntity.call(this, o);
+};
+
+elgg.inherit(elgg.ElggUser, elgg.ElggEntity);
+
+/**
+ * Is this user an admin?
+ *
+ * @warning The admin state of the user should be checked on the server for any
+ * actions taken that require admin privileges.
+ *
+ * @return {boolean}
+ */
+elgg.ElggUser.prototype.isAdmin = function() {
+ return this.admin;
+}; \ No newline at end of file
diff --git a/js/lib/ajax.js b/js/lib/ajax.js
new file mode 100644
index 000000000..b3f39cc42
--- /dev/null
+++ b/js/lib/ajax.js
@@ -0,0 +1,242 @@
+/*globals elgg, $*/
+elgg.provide('elgg.ajax');
+
+/**
+ * @author Evan Winslow
+ * Provides a bunch of useful shortcut functions for making ajax calls
+ */
+
+/**
+ * Wrapper function for jQuery.ajax which ensures that the url being called
+ * is relative to the elgg site root.
+ *
+ * You would most likely use elgg.get or elgg.post, rather than this function
+ *
+ * @param {string} url Optionally specify the url as the first argument
+ * @param {Object} options Optional. {@see jQuery#ajax}
+ * @return {XmlHttpRequest}
+ */
+elgg.ajax = function(url, options) {
+ options = elgg.ajax.handleOptions(url, options);
+
+ options.url = elgg.normalize_url(options.url);
+ return $.ajax(options);
+};
+/**
+ * @const
+ */
+elgg.ajax.SUCCESS = 0;
+
+/**
+ * @const
+ */
+elgg.ajax.ERROR = -1;
+
+/**
+ * Handle optional arguments and return the resulting options object
+ *
+ * @param url
+ * @param options
+ * @return {Object}
+ * @private
+ */
+elgg.ajax.handleOptions = function(url, options) {
+ var data_only = true,
+ data,
+ member;
+
+ //elgg.ajax('example/file.php', {...});
+ if (elgg.isString(url)) {
+ options = options || {};
+
+ //elgg.ajax({...});
+ } else {
+ options = url || {};
+ url = options.url;
+ }
+
+ //elgg.ajax('example/file.php', function() {...});
+ if (elgg.isFunction(options)) {
+ data_only = false;
+ options = {success: options};
+ }
+
+ //elgg.ajax('example/file.php', {data:{...}});
+ if (options.data) {
+ data_only = false;
+ } else {
+ for (member in options) {
+ //elgg.ajax('example/file.php', {callback:function(){...}});
+ if (elgg.isFunction(options[member])) {
+ data_only = false;
+ }
+ }
+ }
+
+ //elgg.ajax('example/file.php', {notdata:notfunc});
+ if (data_only) {
+ data = options;
+ options = {data: data};
+ }
+
+ if (url) {
+ options.url = url;
+ }
+
+ return options;
+};
+
+/**
+ * Wrapper function for elgg.ajax which forces the request type to 'get.'
+ *
+ * @param {string} url Optionally specify the url as the first argument
+ * @param {Object} options {@see jQuery#ajax}
+ * @return {XmlHttpRequest}
+ */
+elgg.get = function(url, options) {
+ options = elgg.ajax.handleOptions(url, options);
+
+ options.type = 'get';
+ return elgg.ajax(options);
+};
+
+/**
+ * Wrapper function for elgg.get which forces the dataType to 'json.'
+ *
+ * @param {string} url Optionally specify the url as the first argument
+ * @param {Object} options {@see jQuery#ajax}
+ * @return {XmlHttpRequest}
+ */
+elgg.getJSON = function(url, options) {
+ options = elgg.ajax.handleOptions(url, options);
+
+ options.dataType = 'json';
+ return elgg.get(options);
+};
+
+/**
+ * Wrapper function for elgg.ajax which forces the request type to 'post.'
+ *
+ * @param {string} url Optionally specify the url as the first argument
+ * @param {Object} options {@see jQuery#ajax}
+ * @return {XmlHttpRequest}
+ */
+elgg.post = function(url, options) {
+ options = elgg.ajax.handleOptions(url, options);
+
+ options.type = 'post';
+ return elgg.ajax(options);
+};
+
+/**
+ * Perform an action via ajax
+ *
+ * @example Usage 1:
+ * At its simplest, only the action name is required (and anything more than the
+ * action name will be invalid).
+ * <pre>
+ * elgg.action('name/of/action');
+ * </pre>
+ *
+ * The action can be relative to the current site ('name/of/action') or
+ * the full URL of the action ('http://elgg.org/action/name/of/action').
+ *
+ * @example Usage 2:
+ * If you want to pass some data along with it, use the second parameter
+ * <pre>
+ * elgg.action('friend/add', { friend: some_guid });
+ * </pre>
+ *
+ * @example Usage 3:
+ * Of course, you will have no control over what happens when the request
+ * completes if you do it like that, so there's also the most verbose method
+ * <pre>
+ * elgg.action('friend/add', {
+ * data: {
+ * friend: some_guid
+ * },
+ * success: function(json) {
+ * //do something
+ * },
+ * }
+ * </pre>
+ * You can pass any of your favorite $.ajax arguments into this second parameter.
+ *
+ * @note If you intend to use the second field in the "verbose" way, you must
+ * specify a callback method or the data parameter. If you do not, elgg.action
+ * will think you mean to send the second parameter as data.
+ *
+ * @note You do not have to add security tokens to this request. Elgg does that
+ * for you automatically.
+ *
+ * @see jQuery.ajax
+ *
+ * @param {String} action The action to call.
+ * @param {Object} options
+ * @return {XMLHttpRequest}
+ */
+elgg.action = function(action, options) {
+ elgg.assertTypeOf('string', action);
+
+ // support shortcut and full URLs
+ // this will mangle URLs that aren't elgg actions.
+ // Use post, get, or ajax for those.
+ if (action.indexOf('action/') < 0) {
+ action = 'action/' + action;
+ }
+
+ options = elgg.ajax.handleOptions(action, options);
+
+ // This is a misuse of elgg.security.addToken() because it is not always a
+ // full query string with a ?. As such we need a special check for the tokens.
+ if (!elgg.isString(options.data) || options.data.indexOf('__elgg_ts') == -1) {
+ options.data = elgg.security.addToken(options.data);
+ }
+ options.dataType = 'json';
+
+ //Always display system messages after actions
+ var custom_success = options.success || elgg.nullFunction;
+ options.success = function(json, two, three, four) {
+ if (json && json.system_messages) {
+ elgg.register_error(json.system_messages.error);
+ elgg.system_message(json.system_messages.success);
+ }
+
+ custom_success(json, two, three, four);
+ };
+
+ return elgg.post(options);
+};
+
+/**
+ * Make an API call
+ *
+ * @example Usage:
+ * <pre>
+ * elgg.api('system.api.list', {
+ * success: function(data) {
+ * console.log(data);
+ * }
+ * });
+ * </pre>
+ *
+ * @param {String} method The API method to be called
+ * @param {Object} options {@see jQuery#ajax}
+ * @return {XmlHttpRequest}
+ */
+elgg.api = function (method, options) {
+ elgg.assertTypeOf('string', method);
+
+ var defaults = {
+ dataType: 'json',
+ data: {}
+ };
+
+ options = elgg.ajax.handleOptions(method, options);
+ options = $.extend(defaults, options);
+
+ options.url = 'services/api/rest/' + options.dataType + '/';
+ options.data.method = method;
+
+ return elgg.ajax(options);
+};
diff --git a/js/lib/configuration.js b/js/lib/configuration.js
new file mode 100644
index 000000000..6e221c957
--- /dev/null
+++ b/js/lib/configuration.js
@@ -0,0 +1,10 @@
+elgg.provide('elgg.config');
+
+/**
+ * Returns the current site URL
+ *
+ * @return {String} The site URL.
+ */
+elgg.get_site_url = function() {
+ return elgg.config.wwwroot;
+}; \ No newline at end of file
diff --git a/js/lib/elgglib.js b/js/lib/elgglib.js
new file mode 100644
index 000000000..a8e187f1d
--- /dev/null
+++ b/js/lib/elgglib.js
@@ -0,0 +1,563 @@
+/**
+ * @namespace Singleton object for holding the Elgg javascript library
+ */
+var elgg = elgg || {};
+
+/**
+ * Pointer to the global context
+ *
+ * @see elgg.require
+ * @see elgg.provide
+ */
+elgg.global = this;
+
+/**
+ * Convenience reference to an empty function.
+ *
+ * Save memory by not generating multiple empty functions.
+ */
+elgg.nullFunction = function() {};
+
+/**
+ * This forces an inheriting class to implement the method or
+ * it will throw an error.
+ *
+ * @example
+ * AbstractClass.prototype.toBeImplemented = elgg.abstractMethod;
+ */
+elgg.abstractMethod = function() {
+ throw new Error("Oops... you forgot to implement an abstract method!");
+};
+
+/**
+ * Merges two or more objects together and returns the result.
+ */
+elgg.extend = jQuery.extend;
+
+/**
+ * Check if the value is an array.
+ *
+ * No sense in reinventing the wheel!
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isArray = jQuery.isArray;
+
+/**
+ * Check if the value is a function.
+ *
+ * No sense in reinventing the wheel!
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isFunction = jQuery.isFunction;
+
+/**
+ * Check if the value is a "plain" object (i.e., created by {} or new Object())
+ *
+ * No sense in reinventing the wheel!
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isPlainObject = jQuery.isPlainObject;
+
+/**
+ * Check if the value is a string
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isString = function(val) {
+ return typeof val === 'string';
+};
+
+/**
+ * Check if the value is a number
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isNumber = function(val) {
+ return typeof val === 'number';
+};
+
+/**
+ * Check if the value is an object
+ *
+ * @note This returns true for functions and arrays! If you want to return true only
+ * for "plain" objects (created using {} or new Object()) use elgg.isPlainObject.
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isObject = function(val) {
+ return typeof val === 'object';
+};
+
+/**
+ * Check if the value is undefined
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isUndefined = function(val) {
+ return val === undefined;
+};
+
+/**
+ * Check if the value is null
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isNull = function(val) {
+ return val === null;
+};
+
+/**
+ * Check if the value is either null or undefined
+ *
+ * @param {*} val
+ *
+ * @return boolean
+ */
+elgg.isNullOrUndefined = function(val) {
+ return val == null;
+};
+
+/**
+ * Throw an exception of the type doesn't match
+ *
+ * @todo Might be more appropriate for debug mode only?
+ */
+elgg.assertTypeOf = function(type, val) {
+ if (typeof val !== type) {
+ throw new TypeError("Expecting param of " +
+ arguments.caller + "to be a(n) " + type + "." +
+ " Was actually a(n) " + typeof val + ".");
+ }
+};
+
+/**
+ * Throw an error if the required package isn't present
+ *
+ * @param {String} pkg The required package (e.g., 'elgg.package')
+ */
+elgg.require = function(pkg) {
+ elgg.assertTypeOf('string', pkg);
+
+ var parts = pkg.split('.'),
+ cur = elgg.global,
+ part, i;
+
+ for (i = 0; i < parts.length; i += 1) {
+ part = parts[i];
+ cur = cur[part];
+ if (elgg.isUndefined(cur)) {
+ throw new Error("Missing package: " + pkg);
+ }
+ }
+};
+
+/**
+ * Generate the skeleton for a package.
+ *
+ * <pre>
+ * elgg.provide('elgg.package.subpackage');
+ * </pre>
+ *
+ * is equivalent to
+ *
+ * <pre>
+ * elgg = elgg || {};
+ * elgg.package = elgg.package || {};
+ * elgg.package.subpackage = elgg.package.subpackage || {};
+ * </pre>
+ *
+ * @example elgg.provide('elgg.config.translations')
+ *
+ * @param {string} pkg The package name.
+ */
+elgg.provide = function(pkg, opt_context) {
+ elgg.assertTypeOf('string', pkg);
+
+ var parts = pkg.split('.'),
+ context = opt_context || elgg.global,
+ part, i;
+
+
+ for (i = 0; i < parts.length; i += 1) {
+ part = parts[i];
+ context[part] = context[part] || {};
+ context = context[part];
+ }
+};
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * @example
+ * <pre>
+ * function ParentClass(a, b) { }
+ *
+ * ParentClass.prototype.foo = function(a) { alert(a); }
+ *
+ * function ChildClass(a, b, c) {
+ * //equivalent of parent::__construct(a, b); in PHP
+ * ParentClass.call(this, a, b);
+ * }
+ *
+ * elgg.inherit(ChildClass, ParentClass);
+ *
+ * var child = new ChildClass('a', 'b', 'see');
+ * child.foo('boo!'); // alert('boo!');
+ * </pre>
+ *
+ * @param {Function} Child Child class constructor.
+ * @param {Function} Parent Parent class constructor.
+ */
+elgg.inherit = function(Child, Parent) {
+ Child.prototype = new Parent();
+ Child.prototype.constructor = Child;
+};
+
+/**
+ * Converts shorthand urls to absolute urls.
+ *
+ * If the url is already absolute or protocol-relative, no change is made.
+ *
+ * elgg.normalize_url(''); // 'http://my.site.com/'
+ * elgg.normalize_url('dashboard'); // 'http://my.site.com/dashboard'
+ * elgg.normalize_url('http://google.com/'); // no change
+ * elgg.normalize_url('//google.com/'); // no change
+ *
+ * @param {String} url The url to normalize
+ * @return {String} The extended url
+ * @private
+ */
+elgg.normalize_url = function(url) {
+ url = url || '';
+ elgg.assertTypeOf('string', url);
+
+ validated = (function(url) {
+ url = elgg.parse_url(url);
+ if (url.scheme){
+ url.scheme = url.scheme.toLowerCase();
+ }
+ if (url.scheme == 'http' || url.scheme == 'https') {
+ if (!url.host) {
+ return false;
+ }
+ /* hostname labels may contain only alphanumeric characters, dots and hypens. */
+ if (!(new RegExp("^([a-zA-Z0-9][a-zA-Z0-9\\-\\.]*)$", "i")).test(url.host) || url.host.charAt(-1) == '.') {
+ return false;
+ }
+ }
+ /* some schemas allow the host to be empty */
+ if (!url.scheme || !url.host && url.scheme != 'mailto' && url.scheme != 'news' && url.scheme != 'file') {
+ return false;
+ }
+ return true;
+ })(url);
+
+ // all normal URLs including mailto:
+ if (validated) {
+ return url;
+ }
+
+ // '//example.com' (Shortcut for protocol.)
+ // '?query=test', #target
+ else if ((new RegExp("^(\\#|\\?|//)", "i")).test(url)) {
+ return url;
+ }
+
+ // 'javascript:'
+ else if (url.indexOf('javascript:') === 0 || url.indexOf('mailto:') === 0 ) {
+ return url;
+ }
+
+ // watch those double escapes in JS.
+
+ // 'install.php', 'install.php?step=step'
+ else if ((new RegExp("^[^\/]*\\.php(\\?.*)?$", "i")).test(url)) {
+ return elgg.config.wwwroot + url.ltrim('/');
+ }
+
+ // 'example.com', 'example.com/subpage'
+ else if ((new RegExp("^[^/]*\\.", "i")).test(url)) {
+ return 'http://' + url;
+ }
+
+ // 'page/handler', 'mod/plugin/file.php'
+ else {
+ // trim off any leading / because the site URL is stored
+ // with a trailing /
+ return elgg.config.wwwroot + url.ltrim('/');
+ }
+};
+
+/**
+ * Displays system messages via javascript rather than php.
+ *
+ * @param {String} msgs The message we want to display
+ * @param {Number} delay The amount of time to display the message in milliseconds. Defaults to 6 seconds.
+ * @param {String} type The type of message (typically 'error' or 'message')
+ * @private
+ */
+elgg.system_messages = function(msgs, delay, type) {
+ if (elgg.isUndefined(msgs)) {
+ return;
+ }
+
+ var classes = ['elgg-message'],
+ messages_html = [],
+ appendMessage = function(msg) {
+ messages_html.push('<li class="' + classes.join(' ') + '"><p>' + msg + '</p></li>');
+ },
+ systemMessages = $('ul.elgg-system-messages'),
+ i;
+
+ //validate delay. Must be a positive integer.
+ delay = parseInt(delay || 6000, 10);
+ if (isNaN(delay) || delay <= 0) {
+ delay = 6000;
+ }
+
+ //Handle non-arrays
+ if (!elgg.isArray(msgs)) {
+ msgs = [msgs];
+ }
+
+ if (type === 'error') {
+ classes.push('elgg-state-error');
+ } else {
+ classes.push('elgg-state-success');
+ }
+
+ msgs.forEach(appendMessage);
+
+ if (type != 'error') {
+ $(messages_html.join('')).appendTo(systemMessages)
+ .animate({opacity: '1.0'}, delay).fadeOut('slow');
+ } else {
+ $(messages_html.join('')).appendTo(systemMessages);
+ }
+};
+
+/**
+ * Wrapper function for system_messages. Specifies "messages" as the type of message
+ * @param {String} msgs The message to display
+ * @param {Number} delay How long to display the message (milliseconds)
+ */
+elgg.system_message = function(msgs, delay) {
+ elgg.system_messages(msgs, delay, "message");
+};
+
+/**
+ * Wrapper function for system_messages. Specifies "errors" as the type of message
+ * @param {String} errors The error message to display
+ * @param {Number} delay How long to dispaly the error message (milliseconds)
+ */
+elgg.register_error = function(errors, delay) {
+ elgg.system_messages(errors, delay, "error");
+};
+
+/**
+ * Meant to mimic the php forward() function by simply redirecting the
+ * user to another page.
+ *
+ * @param {String} url The url to forward to
+ */
+elgg.forward = function(url) {
+ location.href = elgg.normalize_url(url);
+};
+
+/**
+ * Parse a URL into its parts. Mimicks http://php.net/parse_url
+ *
+ * @param {String} url The URL to parse
+ * @param {Int} component A component to return
+ * @param {Bool} expand Expand the query into an object? Else it's a string.
+ *
+ * @return {Object} The parsed URL
+ */
+elgg.parse_url = function(url, component, expand) {
+ // Adapted from http://blog.stevenlevithan.com/archives/parseuri
+ // which was release under the MIT
+ // It was modified to fix mailto: and javascript: support.
+ var
+ expand = expand || false,
+ component = component || false,
+
+ re_str =
+ // scheme (and user@ testing)
+ '^(?:(?![^:@]+:[^:@/]*@)([^:/?#.]+):)?(?://)?'
+ // possibly a user[:password]@
+ + '((?:(([^:@]*)(?::([^:@]*))?)?@)?'
+ // host and port
+ + '([^:/?#]*)(?::(\\d*))?)'
+ // path
+ + '(((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[?#]|$)))*/?)?([^?#/]*))'
+ // query string
+ + '(?:\\?([^#]*))?'
+ // fragment
+ + '(?:#(.*))?)',
+ keys = {
+ 1: "scheme",
+ 4: "user",
+ 5: "pass",
+ 6: "host",
+ 7: "port",
+ 9: "path",
+ 12: "query",
+ 13: "fragment"
+ },
+ results = {};
+
+ if (url.indexOf('mailto:') === 0) {
+ results['scheme'] = 'mailto';
+ results['path'] = url.replace('mailto:', '');
+ return results;
+ }
+
+ if (url.indexOf('javascript:') === 0) {
+ results['scheme'] = 'javascript';
+ results['path'] = url.replace('javascript:', '');
+ return results;
+ }
+
+ var re = new RegExp(re_str);
+ var matches = re.exec(url);
+
+ for (var i in keys) {
+ if (matches[i]) {
+ results[keys[i]] = matches[i];
+ }
+ }
+
+ if (expand && typeof(results['query']) != 'undefined') {
+ results['query'] = elgg.parse_str(results['query']);
+ }
+
+ if (component) {
+ if (typeof(results[component]) != 'undefined') {
+ return results[component];
+ } else {
+ return false;
+ }
+ }
+ return results;
+};
+
+/**
+ * Returns an object with key/values of the parsed query string.
+ *
+ * @param {String} string The string to parse
+ * @return {Object} The parsed object string
+ */
+elgg.parse_str = function(string) {
+ var params = {};
+ var result,
+ key,
+ value,
+ re = /([^&=]+)=?([^&]*)/g;
+
+ while (result = re.exec(string)) {
+ key = decodeURIComponent(result[1].replace(/\+/g, ' '));
+ value = decodeURIComponent(result[2].replace(/\+/g, ' '));
+ params[key] = value;
+ }
+
+ return params;
+};
+
+/**
+ * Returns a jQuery selector from a URL's fragement. Defaults to expecting an ID.
+ *
+ * Examples:
+ * http://elgg.org/download.php returns ''
+ * http://elgg.org/download.php#id returns #id
+ * http://elgg.org/download.php#.class-name return .class-name
+ * http://elgg.org/download.php#a.class-name return a.class-name
+ *
+ * @param {String} url The URL
+ * @return {String} The selector
+ */
+elgg.getSelectorFromUrlFragment = function(url) {
+ var fragment = url.split('#')[1];
+
+ if (fragment) {
+ // this is a .class or a tag.class
+ if (fragment.indexOf('.') > -1) {
+ return fragment;
+ }
+
+ // this is an id
+ else {
+ return '#' + fragment;
+ }
+ }
+ return '';
+};
+
+/**
+ * Adds child to object[parent] array.
+ *
+ * @param {Object} object The object to add to
+ * @param {String} parent The parent array to add to.
+ * @param {Mixed} value The value
+ */
+elgg.push_to_object_array = function(object, parent, value) {
+ elgg.assertTypeOf('object', object);
+ elgg.assertTypeOf('string', parent);
+
+ if (!(object[parent] instanceof Array)) {
+ object[parent] = []
+ }
+
+ if ($.inArray(value, object[parent]) < 0) {
+ return object[parent].push(value);
+ }
+
+ return false;
+};
+
+/**
+ * Tests if object[parent] contains child
+ *
+ * @param {Object} object The object to add to
+ * @param {String} parent The parent array to add to.
+ * @param {Mixed} value The value
+ */
+elgg.is_in_object_array = function(object, parent, value) {
+ elgg.assertTypeOf('object', object);
+ elgg.assertTypeOf('string', parent);
+
+ return typeof(object[parent]) != 'undefined' && $.inArray(value, object[parent]) >= 0;
+};
+
+/**
+ * Triggers the init hook when the library is ready
+ *
+ * Current requirements:
+ * - DOM is ready
+ * - languages loaded
+ *
+ */
+elgg.initWhenReady = function() {
+ if (elgg.config.languageReady && elgg.config.domReady) {
+ elgg.trigger_hook('init', 'system');
+ elgg.trigger_hook('ready', 'system');
+ }
+};
diff --git a/js/lib/hooks.js b/js/lib/hooks.js
new file mode 100644
index 000000000..5e1808e22
--- /dev/null
+++ b/js/lib/hooks.js
@@ -0,0 +1,173 @@
+/*
+ * Javascript hook interface
+ */
+
+elgg.provide('elgg.config.hooks');
+elgg.provide('elgg.config.instant_hooks');
+elgg.provide('elgg.config.triggered_hooks');
+
+/**
+ * Registers a hook handler with the event system.
+ *
+ * The special keyword "all" can be used for either the name or the type or both
+ * and means to call that handler for all of those hooks.
+ *
+ * Note that handlers registering for instant hooks will be executed immediately if the instant
+ * hook has been previously triggered.
+ *
+ * @param {String} name Name of the plugin hook to register for
+ * @param {String} type Type of the event to register for
+ * @param {Function} handler Handle to call
+ * @param {Number} priority Priority to call the event handler
+ * @return {Bool}
+ */
+elgg.register_hook_handler = function(name, type, handler, priority) {
+ elgg.assertTypeOf('string', name);
+ elgg.assertTypeOf('string', type);
+ elgg.assertTypeOf('function', handler);
+
+ if (!name || !type) {
+ return false;
+ }
+
+ var priorities = elgg.config.hooks;
+
+ elgg.provide(name + '.' + type, priorities);
+
+ if (!(priorities[name][type] instanceof elgg.ElggPriorityList)) {
+ priorities[name][type] = new elgg.ElggPriorityList();
+ }
+
+ // call if instant and already triggered.
+ if (elgg.is_instant_hook(name, type) && elgg.is_triggered_hook(name, type)) {
+ handler(name, type, null, null);
+ }
+
+ return priorities[name][type].insert(handler, priority);
+};
+
+/**
+ * Emits a hook.
+ *
+ * Loops through all registered hooks and calls the handler functions in order.
+ * Every handler function will always be called, regardless of the return value.
+ *
+ * @warning Handlers take the same 4 arguments in the same order as when calling this function.
+ * This is different from the PHP version!
+ *
+ * @note Instant hooks do not support params or values.
+ *
+ * Hooks are called in this order:
+ * specifically registered (event_name and event_type match)
+ * all names, specific type
+ * specific name, all types
+ * all names, all types
+ *
+ * @param {String} name Name of the hook to emit
+ * @param {String} type Type of the hook to emit
+ * @param {Object} params Optional parameters to pass to the handlers
+ * @param {Object} value Initial value of the return. Can be mangled by handlers
+ *
+ * @return {Bool}
+ */
+elgg.trigger_hook = function(name, type, params, value) {
+ elgg.assertTypeOf('string', name);
+ elgg.assertTypeOf('string', type);
+
+ // mark as triggered
+ elgg.set_triggered_hook(name, type);
+
+ // default to true if unpassed
+ value = value || true;
+
+ var hooks = elgg.config.hooks,
+ tempReturnValue = null,
+ returnValue = value,
+ callHookHandler = function(handler) {
+ tempReturnValue = handler(name, type, params, value);
+ };
+
+ elgg.provide(name + '.' + type, hooks);
+ elgg.provide('all.' + type, hooks);
+ elgg.provide(name + '.all', hooks);
+ elgg.provide('all.all', hooks);
+
+ var hooksList = [];
+
+ if (name != 'all' && type != 'all') {
+ hooksList.push(hooks[name][type]);
+ }
+
+ if (type != 'all') {
+ hooksList.push(hooks['all'][type]);
+ }
+
+ if (name != 'all') {
+ hooksList.push(hooks[name]['all']);
+ }
+
+ hooksList.push(hooks['all']['all']);
+
+ hooksList.every(function(handlers) {
+ if (handlers instanceof elgg.ElggPriorityList) {
+ handlers.forEach(callHookHandler);
+ }
+ return true;
+ });
+
+ return (tempReturnValue != null) ? tempReturnValue : returnValue;
+};
+
+/**
+ * Registers a hook as an instant hook.
+ *
+ * After being trigger once, registration of a handler to an instant hook will cause the
+ * handle to be executed immediately.
+ *
+ * @note Instant hooks must be triggered without params or defaults. Any params or default
+ * passed will *not* be passed to handlers executed upon registration.
+ *
+ * @param {String} name The hook name.
+ * @param {String} type The hook type.
+ * @return {Int}
+ */
+elgg.register_instant_hook = function(name, type) {
+ elgg.assertTypeOf('string', name);
+ elgg.assertTypeOf('string', type);
+
+ return elgg.push_to_object_array(elgg.config.instant_hooks, name, type);
+};
+
+/**
+ * Is this hook registered as an instant hook?
+ *
+ * @param {String} name The hook name.
+ * @param {String} type The hook type.
+ */
+elgg.is_instant_hook = function(name, type) {
+ return elgg.is_in_object_array(elgg.config.instant_hooks, name, type);
+};
+
+/**
+ * Records that a hook has been triggered.
+ *
+ * @param {String} name The hook name.
+ * @param {String} type The hook type.
+ */
+elgg.set_triggered_hook = function(name, type) {
+ return elgg.push_to_object_array(elgg.config.triggered_hooks, name, type);
+};
+
+/**
+ * Has this hook been triggered yet?
+ *
+ * @param {String} name The hook name.
+ * @param {String} type The hook type.
+ */
+elgg.is_triggered_hook = function(name, type) {
+ return elgg.is_in_object_array(elgg.config.triggered_hooks, name, type);
+};
+
+elgg.register_instant_hook('init', 'system');
+elgg.register_instant_hook('ready', 'system');
+elgg.register_instant_hook('boot', 'system');
diff --git a/js/lib/languages.js b/js/lib/languages.js
new file mode 100644
index 000000000..d218cbc4f
--- /dev/null
+++ b/js/lib/languages.js
@@ -0,0 +1,96 @@
+/*globals vsprintf*/
+/**
+ * Provides language-related functionality
+ */
+elgg.provide('elgg.config.translations');
+
+// default language - required by unit tests
+elgg.config.language = 'en';
+
+/**
+ * Analagous to the php version. Merges translations for a
+ * given language into the current translations map.
+ */
+elgg.add_translation = function(lang, translations) {
+ elgg.provide('elgg.config.translations.' + lang);
+
+ elgg.extend(elgg.config.translations[lang], translations);
+};
+
+/**
+ * Load the translations for the given language.
+ *
+ * If no language is specified, the default language is used.
+ * @param {string} language
+ * @return {XMLHttpRequest}
+ */
+elgg.reload_all_translations = function(language) {
+ var lang = language || elgg.get_language();
+
+ var url, options;
+ url = 'ajax/view/js/languages';
+ options = {data: {language: lang}};
+ if (elgg.config.simplecache_enabled) {
+ options.data.lc = elgg.config.lastcache;
+ }
+
+ options['success'] = function(json) {
+ elgg.add_translation(lang, json);
+ elgg.config.languageReady = true;
+ elgg.initWhenReady();
+ };
+
+ elgg.getJSON(url, options);
+};
+
+/**
+ * Get the current language
+ * @return {String}
+ */
+elgg.get_language = function() {
+ var user = elgg.get_logged_in_user_entity();
+
+ if (user && user.language) {
+ return user.language;
+ }
+
+ return elgg.config.language;
+};
+
+/**
+ * Translates a string
+ *
+ * @param {String} key The string to translate
+ * @param {Array} argv vsprintf support
+ * @param {String} language The language to display it in
+ *
+ * @return {String} The translation
+ */
+elgg.echo = function(key, argv, language) {
+ //elgg.echo('str', 'en')
+ if (elgg.isString(argv)) {
+ language = argv;
+ argv = [];
+ }
+
+ //elgg.echo('str', [...], 'en')
+ var translations = elgg.config.translations,
+ dlang = elgg.get_language(),
+ map;
+
+ language = language || dlang;
+ argv = argv || [];
+
+ map = translations[language] || translations[dlang];
+ if (map && map[key]) {
+ return vsprintf(map[key], argv);
+ }
+
+ return key;
+};
+
+elgg.config.translations.init = function() {
+ elgg.reload_all_translations();
+};
+
+elgg.register_hook_handler('boot', 'system', elgg.config.translations.init); \ No newline at end of file
diff --git a/js/lib/pageowner.js b/js/lib/pageowner.js
new file mode 100644
index 000000000..c695c41c3
--- /dev/null
+++ b/js/lib/pageowner.js
@@ -0,0 +1,18 @@
+/**
+ * Provides page owner and context functions
+ *
+ * @todo This is a stub. Page owners can't be fully implemented until
+ * the 4 types are finished.
+ */
+
+/**
+ * @return {number} The GUID of the page owner entity or 0 for no owner
+ */
+elgg.get_page_owner_guid = function() {
+ if (elgg.page_owner !== undefined) {
+ return elgg.page_owner.guid;
+ } else {
+ return 0;
+ }
+};
+
diff --git a/js/lib/prototypes.js b/js/lib/prototypes.js
new file mode 100644
index 000000000..cb6184097
--- /dev/null
+++ b/js/lib/prototypes.js
@@ -0,0 +1,66 @@
+/**
+ * Interates through each element of an array and calls a callback function.
+ * The callback should accept the following arguments:
+ * element - The current element
+ * index - The current index
+ *
+ * This is different to Array.forEach in that if the callback returns false, the loop returns
+ * immediately without processing the remaining elements.
+ *
+ * @param {Function} callback
+ * @return {Bool}
+ */
+if (!Array.prototype.every) {
+ Array.prototype.every = function(callback) {
+ var len = this.length, i;
+
+ for (i = 0; i < len; i++) {
+ if (i in this && !callback.call(null, this[i], i)) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+}
+
+/**
+ * Interates through each element of an array and calls callback a function.
+ * The callback should accept the following arguments:
+ * element - The current element
+ * index - The current index
+ *
+ * This is different to Array.every in that the callback's return value is ignored and every
+ * element of the array will be parsed.
+ *
+ * @param {Function} callback
+ * @return {Void}
+ */
+if (!Array.prototype.forEach) {
+ Array.prototype.forEach = function(callback) {
+ var len = this.length, i;
+
+ for (i = 0; i < len; i++) {
+ if (i in this) {
+ callback.call(null, this[i], i);
+ }
+ }
+ };
+}
+
+/**
+ * Left trim
+ *
+ * Removes a character from the left side of a string.
+ * @param {String} str The character to remove
+ * @return {String}
+ */
+if (!String.prototype.ltrim) {
+ String.prototype.ltrim = function(str) {
+ if (this.indexOf(str) === 0) {
+ return this.substring(str.length);
+ } else {
+ return this;
+ }
+ };
+} \ No newline at end of file
diff --git a/js/lib/security.js b/js/lib/security.js
new file mode 100644
index 000000000..9c12f8586
--- /dev/null
+++ b/js/lib/security.js
@@ -0,0 +1,107 @@
+/**
+ * Hold security-related data here
+ */
+elgg.provide('elgg.security');
+
+elgg.security.token = {};
+
+elgg.security.tokenRefreshFailed = false;
+
+elgg.security.tokenRefreshTimer = null;
+
+/**
+ * Sets the currently active security token and updates all forms and links on the current page.
+ *
+ * @param {Object} json The json representation of a token containing __elgg_ts and __elgg_token
+ * @return {Void}
+ */
+elgg.security.setToken = function(json) {
+ //update the convenience object
+ elgg.security.token = json;
+
+ //also update all forms
+ $('[name=__elgg_ts]').val(json.__elgg_ts);
+ $('[name=__elgg_token]').val(json.__elgg_token);
+
+ // also update all links that contain tokens and time stamps
+ $('[href*="__elgg_ts"][href*="__elgg_token"]').each(function() {
+ this.href = this.href
+ .replace(/__elgg_ts=\d*/, '__elgg_ts=' + json.__elgg_ts)
+ .replace(/__elgg_token=[0-9a-f]*/, '__elgg_token=' + json.__elgg_token);
+ });
+};
+
+/**
+ * Security tokens time out so we refresh those every so often.
+ *
+ * @private
+ */
+elgg.security.refreshToken = function() {
+ elgg.action('security/refreshtoken', function(data) {
+ if (data && data.output.__elgg_ts && data.output.__elgg_token) {
+ elgg.security.setToken(data.output);
+ } else {
+ clearInterval(elgg.security.tokenRefreshTimer);
+ }
+ });
+};
+
+
+/**
+ * Add elgg action tokens to an object, URL, or query string (with a ?).
+ *
+ * @param {Object|string} data
+ * @return {Object} The new data object including action tokens
+ * @private
+ */
+elgg.security.addToken = function(data) {
+
+ // 'http://example.com?data=sofar'
+ if (elgg.isString(data)) {
+ // is this a full URL, relative URL, or just the query string?
+ var parts = elgg.parse_url(data),
+ args = {},
+ base = '';
+
+ if (parts['host'] == undefined) {
+ if (data.indexOf('?') === 0) {
+ // query string
+ base = '?';
+ args = elgg.parse_str(parts['query']);
+ }
+ } else {
+ // full or relative URL
+
+ if (parts['query'] != undefined) {
+ // with query string
+ args = elgg.parse_str(parts['query']);
+ }
+ var split = data.split('?');
+ base = split[0] + '?';
+ }
+ args["__elgg_ts"] = elgg.security.token.__elgg_ts;
+ args["__elgg_token"] = elgg.security.token.__elgg_token;
+
+ return base + jQuery.param(args);
+ }
+
+ // no input! acts like a getter
+ if (elgg.isUndefined(data)) {
+ return elgg.security.token;
+ }
+
+ // {...}
+ if (elgg.isPlainObject(data)) {
+ return elgg.extend(data, elgg.security.token);
+ }
+
+ // oops, don't recognize that!
+ throw new TypeError("elgg.security.addToken not implemented for " + (typeof data) + "s");
+};
+
+elgg.security.init = function() {
+ // elgg.security.interval is set in the js/elgg PHP view.
+ elgg.security.tokenRefreshTimer = setInterval(elgg.security.refreshToken, elgg.security.interval);
+};
+
+elgg.register_hook_handler('boot', 'system', elgg.security.init); \ No newline at end of file
diff --git a/js/lib/session.js b/js/lib/session.js
new file mode 100644
index 000000000..a8d52733c
--- /dev/null
+++ b/js/lib/session.js
@@ -0,0 +1,123 @@
+/**
+ * Provides session methods.
+ */
+elgg.provide('elgg.session');
+
+/**
+ * Helper function for setting cookies
+ * @param {string} name
+ * @param {string} value
+ * @param {Object} options
+ *
+ * {number|Date} options[expires]
+ * {string} options[path]
+ * {string} options[domain]
+ * {boolean} options[secure]
+ *
+ * @return {string|undefined} The value of the cookie, if only name is specified. Undefined if no value set
+ */
+elgg.session.cookie = function(name, value, options) {
+ var cookies = [], cookie = [], i = 0, date, valid = true;
+
+ //elgg.session.cookie()
+ if (elgg.isUndefined(name)) {
+ return document.cookie;
+ }
+
+ //elgg.session.cookie(name)
+ if (elgg.isUndefined(value)) {
+ if (document.cookie && document.cookie !== '') {
+ cookies = document.cookie.split(';');
+ for (i = 0; i < cookies.length; i += 1) {
+ cookie = jQuery.trim(cookies[i]).split('=');
+ if (cookie[0] === name) {
+ return decodeURIComponent(cookie[1]);
+ }
+ }
+ }
+ return undefined;
+ }
+
+ // elgg.session.cookie(name, value[, opts])
+ options = options || {};
+
+ if (elgg.isNull(value)) {
+ value = '';
+ options.expires = -1;
+ }
+
+ cookies.push(name + '=' + value);
+
+ if (options.expires) {
+ if (elgg.isNumber(options.expires)) {
+ date = new Date();
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
+ } else if (options.expires.toUTCString) {
+ date = options.expires;
+ }
+
+ if (date) {
+ cookies.push('expires=' + date.toUTCString());
+ }
+ }
+
+ // CAUTION: Needed to parenthesize options.path and options.domain
+ // in the following expressions, otherwise they evaluate to undefined
+ // in the packed version for some reason.
+ if (options.path) {
+ cookies.push('path=' + (options.path));
+ }
+
+ if (options.domain) {
+ cookies.push('domain=' + (options.domain));
+ }
+
+ if (options.secure) {
+ cookies.push('secure');
+ }
+
+ document.cookie = cookies.join('; ');
+};
+
+/**
+ * Returns the object of the user logged in.
+ *
+ * @return {ElggUser} The logged in user
+ */
+elgg.get_logged_in_user_entity = function() {
+ return elgg.session.user;
+};
+
+/**
+ * Returns the GUID of the logged in user or 0.
+ *
+ * @return {number} The GUID of the logged in user
+ */
+elgg.get_logged_in_user_guid = function() {
+ var user = elgg.get_logged_in_user_entity();
+ return user ? user.guid : 0;
+};
+
+/**
+ * Returns if a user is logged in.
+ *
+ * @return {boolean} Whether there is a user logged in
+ */
+elgg.is_logged_in = function() {
+ return (elgg.get_logged_in_user_entity() instanceof elgg.ElggUser);
+};
+
+/**
+ * Returns if the currently logged in user is an admin.
+ *
+ * @return {boolean} Whether there is an admin logged in
+ */
+elgg.is_admin_logged_in = function() {
+ var user = elgg.get_logged_in_user_entity();
+ return (user instanceof elgg.ElggUser) && user.isAdmin();
+};
+
+/**
+ * @deprecated Use elgg.session.cookie instead
+ */
+jQuery.cookie = elgg.session.cookie; \ No newline at end of file
diff --git a/js/lib/ui.autocomplete.js b/js/lib/ui.autocomplete.js
new file mode 100644
index 000000000..46d72d146
--- /dev/null
+++ b/js/lib/ui.autocomplete.js
@@ -0,0 +1,14 @@
+/**
+ *
+ */
+elgg.provide('elgg.autocomplete');
+
+elgg.autocomplete.init = function() {
+ $('.elgg-input-autocomplete').autocomplete({
+ source: elgg.autocomplete.url, //gets set by input/autocomplete view
+ minLength: 2,
+ html: "html"
+ })
+};
+
+elgg.register_hook_handler('init', 'system', elgg.autocomplete.init); \ No newline at end of file
diff --git a/js/lib/ui.avatar_cropper.js b/js/lib/ui.avatar_cropper.js
new file mode 100644
index 000000000..fc32a0832
--- /dev/null
+++ b/js/lib/ui.avatar_cropper.js
@@ -0,0 +1,76 @@
+/**
+ * Avatar cropping
+ */
+
+elgg.provide('elgg.avatarCropper');
+
+/**
+ * Register the avatar cropper.
+ *
+ * If the hidden inputs have the coordinates from a previous cropping, begin
+ * the selection and preview with that displayed.
+ */
+elgg.avatarCropper.init = function() {
+ var params = {
+ selectionOpacity: 0,
+ aspectRatio: '1:1',
+ onSelectEnd: elgg.avatarCropper.selectChange,
+ onSelectChange: elgg.avatarCropper.preview
+ };
+
+ if ($('input[name=x2]').val()) {
+ params.x1 = $('input[name=x1]').val();
+ params.x2 = $('input[name=x2]').val();
+ params.y1 = $('input[name=y1]').val();
+ params.y2 = $('input[name=y2]').val();
+ }
+
+ $('#user-avatar-cropper').imgAreaSelect(params);
+
+ if ($('input[name=x2]').val()) {
+ var ias = $('#user-avatar-cropper').imgAreaSelect({instance: true});
+ var selection = ias.getSelection();
+ elgg.avatarCropper.preview($('#user-avatar-cropper'), selection);
+ }
+};
+
+/**
+ * Handler for changing select area.
+ *
+ * @param {Object} reference to the image
+ * @param {Object} imgareaselect selection object
+ * @return void
+ */
+elgg.avatarCropper.preview = function(img, selection) {
+ // catch for the first click on the image
+ if (selection.width == 0 || selection.height == 0) {
+ return;
+ }
+
+ var origWidth = $("#user-avatar-cropper").width();
+ var origHeight = $("#user-avatar-cropper").height();
+ var scaleX = 100 / selection.width;
+ var scaleY = 100 / selection.height;
+ $('#user-avatar-preview > img').css({
+ width: Math.round(scaleX * origWidth) + 'px',
+ height: Math.round(scaleY * origHeight) + 'px',
+ marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
+ marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
+ });
+};
+
+/**
+ * Handler for updating the form inputs after select ends
+ *
+ * @param {Object} reference to the image
+ * @param {Object} imgareaselect selection object
+ * @return void
+ */
+elgg.avatarCropper.selectChange = function(img, selection) {
+ $('input[name=x1]').val(selection.x1);
+ $('input[name=x2]').val(selection.x2);
+ $('input[name=y1]').val(selection.y1);
+ $('input[name=y2]').val(selection.y2);
+};
+
+elgg.register_hook_handler('init', 'system', elgg.avatarCropper.init); \ No newline at end of file
diff --git a/js/lib/ui.friends_picker.js b/js/lib/ui.friends_picker.js
new file mode 100644
index 000000000..9257c40fc
--- /dev/null
+++ b/js/lib/ui.friends_picker.js
@@ -0,0 +1,91 @@
+/*
+ elgg friendsPicker plugin
+ adapted from Niall Doherty's excellent Coda-Slider - http://www.ndoherty.com/coda-slider
+ */
+
+
+jQuery.fn.friendsPicker = function(iterator) {
+
+ var settings;
+ settings = $.extend({ easeFunc: "easeOutExpo", easeTime: 1000, toolTip: false }, settings);
+
+ return this.each(function() {
+
+ var container = $(this);
+ container.addClass("friends-picker");
+ // set panelwidth manually as it's hidden initially - adjust this value for different themes/pagewidths
+ var panelWidth = 730;
+
+ // count the panels in the container
+ var panelCount = container.find("div.panel").size();
+ // calculate the width of all the panels lined up end-to-end
+ var friendsPicker_containerWidth = panelWidth*panelCount;
+ // specify width for the friendsPicker_container
+ container.find("div.friends-picker-container").css("width" , friendsPicker_containerWidth);
+
+ // global variables for container.each function below
+ var friendsPickerNavigationWidth = 0;
+ var currentPanel = 1;
+
+ // generate appropriate nav for each container
+ container.each(function(i) {
+ // generate Left and Right arrows
+ $(this).before("<div class='friends-picker-navigation-l' id='friends-picker-navigation-l" + iterator + "'><a href='#'>Left</a><\/div>");
+ $(this).after("<div class='friends-picker-navigation-r' id='friends-picker-navigation-r" + iterator + "'><a href='#'>Right</a><\/div>");
+
+ // generate a-z tabs
+ $(this).before("<div class='friends-picker-navigation' id='friends-picker-navigation" + iterator + "'><ul><\/ul><\/div>");
+ $(this).find("div.panel").each(function(individualTabItemNumber) {
+ $("div#friends-picker-navigation" + iterator + " ul").append("<li class='tab" + (individualTabItemNumber+1) + "'><a href='#" + (individualTabItemNumber+1) + "'>" + $(this).attr("title") + "<\/a><\/li>");
+ });
+
+ // tabs navigation
+ $("div#friends-picker-navigation" + iterator + " a").each(function(individualTabItemNumber) {
+ // calc friendsPickerNavigationWidth by summing width of each li
+ friendsPickerNavigationWidth += $(this).parent().width();
+ // set-up individual tab clicks
+ $(this).bind("click", function() {
+ $(this).addClass("current").parent().parent().find("a").not($(this)).removeClass("current");
+ var distanceToMoveFriendsPicker_container = - (panelWidth*individualTabItemNumber);
+ currentPanel = individualTabItemNumber + 1;
+ $(this).parent().parent().parent().next().find("div.friends-picker-container").animate({ left: distanceToMoveFriendsPicker_container}, settings.easeTime, settings.easeFunc);
+ });
+ });
+
+ // Right arow click function
+ $("div#friends-picker-navigation-r" + iterator + " a").click(function() {
+ if (currentPanel == panelCount) {
+ var distanceToMoveFriendsPicker_container = 0;
+ currentPanel = 1;
+ $(this).parent().parent().find("div.friends-picker-navigation a.current").removeClass("current").parent().parent().find("a:eq(0)").addClass("current");
+ } else {
+ var distanceToMoveFriendsPicker_container = - (panelWidth*currentPanel);
+ currentPanel += 1;
+ $(this).parent().parent().find("div.friends-picker-navigation a.current").removeClass("current").parent().next().find("a").addClass("current");
+ };
+ $(this).parent().parent().find("div.friends-picker-container").animate({ left: distanceToMoveFriendsPicker_container}, settings.easeTime, settings.easeFunc);
+ return false;
+ });
+
+ // Left arrow click function
+ $("div#friends-picker-navigation-l" + iterator + " a").click(function() {
+ if (currentPanel == 1) {
+ var distanceToMoveFriendsPicker_container = - (panelWidth*(panelCount - 1));
+ currentPanel = panelCount;
+ $(this).parent().parent().find("div.friends-picker-navigation a.current").removeClass("current").parent().parent().find("li:last a").addClass("current");
+ } else {
+ currentPanel -= 1;
+ var distanceToMoveFriendsPicker_container = - (panelWidth*(currentPanel - 1));
+ $(this).parent().parent().find("div.friends-picker-navigation a.current").removeClass("current").parent().prev().find("a").addClass("current");
+ };
+ $(this).parent().parent().find("div.friends-picker-container").animate({ left: distanceToMoveFriendsPicker_container}, settings.easeTime, settings.easeFunc);
+ return false;
+ });
+
+ // apply 'current' class to currently selected tab link
+ $("div#friends-picker-navigation" + iterator + " a:eq(0)").addClass("current");
+ });
+
+ $("div#friends-picker-navigation" + iterator).append("<br />");
+ });
+}; \ No newline at end of file
diff --git a/js/lib/ui.js b/js/lib/ui.js
new file mode 100644
index 000000000..413078b4f
--- /dev/null
+++ b/js/lib/ui.js
@@ -0,0 +1,293 @@
+elgg.provide('elgg.ui');
+
+elgg.ui.init = function () {
+ // add user hover menus
+ elgg.ui.initHoverMenu();
+
+ //if the user clicks a system message, make it disappear
+ $('.elgg-system-messages li').live('click', function() {
+ $(this).stop().fadeOut('fast');
+ });
+
+ $('.elgg-system-messages li').animate({opacity: 0.9}, 6000);
+ $('.elgg-system-messages li.elgg-state-success').fadeOut('slow');
+
+ $('[rel=toggle]').live('click', elgg.ui.toggles);
+
+ $('[rel=popup]').live('click', elgg.ui.popupOpen);
+
+ $('.elgg-menu-page .elgg-menu-parent').live('click', elgg.ui.toggleMenu);
+
+ $('.elgg-requires-confirmation').live('click', elgg.ui.requiresConfirmation);
+
+ $('.elgg-autofocus').focus();
+};
+
+/**
+ * Toggles an element based on clicking a separate element
+ *
+ * Use rel="toggle" on the toggler element
+ * Set the href to target the item you want to toggle (<a rel="toggle" href="#id-of-target">)
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.toggles = function(event) {
+ event.preventDefault();
+
+ // @todo might want to switch this to elgg.getSelectorFromUrlFragment().
+ var target = $(this).toggleClass('elgg-state-active').attr('href');
+
+ $(target).slideToggle('medium');
+};
+
+/**
+ * Pops up an element based on clicking a separate element
+ *
+ * Set the rel="popup" on the popper and set the href to target the
+ * item you want to toggle (<a rel="popup" href="#id-of-target">)
+ *
+ * This function emits the getOptions, ui.popup hook that plugins can register for to provide custom
+ * positioning for elements. The handler is passed the following params:
+ * targetSelector: The selector used to find the popup
+ * target: The popup jQuery element as found by the selector
+ * source: The jquery element whose click event initiated a popup.
+ *
+ * The return value of the function is used as the options object to .position().
+ * Handles can also return false to abort the default behvior and override it with their own.
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.popupOpen = function(event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ var target = elgg.getSelectorFromUrlFragment($(this).toggleClass('elgg-state-active').attr('href'));
+ var $target = $(target);
+
+ // emit a hook to allow plugins to position and control popups
+ var params = {
+ targetSelector: target,
+ target: $target,
+ source: $(this)
+ };
+
+ var options = {
+ my: 'center top',
+ at: 'center bottom',
+ of: $(this),
+ collision: 'fit fit'
+ }
+
+ options = elgg.trigger_hook('getOptions', 'ui.popup', params, options);
+
+ // allow plugins to cancel event
+ if (!options) {
+ return;
+ }
+
+ // hide if already open
+ if ($target.is(':visible')) {
+ $target.fadeOut();
+ $('body').die('click', elgg.ui.popupClose);
+ return;
+ }
+
+ $target.appendTo('body')
+ .fadeIn()
+ .position(options);
+
+ $('body')
+ .die('click', elgg.ui.popupClose)
+ .live('click', elgg.ui.popupClose);
+};
+
+/**
+ * Catches clicks that aren't in a popup and closes all popups.
+ */
+elgg.ui.popupClose = function(event) {
+ $eventTarget = $(event.target);
+ var inTarget = false;
+ var $popups = $('[rel=popup]');
+
+ // if the click event target isn't in a popup target, fade all of them out.
+ $popups.each(function(i, e) {
+ var target = elgg.getSelectorFromUrlFragment($(e).attr('href')) + ':visible';
+ var $target = $(target);
+
+ if (!$target.is(':visible')) {
+ return;
+ }
+
+ // didn't click inside the target
+ if ($eventTarget.closest(target).length > 0) {
+ inTarget = true;
+ return false;
+ }
+ });
+
+ if (!inTarget) {
+ $popups.each(function(i, e) {
+ var $e = $(e);
+ var $target = $(elgg.getSelectorFromUrlFragment($e.attr('href')) + ':visible');
+ if ($target.length > 0) {
+ $target.fadeOut();
+ $e.removeClass('elgg-state-active');
+ }
+ });
+
+ $('body').die('click', elgg.ui.popClose);
+ }
+};
+
+/**
+ * Toggles a child menu when the parent is clicked
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.toggleMenu = function(event) {
+ $(this).siblings().slideToggle('medium');
+ $(this).toggleClass('elgg-menu-closed elgg-menu-opened');
+ event.preventDefault();
+};
+
+/**
+ * Initialize the hover menu
+ *
+ * @param {Object} parent
+ * @return void
+ */
+elgg.ui.initHoverMenu = function(parent) {
+ if (!parent) {
+ parent = document;
+ }
+
+ // avatar image menu link
+ $(parent).find(".elgg-avatar").live('mouseover', function() {
+ $(this).children(".elgg-icon-hover-menu").show();
+ })
+ .live('mouseout', function() {
+ $(this).children(".elgg-icon-hover-menu").hide();
+ });
+
+
+ // avatar contextual menu
+ $(".elgg-avatar > .elgg-icon-hover-menu").live('click', function(e) {
+ // check if we've attached the menu to this element already
+ var $hovermenu = $(this).data('hovermenu') || null;
+
+ if (!$hovermenu) {
+ $hovermenu = $(this).parent().find(".elgg-menu-hover");
+ $(this).data('hovermenu', $hovermenu);
+ }
+
+ // close hovermenu if arrow is clicked & menu already open
+ if ($hovermenu.css('display') == "block") {
+ $hovermenu.fadeOut();
+ } else {
+ $avatar = $(this).closest(".elgg-avatar");
+
+ // @todo Use jQuery-ui position library instead -- much simpler
+ var offset = $avatar.offset();
+ var top = $avatar.height() + offset.top + 'px';
+ var left = $avatar.width() - 15 + offset.left + 'px';
+
+ $hovermenu.appendTo('body')
+ .css('position', 'absolute')
+ .css("top", top)
+ .css("left", left)
+ .fadeIn('normal');
+ }
+
+ // hide any other open hover menus
+ $(".elgg-menu-hover:visible").not($hovermenu).fadeOut();
+ });
+
+ // hide avatar menu when user clicks elsewhere
+ $(document).click(function(event) {
+ if ($(event.target).parents(".elgg-avatar").length == 0) {
+ $(".elgg-menu-hover").fadeOut();
+ }
+ });
+};
+
+/**
+ * Calls a confirm() and prevents default if denied.
+ *
+ * @param {Object} e
+ * @return void
+ */
+elgg.ui.requiresConfirmation = function(e) {
+ var confirmText = $(this).attr('rel') || elgg.echo('question:areyousure');
+ if (!confirm(confirmText)) {
+ e.preventDefault();
+ }
+};
+
+/**
+ * Repositions the login popup
+ *
+ * @param {String} hook 'getOptions'
+ * @param {String} type 'ui.popup'
+ * @param {Object} params An array of info about the target and source.
+ * @param {Object} options Options to pass to
+ *
+ * @return {Object}
+ */
+elgg.ui.loginHandler = function(hook, type, params, options) {
+ if (params.target.attr('id') == 'login-dropdown-box') {
+ options.my = 'right top';
+ options.at = 'right bottom';
+ return options;
+ }
+ return null;
+};
+
+/**
+ * Initialize the date picker
+ *
+ * Uses the class .elgg-input-date as the selector.
+ *
+ * If the class .elgg-input-timestamp is set on the input element, the onSelect
+ * method converts the date text to a unix timestamp in seconds. That value is
+ * stored in a hidden element indicated by the id on the input field.
+ *
+ * @return void
+ */
+elgg.ui.initDatePicker = function() {
+ var loadDatePicker = function() {
+ $('.elgg-input-date').datepicker({
+ // ISO-8601
+ dateFormat: 'yy-mm-dd',
+ onSelect: function(dateText) {
+ if ($(this).is('.elgg-input-timestamp')) {
+ // convert to unix timestamp
+ var dateParts = dateText.split("-");
+ var timestamp = Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2]);
+ timestamp = timestamp / 1000;
+
+ var id = $(this).attr('id');
+ $('input[name="' + id + '"]').val(timestamp);
+ }
+ }
+ });
+ };
+
+ if ($('.elgg-input-date').length && elgg.get_language() == 'en') {
+ loadDatePicker();
+ } else if ($('.elgg-input-date').length) {
+ elgg.get({
+ url: elgg.config.wwwroot + 'vendors/jquery/i18n/jquery.ui.datepicker-'+ elgg.get_language() +'.js',
+ dataType: "script",
+ cache: true,
+ success: loadDatePicker,
+ error: loadDatePicker // english language is already loaded.
+ });
+ }
+};
+
+elgg.register_hook_handler('init', 'system', elgg.ui.init);
+elgg.register_hook_handler('init', 'system', elgg.ui.initDatePicker);
+elgg.register_hook_handler('getOptions', 'ui.popup', elgg.ui.loginHandler);
diff --git a/js/lib/ui.river.js b/js/lib/ui.river.js
new file mode 100644
index 000000000..c103fabb3
--- /dev/null
+++ b/js/lib/ui.river.js
@@ -0,0 +1,14 @@
+elgg.provide('elgg.ui.river');
+
+elgg.ui.river.init = function() {
+ $('#elgg-river-selector').change(function() {
+ var url = window.location.href;
+ if (window.location.search.length) {
+ url = url.substring(0, url.indexOf('?'));
+ }
+ url += '?' + $(this).val();
+ elgg.forward(url);
+ });
+};
+
+elgg.register_hook_handler('init', 'system', elgg.ui.river.init); \ No newline at end of file
diff --git a/js/lib/ui.userpicker.js b/js/lib/ui.userpicker.js
new file mode 100644
index 000000000..669b84cdb
--- /dev/null
+++ b/js/lib/ui.userpicker.js
@@ -0,0 +1,117 @@
+elgg.provide('elgg.userpicker');
+
+/**
+ * Userpicker initialization
+ *
+ * The userpicker is an autocomplete library for selecting multiple users or
+ * friends. It works in concert with the view input/userpicker.
+ *
+ * @return void
+ */
+elgg.userpicker.init = function() {
+
+ // binding autocomplete.
+ // doing this as an each so we can pass this to functions.
+ $('.elgg-input-user-picker').each(function() {
+
+ $(this).autocomplete({
+ source: function(request, response) {
+
+ var params = elgg.userpicker.getSearchParams(this);
+
+ elgg.get('livesearch', {
+ data: params,
+ dataType: 'json',
+ success: function(data) {
+ response(data);
+ }
+ });
+ },
+ minLength: 2,
+ html: "html",
+ select: elgg.userpicker.addUser
+ })
+ });
+
+ $('.elgg-userpicker-remove').live('click', elgg.userpicker.removeUser);
+};
+
+/**
+ * Adds a user to the select user list
+ *
+ * elgg.userpicker.userList is defined in the input/userpicker view
+ *
+ * @param {Object} event
+ * @param {Object} ui The object returned by the autocomplete endpoint
+ * @return void
+ */
+elgg.userpicker.addUser = function(event, ui) {
+ var info = ui.item;
+
+ // do not allow users to be added multiple times
+ if (!(info.guid in elgg.userpicker.userList)) {
+ elgg.userpicker.userList[info.guid] = true;
+ var users = $(this).siblings('.elgg-user-picker-list');
+ var li = '<input type="hidden" name="members[]" value="' + info.guid + '" />';
+ li += elgg.userpicker.viewUser(info);
+ $('<li>').html(li).appendTo(users);
+ }
+
+ $(this).val('');
+ event.preventDefault();
+};
+
+/**
+ * Remove a user from the selected user list
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.userpicker.removeUser = function(event) {
+ var item = $(this).closest('.elgg-user-picker-list > li');
+
+ var guid = item.find('[name="members[]"]').val();
+ delete elgg.userpicker.userList[guid];
+
+ item.remove();
+ event.preventDefault();
+};
+
+/**
+ * Render the list item for insertion into the selected user list
+ *
+ * The html in this method has to remain synced with the input/userpicker view
+ *
+ * @param {Object} info The object returned by the autocomplete endpoint
+ * @return string
+ */
+elgg.userpicker.viewUser = function(info) {
+
+ var deleteLink = "<a href='#' class='elgg-userpicker-remove'>X</a>";
+
+ var html = "<div class='elgg-image-block'>";
+ html += "<div class='elgg-image'>" + info.icon + "</div>";
+ html += "<div class='elgg-image-alt'>" + deleteLink + "</div>";
+ html += "<div class='elgg-body'>" + info.name + "</div>";
+ html += "</div>";
+
+ return html;
+};
+
+/**
+ * Get the parameters to use for autocomplete
+ *
+ * This grabs the value of the friends checkbox.
+ *
+ * @param {Object} obj Object for the autocomplete callback
+ * @return Object
+ */
+elgg.userpicker.getSearchParams = function(obj) {
+ if (obj.element.parent('.elgg-user-picker').find('input[name=match_on]').attr('checked')) {
+ return {'match_on[]': 'friends', 'term' : obj.term};
+ } else {
+ return {'match_on[]': 'users', 'term' : obj.term};
+ }
+};
+
+elgg.register_hook_handler('init', 'system', elgg.userpicker.init);
diff --git a/js/lib/ui.widgets.js b/js/lib/ui.widgets.js
new file mode 100644
index 000000000..26020bb4b
--- /dev/null
+++ b/js/lib/ui.widgets.js
@@ -0,0 +1,209 @@
+elgg.provide('elgg.ui.widgets');
+
+/**
+ * Widgets initialization
+ *
+ * @return void
+ */
+elgg.ui.widgets.init = function() {
+
+ // widget layout?
+ if ($(".elgg-widgets").length == 0) {
+ return;
+ }
+
+ $(".elgg-widgets").sortable({
+ items: 'div.elgg-module-widget.elgg-state-draggable',
+ connectWith: '.elgg-widgets',
+ handle: '.elgg-widget-handle',
+ forcePlaceholderSize: true,
+ placeholder: 'elgg-widget-placeholder',
+ opacity: 0.8,
+ revert: 500,
+ stop: elgg.ui.widgets.move
+ });
+
+ $('.elgg-widgets-add-panel li.elgg-state-available').click(elgg.ui.widgets.add);
+
+ $('a.elgg-widget-delete-button').live('click', elgg.ui.widgets.remove);
+ $('.elgg-widget-edit > form ').live('submit', elgg.ui.widgets.saveSettings);
+ $('a.elgg-widget-collapse-button').live('click', elgg.ui.widgets.collapseToggle);
+
+ elgg.ui.widgets.setMinHeight(".elgg-widgets");
+};
+
+/**
+ * Adds a new widget
+ *
+ * Makes Ajax call to persist new widget and inserts the widget html
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.widgets.add = function(event) {
+ // elgg-widget-type-<type>
+ var type = $(this).attr('id');
+ type = type.substr(type.indexOf('elgg-widget-type-') + "elgg-widget-type-".length);
+
+ // if multiple instances not allow, disable this widget type add button
+ var multiple = $(this).attr('class').indexOf('elgg-widget-multiple') != -1;
+ if (multiple == false) {
+ $(this).addClass('elgg-state-unavailable');
+ $(this).removeClass('elgg-state-available');
+ $(this).unbind('click', elgg.ui.widgets.add);
+ }
+
+ elgg.action('widgets/add', {
+ data: {
+ handler: type,
+ owner_guid: elgg.get_page_owner_guid(),
+ context: $("input[name='widget_context']").val(),
+ show_access: $("input[name='show_access']").val(),
+ default_widgets: $("input[name='default_widgets']").val() || 0
+ },
+ success: function(json) {
+ $('#elgg-widget-col-1').prepend(json.output);
+ }
+ });
+ event.preventDefault();
+};
+
+/**
+ * Persist the widget's new position
+ *
+ * @param {Object} event
+ * @param {Object} ui
+ *
+ * @return void
+ */
+elgg.ui.widgets.move = function(event, ui) {
+
+ // elgg-widget-<guid>
+ var guidString = ui.item.attr('id');
+ guidString = guidString.substr(guidString.indexOf('elgg-widget-') + "elgg-widget-".length);
+
+ // elgg-widget-col-<column>
+ var col = ui.item.parent().attr('id');
+ col = col.substr(col.indexOf('elgg-widget-col-') + "elgg-widget-col-".length);
+
+ elgg.action('widgets/move', {
+ data: {
+ widget_guid: guidString,
+ column: col,
+ position: ui.item.index()
+ }
+ });
+
+ // @hack fixes jquery-ui/opera bug where draggable elements jump
+ ui.item.css('top', 0);
+ ui.item.css('left', 0);
+};
+
+/**
+ * Removes a widget from the layout
+ *
+ * Event callback the uses Ajax to delete the widget and removes its HTML
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.widgets.remove = function(event) {
+ if (confirm(elgg.echo('deleteconfirm')) == false) {
+ event.preventDefault();
+ return;
+ }
+
+ var $widget = $(this).closest('.elgg-module-widget');
+
+ // if widget type is single instance type, enable the add buton
+ var type = $widget.attr('class');
+ // elgg-widget-instance-<type>
+ type = type.substr(type.indexOf('elgg-widget-instance-') + "elgg-widget-instance-".length);
+ $button = $('#elgg-widget-type-' + type);
+ var multiple = $button.attr('class').indexOf('elgg-widget-multiple') != -1;
+ if (multiple == false) {
+ $button.addClass('elgg-state-available');
+ $button.removeClass('elgg-state-unavailable');
+ $button.unbind('click', elgg.ui.widgets.add); // make sure we don't bind twice
+ $button.click(elgg.ui.widgets.add);
+ }
+
+ $widget.remove();
+
+ // delete the widget through ajax
+ elgg.action($(this).attr('href'));
+
+ event.preventDefault();
+};
+
+/**
+ * Toggle the collapse state of the widget
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.widgets.collapseToggle = function(event) {
+ $(this).toggleClass('elgg-widget-collapsed');
+ $(this).parent().parent().find('.elgg-body').slideToggle('medium');
+ event.preventDefault();
+};
+
+/**
+ * Save a widget's settings
+ *
+ * Uses Ajax to save the settings and updates the HTML.
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ui.widgets.saveSettings = function(event) {
+ $(this).parent().slideToggle('medium');
+ var $widgetContent = $(this).parent().parent().children('.elgg-widget-content');
+
+ // stick the ajax loader in there
+ var $loader = $('#elgg-widget-loader').clone();
+ $loader.attr('id', '#elgg-widget-active-loader');
+ $loader.removeClass('hidden');
+ $widgetContent.html($loader);
+
+ var default_widgets = $("input[name='default_widgets']").val() || 0;
+ if (default_widgets) {
+ $(this).append('<input type="hidden" name="default_widgets" value="1">');
+ }
+
+ elgg.action('widgets/save', {
+ data: $(this).serialize(),
+ success: function(json) {
+ $widgetContent.html(json.output);
+ }
+ });
+ event.preventDefault();
+};
+
+/**
+ * Set the min-height so that all widget column bottoms are the same
+ *
+ * This addresses the issue of trying to drag a widget into a column that does
+ * not have any widgets or many fewer widgets than other columns.
+ *
+ * @param {String} selector
+ * @return void
+ */
+elgg.ui.widgets.setMinHeight = function(selector) {
+ var maxBottom = 0;
+ $(selector).each(function() {
+ var bottom = parseInt($(this).offset().top + $(this).height());
+ if (bottom > maxBottom) {
+ maxBottom = bottom;
+ }
+ })
+ $(selector).each(function() {
+ var bottom = parseInt($(this).offset().top + $(this).height());
+ if (bottom < maxBottom) {
+ var newMinHeight = parseInt($(this).height() + (maxBottom - bottom));
+ $(this).css('min-height', newMinHeight + 'px');
+ }
+ })
+};
+
+elgg.register_hook_handler('init', 'system', elgg.ui.widgets.init);
diff --git a/js/tests/ElggAjaxOptionsTest.js b/js/tests/ElggAjaxOptionsTest.js
new file mode 100644
index 000000000..a6b40d439
--- /dev/null
+++ b/js/tests/ElggAjaxOptionsTest.js
@@ -0,0 +1,61 @@
+/**
+ * Tests elgg.ajax.handleOptions() with all of the possible valid inputs
+ */
+ElggAjaxOptionsTest = TestCase("ElggAjaxOptionsTest");
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsNoArgs = function() {
+ assertNotUndefined(elgg.ajax.handleOptions());
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsUrl = function() {
+ var url = 'url',
+ result = elgg.ajax.handleOptions(url);
+
+ assertEquals(url, result.url);
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsDataOnly = function() {
+ var options = {},
+ result = elgg.ajax.handleOptions(options);
+
+ assertEquals(options, result.data);
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsOptions = function() {
+ var options = {data:{arg:1}},
+ result = elgg.ajax.handleOptions(options);
+
+ assertEquals(options, result);
+
+ function func() {}
+ options = {success: func};
+ result = elgg.ajax.handleOptions(options);
+
+ assertEquals(options, result);
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsUrlThenDataOnly = function() {
+ var url = 'url',
+ options = {arg:1},
+ result = elgg.ajax.handleOptions(url, options);
+
+ assertEquals(url, result.url);
+ assertEquals(options, result.data);
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsUrlThenSuccessOnly = function() {
+ var url = 'url',
+ result = elgg.ajax.handleOptions(url, elgg.nullFunction);
+
+ assertEquals(url, result.url);
+ assertEquals(elgg.nullFunction, result.success);
+};
+
+ElggAjaxOptionsTest.prototype.testHandleOptionsAcceptsUrlThenOptions = function() {
+ var url = 'url',
+ options = {data:{arg:1}},
+ result = elgg.ajax.handleOptions(url, options);
+
+ assertEquals(url, result.url);
+ assertEquals(options.data, result.data);
+}; \ No newline at end of file
diff --git a/js/tests/ElggAjaxTest.js b/js/tests/ElggAjaxTest.js
new file mode 100644
index 000000000..a683415fc
--- /dev/null
+++ b/js/tests/ElggAjaxTest.js
@@ -0,0 +1,59 @@
+/**
+ * Makes sure that each of the helper ajax functions ends up calling $.ajax
+ * with the right options.
+ */
+ElggAjaxTest = TestCase("ElggAjaxTest");
+
+ElggAjaxTest.prototype.setUp = function() {
+
+ this.wwwroot = elgg.config.wwwroot;
+ this.ajax = $.ajax;
+
+ elgg.config.wwwroot = 'http://www.elgg.org/';
+
+ $.ajax = function(options) {
+ return options;
+ };
+};
+
+ElggAjaxTest.prototype.tearDown = function() {
+ $.ajax = this.ajax;
+ elgg.config.wwwroot = this.wwwroot;
+};
+
+ElggAjaxTest.prototype.testElggAjax = function() {
+ assertEquals(elgg.config.wwwroot, elgg.ajax().url);
+};
+
+ElggAjaxTest.prototype.testElggGet = function() {
+ assertEquals('get', elgg.get().type);
+};
+
+ElggAjaxTest.prototype.testElggGetJSON = function() {
+ assertEquals('json', elgg.getJSON().dataType);
+};
+
+ElggAjaxTest.prototype.testElggPost = function() {
+ assertEquals('post', elgg.post().type);
+};
+
+ElggAjaxTest.prototype.testElggAction = function() {
+ assertException(function() { elgg.action(); });
+ assertException(function() { elgg.action({}); });
+
+ var result = elgg.action('action');
+ assertEquals('post', result.type);
+ assertEquals('json', result.dataType);
+ assertEquals(elgg.config.wwwroot + 'action/action', result.url);
+ assertEquals(elgg.security.token.__elgg_ts, result.data.__elgg_ts);
+};
+
+ElggAjaxTest.prototype.testElggAPI = function() {
+ assertException(function() { elgg.api(); });
+ assertException(function() { elgg.api({}); });
+
+ var result = elgg.api('method');
+ assertEquals('json', result.dataType);
+ assertEquals('method', result.data.method);
+ assertEquals(elgg.config.wwwroot + 'services/api/rest/json/', result.url);
+};
diff --git a/js/tests/ElggHooksTest.js b/js/tests/ElggHooksTest.js
new file mode 100644
index 000000000..e7a2440e7
--- /dev/null
+++ b/js/tests/ElggHooksTest.js
@@ -0,0 +1,28 @@
+ElggHooksTest = TestCase("ElggHooksTest");
+
+ElggHooksTest.prototype.setUp = function() {
+ elgg.config.hooks = {};
+ elgg.provide('elgg.config.hooks.all.all');
+};
+
+ElggHooksTest.prototype.testHookHandlersMustBeFunctions = function () {
+ assertException(function() { elgg.register_hook_handler('str', 'str', 'oops'); });
+};
+
+ElggHooksTest.prototype.testReturnValueDefaultsToTrue = function () {
+ assertTrue(elgg.trigger_hook('fee', 'fum'));
+
+ elgg.register_hook_handler('fee', 'fum', elgg.nullFunction);
+ assertTrue(elgg.trigger_hook('fee', 'fum'));
+};
+
+ElggHooksTest.prototype.testCanGlomHooksWithAll = function () {
+ elgg.register_hook_handler('all', 'bar', elgg.abstractMethod);
+ assertException("all,bar", function() { elgg.trigger_hook('foo', 'bar'); });
+
+ elgg.register_hook_handler('foo', 'all', elgg.abstractMethod);
+ assertException("foo,all", function() { elgg.trigger_hook('foo', 'baz'); });
+
+ elgg.register_hook_handler('all', 'all', elgg.abstractMethod);
+ assertException("all,all", function() { elgg.trigger_hook('pinky', 'winky'); });
+}; \ No newline at end of file
diff --git a/js/tests/ElggLanguagesTest.js b/js/tests/ElggLanguagesTest.js
new file mode 100644
index 000000000..9186ff5bb
--- /dev/null
+++ b/js/tests/ElggLanguagesTest.js
@@ -0,0 +1,45 @@
+ElggLanguagesTest = TestCase("ElggLanguagesTest");
+
+ElggLanguagesTest.prototype.setUp = function() {
+ this.ajax = $.ajax;
+
+ //Immediately execute some dummy "returned" javascript instead of sending
+ //an actual ajax request
+ $.ajax = function(settings) {
+ var lang = settings.data.language;
+ elgg.config.translations[lang] = {'language':lang};
+ };
+};
+
+ElggLanguagesTest.prototype.tearDown = function() {
+ $.ajax = this.ajax;
+
+ //clear translations
+ elgg.config.translations['en'] = undefined;
+ elgg.config.translations['aa'] = undefined;
+};
+
+ElggLanguagesTest.prototype.testLoadTranslations = function() {
+ assertUndefined(elgg.config.translations['en']);
+ assertUndefined(elgg.config.translations['aa']);
+
+ elgg.reload_all_translations();
+ elgg.reload_all_translations('aa');
+
+ assertNotUndefined(elgg.config.translations['en']['language']);
+ assertNotUndefined(elgg.config.translations['aa']['language']);
+};
+
+ElggLanguagesTest.prototype.testElggEchoTranslates = function() {
+ elgg.reload_all_translations('en');
+ elgg.reload_all_translations('aa');
+
+ assertEquals('en', elgg.echo('language'));
+ assertEquals('aa', elgg.echo('language', 'aa'));
+};
+
+ElggLanguagesTest.prototype.testElggEchoFallsBackToDefaultLanguage = function() {
+ elgg.reload_all_translations('en');
+ assertEquals('en', elgg.echo('language', 'aa'));
+};
+
diff --git a/js/tests/ElggLibTest.js b/js/tests/ElggLibTest.js
new file mode 100644
index 000000000..bd39e7fb3
--- /dev/null
+++ b/js/tests/ElggLibTest.js
@@ -0,0 +1,140 @@
+/**
+ * Test basic elgg library functions
+ */
+ElggLibTest = TestCase("ElggLibTest");
+
+ElggLibTest.prototype.testGlobal = function() {
+ assertTrue(window === elgg.global);
+};
+
+ElggLibTest.prototype.testAssertTypeOf = function() {
+ [//Valid inputs
+ ['string', ''],
+ ['object', {}],
+ ['boolean', true],
+ ['boolean', false],
+ ['undefined', undefined],
+ ['number', 0],
+ ['function', elgg.nullFunction]
+ ].forEach(function(args) {
+ assertNoException(function() {
+ elgg.assertTypeOf.apply(undefined, args);
+ });
+ });
+
+ [//Invalid inputs
+ ['function', {}],
+ ['object', elgg.nullFunction]
+ ].forEach(function() {
+ assertException(function(args) {
+ elgg.assertTypeOf.apply(undefined, args);
+ });
+ });
+};
+
+ElggLibTest.prototype.testProvideDoesntClobber = function() {
+ elgg.provide('foo.bar.baz');
+
+ foo.bar.baz.oof = "test";
+
+ elgg.provide('foo.bar.baz');
+
+ assertEquals("test", foo.bar.baz.oof);
+};
+
+/**
+ * Try requiring bogus input
+ */
+ElggLibTest.prototype.testRequire = function () {
+ assertException(function(){ elgg.require(''); });
+ assertException(function(){ elgg.require('garbage'); });
+ assertException(function(){ elgg.require('gar.ba.ge'); });
+
+ assertNoException(function(){
+ elgg.require('jQuery');
+ elgg.require('elgg');
+ elgg.require('elgg.config');
+ elgg.require('elgg.security');
+ });
+};
+
+ElggLibTest.prototype.testInherit = function () {
+ function Base() {}
+ function Child() {}
+
+ elgg.inherit(Child, Base);
+
+ assertInstanceOf(Base, new Child());
+ assertEquals(Child, Child.prototype.constructor);
+};
+
+ElggLibTest.prototype.testNormalizeUrl = function() {
+ elgg.config.wwwroot = "http://elgg.org/";
+
+ [
+ ['', elgg.config.wwwroot],
+ ['test', elgg.config.wwwroot + 'test'],
+ ['http://example.com', 'http://example.com'],
+ ['https://example.com', 'https://example.com'],
+ ['http://example-time.com', 'http://example-time.com'],
+ ['//example.com', '//example.com'],
+ ['mod/my_plugin/graphics/image.jpg', elgg.config.wwwroot + 'mod/my_plugin/graphics/image.jpg'],
+
+ ['ftp://example.com/file', 'ftp://example.com/file'],
+ ['mailto:brett@elgg.org', 'mailto:brett@elgg.org'],
+ ['javascript:alert("test")', 'javascript:alert("test")'],
+ ['app://endpoint', 'app://endpoint'],
+
+ ['example.com', 'http://example.com'],
+ ['example.com/subpage', 'http://example.com/subpage'],
+
+ ['page/handler', elgg.config.wwwroot + 'page/handler'],
+ ['page/handler?p=v&p2=v2', elgg.config.wwwroot + 'page/handler?p=v&p2=v2'],
+ ['mod/plugin/file.php', elgg.config.wwwroot + 'mod/plugin/file.php'],
+ ['mod/plugin/file.php?p=v&p2=v2', elgg.config.wwwroot + 'mod/plugin/file.php?p=v&p2=v2'],
+ ['rootfile.php', elgg.config.wwwroot + 'rootfile.php'],
+ ['rootfile.php?p=v&p2=v2', elgg.config.wwwroot + 'rootfile.php?p=v&p2=v2'],
+
+ ['/page/handler', elgg.config.wwwroot + 'page/handler'],
+ ['/page/handler?p=v&p2=v2', elgg.config.wwwroot + 'page/handler?p=v&p2=v2'],
+ ['/mod/plugin/file.php', elgg.config.wwwroot + 'mod/plugin/file.php'],
+ ['/mod/plugin/file.php?p=v&p2=v2', elgg.config.wwwroot + 'mod/plugin/file.php?p=v&p2=v2'],
+ ['/rootfile.php', elgg.config.wwwroot + 'rootfile.php'],
+ ['/rootfile.php?p=v&p2=v2', elgg.config.wwwroot + 'rootfile.php?p=v&p2=v2']
+
+ ].forEach(function(args) {
+ assertEquals(args[1], elgg.normalize_url(args[0]));
+ });
+};
+
+ElggLibTest.prototype.testParseUrl = function() {
+
+ [
+ ["http://www.elgg.org/test/", {'scheme': 'http', 'host': 'www.elgg.org', 'path': '/test/'}],
+ ["https://www.elgg.org/test/", {'scheme': 'https', 'host': 'www.elgg.org', 'path': '/test/'}],
+ ["ftp://www.elgg.org/test/", {'scheme': 'ftp', 'host': 'www.elgg.org', 'path': '/test/'}],
+ ["http://elgg.org/test?val1=one&val2=two", {'scheme': 'http', 'host': 'elgg.org', 'path': '/test', 'query': 'val1=one&val2=two'}],
+ ["http://elgg.org:8080/", {'scheme': 'http', 'host': 'elgg.org', 'port': 8080, 'path': '/'}],
+ ["http://elgg.org/test#there", {'scheme': 'http', 'host': 'elgg.org', 'path': '/test', 'fragment': 'there'}],
+
+ ["test?val=one", {'host': 'test', 'query': 'val=one'}],
+ ["?val=one", {'query': 'val=one'}],
+
+ ["mailto:joe@elgg.org", {'scheme': 'mailto', 'path': 'joe@elgg.org'}],
+ ["javascript:load()", {'scheme': 'javascript', 'path': 'load()'}]
+
+ ].forEach(function(args) {
+ assertEquals(args[1], elgg.parse_url(args[0]));
+ });
+};
+
+ElggLibTest.prototype.testParseStr = function() {
+
+ [
+ ["A+%2B+B=A+%2B+B", {"A + B": "A + B"}]
+
+ ].forEach(function(args) {
+ assertEquals(args[1], elgg.parse_str(args[0]));
+ });
+};
+
diff --git a/js/tests/ElggPriorityListTest.js b/js/tests/ElggPriorityListTest.js
new file mode 100644
index 000000000..2329a8490
--- /dev/null
+++ b/js/tests/ElggPriorityListTest.js
@@ -0,0 +1,47 @@
+ElggPriorityListTest = TestCase("ElggPriorityListTest");
+
+ElggPriorityListTest.prototype.setUp = function() {
+ this.list = new elgg.ElggPriorityList();
+};
+
+ElggPriorityListTest.prototype.tearDown = function() {
+ this.list = null;
+};
+
+ElggPriorityListTest.prototype.testInsert = function() {
+ this.list.insert('foo');
+
+ assertEquals('foo', this.list.priorities_[500][0]);
+
+ this.list.insert('bar', 501);
+
+ assertEquals('bar', this.list.priorities_[501][0]);
+};
+
+ElggPriorityListTest.prototype.testInsertRespectsPriority = function() {
+ var values = [5, 4, 3, 2, 1, 0];
+
+ for (var i in values) {
+ this.list.insert(values[i], values[i]);
+ }
+
+ this.list.forEach(function(elem, idx) {
+ assertEquals(elem, idx);
+ })
+};
+
+ElggPriorityListTest.prototype.testInsertHandlesDuplicatePriorities = function() {
+ values = [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9];
+
+ for (var i in values) {
+ this.list.insert(values[i], values[i]/3);
+ }
+
+ this.list.forEach(function(elem, idx) {
+ assertEquals(elem, idx);
+ });
+};
+
+ElggPriorityListTest.prototype.testEveryDefaultsToTrue = function() {
+ assertTrue(this.list.every(function() {}));
+}; \ No newline at end of file
diff --git a/js/tests/ElggSecurityTest.js b/js/tests/ElggSecurityTest.js
new file mode 100644
index 000000000..107c0adbd
--- /dev/null
+++ b/js/tests/ElggSecurityTest.js
@@ -0,0 +1,75 @@
+ElggSecurityTest = TestCase("ElggSecurityTest");
+
+ElggSecurityTest.prototype.setUp = function() {
+ //fill with fake, but reasonable, values for testing
+ this.ts = elgg.security.token.__elgg_ts = 12345;
+ this.token = elgg.security.token.__elgg_token = 'abcdef';
+};
+
+ElggSecurityTest.prototype.testAddTokenAcceptsUndefined = function() {
+ var input,
+ expected = {
+ __elgg_ts: this.ts,
+ __elgg_token: this.token
+ };
+
+ assertEquals(expected, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testAddTokenAcceptsObject = function() {
+ var input = {},
+ expected = {
+ __elgg_ts: this.ts,
+ __elgg_token: this.token
+ };
+
+ assertEquals(expected, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testAddTokenAcceptsRelativeUrl = function() {
+ var input,
+ str = "__elgg_ts=" + this.ts + "&__elgg_token=" + this.token;
+
+ input = "test";
+ assertEquals(input + '?' + str, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testAddTokenAcceptsFullUrl = function() {
+ var input,
+ str = "__elgg_ts=" + this.ts + "&__elgg_token=" + this.token;
+
+ input = "http://elgg.org/";
+ assertEquals(input + '?' + str, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testAddTokenAcceptsQueryString = function() {
+ var input,
+ str = "__elgg_ts=" + this.ts + "&__elgg_token=" + this.token;
+
+ input = "?data=sofar";
+ assertEquals(input + '&' + str, elgg.security.addToken(input));
+
+ input = "test?data=sofar";
+ assertEquals(input + '&' + str, elgg.security.addToken(input));
+
+ input = "http://elgg.org/?data=sofar";
+ assertEquals(input + '&' + str, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testAddTokenAlreadyAdded = function() {
+ var input,
+ str = "__elgg_ts=" + this.ts + "&__elgg_token=" + this.token;
+
+ input = "http://elgg.org/?" + str + "&data=sofar";
+ assertEquals(input, elgg.security.addToken(input));
+};
+
+ElggSecurityTest.prototype.testSetTokenSetsElggSecurityToken = function() {
+ var json = {
+ __elgg_ts: 4567,
+ __elgg_token: 'abcdef'
+ };
+
+ elgg.security.setToken(json);
+ assertEquals(json, elgg.security.token);
+};
diff --git a/js/tests/ElggSessionTest.js b/js/tests/ElggSessionTest.js
new file mode 100644
index 000000000..5ff8ca13e
--- /dev/null
+++ b/js/tests/ElggSessionTest.js
@@ -0,0 +1,36 @@
+ElggSessionTest = TestCase("ElggSessionTest");
+
+ElggSessionTest.prototype.testGetCookie = function() {
+ assertEquals(document.cookie, elgg.session.cookie());
+};
+
+ElggSessionTest.prototype.testGetCookieKey = function() {
+ document.cookie = "name=value";
+ assertEquals('value', elgg.session.cookie('name'));
+
+ document.cookie = "name=value2";
+ assertEquals('value2', elgg.session.cookie('name'));
+
+ document.cookie = "name=value";
+ document.cookie = "name2=value2";
+ assertEquals('value', elgg.session.cookie('name'));
+ assertEquals('value2', elgg.session.cookie('name2'));
+};
+
+ElggSessionTest.prototype.testSetCookieKey = function() {
+ elgg.session.cookie('name', 'value');
+ assertEquals('value', elgg.session.cookie('name'));
+
+ elgg.session.cookie('name', 'value2');
+ assertEquals('value2', elgg.session.cookie('name'));
+
+ elgg.session.cookie('name', 'value');
+ elgg.session.cookie('name2', 'value2');
+ assertEquals('value', elgg.session.cookie('name'));
+ assertEquals('value2', elgg.session.cookie('name2'));
+
+ elgg.session.cookie('name', null);
+ elgg.session.cookie('name2', null);
+ assertUndefined(elgg.session.cookie('name'));
+ assertUndefined(elgg.session.cookie('name2'));
+}; \ No newline at end of file
diff --git a/js/tests/README b/js/tests/README
new file mode 100644
index 000000000..f43c0c89d
--- /dev/null
+++ b/js/tests/README
@@ -0,0 +1,25 @@
+Elgg JavaScript Unit Tests
+--------------------------
+
+Introduction
+============
+Elgg uses js-test-driver to run its unit tests. Instructions on obtaining,
+configuring, and using it are at http://code.google.com/p/js-test-driver/. It
+supports running the test in multiple browsers and debugging using web browser
+based debuggers. Visit its wiki at the Google Code site for more information.
+
+
+Sample Usage
+============
+ 1. Put jar file in the base directory of Elgg
+ 2. Run the server: java -jar JsTestDriver-1.3.5.jar --port 4224
+ 3. Point a web browser at http://localhost:4224
+ 4. Click "Capture this browser"
+ 5. Run the tests: java -jar JsTestDriver-1.3.5.jar --config js/tests/jsTestDriver.conf --basePath . --tests all
+
+
+Configuration Hints
+===================
+ * The port when running the server must be the same as listed in the
+ configuration file. If that port is being used, change the configuration file.
+ * The basePath must be the base directory of Elgg. \ No newline at end of file
diff --git a/js/tests/jsTestDriver.conf b/js/tests/jsTestDriver.conf
new file mode 100644
index 000000000..cc0b5d373
--- /dev/null
+++ b/js/tests/jsTestDriver.conf
@@ -0,0 +1,10 @@
+server: http://localhost:4224
+
+load:
+ - vendors/jquery/jquery-1.6.4.min.js
+ - vendors/sprintf.js
+ - js/lib/elgglib.js
+ - js/lib/hooks.js
+ - js/classes/*.js
+ - js/lib/*.js
+ - js/tests/*.js \ No newline at end of file
diff --git a/languages/en.php b/languages/en.php
index 27a670b38..07407d1e1 100644
--- a/languages/en.php
+++ b/languages/en.php
@@ -1,221 +1,1184 @@
<?php
/**
- * Tasks languages
+ * Core English Language
*
- * @package ElggTasks
+ * @package Elgg.Core
+ * @subpackage Languages.English
*/
$english = array(
+/**
+ * Sites
+ */
- /**
- * Menu items and titles
- */
+ 'item:site' => 'Sites',
- 'tasks' => "Tasks",
- 'tasks:owner' => "%s's tasks",
- 'tasks:friends' => "Friends' tasks",
- 'tasks:all' => "All site tasks",
- 'tasks:add' => "Add task",
- 'tasks:addlist' => "Add list",
-
- 'tasks:lists' => "Task lists",
- 'tasks:lists:owner' => "%s's task lists",
- 'tasks:lists:friends' => "Friends' task lists",
- 'tasks:lists:all' => "All site task lists",
+/**
+ * Sessions
+ */
- 'tasks:group' => "Group tasks",
- 'groups:enabletasks' => 'Enable group tasks',
+ 'login' => "Log in",
+ 'loginok' => "You have been logged in.",
+ 'loginerror' => "We couldn't log you in. Please check your credentials and try again.",
+ 'login:empty' => "Username/email and password are required.",
+ 'login:baduser' => "Unable to load your user account.",
+ 'auth:nopams' => "Internal error. No user authentication method installed.",
- 'tasks:edit' => "Edit this task",
- 'tasks:delete' => "Delete this task",
- 'tasks:view' => "View task",
-
- 'tasks:lists:add' => "Add a task list",
- 'tasks:lists:edit' => "Edit this task list",
- 'tasks:lists:delete' => "Delete this task list",
- 'tasks:lists:view' => "View task list",
-
- 'tasks:via' => "via tasks",
- 'item:object:tasklist_top' => 'Task lists top',
- 'item:object:tasklist' => 'Task lists ',
- 'item:object:task' => 'Tasks',
- 'tasks:nogroup' => 'This group does not have any tasks yet',
- 'tasks:more' => 'More tasks',
- 'tasks:none' => 'No tasks created yet',
- 'tasks:lists:none' => 'No task list created yet',
- 'tasks:this' => 'Task this',
- 'tasks:this:moreinfo' => 'You can find more info %s.',
- 'tasks:this:moreinfo:here' => 'here',
- 'tasks:this:referer:comment' => 'Created new task: %s.',
-
- 'tasks:priority:low' => 'Low priority',
- 'tasks:priority:normal' => 'Normal priority',
- 'tasks:priority:high' => 'High prioritiy',
-
- 'tasks:participant' => '%s participant',
- 'tasks:participants' => '%s participants',
- 'tasks:participants:see' => 'See who is participating in it',
-
- /**
- * River
- **/
-
- 'river:create:object:task' => '%s created a task %s',
- 'river:create:object:tasklist' => '%s created a task list %s',
- 'river:create:object:tasklist_top' => '%s created a task list %s',
- 'river:update:object:task' => '%s updated a task %s',
- 'river:update:object:tasklist' => '%s updated a task list %s',
- 'river:update:object:tasklist_top' => '%s updated a task list %s',
- 'river:comment:object:task' => '%s commented on a task titled %s',
- 'river:comment:object:tasklist' => '%s commented on a task list titled %s',
- 'river:comment:object:tasklist_top' => '%s commented on a task list titled %s',
-
- 'river:assign:object:task' => "%s assigned herself the task titled %s",
- 'river:activate:object:task' => "%s set as active the task titled %s",
- 'river:assign_and_activate:object:task' => "%s assigned herself and set as active the task titled %s",
- 'river:deactivate:object:task' => "%s unset as active the task titled %s",
- 'river:mark_as_done:object:task' => "%s set as done the task titled %s",
- 'river:reopen:object:task' => "%s reopened the task titled %s",
- 'river:leave:object:task' => "%s left to do the task titled %s",
- 'river:close:object:task' => "%s closed the task titled %s",
-
- /**
- * Form fields
- */
-
- 'tasks:title' => 'Name',
- 'tasks:description' => 'Description',
- 'tasks:list_guid' => 'List',
- 'tasks:priority' => 'Priority',
- 'tasks:tags' => 'Tags',
- 'tasks:elapsed_time' => 'Elapsed time',
- 'tasks:remaining_time' => 'Remaining time (time to finish the task)',
- 'tasks:access_id' => 'Who can see this task?',
-
- 'tasks:changehistory' => 'Change history',
- 'tasks:comments:post' => 'Save changes',
- 'tasks:add:gofull' => 'View full form',
-
- 'tasks:state:actions' => 'Actions',
- 'tasks:state:action:noaction' => 'Leave as <em>%s</em>',
- 'tasks:state:action:assign' => 'Accept this task',
- 'tasks:state:action:leave' => 'Leave this task',
- 'tasks:state:action:activate' => 'Set as your active task',
- 'tasks:state:action:deactivate' => 'Unset as your active task',
- 'tasks:state:action:assign_and_activate' => 'Accept this task and set as your active one',
- 'tasks:state:action:mark_as_done' => 'Mark this task as done',
- 'tasks:state:action:close' => 'Close this task',
- 'tasks:state:action:reopen' => 'Reopen this task',
-
- 'tasks:assigned' => 'Assigned tasks',
- 'tasks:unassigned' => 'Unassigned tasks',
- 'tasks:closed' => 'Closed tasks',
-
- 'tasks:lists:title' => 'Name',
- 'tasks:lists:description' => 'Description',
- 'tasks:lists:startdate' => 'Start date',
- 'tasks:enddate' => 'End date (deadline)',
- 'tasks:lists:tags' => 'Tags',
- 'tasks:lists:access_id' => 'Who can see this task list?',
-
- /**
- * Status and error messages
- */
- 'tasks:noaccess' => 'No access to task',
- 'tasks:cantedit' => 'You cannot edit this task',
- 'tasks:saved' => 'Task saved',
- 'tasks:notsaved' => 'Task could not be saved',
- 'tasks:error:no_title' => 'You must specify a title for this task.',
- 'tasks:delete:success' => 'The task was successfully deleted.',
- 'tasks:delete:failure' => 'The task could not be deleted.',
- 'tasks:status:changed' => 'The state of the task has been changed successfully',
-
- 'tasks:lists:noaccess' => 'No access to task list',
- 'tasks:lists:cantedit' => 'You cannot edit this task list',
- 'tasks:lists:saved' => 'Task list saved',
- 'tasks:lists:notsaved' => 'Task list could not be saved',
- 'tasks:lists:error:no_title' => 'You must specify a title for this task list.',
- 'tasks:lists:delete:success' => 'The task list was successfully deleted.',
- 'tasks:lists:delete:failure' => 'The task list could not be deleted.',
-
- /**
- * Task
- */
- 'tasks:strapline:new' => 'Reported %s by %s',
- 'tasks:strapline:assigned' => 'Assigned %s to %s',
- 'tasks:strapline:unassigned' => 'Unassigned %s to %s',
- 'tasks:strapline:active' => 'Assigned %s to %s',
- 'tasks:strapline:done' => 'Done %s by %s',
- 'tasks:strapline:closed' => 'Closed %s by %s',
- 'tasks:strapline:reopened' => 'Reopened %s by %s',
-
- /**
- * Task list
- */
- 'tasks:lists:strapline' => 'Created %s by %s. ',
- 'tasks:lists:deadline' => 'Deadline %s',
-
- 'tasks:lists:graph:total' => '%s tasks',
- 'tasks:lists:graph:remaining' => '%s remaining',
- 'tasks:lists:graph:assigned' => '%s assigned',
- 'tasks:lists:graph:active' => '%s active',
-
- /**
- * Change history
- */
-
- 'tasks:history:assign' => "assgined herself this task",
- 'tasks:history:activate' => "set this as her active task",
- 'tasks:history:deactivate' => "unset this as her active task",
- 'tasks:history:assign_and_activate' => "assigned and set this as her active task",
- 'tasks:history:mark_as_done' => "set this task as done",
- 'tasks:history:reopen' => "reopened this task",
- 'tasks:history:leave' => "left to do this task",
- 'tasks:history:close' => "closed this task (won't do)",
-
- /**
- * Widget
- **/
-
- 'tasks:active' => "Active tasks",
- 'tasks:num' => 'Number of tasks to display',
- 'tasks:widget:description' => "This is a list of your tasks.",
-
- /**
- * Submenu items
- */
- 'tasks:label:view' => "View task",
- 'tasks:label:edit' => "Edit task",
-
- 'tasks:lists:label:view' => "View task list",
- 'tasks:lists:label:edit' => "Edit task list",
-
- /**
- * Sidebar items
- */
- 'tasks:sidebar:this' => "This list",
- 'tasks:sidebar:children' => "List tasks",
- 'tasks:sidebar:list' => "List",
- 'tasks:navigation' => 'Tasks',
-
- 'tasks:newchild' => "Create a subtask",
- 'tasks:backtolist' => "Back to '%s'",
+ 'logout' => "Log out",
+ 'logoutok' => "You have been logged out.",
+ 'logouterror' => "We couldn't log you out. Please try again.",
+
+ 'loggedinrequired' => "You must be logged in to view that page.",
+ 'adminrequired' => "You must be an administrator to view that page.",
+ 'membershiprequired' => "You must be a member of this group to view that page.",
+
+
+/**
+ * Errors
+ */
+ 'exception:title' => "Fatal Error.",
+ 'exception:contact_admin' => 'An unrecoverable error has occurred and has been logged. Contact the site administrator with the following information:',
+
+ 'actionundefined' => "The requested action (%s) was not defined in the system.",
+ 'actionnotfound' => "The action file for %s was not found.",
+ 'actionloggedout' => "Sorry, you cannot perform this action while logged out.",
+ 'actionunauthorized' => 'You are unauthorized to perform this action',
+
+ 'InstallationException:SiteNotInstalled' => 'Unable to handle this request. This site '
+ . ' is not configured or the database is down.',
+ 'InstallationException:MissingLibrary' => 'Could not load %s',
+ 'InstallationException:CannotLoadSettings' => 'Elgg could not load the settings file. It does not exist or there is a file permissions issue.',
+
+ 'SecurityException:Codeblock' => "Denied access to execute privileged code block",
+ 'DatabaseException:WrongCredentials' => "Elgg couldn't connect to the database using the given credentials. Check the settings file.",
+ 'DatabaseException:NoConnect' => "Elgg couldn't select the database '%s', please check that the database is created and you have access to it.",
+ 'SecurityException:FunctionDenied' => "Access to privileged function '%s' is denied.",
+ 'DatabaseException:DBSetupIssues' => "There were a number of issues: ",
+ 'DatabaseException:ScriptNotFound' => "Elgg couldn't find the requested database script at %s.",
+ 'DatabaseException:InvalidQuery' => "Invalid query",
+ 'DatabaseException:InvalidDBLink' => "Connection to database was lost.",
+
+ 'IOException:FailedToLoadGUID' => "Failed to load new %s from GUID:%d",
+ 'InvalidParameterException:NonElggObject' => "Passing a non-ElggObject to an ElggObject constructor!",
+ 'InvalidParameterException:UnrecognisedValue' => "Unrecognised value passed to constuctor.",
+
+ 'InvalidClassException:NotValidElggStar' => "GUID:%d is not a valid %s",
+
+ 'PluginException:MisconfiguredPlugin' => "%s (guid: %s) is a misconfigured plugin. It has been disabled. Please search the Elgg wiki for possible causes (http://docs.elgg.org/wiki/).",
+ 'PluginException:CannotStart' => '%s (guid: %s) cannot start and has been deactivated. Reason: %s',
+ 'PluginException:InvalidID' => "%s is an invalid plugin ID.",
+ 'PluginException:InvalidPath' => "%s is an invalid plugin path.",
+ 'PluginException:InvalidManifest' => 'Invalid manifest file for plugin %s',
+ 'PluginException:InvalidPlugin' => '%s is not a valid plugin.',
+ 'PluginException:InvalidPlugin:Details' => '%s is not a valid plugin: %s',
+ 'PluginException:NullInstantiated' => 'ElggPlugin cannot be null instantiated. You must pass a GUID, a plugin ID, or a full path.',
+
+ 'ElggPlugin:MissingID' => 'Missing plugin ID (guid %s)',
+ 'ElggPlugin:NoPluginPackagePackage' => 'Missing ElggPluginPackage for plugin ID %s (guid %s)',
+
+ 'ElggPluginPackage:InvalidPlugin:MissingFile' => 'The required file "%s" is missing.',
+ 'ElggPluginPackage:InvalidPlugin:InvalidDependency' => 'Its manifest contains an invalid dependency type "%s".',
+ 'ElggPluginPackage:InvalidPlugin:InvalidProvides' => 'Its manifest contains an invalid provides type "%s".',
+ 'ElggPluginPackage:InvalidPlugin:CircularDep' => 'There is an invalid %s dependency "%s" in plugin %s. Plugins cannot conflict with or require something they provide!',
+
+ 'ElggPlugin:Exception:CannotIncludeFile' => 'Cannot include %s for plugin %s (guid: %s) at %s.',
+ 'ElggPlugin:Exception:CannotRegisterViews' => 'Cannot open views dir for plugin %s (guid: %s) at %s.',
+ 'ElggPlugin:Exception:CannotRegisterLanguages' => 'Cannot register languages for plugin %s (guid: %s) at %s.',
+ 'ElggPlugin:Exception:NoID' => 'No ID for plugin guid %s!',
+
+ 'PluginException:ParserError' => 'Error parsing manifest with API version %s in plugin %s.',
+ 'PluginException:NoAvailableParser' => 'Cannot find a parser for manifest API version %s in plugin %s.',
+ 'PluginException:ParserErrorMissingRequiredAttribute' => "Missing required '%s' attribute in manifest for plugin %s.",
+
+ 'ElggPlugin:Dependencies:Requires' => 'Requires',
+ 'ElggPlugin:Dependencies:Suggests' => 'Suggests',
+ 'ElggPlugin:Dependencies:Conflicts' => 'Conflicts',
+ 'ElggPlugin:Dependencies:Conflicted' => 'Conflicted',
+ 'ElggPlugin:Dependencies:Provides' => 'Provides',
+ 'ElggPlugin:Dependencies:Priority' => 'Priority',
+
+ 'ElggPlugin:Dependencies:Elgg' => 'Elgg version',
+ 'ElggPlugin:Dependencies:PhpExtension' => 'PHP extension: %s',
+ 'ElggPlugin:Dependencies:PhpIni' => 'PHP ini setting: %s',
+ 'ElggPlugin:Dependencies:Plugin' => 'Plugin: %s',
+ 'ElggPlugin:Dependencies:Priority:After' => 'After %s',
+ 'ElggPlugin:Dependencies:Priority:Before' => 'Before %s',
+ 'ElggPlugin:Dependencies:Priority:Uninstalled' => '%s is not installed',
+ 'ElggPlugin:Dependencies:Suggests:Unsatisfied' => 'Missing',
- /**
- * Times
- */
- 'friendlytime:future:minutes' => "in %s minutes",
- 'friendlytime:future:minutes:singular' => "in a minute",
- 'friendlytime:future:hours' => "in %s hours",
- 'friendlytime:future:hours:singular' => "in an hour",
- 'friendlytime:future:days' => "in %s days",
- 'friendlytime:future:days:singular' => "tomorrow",
-
- /**
- * Comments
- */
- 'tasks:email:subject' => 'Task changed state',
- 'tasks:email:body' => "%s changed your task \"%s\" state to %s.
+ 'ElggPlugin:Dependencies:ActiveDependent' => 'There are other plugins that list %s as a dependency. You must disable the following plugins before disabling this one: %s',
+
+ 'ElggPlugin:InvalidAndDeactivated' => '%s is an invalid plugin and has been deactivated.',
+
+ 'InvalidParameterException:NonElggUser' => "Passing a non-ElggUser to an ElggUser constructor!",
+
+ 'InvalidParameterException:NonElggSite' => "Passing a non-ElggSite to an ElggSite constructor!",
+
+ 'InvalidParameterException:NonElggGroup' => "Passing a non-ElggGroup to an ElggGroup constructor!",
+
+ 'IOException:UnableToSaveNew' => "Unable to save new %s",
+
+ 'InvalidParameterException:GUIDNotForExport' => "GUID has not been specified during export, this should never happen.",
+ 'InvalidParameterException:NonArrayReturnValue' => "Entity serialisation function passed a non-array returnvalue parameter",
+
+ 'ConfigurationException:NoCachePath' => "Cache path set to nothing!",
+ 'IOException:NotDirectory' => "%s is not a directory.",
+
+ 'IOException:BaseEntitySaveFailed' => "Unable to save new object's base entity information!",
+ 'InvalidParameterException:UnexpectedODDClass' => "import() passed an unexpected ODD class",
+ 'InvalidParameterException:EntityTypeNotSet' => "Entity type must be set.",
+
+ 'ClassException:ClassnameNotClass' => "%s is not a %s.",
+ 'ClassNotFoundException:MissingClass' => "Class '%s' was not found, missing plugin?",
+ 'InstallationException:TypeNotSupported' => "Type %s is not supported. This indicates an error in your installation, most likely caused by an incomplete upgrade.",
+
+ 'ImportException:ImportFailed' => "Could not import element %d",
+ 'ImportException:ProblemSaving' => "There was a problem saving %s",
+ 'ImportException:NoGUID' => "New entity created but has no GUID, this should not happen.",
+
+ 'ImportException:GUIDNotFound' => "Entity '%d' could not be found.",
+ 'ImportException:ProblemUpdatingMeta' => "There was a problem updating '%s' on entity '%d'",
+
+ 'ExportException:NoSuchEntity' => "No such entity GUID:%d",
+
+ 'ImportException:NoODDElements' => "No OpenDD elements found in import data, import failed.",
+ 'ImportException:NotAllImported' => "Not all elements were imported.",
+
+ 'InvalidParameterException:UnrecognisedFileMode' => "Unrecognised file mode '%s'",
+ 'InvalidParameterException:MissingOwner' => "File %s (file guid:%d) (owner guid:%d) is missing an owner!",
+ 'IOException:CouldNotMake' => "Could not make %s",
+ 'IOException:MissingFileName' => "You must specify a name before opening a file.",
+ 'ClassNotFoundException:NotFoundNotSavedWithFile' => "Unable to load filestore class %s for file %u",
+ 'NotificationException:NoNotificationMethod' => "No notification method specified.",
+ 'NotificationException:NoHandlerFound' => "No handler found for '%s' or it was not callable.",
+ 'NotificationException:ErrorNotifyingGuid' => "There was an error while notifying %d",
+ 'NotificationException:NoEmailAddress' => "Could not get the email address for GUID:%d",
+ 'NotificationException:MissingParameter' => "Missing a required parameter, '%s'",
+
+ 'DatabaseException:WhereSetNonQuery' => "Where set contains non WhereQueryComponent",
+ 'DatabaseException:SelectFieldsMissing' => "Fields missing on a select style query",
+ 'DatabaseException:UnspecifiedQueryType' => "Unrecognised or unspecified query type.",
+ 'DatabaseException:NoTablesSpecified' => "No tables specified for query.",
+ 'DatabaseException:NoACL' => "No access control was provided on query",
+
+ 'InvalidParameterException:NoEntityFound' => "No entity found, it either doesn't exist or you don't have access to it.",
+
+ 'InvalidParameterException:GUIDNotFound' => "GUID:%s could not be found, or you can not access it.",
+ 'InvalidParameterException:IdNotExistForGUID' => "Sorry, '%s' does not exist for guid:%d",
+ 'InvalidParameterException:CanNotExportType' => "Sorry, I don't know how to export '%s'",
+ 'InvalidParameterException:NoDataFound' => "Could not find any data.",
+ 'InvalidParameterException:DoesNotBelong' => "Does not belong to entity.",
+ 'InvalidParameterException:DoesNotBelongOrRefer' => "Does not belong to entity or refer to entity.",
+ 'InvalidParameterException:MissingParameter' => "Missing parameter, you need to provide a GUID.",
+ 'InvalidParameterException:LibraryNotRegistered' => '%s is not a registered library',
+ 'InvalidParameterException:LibraryNotFound' => 'Could not load the %s library from %s',
+
+ 'APIException:ApiResultUnknown' => "API Result is of an unknown type, this should never happen.",
+ 'ConfigurationException:NoSiteID' => "No site ID has been specified.",
+ 'SecurityException:APIAccessDenied' => "Sorry, API access has been disabled by the administrator.",
+ 'SecurityException:NoAuthMethods' => "No authentication methods were found that could authenticate this API request.",
+ 'SecurityException:ForwardFailedToRedirect' => 'Redirect could not be issued due to headers already being sent. Halting execution for security. Output started in file %s at line %d. Search http://docs.elgg.org/ for more information.',
+ 'InvalidParameterException:APIMethodOrFunctionNotSet' => "Method or function not set in call in expose_method()",
+ 'InvalidParameterException:APIParametersArrayStructure' => "Parameters array structure is incorrect for call to expose method '%s'",
+ 'InvalidParameterException:UnrecognisedHttpMethod' => "Unrecognised http method %s for api method '%s'",
+ 'APIException:MissingParameterInMethod' => "Missing parameter %s in method %s",
+ 'APIException:ParameterNotArray' => "%s does not appear to be an array.",
+ 'APIException:UnrecognisedTypeCast' => "Unrecognised type in cast %s for variable '%s' in method '%s'",
+ 'APIException:InvalidParameter' => "Invalid parameter found for '%s' in method '%s'.",
+ 'APIException:FunctionParseError' => "%s(%s) has a parsing error.",
+ 'APIException:FunctionNoReturn' => "%s(%s) returned no value.",
+ 'APIException:APIAuthenticationFailed' => "Method call failed the API Authentication",
+ 'APIException:UserAuthenticationFailed' => "Method call failed the User Authentication",
+ 'SecurityException:AuthTokenExpired' => "Authentication token either missing, invalid or expired.",
+ 'CallException:InvalidCallMethod' => "%s must be called using '%s'",
+ 'APIException:MethodCallNotImplemented' => "Method call '%s' has not been implemented.",
+ 'APIException:FunctionDoesNotExist' => "Function for method '%s' is not callable",
+ 'APIException:AlgorithmNotSupported' => "Algorithm '%s' is not supported or has been disabled.",
+ 'ConfigurationException:CacheDirNotSet' => "Cache directory 'cache_path' not set.",
+ 'APIException:NotGetOrPost' => "Request method must be GET or POST",
+ 'APIException:MissingAPIKey' => "Missing API key",
+ 'APIException:BadAPIKey' => "Bad API key",
+ 'APIException:MissingHmac' => "Missing X-Elgg-hmac header",
+ 'APIException:MissingHmacAlgo' => "Missing X-Elgg-hmac-algo header",
+ 'APIException:MissingTime' => "Missing X-Elgg-time header",
+ 'APIException:MissingNonce' => "Missing X-Elgg-nonce header",
+ 'APIException:TemporalDrift' => "X-Elgg-time is too far in the past or future. Epoch fail.",
+ 'APIException:NoQueryString' => "No data on the query string",
+ 'APIException:MissingPOSTHash' => "Missing X-Elgg-posthash header",
+ 'APIException:MissingPOSTAlgo' => "Missing X-Elgg-posthash_algo header",
+ 'APIException:MissingContentType' => "Missing content type for post data",
+ 'SecurityException:InvalidPostHash' => "POST data hash is invalid - Expected %s but got %s.",
+ 'SecurityException:DupePacket' => "Packet signature already seen.",
+ 'SecurityException:InvalidAPIKey' => "Invalid or missing API Key.",
+ 'NotImplementedException:CallMethodNotImplemented' => "Call method '%s' is currently not supported.",
+
+ 'NotImplementedException:XMLRPCMethodNotImplemented' => "XML-RPC method call '%s' not implemented.",
+ 'InvalidParameterException:UnexpectedReturnFormat' => "Call to method '%s' returned an unexpected result.",
+ 'CallException:NotRPCCall' => "Call does not appear to be a valid XML-RPC call",
+
+ 'PluginException:NoPluginName' => "The plugin name could not be found",
+
+ 'SecurityException:authenticationfailed' => "User could not be authenticated",
+
+ 'CronException:unknownperiod' => '%s is not a recognised period.',
+
+ 'SecurityException:deletedisablecurrentsite' => 'You can not delete or disable the site you are currently viewing!',
+
+ 'RegistrationException:EmptyPassword' => 'The password fields cannot be empty',
+ 'RegistrationException:PasswordMismatch' => 'Passwords must match',
+ 'LoginException:BannedUser' => 'You have been banned from this site and cannot log in',
+ 'LoginException:UsernameFailure' => 'We could not log you in. Please check your username/email and password.',
+ 'LoginException:PasswordFailure' => 'We could not log you in. Please check your username/email and password.',
+ 'LoginException:AccountLocked' => 'Your account has been locked for too many log in failures.',
+ 'LoginException:ChangePasswordFailure' => 'Failed current password check.',
+ 'LoginException:Unknown' => 'We could not log you in due to an unknown error.',
+
+ 'deprecatedfunction' => 'Warning: This code uses the deprecated function \'%s\' and is not compatible with this version of Elgg',
+
+ 'pageownerunavailable' => 'Warning: The page owner %d is not accessible!',
+ 'viewfailure' => 'There was an internal failure in the view %s',
+ 'changebookmark' => 'Please change your bookmark for this page',
+ 'noaccess' => 'You need to login to view this content or the content has been removed or you do not have permission to view it.',
+ 'error:missing_data' => 'There was some data missing in your request',
+
+ 'error:default' => 'Oops...something went wrong.',
+ 'error:404' => 'Sorry. We could not find the page that you requested.',
+
+/**
+ * API
+ */
+ 'system.api.list' => "List all available API calls on the system.",
+ 'auth.gettoken' => "This API call lets a user obtain a user authentication token which can be used for authenticating future API calls. Pass it as the parameter auth_token",
+
+/**
+ * User details
+ */
+
+ 'name' => "Display name",
+ 'email' => "Email address",
+ 'username' => "Username",
+ 'loginusername' => "Username or email",
+ 'password' => "Password",
+ 'passwordagain' => "Password (again for verification)",
+ 'admin_option' => "Make this user an admin?",
+
+/**
+ * Access
+ */
+
+ 'PRIVATE' => "Private",
+ 'LOGGED_IN' => "Logged in users",
+ 'PUBLIC' => "Public",
+ 'access:friends:label' => "Friends",
+ 'access' => "Access",
+ 'access:limited:label' => "Limited",
+ 'access:help' => "The access level",
+
+/**
+ * Dashboard and widgets
+ */
+
+ 'dashboard' => "Dashboard",
+ 'dashboard:nowidgets' => "Your dashboard lets you track the activity and content on this site that matters to you.",
+
+ 'widgets:add' => 'Add widgets',
+ 'widgets:add:description' => "Click on any widget button below to add it to the page.",
+ 'widgets:position:fixed' => '(Fixed position on page)',
+ 'widget:unavailable' => 'You have already added this widget',
+ 'widget:numbertodisplay' => 'Number of items to display',
+
+ 'widget:delete' => 'Remove %s',
+ 'widget:edit' => 'Customize this widget',
+
+ 'widgets' => "Widgets",
+ 'widget' => "Widget",
+ 'item:object:widget' => "Widgets",
+ 'widgets:save:success' => "The widget was successfully saved.",
+ 'widgets:save:failure' => "We could not save your widget.",
+ 'widgets:add:success' => "The widget was successfully added.",
+ 'widgets:add:failure' => "We could not add your widget.",
+ 'widgets:move:failure' => "We could not store the new widget position.",
+ 'widgets:remove:failure' => "Unable to remove this widget",
+
+/**
+ * Groups
+ */
+
+ 'group' => "Group",
+ 'item:group' => "Groups",
+
+/**
+ * Users
+ */
+
+ 'user' => "User",
+ 'item:user' => "Users",
+
+/**
+ * Friends
+ */
+
+ 'friends' => "Friends",
+ 'friends:yours' => "Your friends",
+ 'friends:owned' => "%s's friends",
+ 'friend:add' => "Add friend",
+ 'friend:remove' => "Remove friend",
+
+ 'friends:add:successful' => "You have successfully added %s as a friend.",
+ 'friends:add:failure' => "We couldn't add %s as a friend.",
+
+ 'friends:remove:successful' => "You have successfully removed %s from your friends.",
+ 'friends:remove:failure' => "We couldn't remove %s from your friends.",
+
+ 'friends:none' => "No friends yet.",
+ 'friends:none:you' => "You don't have any friends yet.",
+
+ 'friends:none:found' => "No friends were found.",
+
+ 'friends:of:none' => "Nobody has added this user as a friend yet.",
+ 'friends:of:none:you' => "Nobody has added you as a friend yet. Start adding content and fill in your profile to let people find you!",
+
+ 'friends:of:owned' => "People who have made %s a friend",
+
+ 'friends:of' => "Friends of",
+ 'friends:collections' => "Friend collections",
+ 'collections:add' => "New collection",
+ 'friends:collections:add' => "New friends collection",
+ 'friends:addfriends' => "Select friends",
+ 'friends:collectionname' => "Collection name",
+ 'friends:collectionfriends' => "Friends in collection",
+ 'friends:collectionedit' => "Edit this collection",
+ 'friends:nocollections' => "You do not have any collections yet.",
+ 'friends:collectiondeleted' => "Your collection has been deleted.",
+ 'friends:collectiondeletefailed' => "We were unable to delete the collection. Either you don't have permission, or some other problem has occurred.",
+ 'friends:collectionadded' => "Your collection was successfully created",
+ 'friends:nocollectionname' => "You need to give your collection a name before it can be created.",
+ 'friends:collections:members' => "Collection members",
+ 'friends:collections:edit' => "Edit collection",
+ 'friends:collections:edited' => "Saved collection",
+ 'friends:collection:edit_failed' => 'Could not save collection.',
+
+ 'friendspicker:chararray' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+
+ 'avatar' => 'Avatar',
+ 'avatar:noaccess' => "You're not allowed to edit this user's avatar",
+ 'avatar:create' => 'Create your avatar',
+ 'avatar:edit' => 'Edit avatar',
+ 'avatar:preview' => 'Preview',
+ 'avatar:upload' => 'Upload a new avatar',
+ 'avatar:current' => 'Current avatar',
+ 'avatar:remove' => 'Remove your avatar and set the default icon',
+ 'avatar:crop:title' => 'Avatar cropping tool',
+ 'avatar:upload:instructions' => "Your avatar is displayed throughout the site. You can change it as often as you'd like. (File formats accepted: GIF, JPG or PNG)",
+ 'avatar:create:instructions' => 'Click and drag a square below to match how you want your avatar cropped. A preview will appear in the box on the right. When you are happy with the preview, click \'Create your avatar\'. This cropped version will be used throughout the site as your avatar.',
+ 'avatar:upload:success' => 'Avatar successfully uploaded',
+ 'avatar:upload:fail' => 'Avatar upload failed',
+ 'avatar:resize:fail' => 'Resize of the avatar failed',
+ 'avatar:crop:success' => 'Cropping the avatar succeeded',
+ 'avatar:crop:fail' => 'Avatar cropping failed',
+ 'avatar:remove:success' => 'Removing the avatar succeeded',
+ 'avatar:remove:fail' => 'Avatar remove failed',
+
+ 'profile:edit' => 'Edit profile',
+ 'profile:aboutme' => "About me",
+ 'profile:description' => "About me",
+ 'profile:briefdescription' => "Brief description",
+ 'profile:location' => "Location",
+ 'profile:skills' => "Skills",
+ 'profile:interests' => "Interests",
+ 'profile:contactemail' => "Contact email",
+ 'profile:phone' => "Telephone",
+ 'profile:mobile' => "Mobile phone",
+ 'profile:website' => "Website",
+ 'profile:twitter' => "Twitter username",
+ 'profile:saved' => "Your profile was successfully saved.",
+
+ 'profile:field:text' => 'Short text',
+ 'profile:field:longtext' => 'Large text area',
+ 'profile:field:tags' => 'Tags',
+ 'profile:field:url' => 'Web address',
+ 'profile:field:email' => 'Email address',
+ 'profile:field:location' => 'Location',
+ 'profile:field:date' => 'Date',
+
+ 'admin:appearance:profile_fields' => 'Edit Profile Fields',
+ 'profile:edit:default' => 'Edit profile fields',
+ 'profile:label' => "Profile label",
+ 'profile:type' => "Profile type",
+ 'profile:editdefault:delete:fail' => 'Removed default profile item field failed',
+ 'profile:editdefault:delete:success' => 'Profile field deleted',
+ 'profile:defaultprofile:reset' => 'Profile fields reset to the system default',
+ 'profile:resetdefault' => 'Reset profile fields to system defaults',
+ 'profile:resetdefault:confirm' => 'Are you sure you want to delete your custom profile fields?',
+ 'profile:explainchangefields' => "You can replace the existing profile fields with your own using the form below. \n\n Give the new profile field a label, for example, 'Favorite team', then select the field type (eg. text, url, tags), and click the 'Add' button. To re-order the fields drag on the handle next to the field label. To edit a field label - click on the label's text to make it editable. \n\n At any time you can revert back to the default profile set up, but you will lose any information already entered into custom fields on profile pages.",
+ 'profile:editdefault:success' => 'New profile field added',
+ 'profile:editdefault:fail' => 'Default profile could not be saved',
+ 'profile:field_too_long' => 'Cannot save your profile information because the "%s" section is too long.',
+ 'profile:noaccess' => "You do not have permission to edit this profile.",
+
+
+/**
+ * Feeds
+ */
+ 'feed:rss' => 'RSS feed for this page',
+/**
+ * Links
+ */
+ 'link:view' => 'view link',
+ 'link:view:all' => 'View all',
+
+
+/**
+ * River
+ */
+ 'river' => "River",
+ 'river:friend:user:default' => "%s is now a friend with %s",
+ 'river:update:user:avatar' => '%s has a new avatar',
+ 'river:update:user:profile' => '%s has updated their profile',
+ 'river:noaccess' => 'You do not have permission to view this item.',
+ 'river:posted:generic' => '%s posted',
+ 'riveritem:single:user' => 'a user',
+ 'riveritem:plural:user' => 'some users',
+ 'river:ingroup' => 'in the group %s',
+ 'river:none' => 'No activity',
+ 'river:update' => 'Update for %s',
+ 'river:delete:success' => 'River item has been deleted',
+ 'river:delete:fail' => 'River item could not be deleted',
+
+ 'river:widget:title' => "Activity",
+ 'river:widget:description' => "Display latest activity",
+ 'river:widget:type' => "Type of activity",
+ 'river:widgets:friends' => 'Friends activity',
+ 'river:widgets:all' => 'All site activity',
+
+/**
+ * Notifications
+ */
+ 'notifications:usersettings' => "Notification settings",
+ 'notifications:methods' => "Select your notification methods.",
+ 'notification:method:email' => 'Email',
+
+ 'notifications:usersettings:save:ok' => "Your notification settings were successfully saved.",
+ 'notifications:usersettings:save:fail' => "There was a problem saving your notification settings.",
+
+ 'user.notification.get' => 'Return the notification settings for a given user.',
+ 'user.notification.set' => 'Set the notification settings for a given user.',
+/**
+ * Search
+ */
+
+ 'search' => "Search",
+ 'searchtitle' => "Search: %s",
+ 'users:searchtitle' => "Searching for users: %s",
+ 'groups:searchtitle' => "Searching for groups: %s",
+ 'advancedsearchtitle' => "%s with results matching %s",
+ 'notfound' => "No results found.",
+ 'next' => "Next",
+ 'previous' => "Previous",
+
+ 'viewtype:change' => "Change list type",
+ 'viewtype:list' => "List view",
+ 'viewtype:gallery' => "Gallery",
+
+ 'tag:search:startblurb' => "Items with tags matching '%s':",
+
+ 'user:search:startblurb' => "Users matching '%s':",
+ 'user:search:finishblurb' => "To view more, click here.",
+
+ 'group:search:startblurb' => "Groups matching '%s':",
+ 'group:search:finishblurb' => "To view more, click here.",
+ 'search:go' => 'Go',
+ 'userpicker:only_friends' => 'Only friends',
+
+/**
+ * Account
+ */
+
+ 'account' => "Account",
+ 'settings' => "Settings",
+ 'tools' => "Tools",
+ 'settings:edit' => 'Edit settings',
+
+ 'register' => "Register",
+ 'registerok' => "You have successfully registered for %s.",
+ 'registerbad' => "Your registration was unsuccessful because of an unknown error.",
+ 'registerdisabled' => "Registration has been disabled by the system administrator",
+ 'register:fields' => 'All fields are required',
+
+ 'registration:notemail' => 'The email address you provided does not appear to be a valid email address.',
+ 'registration:userexists' => 'That username already exists',
+ 'registration:usernametooshort' => 'Your username must be a minimum of %u characters long.',
+ 'registration:usernametoolong' => 'Your username is too long. It can have a maximum of %u characters.',
+ 'registration:passwordtooshort' => 'The password must be a minimum of %u characters long.',
+ 'registration:dupeemail' => 'This email address has already been registered.',
+ 'registration:invalidchars' => 'Sorry, your username contains the character %s which is invalid. The following characters are invalid: %s',
+ 'registration:emailnotvalid' => 'Sorry, the email address you entered is invalid on this system',
+ 'registration:passwordnotvalid' => 'Sorry, the password you entered is invalid on this system',
+ 'registration:usernamenotvalid' => 'Sorry, the username you entered is invalid on this system',
+
+ 'adduser' => "Add User",
+ 'adduser:ok' => "You have successfully added a new user.",
+ 'adduser:bad' => "The new user could not be created.",
+
+ 'user:set:name' => "Account name settings",
+ 'user:name:label' => "My display name",
+ 'user:name:success' => "Successfully changed your name on the system.",
+ 'user:name:fail' => "Could not change your name on the system. Please make sure your name isn't too long and try again.",
+
+ 'user:set:password' => "Account password",
+ 'user:current_password:label' => 'Current password',
+ 'user:password:label' => "Your new password",
+ 'user:password2:label' => "Your new password again",
+ 'user:password:success' => "Password changed",
+ 'user:password:fail' => "Could not change your password on the system.",
+ 'user:password:fail:notsame' => "The two passwords are not the same!",
+ 'user:password:fail:tooshort' => "Password is too short!",
+ 'user:password:fail:incorrect_current_password' => 'The current password entered is incorrect.',
+ 'user:resetpassword:unknown_user' => 'Invalid user.',
+ 'user:resetpassword:reset_password_confirm' => 'Resetting your password will email a new password to your registered email address.',
+
+ 'user:set:language' => "Language settings",
+ 'user:language:label' => "Your language",
+ 'user:language:success' => "Your language settings have been updated.",
+ 'user:language:fail' => "Your language settings could not be saved.",
+
+ 'user:username:notfound' => 'Username %s not found.',
+
+ 'user:password:lost' => 'Lost password',
+ 'user:password:resetreq:success' => 'Successfully requested a new password, email sent',
+ 'user:password:resetreq:fail' => 'Could not request a new password.',
+
+ 'user:password:text' => 'To request a new password, enter your username or email address below and click the Request button.',
+
+ 'user:persistent' => 'Remember me',
+
+ 'walled_garden:welcome' => 'Welcome to',
+
+/**
+ * Administration
+ */
+ 'menu:page:header:administer' => 'Administer',
+ 'menu:page:header:configure' => 'Configure',
+ 'menu:page:header:develop' => 'Develop',
+ 'menu:page:header:default' => 'Other',
+
+ 'admin:view_site' => 'View site',
+ 'admin:loggedin' => 'Logged in as %s',
+ 'admin:menu' => 'Menu',
+
+ 'admin:configuration:success' => "Your settings have been saved.",
+ 'admin:configuration:fail' => "Your settings could not be saved.",
+ 'admin:configuration:dataroot:relative_path' => 'Cannot set "%s" as the dataroot because it is not an absolute path.',
+
+ 'admin:unknown_section' => 'Invalid Admin Section.',
+
+ 'admin' => "Administration",
+ 'admin:description' => "The admin panel allows you to control all aspects of the system, from user management to how plugins behave. Choose an option below to get started.",
+
+ 'admin:statistics' => "Statistics",
+ 'admin:statistics:overview' => 'Overview',
+ 'admin:statistics:server' => 'Server Info',
+
+ 'admin:appearance' => 'Appearance',
+ 'admin:administer_utilities' => 'Utilities',
+ 'admin:develop_utilities' => 'Utilities',
+
+ 'admin:users' => "Users",
+ 'admin:users:online' => 'Currently Online',
+ 'admin:users:newest' => 'Newest',
+ 'admin:users:admins' => 'Administrators',
+ 'admin:users:add' => 'Add New User',
+ 'admin:users:description' => "This admin panel allows you to control user settings for your site. Choose an option below to get started.",
+ 'admin:users:adduser:label' => "Click here to add a new user...",
+ 'admin:users:opt:linktext' => "Configure users...",
+ 'admin:users:opt:description' => "Configure users and account information. ",
+ 'admin:users:find' => 'Find',
+
+ 'admin:settings' => 'Settings',
+ 'admin:settings:basic' => 'Basic Settings',
+ 'admin:settings:advanced' => 'Advanced Settings',
+ 'admin:settings:advanced/site_secret' => 'Site Secret',
+ 'admin:site:description' => "This admin panel allows you to control global settings for your site. Choose an option below to get started.",
+ 'admin:settings:advanced:site_secret' => 'Site Secret',
+ 'admin:site:opt:linktext' => "Configure site...",
+ 'admin:site:access:warning' => "Changing the access setting only affects the permissions on content created in the future.",
+
+ 'admin:site:secret:intro' => 'Elgg uses a key to create security tokens for various purposes.',
+ 'admin:site:secret_regenerated' => "Your site secret has been regenerated.",
+ 'admin:site:secret:regenerate' => "Regenerate site secret",
+ 'admin:site:secret:regenerate:help' => "Note: This may inconvenience some users by invalidating tokens used in \"remember me\" cookies, e-mail validation requests, invitation codes, etc.",
+ 'site_secret:current_strength' => 'Key Strength',
+ 'site_secret:strength:weak' => "Weak",
+ 'site_secret:strength_msg:weak' => "We strongly recommend that you regenerate your site secret.",
+ 'site_secret:strength:moderate' => "Moderate",
+ 'site_secret:strength_msg:moderate' => "We recommend you regenerate your site secret for the best site security.",
+ 'site_secret:strength:strong' => "Strong",
+ 'site_secret:strength_msg:strong' => "&#x2713; Your site secret is sufficiently strong.",
+
+ 'admin:dashboard' => 'Dashboard',
+ 'admin:widget:online_users' => 'Online users',
+ 'admin:widget:online_users:help' => 'Lists the users currently on the site',
+ 'admin:widget:new_users' => 'New users',
+ 'admin:widget:new_users:help' => 'Lists the newest users',
+ 'admin:widget:content_stats' => 'Content statistics',
+ 'admin:widget:content_stats:help' => 'Keep track of the content created by your users',
+ 'widget:content_stats:type' => 'Content type',
+ 'widget:content_stats:number' => 'Number',
+
+ 'admin:widget:admin_welcome' => 'Welcome',
+ 'admin:widget:admin_welcome:help' => "A short introduction to Elgg's admin area",
+ 'admin:widget:admin_welcome:intro' =>
+'Welcome to Elgg! Right now you are looking at the administration dashboard. It\'s useful for tracking what\'s happening on the site.',
+
+ 'admin:widget:admin_welcome:admin_overview' =>
+"Navigation for the administration area is provided by the menu to the right. It is organized into"
+. " three sections:
+ <dl>
+ <dt>Administer</dt><dd>Everyday tasks like monitoring reported content, checking who is online, and viewing statistics.</dd>
+ <dt>Configure</dt><dd>Occasional tasks like setting the site name or activating a plugin.</dd>
+ <dt>Develop</dt><dd>For developers who are building plugins or designing themes. (Requires a developer plugin.)</dd>
+ </dl>
+ ",
+
+ // argh, this is ugly
+ 'admin:widget:admin_welcome:outro' => '<br />Be sure to check out the resources available through the footer links and thank you for using Elgg!',
+
+ 'admin:widget:control_panel' => 'Control panel',
+ 'admin:widget:control_panel:help' => "Provides easy access to common controls",
+
+ 'admin:cache:flush' => 'Flush the caches',
+ 'admin:cache:flushed' => "The site's caches have been flushed",
+
+ 'admin:footer:faq' => 'Administration FAQ',
+ 'admin:footer:manual' => 'Administration Manual',
+ 'admin:footer:community_forums' => 'Elgg Community Forums',
+ 'admin:footer:blog' => 'Elgg Blog',
+
+ 'admin:plugins:category:all' => 'All plugins',
+ 'admin:plugins:category:active' => 'Active plugins',
+ 'admin:plugins:category:inactive' => 'Inactive plugins',
+ 'admin:plugins:category:admin' => 'Admin',
+ 'admin:plugins:category:bundled' => 'Bundled',
+ 'admin:plugins:category:nonbundled' => 'Non-bundled',
+ 'admin:plugins:category:content' => 'Content',
+ 'admin:plugins:category:development' => 'Development',
+ 'admin:plugins:category:enhancement' => 'Enhancements',
+ 'admin:plugins:category:api' => 'Service/API',
+ 'admin:plugins:category:communication' => 'Communication',
+ 'admin:plugins:category:security' => 'Security and Spam',
+ 'admin:plugins:category:social' => 'Social',
+ 'admin:plugins:category:multimedia' => 'Multimedia',
+ 'admin:plugins:category:theme' => 'Themes',
+ 'admin:plugins:category:widget' => 'Widgets',
+ 'admin:plugins:category:utility' => 'Utilities',
+
+ 'admin:plugins:sort:priority' => 'Priority',
+ 'admin:plugins:sort:alpha' => 'Alphabetical',
+ 'admin:plugins:sort:date' => 'Newest',
+
+ 'admin:plugins:markdown:unknown_plugin' => 'Unknown plugin.',
+ 'admin:plugins:markdown:unknown_file' => 'Unknown file.',
+
+
+ 'admin:notices:could_not_delete' => 'Could not delete notice.',
+ 'item:object:admin_notice' => 'Admin notice',
+
+ 'admin:options' => 'Admin options',
+
+
+/**
+ * Plugins
+ */
+ 'plugins:disabled' => 'Plugins are not being loaded because a file named "disabled" is in the mod directory.',
+ 'plugins:settings:save:ok' => "Settings for the %s plugin were saved successfully.",
+ 'plugins:settings:save:fail' => "There was a problem saving settings for the %s plugin.",
+ 'plugins:usersettings:save:ok' => "User settings for the %s plugin were saved successfully.",
+ 'plugins:usersettings:save:fail' => "There was a problem saving user settings for the %s plugin.",
+ 'item:object:plugin' => 'Plugins',
+
+ 'admin:plugins' => "Plugins",
+ 'admin:plugins:activate_all' => 'Activate All',
+ 'admin:plugins:deactivate_all' => 'Deactivate All',
+ 'admin:plugins:activate' => 'Activate',
+ 'admin:plugins:deactivate' => 'Deactivate',
+ 'admin:plugins:description' => "This admin panel allows you to control and configure tools installed on your site.",
+ 'admin:plugins:opt:linktext' => "Configure tools...",
+ 'admin:plugins:opt:description' => "Configure the tools installed on the site. ",
+ 'admin:plugins:label:author' => "Author",
+ 'admin:plugins:label:copyright' => "Copyright",
+ 'admin:plugins:label:categories' => 'Categories',
+ 'admin:plugins:label:licence' => "License",
+ 'admin:plugins:label:website' => "URL",
+ 'admin:plugins:label:repository' => "Code",
+ 'admin:plugins:label:bugtracker' => "Report issue",
+ 'admin:plugins:label:donate' => "Donate",
+ 'admin:plugins:label:moreinfo' => 'more info',
+ 'admin:plugins:label:version' => 'Version',
+ 'admin:plugins:label:location' => 'Location',
+ 'admin:plugins:label:dependencies' => 'Dependencies',
+
+ 'admin:plugins:warning:elgg_version_unknown' => 'This plugin uses a legacy manifest file and does not specify a compatible Elgg version. It probably will not work!',
+ 'admin:plugins:warning:unmet_dependencies' => 'This plugin has unmet dependencies and cannot be activated. Check dependencies under more info.',
+ 'admin:plugins:warning:invalid' => 'This plugin is invalid: %s',
+ 'admin:plugins:warning:invalid:check_docs' => 'Check <a href="http://docs.elgg.org/Invalid_Plugin">the Elgg documentation</a> for troubleshooting tips.',
+ 'admin:plugins:cannot_activate' => 'cannot activate',
+
+ 'admin:plugins:set_priority:yes' => "Reordered %s.",
+ 'admin:plugins:set_priority:no' => "Could not reorder %s.",
+ 'admin:plugins:set_priority:no_with_msg' => "Could not reorder %s. Error: %s",
+ 'admin:plugins:deactivate:yes' => "Deactivated %s.",
+ 'admin:plugins:deactivate:no' => "Could not deactivate %s.",
+ 'admin:plugins:deactivate:no_with_msg' => "Could not deactivate %s. Error: %s",
+ 'admin:plugins:activate:yes' => "Activated %s.",
+ 'admin:plugins:activate:no' => "Could not activate %s.",
+ 'admin:plugins:activate:no_with_msg' => "Could not activate %s. Error: %s",
+ 'admin:plugins:categories:all' => 'All categories',
+ 'admin:plugins:plugin_website' => 'Plugin website',
+ 'admin:plugins:author' => '%s',
+ 'admin:plugins:version' => 'Version %s',
+ 'admin:plugin_settings' => 'Plugin Settings',
+ 'admin:plugins:warning:unmet_dependencies_active' => 'This plugin is active but has unmet dependencies. You may encounter problems. See "more info" below for details.',
+
+ 'admin:plugins:dependencies:type' => 'Type',
+ 'admin:plugins:dependencies:name' => 'Name',
+ 'admin:plugins:dependencies:expected_value' => 'Expected Value',
+ 'admin:plugins:dependencies:local_value' => 'Actual value',
+ 'admin:plugins:dependencies:comment' => 'Comment',
+
+ 'admin:statistics:description' => "This is an overview of statistics on your site. If you need more detailed statistics, a professional administration feature is available.",
+ 'admin:statistics:opt:description' => "View statistical information about users and objects on your site.",
+ 'admin:statistics:opt:linktext' => "View statistics...",
+ 'admin:statistics:label:basic' => "Basic site statistics",
+ 'admin:statistics:label:numentities' => "Entities on site",
+ 'admin:statistics:label:numusers' => "Number of users",
+ 'admin:statistics:label:numonline' => "Number of users online",
+ 'admin:statistics:label:onlineusers' => "Users online now",
+ 'admin:statistics:label:admins'=>"Admins",
+ 'admin:statistics:label:version' => "Elgg version",
+ 'admin:statistics:label:version:release' => "Release",
+ 'admin:statistics:label:version:version' => "Version",
+
+ 'admin:server:label:php' => 'PHP',
+ 'admin:server:label:web_server' => 'Web Server',
+ 'admin:server:label:server' => 'Server',
+ 'admin:server:label:log_location' => 'Log Location',
+ 'admin:server:label:php_version' => 'PHP version',
+ 'admin:server:label:php_ini' => 'PHP ini file location',
+ 'admin:server:label:php_log' => 'PHP Log',
+ 'admin:server:label:mem_avail' => 'Memory available',
+ 'admin:server:label:mem_used' => 'Memory used',
+ 'admin:server:error_log' => "Web server's error log",
+ 'admin:server:label:post_max_size' => 'POST maximum size',
+ 'admin:server:label:upload_max_filesize' => 'Upload maximum size',
+ 'admin:server:warning:post_max_too_small' => '(Note: post_max_size must be larger than this value to support uploads of this size)',
+
+ 'admin:user:label:search' => "Find users:",
+ 'admin:user:label:searchbutton' => "Search",
+
+ 'admin:user:ban:no' => "Can not ban user",
+ 'admin:user:ban:yes' => "User banned.",
+ 'admin:user:self:ban:no' => "You cannot ban yourself",
+ 'admin:user:unban:no' => "Can not unban user",
+ 'admin:user:unban:yes' => "User unbanned.",
+ 'admin:user:delete:no' => "Can not delete user",
+ 'admin:user:delete:yes' => "The user %s has been deleted",
+ 'admin:user:self:delete:no' => "You cannot delete yourself",
+
+ 'admin:user:resetpassword:yes' => "Password reset, user notified.",
+ 'admin:user:resetpassword:no' => "Password could not be reset.",
+
+ 'admin:user:makeadmin:yes' => "User is now an admin.",
+ 'admin:user:makeadmin:no' => "We could not make this user an admin.",
+
+ 'admin:user:removeadmin:yes' => "User is no longer an admin.",
+ 'admin:user:removeadmin:no' => "We could not remove administrator privileges from this user.",
+ 'admin:user:self:removeadmin:no' => "You cannot remove your own administrator privileges.",
+
+ 'admin:appearance:menu_items' => 'Menu Items',
+ 'admin:menu_items:configure' => 'Configure main menu items',
+ 'admin:menu_items:description' => 'Select which menu items you want to show as featured links. Unused items will be added as "More" at the end of the list.',
+ 'admin:menu_items:hide_toolbar_entries' => 'Remove links from tool bar menu?',
+ 'admin:menu_items:saved' => 'Menu items saved.',
+ 'admin:add_menu_item' => 'Add a custom menu item',
+ 'admin:add_menu_item:description' => 'Fill out the Display name and URL to add custom items to your navigation menu.',
+
+ 'admin:appearance:default_widgets' => 'Default Widgets',
+ 'admin:default_widgets:unknown_type' => 'Unknown widget type',
+ 'admin:default_widgets:instructions' => 'Add, remove, position, and configure default widgets for the selected widget page.'
+ . ' These changes will only affect new users on the site.',
+
+/**
+ * User settings
+ */
+ 'usersettings:description' => "The user settings panel allows you to control all your personal settings, from user management to how plugins behave. Choose an option below to get started.",
+
+ 'usersettings:statistics' => "Your statistics",
+ 'usersettings:statistics:opt:description' => "View statistical information about users and objects on your site.",
+ 'usersettings:statistics:opt:linktext' => "Account statistics",
+
+ 'usersettings:user' => "Your settings",
+ 'usersettings:user:opt:description' => "This allows you to control user settings.",
+ 'usersettings:user:opt:linktext' => "Change your settings",
+
+ 'usersettings:plugins' => "Tools",
+ 'usersettings:plugins:opt:description' => "Configure settings (if any) for your active tools.",
+ 'usersettings:plugins:opt:linktext' => "Configure your tools",
+
+ 'usersettings:plugins:description' => "This panel allows you to control and configure the personal settings for the tools installed by your system administrator.",
+ 'usersettings:statistics:label:numentities' => "Your content",
+
+ 'usersettings:statistics:yourdetails' => "Your details",
+ 'usersettings:statistics:label:name' => "Full name",
+ 'usersettings:statistics:label:email' => "Email",
+ 'usersettings:statistics:label:membersince' => "Member since",
+ 'usersettings:statistics:label:lastlogin' => "Last logged in",
+
+/**
+ * Activity river
+ */
+ 'river:all' => 'All Site Activity',
+ 'river:mine' => 'My Activity',
+ 'river:friends' => 'Friends Activity',
+ 'river:select' => 'Show %s',
+ 'river:comments:more' => '+%u more',
+ 'river:generic_comment' => 'commented on %s %s',
+
+ 'friends:widget:description' => "Displays some of your friends.",
+ 'friends:num_display' => "Number of friends to display",
+ 'friends:icon_size' => "Icon size",
+ 'friends:tiny' => "tiny",
+ 'friends:small' => "small",
+
+/**
+ * Generic action words
+ */
+
+ 'save' => "Save",
+ 'reset' => 'Reset',
+ 'publish' => "Publish",
+ 'cancel' => "Cancel",
+ 'saving' => "Saving ...",
+ 'update' => "Update",
+ 'preview' => "Preview",
+ 'edit' => "Edit",
+ 'delete' => "Delete",
+ 'accept' => "Accept",
+ 'load' => "Load",
+ 'upload' => "Upload",
+ 'ban' => "Ban",
+ 'unban' => "Unban",
+ 'banned' => "Banned",
+ 'enable' => "Enable",
+ 'disable' => "Disable",
+ 'request' => "Request",
+ 'complete' => "Complete",
+ 'open' => 'Open',
+ 'close' => 'Close',
+ 'reply' => "Reply",
+ 'more' => 'More',
+ 'comments' => 'Comments',
+ 'import' => 'Import',
+ 'export' => 'Export',
+ 'untitled' => 'Untitled',
+ 'help' => 'Help',
+ 'send' => 'Send',
+ 'post' => 'Post',
+ 'submit' => 'Submit',
+ 'comment' => 'Comment',
+ 'upgrade' => 'Upgrade',
+ 'sort' => 'Sort',
+ 'filter' => 'Filter',
+ 'new' => 'New',
+ 'add' => 'Add',
+ 'create' => 'Create',
+ 'remove' => 'Remove',
+ 'revert' => 'Revert',
+
+ 'site' => 'Site',
+ 'activity' => 'Activity',
+ 'members' => 'Members',
+
+ 'up' => 'Up',
+ 'down' => 'Down',
+ 'top' => 'Top',
+ 'bottom' => 'Bottom',
+ 'back' => 'Back',
+
+ 'invite' => "Invite",
+
+ 'resetpassword' => "Reset password",
+ 'makeadmin' => "Make admin",
+ 'removeadmin' => "Remove admin",
+
+ 'option:yes' => "Yes",
+ 'option:no' => "No",
+
+ 'unknown' => 'Unknown',
+
+ 'active' => 'Active',
+ 'total' => 'Total',
+
+ 'learnmore' => "Click here to learn more.",
+ 'unknown_error' => 'Unknown error',
+
+ 'content' => "content",
+ 'content:latest' => 'Latest activity',
+ 'content:latest:blurb' => 'Alternatively, click here to view the latest content from across the site.',
+
+ 'link:text' => 'view link',
+/**
+ * Generic questions
+ */
+
+ 'question:areyousure' => 'Are you sure?',
+
+/**
+ * Generic data words
+ */
+
+ 'title' => "Title",
+ 'description' => "Description",
+ 'tags' => "Tags",
+ 'spotlight' => "Spotlight",
+ 'all' => "All",
+ 'mine' => "Mine",
+
+ 'by' => 'by',
+ 'none' => 'none',
+
+ 'annotations' => "Annotations",
+ 'relationships' => "Relationships",
+ 'metadata' => "Metadata",
+ 'tagcloud' => "Tag cloud",
+ 'tagcloud:allsitetags' => "All site tags",
+
+ 'on' => 'On',
+ 'off' => 'Off',
+
+/**
+ * Entity actions
+ */
+ 'edit:this' => 'Edit this',
+ 'delete:this' => 'Delete this',
+ 'comment:this' => 'Comment on this',
+
+/**
+ * Input / output strings
+ */
+
+ 'deleteconfirm' => "Are you sure you want to delete this item?",
+ 'deleteconfirm:plural' => "Are you sure you want to delete these items?",
+ 'fileexists' => "A file has already been uploaded. To replace it, select it below:",
+
+/**
+ * User add
+ */
+
+ 'useradd:subject' => 'User account created',
+ 'useradd:body' => '
+%s,
+
+A user account has been created for you at %s. To log in, visit:
+
+%s
+
+And log in with these user credentials:
+
+Username: %s
+Password: %s
+
+Once you have logged in, we highly recommend that you change your password.
+',
+
+/**
+ * System messages
+ **/
+
+ 'systemmessages:dismiss' => "click to dismiss",
+
+
+/**
+ * Import / export
+ */
+ 'importsuccess' => "Import of data was successful",
+ 'importfail' => "OpenDD import of data failed.",
+
+/**
+ * Time
+ */
+
+ 'friendlytime:justnow' => "just now",
+ 'friendlytime:minutes' => "%s minutes ago",
+ 'friendlytime:minutes:singular' => "a minute ago",
+ 'friendlytime:hours' => "%s hours ago",
+ 'friendlytime:hours:singular' => "an hour ago",
+ 'friendlytime:days' => "%s days ago",
+ 'friendlytime:days:singular' => "yesterday",
+ 'friendlytime:date_format' => 'j F Y @ g:ia',
+
+ 'date:month:01' => 'January %s',
+ 'date:month:02' => 'February %s',
+ 'date:month:03' => 'March %s',
+ 'date:month:04' => 'April %s',
+ 'date:month:05' => 'May %s',
+ 'date:month:06' => 'June %s',
+ 'date:month:07' => 'July %s',
+ 'date:month:08' => 'August %s',
+ 'date:month:09' => 'September %s',
+ 'date:month:10' => 'October %s',
+ 'date:month:11' => 'November %s',
+ 'date:month:12' => 'December %s',
+
+
+/**
+ * System settings
+ */
+
+ 'installation:sitename' => "The name of your site:",
+ 'installation:sitedescription' => "Short description of your site (optional):",
+ 'installation:wwwroot' => "The site URL:",
+ 'installation:path' => "The full path of the Elgg installation:",
+ 'installation:dataroot' => "The full path of the data directory:",
+ 'installation:dataroot:warning' => "You must create this directory manually. It should be in a different directory to your Elgg installation.",
+ 'installation:sitepermissions' => "The default access permissions:",
+ 'installation:language' => "The default language for your site:",
+ 'installation:debug' => "Debug mode provides extra information which can be used to diagnose faults. However, it can slow your system down so should only be used if you are having problems:",
+ 'installation:debug:none' => 'Turn off debug mode (recommended)',
+ 'installation:debug:error' => 'Display only critical errors',
+ 'installation:debug:warning' => 'Display errors and warnings',
+ 'installation:debug:notice' => 'Log all errors, warnings and notices',
+
+ // Walled Garden support
+ 'installation:registration:description' => 'User registration is enabled by default. Turn this off if you do not want new users to be able to register on their own.',
+ 'installation:registration:label' => 'Allow new users to register',
+ 'installation:walled_garden:description' => 'Enable the site to run as a private network. This will not allow non logged-in users to view any site pages other than those specifically marked as public.',
+ 'installation:walled_garden:label' => 'Restrict pages to logged-in users',
+
+ 'installation:httpslogin' => "Enable this to have user logins performed over HTTPS. You will need to have https enabled on your server for this to work.",
+ 'installation:httpslogin:label' => "Enable HTTPS logins",
+ 'installation:view' => "Enter the view which will be used as the default for your site or leave this blank for the default view (if in doubt, leave as default):",
+
+ 'installation:siteemail' => "Site email address (used when sending system emails):",
+
+ 'installation:disableapi' => "Elgg provides an API for building web services so that remote applications can interact with your site.",
+ 'installation:disableapi:label' => "Enable Elgg's web services API",
+
+ 'installation:allow_user_default_access:description' => "If checked, individual users will be allowed to set their own default access level that can over-ride the system default access level.",
+ 'installation:allow_user_default_access:label' => "Allow user default access",
+
+ 'installation:simplecache:description' => "The simple cache increases performance by caching static content including some CSS and JavaScript files. Normally you will want this on.",
+ 'installation:simplecache:label' => "Use simple cache (recommended)",
+
+ 'installation:systemcache:description' => "The system cache decreases the loading time of the Elgg engine by caching data to files.",
+ 'installation:systemcache:label' => "Use system cache (recommended)",
+
+ 'upgrading' => 'Upgrading...',
+ 'upgrade:db' => 'Your database was upgraded.',
+ 'upgrade:core' => 'Your Elgg installation was upgraded.',
+ 'upgrade:unlock' => 'Unlock upgrade',
+ 'upgrade:unlock:confirm' => "The database is locked for another upgrade. Running concurrent upgrades is dangerous. You should only continue if you know there is not another upgrade running. Unlock?",
+ 'upgrade:locked' => "Cannot upgrade. Another upgrade is running. To clear the upgrade lock, visit the Admin section.",
+ 'upgrade:unlock:success' => "Upgrade unlocked successfully.",
+ 'upgrade:unable_to_upgrade' => 'Unable to upgrade.',
+ 'upgrade:unable_to_upgrade_info' =>
+ 'This installation cannot be upgraded because legacy views
+ were detected in the Elgg core views directory. These views have been deprecated and need to be
+ removed for Elgg to function correctly. If you have not made changes to Elgg core, you can
+ simply delete the views directory and replace it with the one from the latest
+ package of Elgg downloaded from <a href="http://elgg.org">elgg.org</a>.<br /><br />
+
+ If you need detailed instructions, please visit the <a href="http://docs.elgg.org/wiki/Upgrading_Elgg">
+ Upgrading Elgg documentation</a>. If you require assistance, please post to the
+ <a href="http://community.elgg.org/pg/groups/discussion/">Community Support Forums</a>.',
+
+ 'update:twitter_api:deactivated' => 'Twitter API (previously Twitter Service) was deactivated during the upgrade. Please activate it manually if required.',
+ 'update:oauth_api:deactivated' => 'OAuth API (previously OAuth Lib) was deactivated during the upgrade. Please activate it manually if required.',
+ 'upgrade:site_secret_warning:moderate' => "You are encouraged to regenerate your site key to improve system security. See Configure &gt; Settings &gt; Site Secret",
+ 'upgrade:site_secret_warning:weak' => "You are strongly encouraged to regenerate your site key to improve system security. See Configure &gt; Settings &gt; Site Secret",
+
+ 'deprecated:function' => '%s() was deprecated by %s()',
+
+/**
+ * Welcome
+ */
+
+ 'welcome' => "Welcome",
+ 'welcome:user' => 'Welcome %s',
+
+/**
+ * Emails
+ */
+ 'email:settings' => "Email settings",
+ 'email:address:label' => "Your email address",
+
+ 'email:save:success' => "New email address saved.",
+ 'email:save:fail' => "Your new email address could not be saved.",
+
+ 'friend:newfriend:subject' => "%s has made you a friend!",
+ 'friend:newfriend:body' => "%s has made you a friend!
+
+To view their profile, click here:
+
+%s
+
+You cannot reply to this email.",
+
+
+
+ 'email:resetpassword:subject' => "Password reset!",
+ 'email:resetpassword:body' => "Hi %s,
+
+Your password has been reset to: %s",
+
+
+ 'email:resetreq:subject' => "Request for new password.",
+ 'email:resetreq:body' => "Hi %s,
+
+Somebody (from the IP address %s) has requested a new password for their account.
+
+If you requested this, click on the link below. Otherwise ignore this email.
+
+%s
+",
+
+/**
+ * user default access
+ */
+
+ 'default_access:settings' => "Your default access level",
+ 'default_access:label' => "Default access",
+ 'user:default_access:success' => "Your new default access level was saved.",
+ 'user:default_access:failure' => "Your new default access level could not be saved.",
+
+/**
+ * XML-RPC
+ */
+ 'xmlrpc:noinputdata' => "Input data missing",
+
+/**
+ * Comments
+ */
+
+ 'comments:count' => "%s comments",
+
+ 'river:comment:object:default' => '%s commented on %s',
+
+ 'generic_comments:add' => "Leave a comment",
+ 'generic_comments:post' => "Post comment",
+ 'generic_comments:text' => "Comment",
+ 'generic_comments:latest' => "Latest comments",
+ 'generic_comment:posted' => "Your comment was successfully posted.",
+ 'generic_comment:deleted' => "The comment was successfully deleted.",
+ 'generic_comment:blank' => "Sorry, you need to actually put something in your comment before we can save it.",
+ 'generic_comment:notfound' => "Sorry, we could not find the specified item.",
+ 'generic_comment:notdeleted' => "Sorry, we could not delete this comment.",
+ 'generic_comment:failure' => "An unexpected error occurred when adding your comment.",
+ 'generic_comment:none' => 'No comments',
+ 'generic_comment:title' => 'Comment by %s',
+ 'generic_comment:on' => '%s on %s',
+
+ 'generic_comment:email:subject' => 'You have a new comment!',
+ 'generic_comment:email:body' => "You have a new comment on your item \"%s\" from %s. It reads:
%s
@@ -230,6 +1193,194 @@ To view %s's profile, click here:
%s
You cannot reply to this email.",
+
+/**
+ * Entities
+ */
+ 'byline' => 'By %s',
+ 'entity:default:strapline' => 'Created %s by %s',
+ 'entity:default:missingsupport:popup' => 'This entity cannot be displayed correctly. This may be because it requires support provided by a plugin that is no longer installed.',
+
+ 'entity:delete:success' => 'Entity %s has been deleted',
+ 'entity:delete:fail' => 'Entity %s could not be deleted',
+
+
+/**
+ * Action gatekeeper
+ */
+ 'actiongatekeeper:missingfields' => 'Form is missing __token or __ts fields',
+ 'actiongatekeeper:tokeninvalid' => "The page you were using had expired. Please try again.",
+ 'actiongatekeeper:timeerror' => 'The page you were using has expired. Please refresh and try again.',
+ 'actiongatekeeper:pluginprevents' => 'A extension has prevented this form from being submitted.',
+ 'actiongatekeeper:uploadexceeded' => 'The size of file(s) uploaded exceeded the limit set by your site administrator',
+ 'actiongatekeeper:crosssitelogin' => "Sorry, logging in from a different domain is not permitted. Please try again.",
+
+
+/**
+ * Word blacklists
+ */
+ 'word:blacklist' => 'and, the, then, but, she, his, her, him, one, not, also, about, now, hence, however, still, likewise, otherwise, therefore, conversely, rather, consequently, furthermore, nevertheless, instead, meanwhile, accordingly, this, seems, what, whom, whose, whoever, whomever',
+
+/**
+ * Tag labels
+ */
+
+ 'tag_names:tags' => 'Tags',
+ 'tags:site_cloud' => 'Site Tag Cloud',
+
+/**
+ * Javascript
+ */
+
+ 'js:security:token_refresh_failed' => 'Failed to contact %s. You may experience problems saving content. Please refresh this page.',
+ 'js:security:token_refreshed' => 'Connection to %s restored!',
+
+/**
+ * Languages according to ISO 639-1
+ */
+ "aa" => "Afar",
+ "ab" => "Abkhazian",
+ "af" => "Afrikaans",
+ "am" => "Amharic",
+ "ar" => "Arabic",
+ "as" => "Assamese",
+ "ay" => "Aymara",
+ "az" => "Azerbaijani",
+ "ba" => "Bashkir",
+ "be" => "Byelorussian",
+ "bg" => "Bulgarian",
+ "bh" => "Bihari",
+ "bi" => "Bislama",
+ "bn" => "Bengali; Bangla",
+ "bo" => "Tibetan",
+ "br" => "Breton",
+ "ca" => "Catalan",
+ "co" => "Corsican",
+ "cs" => "Czech",
+ "cy" => "Welsh",
+ "da" => "Danish",
+ "de" => "German",
+ "dz" => "Bhutani",
+ "el" => "Greek",
+ "en" => "English",
+ "eo" => "Esperanto",
+ "es" => "Spanish",
+ "et" => "Estonian",
+ "eu" => "Basque",
+ "fa" => "Persian",
+ "fi" => "Finnish",
+ "fj" => "Fiji",
+ "fo" => "Faeroese",
+ "fr" => "French",
+ "fy" => "Frisian",
+ "ga" => "Irish",
+ "gd" => "Scots / Gaelic",
+ "gl" => "Galician",
+ "gn" => "Guarani",
+ "gu" => "Gujarati",
+ "he" => "Hebrew",
+ "ha" => "Hausa",
+ "hi" => "Hindi",
+ "hr" => "Croatian",
+ "hu" => "Hungarian",
+ "hy" => "Armenian",
+ "ia" => "Interlingua",
+ "id" => "Indonesian",
+ "ie" => "Interlingue",
+ "ik" => "Inupiak",
+ //"in" => "Indonesian",
+ "is" => "Icelandic",
+ "it" => "Italian",
+ "iu" => "Inuktitut",
+ "iw" => "Hebrew (obsolete)",
+ "ja" => "Japanese",
+ "ji" => "Yiddish (obsolete)",
+ "jw" => "Javanese",
+ "ka" => "Georgian",
+ "kk" => "Kazakh",
+ "kl" => "Greenlandic",
+ "km" => "Cambodian",
+ "kn" => "Kannada",
+ "ko" => "Korean",
+ "ks" => "Kashmiri",
+ "ku" => "Kurdish",
+ "ky" => "Kirghiz",
+ "la" => "Latin",
+ "ln" => "Lingala",
+ "lo" => "Laothian",
+ "lt" => "Lithuanian",
+ "lv" => "Latvian/Lettish",
+ "mg" => "Malagasy",
+ "mi" => "Maori",
+ "mk" => "Macedonian",
+ "ml" => "Malayalam",
+ "mn" => "Mongolian",
+ "mo" => "Moldavian",
+ "mr" => "Marathi",
+ "ms" => "Malay",
+ "mt" => "Maltese",
+ "my" => "Burmese",
+ "na" => "Nauru",
+ "ne" => "Nepali",
+ "nl" => "Dutch",
+ "no" => "Norwegian",
+ "oc" => "Occitan",
+ "om" => "(Afan) Oromo",
+ "or" => "Oriya",
+ "pa" => "Punjabi",
+ "pl" => "Polish",
+ "ps" => "Pashto / Pushto",
+ "pt" => "Portuguese",
+ "qu" => "Quechua",
+ "rm" => "Rhaeto-Romance",
+ "rn" => "Kirundi",
+ "ro" => "Romanian",
+ "ru" => "Russian",
+ "rw" => "Kinyarwanda",
+ "sa" => "Sanskrit",
+ "sd" => "Sindhi",
+ "sg" => "Sangro",
+ "sh" => "Serbo-Croatian",
+ "si" => "Singhalese",
+ "sk" => "Slovak",
+ "sl" => "Slovenian",
+ "sm" => "Samoan",
+ "sn" => "Shona",
+ "so" => "Somali",
+ "sq" => "Albanian",
+ "sr" => "Serbian",
+ "ss" => "Siswati",
+ "st" => "Sesotho",
+ "su" => "Sundanese",
+ "sv" => "Swedish",
+ "sw" => "Swahili",
+ "ta" => "Tamil",
+ "te" => "Tegulu",
+ "tg" => "Tajik",
+ "th" => "Thai",
+ "ti" => "Tigrinya",
+ "tk" => "Turkmen",
+ "tl" => "Tagalog",
+ "tn" => "Setswana",
+ "to" => "Tonga",
+ "tr" => "Turkish",
+ "ts" => "Tsonga",
+ "tt" => "Tatar",
+ "tw" => "Twi",
+ "ug" => "Uigur",
+ "uk" => "Ukrainian",
+ "ur" => "Urdu",
+ "uz" => "Uzbek",
+ "vi" => "Vietnamese",
+ "vo" => "Volapuk",
+ "wo" => "Wolof",
+ "xh" => "Xhosa",
+ //"y" => "Yiddish",
+ "yi" => "Yiddish",
+ "yo" => "Yoruba",
+ "za" => "Zuang",
+ "zh" => "Chinese",
+ "zu" => "Zulu",
);
-add_translation("en", $english);
+add_translation("en",$english);
diff --git a/mod/autosubscribegroup/LICENCE.txt b/mod/autosubscribegroup/LICENCE.txt
new file mode 100644
index 000000000..f833d881e
--- /dev/null
+++ b/mod/autosubscribegroup/LICENCE.txt
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS \ No newline at end of file
diff --git a/mod/autosubscribegroup/Readme.txt b/mod/autosubscribegroup/Readme.txt
new file mode 100644
index 000000000..dab4b01c9
--- /dev/null
+++ b/mod/autosubscribegroup/Readme.txt
@@ -0,0 +1,40 @@
+Autosubscribegroup Plugin for Elgg 1.8
+Contact: iionly@gmx.de
+Website: https://github.com/iionly
+License: GNU General Public License version 2
+Copyright: (C) iionly 2012, (C) Elbee 2008
+
+
+This plugin allows new users to get joined to groups automatically when they register.
+
+
+
+Installation and configuration:
+
+1. Copy the autosubscribegroup plugin folder into you mod folder,
+2. Enable the autosubscribegroup plugin in the admin section of your site,
+3. Define the list of groups you want new members to get joined when they register in the plugin's settings.
+
+How to define the list of groups for autosubscribe:
+
+The list of groups you need to define consists of a comma separated list of the GUIDs of these groups. For example you can find out the GUID of a group when you look at the URL when you are on the group's profile page:
+
+http://yoursite.url/groups/profile/<GUID>/name-of-group
+
+The number that is shown in the URL (instead of <GUID>) is the number you need. Then simply list all the GUIDs of the groups separated by commas in the text input field on the autosubscribegroup settings page:
+
+<GUID1>,<GUID2>, etc.
+
+Press save and you are done.
+
+
+
+Changelog:
+
+1.8.0:
+
+ - Upgraded for Elgg 1.8 (by iionly)
+
+1.0:
+
+ - Initial release by RONNEL Jérémy (http://www.elbee.fr/)
diff --git a/mod/autosubscribegroup/languages/en.php b/mod/autosubscribegroup/languages/en.php
new file mode 100644
index 000000000..583e6f9ed
--- /dev/null
+++ b/mod/autosubscribegroup/languages/en.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Elgg autosubscribegroup plugin
+ * This plugin allows new users to get joined to groups automatically when they register.
+ *
+ * @package autosubscribegroups
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author RONNEL Jérémy
+ * @copyright (c) Elbee 2008
+ * @link /www.notredeco.com
+ *
+ * for Elgg 1.8 by iionly (iionly@gmx.de)
+ */
+
+$english = array(
+
+/**
+ * Menu items and titles
+ */
+'autosubscribe:list' => "Groups' ids (separated by commas): ",
+);
+
+add_translation("en",$english);
diff --git a/mod/autosubscribegroup/manifest.xml b/mod/autosubscribegroup/manifest.xml
new file mode 100644
index 000000000..fcf18c1b5
--- /dev/null
+++ b/mod/autosubscribegroup/manifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Autosubscribegroup</name>
+ <author>iionly (for Elgg 1.8), RONNEL Jérémy</author>
+ <version>1.8.0</version>
+ <category>enhancement</category>
+ <description>This plugin allows new users to get joined to groups automatically when they register.</description>
+ <website>https://github.com/iionly</website>
+ <copyright>(C) iionly 2012, (C) Elbee 2008</copyright>
+ <license>GNU Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/autosubscribegroup/start.php b/mod/autosubscribegroup/start.php
new file mode 100644
index 000000000..69f447267
--- /dev/null
+++ b/mod/autosubscribegroup/start.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Elgg autosubscribegroup plugin
+ * This plugin allows new users to get joined to groups automatically when they register.
+ *
+ * @package autosubscribegroups
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author RONNEL Jérémy
+ * @copyright (c) Elbee 2008
+ * @link /www.notredeco.com
+ *
+ * for Elgg 1.8 by iionly (iionly@gmx.de)
+ */
+
+/**
+ * Init
+ *
+ */
+function autosubscribegroup_init() {
+ //group plugin disabled : no need to go further...
+ if (!elgg_is_active_plugin("groups")) {
+ return;
+ }
+
+ //Listen to user registration
+ elgg_register_event_handler('create', 'user', 'autosubscribegroup_join', 502);
+}
+
+/**
+ * auto join group define in plugin settings
+ *
+ */
+function autosubscribegroup_join($event, $object_type, $object) {
+
+ if (($object instanceof ElggUser) && ($event == 'create') && ($object_type == 'user')) {
+ //auto submit relationships between user & groups
+ //retrieve groups ids from plugin
+ $groups = elgg_get_plugin_setting('systemgroups');
+ $groups = split(',', $groups);
+
+ //for each group ids
+ foreach($groups as $groupId) {
+ //if group exist : submit to group
+ if ($groupEnt = get_entity($groupId)) {
+ //join group succeed ?
+ if ($groupEnt->join($object)) {
+ // Remove any invite or join request flags
+ elgg_delete_metadata(array('guid' => $object->guid, 'metadata_name' => 'group_invite', 'metadata_value' => $groupEnt->guid, 'limit' => 0));
+ elgg_delete_metadata(array('guid' => $object->guid, 'metadata_name' => 'group_join_request', 'metadata_value' => $groupEnt->guid, 'limit' => 0));
+ }
+ }
+ }
+ }
+}
+
+elgg_register_event_handler('init', 'system', 'autosubscribegroup_init');
diff --git a/mod/autosubscribegroup/views/default/plugins/autosubscribegroup/settings.php b/mod/autosubscribegroup/views/default/plugins/autosubscribegroup/settings.php
new file mode 100644
index 000000000..c71e98df9
--- /dev/null
+++ b/mod/autosubscribegroup/views/default/plugins/autosubscribegroup/settings.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Elgg autosubscribegroup plugin
+ * This plugin allows new users to get joined to groups automatically when they register.
+ *
+ * @package autosubscribegroups
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author RONNEL Jérémy
+ * @copyright (c) Elbee 2008
+ * @link /www.notredeco.com
+ *
+ * for Elgg 1.8 by iionly (iionly@gmx.de)
+ */
+
+?>
+
+<p>
+<?php echo elgg_echo('autosubscribe:list')."<br>"; ?>
+<?php
+ echo elgg_view('input/text', array('name' => 'params[systemgroups]', 'value' => $vars['entity']->systemgroups));
+ echo "<br>"
+?>
+</p>
diff --git a/mod/basic_theme/graphics/elgg_sprites.png b/mod/basic_theme/graphics/elgg_sprites.png
new file mode 100644
index 000000000..d30df93e2
--- /dev/null
+++ b/mod/basic_theme/graphics/elgg_sprites.png
Binary files differ
diff --git a/mod/basic_theme/manifest.xml b/mod/basic_theme/manifest.xml
new file mode 100644
index 000000000..f2b97aebf
--- /dev/null
+++ b/mod/basic_theme/manifest.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Basic Theme</name>
+ <author>Lorea developers</author>
+ <version>1.0</version>
+ <category>theme</category>
+ <description>
+ Elgg's core basic theme. Ready for fork and modify.
+ </description>
+ <website>https://lorea.org</website>
+ <copyright>(C) 2011-2012 Lorea</copyright>
+ <license>GNU Affero General Public License, version 3</license>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>groups</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>messageboard</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>messages</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>profile</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>search</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>thewire</plugin>
+ </requires>
+
+ <suggests>
+ <type>plugin</type>
+ <name>profile</name>
+ <version>1.8</version>
+ </suggests>
+</plugin_manifest>
diff --git a/mod/basic_theme/start.php b/mod/basic_theme/start.php
new file mode 100644
index 000000000..c14609b21
--- /dev/null
+++ b/mod/basic_theme/start.php
@@ -0,0 +1,14 @@
+<?php
+
+elgg_register_event_handler('init', 'system', 'basic_theme_init');
+
+function basic_theme_init() {
+ // Override Elgg logo item
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'elgg_logo',
+ 'text' => elgg_get_site_entity()->name,
+ 'href' => elgg_get_site_url(),
+ 'priority' => 0,
+ ));
+
+}
diff --git a/mod/basic_theme/views/default/css/admin.php b/mod/basic_theme/views/default/css/admin.php
new file mode 100644
index 000000000..e3205ca4e
--- /dev/null
+++ b/mod/basic_theme/views/default/css/admin.php
@@ -0,0 +1,1443 @@
+<?php
+/**
+ * Elgg Admin CSS
+ *
+ * This is a distinct theme from the theme of the site. There are dependencies
+ * on the HTML created by the views in Elgg core.
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+
+?>
+
+/* ***************************************
+ RESET CSS
+*************************************** */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 100%;
+ font-family: inherit;
+ vertical-align: baseline;
+}
+<?php // force vertical scroll bar ?>
+html, body {
+ height: 100%;
+ margin-bottom: 1px;
+}
+img {
+ border-width: 0;
+ border-color: transparent;
+}
+:focus {
+ outline: 0 none;
+}
+ol, ul {
+ list-style: none;
+}
+em, i {
+ font-style: italic;
+}
+ins {
+ text-decoration: none;
+}
+del {
+ text-decoration:line-through;
+}
+strong, b {
+ font-weight: bold;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+caption, th, td {
+ text-align: left;
+ font-weight: normal;
+ vertical-align: top;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: "";
+}
+blockquote, q {
+ quotes: "" "";
+}
+
+/* ***************************************
+ BASICS
+*************************************** */
+body {
+ background-color: #eee;
+ font-size: 80%;
+ line-height: 1.4em;
+ font-family: "Lucida Grande",Arial,Tahoma,Verdana,sans-serif;
+}
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+ line-height: auto;
+ color: #666;
+}
+h1 { font-size: 1.8em; }
+h2 { font-size: 1.5em; line-height: 1.1em; }
+h3 { font-size: 1.2em; }
+h4 { font-size: 1.0em; }
+h5 { font-size: 0.9em; }
+h6 { font-size: 0.8em; }
+
+a {
+ color: #333;
+ text-decoration: none;
+}
+a:hover {
+ color: black;
+ text-decoration: underline;
+}
+pre, code {
+ background-color: #EEE;
+ border: 1px solid #DDD;
+ color: #444;
+ font-family: Monaco, "Courier New", Courier, monospace;
+ font-size: 13px;
+ overflow: auto;
+ margin: 15px 0;
+ padding: 5px;
+}
+blockquote {
+ background: #EBF5FF;
+}
+p {
+ margin-bottom: 15px;
+}
+
+.clearfloat {
+ clear: both;
+}
+
+/* Clearfix! */
+.elgg-grid:after,
+.clearfix:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+.elgg-body {
+ width: auto;
+ word-wrap: break-word;
+ overflow: hidden;
+}
+.elgg-body:after {
+ display: block;
+ visibility: hidden;
+ height: 0 !important;
+ line-height: 0;
+ overflow: hidden;
+ font-size: xx-large;
+ content: " x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
+}
+
+/* ***************************************
+ PAGE WRAPPER
+*************************************** */
+.elgg-page > .elgg-inner {
+ margin: 0 auto;
+ padding: 20px 40px 0;
+ min-width: 800px;
+ max-width: 1600px;
+}
+
+/* ***************************************
+ HEADER
+*************************************** */
+.elgg-page-header {
+ background-color: #111;
+ border: 1px solid #999;
+ padding: 20px 20px;
+}
+.elgg-heading-site {
+ font-size: 1.8em;
+ float: left;
+}
+.elgg-heading-site a {
+ color: #ffffff;
+ text-decoration: none;
+}
+.elgg-heading-site a:hover {
+ color: white;
+ text-decoration: none;
+}
+.elgg-menu-user {
+ float: right;
+ margin-top: 5px;
+}
+.elgg-menu-user, .elgg-menu-user a {
+ color: #999999;
+}
+.elgg-menu-user a {
+ text-decoration: underline;
+}
+.elgg-menu-user a:hover {
+ color: white;
+}
+.elgg-menu-user li {
+ display: inline;
+}
+.elgg-menu-user li:after {
+ content: "|";
+ display: inline-block;
+ font-weight: normal;
+ margin-left: 8px;
+ margin-right: 4px;
+}
+.elgg-menu-user li:last-child:after {
+ content: "";
+}
+
+/* ***************************************
+ MESSAGES
+*************************************** */
+.elgg-page-messages {
+ padding: 20px 0 0;
+ width: 500px;
+ margin-bottom: -10px;
+}
+.elgg-system-messages p {
+ margin: 0;
+}
+.elgg-message {
+ padding: 10px;
+ margin-bottom: 10px;
+ border: 2px solid #ddd;
+ cursor: pointer;
+}
+.elgg-message.elgg-state-error {
+ background: #fbe3e4;
+ color: #8a1f11;
+ border-color: #fbc2c4;
+ font-weight: bold;
+}
+.elgg-message.elgg-state-success {
+ background: #e6efc2;
+ color: #264409;
+ border-color: #c6d880;
+}
+
+.elgg-admin-notices {
+ padding-bottom: 15px;
+}
+.elgg-admin-notices p {
+ background-color: #BDE5F8;
+ color: black;
+ border: 1px solid blue;
+ font-weight: bold;
+ padding: 3px 0px 3px 10px;
+
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+ -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.elgg-admin-notices a.elgg-admin-notice {
+ float: right;
+ text-decoration: none;
+}
+
+.elgg-admin-notices a {
+ text-decoration: underline;
+}
+
+/* ***************************************
+ BODY
+*************************************** */
+.elgg-page-body {
+ padding: 20px 0;
+}
+.elgg-main {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ padding: 20px;
+ position: relative;
+ min-height: 400px;
+}
+.elgg-sidebar {
+ width: 210px;
+ float: right;
+ margin-left: 30px;
+}
+.elgg-main > .elgg-head {
+ margin-bottom: 10px;
+}
+.elgg-main h2 {
+ color: #333333;
+}
+<?php // elgg-layout gets clearfix ?>
+.elgg-layout:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+/* ***************************************
+ FOOTER
+*************************************** */
+.elgg-page-footer {
+ background-color: #111;
+ border: 1px solid #999;
+ padding: 10px 20px;
+ margin-bottom: 10px;
+}
+.elgg-page-footer a {
+ color: #ddd;
+ font-weight: bold;
+ text-decoration: none;
+}
+.elgg-page-footer a:hover {
+ text-decoration: underline;
+}
+
+/* ***************************************
+ MODULES
+*************************************** */
+.elgg-module {
+ overflow: hidden;
+}
+.elgg-module-main {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ padding: 10px;
+}
+.elgg-module-main > .elgg-head {
+ margin-bottom: 5px;
+}
+.elgg-module-info > .elgg-head {
+ margin-bottom: 10px;
+}
+.elgg-module-inline {
+ margin: 20px 0;
+}
+.elgg-module-inline > .elgg-head {
+ background-color: #999;
+ color: white;
+ padding: 5px;
+ margin-bottom: 10px;
+
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.elgg-module-inline > .elgg-head h3 {
+ color: white;
+}
+
+/* ***************************************
+ TABLE
+*************************************** */
+.elgg-table {
+ width: 100%;
+ border-top: 1px solid #ccc;
+}
+.elgg-table td, .elgg-table th {
+ background: white;
+ border: 1px solid #ccc;
+}
+.elgg-table th {
+ background-color: #ddd;
+}
+.elgg-table .alt td {
+ background: #eee;
+}
+.elgg-table td {
+ padding: 4px 8px;
+ border-bottom: 1px solid #ccc;
+}
+.elgg-table-alt {
+ width: 100%;
+ border-top: 1px solid #ccc;
+}
+.elgg-table-alt th {
+ background-color: #eee;
+ font-weight: bold;
+}
+.elgg-table-alt td, th {
+ padding: 2px 4px;
+ border-bottom: 1px solid #ccc;
+}
+.elgg-table-alt td:first-child {
+ width: 200px;
+}
+.elgg-table-alt tr:hover {
+ background: #E4E4E4;
+}
+
+/* ***************************************
+ LISTS AND IMAGE BLOCK
+*************************************** */
+.elgg-image-block {
+ padding: 3px 0;
+}
+.elgg-image-block .elgg-image {
+ float: left;
+ margin-right: 5px;
+}
+.elgg-image-block .elgg-image-alt {
+ float: right;
+ margin-left: 5px;
+}
+.elgg-item {
+ margin: 3px;
+}
+.elgg-list-simple li {
+ margin-bottom: 5px;
+}
+.elgg-list-distinct {
+ border-top: 1px dotted #CCCCCC;
+ margin: 5px 0;
+ clear: both;
+}
+.elgg-list-distinct > li {
+ border-bottom: 1px dotted #CCCCCC;
+}
+
+/* ***************************************
+ FORMS AND INPUT
+*************************************** */
+label {
+ font-weight: bold;
+ color: #333333;
+ font-size: 110%;
+}
+fieldset > div {
+ margin-bottom: 15px;
+}
+fieldset > div:last-child {
+ margin-bottom: 0;
+}
+input {
+ font: 120% Arial, Helvetica, sans-serif;
+ padding: 5px;
+ border: 1px solid #ccc;
+ color: #666;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+/* default elgg core input field classes */
+.elgg-input-text,
+.elgg-input-tags,
+.elgg-input-url,
+.elgg-input-plaintext {
+ width: 98%;
+}
+textarea {
+ height: 100px;
+}
+.elgg-input-thin {
+ width: 400px;
+}
+.elgg-input-natural {
+ width: auto;
+}
+
+.elgg-button {
+ font-size: 14px;
+ font-weight: bold;
+ text-decoration: none;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ width: auto;
+ padding: 2px 4px;
+ cursor: pointer;
+ outline: none;
+}
+a.elgg-button {
+ padding: 3px 6px;
+}
+
+.elgg-button + .elgg-button {
+ margin-left: 5px;
+}
+
+.elgg-button-submit,
+.elgg-button-action {
+ color: white;
+ border: 1px solid #333;
+ background-color: #333;
+ text-shadow: 1px 1px 0px black;
+}
+.elgg-button-submit:hover,
+.elgg-button-action:hover {
+ color: white;
+ background-color: #000;
+ text-decoration: none;
+}
+.elgg-button-submit.elgg-state-disabled,
+.elgg-button-action.elgg-state-disabled {
+ color: #999;
+ cursor: default;
+}
+
+.elgg-button-cancel {
+ color: #333;
+ background-color: #999;
+ border: 1px solid #999;
+}
+.elgg-button-cancel:hover {
+ color: #222;
+ background-color: #666;
+ text-decoration: none;
+}
+
+.elgg-form-useradd input[type=text],
+.elgg-form-useradd input[type=password] {
+ width: 300px;
+}
+
+.elgg-form-settings {
+ max-width: 800px;
+}
+
+/* **************************************
+ DATE PICKER
+*************************************** */
+.ui-datepicker {
+ margin-top: 3px;
+ padding: 3px 3px 0;
+ border: 1px solid #ccc;
+ background-color: white;
+}
+.ui-datepicker-header {
+ padding: 2px 0;
+ border: 1px solid #ccc;
+ background-color: #eee;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+.ui-datepicker-prev, .ui-datepicker-next {
+ position: absolute;
+ top: 9px;
+ cursor: pointer;
+}
+.ui-datepicker-prev {
+ left: 6px;
+}
+.ui-datepicker-next {
+ right: 6px;
+}
+.ui-datepicker-title {
+ line-height: 1.8em;
+ margin: 0 30px;
+ text-align: center;
+ font-weight: bold;
+}
+.ui-datepicker-calendar {
+ margin-bottom: 2px;
+}
+.ui-datepicker th {
+ border: none;
+ font-weight: bold;
+ padding: 5px 6px;
+ text-align: center;
+}
+.ui-datepicker td {
+ padding: 1px;
+}
+.ui-datepicker td span, .ui-datepicker td a {
+ display: block;
+ padding: 2px;
+ line-height: 1.2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker-calendar .ui-state-default {
+ border: 1px solid #ccc;
+ color: #555;
+ background: #fafafa;
+}
+.ui-datepicker-calendar .ui-state-hover {
+ border: 1px solid #aaa;
+ color: #333;
+ background: #ccc;
+}
+.ui-datepicker-calendar .ui-state-active,
+.ui-datepicker-calendar .ui-state-active.ui-state-hover {
+ font-weight: bold;
+ border: 1px solid #999;
+ color: #333;
+ background: #ddd;
+}
+
+/* ***************************************
+ PAGINATION
+*************************************** */
+.elgg-pagination {
+ margin: 10px 0;
+ display: block;
+ text-align: center;
+}
+.elgg-pagination li {
+ display: inline;
+ margin: 0 6px 0 0;
+ text-align: center;
+}
+.elgg-pagination a, .elgg-pagination span {
+ padding: 2px 6px;
+ color: #333;
+ border: 1px solid #333;
+ font-size: 12px;
+ text-decoration: none;
+}
+.elgg-pagination a:hover {
+ background: #333;
+ color: white;
+ text-decoration: none;
+}
+.elgg-pagination .elgg-state-disabled span {
+ color: #CCC;
+ border-color: #CCC;
+}
+.elgg-pagination .elgg-state-selected span {
+ color: #000;
+ border-color: #ccc;
+}
+
+/* ***************************************
+ TABS
+*************************************** */
+.elgg-tabs {
+ margin-bottom: 5px;
+ border-bottom: 1px solid #ccc;
+ display: table;
+ width: 100%;
+}
+.elgg-tabs li {
+ float: left;
+ border: 1px solid #ccc;
+ border-bottom-width: 0;
+ background: #eee;
+ margin: 0 0 0 10px;
+}
+.elgg-tabs a {
+ text-decoration: none;
+ display: block;
+ padding: 3px 10px 0 10px;
+ text-align: center;
+ height: 21px;
+ color: #999;
+}
+.elgg-tabs a:hover {
+ background: #dedede;
+ color:#333;
+}
+.elgg-tabs .elgg-state-selected {
+ border-color: #ccc;
+ background: white;
+}
+.elgg-tabs .elgg-state-selected a {
+ position: relative;
+ top: 2px;
+ background: white;
+}
+
+/* ***************************************
+ SIDEBAR MENU
+*************************************** */
+.elgg-admin-sidebar-menu a {
+ border: 1px solid red;
+ display: block;
+ padding: 5px;
+ color: #333;
+ cursor: pointer;
+ text-decoration: none;
+ margin-bottom: 2px;
+ border: 1px solid #CCC;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.elgg-admin-sidebar-menu a:hover {
+ text-decoration: none;
+ background: black;
+ color: white;
+ border: 1px solid black;
+}
+.elgg-admin-sidebar-menu li.elgg-state-selected > a {
+ background-color: #BBB;
+}
+.elgg-admin-sidebar-menu .elgg-menu-closed:before {
+ content: "\25B8";
+ padding-right: 4px;
+}
+.elgg-admin-sidebar-menu .elgg-menu-opened:before {
+ content: "\25BE";
+ padding-right: 4px;
+}
+.elgg-admin-sidebar-menu .elgg-child-menu {
+ display: none;
+ padding-left: 30px;
+}
+.elgg-admin-sidebar-menu li.elgg-state-selected > ul {
+ display: block;
+}
+.elgg-admin-sidebar-menu h2 {
+ padding-bottom: 5px;
+}
+.elgg-admin-sidebar-menu ul.elgg-menu-page {
+ padding-bottom: 15px;
+}
+
+/* ***************************************
+ TITLE MENU
+*************************************** */
+.elgg-menu-title {
+ float: right;
+}
+.elgg-menu-title > li {
+ display: inline-block;
+ margin-left: 4px;
+}
+
+/* ***************************************
+ FOOTER MENU
+*************************************** */
+.elgg-menu-footer {
+ color: gray;
+}
+.elgg-menu-footer li {
+ float: left;
+}
+.elgg-menu-footer li:after {
+ content: "\007C";
+ display: inline-block;
+ padding: 0 4px 0 4px;
+ font-weight: normal;
+}
+.elgg-menu-footer li:last-child:after {
+ content: "";
+}
+
+/* ***************************************
+ GENERAL MENU
+*************************************** */
+.elgg-menu-general > li,
+.elgg-menu-general > li > a {
+ display: inline-block;
+ color: #999;
+}
+
+.elgg-menu-general > li:after {
+ content: "\007C";
+ padding: 0 4px;
+}
+
+/* ***************************************
+ HOVER MENU
+*************************************** */
+.elgg-menu-hover {
+ display: none;
+ position: absolute;
+ z-index: 10000;
+
+ width: 165px;
+ border: solid 1px #E5E5E5;
+ border-color: #E5E5E5 #999 #999 #E5E5E5;
+ background-color: #FFF;
+
+ -webkit-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+ -moz-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+}
+.elgg-menu-hover > li {
+ border-bottom: 1px solid #ddd;
+}
+.elgg-menu-hover > li:last-child {
+ border-bottom: none;
+}
+.elgg-menu-hover .elgg-heading-basic {
+ display: block;
+}
+.elgg-menu-hover a {
+ display: block;
+ padding: 2px 8px;
+ font-size: 92%;
+}
+.elgg-menu-hover a:hover {
+ background: #ccc;
+ text-decoration: none;
+}
+.elgg-menu-hover-admin a {
+ color: red;
+}
+.elgg-menu-hover-admin a:hover {
+ color: white;
+ background-color: red;
+}
+
+/* ***************************************
+ ENTITY MENU
+*************************************** */
+<?php // height depends on line height/font size ?>
+.elgg-menu-entity, elgg-menu-annotation {
+ float: right;
+ margin-left: 15px;
+ font-size: 90%;
+ color: #666;
+ line-height: 16px;
+ height: 16px;
+}
+.elgg-menu-entity > li, .elgg-menu-annotation > li {
+ margin-left: 15px;
+}
+.elgg-menu-entity > li > a, .elgg-menu-annotation > li > a {
+ color: #aaa;
+}
+<?php // need to override .elgg-menu-hz ?>
+.elgg-menu-entity > li > a, .elgg-menu-annotation > li > a {
+ display: block;
+}
+.elgg-menu-entity > li > span, .elgg-menu-annotation > li > span {
+ vertical-align: baseline;
+}
+
+/* ***************************************
+ WIDGET MENU
+*************************************** */
+.elgg-menu-widget > li {
+ position: absolute;
+ top: 4px;
+ display: inline-block;
+ width: 18px;
+ height: 18px;
+ padding: 2px 2px 0 0;
+}
+.elgg-menu-widget > .elgg-menu-item-collapse {
+ left: 5px;
+}
+.elgg-menu-widget > .elgg-menu-item-delete {
+ right: 5px;
+}
+.elgg-menu-widget > .elgg-menu-item-settings {
+ right: 25px;
+}
+
+/* ***************************************
+ MORE MENUS
+*************************************** */
+/* Horizontal menus w/ separator support */
+.elgg-menu-hz > li,
+.elgg-menu-hz > li:after,
+.elgg-menu-hz > li > a {
+ display: inline-block;
+ vertical-align: middle;
+}
+/* Allow inline image blocks in horizontal menus */
+.elgg-menu-hz .elgg-body:after {
+ content: '.';
+}
+.elgg-menu > li:last-child::after {
+ display: none;
+}
+.elgg-menu-admin-footer a {
+ color: #eee;
+}
+.elgg-menu-admin-footer > li {
+ padding-right: 25px;
+}
+.elgg-menu-longtext {
+ float: right;
+}
+.elgg-menu-metadata {
+ list-style-type: none;
+ float: right;
+ margin-left: 15px;
+ font-size: 90%;
+}
+.elgg-menu-metadata > li {
+ float: left;
+ margin-left: 15px;
+}
+.elgg-menu-metadata, .elgg-menu-metadata a {
+ color: #aaa;
+}
+
+/* ***************************************
+ WIDGETS
+*************************************** */
+.elgg-widgets {
+ float: right;
+ min-height: 30px;
+}
+.elgg-widget-add-control {
+ text-align: right;
+ margin: 5px 5px 15px;
+}
+.elgg-widgets-add-panel {
+ padding: 10px;
+ margin: 0 5px 15px;
+ background: #eee;
+ border: 1px solid #ccc;
+}
+.elgg-widgets-add-panel ul {
+ padding: 0;
+ margin: 0;
+}
+.elgg-widgets-add-panel li {
+ float: left;
+ margin: 2px 10px;
+ list-style: none;
+ width: 200px;
+ padding: 4px;
+ background-color: #eee;
+ border: 1px solid #ccc;
+ font-weight: bold;
+}
+.elgg-widgets-add-panel li a {
+ display: block;
+}
+.elgg-widget-single.elgg-state-available {
+ color: #333;
+ cursor: pointer;
+}
+.elgg-widget-single.elgg-state-available:hover {
+ border-color: #aaa;
+}
+.elgg-widget-single.elgg-state-unavailable {
+ color: #888;
+}
+
+.elgg-module-widget {
+ background-color: #dedede;
+ padding: 1px;
+ margin: 0 5px 15px;
+ position: relative;
+}
+.elgg-module-widget:hover {
+ background-color: #ccc;
+}
+.elgg-module-widget > .elgg-head {
+ background-color: #f5f5f5;
+ height: 26px;
+ overflow: hidden;
+}
+.elgg-module-widget.elgg-state-draggable .elgg-widget-handle {
+ cursor: move;
+}
+.elgg-module-widget > .elgg-head h3 {
+ float: left;
+ padding: 4px 45px 0 20px;
+ color: #333;
+}
+
+.elgg-widget-collapse-button {
+ color: #c5c5c5;
+ text-decoration: none;
+}
+a.elgg-widget-collapse-button:hover,
+a.elgg-widget-collapsed:hover {
+ color: #9d9d9d;
+ text-decoration: none;
+}
+a.elgg-widget-collapse-button:before {
+ content: "\25BC";
+}
+a.elgg-widget-collapsed:before {
+ content: "\25BA";
+}
+.elgg-module-widget > .elgg-body {
+ border-top: 1px solid #dedede;
+ background-color: white;
+ width: 100%;
+ overflow: hidden;
+}
+.elgg-widget-edit {
+ display: none;
+ width: 96%;
+ padding: 2%;
+ border-bottom: 1px solid #dedede;
+}
+.elgg-widget-content {
+ padding: 10px;
+}
+.elgg-widget-placeholder {
+ border: 2px dashed #dedede;
+ margin-bottom: 15px;
+}
+
+/* ***************************************
+ GRID
+*************************************** */
+.elgg-grid {}
+.elgg-col {
+ float: left;
+}
+.elgg-col-1of1 {
+ float: none;
+}
+.elgg-col-1of2 {
+ width: 50%;
+}
+.elgg-col-1of3 {
+ width: 33.33%;
+}
+.elgg-col-2of3 {
+ width: 66.66%;
+}
+.elgg-col-1of4 {
+ width: 25%;
+}
+.elgg-col-3of4 {
+ width: 75%;
+}
+.elgg-col-1of5 {
+ width: 20%;
+}
+.elgg-col-2of5 {
+ width: 40%;
+}
+.elgg-col-3of5 {
+ width: 60%;
+}
+.elgg-col-4of5 {
+ width: 80%;
+}
+.elgg-col-1of6 {
+ width: 16.66%;
+}
+.elgg-col-5of6 {
+ width: 83.33%;
+}
+
+/* ***************************************
+ ICONS
+*************************************** */
+.elgg-icon {
+ background: transparent url(<?php echo elgg_get_site_url(); ?>_graphics/admin_sprites.png) no-repeat left;
+ width: 16px;
+ height: 16px;
+ display: inline-block;
+ margin: 0 2px;
+}
+.elgg-icon-delete:hover,
+.elgg-icon-delete-alt:hover {
+ background-position: 0 -0px;
+}
+.elgg-icon-delete,
+.elgg-icon-delete-alt {
+ background-position: 0 -18px;
+}
+.elgg-icon-drag-arrow:hover {
+ background-position: 0 -36px;
+}
+.elgg-icon-drag-arrow {
+ background-position: 0 -54px;
+}
+.elgg-icon-hover-menu:hover {
+ background-position: 0 -72px;
+}
+.elgg-icon-hover-menu {
+ background-position: 0 -90px;
+}
+.elgg-icon-settings-alt:hover {
+ background-position: 0 -108px;
+}
+.elgg-icon-settings-alt {
+ background-position: 0 -126px;
+}
+
+.elgg-ajax-loader {
+ background: white url(<?php echo elgg_get_site_url(); ?>_graphics/ajax_loader_bw.gif) no-repeat center center;
+ min-height: 33px;
+ min-width: 33px;
+}
+
+/* ***************************************
+ AVATAR ICONS
+*************************************** */
+.elgg-avatar {
+ position: relative;
+ display: inline-block;
+}
+.elgg-avatar > a > img {
+ display: block;
+}
+.elgg-avatar-tiny > a > img {
+ width: 25px;
+ height: 25px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 25px;
+ -khtml-background-size: 25px;
+ -moz-background-size: 25px;
+ -o-background-size: 25px;
+ background-size: 25px;
+}
+.elgg-avatar-small > a > img {
+ width: 40px;
+ height: 40px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 40px;
+ -khtml-background-size: 40px;
+ -moz-background-size: 40px;
+ -o-background-size: 40px;
+ background-size: 40px;
+}
+.elgg-avatar-medium > a > img {
+ width: 100px;
+ height: 100px;
+}
+.elgg-avatar-large > a > img {
+ width: 200px;
+ height: 200px;
+}
+.elgg-avatar > .elgg-icon-hover-menu {
+ display: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ margin: 0;
+ cursor: pointer;
+}
+.elgg-avatar {
+ position: relative;
+}
+.elgg-avatar > a > img {
+ display: block;
+}
+.elgg-avatar-tiny > a > img {
+ width: 25px;
+ height: 25px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 25px;
+ -khtml-background-size: 25px;
+ -moz-background-size: 25px;
+ -o-background-size: 25px;
+ background-size: 25px;
+}
+.elgg-avatar-small > a > img {
+ width: 40px;
+ height: 40px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 40px;
+ -khtml-background-size: 40px;
+ -moz-background-size: 40px;
+ -o-background-size: 40px;
+ background-size: 40px;
+}
+.elgg-avatar-medium > a > img {
+ width: 100px;
+ height: 100px;
+}
+.elgg-avatar-large > a > img {
+ width: 200px;
+ height: 200px;
+}
+
+/* ***************************************
+ PLUGINS
+**************************************** */
+.elgg-plugin {
+ border: 1px solid #999;
+ margin: 0 0 5px;
+ padding: 0 7px 4px 10px;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.elgg-plugin.elgg-state-draggable > .elgg-image-block .elgg-head {
+ cursor: move;
+}
+.elgg-plugin p {
+ margin: 0;
+}
+.elgg-plugin h3 {
+ color: black;
+ padding-bottom: 10px;
+}
+.elgg-plugin-settings {
+ font-weight: normal;
+ font-size: 0.9em;
+}
+.elgg-plugin-screenshot {
+ display: inline;
+}
+.elgg-plugin-screenshot img {
+ border: 1px solid #999;
+}
+.elgg-plugin-screenshot-lightbox {
+ display: block;
+ position: absolute;
+ width: 99%;
+ text-align: center;
+ background-color: white;
+ border: 1px solid #999;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+}
+.elgg-plugin-screenshot-lightbox h2 {
+ color: black;
+}
+.elgg-plugin.elgg-state-active {
+ background: white;
+}
+.elgg-plugin.elgg-state-inactive {
+ background: #dedede;
+}
+.elgg-plugin .elgg-state-error {
+ background: #fbe3e4;
+ color: #8a1f11;
+ border-color: #fbc2c4;
+ font-weight: bold;
+}
+.elgg-plugin .elgg-state-warning {
+ background: #fbedb5;
+ color: #000000;
+ border-color: #fbe58b;
+ font-weight: bold;
+}
+.elgg-plugin-more {
+ background-color: #eee;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ padding: 5px 10px;
+ margin: 4px 0;
+}
+ul.elgg-plugin-categories, ul.elgg-plugin-categories > li {
+ display: inline;
+}
+.elgg-plugin-category-bundled {
+ border-width: 2px;
+ border-color: #DAA520;
+}
+
+/****************************************
+ MARKDOWN
+****************************************/
+.elgg-markdown {
+ margin: 15px;
+}
+.elgg-markdown h1,
+.elgg-markdown h2,
+.elgg-markdown h3,
+.elgg-markdown h4,
+.elgg-markdown h5,
+.elgg-markdown h6 {
+ margin: 1em 0 1em -15px;
+ color: #333;
+}
+.elgg-markdown ol {
+ list-style: decimal;
+ padding-left: 2em;
+}
+.elgg-markdown ul {
+ list-style: disc;
+ padding-left: 2em;
+}
+.elgg-markdown p {
+ margin: 15px 0;
+}
+
+/* ***************************************
+ MISC
+*************************************** */
+.elgg-content-thin {
+ max-width: 600px;
+}
+
+.elgg-subtext {
+ color: #666;
+ font-size: 85%;
+ line-height: 1.2em;
+ font-style: italic;
+ margin-bottom: 5px;
+}
+
+.elgg-longtext-control {
+ margin-left: 14px;
+ font-size: 80%;
+ cursor: pointer;
+}
+
+table.mceLayout {
+ width:100% !important;
+}
+
+.elgg-output dt {
+ font-weight: bold;
+}
+.elgg-output dd {
+ margin: 0 0 1em 2em;
+}
+
+/* ***************************************
+ HELPERS
+*************************************** */
+.hidden {
+ display: none;
+}
+.centered {
+ margin: 0 auto;
+}
+.center {
+ text-align: center;
+}
+.float {
+ float: left;
+}
+.float-alt {
+ float: right;
+}
+.elgg-toggle {
+ cursor: pointer;
+}
+.elgg-discover .elgg-discoverable {
+ display: none;
+}
+.elgg-discover:hover .elgg-discoverable {
+ display: block;
+}
+.elgg-transition:hover {
+ opacity: .7;
+}
+
+/* ***************************************
+ BORDERS AND SEPARATORS
+*************************************** */
+.elgg-border-plain {
+ border: 1px solid #eeeeee;
+}
+.elgg-border-transition {
+ border: 1px solid #eeeeee;
+}
+.elgg-divide-top {
+ border-top: 1px solid #CCCCCC;
+}
+.elgg-divide-bottom {
+ border-bottom: 1px solid #CCCCCC;
+}
+.elgg-divide-left {
+ border-left: 1px solid #CCCCCC;
+}
+.elgg-divide-right {
+ border-right: 1px solid #CCCCCC;
+}
+
+/* ***************************************
+ SPACING (from OOCSS)
+*************************************** */
+.pan{padding:0}
+.pas{padding:5px}
+.pam{padding:10px}
+.pal{padding:20px}
+.ptn{padding-top:0}
+.pts{padding-top:5px}
+.ptm{padding-top:10px}
+.ptl{padding-top:20px}
+.prn{padding-right:0}
+.prs{padding-right:5px}
+.prm{padding-right:10px}
+.prl{padding-right:20px}
+.pbn{padding-bottom:0}
+.pbs{padding-bottom:5px}
+.pbm{padding-bottom:10px}
+.pbl{padding-bottom:20px}
+.pln{padding-left:0}
+.pls{padding-left:5px}
+.plm{padding-left:10px}
+.pll{padding-left:20px}
+.phn{padding-left:0;padding-right:0}
+.phs{padding-left:5px;padding-right:5px}
+.phm{padding-left:10px;padding-right:10px}
+.phl{padding-left:20px;padding-right:20px}
+.pvn{padding-top:0;padding-bottom:0}
+.pvs{padding-top:5px;padding-bottom:5px}
+.pvm{padding-top:10px;padding-bottom:10px}
+.pvl{padding-top:20px;padding-bottom:20px}
+.man{margin:0}
+.mas{margin:5px}
+.mam{margin:10px}
+.mal{margin:20px}
+.mtn{margin-top:0}
+.mts{margin-top:5px}
+.mtm{margin-top:10px}
+.mtl{margin-top:20px}
+.mrn{margin-right:0}
+.mrs{margin-right:5px}
+.mrm{margin-right:10px}
+.mrl{margin-right:20px}
+.mbn{margin-bottom:0}
+.mbs{margin-bottom:5px}
+.mbm{margin-bottom:10px}
+.mbl{margin-bottom:20px}
+.mln{margin-left:0}
+.mls{margin-left:5px}
+.mlm{margin-left:10px}
+.mll{margin-left:20px}
+.mhn{margin-left:0;margin-right:0}
+.mhs{margin-left:5px;margin-right:5px}
+.mhm{margin-left:10px;margin-right:10px}
+.mhl{margin-left:20px;margin-right:20px}
+.mvn{margin-top:0;margin-bottom:0}
+.mvs{margin-top:5px;margin-bottom:5px}
+.mvm{margin-top:10px;margin-bottom:10px}
+.mvl{margin-top:20px;margin-bottom:20px}
diff --git a/mod/basic_theme/views/default/css/elements/OOCSS_LICENSE b/mod/basic_theme/views/default/css/elements/OOCSS_LICENSE
new file mode 100644
index 000000000..c09c45873
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/OOCSS_LICENSE
@@ -0,0 +1,30 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2009, Nicole Sullivan.
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms, with or without modification, are
+permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of Nicole Sullivan nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of Nicole Sullivan.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/elements/buttons.php b/mod/basic_theme/views/default/css/elements/buttons.php
new file mode 100644
index 000000000..e9c99cf96
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/buttons.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * CSS buttons
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* **************************
+ BUTTONS
+************************** */
+
+/* Base */
+.elgg-button {
+ font-size: 14px;
+ font-weight: bold;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ width: auto;
+ padding: 2px 4px;
+ cursor: pointer;
+ outline: none;
+
+ -webkit-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.40);
+ -moz-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.40);
+ box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.40);
+}
+a.elgg-button {
+ padding: 3px 6px;
+}
+
+/* Submit: This button should convey, "you're about to take some definitive action" */
+.elgg-button-submit {
+ color: white;
+ text-shadow: 1px 1px 0px black;
+ text-decoration: none;
+ border: 1px solid #4690d6;
+ background: #4690d6 url(<?php echo elgg_get_site_url(); ?>_graphics/button_graduation.png) repeat-x left 10px;
+}
+
+.elgg-button-submit:hover {
+ border-color: #0054a7;
+ text-decoration: none;
+ color: white;
+ background: #0054a7 url(<?php echo elgg_get_site_url(); ?>_graphics/button_graduation.png) repeat-x left 10px;
+}
+
+.elgg-button-submit.elgg-state-disabled {
+ background: #999;
+ border-color: #999;
+ cursor: default;
+}
+
+/* Cancel: This button should convey a negative but easily reversible action (e.g., turning off a plugin) */
+.elgg-button-cancel {
+ color: #333;
+ background: #ddd url(<?php echo elgg_get_site_url(); ?>_graphics/button_graduation.png) repeat-x left 10px;
+ border: 1px solid #999;
+}
+.elgg-button-cancel:hover {
+ color: #444;
+ background-color: #999;
+ background-position: left 10px;
+ text-decoration: none;
+}
+
+/* Action: This button should convey a normal, inconsequential action, such as clicking a link */
+.elgg-button-action {
+ background: #ccc url(<?php echo elgg_get_site_url(); ?>_graphics/button_background.gif) repeat-x 0 0;
+ border:1px solid #999;
+ color: #333;
+ padding: 2px 15px;
+ text-align: center;
+ font-weight: bold;
+ text-decoration: none;
+ text-shadow: 0 1px 0 white;
+ cursor: pointer;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.elgg-button-action:hover,
+.elgg-button-action:focus {
+ background: #ccc url(<?php echo elgg_get_site_url(); ?>_graphics/button_background.gif) repeat-x 0 -15px;
+ color: #111;
+ text-decoration: none;
+ border: 1px solid #999;
+}
+
+/* Delete: This button should convey "be careful before you click me" */
+.elgg-button-delete {
+ color: #bbb;
+ text-decoration: none;
+ border: 1px solid #333;
+ background: #555 url(<?php echo elgg_get_site_url(); ?>_graphics/button_graduation.png) repeat-x left 10px;
+ text-shadow: 1px 1px 0px black;
+}
+.elgg-button-delete:hover {
+ color: #999;
+ background-color: #333;
+ background-position: left 10px;
+ text-decoration: none;
+}
+
+.elgg-button-dropdown {
+ padding:3px 6px;
+ text-decoration:none;
+ display:block;
+ font-weight:bold;
+ position:relative;
+ margin-left:0;
+ color: white;
+ border:1px solid #71B9F7;
+
+ -webkit-border-radius:4px;
+ -moz-border-radius:4px;
+ border-radius:4px;
+
+ -webkit-box-shadow: 0 0 0;
+ -moz-box-shadow: 0 0 0;
+ box-shadow: 0 0 0;
+
+ /*background-image:url(<?php echo elgg_get_site_url(); ?>_graphics/elgg_sprites.png);
+ background-position:-150px -51px;
+ background-repeat:no-repeat;*/
+}
+
+.elgg-button-dropdown:after {
+ content: " \25BC ";
+ font-size:smaller;
+}
+
+.elgg-button-dropdown:hover {
+ background-color:#71B9F7;
+ text-decoration:none;
+}
+
+.elgg-button-dropdown.elgg-state-active {
+ background: #ccc;
+ outline: none;
+ color: #333;
+ border:1px solid #ccc;
+
+ -webkit-border-radius:4px 4px 0 0;
+ -moz-border-radius:4px 4px 0 0;
+ border-radius:4px 4px 0 0;
+}
diff --git a/mod/basic_theme/views/default/css/elements/components.php b/mod/basic_theme/views/default/css/elements/components.php
new file mode 100644
index 000000000..7fe535d57
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/components.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Layout Object CSS
+ *
+ * Image blocks, lists, tables, gallery, messages
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ Image Block
+*************************************** */
+.elgg-image-block {
+ padding: 3px 0;
+}
+.elgg-image-block .elgg-image {
+ float: left;
+ margin-right: 5px;
+}
+.elgg-image-block .elgg-image-alt {
+ float: right;
+ margin-left: 5px;
+}
+
+/* ***************************************
+ List
+*************************************** */
+.elgg-list {
+ border-top: 1px dotted #CCCCCC;
+ margin: 5px 0;
+ clear: both;
+}
+.elgg-list > li {
+ border-bottom: 1px dotted #CCCCCC;
+}
+
+.elgg-item .elgg-subtext {
+ margin-bottom: 5px;
+}
+.elgg-item .elgg-content {
+ margin: 10px 5px;
+}
+
+/* ***************************************
+ Gallery
+*************************************** */
+.elgg-gallery {
+ border: none;
+ margin-right: auto;
+ margin-left: auto;
+}
+.elgg-gallery td {
+ padding: 5px;
+}
+.elgg-gallery-fluid > li {
+ float: left;
+}
+.elgg-gallery-users > li {
+ margin: 0 2px;
+}
+
+/* ***************************************
+ Tables
+*************************************** */
+.elgg-table {
+ width: 100%;
+ border-top: 1px solid #ccc;
+}
+.elgg-table td, .elgg-table th {
+ padding: 4px 8px;
+ border: 1px solid #ccc;
+}
+.elgg-table th {
+ background-color: #ddd;
+}
+.elgg-table tr:nth-child(odd), .elgg-table tr.odd {
+ background-color: #fff;
+}
+.elgg-table tr:nth-child(even), .elgg-table tr.even {
+ background-color: #f0f0f0;
+}
+.elgg-table-alt {
+ width: 100%;
+ border-top: 1px solid #ccc;
+}
+.elgg-table-alt th {
+ background-color: #eee;
+ font-weight: bold;
+}
+.elgg-table-alt td, .elgg-table-alt th {
+ padding: 2px 4px 2px 4px;
+ border-bottom: 1px solid #ccc;
+}
+.elgg-table-alt td:first-child {
+ width: 200px;
+}
+.elgg-table-alt tr:hover {
+ background: #E4E4E4;
+}
+
+/* ***************************************
+ Owner Block
+*************************************** */
+.elgg-owner-block {
+ margin-bottom: 20px;
+}
+
+/* ***************************************
+ Messages
+*************************************** */
+.elgg-message {
+ color: white;
+ font-weight: bold;
+ display: block;
+ padding: 3px 10px;
+ cursor: pointer;
+ opacity: 0.9;
+
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+ -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.45);
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+}
+.elgg-state-success {
+ background-color: black;
+}
+.elgg-state-error {
+ background-color: red;
+}
+.elgg-state-notice {
+ background-color: #4690D6;
+}
+
+/* ***************************************
+ River
+*************************************** */
+.elgg-list-river {
+ border-top: 1px solid #CCC;
+}
+.elgg-list-river > li {
+ border-bottom: 1px solid #CCC;
+}
+.elgg-river-item {
+ padding: 7px 0;
+}
+.elgg-river-item .elgg-pict {
+ margin-right: 20px;
+}
+.elgg-river-timestamp {
+ color: #666;
+ font-size: 85%;
+ font-style: italic;
+ line-height: 1.2em;
+}
+
+.elgg-river-attachments,
+.elgg-river-message,
+.elgg-river-content {
+ border-left: 1px solid #CCC;
+ font-size: 85%;
+ line-height: 1.5em;
+ margin: 8px 0 5px 0;
+ padding-left: 5px;
+}
+.elgg-river-attachments .elgg-avatar,
+.elgg-river-attachments .elgg-icon {
+ float: left;
+}
+.elgg-river-layout .elgg-input-dropdown {
+ float: right;
+ margin: 10px 0;
+}
+
+.elgg-river-comments-tab {
+ display: block;
+ background-color: #EEE;
+ color: #4690D6;
+ margin-top: 5px;
+ width: auto;
+ float: right;
+ font-size: 85%;
+ padding: 1px 7px;
+
+ -webkit-border-radius: 5px 5px 0 0;
+ -moz-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+
+<?php //@todo components.php ?>
+.elgg-river-comments {
+ margin: 0;
+ border-top: none;
+}
+.elgg-river-comments li:first-child {
+ -webkit-border-radius: 5px 0 0;
+ -moz-border-radius: 5px 0 0;
+ border-radius: 5px 0 0;
+}
+.elgg-river-comments li:last-child {
+ -webkit-border-radius: 0 0 5px 5px;
+ -moz-border-radius-bottomleft: 0 0 5px 5px;
+ border-radius-bottomleft: 0 0 5px 5px;
+}
+.elgg-river-comments li {
+ background-color: #EEE;
+ border-bottom: none;
+ padding: 4px;
+ margin-bottom: 2px;
+}
+.elgg-river-comments .elgg-media {
+ padding: 0;
+}
+.elgg-river-more {
+ background-color: #EEE;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ padding: 2px 4px;
+ font-size: 85%;
+ margin-bottom: 2px;
+}
+
+<?php //@todo location-dependent styles ?>
+.elgg-river-item form {
+ background-color: #EEE;
+ padding: 4px;
+
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+
+ height: 30px;
+}
+.elgg-river-item input[type=text] {
+ width: 80%;
+}
+.elgg-river-item input[type=submit] {
+ margin: 0 0 0 10px;
+}
+
+
+/* **************************************
+ Comments (from elgg_view_comments)
+************************************** */
+.elgg-comments {
+ margin-top: 25px;
+}
+.elgg-comments > form {
+ margin-top: 15px;
+}
+
+/* ***************************************
+ Image-related
+*************************************** */
+.elgg-photo {
+ border: 1px solid #ccc;
+ padding: 3px;
+ background-color: white;
+}
+
+/* ***************************************
+ Tags
+*************************************** */
+.elgg-tags {
+ font-size: 85%;
+}
+.elgg-tags > li {
+ float:left;
+ margin-right: 5px;
+}
+.elgg-tags li.elgg-tag:after {
+ content: ",";
+}
+.elgg-tags li.elgg-tag:last-child:after {
+ content: "";
+}
+.elgg-tagcloud {
+ text-align: justify;
+}
diff --git a/mod/basic_theme/views/default/css/elements/core.php b/mod/basic_theme/views/default/css/elements/core.php
new file mode 100644
index 000000000..74f21ee59
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/core.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Core CSS
+ *
+ * This file holds all the complicated/hacky stuff that you really
+ * shouldn't touch or override unless you're sure you know what you're doing.
+ *
+ * Provides classes that implement cross-browser support for the following features:
+ * * clearfix
+ * * fluid-width content area that doesn't wrap around floats
+ * * menu's with separators
+ * * inline-block
+ * * horizontal menus
+ * * fluid gallery without using tables
+ */
+?>
+
+/* Clearfix */
+.clearfix:after,
+.elgg-grid:after,
+.elgg-layout:after,
+.elgg-inner:after,
+.elgg-page-header:after,
+.elgg-page-footer:after,
+.elgg-head:after,
+.elgg-foot:after,
+.elgg-col:after,
+.elgg-image-block:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+/* Fluid width container that does not wrap floats */
+.elgg-body,
+.elgg-col-last {
+ display: block;
+ width: auto;
+ word-wrap: break-word;
+ overflow: hidden;
+
+ /* IE 6, 7 */
+ zoom:1;
+ *overflow:visible;
+}
+
+<?php
+/**
+ * elgg-body fills the space available to it.
+ * It uses hidden text to expand itself. The combination of auto width, overflow
+ * hidden, and the hidden text creates this effect.
+ *
+ * This allows us to float fixed width divs to either side of an .elgg-body div
+ * without having to specify the body div's width.
+ *
+ * @todo check what happens with long <pre> tags or large images
+ * @todo Move this to its own file -- it is very complicated and should not have to be overridden.
+ */
+
+//@todo isn't this only needed if we use display:table-cell?
+?>
+.elgg-body:after,
+.elgg-col-last:after {
+ display: block;
+ visibility: hidden;
+ height: 0 !important;
+ line-height: 0;
+ overflow: hidden;
+
+ /* Stretch to fill up available space */
+ font-size: xx-large;
+ content: " x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
+}
+
+/* ***************************************
+ * MENUS
+ *
+ * To add separators to a menu:
+ * .elgg-menu-$menu > li:after {content: '|'; background: ...;}
+ *************************************** */
+/* Enabled nesting of dropdown/flyout menus */
+.elgg-menu > li { position: relative; }
+
+.elgg-menu > li:last-child::after {
+ display: none;
+}
+
+/* Maximize click target */
+.elgg-menu > li > a { display: block }
+
+/* Horizontal menus w/ separator support */
+.elgg-menu-hz > li,
+.elgg-menu-hz > li:after,
+.elgg-menu-hz > li > a,
+.elgg-menu-hz > li > span {
+ vertical-align: middle;
+}
+
+/* Allow inline image blocks in horizontal menus */
+.elgg-menu-hz .elgg-body:after { content: '.'; }
+
+<?php //@todo This isn't going to work as-is. Needs testing ?>
+/* Inline block */
+.elgg-gallery > li,
+.elgg-button,
+.elgg-icon,
+.elgg-menu-hz > li,
+.elgg-menu-hz > li:after,
+.elgg-menu-hz > li > a,
+.elgg-menu-hz > li > span {
+ /* Google says do this, but why? */
+ position: relative;
+
+ display: inline-block;
+}
diff --git a/mod/basic_theme/views/default/css/elements/forms.php b/mod/basic_theme/views/default/css/elements/forms.php
new file mode 100644
index 000000000..81db81747
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/forms.php
@@ -0,0 +1,370 @@
+<?php
+/**
+ * CSS form/input elements
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ Form Elements
+*************************************** */
+fieldset > div {
+ margin-bottom: 15px;
+}
+fieldset > div:last-child {
+ margin-bottom: 0;
+}
+.elgg-form-alt > fieldset > .elgg-foot {
+ border-top: 1px solid #CCC;
+ padding: 10px 0;
+}
+
+label {
+ font-weight: bold;
+ color: #333;
+ font-size: 110%;
+}
+
+input, textarea {
+ border: 1px solid #ccc;
+ color: #666;
+ font: 120% Arial, Helvetica, sans-serif;
+ padding: 5px;
+ width: 100%;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+input[type=text]:focus, textarea:focus {
+ border: solid 1px #4690d6;
+ background: #e4ecf5;
+ color:#333;
+}
+
+textarea {
+ height: 200px;
+}
+
+
+.elgg-longtext-control {
+ float: right;
+ margin-left: 14px;
+ font-size: 80%;
+ cursor: pointer;
+}
+
+
+.elgg-input-access {
+ margin:5px 0 0 0;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ margin:0 3px 0 0;
+ padding:0;
+ border:none;
+ width:auto;
+}
+.elgg-input-checkboxes.elgg-horizontal li,
+.elgg-input-radios.elgg-horizontal li {
+ display: inline;
+ padding-right: 10px;
+}
+
+.elgg-form-login, .elgg-form-account {
+ max-width: 450px;
+}
+
+/* ***************************************
+ FRIENDS PICKER
+*************************************** */
+.friends-picker-main-wrapper {
+ margin-bottom: 15px;
+}
+.friends-picker-container h3 {
+ font-size:4em !important;
+ text-align: left;
+ margin:10px 0 20px !important;
+ color:#999 !important;
+ background: none !important;
+ padding:0 !important;
+}
+.friends-picker .friends-picker-container .panel ul {
+ text-align: left;
+ margin: 0;
+ padding:0;
+}
+.friends-picker-wrapper {
+ margin: 0;
+ padding:0;
+ position: relative;
+ width: 100%;
+}
+.friends-picker {
+ position: relative;
+ overflow: hidden;
+ margin: 0;
+ padding:0;
+ width: 730px;
+ height: auto;
+ background-color: #dedede;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+}
+.friendspicker-savebuttons {
+ background: white;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ margin:0 10px 10px;
+}
+.friends-picker .friends-picker-container { /* long container used to house end-to-end panels. Width is calculated in JS */
+ position: relative;
+ left: 0;
+ top: 0;
+ width: 100%;
+ list-style-type: none;
+}
+.friends-picker .friends-picker-container .panel {
+ float:left;
+ height: 100%;
+ position: relative;
+ width: 730px;
+ margin: 0;
+ padding:0;
+}
+.friends-picker .friends-picker-container .panel .wrapper {
+ margin: 0;
+ padding:4px 10px 10px 10px;
+ min-height: 230px;
+}
+.friends-picker-navigation {
+ margin: 0 0 10px;
+ padding:0 0 10px;
+ border-bottom:1px solid #ccc;
+}
+.friends-picker-navigation ul {
+ list-style: none;
+ padding-left: 0;
+}
+.friends-picker-navigation ul li {
+ float: left;
+ margin:0;
+ background:white;
+}
+.friends-picker-navigation a {
+ font-weight: bold;
+ text-align: center;
+ background: white;
+ color: #999;
+ text-decoration: none;
+ display: block;
+ padding: 0;
+ width:20px;
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.tabHasContent {
+ background: white;
+ color:#333 !important;
+}
+.friends-picker-navigation li a:hover {
+ background: #333;
+ color:white !important;
+}
+.friends-picker-navigation li a.current {
+ background: #4690D6;
+ color:white !important;
+}
+.friends-picker-navigation-l, .friends-picker-navigation-r {
+ position: absolute;
+ top: 46px;
+ text-indent: -9000em;
+}
+.friends-picker-navigation-l a, .friends-picker-navigation-r a {
+ display: block;
+ height: 40px;
+ width: 40px;
+}
+.friends-picker-navigation-l {
+ right: 48px;
+ z-index:1;
+}
+.friends-picker-navigation-r {
+ right: 0;
+ z-index:1;
+}
+.friends-picker-navigation-l {
+ background: url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat left top;
+}
+.friends-picker-navigation-r {
+ background: url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat -60px top;
+}
+.friends-picker-navigation-l:hover {
+ background: url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat left -44px;
+}
+.friends-picker-navigation-r:hover {
+ background: url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat -60px -44px;
+}
+.friendspicker-savebuttons .elgg-button-submit,
+.friendspicker-savebuttons .elgg-button-cancel {
+ margin:5px 20px 5px 5px;
+}
+.friendspicker-members-table {
+ background: #dedede;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ margin:10px 0 0;
+ padding:10px 10px 0;
+}
+
+/* ***************************************
+ AUTOCOMPLETE
+*************************************** */
+<?php //autocomplete will expand to fullscreen without max-width ?>
+.ui-autocomplete {
+ position: absolute;
+ cursor: default;
+}
+.elgg-autocomplete-item .elgg-body {
+ max-width: 600px;
+}
+.ui-autocomplete {
+ background-color: white;
+ border: 1px solid #ccc;
+ overflow: hidden;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.ui-autocomplete .ui-menu-item {
+ padding: 0px 4px;
+
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.ui-autocomplete .ui-menu-item:hover {
+ background-color: #eee;
+}
+.ui-autocomplete a:hover {
+ text-decoration: none;
+ color: #4690D6;
+}
+
+/* ***************************************
+ USER PICKER
+*************************************** */
+.elgg-user-picker-list li:first-child {
+ border-top: 1px dotted #ccc;
+ margin-top: 5px;
+}
+.elgg-user-picker-list > li {
+ border-bottom: 1px dotted #ccc;
+}
+
+/* ***************************************
+ DATE PICKER
+**************************************** */
+.ui-datepicker {
+ display: none;
+
+ margin-top: 3px;
+ width: 208px;
+ background-color: white;
+ border: 1px solid #0054A7;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ overflow: hidden;
+
+ -webkit-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+ box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+}
+.ui-datepicker-inline {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.ui-datepicker-header {
+ position: relative;
+ background: #4690D6;
+ color: white;
+ padding: 2px 0;
+ border-bottom: 1px solid #0054A7;
+}
+.ui-datepicker-header a {
+ color: white;
+}
+.ui-datepicker-prev, .ui-datepicker-next {
+ position: absolute;
+ top: 5px;
+ cursor: pointer;
+}
+.ui-datepicker-prev {
+ left: 6px;
+}
+.ui-datepicker-next {
+ right: 6px;
+}
+.ui-datepicker-title {
+ line-height: 1.8em;
+ margin: 0 30px;
+ text-align: center;
+ font-weight: bold;
+}
+.ui-datepicker-calendar {
+ margin: 4px;
+}
+.ui-datepicker th {
+ color: #0054A7;
+ border: none;
+ font-weight: bold;
+ padding: 5px 6px;
+ text-align: center;
+}
+.ui-datepicker td {
+ padding: 1px;
+}
+.ui-datepicker td span, .ui-datepicker td a {
+ display: block;
+ padding: 2px;
+ line-height: 1.2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker-calendar .ui-state-default {
+ border: 1px solid #ccc;
+ color: #4690D6;;
+ background: #fafafa;
+}
+.ui-datepicker-calendar .ui-state-hover {
+ border: 1px solid #aaa;
+ color: #0054A7;
+ background: #eee;
+}
+.ui-datepicker-calendar .ui-state-active,
+.ui-datepicker-calendar .ui-state-active.ui-state-hover {
+ font-weight: bold;
+ border: 1px solid #0054A7;
+ color: #0054A7;
+ background: #E4ECF5;
+}
diff --git a/mod/basic_theme/views/default/css/elements/grid.php b/mod/basic_theme/views/default/css/elements/grid.php
new file mode 100644
index 000000000..fdbaf4aca
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/grid.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * CSS grid
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ *
+ * To work around subpixel rounding discrepancies, apply .elgg-col-last to
+ * the last column (@todo we need broswer-specific test cases for this).
+ */
+?>
+
+/* ***************************************
+ GRID
+*************************************** */
+.elgg-col {
+ float: left;
+}
+.elgg-col-1of1 {
+ float: none;
+}
+.elgg-col-1of2 {
+ width: 50%;
+}
+.elgg-col-1of3 {
+ width: 33.33%;
+}
+.elgg-col-2of3 {
+ width: 66.66%;
+}
+.elgg-col-1of4 {
+ width: 25%;
+}
+.elgg-col-3of4 {
+ width: 75%;
+}
+.elgg-col-1of5 {
+ width: 20%;
+}
+.elgg-col-2of5 {
+ width: 40%;
+}
+.elgg-col-3of5 {
+ width: 60%;
+}
+.elgg-col-4of5 {
+ width: 80%;
+}
+.elgg-col-1of6 {
+ width: 16.66%;
+}
+.elgg-col-5of6 {
+ width: 83.33%;
+}
diff --git a/mod/basic_theme/views/default/css/elements/helpers.php b/mod/basic_theme/views/default/css/elements/helpers.php
new file mode 100644
index 000000000..e9a9e0a30
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/helpers.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Helpers CSS
+ *
+ * Contains generic elements that can be used throughout the site.
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+.clearfloat {
+ clear: both;
+}
+
+.hidden {
+ display: none;
+}
+
+.centered {
+ margin: 0 auto;
+}
+
+.center {
+ text-align: center;
+}
+
+.float {
+ float: left;
+}
+
+.float-alt {
+ float: right;
+}
+
+.link {
+ cursor: pointer;
+}
+
+.elgg-discover .elgg-discoverable {
+ display: none;
+}
+
+.elgg-discover:hover .elgg-discoverable {
+ display: block;
+}
+
+.elgg-transition:hover {
+ opacity: .7;
+}
+
+/* ***************************************
+ BORDERS AND SEPARATORS
+*************************************** */
+.elgg-border-plain {
+ border: 1px solid #eeeeee;
+}
+.elgg-border-transition {
+ border: 1px solid #eeeeee;
+}
+.elgg-divide-top {
+ border-top: 1px solid #CCCCCC;
+}
+.elgg-divide-bottom {
+ border-bottom: 1px solid #CCCCCC;
+}
+.elgg-divide-left {
+ border-left: 1px solid #CCCCCC;
+}
+.elgg-divide-right {
+ border-right: 1px solid #CCCCCC;
+}
+
+/* ***************************************
+ Spacing (from OOCSS)
+*************************************** */
+<?php
+/**
+ * Spacing classes
+ * Should be used to modify the default spacing between objects (not between nodes of the same object)
+ * Please use judiciously. You want to be using defaults most of the time, these are exceptions!
+ * <type><location><size>
+ * <type>: m = margin, p = padding
+ * <location>: a = all, t = top, r = right, b = bottom, l = left, h = horizontal, v = vertical
+ * <size>: n = none, s = small, m = medium, l = large
+ */
+
+$none = '0';
+$small = '5px';
+$medium = '10px';
+$large = '20px';
+
+echo <<<CSS
+/* Padding */
+.pan{padding:$none}
+.prn, .phn{padding-right:$none}
+.pln, .phn{padding-left:$none}
+.ptn, .pvn{padding-top:$none}
+.pbn, .pvn{padding-bottom:$none}
+
+.pas{padding:$small}
+.prs, .phs{padding-right:$small}
+.pls, .phs{padding-left:$small}
+.pts, .pvs{padding-top:$small}
+.pbs, .pvs{padding-bottom:$small}
+
+.pam{padding:$medium}
+.prm, .phm{padding-right:$medium}
+.plm, .phm{padding-left:$medium}
+.ptm, .pvm{padding-top:$medium}
+.pbm, .pvm{padding-bottom:$medium}
+
+.pal{padding:$large}
+.prl, .phl{padding-right:$large}
+.pll, .phl{padding-left:$large}
+.ptl, .pvl{padding-top:$large}
+.pbl, .pvl{padding-bottom:$large}
+
+/* Margin */
+.man{margin:$none}
+.mrn, .mhn{margin-right:$none}
+.mln, .mhn{margin-left:$none}
+.mtn, .mvn{margin-top:$none}
+.mbn, .mvn{margin-bottom:$none}
+
+.mas{margin:$small}
+.mrs, .mhs{margin-right:$small}
+.mls, .mhs{margin-left:$small}
+.mts, .mvs{margin-top:$small}
+.mbs, .mvs{margin-bottom:$small}
+
+.mam{margin:$medium}
+.mrm, .mhm{margin-right:$medium}
+.mlm, .mhm{margin-left:$medium}
+.mtm, .mvm{margin-top:$medium}
+.mbm, .mvm{margin-bottom:$medium}
+
+.mal{margin:$large}
+.mrl, .mhl{margin-right:$large}
+.mll, .mhl{margin-left:$large}
+.mtl, .mvl{margin-top:$large}
+.mbl, .mvl{margin-bottom:$large}
+CSS;
+?> \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/elements/icons.php b/mod/basic_theme/views/default/css/elements/icons.php
new file mode 100644
index 000000000..f7c789e33
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/icons.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * Elgg icons
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+
+?>
+
+/* ***************************************
+ ICONS
+*************************************** */
+
+.elgg-icon {
+ background: transparent url(<?php echo elgg_get_site_url(); ?>_graphics/elgg_sprites.png) no-repeat left;
+ width: 16px;
+ height: 16px;
+ margin: 0 2px;
+}
+.elgg-icon-arrow-left {
+ background-position: 0 -0px;
+}
+.elgg-icon-arrow-right {
+ background-position: 0 -18px;
+}
+.elgg-icon-arrow-two-head {
+ background-position: 0 -36px;
+}
+.elgg-icon-attention:hover {
+ background-position: 0 -54px;
+}
+.elgg-icon-attention {
+ background-position: 0 -72px;
+}
+.elgg-icon-calendar {
+ background-position: 0 -90px;
+}
+.elgg-icon-cell-phone {
+ background-position: 0 -108px;
+}
+.elgg-icon-checkmark:hover {
+ background-position: 0 -126px;
+}
+.elgg-icon-checkmark {
+ background-position: 0 -144px;
+}
+.elgg-icon-clip:hover {
+ background-position: 0 -162px;
+}
+.elgg-icon-clip {
+ background-position: 0 -180px;
+}
+.elgg-icon-cursor-drag-arrow {
+ background-position: 0 -198px;
+}
+.elgg-icon-delete-alt:hover {
+ background-position: 0 -216px;
+}
+.elgg-icon-delete-alt {
+ background-position: 0 -234px;
+}
+.elgg-icon-delete:hover {
+ background-position: 0 -252px;
+}
+.elgg-icon-delete {
+ background-position: 0 -270px;
+}
+.elgg-icon-download:hover {
+ background-position: 0 -288px;
+}
+.elgg-icon-download {
+ background-position: 0 -306px;
+}
+.elgg-icon-eye {
+ background-position: 0 -324px;
+}
+.elgg-icon-facebook {
+ background-position: 0 -342px;
+}
+.elgg-icon-grid:hover {
+ background-position: 0 -360px;
+}
+.elgg-icon-grid {
+ background-position: 0 -378px;
+}
+.elgg-icon-home:hover {
+ background-position: 0 -396px;
+}
+.elgg-icon-home {
+ background-position: 0 -414px;
+}
+.elgg-icon-hover-menu:hover {
+ background-position: 0 -432px;
+}
+.elgg-icon-hover-menu {
+ background-position: 0 -450px;
+}
+.elgg-icon-info:hover {
+ background-position: 0 -468px;
+}
+.elgg-icon-info {
+ background-position: 0 -486px;
+}
+.elgg-icon-link:hover {
+ background-position: 0 -504px;
+}
+.elgg-icon-link {
+ background-position: 0 -522px;
+}
+.elgg-icon-list {
+ background-position: 0 -540px;
+}
+.elgg-icon-lock-closed {
+ background-position: 0 -558px;
+}
+.elgg-icon-lock-open {
+ background-position: 0 -576px;
+}
+.elgg-icon-mail-alt:hover {
+ background-position: 0 -594px;
+}
+.elgg-icon-mail-alt {
+ background-position: 0 -612px;
+}
+.elgg-icon-mail:hover {
+ background-position: 0 -630px;
+}
+.elgg-icon-mail {
+ background-position: 0 -648px;
+}
+.elgg-icon-photo {
+ background-position: 0 -666px;
+}
+.elgg-icon-print-alt {
+ background-position: 0 -684px;
+}
+.elgg-icon-print {
+ background-position: 0 -702px;
+}
+.elgg-icon-push-pin-alt {
+ background-position: 0 -720px;
+}
+.elgg-icon-push-pin {
+ background-position: 0 -738px;
+}
+.elgg-icon-redo {
+ background-position: 0 -756px;
+}
+.elgg-icon-refresh:hover {
+ background-position: 0 -774px;
+}
+.elgg-icon-refresh {
+ background-position: 0 -792px;
+}
+.elgg-icon-round-arrow-left {
+ background-position: 0 -810px;
+}
+.elgg-icon-round-arrow-right {
+ background-position: 0 -828px;
+}
+.elgg-icon-round-checkmark {
+ background-position: 0 -846px;
+}
+.elgg-icon-round-minus {
+ background-position: 0 -864px;
+}
+.elgg-icon-round-plus {
+ background-position: 0 -882px;
+}
+.elgg-icon-rss {
+ background-position: 0 -900px;
+}
+.elgg-icon-search-focus {
+ background-position: 0 -918px;
+}
+.elgg-icon-search {
+ background-position: 0 -936px;
+}
+.elgg-icon-settings-alt:hover {
+ background-position: 0 -954px;
+}
+.elgg-icon-settings-alt {
+ background-position: 0 -972px;
+}
+.elgg-icon-settings {
+ background-position: 0 -990px;
+}
+.elgg-icon-share:hover {
+ background-position: 0 -1008px;
+}
+.elgg-icon-share {
+ background-position: 0 -1026px;
+}
+.elgg-icon-shop-cart:hover {
+ background-position: 0 -1044px;
+}
+.elgg-icon-shop-cart {
+ background-position: 0 -1062px;
+}
+.elgg-icon-speech-bubble-alt:hover {
+ background-position: 0 -1080px;
+}
+.elgg-icon-speech-bubble-alt {
+ background-position: 0 -1098px;
+}
+.elgg-icon-speech-bubble:hover {
+ background-position: 0 -1116px;
+}
+.elgg-icon-speech-bubble {
+ background-position: 0 -1134px;
+}
+.elgg-icon-star-alt {
+ background-position: 0 -1152px;
+}
+.elgg-icon-star-empty:hover {
+ background-position: 0 -1170px;
+}
+.elgg-icon-star-empty {
+ background-position: 0 -1188px;
+}
+.elgg-icon-star:hover {
+ background-position: 0 -1206px;
+}
+.elgg-icon-star {
+ background-position: 0 -1224px;
+}
+.elgg-icon-tag:hover {
+ background-position: 0 -1242px;
+}
+.elgg-icon-tag {
+ background-position: 0 -1260px;
+}
+.elgg-icon-thumbs-down-alt:hover {
+ background-position: 0 -1278px;
+}
+.elgg-icon-thumbs-down:hover,
+.elgg-icon-thumbs-down-alt {
+ background-position: 0 -1296px;
+}
+.elgg-icon-thumbs-down {
+ background-position: 0 -1314px;
+}
+.elgg-icon-thumbs-up-alt:hover {
+ background-position: 0 -1332px;
+}
+.elgg-icon-thumbs-up:hover,
+.elgg-icon-thumbs-up-alt {
+ background-position: 0 -1350px;
+}
+.elgg-icon-thumbs-up {
+ background-position: 0 -1368px;
+}
+.elgg-icon-trash {
+ background-position: 0 -1386px;
+}
+.elgg-icon-twitter {
+ background-position: 0 -1404px;
+}
+.elgg-icon-undo {
+ background-position: 0 -1422px;
+}
+.elgg-icon-user:hover {
+ background-position: 0 -1440px;
+}
+.elgg-icon-user {
+ background-position: 0 -1458px;
+}
+.elgg-icon-users:hover {
+ background-position: 0 -1476px;
+}
+.elgg-icon-users {
+ background-position: 0 -1494px;
+}
+.elgg-icon-video {
+ background-position: 0 -1512px;
+}
+
+
+.elgg-avatar > .elgg-icon-hover-menu {
+ display: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ margin: 0;
+ cursor: pointer;
+}
+
+.elgg-ajax-loader {
+ background: white url(<?php echo elgg_get_site_url(); ?>_graphics/ajax_loader_bw.gif) no-repeat center center;
+ min-height: 33px;
+ min-width: 33px;
+}
+
+/* ***************************************
+ AVATAR ICONS
+*************************************** */
+.elgg-avatar {
+ position: relative;
+ display: inline-block;
+}
+.elgg-avatar > a > img {
+ display: block;
+}
+.elgg-avatar-tiny > a > img {
+ width: 25px;
+ height: 25px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 25px;
+ -khtml-background-size: 25px;
+ -moz-background-size: 25px;
+ -o-background-size: 25px;
+ background-size: 25px;
+}
+.elgg-avatar-small > a > img {
+ width: 40px;
+ height: 40px;
+
+ /* remove the border-radius if you don't want rounded avatars in supported browsers */
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+
+ -moz-background-clip: border;
+ background-clip: border;
+
+ -webkit-background-size: 40px;
+ -khtml-background-size: 40px;
+ -moz-background-size: 40px;
+ -o-background-size: 40px;
+ background-size: 40px;
+}
+.elgg-avatar-medium > a > img {
+ width: 100px;
+ height: 100px;
+}
+.elgg-avatar-large > a > img {
+ width: 200px;
+ height: 200px;
+}
diff --git a/mod/basic_theme/views/default/css/elements/layout.php b/mod/basic_theme/views/default/css/elements/layout.php
new file mode 100644
index 000000000..25a2bffb7
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/layout.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Page Layout
+ *
+ * Contains CSS for the page shell and page layout
+ *
+ * Default layout: 990px wide, centered. Used in default page shell
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ PAGE LAYOUT
+*************************************** */
+/***** DEFAULT LAYOUT ******/
+<?php // the width is on the page rather than topbar to handle small viewports ?>
+.elgg-page-default {
+ min-width: 998px;
+}
+.elgg-page-default .elgg-page-header > .elgg-inner {
+ width: 990px;
+ margin: 0 auto;
+ height: 90px;
+}
+.elgg-page-default .elgg-page-body > .elgg-inner {
+ width: 990px;
+ margin: 0 auto;
+}
+.elgg-page-default .elgg-page-footer > .elgg-inner {
+ width: 990px;
+ margin: 0 auto;
+ padding: 5px 0;
+ border-top: 1px solid #DEDEDE;
+}
+
+/***** TOPBAR ******/
+.elgg-page-topbar {
+ background: #333333 url(<?php echo elgg_get_site_url(); ?>_graphics/toptoolbar_background.gif) repeat-x top left;
+ border-bottom: 1px solid #000000;
+ position: relative;
+ height: 24px;
+ z-index: 9000;
+}
+.elgg-page-topbar > .elgg-inner {
+ padding: 0 10px;
+}
+
+/***** PAGE MESSAGES ******/
+.elgg-system-messages {
+ position: fixed;
+ top: 24px;
+ right: 20px;
+ max-width: 500px;
+ z-index: 2000;
+}
+.elgg-system-messages li {
+ margin-top: 10px;
+}
+.elgg-system-messages li p {
+ margin: 0;
+}
+
+/***** PAGE HEADER ******/
+.elgg-page-header {
+ position: relative;
+ background: #4690D6 url(<?php echo elgg_get_site_url(); ?>_graphics/header_shadow.png) repeat-x bottom left;
+}
+.elgg-page-header > .elgg-inner {
+ position: relative;
+}
+
+/***** PAGE BODY LAYOUT ******/
+.elgg-layout {
+ min-height: 360px;
+}
+.elgg-layout-one-sidebar {
+ background: transparent url(<?php echo elgg_get_site_url(); ?>_graphics/sidebar_background.gif) repeat-y right top;
+}
+.elgg-layout-two-sidebar {
+ background: transparent url(<?php echo elgg_get_site_url(); ?>_graphics/two_sidebar_background.gif) repeat-y right top;
+}
+.elgg-layout-error {
+ margin-top: 20px;
+}
+.elgg-sidebar {
+ position: relative;
+ padding: 20px 10px;
+ float: right;
+ width: 210px;
+ margin: 0 0 0 10px;
+}
+.elgg-sidebar-alt {
+ position: relative;
+ padding: 20px 10px;
+ float: left;
+ width: 160px;
+ margin: 0 10px 0 0;
+}
+.elgg-main {
+ position: relative;
+ min-height: 360px;
+ padding: 10px;
+}
+.elgg-main > .elgg-head {
+ padding-bottom: 3px;
+ border-bottom: 1px solid #CCCCCC;
+ margin-bottom: 10px;
+}
+
+/***** PAGE FOOTER ******/
+.elgg-page-footer {
+ position: relative;
+}
+.elgg-page-footer {
+ color: #999;
+}
+.elgg-page-footer a:hover {
+ color: #666;
+} \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/elements/misc.php b/mod/basic_theme/views/default/css/elements/misc.php
new file mode 100644
index 000000000..d9622d34a
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/misc.php
@@ -0,0 +1,62 @@
+/* ***************************************
+ MISC
+*************************************** */
+#login-dropdown {
+ position: absolute;
+ top:10px;
+ right:0;
+ z-index: 100;
+}
+
+/* ***************************************
+ AVATAR UPLOADING & CROPPING
+*************************************** */
+
+#current-user-avatar {
+ border-right:1px solid #ccc;
+}
+#avatar-croppingtool {
+ border-top: 1px solid #ccc;
+}
+#user-avatar-cropper {
+ float: left;
+}
+#user-avatar-preview {
+ float: left;
+ position: relative;
+ overflow: hidden;
+ width: 100px;
+ height: 100px;
+}
+
+/* ***************************************
+ FRIENDS COLLECTIONS
+*************************************** */
+
+#friends_collections_accordian li {
+ color: #666;
+}
+#friends_collections_accordian li h2 {
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ background: none repeat scroll 0 0 #4690D6;
+ color: white;
+ cursor: pointer;
+ font-size: 1.2em;
+ margin: 10px 0;
+ padding: 4px 2px 4px 6px;
+}
+#friends_collections_accordian li h2:hover {
+ background-color: #333;
+}
+#friends_collections_accordian .friends_collections_controls {
+ float: right;
+ font-size: 70%;
+}
+#friends_collections_accordian .friends-picker-main-wrapper {
+ background: none repeat scroll 0 0 white;
+ display: none;
+ padding: 0;
+}
diff --git a/mod/basic_theme/views/default/css/elements/modules.php b/mod/basic_theme/views/default/css/elements/modules.php
new file mode 100644
index 000000000..74092c774
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/modules.php
@@ -0,0 +1,194 @@
+/* ***************************************
+ Modules
+*************************************** */
+.elgg-module {
+ overflow: hidden;
+ margin-bottom: 20px;
+}
+
+/* Aside */
+.elgg-module-aside .elgg-head {
+ border-bottom: 1px solid #CCC;
+
+ margin-bottom: 5px;
+ padding-bottom: 5px;
+}
+
+/* Info */
+.elgg-module-info > .elgg-head {
+ background: #e4e4e4;
+ padding: 5px;
+ margin-bottom: 10px;
+
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.elgg-module-info > .elgg-head * {
+ color: #333;
+}
+
+/* Popup */
+.elgg-module-popup {
+ background-color: white;
+ border: 1px solid #ccc;
+
+ z-index: 9999;
+ margin-bottom: 0;
+ padding: 5px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+
+ -webkit-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+ box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5);
+}
+.elgg-module-popup > .elgg-head {
+ margin-bottom: 5px;
+}
+.elgg-module-popup > .elgg-head * {
+ color: #0054A7;
+}
+
+/* Dropdown */
+.elgg-module-dropdown {
+ background-color:white;
+ border:5px solid #CCC;
+
+ -webkit-border-radius: 5px 0 5px 5px;
+ -moz-border-radius: 5px 0 5px 5px;
+ border-radius: 5px 0 5px 5px;
+
+ display:none;
+
+ width: 210px;
+ padding: 12px;
+ margin-right: 0px;
+ z-index:100;
+
+ -webkit-box-shadow: 0 3px 3px rgba(0, 0, 0, 0.45);
+ -moz-box-shadow: 0 3px 3px rgba(0, 0, 0, 0.45);
+ box-shadow: 0 3px 3px rgba(0, 0, 0, 0.45);
+
+ position:absolute;
+ right: 0px;
+ top: 100%;
+}
+
+/* Featured */
+.elgg-module-featured {
+ border: 1px solid #4690D6;
+
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+.elgg-module-featured > .elgg-head {
+ padding: 5px;
+ background-color: #4690D6;
+}
+.elgg-module-featured > .elgg-head * {
+ color: white;
+}
+.elgg-module-featured > .elgg-body {
+ padding: 10px;
+}
+
+/* ***************************************
+ Widgets
+*************************************** */
+.elgg-widgets {
+ float: right;
+ min-height: 30px;
+}
+.elgg-widget-add-control {
+ text-align: right;
+ margin: 5px 5px 15px;
+}
+.elgg-widgets-add-panel {
+ padding: 10px;
+ margin: 0 5px 15px;
+ background: #dedede;
+ border: 2px solid #ccc;
+}
+<?php //@todo location-dependent style: make an extension of elgg-gallery ?>
+.elgg-widgets-add-panel li {
+ float: left;
+ margin: 2px 10px;
+ width: 200px;
+ padding: 4px;
+ background-color: #ccc;
+ border: 2px solid #b0b0b0;
+ font-weight: bold;
+}
+.elgg-widgets-add-panel li a {
+ display: block;
+}
+.elgg-widgets-add-panel .elgg-state-available {
+ color: #333;
+ cursor: pointer;
+}
+.elgg-widgets-add-panel .elgg-state-available:hover {
+ background-color: #bcbcbc;
+}
+.elgg-widgets-add-panel .elgg-state-unavailable {
+ color: #888;
+}
+
+.elgg-module-widget {
+ background-color: #dedede;
+ padding: 2px;
+ margin: 0 5px 15px;
+ position: relative;
+}
+.elgg-module-widget:hover {
+ background-color: #ccc;
+}
+.elgg-module-widget > .elgg-head {
+ background-color: #eeeeee;
+ height: 26px;
+ overflow: hidden;
+}
+.elgg-module-widget > .elgg-head h3 {
+ float: left;
+ padding: 4px 45px 0 20px;
+ color: #666;
+}
+.elgg-module-widget.elgg-state-draggable .elgg-widget-handle {
+ cursor: move;
+}
+a.elgg-widget-collapse-button {
+ color: #c5c5c5;
+}
+a.elgg-widget-collapse-button:hover,
+a.elgg-widget-collapsed:hover {
+ color: #9d9d9d;
+ text-decoration: none;
+}
+a.elgg-widget-collapse-button:before {
+ content: "\25BC";
+}
+a.elgg-widget-collapsed:before {
+ content: "\25BA";
+}
+.elgg-module-widget > .elgg-body {
+ background-color: white;
+ width: 100%;
+ overflow: hidden;
+ border-top: 2px solid #dedede;
+}
+.elgg-widget-edit {
+ display: none;
+ width: 96%;
+ padding: 2%;
+ border-bottom: 2px solid #dedede;
+ background-color: #f9f9f9;
+}
+.elgg-widget-content {
+ padding: 10px;
+}
+.elgg-widget-placeholder {
+ border: 2px dashed #dedede;
+ margin-bottom: 15px;
+} \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/elements/navigation.php b/mod/basic_theme/views/default/css/elements/navigation.php
new file mode 100644
index 000000000..62f370069
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/navigation.php
@@ -0,0 +1,559 @@
+<?php
+/**
+ * Navigation
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ PAGINATION
+*************************************** */
+.elgg-pagination {
+ margin: 10px 0;
+ display: block;
+ text-align: center;
+}
+.elgg-pagination li {
+ display: inline;
+ margin: 0 6px 0 0;
+ text-align: center;
+}
+.elgg-pagination a, .elgg-pagination span {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+
+ padding: 2px 6px;
+ color: #4690d6;
+ border: 1px solid #4690d6;
+ font-size: 12px;
+}
+.elgg-pagination a:hover {
+ background: #4690d6;
+ color: white;
+ text-decoration: none;
+}
+.elgg-pagination .elgg-state-disabled span {
+ color: #CCCCCC;
+ border-color: #CCCCCC;
+}
+.elgg-pagination .elgg-state-selected span {
+ color: #555555;
+ border-color: #555555;
+}
+
+/* ***************************************
+ TABS
+*************************************** */
+.elgg-tabs {
+ margin-bottom: 5px;
+ border-bottom: 2px solid #cccccc;
+ display: table;
+ width: 100%;
+}
+.elgg-tabs li {
+ float: left;
+ border: 2px solid #ccc;
+ border-bottom: 0;
+ background: #eee;
+ margin: 0 0 0 10px;
+
+ -webkit-border-radius: 5px 5px 0 0;
+ -moz-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+.elgg-tabs a {
+ text-decoration: none;
+ display: block;
+ padding: 3px 10px 0 10px;
+ text-align: center;
+ height: 21px;
+ color: #999;
+}
+.elgg-tabs a:hover {
+ background: #dedede;
+ color: #4690D6;
+}
+.elgg-tabs .elgg-state-selected {
+ border-color: #ccc;
+ background: white;
+}
+.elgg-tabs .elgg-state-selected a {
+ position: relative;
+ top: 2px;
+ background: white;
+}
+
+/* ***************************************
+ BREADCRUMBS
+*************************************** */
+.elgg-breadcrumbs {
+ font-size: 80%;
+ font-weight: bold;
+ line-height: 1.2em;
+ color: #bababa;
+}
+.elgg-breadcrumbs > li {
+ display: inline-block;
+}
+.elgg-breadcrumbs > li:after {
+ content: "\003E";
+ padding: 0 4px;
+ font-weight: normal;
+}
+.elgg-breadcrumbs > li > a {
+ display: inline-block;
+ color: #999;
+}
+.elgg-breadcrumbs > li > a:hover {
+ color: #0054a7;
+ text-decoration: underline;
+}
+
+.elgg-main .elgg-breadcrumbs {
+ position: relative;
+ top: -6px;
+ left: 0;
+}
+
+/* ***************************************
+ TOPBAR MENU
+*************************************** */
+.elgg-menu-topbar {
+ float: left;
+}
+
+.elgg-menu-topbar > li {
+ float: left;
+}
+
+.elgg-menu-topbar > li > a {
+ padding-top: 2px;
+ color: #eee;
+ margin: 1px 15px 0;
+}
+
+.elgg-menu-topbar > li > a:hover {
+ color: #4690D6;
+ text-decoration: none;
+}
+
+.elgg-menu-topbar-alt {
+ float: right;
+}
+
+.elgg-menu-topbar .elgg-icon {
+ vertical-align: middle;
+ margin-top: -1px;
+}
+
+.elgg-menu-topbar > li > a.elgg-topbar-logo {
+ margin-top: 0;
+ padding-left: 5px;
+ width: 38px;
+ height: 20px;
+}
+
+.elgg-menu-topbar > li > a.elgg-topbar-avatar {
+ width: 18px;
+ height: 18px;
+}
+
+/* ***************************************
+ SITE MENU
+*************************************** */
+.elgg-menu-site {
+ z-index: 1;
+}
+
+.elgg-menu-site > li > a {
+ font-weight: bold;
+ padding: 3px 13px 0px 13px;
+ height: 20px;
+}
+
+.elgg-menu-site > li > a:hover {
+ text-decoration: none;
+}
+
+.elgg-menu-site-default {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 23px;
+}
+
+.elgg-menu-site-default > li {
+ float: left;
+ margin-right: 1px;
+}
+
+.elgg-menu-site-default > li > a {
+ color: white;
+}
+
+.elgg-menu-site > li > ul {
+ display: none;
+ background-color: white;
+}
+
+.elgg-menu-site > li:hover > ul {
+ display: block;
+}
+
+.elgg-menu-site-default > .elgg-state-selected > a,
+.elgg-menu-site-default > li:hover > a {
+ background: white;
+ color: #555;
+
+ -webkit-box-shadow: 2px -1px 1px rgba(0, 0, 0, 0.25);
+ -moz-box-shadow: 2px -1px 1px rgba(0, 0, 0, 0.25);
+ box-shadow: 2px -1px 1px rgba(0, 0, 0, 0.25);
+
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+
+.elgg-menu-site-more {
+ position: relative;
+ left: -1px;
+ width: 100%;
+ min-width: 150px;
+ border: 1px solid #999;
+ border-top: 0;
+
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+
+ -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.25);
+ -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.25);
+ box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.25);
+}
+
+.elgg-menu-site-more > li > a {
+ background-color: white;
+ color: #555;
+
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.elgg-menu-site-more > li > a:hover {
+ background: #4690D6;
+ color: white;
+}
+
+.elgg-menu-site-more > li:last-child > a,
+.elgg-menu-site-more > li:last-child > a:hover {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+.elgg-more > a:before {
+ content: "\25BC";
+ font-size: smaller;
+ margin-right: 4px;
+}
+
+/* ***************************************
+ TITLE
+*************************************** */
+.elgg-menu-title {
+ float: right;
+}
+
+.elgg-menu-title > li {
+ display: inline-block;
+ margin-left: 4px;
+}
+
+/* ***************************************
+ FILTER MENU
+*************************************** */
+.elgg-menu-filter {
+ margin-bottom: 5px;
+ border-bottom: 2px solid #ccc;
+ display: table;
+ width: 100%;
+}
+.elgg-menu-filter > li {
+ float: left;
+ border: 2px solid #ccc;
+ border-bottom: 0;
+ background: #eee;
+ margin: 0 0 0 10px;
+
+ -webkit-border-radius: 5px 5px 0 0;
+ -moz-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+.elgg-menu-filter > li:hover {
+ background: #dedede;
+}
+.elgg-menu-filter > li > a {
+ text-decoration: none;
+ display: block;
+ padding: 3px 10px 0;
+ text-align: center;
+ height: 21px;
+ color: #999;
+}
+.elgg-menu-filter > li > a:hover {
+ background: #dedede;
+ color: #4690D6;
+}
+.elgg-menu-filter > .elgg-state-selected {
+ border-color: #ccc;
+ background: white;
+}
+.elgg-menu-filter > .elgg-state-selected > a {
+ position: relative;
+ top: 2px;
+ background: white;
+}
+
+/* ***************************************
+ PAGE MENU
+*************************************** */
+.elgg-menu-page {
+ margin-bottom: 15px;
+}
+
+.elgg-menu-page a {
+ display: block;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ background-color: white;
+ margin: 0 0 3px;
+ padding: 2px 4px 2px 8px;
+}
+.elgg-menu-page a:hover {
+ background-color: #0054A7;
+ color: white;
+ text-decoration: none;
+}
+.elgg-menu-page li.elgg-state-selected > a {
+ background-color: #4690D6;
+ color: white;
+}
+.elgg-menu-page .elgg-child-menu {
+ display: none;
+ margin-left: 15px;
+}
+.elgg-menu-page .elgg-menu-closed:before, .elgg-menu-opened:before {
+ display: inline-block;
+ padding-right: 4px;
+}
+.elgg-menu-page .elgg-menu-closed:before {
+ content: "\002B";
+}
+.elgg-menu-page .elgg-menu-opened:before {
+ content: "\002D";
+}
+
+/* ***************************************
+ HOVER MENU
+*************************************** */
+.elgg-menu-hover {
+ display: none;
+ position: absolute;
+ z-index: 10000;
+
+ overflow: hidden;
+
+ min-width: 165px;
+ max-width: 250px;
+ border: solid 1px;
+ border-color: #E5E5E5 #999 #999 #E5E5E5;
+ background-color: #FFF;
+
+ -webkit-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+ -moz-box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.50);
+}
+.elgg-menu-hover > li {
+ border-bottom: 1px solid #ddd;
+}
+.elgg-menu-hover > li:last-child {
+ border-bottom: none;
+}
+.elgg-menu-hover .elgg-heading-basic {
+ display: block;
+}
+.elgg-menu-hover a {
+ padding: 2px 8px;
+ font-size: 92%;
+}
+.elgg-menu-hover a:hover {
+ background: #ccc;
+ text-decoration: none;
+}
+.elgg-menu-hover-admin a {
+ color: red;
+}
+.elgg-menu-hover-admin a:hover {
+ color: white;
+ background-color: red;
+}
+
+/* ***************************************
+ SITE FOOTER
+*************************************** */
+.elgg-menu-footer > li,
+.elgg-menu-footer > li > a {
+ display: inline-block;
+ color: #999;
+}
+
+.elgg-menu-footer > li:after {
+ content: "\007C";
+ padding: 0 4px;
+}
+
+.elgg-menu-footer-default {
+ float: right;
+}
+
+.elgg-menu-footer-alt {
+ float: left;
+}
+
+/* ***************************************
+ GENERAL MENU
+*************************************** */
+.elgg-menu-general > li,
+.elgg-menu-general > li > a {
+ display: inline-block;
+ color: #999;
+}
+
+.elgg-menu-general > li:after {
+ content: "\007C";
+ padding: 0 4px;
+}
+
+/* ***************************************
+ ENTITY AND ANNOTATION
+*************************************** */
+<?php // height depends on line height/font size ?>
+.elgg-menu-entity, elgg-menu-annotation {
+ float: right;
+ margin-left: 15px;
+ font-size: 90%;
+ color: #aaa;
+ line-height: 16px;
+ height: 16px;
+}
+.elgg-menu-entity > li, .elgg-menu-annotation > li {
+ margin-left: 15px;
+}
+.elgg-menu-entity > li > a, .elgg-menu-annotation > li > a {
+ color: #aaa;
+}
+<?php // need to override .elgg-menu-hz ?>
+.elgg-menu-entity > li > a, .elgg-menu-annotation > li > a {
+ display: block;
+}
+.elgg-menu-entity > li > span, .elgg-menu-annotation > li > span {
+ vertical-align: baseline;
+}
+
+/* ***************************************
+ OWNER BLOCK
+*************************************** */
+.elgg-menu-owner-block li a {
+ display: block;
+
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+
+ background-color: white;
+ margin: 3px 0 5px 0;
+ padding: 2px 4px 2px 8px;
+}
+.elgg-menu-owner-block li a:hover {
+ background-color: #0054A7;
+ color: white;
+ text-decoration: none;
+}
+.elgg-menu-owner-block li.elgg-state-selected > a {
+ background-color: #4690D6;
+ color: white;
+}
+
+/* ***************************************
+ LONGTEXT
+*************************************** */
+.elgg-menu-longtext {
+ float: right;
+}
+
+/* ***************************************
+ RIVER
+*************************************** */
+.elgg-menu-river {
+ float: right;
+ margin-left: 15px;
+ font-size: 90%;
+ color: #aaa;
+ line-height: 16px;
+ height: 16px;
+}
+.elgg-menu-river > li {
+ display: inline-block;
+ margin-left: 5px;
+}
+.elgg-menu-river > li > a {
+ color: #aaa;
+ height: 16px;
+}
+<?php // need to override .elgg-menu-hz ?>
+.elgg-menu-river > li > a {
+ display: block;
+}
+.elgg-menu-river > li > span {
+ vertical-align: baseline;
+}
+
+/* ***************************************
+ SIDEBAR EXTRAS (rss, bookmark, etc)
+*************************************** */
+.elgg-menu-extras {
+ margin-bottom: 15px;
+}
+
+/* ***************************************
+ WIDGET MENU
+*************************************** */
+.elgg-menu-widget > li {
+ position: absolute;
+ top: 4px;
+ display: inline-block;
+ width: 18px;
+ height: 18px;
+ padding: 2px 2px 0 0;
+}
+
+.elgg-menu-widget > .elgg-menu-item-collapse {
+ left: 5px;
+}
+.elgg-menu-widget > .elgg-menu-item-delete {
+ right: 5px;
+}
+.elgg-menu-widget > .elgg-menu-item-settings {
+ right: 25px;
+}
diff --git a/mod/basic_theme/views/default/css/elements/reset.php b/mod/basic_theme/views/default/css/elements/reset.php
new file mode 100644
index 000000000..44bf2fac9
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/reset.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * CSS reset
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ RESET CSS
+*************************************** */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 100%;
+ font-family: inherit;
+ vertical-align: baseline;
+}
+body {
+ background-color: white;
+}
+<?php // force vertical scroll bar ?>
+html, body {
+ height: 100%;
+ margin-bottom: 1px;
+}
+img {
+ border-width:0;
+ border-color:transparent;
+}
+:focus {
+ outline: 0 none;
+}
+ol, ul {
+ list-style: none;
+}
+em, i {
+ font-style:italic;
+}
+ins {
+ text-decoration:none;
+}
+del {
+ text-decoration:line-through;
+}
+strong, b {
+ font-weight:bold;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+caption, th, td {
+ text-align: left;
+ font-weight: normal;
+ vertical-align: top;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: "";
+}
+blockquote, q {
+ quotes: "" "";
+}
+a {
+ text-decoration: none;
+}
diff --git a/mod/basic_theme/views/default/css/elements/typography.php b/mod/basic_theme/views/default/css/elements/typography.php
new file mode 100644
index 000000000..d93b28d2c
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elements/typography.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * CSS typography
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+
+/* ***************************************
+ Typography
+*************************************** */
+body {
+ font-size: 80%;
+ line-height: 1.4em;
+ font-family: "Lucida Grande", Arial, Tahoma, Verdana, sans-serif;
+}
+
+a {
+ color: #4690D6;
+}
+
+a:hover,
+a.selected { <?php //@todo remove .selected ?>
+ color: #555555;
+ text-decoration: underline;
+}
+
+p {
+ margin-bottom: 15px;
+}
+
+p:last-child {
+ margin-bottom: 0;
+}
+
+pre, code {
+ font-family: Monaco, "Courier New", Courier, monospace;
+ font-size: 12px;
+
+ background:#EBF5FF;
+ color:#000000;
+ overflow:auto;
+
+ overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
+
+ white-space: pre-wrap;
+ word-wrap: break-word; /* IE 5.5-7 */
+
+}
+
+pre {
+ padding:3px 15px;
+ margin:0px 0 15px 0;
+ line-height:1.3em;
+}
+
+code {
+ padding:2px 3px;
+}
+
+.elgg-monospace {
+ font-family: Monaco, "Courier New", Courier, monospace;
+}
+
+blockquote {
+ line-height: 1.3em;
+ padding:3px 15px;
+ margin:0px 0 15px 0;
+ background:#EBF5FF;
+ border:none;
+
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+ color: #0054A7;
+}
+
+h1 { font-size: 1.8em; }
+h2 { font-size: 1.5em; line-height: 1.1em; padding-bottom:5px}
+h3 { font-size: 1.2em; }
+h4 { font-size: 1.0em; }
+h5 { font-size: 0.9em; }
+h6 { font-size: 0.8em; }
+
+.elgg-heading-site, .elgg-heading-site:hover {
+ font-size: 2em;
+ line-height: 1.4em;
+ color: white;
+ font-style: italic;
+ font-family: Georgia, times, serif;
+ text-shadow: 1px 2px 4px #333333;
+ text-decoration: none;
+}
+
+.elgg-heading-main {
+ float: left;
+ max-width: 530px;
+ margin-right: 10px;
+}
+.elgg-heading-basic {
+ color: #0054A7;
+ font-size: 1.2em;
+ font-weight: bold;
+}
+
+.elgg-subtext {
+ color: #666666;
+ font-size: 85%;
+ line-height: 1.2em;
+ font-style: italic;
+}
+
+.elgg-text-help {
+ display: block;
+ font-size: 85%;
+ font-style: italic;
+}
+
+.elgg-quiet {
+ color: #666;
+}
+
+.elgg-loud {
+ color: #0054A7;
+}
+
+/* ***************************************
+ USER INPUT DISPLAY RESET
+*************************************** */
+.elgg-output {
+ margin-top: 10px;
+}
+
+.elgg-output dt { font-weight: bold }
+.elgg-output dd { margin: 0 0 1em 1em }
+
+.elgg-output ul, .elgg-output ol {
+ margin: 0 1.5em 1.5em 0;
+ padding-left: 1.5em;
+}
+.elgg-output ul {
+ list-style-type: disc;
+}
+.elgg-output ol {
+ list-style-type: decimal;
+}
+.elgg-output table {
+ border: 1px solid #ccc;
+}
+.elgg-output table td {
+ border: 1px solid #ccc;
+ padding: 3px 5px;
+}
+.elgg-output img {
+ max-width: 100%;
+} \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/elgg.php b/mod/basic_theme/views/default/css/elgg.php
new file mode 100644
index 000000000..4960e6ade
--- /dev/null
+++ b/mod/basic_theme/views/default/css/elgg.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Elgg primary CSS view
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+
+/*
+ * Colors:
+ * #4690D6 - elgg light blue
+ * #0054A7 - elgg dark blue
+ * #e4ecf5 - elgg very light blue
+ */
+
+// check if there is a theme overriding the old css view and use it, if it exists
+$old_css_view = elgg_get_view_location('css');
+if ($old_css_view != elgg_get_config('viewpath')) {
+ echo elgg_view('css', $vars);
+ return true;
+}
+
+
+/*******************************************************************************
+
+Base CSS
+ * CSS reset
+ * core
+ * helpers (moved to end to have a higher priority)
+ * grid
+
+*******************************************************************************/
+echo elgg_view('css/elements/reset', $vars);
+echo elgg_view('css/elements/core', $vars);
+echo elgg_view('css/elements/grid', $vars);
+
+
+/*******************************************************************************
+
+Skin CSS
+ * typography - fonts, line spacing
+ * forms - forms, inputs
+ * buttons - action, cancel, delete, submit, dropdown, special
+ * navigation - menus, breadcrumbs, pagination
+ * icons - icons, sprites, graphics
+ * modules - modules, widgets
+ * layout_objects - lists, content blocks, notifications, avatars
+ * layout - page layout
+ * misc - to be removed/redone
+
+*******************************************************************************/
+echo elgg_view('css/elements/typography', $vars);
+echo elgg_view('css/elements/forms', $vars);
+echo elgg_view('css/elements/buttons', $vars);
+echo elgg_view('css/elements/icons', $vars);
+echo elgg_view('css/elements/navigation', $vars);
+echo elgg_view('css/elements/modules', $vars);
+echo elgg_view('css/elements/components', $vars);
+echo elgg_view('css/elements/layout', $vars);
+echo elgg_view('css/elements/misc', $vars);
+
+
+// included last to have higher priority
+echo elgg_view('css/elements/helpers', $vars);
+
+
+// in case plugins are still extending the old 'css' view, display it
+echo elgg_view('css', $vars);
diff --git a/mod/basic_theme/views/default/css/ie.php b/mod/basic_theme/views/default/css/ie.php
new file mode 100644
index 000000000..4bddd4d55
--- /dev/null
+++ b/mod/basic_theme/views/default/css/ie.php
@@ -0,0 +1,8 @@
+/**
+ * CSS for IE8 and above
+ */
+
+/* ie8 does not like shrink wrapping this div with inline-block */
+.elgg-avatar {
+ display: block;
+}
diff --git a/mod/basic_theme/views/default/css/ie6.php b/mod/basic_theme/views/default/css/ie6.php
new file mode 100644
index 000000000..cf49d33f2
--- /dev/null
+++ b/mod/basic_theme/views/default/css/ie6.php
@@ -0,0 +1,12 @@
+/**
+ * CSS for IE6
+ */
+
+* {zoom: 1;} /* trigger hasLayout in IE */
+
+/* main nav drop-down */
+#elgg-header {z-index:1;}
+
+/* @todo check this one */
+.elgg-button-delete a { background-position-y: 2px; }
+.elgg-button-delete a:hover { background-position-y: -14px; } \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/ie7.php b/mod/basic_theme/views/default/css/ie7.php
new file mode 100644
index 000000000..db0125b4b
--- /dev/null
+++ b/mod/basic_theme/views/default/css/ie7.php
@@ -0,0 +1,65 @@
+/**
+ * CSS for IE7
+ */
+
+/* trigger hasLayout in IE */
+* {
+ zoom: 1;
+}
+
+/* site menu drop-down z-index fix for IE7 */
+.elgg-page-header {
+ z-index: 1;
+}
+
+/* inline-block fixes */
+.elgg-gallery > li,
+.elgg-button,
+.elgg-icon,
+.elgg-menu-hz > li,
+.elgg-menu-hz > li:after,
+.elgg-menu-hz > li > a,
+.elgg-menu-hz > li > span,
+.elgg-breadcrumbs > li,
+.elgg-menu-footer > li > a,
+.elgg-menu-footer li,
+.elgg-menu-general > li > a,
+.elgg-menu-general li {
+ display: inline;
+}
+
+/* IE7 does not support :after */
+.elgg-breadcrumbs > li > a {
+ display: inline;
+ padding-right: 4px;
+ margin-right: 4px;
+ border-right: 1px solid #bababa;
+}
+.elgg-menu-footer li,
+.elgg-menu-user li,
+.elgg-menu-general li {
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+/* longtext menu would not display horizontally without this */
+.elgg-menu-longtext {
+ width: 100%;
+}
+.elgg-menu-longtext li {
+ width: 100px;
+ float: right;
+}
+
+.elgg-avatar {
+ display: inline;
+}
+
+.elgg-body-walledgarden .elgg-col-1of2 {
+ width: 255px;
+}
+
+.elgg-module-walledgarden > .elgg-head,
+.elgg-module-walledgarden > .elgg-foot {
+ width: 530px;
+} \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/lightbox.php b/mod/basic_theme/views/default/css/lightbox.php
new file mode 100644
index 000000000..7d5917cc3
--- /dev/null
+++ b/mod/basic_theme/views/default/css/lightbox.php
@@ -0,0 +1,371 @@
+<?php
+/**
+ * Fancybox lightbox CSS.
+ *
+ * Used as a view because we need to pass a full URL to AlphaImageLoader.
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+
+$jquery_path = elgg_get_site_url() . 'vendors/jquery/';
+?>
+
+/*
+ * FancyBox - jQuery Plugin
+ * Simple and fancy lightbox alternative
+ *
+ * Examples and documentation at: http://fancybox.net
+ *
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
+ * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
+ *
+ * Version: 1.3.4 (11/11/2010)
+ * Requires: jQuery v1.3+
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+
+#fancybox-loading {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 40px;
+ height: 40px;
+ margin-top: -20px;
+ margin-left: -20px;
+ cursor: pointer;
+ overflow: hidden;
+ z-index: 1104;
+ display: none;
+}
+
+#fancybox-loading div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 40px;
+ height: 480px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+}
+
+#fancybox-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 1100;
+ display: none;
+}
+
+#fancybox-tmp {
+ padding: 0;
+ margin: 0;
+ border: 0;
+ overflow: auto;
+ display: none;
+}
+
+#fancybox-wrap {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: 20px;
+ z-index: 1101;
+ outline: none;
+ display: none;
+}
+
+#fancybox-outer {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+}
+
+#fancybox-content {
+ width: 0;
+ height: 0;
+ padding: 0;
+ outline: none;
+ position: relative;
+ overflow: hidden;
+ z-index: 1102;
+ border: 0px solid #fff;
+}
+
+#fancybox-hide-sel-frame {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: transparent;
+ z-index: 1101;
+}
+
+#fancybox-close {
+ position: absolute;
+ top: -15px;
+ right: -15px;
+ width: 30px;
+ height: 30px;
+ background: transparent url('<?php echo $jquery_path; ?>fancybox/fancybox.png') -40px 0px;
+ cursor: pointer;
+ z-index: 1103;
+ display: none;
+}
+
+#fancybox-error {
+ color: #444;
+ font: normal 12px/20px Arial;
+ padding: 14px;
+ margin: 0;
+}
+
+#fancybox-img {
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ border: none;
+ outline: none;
+ line-height: 0;
+ vertical-align: top;
+}
+
+#fancybox-frame {
+ width: 100%;
+ height: 100%;
+ border: none;
+ display: block;
+}
+
+#fancybox-left, #fancybox-right {
+ position: absolute;
+ bottom: 0px;
+ height: 100%;
+ width: 35%;
+ cursor: pointer;
+ outline: none;
+ background: transparent url('<?php echo $jquery_path; ?>fancybox/blank.gif');
+ z-index: 1102;
+ display: none;
+}
+
+#fancybox-left {
+ left: 0px;
+}
+
+#fancybox-right {
+ right: 0px;
+}
+
+#fancybox-left-ico, #fancybox-right-ico {
+ position: absolute;
+ top: 50%;
+ left: -9999px;
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ cursor: pointer;
+ z-index: 1102;
+ display: block;
+}
+
+#fancybox-left-ico {
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -30px;
+}
+
+#fancybox-right-ico {
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -60px;
+}
+
+#fancybox-left:hover, #fancybox-right:hover {
+ visibility: visible; /* IE6 */
+}
+
+#fancybox-left:hover span {
+ left: 20px;
+}
+
+#fancybox-right:hover span {
+ left: auto;
+ right: 20px;
+}
+
+.fancybox-bg {
+ position: absolute;
+ padding: 0;
+ margin: 0;
+ border: 0;
+ width: 20px;
+ height: 20px;
+ z-index: 1001;
+}
+
+#fancybox-bg-n {
+ top: -20px;
+ left: 0;
+ width: 100%;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox-x.png');
+}
+
+#fancybox-bg-ne {
+ top: -20px;
+ right: -20px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -162px;
+}
+
+#fancybox-bg-e {
+ top: 0;
+ right: -20px;
+ height: 100%;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox-y.png');
+ background-position: -20px 0px;
+}
+
+#fancybox-bg-se {
+ bottom: -20px;
+ right: -20px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -182px;
+}
+
+#fancybox-bg-s {
+ bottom: -20px;
+ left: 0;
+ width: 100%;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox-x.png');
+ background-position: 0px -20px;
+}
+
+#fancybox-bg-sw {
+ bottom: -20px;
+ left: -20px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -142px;
+}
+
+#fancybox-bg-w {
+ top: 0;
+ left: -20px;
+ height: 100%;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox-y.png');
+}
+
+#fancybox-bg-nw {
+ top: -20px;
+ left: -20px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancybox.png');
+ background-position: -40px -122px;
+}
+
+#fancybox-title {
+ font-family: Helvetica;
+ font-size: 12px;
+ z-index: 1102;
+}
+
+.fancybox-title-inside {
+ padding-bottom: 10px;
+ text-align: center;
+ color: #333;
+ background: #fff;
+ position: relative;
+}
+
+.fancybox-title-outside {
+ padding-top: 10px;
+ color: #fff;
+}
+
+.fancybox-title-over {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ color: #FFF;
+ text-align: left;
+}
+
+#fancybox-title-over {
+ padding: 10px;
+ background-image: url('<?php echo $jquery_path; ?>fancybox/fancy_title_over.png');
+ display: block;
+}
+
+.fancybox-title-float {
+ position: absolute;
+ left: 0;
+ bottom: -20px;
+ height: 32px;
+}
+
+#fancybox-title-float-wrap {
+ border: none;
+ border-collapse: collapse;
+ width: auto;
+}
+
+#fancybox-title-float-wrap td {
+ border: none;
+ white-space: nowrap;
+}
+
+#fancybox-title-float-left {
+ padding: 0 0 0 15px;
+ background: url('<?php echo $jquery_path; ?>fancybox/fancybox.png') -40px -90px no-repeat;
+}
+
+#fancybox-title-float-main {
+ color: #FFF;
+ line-height: 29px;
+ font-weight: bold;
+ padding: 0 0 3px 0;
+ background: url('<?php echo $jquery_path; ?>fancybox/fancybox-x.png') 0px -40px;
+}
+
+#fancybox-title-float-right {
+ padding: 0 0 0 15px;
+ background: url('<?php echo $jquery_path; ?>fancybox/fancybox.png') -55px -90px no-repeat;
+}
+
+/* IE6 */
+
+.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_close.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_nav_left.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_nav_right.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
+.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_title_left.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_title_main.png', sizingMethod='scale'); }
+.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_title_right.png', sizingMethod='scale'); }
+
+.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame {
+ height: expression(this.parentNode.clientHeight + "px");
+}
+
+#fancybox-loading.fancybox-ie6 {
+ position: absolute; margin-top: 0;
+ top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px');
+}
+
+#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_loading.png', sizingMethod='scale'); }
+
+/* IE6, IE7, IE8 */
+.fancybox-ie .fancybox-bg { background: transparent !important; }
+
+.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
+.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='<?php echo $jquery_path; ?>fancybox/fancy_shadow_nw.png', sizingMethod='scale'); } \ No newline at end of file
diff --git a/mod/basic_theme/views/default/css/walled_garden.php b/mod/basic_theme/views/default/css/walled_garden.php
new file mode 100644
index 000000000..f6f7f97dc
--- /dev/null
+++ b/mod/basic_theme/views/default/css/walled_garden.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Walled garden CSS
+ */
+
+$url = elgg_get_site_url();
+
+?>
+.elgg-body-walledgarden {
+ margin: 100px auto 0 auto;
+ position: relative;
+ width: 530px;
+}
+.elgg-module-walledgarden {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.elgg-module-walledgarden > .elgg-head {
+ height: 17px;
+}
+.elgg-module-walledgarden > .elgg-body {
+ padding: 0 10px;
+}
+.elgg-module-walledgarden > .elgg-foot {
+ height: 17px;
+}
+.elgg-walledgarden-double > .elgg-head {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_top.png) no-repeat left top;
+}
+.elgg-walledgarden-double > .elgg-body {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_middle.png) repeat-y left top;
+}
+.elgg-walledgarden-double > .elgg-foot {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_bottom.png) no-repeat left top;
+}
+.elgg-walledgarden-single > .elgg-head {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_top.png) no-repeat left top;
+}
+.elgg-walledgarden-single > .elgg-body {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_middle.png) repeat-y left top;
+}
+.elgg-walledgarden-single > .elgg-foot {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_bottom.png) no-repeat left top;
+}
+
+.elgg-col > .elgg-inner {
+ margin: 0 0 0 5px;
+}
+.elgg-col:first-child > .elgg-inner {
+ margin: 0 5px 0 0;
+}
+.elgg-col > .elgg-inner {
+ padding: 0 8px;
+}
+
+.elgg-walledgarden-single > .elgg-body {
+ padding: 0 18px;
+}
+
+.elgg-module-walledgarden-login {
+ margin: 0;
+}
+.elgg-body-walledgarden h3 {
+ font-size: 1.5em;
+ line-height: 1.1em;
+ padding-bottom: 5px;
+}
+
+.elgg-heading-walledgarden {
+ margin-top: 60px;
+ line-height: 1.1em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #666;
+}
+
+a {
+ color: #999;
+} \ No newline at end of file
diff --git a/mod/beechat/README b/mod/beechat/README
new file mode 100644
index 000000000..5ff3f8467
--- /dev/null
+++ b/mod/beechat/README
@@ -0,0 +1,23 @@
+Beechat the first XMPP chat for Elgg
+====================================
+
+Beechat is a facebook like chat for elgg using the XMPP protocol. It requires the XMPP serveur ejabberd.
+
+Installation
+------------
+
+French Documentation
+
+http://github.com/beechannels/beechat/wikis/guide-dinstallation
+
+English Documentation
+
+http://github.com/beechannels/beechat/wikis/setup-guide
+
+Feedback
+--------
+
+We are relying on the [GitHub issues tracker][issues] linked from above for
+feedback. File bugs or other issues [here][issues].
+
+[issues]: http://github.com/beechannels/beechat/issues
diff --git a/mod/beechat/actions/get_connection.php b/mod/beechat/actions/get_connection.php
new file mode 100644
index 000000000..a31174179
--- /dev/null
+++ b/mod/beechat/actions/get_connection.php
@@ -0,0 +1,21 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ header('Content-type: application/json');
+ gatekeeper();
+
+ global $SESSION;
+
+ if ($SESSION->offsetExists('beechat_conn'))
+ echo $SESSION->offsetGet('beechat_conn');
+
+ exit();
+?>
diff --git a/mod/beechat/actions/get_details.php b/mod/beechat/actions/get_details.php
new file mode 100644
index 000000000..4944fc4a9
--- /dev/null
+++ b/mod/beechat/actions/get_details.php
@@ -0,0 +1,21 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ gatekeeper();
+ header('Content-type: application/json');
+ $user = $_SESSION['user'];
+ $t = array('username' => $user->username,
+ 'password' => $user->password);
+
+ echo json_encode($t);
+
+ exit();
+?>
diff --git a/mod/beechat/actions/get_icons.php b/mod/beechat/actions/get_icons.php
new file mode 100644
index 000000000..33d447e2e
--- /dev/null
+++ b/mod/beechat/actions/get_icons.php
@@ -0,0 +1,52 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ header('Content-type: application/json');
+ gatekeeper();
+ global $CONFIG;
+
+ if (!empty($_POST['beechat_roster_items_usernames']))
+ {
+ $rosterItemsUsernames = explode(',', $_POST['beechat_roster_items_usernames']);
+ /*foreach ($rosterItemsUsernames as $rosterItem)
+ {
+ }*/
+ $userFriendsEntities = $_SESSION['user']->getFriends('', 0, 0);
+
+ $res = array();
+ foreach ($rosterItemsUsernames as $value)
+ {
+ $found = false;
+ $splitjid = explode('@', $value);
+ $jid_name = $splitjid[0];
+ $jid_host = $splitjid[1];
+ foreach ($userFriendsEntities as $friend)
+ {
+ if ((strtolower($friend->username) == strtolower($jid_name) && $jid_host == elgg_get_plugin_setting("domain", "beechat")))
+ {
+ $res[$value] = array('small' => $friend->getIcon('small'), 'tiny' => $friend->getIcon('tiny'));
+ $found = true;
+ break;
+ }
+ }
+ if (!$found) {
+ $base = $CONFIG->wwwroot."mod/profile/graphics/default";
+ $res[$value] = array('small' => $base."small.gif", 'tiny' => $base."tiny.gif");
+ }
+ }
+ echo json_encode($res);
+ }
+ else
+ echo json_encode(null);
+
+ exit();
+
+?>
diff --git a/mod/beechat/actions/get_state.php b/mod/beechat/actions/get_state.php
new file mode 100644
index 000000000..6cfd2f725
--- /dev/null
+++ b/mod/beechat/actions/get_state.php
@@ -0,0 +1,21 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ header('Content-type: application/json');
+ gatekeeper();
+
+ global $SESSION;
+
+ if ($SESSION->offsetExists('beechat_state'))
+ echo $SESSION->offsetGet('beechat_state');
+
+ exit();
+?>
diff --git a/mod/beechat/actions/get_statuses.php b/mod/beechat/actions/get_statuses.php
new file mode 100644
index 000000000..6f7620beb
--- /dev/null
+++ b/mod/beechat/actions/get_statuses.php
@@ -0,0 +1,41 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ header('Content-type: application/json');
+ gatekeeper();
+ $usernames = get_input('beechat_roster_items_usernames');
+ if (!empty($usernames))
+ {
+ $iconSize = 'small';
+ $rosterItemsUsernames = explode(',', $usernames);
+ $userFriendsEntities = $_SESSION['user']->getFriends('', 1000000000, 0);
+
+ $res = array();
+ foreach ($rosterItemsUsernames as $value)
+ {
+ foreach ($userFriendsEntities as $friend)
+ {
+ if (strtolower($friend->username) == strtolower($value))
+ {
+ $status = get_entities_from_metadata("state", "current", "object", "status", $friend->get('guid'));
+ $res[$value] = ($status != false) ? $status[0]->description : '';
+ break;
+ }
+ }
+ }
+ echo json_encode($res);
+ }
+ else
+ echo json_encode(null);
+
+ exit();
+
+?>
diff --git a/mod/beechat/actions/join_groupchat.php b/mod/beechat/actions/join_groupchat.php
new file mode 100644
index 000000000..c694d7957
--- /dev/null
+++ b/mod/beechat/actions/join_groupchat.php
@@ -0,0 +1,15 @@
+<?php
+
+$user = elgg_get_logged_in_user_entity();
+$group = get_entity(get_input('group_guid'));
+
+if ($user && $group) {
+ if (!check_entity_relationship($user->guid, 'groupchat', $group->guid)) {
+ error_log("joinen ok");
+ add_entity_relationship($user->guid, 'groupchat', $group->guid);
+}
+}
+echo "OK";
+error_log("join ok");
+
+?>
diff --git a/mod/beechat/actions/leave_groupchat.php b/mod/beechat/actions/leave_groupchat.php
new file mode 100644
index 000000000..e04ab8846
--- /dev/null
+++ b/mod/beechat/actions/leave_groupchat.php
@@ -0,0 +1,12 @@
+<?php
+
+$user = elgg_get_logged_in_user_entity();
+$group = get_entity(get_input('group_guid'));
+
+if ($user && $group) {
+ if (check_entity_relationship($user->guid, 'groupchat', $group->guid))
+ remove_entity_relationship($user->guid, 'groupchat', $group->guid);
+}
+error_log("leave ok");
+echo "OK";
+?>
diff --git a/mod/beechat/actions/save_state.php b/mod/beechat/actions/save_state.php
new file mode 100644
index 000000000..f8a61c580
--- /dev/null
+++ b/mod/beechat/actions/save_state.php
@@ -0,0 +1,29 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+// gatekeeper();
+
+ if (elgg_is_logged_in())
+ {
+
+ global $SESSION;
+
+ if (!empty($_POST['beechat_state']))
+ {
+ $SESSION->offsetSet('beechat_state', $_POST['beechat_state']);
+ }
+ elseif (!empty($_POST['beechat_conn']))
+ {
+ $SESSION->offsetSet('beechat_conn', get_input('beechat_conn'));
+ }
+ }
+ exit();
+?>
diff --git a/mod/beechat/classes/BeechatSync.php b/mod/beechat/classes/BeechatSync.php
new file mode 100644
index 000000000..e0a2f90b8
--- /dev/null
+++ b/mod/beechat/classes/BeechatSync.php
@@ -0,0 +1,37 @@
+<?php
+
+class BeechatSync {
+ static function onFriendCreate($event, $object_type, $relationship) {
+ if ($relationship->relationship == 'friendrequest') {
+ elgg_load_library('elgg:beechat');
+ $friend = get_entity($relationship->guid_two);
+ // create friend request
+ ejabberd_friend_request(elgg_get_logged_in_user_entity(), $friend);
+ }
+ }
+ static function onFriendDelete($event, $object_type, $relationship) {
+ if ($relationship->relationship == 'friendrequest') {
+ elgg_load_library('elgg:beechat');
+ $subject = get_entity($relationship->guid_two);
+ // here friend is guid_one because is the one initiating
+ $friend = get_entity($relationship->guid_one);
+ $friends = $friend->isFriendsWith($subject->guid);
+ if ($friends) {
+ // accept friend request
+ ejabberd_friend_accept(elgg_get_logged_in_user_entity(), $friend);
+ } else {
+ // decline friend request
+ ejabberd_friend_deny(elgg_get_logged_in_user_entity(), $friend);
+ }
+ }
+ elseif ($relationship->relationship == 'friend') {
+ elgg_load_library('elgg:beechat');
+ $subject = get_entity($relationship->guid_one);
+ $friend = get_entity($relationship->guid_two);
+ // delete friendship
+ ejabberd_friend_remove(elgg_get_logged_in_user_entity(), $friend);
+ }
+
+ }
+
+}
diff --git a/mod/beechat/disablechat.php b/mod/beechat/disablechat.php
new file mode 100644
index 000000000..490fb327b
--- /dev/null
+++ b/mod/beechat/disablechat.php
@@ -0,0 +1,8 @@
+<?php
+ require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+ if (elgg_is_logged_in()) {
+ elgg_get_logged_in_user_entity()->chatenabled = false;
+ system_message(elgg_echo("beechat:disabled"));
+ }
+ forward($_SERVER['HTTP_REFERER']);
+?>
diff --git a/mod/beechat/enablechat.php b/mod/beechat/enablechat.php
new file mode 100644
index 000000000..5d3de7e2a
--- /dev/null
+++ b/mod/beechat/enablechat.php
@@ -0,0 +1,8 @@
+<?php
+ require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+ if (elgg_is_logged_in()) {
+ elgg_get_logged_in_user_entity()->chatenabled = true;
+ system_message(elgg_echo("beechat:enabled"));
+ }
+ forward($_SERVER['HTTP_REFERER']);
+?>
diff --git a/mod/beechat/graphics/icons/bullet_arrow_down.png b/mod/beechat/graphics/icons/bullet_arrow_down.png
new file mode 100644
index 000000000..9b23c06d7
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_arrow_down.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_arrow_up.png b/mod/beechat/graphics/icons/bullet_arrow_up.png
new file mode 100644
index 000000000..24df0f421
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_arrow_up.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_black.png b/mod/beechat/graphics/icons/bullet_black.png
new file mode 100644
index 000000000..57619706d
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_black.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_blue.png b/mod/beechat/graphics/icons/bullet_blue.png
new file mode 100644
index 000000000..a7651ec8a
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_blue.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_delete.png b/mod/beechat/graphics/icons/bullet_delete.png
new file mode 100644
index 000000000..bd6271b24
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_delete.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_error.png b/mod/beechat/graphics/icons/bullet_error.png
new file mode 100644
index 000000000..bca2b491f
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_error.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_green.png b/mod/beechat/graphics/icons/bullet_green.png
new file mode 100644
index 000000000..058ad261f
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_green.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_orange.png b/mod/beechat/graphics/icons/bullet_orange.png
new file mode 100644
index 000000000..fa63024e5
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_orange.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_pink.png b/mod/beechat/graphics/icons/bullet_pink.png
new file mode 100644
index 000000000..0c9f73e3f
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_pink.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_purple.png b/mod/beechat/graphics/icons/bullet_purple.png
new file mode 100644
index 000000000..52ba5036b
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_purple.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_red.png b/mod/beechat/graphics/icons/bullet_red.png
new file mode 100644
index 000000000..0cd803115
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_red.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_star.png b/mod/beechat/graphics/icons/bullet_star.png
new file mode 100644
index 000000000..fab774a32
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_star.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_white.png b/mod/beechat/graphics/icons/bullet_white.png
new file mode 100644
index 000000000..a9af8d44b
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_white.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/bullet_yellow.png b/mod/beechat/graphics/icons/bullet_yellow.png
new file mode 100644
index 000000000..6469cea7e
--- /dev/null
+++ b/mod/beechat/graphics/icons/bullet_yellow.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/chat_icon.png b/mod/beechat/graphics/icons/chat_icon.png
new file mode 100644
index 000000000..0e6d844bd
--- /dev/null
+++ b/mod/beechat/graphics/icons/chat_icon.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/cog_edit.png b/mod/beechat/graphics/icons/cog_edit.png
new file mode 100644
index 000000000..47b75a456
--- /dev/null
+++ b/mod/beechat/graphics/icons/cog_edit.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/comment_edit.png b/mod/beechat/graphics/icons/comment_edit.png
new file mode 100644
index 000000000..73db110df
--- /dev/null
+++ b/mod/beechat/graphics/icons/comment_edit.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_evilgrin.png b/mod/beechat/graphics/icons/emoticon_evilgrin.png
new file mode 100644
index 000000000..817bd509b
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_evilgrin.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_grin.png b/mod/beechat/graphics/icons/emoticon_grin.png
new file mode 100644
index 000000000..fc60c5e1c
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_grin.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_happy.png b/mod/beechat/graphics/icons/emoticon_happy.png
new file mode 100644
index 000000000..6b7336e17
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_happy.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_smile.png b/mod/beechat/graphics/icons/emoticon_smile.png
new file mode 100644
index 000000000..ade431851
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_smile.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_surprised.png b/mod/beechat/graphics/icons/emoticon_surprised.png
new file mode 100644
index 000000000..4520cfc55
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_surprised.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_tongue.png b/mod/beechat/graphics/icons/emoticon_tongue.png
new file mode 100644
index 000000000..ecafd2ffc
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_tongue.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_unhappy.png b/mod/beechat/graphics/icons/emoticon_unhappy.png
new file mode 100644
index 000000000..fd5d030ef
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_unhappy.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_waii.png b/mod/beechat/graphics/icons/emoticon_waii.png
new file mode 100644
index 000000000..458f93611
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_waii.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/emoticon_wink.png b/mod/beechat/graphics/icons/emoticon_wink.png
new file mode 100644
index 000000000..a631949b5
--- /dev/null
+++ b/mod/beechat/graphics/icons/emoticon_wink.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/heart.png b/mod/beechat/graphics/icons/heart.png
new file mode 100644
index 000000000..d9ee53e59
--- /dev/null
+++ b/mod/beechat/graphics/icons/heart.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/house.png b/mod/beechat/graphics/icons/house.png
new file mode 100644
index 000000000..fed62219f
--- /dev/null
+++ b/mod/beechat/graphics/icons/house.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/muc_icon.png b/mod/beechat/graphics/icons/muc_icon.png
new file mode 100644
index 000000000..efdd60f12
--- /dev/null
+++ b/mod/beechat/graphics/icons/muc_icon.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/notification_pink.png b/mod/beechat/graphics/icons/notification_pink.png
new file mode 100644
index 000000000..f40c184f9
--- /dev/null
+++ b/mod/beechat/graphics/icons/notification_pink.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/pointer.png b/mod/beechat/graphics/icons/pointer.png
new file mode 100644
index 000000000..4e50a0f9a
--- /dev/null
+++ b/mod/beechat/graphics/icons/pointer.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/resultset_next.png b/mod/beechat/graphics/icons/resultset_next.png
new file mode 100644
index 000000000..e252606d3
--- /dev/null
+++ b/mod/beechat/graphics/icons/resultset_next.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/resultset_previous.png b/mod/beechat/graphics/icons/resultset_previous.png
new file mode 100644
index 000000000..18f9cc109
--- /dev/null
+++ b/mod/beechat/graphics/icons/resultset_previous.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/statuses.png b/mod/beechat/graphics/icons/statuses.png
new file mode 100644
index 000000000..e409f61a9
--- /dev/null
+++ b/mod/beechat/graphics/icons/statuses.png
Binary files differ
diff --git a/mod/beechat/graphics/icons/vcard.png b/mod/beechat/graphics/icons/vcard.png
new file mode 100644
index 000000000..c02f315d2
--- /dev/null
+++ b/mod/beechat/graphics/icons/vcard.png
Binary files differ
diff --git a/mod/beechat/languages/en.php b/mod/beechat/languages/en.php
new file mode 100644
index 000000000..38f03be98
--- /dev/null
+++ b/mod/beechat/languages/en.php
@@ -0,0 +1,45 @@
+<?php
+
+$en_array = array(
+ 'beechat:icons:home' => 'Home',
+
+ 'beechat:contacts:button' => 'Chat',
+
+ 'beechat:availability:available' => 'Available',
+ 'beechat:availability:dnd' => 'Do not disturb',
+ 'beechat:availability:away' => 'Away',
+ 'beechat:availability:xa' => 'Extended away',
+ 'beechat:availability:offline' => 'Offline',
+
+ 'beechat:connection:state:offline' => 'Offline',
+ 'beechat:connection:state:connecting' => 'Connecting...',
+ 'beechat:connection:state:authenticating' => 'Authenticating...',
+ 'beechat:connection:state:online' => 'Online',
+ 'beechat:connection:state:failed' => 'Failed',
+ 'beechat:connection:state:disconnecting' => 'Disconnecting...',
+
+ 'beechat:chat:self' => 'Me',
+ 'beechat:chat:composing' => ' is typing.',
+
+ 'beechat:box:minimize' => 'Minimize',
+ 'beechat:box:close' => 'Close',
+ 'beechat:box:showhide' => 'Show/Hide this chat window',
+ 'beechat:enabled' => 'Chat enabled',
+ 'beechat:disabled' => 'Chat disabled',
+ 'beechat:enablechat' => 'Enable chat',
+ 'beechat:disablechat' => 'Disable chat',
+ 'beechat:domain' => 'Chat domain',
+ 'beechat:groupdomain' => 'MUC domain',
+ 'beechat:chatroom' => 'Group chat',
+ 'beechat:dbname' => 'Database name',
+ 'beechat:dbhost' => 'Database host',
+ 'beechat:dbuser' => 'Database user',
+ 'beechat:dbuser' => 'notification:method:xmpp',
+ 'notification:method:xmpp' => 'Xmpp/Jabber',
+ 'beechat:dbpassword' => 'Database password',
+ 'beechat:xmlrpcip' => 'Ejabberd IP'
+ );
+
+add_translation('en', $en_array);
+
+?>
diff --git a/mod/beechat/languages/es.php b/mod/beechat/languages/es.php
new file mode 100644
index 000000000..78f009ce9
--- /dev/null
+++ b/mod/beechat/languages/es.php
@@ -0,0 +1,43 @@
+<?php
+
+$es_array = array(
+ 'beechat:icons:home' => 'Home',
+
+ 'beechat:contacts:button' => 'Chat',
+
+ 'beechat:availability:available' => 'Disponible',
+ 'beechat:availability:dnd' => 'No molestar',
+ 'beechat:availability:away' => 'Fuera',
+ 'beechat:availability:xa' => 'Fuera bastante tiempo',
+ 'beechat:availability:offline' => 'Desconectado',
+
+ 'beechat:connection:state:offline' => 'Desconectado',
+ 'beechat:connection:state:connecting' => 'Conectando...',
+ 'beechat:connection:state:authenticating' => 'Iniciando...',
+ 'beechat:connection:state:online' => 'Conectado',
+ 'beechat:connection:state:failed' => 'Fallo',
+ 'beechat:connection:state:disconnecting' => 'Desconectando...',
+
+ 'beechat:chat:self' => 'Yo',
+ 'beechat:chat:composing' => ' esta escribiendo.',
+
+ 'beechat:box:minimize' => 'Minimizar',
+ 'beechat:box:close' => 'Cerrar',
+ 'beechat:box:showhide' => 'Mostrar/Ocultar esta ventana de chat',
+ 'beechat:enabled' => 'Chat activado',
+ 'beechat:disabled' => 'Chat desactivado',
+ 'beechat:enablechat' => 'Activar chat',
+ 'beechat:disablechat' => 'Desactivar chat',
+ 'beechat:domain' => 'Dominio Chat',
+ 'beechat:groupdomain' => 'Dominio MUC',
+ 'beechat:chatroom' => 'Chat del grupo',
+ 'beechat:dbname' => 'Database name',
+ 'beechat:dbhost' => 'Database host',
+ 'beechat:dbuser' => 'Database user',
+ 'beechat:dbpassword' => 'Database password',
+ 'beechat:xmlrpcip' => 'Ejabberd IP'
+ );
+
+add_translation('es', $es_array);
+
+?>
diff --git a/mod/beechat/languages/fr.php b/mod/beechat/languages/fr.php
new file mode 100644
index 000000000..58b0eac3a
--- /dev/null
+++ b/mod/beechat/languages/fr.php
@@ -0,0 +1,32 @@
+<?php
+
+$fr_array = array(
+ 'beechat:icons:home' => 'Accueil',
+
+ 'beechat:contacts:button' => 'Chat',
+
+ 'beechat:availability:available' => 'Disponible',
+ 'beechat:availability:dnd' => 'Ne pas déranger',
+ 'beechat:availability:away' => 'Absent',
+ 'beechat:availability:xa' => 'Absence prolongée',
+ 'beechat:availability:offline' => 'Hors ligne',
+
+ 'beechat:connection:state:offline' => 'Hors ligne',
+ 'beechat:connection:state:connecting' => 'Connexion...',
+ 'beechat:connection:state:authenticating' => 'Authentification...',
+ 'beechat:connection:state:online' => 'En ligne',
+ 'beechat:connection:state:failed' => 'Échec',
+ 'beechat:connection:state:disconnecting' => 'Déconnexion...',
+
+ 'beechat:chat:self' => 'Moi',
+ 'beechat:chat:composing' => ' est en train d\'écrire.',
+
+ 'beechat:box:minimize' => 'Diminuer',
+ 'beechat:box:close' => 'Fermer',
+ 'beechat:box:showhide' => 'Montrer/Cacher cette fenêtre de chat'
+
+ );
+
+add_translation('fr', $fr_array);
+
+?>
diff --git a/mod/beechat/lib/beechat.php b/mod/beechat/lib/beechat.php
new file mode 100644
index 000000000..bf002d648
--- /dev/null
+++ b/mod/beechat/lib/beechat.php
@@ -0,0 +1,250 @@
+<?
+/*
+ allow_change_subj
+ allow_private_messages
+ allow_query_users
+ allow_user_invites
+ anonymous
+ logging
+ max_users
+ members_by_default
+ members_only
+ moderated
+ password
+ password_protected
+ persistent
+ public
+ public_list
+ title
+
+muc_room_set_affiliation struct[{name, String}, {service, String},
+ {jid, String}, {affiliation, Affiliation}] Integer
+
+
+*/
+ //$request = xmlrpc_encode_request('muc_online_rooms', "global", (array('encoding' => 'utf-8')));
+
+
+function ejabberd_xmlrpc_send($request)
+{
+ $context = stream_context_create(array('http' => array(
+ 'method' => "POST",
+ 'header' => "User-Agent: XMLRPC::Client mod_xmlrpc\r\n" .
+ "Content-Type: text/xml\r\n" .
+ "Content-Length: ".strlen($request),
+ 'content' => $request
+ )));
+
+ $file = file_get_contents("http://".elgg_get_plugin_setting("xmlrpcip", "beechat").":4560/RPC2", false, $context);
+
+ $response = xmlrpc_decode($file);
+ if (is_array($response) && xmlrpc_is_fault($response)) {
+ trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
+ } else {
+ // print_r($response);
+ }
+}
+
+function ejabberd_xmlrpc_command($command, $params)
+{
+ //error_log("send xmlrpc: ".$command);
+ $request = xmlrpc_encode_request($command, $params, (array('encoding' => 'utf-8')));
+ return ejabberd_xmlrpc_send($request);
+}
+
+function xmpp_escape($name) {
+ // http://xmpp.org/extensions/xep-0106.html#escaping
+ $name = str_replace(' ', '\\20', $name);
+ $name = str_replace('"', '\\22', $name);
+ $name = str_replace('&', '\\26', $name);
+ $name = str_replace("'", '\\27', $name);
+ $name = str_replace('/', '\\2f', $name);
+ $name = str_replace(';', '\\3a', $name);
+ $name = str_replace('<', '\\3c', $name);
+ $name = str_replace('>', '\\3e', $name);
+ $name = str_replace('@', '\\40', $name);
+ $name = str_replace('\\', '\\5c', $name);
+ return $name;
+}
+
+class EjabberdMucRoom {
+ function __construct($group) {
+ $this->group = $group;
+ }
+ function setOption($name, $value) {
+ $group = $this->group;
+ $param=array("name"=>elgg_get_friendly_title($group->name),
+ "service"=>elgg_get_plugin_setting("groupdomain", "beechat"),
+ "option"=>$name,
+ "value"=>$value);
+ ejabberd_xmlrpc_command('muc_room_change_option', $param);
+ }
+ function addMember($member) {
+ //"outcast" | "none" | "member" | "admin" | "owner"
+ $group = $this->group;
+ if ($member->guid === $group->owner_guid)
+ $affiliation = "owner";
+ elseif ($group->canEdit($member->guid))
+ $affiliation = "admin";
+ else
+ $affiliation = "member";
+ $this->setAffiliation($member, $affiliation);
+ }
+
+ function setAffiliation($member, $affiliation) {
+ $group = $this->group;
+ $param = array("name" => elgg_get_friendly_title($group->name),
+ "service" => elgg_get_plugin_setting("groupdomain", "beechat"),
+ "jid" => xmpp_escape($member->username) . '@' . elgg_get_plugin_setting("domain", "beechat"),
+ "affiliation" => $affiliation);
+ ejabberd_xmlrpc_command('muc_room_set_affiliation', $param);
+ //echo "set affiliation ".$member->username."<br/>";
+ }
+}
+
+function ejabberd_create_group($group)
+{
+ //echo "creating " . $group->name . "<br/>";
+ // create room
+ $param=array("name"=>elgg_get_friendly_title($group->name),
+ "service"=>elgg_get_plugin_setting("groupdomain", "beechat"),
+ "server"=>elgg_get_plugin_setting("domain", "beechat"));
+ ejabberd_xmlrpc_command('create_muc_room', $param);
+
+ // persistency
+
+ $room = new EjabberdMucRoom($group);
+ $room->setOption("persistent", true);
+ $room->setOption("title", $group->name);
+ // open to public?
+ if ($group->isPublicMembership()) {
+ $room->setOption("members_only", false);
+ }
+ else
+ $room->setOption("members_only", true);
+
+ if ($group->access_id === ACCESS_PUBLIC) {
+ $room->setOption("public_list", true);
+ $room->setOption("public", true);
+ }
+ else {
+ $room->setOption("public_list", false);
+ $room->setOption("public", false);
+ }
+ $members = $group->getMembers(0);
+ foreach($members as $member) {
+ $room->addMember($member);
+ }
+ $room->addMember(get_entity($group->owner_guid));
+}
+
+function ejabberd_destroy_group($group)
+{
+ $param=array("name"=>elgg_get_friendly_title($group->name),
+ "service"=>elgg_get_plugin_setting("groupdomain", "beechat"),
+ "server"=>elgg_get_plugin_setting("domain", "beechat"));
+ ejabberd_xmlrpc_command('delete_muc_room', $param);
+}
+
+function ejabberd_getjid($user, $do_external=false)
+{
+ if ($user->foreign || ($do_external && $user->alias && get_plugin_usersetting("usealias", $user->guid,"openid_client"))) {
+ if ($user->foreign)
+ $webid = $user->webid;
+ else
+ $webid = $user->alias;
+ if (strpos($webid, 'http') === 0) {
+ // http or https addresses
+ $hostparts = parse_url($webid);
+ $urlparts = explode('/', $webid);
+ $host = $hostparts['host'];
+ $username = $urlparts[count($urlparts)-1];
+ } else {
+ if (strpos($webid, ':') > 0) {
+ $webidparts = explode(':', $webid);
+ $hostparts = explode('@',$webidparts[1]);
+ } else {
+ $hostparts = explode('@',$webid);
+ }
+ $username = $hostparts[0];
+ $host = $hostparts[1];
+ }
+ }
+ else {
+ $username = $user->username;
+ $host = elgg_get_plugin_setting("domain", "beechat");
+ }
+ return xmpp_escape($username) . '@' . $host;
+}
+
+function ejabberd_friend_command($user, $friend, $command, $is_out) // $user adds $friend
+{
+ error_log(" * ".$friend->username."->".ejabberd_getjid($user)." ".$command);
+ if ($friend->foreign) {
+ error_log(" * beechat: friend is foreign!");
+ return;
+ }
+ $param = array("user" => elgg_get_friendly_title($friend->username),
+ "server" => elgg_get_plugin_setting("domain", "beechat"),
+ "from" => ejabberd_getjid($user),
+ "subs" => $command);
+ if ($is_out) {
+ error_log("out");
+ ejabberd_xmlrpc_command('send_roster_request_out', $param);
+ }
+ else {
+ $param['reason'] = 'unknown';
+ ejabberd_xmlrpc_command('send_roster_request_in', $param);
+ }
+}
+
+
+function ejabberd_friend_request($user, $friend) // $user adds $friend
+{
+ error_log('ejabberd_friend_request');
+ ejabberd_friend_command($friend, $user, 'subscribe', true); // out:$user : $friend
+ error_log('ejabberd_friend_requested');
+}
+function ejabberd_friend_accept($user, $friend) // $user adds $friend
+{
+ error_log('ejabberd_friend_accept');
+ ejabberd_friend_command($friend, $user, 'subscribed', true);
+ // following might be needed to have symmetry (and important for remote)
+ if ($friend->foreign) {
+ // following is needed for xmpp nodes
+ ejabberd_friend_command($friend, $user, 'subscribe', true);
+ }
+ // ejabberd_friend_command($friend, $user, 'subscribed', false);
+ // following can't be faked
+ if (!$friend->foreign)
+ ejabberd_friend_command($user, $friend, 'subscribed', true);
+ error_log('ejabberd_friend_accepted');
+}
+function ejabberd_friend_deny($user, $friend) // $user adds $friend
+{
+ error_log('ejabberd_friedeny');
+ ejabberd_friend_command($friend, $user, 'unsubscribed', true);
+}
+function ejabberd_friend_remove($user, $friend) // $user adds $friend
+{
+ error_log('ejabberd_friend_remove');
+ if ($friend->foreign) {
+ ejabberd_friend_command($friend, $user, 'unsubscribed', true);
+ ejabberd_friend_command($friend, $user, 'unsubscribed', false);
+ }
+ else
+ ejabberd_friend_command($friend, $user, 'unsubscribed', false);
+ if (!$friend->foreign)
+ ejabberd_friend_command($user, $friend, 'unsubscribed', false);
+ error_log('ejabberd_friend_removed');
+}
+
+/*function ejabberd_send_chat($from, $to, $body) { // $user adds $friend
+ $param = array("body"=>$body,
+ "from"=>$from,
+ "to"=>$to);
+ ejabberd_xmlrpc_command('send_chat_message', $param);
+}*/
+
+
+?>
diff --git a/mod/beechat/manifest.xml b/mod/beechat/manifest.xml
new file mode 100644
index 000000000..ad948fdb4
--- /dev/null
+++ b/mod/beechat/manifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Beechat</name>
+ <author>Beechannels + Lorea dev</author>
+ <version>1.8.0</version>
+ <category>widget</category>
+ <description>XMPP chat for Elgg.</description>
+ <website>https://lorea.org</website>
+ <copyright>(C) Beechanels 2009, Lorea 2009-2013</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/beechat/migrate.php b/mod/beechat/migrate.php
new file mode 100644
index 000000000..20bee7973
--- /dev/null
+++ b/mod/beechat/migrate.php
@@ -0,0 +1,88 @@
+<?php
+require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
+
+global $CONFIG;
+admin_gatekeeper();
+
+// It's possible large upgrades could exceed the max execution time.
+set_time_limit(0);
+
+// get ejabberd db settings from elgg.
+$domain = elgg_get_plugin_setting("domain", "beechat");
+$dbname = elgg_get_plugin_setting("dbname", "beechat");
+$dbhost = elgg_get_plugin_setting("dbhost", "beechat");
+$dbuser = elgg_get_plugin_setting("dbuser", "beechat");
+$dbpassword = elgg_get_plugin_setting("dbpassword", "beechat");
+
+$jabber_domain = $domain;
+
+$dbh_elgg = null;
+$dbh_ejabberd = null;
+
+$dsn_elgg = 'mysql:dbname='.$CONFIG->dbname.';host='.$CONFIG->dbhost;
+$dsn_ejabberd = 'mysql:dbname='.$dbname.';host='.$dbhost;
+
+$dbprefix = $CONFIG->dbprefix;
+
+$user = $dbuser;
+$password = $dbpassword;
+
+$relationship_type = 'friend';
+
+$counter = 0;
+
+try {
+ $dbh_elgg = new PDO($dsn_elgg, $CONFIG->dbuser, $CONFIG->dbpass);
+
+ $sql = 'SELECT guid, name, username FROM '.$dbprefix.'users_entity';
+ $sth = $dbh_elgg->prepare($sql);
+ $sth->execute();
+
+ $users = array();
+ while ($row = $sth->fetch(PDO::FETCH_ASSOC))
+ $users[$row['guid']] = $row;
+
+ $sql = 'SELECT guid_one, guid_two FROM '.$dbprefix.'entity_relationships ';
+ $sql .= 'WHERE relationship = ?;';
+ $sth = $dbh_elgg->prepare($sql);
+
+ $sth->bindParam(1, $relationship_type);
+ $sth->execute();
+
+ $dbh_ejabberd = new PDO($dsn_ejabberd, $user, $password);
+ $dbh_ejabberd->beginTransaction();
+
+ while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
+ $sql = 'INSERT INTO rosterusers (username, jid, nick, subscription, ask, server, type) VALUES (?, ?, ?, ?, ?, ?, ?);';
+ $sth_ejabberd = $dbh_ejabberd->prepare($sql);
+
+
+ $username = $users[$row['guid_one']]['username'];
+ $jid = $users[$row['guid_two']]['username'] . '@' . $jabber_domain;
+ $nick = $users[$row['guid_two']]['name'];
+ $subscription = 'B';
+ $ask = 'N';
+ $server = 'N';
+ $type = 'item';
+
+ $sth_ejabberd->execute(array($username, $jid, $nick, $subscription, $ask, $server, $type));
+
+ $counter += 1;
+ if ($counter % 1000 == 0) {
+ //error_log( $username . ' registered ' . $jid . ' as a friend in his roster.' . "\n");
+ error_log("importing relations into jabber: $counter");
+ }
+ }
+
+ $dbh_ejabberd->commit();
+
+ $dbh_elgg = null;
+ $dbh_ejabberd = null;
+} catch (PDOException $e) {
+ if ($dbh_ejabberd != null)
+ $dbh_ejabberd->rollBack();
+ echo $e->getMessage();
+}
+?>
+
+
diff --git a/mod/beechat/migrategroups.php b/mod/beechat/migrategroups.php
new file mode 100644
index 000000000..4e3ef3f2b
--- /dev/null
+++ b/mod/beechat/migrategroups.php
@@ -0,0 +1,18 @@
+<?
+require_once(dirname(__FILE__) . "/lib.php");
+
+admin_gatekeeper();
+
+// groups disabled for now
+exit();
+
+$groups = elgg_get_entities(array('types'=>'group','limit'=>0));
+elgg_set_ignore_access(true);
+foreach($groups as $group) {
+ echo "migrating " . $group->name . "<br/>";
+ ejabberd_create_group($group);
+}
+echo "done!";
+elgg_set_ignore_access(false);
+
+?>
diff --git a/mod/beechat/sounds/newmessage.wav b/mod/beechat/sounds/newmessage.wav
new file mode 100644
index 000000000..58cccd0e6
--- /dev/null
+++ b/mod/beechat/sounds/newmessage.wav
Binary files differ
diff --git a/mod/beechat/start.php b/mod/beechat/start.php
new file mode 100644
index 000000000..4e4e4bb40
--- /dev/null
+++ b/mod/beechat/start.php
@@ -0,0 +1,184 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+ GLOBAL $CONFIG;
+
+ function beechat_create_group($event, $object_type, $object)
+ {
+ elgg_load_library('elgg:beechat');
+ ejabberd_create_group($object);
+ }
+
+ function beechat_delete_group($event, $object_type, $object)
+ {
+ elgg_load_library('elgg:beechat');
+ ejabberd_destroy_group($object);
+ }
+
+ function beechat_member_add($event, $object_type, $object)
+ {
+ if ($object->relationship === "member") {
+ elgg_load_library('elgg:beechat');
+ $user = get_entity($object->guid_one);
+ $group = get_entity($object->guid_two);
+ $room = new EjabberdMucRoom($group);
+ $room->addMember($user);
+ }
+ }
+
+ function beechat_member_delete($event, $object_type, $object)
+ {
+ if ($object->relationship === "member") {
+ elgg_load_library('elgg:beechat');
+ $user = get_entity($object->guid_one);
+ $group = get_entity($object->guid_two);
+ $room = new EjabberdMucRoom($group);
+ $room->setAffiliation($user, "none");
+ }
+ }
+
+ function beechat_init()
+ {
+ $pluginspath = elgg_get_plugins_path();
+ elgg_register_library('elgg:beechat', $pluginspath . 'beechat/lib/beechat.php');
+
+ elgg_register_event_handler('pagesetup', 'system', 'beechat_pagesetup');
+ // group actions disabled for now
+ /*if (elgg_get_plugin_setting("groupdomain", "beechat")) {
+ register_elgg_event_handler('create', 'group', 'beechat_create_group');
+ register_elgg_event_handler('delete', 'group', 'beechat_delete_group');
+ }
+ register_elgg_event_handler('create', 'member', 'beechat_member_add');
+ register_elgg_event_handler('delete', 'relationship', 'beechat_member_delete');*/
+
+
+ $actions_path = $pluginspath . 'beechat/actions/';
+ //elgg_register_action('beechat/join_groupchat', $actions_path . 'join_groupchat.php');
+ //elgg_register_action('beechat/leave_groupchat', $actions_path . 'leave_groupchat.php');
+ elgg_register_action('beechat/get_statuses', $actions_path . 'get_statuses.php');
+ elgg_register_action('beechat/get_icons', $actions_path . 'get_icons.php');
+ elgg_register_action('beechat/get_details', $actions_path . 'get_details.php');
+ elgg_register_action('beechat/get_connection', $actions_path . 'get_connection.php');
+ elgg_register_action('beechat/get_state', $actions_path . 'get_state.php');
+ elgg_register_action('beechat/save_state', $actions_path . 'save_state.php');
+
+ /*register_elgg_event_handler('create', 'friendrequest', 'beechat_xmpp_add_friendx');
+ #register_plugin_hook('action', 'friends/add', 'beechat_xmpp_add_friend', 1000);
+ register_plugin_hook('river_update', 'river_update', 'beechat_xmpp_approve_friendx');
+ register_plugin_hook('river_update_foreign', 'river_update', 'beechat_xmpp_approve_friendx');
+ #register_plugin_hook('action', 'friendrequest/approve', 'beechat_xmpp_approve_friend', 1000);
+
+
+ register_plugin_hook('action', 'friendrequest/decline', 'beechat_xmpp_decline_friend', 1000);
+ register_plugin_hook('action', 'friends/remove', 'beechat_xmpp_remove_friend', 1000);*/
+
+ // new friend sync
+ elgg_register_event_handler('delete', 'friend', array('BeechatSync', 'onFriendDelete'));
+ //elgg_register_event_handler('create', 'friendrequest', array('BeechatSync', 'onFriendCreate'));
+ elgg_register_event_handler('delete', 'friendrequest', array('BeechatSync', 'onFriendDelete'));
+
+
+
+ elgg_extend_view('js/initialise_elgg', 'js/json2.js');
+ elgg_extend_view('js/initialise_elgg', 'js/jquery.cookie.min.js');
+ elgg_extend_view('js/initialise_elgg', 'js/jquery.scrollTo-min.js');
+ elgg_extend_view('js/initialise_elgg', 'js/jquery.serialScroll-min.js');
+ elgg_extend_view('js/initialise_elgg', 'js/b64.js');
+ elgg_extend_view('js/initialise_elgg', 'js/sha1.js');
+ elgg_extend_view('js/initialise_elgg', 'js/md5.js');
+ elgg_extend_view('js/initialise_elgg', 'js/strophe.min.js');
+ elgg_extend_view('js/initialise_elgg', 'js/strophe.muc.js');
+ elgg_extend_view('js/initialise_elgg', 'js/jquery.tools.min.js');
+ elgg_extend_view('css', 'beechat/screen.css');
+ elgg_extend_view('js/initialise_elgg', 'beechat/beechat.js');
+ elgg_extend_view('page/elements/head', 'beechat/beechat.userjs');
+
+ elgg_extend_view('page/elements/foot', 'beechat/beechat');
+
+ $domain = elgg_get_plugin_setting("domain", "beechat");
+ //$group_domain = elgg_get_plugin_setting("groupdomain", "beechat");
+ /*$dbname = elgg_get_plugin_setting("dbname", "beechat");
+ $dbhost = elgg_get_plugin_setting("dbhost", "beechat");
+ $dbuser = elgg_get_plugin_setting("dbuser", "beechat");
+ $dbpassword = elgg_get_plugin_setting("dbpassword", "beechat");*/
+
+ global $CONFIG;
+ $CONFIG->chatsettings['domain'] = $domain;
+ //$CONFIG->chatsettings['groupdomain'] = $group_domain;
+
+ register_notification_handler('xmpp', 'beechat_notifications');
+ // register_plugin_hook('notify:entity:message','object','beechat_notifications_msg');
+ }
+
+ function beechat_notifications($from, $to, $subject, $topic, $params = array()) {
+ ejabberd_send_chat($to, "<div>".$topic."</div>");
+ }
+
+
+ function beechat_friendly_title($title) {
+ // need this because otherwise seems elgg
+ // gets in some problem trying to call the view
+ //$title = iconv('UTF-8', 'ASCII//TRANSLIT', $title);
+ $title = preg_replace("/[^\w ]/","",$title);
+ $title = str_replace(" ","-",$title);
+ $title = str_replace("--","-",$title);
+ $title = trim($title);
+ $title = strtolower($title);
+ return $title;
+ }
+
+ function beechat_pagesetup()
+ {
+ global $CONFIG;
+ /*if (elgg_get_context() == 'group_profile' && elgg_is_logged_in()) {
+ if (elgg_get_plugin_setting("groupdomain", "beechat")) {
+ $user = elgg_get_logged_in_user_entity();
+ $group = elgg_get_page_owner_entity();
+ if (!$group || !($group instanceof ElggGroup))
+ return;
+ if ($user->chatenabled && elgg_get_plugin_setting("groupdomain", "beechat")) {
+ if ($group->isPublicMembership() || $group->isMember($user)) {
+ $item = new ElggMenuItem('chatroom', elgg_echo('beechat:chatroom'), "javascript:g_beechat_user.joinRoom('".beechat_friendly_title($group->name)."@".$CONFIG->chatsettings['groupdomain']."', '".$group->guid."')");
+ elgg_register_menu_item('page', 'item');
+ }
+ }
+ }
+ }
+ else*/if (elgg_get_context() == 'settings' && elgg_is_logged_in()) {
+ $is_enabled = elgg_get_logged_in_user_entity()->chatenabled;
+ $action = $is_enabled ? 'disable' : 'enable';
+ elgg_register_menu_item('page', array(
+ 'name' => 'beechat',
+ 'text'=> elgg_echo("beechat:{$action}chat"),
+ 'href' => $CONFIG->wwwroot . "mod/beechat/{$action}chat.php",
+ ));
+ }
+ }
+
+
+ function ejabberd_send_chat($user, $body) { // $user adds $friend
+ $from = 'notify@'.elgg_get_plugin_setting("domain", "beechat").'/net';
+ if ($user->alias) {
+
+ }
+ elgg_load_library('elgg:beechat');
+ $to = ejabberd_getjid($user, true);
+ //xmlrpc_set_type(&$body, "base64");
+ $param = array("body" => $body,
+ "from" => $from,
+ "to" => $to);
+ ejabberd_xmlrpc_command('send_html_message', $param);
+ }
+
+
+
+
+elgg_register_event_handler('init', 'system', 'beechat_init');
diff --git a/mod/beechat/views/default/beechat/beechat.js.php b/mod/beechat/views/default/beechat/beechat.js.php
new file mode 100644
index 000000000..09f4e8852
--- /dev/null
+++ b/mod/beechat/views/default/beechat/beechat.js.php
@@ -0,0 +1,2498 @@
+/**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+/** Globals
+ *
+ */
+g_beechat_user = null;
+g_beechat_roster_items = null;
+g_beechat_rooms = new Array();
+
+function debugXMPP(msg) {
+ try {
+ //console.log(msg)
+ }
+ catch (err) {
+ }
+ //$('#layout_footer').html($('#layout_footer').html()+'<br/>'+msg);
+}
+
+/** Class: BeeChat
+ * An object container for all BeeChat mod functions
+ *
+ */
+BeeChat = {
+ BOSH_SERVICE: '/http-bind/',
+ DOMAIN: '<?php echo $vars['config']->chatsettings['domain'] ?>',
+ RESOURCE: 'beebac',
+ INACTIVITY_PERIOD_LENGTH: 60,
+
+ NS: {
+ CHAT_STATES: 'http://jabber.org/protocol/chatstates'
+ },
+
+ Message: {
+ Types: {
+ NORMAL: 'normal',
+ CHAT: 'chat',
+ GROUPCHAT: 'groupchat',
+ HEADLINE: 'headline',
+ ERROR: 'error'
+ },
+
+ ChatStates: {
+ COMPOSING: 'composing',
+ PAUSED: 'paused',
+ ACTIVE: 'active',
+ INACTIVE: 'inactive',
+ GONE: 'gone'
+ }
+ },
+
+ IQ: {
+ Types: {
+ GET: 'get',
+ RESULT: 'result',
+ SET: 'set',
+ ERROR: 'error'
+ }
+ },
+
+ Presence: {
+ Types: {
+ UNAVAILABLE: 'unavailable',
+ SUBSCRIBE: 'subscribe',
+ SUBSCRIBED: 'subscribed',
+ UNSUBSCRIBE: 'unsubscribe',
+ UNSUBSCRIBED: 'unsubscribed',
+ PROBE: 'probe',
+ ERROR: 'error'
+ },
+
+ ChildElements: {
+ SHOW: 'show',
+ STATUS: 'status',
+ PRIORITY: 'priority'
+ },
+
+ ShowElements: {
+ CHAT: 'chat',
+ DND: 'dnd',
+ AWAY: 'away',
+ XA: 'xa'
+ }
+ },
+
+ Roster: {
+ DEFAULT_GROUP: 'Contacts'
+ },
+
+
+ Events: {
+ Identifiers: {
+ UPDATE_CONNECTION_STATE: 0,
+ UPDATE_ROSTER: 1,
+ RECV_PRESENCE: 2,
+ RECV_CHAT_MESSAGE: 3
+ },
+ Messages: {
+ ConnectionStates: {
+ CONNECTING: "<?php echo elgg_echo('beechat:connection:state:connecting'); ?>",
+ AUTHENTICATING: "<?php echo elgg_echo('beechat:connection:state:authenticating'); ?>",
+ FAILED: "<?php echo elgg_echo('beechat:connection:state:failed'); ?>",
+ DISCONNECTING: "<?php echo elgg_echo('beechat:connection:state:disconnecting'); ?>",
+ OFFLINE: "<?php echo elgg_echo('beechat:connection:state:offline'); ?>",
+ ONLINE: "<?php echo elgg_echo('beechat:connection:state:online'); ?>"
+ }
+ }
+ }
+};
+
+
+/** Class: BeeChat.Core
+ * An object container for all BeeChat Core functions
+ *
+ */
+BeeChat.Core = {
+ ReferenceTables: {
+ AvailabilityRates: {
+ AVAILABLE: 0,
+ ONLINE: 0,
+ CHAT: 0,
+ DND: 1,
+ AWAY: 2,
+ XA: 3,
+ UNAVAILABLE: 10,
+ OFFLINE: 10
+ }
+ }
+};
+
+
+/** Class: BeeChat.Core.User
+ * Create a BeeChat.Core.User object
+ *
+ * Parameters:
+ * (String) jid - The user's jabber id
+ *
+ * Returns:
+ * A new BeeChat.Core.User.
+ */
+BeeChat.Core.User = function(jid)
+{
+ if (!(this instanceof arguments.callee))
+ return new BeeChat.Core.User(jid);
+
+ /** Private members
+ *
+ */
+ var _connection = null;
+ var _attached = false;
+ var _initialized = false;
+ var _jid = null;
+ var _roster = null;
+ var _msgTemp = [];
+ var _funcs = [];
+
+ /** Constructor
+ *
+ */
+ this.init = function(jid)
+ {
+ _jid = jid;
+ _roster = new BeeChat.Core.Roster();
+ }
+
+ /** Accessors
+ *
+ */
+ this.getConnection = function()
+ {
+ return _connection;
+ }
+
+ this.getJid = function()
+ {
+ return _jid;
+ }
+
+ this.getRoster = function()
+ {
+ return _roster;
+ }
+
+ this.isAttached = function()
+ {
+ return _attached;
+ }
+
+ this.isInitialized = function()
+ {
+ return _initialized;
+ }
+
+ /** Mutators
+ *
+ */
+ this.setInitialized = function(isInitialized)
+ {
+ _initialized = isInitialized;
+ }
+
+ /** Function: addObserver
+ * Add an observer for a specified type of event
+ *
+ * Parameters:
+ * (BeeChat.Events.Identifiers) eventType - The type of event to observer
+ * (Object) pFunc - A function to call when the event will be triggered
+ */
+ this.addObserver = function(eventType, pFunc)
+ {
+ if (jQuery.inArray(pFunc, _funcs) == -1) {
+ if (!_funcs[eventType])
+ _funcs[eventType] = [];
+ _funcs[eventType].push(pFunc);
+ }
+ }
+
+ /** Function: removeObserver
+ * Remove an observer
+ *
+ * Parameters:
+ * (Object) pFunc - The registered function
+ */
+ this.removeObserver = function(pFunc)
+ {
+ var index = null;
+
+ for (var key in _funcs) {
+ if (typeof _funcs[key] != 'object')
+ continue;
+ if ((index = jQuery.inArray(pFunc, _funcs[key])) != -1)
+ _funcs.splice(index, 1);
+ }
+ }
+
+ /** Function: connect
+ * Connect the user to the BOSH service
+ *
+ * Parameters:
+ * (String) password - The user's password
+ *
+ */
+ this.connect = function(password)
+ {
+ debugXMPP('connect');
+ if (_connection == null)
+ _connection = new Strophe.Connection(BeeChat.BOSH_SERVICE);
+ _connection.connect(_jid, password, _onConnect);
+ }
+
+ /** Function: attach
+ * Attach user's connection to an existing XMPP session
+ *
+ * Parameters:
+ * (String) sid - The SID of the existing XMPP session
+ * (String) rid - The RID of the existing XMPP session
+ */
+ this.attach = function(sid, rid)
+ {
+ if (_connection == null) {
+ _connection = new Strophe.Connection(BeeChat.BOSH_SERVICE);
+ }
+ _connection.attach(_jid, sid, rid, _onConnect);
+ _attached = true;
+ _onConnect(Strophe.Status.CONNECTED);
+ }
+
+ /** Function: disconnect
+ * Disconnect the user from the BOSH service
+ *
+ */
+ this.disconnect = function()
+ {
+ debugXMPP('disconnect');
+ if (_connection != null) {
+ _connection.disconnect();
+ _connection = null;
+ }
+ }
+
+ /** Function: requestSessionPause
+ * Request a session pause to the server connection manager
+ *
+ */
+ this.requestSessionPause = function()
+ {
+ var req = $build('body', {
+ rid: _connection.rid,
+ sid: _connection.sid,
+ pause: BeeChat.INACTIVITY_PERIOD_LENGTH,
+ xmlns: Strophe.NS.HTTPBIND
+ });
+
+ _attached = false;
+ _connection.send(req.tree());
+ }
+
+ /** Function: requestRoster
+ * Request a new roster to the server
+ *
+ */
+ this.requestRoster = function()
+ {
+ var req = $iq({from: _jid, type: BeeChat.IQ.Types.GET})
+ .c('query', {xmlns: Strophe.NS.ROSTER});
+
+ _connection.send(req.tree());
+ }
+
+ /** Function: sendInitialPresence
+ * Send initial presence to the server in order to signal availability for communications
+ *
+ */
+ this.sendInitialPresence = function()
+ {
+ _connection.send($pres().tree());
+ _initialized = true;
+ }
+
+ /** Function: sendChatMessage
+ * Send a chat message to the server
+ *
+ * Parameters:
+ * (String) addressee - The addressee of the chat message
+ * (String) msg - The chat message
+ *
+ */
+ this.sendChatMessage = function(addressee, msg, msgtype)
+ {
+ if (msgtype == null)
+ msgtype = BeeChat.Message.Types.CHAT;
+ var req = $msg({
+ type: msgtype,
+ to: addressee,
+ from: _connection.jid
+ }).c('body').t(msg).up().c(BeeChat.Message.ChatStates.ACTIVE, {xmlns: BeeChat.NS.CHAT_STATES});
+
+ _connection.send(req.tree());
+ }
+
+ /** Function: sendChatStateMessage
+ * Send a chat state message to the server
+ *
+ * Parameters:
+ * (String) addressee - The addressee of the chat state message
+ * (BeeChat.Message.ChatsState) state - The chat state that will be send
+ *
+ */
+ this.sendChatStateMessage = function(addressee, state)
+ {
+ var req = $msg({
+ type: BeeChat.Message.Types.CHAT,
+ to: addressee,
+ from: _connection.jid
+ }).c(state, {xmlns: BeeChat.NS.CHAT_STATES});
+
+ _connection.send(req.tree());
+ }
+
+ /** Function: sendPresenceAvailabiliy
+ * Send a detailed presence stanza to the server
+ *
+ * Parameters:
+ * (BeeChat.Presence.ShowElements) availability - The availability status
+ * (String) details - Detailed status information
+ *
+ */
+ this.sendPresenceAvailability = function(availability, details)
+ {
+ var req = $pres()
+ .c(BeeChat.Presence.ChildElements.SHOW).t(availability).up()
+ .c(BeeChat.Presence.ChildElements.STATUS).t(details).up()
+ .c(BeeChat.Presence.ChildElements.PRIORITY).t('1');
+
+ _connection.send(req.tree());
+ }
+
+ /** PrivateFunction: _fire
+ * Triggers registered funcs of registered observers for a specified type of event
+ *
+ */
+ function _fire(eventType, data, scope)
+ {
+ if (_funcs[eventType] != undefined) {
+ for (var i = 0; i < _funcs[eventType].length; i++)
+ _funcs[eventType][i].call((scope || window), data);
+ }
+ }
+ this.joinRoom = function(roomname, room_guid) {
+ var roomJid = roomname;
+ _connection['muc'].join(roomJid, BeeChat.UI.Resources.Strings.ChatMessages.SELF, false, false, '');
+ if (!(roomJid in g_beechat_rooms)) {
+ g_beechat_rooms[roomJid] = room_guid;
+ $.ajax({
+ url: BeeChat.UI.addActionTokens('<?php echo $vars['url'] . "action/beechat/join_groupchat?group_guid="; ?>'+room_guid, '&'),
+ async: true });
+ }
+
+
+ }
+
+ this.reconnectRooms = function() {
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children().each(function() {
+ if (roomJid in g_beechat_rooms)
+ delete g_beechat_rooms[roomJid];
+ var contactBareJid = $(this).attr('bareJid');
+ var isroom = ($(this).attr('isroom')=='true')?true:false;
+ if (isroom) {
+ _connection['muc'].join(contactBareJid, BeeChat.UI.Resources.Strings.ChatMessages.SELF, false, false, '');
+ }
+ });
+ }
+
+ this.leaveRoom = function(roomJid) {
+ if (roomJid in g_beechat_rooms) {
+ $.ajax({
+ url: BeeChat.UI.addActionTokens('<?php echo $vars['url'] . "action/beechat/leave_groupchat?group_guid="; ?>'+g_beechat_rooms[roomJid], '&'),
+ async: true });
+
+ }
+ _connection['muc'].leave(roomJid, BeeChat.UI.Resources.Strings.ChatMessages.SELF, function(){});
+ }
+
+ /** PrivateFunction: _onConnect
+ * Connection state manager
+ *
+ * Parameters:
+ * (Strophe.Status) status - A Strophe connection status constant
+ *
+ */
+ function _onConnect(status)
+ {
+ var msg = null;
+
+ if (status == Strophe.Status.CONNECTING)
+{
+ msg = BeeChat.Events.Messages.ConnectionStates.CONNECTING;
+ }
+ else if (status == Strophe.Status.AUTHENTICATING) {
+ msg = BeeChat.Events.Messages.ConnectionStates.AUTHENTICATING;
+ }
+ else if (status == Strophe.Status.AUTHFAIL)
+ msg = BeeChat.Events.Messages.ConnectionStates.FAILED;
+ else if (status == Strophe.Status.CONNFAIL)
+ msg = BeeChat.Events.Messages.ConnectionStates.FAILED;
+ else if (status == Strophe.Status.DISCONNECTING)
+ msg = BeeChat.Events.Messages.ConnectionStates.DISCONNECTING;
+ else if (status == Strophe.Status.DISCONNECTED)
+ msg = BeeChat.Events.Messages.ConnectionStates.OFFLINE;
+ else if (status == Strophe.Status.CONNECTED) {
+ msg = BeeChat.Events.Messages.ConnectionStates.ONLINE;
+ _connection.addHandler(_onIQResult, null, 'iq', BeeChat.IQ.Types.RESULT, null, null);
+ _connection.addHandler(_onPresence, null, 'presence', null, null, null);
+ _connection.addHandler(_onMessageChat, null, 'message', BeeChat.Message.Types.CHAT, null, null);
+ _connection.addHandler(_onMessageChatRoom, null, 'message', BeeChat.Message.Types.GROUPCHAT, null, null);
+ }
+
+ _fire(BeeChat.Events.Identifiers.UPDATE_CONNECTION_STATE, msg);
+ }
+
+ /** PrivateFunction: _onIQResult
+ * Manage received IQ stanza of 'result' type
+ *
+ * Parameters:
+ * (XMLElement) iq - The iq stanza received
+ *
+ */
+ function _onIQResult(iq)
+ {
+ _roster.updateFromIQResult(iq);
+ _fire(BeeChat.Events.Identifiers.UPDATE_ROSTER, _roster.getItems());
+
+ return true;
+ }
+
+ /** PrivateFunction: _onPresence
+ * Manage received presence stanza
+ *
+ * Parameters:
+ * (XMLElement) presence - The presence stanza received
+ *
+ */
+ function _onPresence(presence)
+ {
+ var xquery = presence.getElementsByTagName("x");
+ debugXMPP('_onPresence'+xquery);
+ if (xquery.length > 0)
+ {
+ //Ignore MUC user protocol
+ for (var i = 0; i < xquery.length; i++)
+ {
+ var xmlns = xquery[i].getAttribute("xmlns");
+ if (xmlns && xmlns.match(Strophe.NS.MUC + '#user'))
+ {
+ var contactBareJid = $(presence).attr('from').split('/')[0];
+ var userNick = $(presence).attr('from').split('/')[1];
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+ if ($(presence).attr('type') != 'unavailable') {
+ BeeChat.UI.ChatBoxes.updateRoster(contactBareJid, userNick, presence);
+ }
+ else {
+ if (chatBoxElm.length) {
+ BeeChat.UI.ChatBoxes.updateRoster(contactBareJid, userNick, presence);
+ }
+ }
+ return true;
+ }
+
+ if (xmlns && xmlns.match(Strophe.NS.MUC))
+ {
+ var contactBareJid = $(presence).attr('from').split('/')[0];
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+
+ if ($(presence).attr('type') != 'unavailable' && $(presence).attr('type') != 'error') {
+ if (chatBoxElm.length == 0) {
+ BeeChat.UI.ScrollBoxes.add(contactBareJid);
+ }
+ }
+ return true;
+ }
+
+ }
+ }
+
+ if (Strophe.getBareJidFromJid($(presence).attr('from')).toLowerCase() != Strophe.getBareJidFromJid(_jid).toLowerCase()) {
+ _roster.updateFromPresence(presence);
+ }
+ _fire(BeeChat.Events.Identifiers.RECV_PRESENCE, _roster.getOnlineItems());
+ return true;
+ }
+
+ /** PrivateFunction: _onMessageChat
+ * Manage received message stanza of 'chat' type
+ *
+ * Parameters:
+ * (XMLElement) message - The message stanza received
+ *
+ */
+ function _onMessageChatRoom(message)
+ {
+ var roomJid = $(message).attr('from').split('/');
+
+// BeeChat.UI.ChatBoxes.updateChatState($(message).attr('from'), message);
+ BeeChat.UI.ChatBoxes.update(roomJid[0], roomJid[1], Strophe.getText($(message).find('body')[0]), true);
+
+ return true;
+ }
+
+ function _onMessageChat(message)
+ {
+ var data = {
+ contactBareJid: Strophe.getBareJidFromJid($(message).attr('from')),
+ msg: message
+ };
+ _msgTemp.push(data);
+ //alert("message");
+ if (_initialized == true) {
+ for (var key in _msgTemp) {
+ if (typeof _msgTemp[key] != 'object')
+ continue;
+ _fire(BeeChat.Events.Identifiers.RECV_CHAT_MESSAGE, _msgTemp[key]);
+ _msgTemp.shift();
+ }
+ }
+
+ return true;
+ }
+
+ this.init(jid);
+};
+
+
+/** Constructor: BeeChat.Core.Roster
+ * Create a BeeChat.Core.Roster object
+ *
+ * Parameters:
+ * (Object) items - The roster's items in object notation
+ *
+ * Returns:
+ * A new BeeChat.Core.Roster.
+ */
+BeeChat.Core.Roster = function()
+{
+ if (!(this instanceof arguments.callee))
+ return new BeeChat.Core.Roster();
+
+ /** Private members
+ *
+ */
+ _items = null;
+
+
+ /** Constructor
+ *
+ */
+ this.init = function()
+ {
+ _items = (arguments.length > 0) ? arguments[0] : {};
+ }
+
+ /** Accessors
+ *
+ */
+ this.getItems = function()
+ {
+ return _items;
+ }
+
+ /** Mutators
+ *
+ */
+ this.setItems = function(items)
+ {
+ for (var key in items) {
+ _items[key] = new BeeChat.Core.RosterItem(items[key]);
+ var contactBareJid = items[key].bareJid;
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+ var status = items[key].status;
+ /*if (status != 'unavailable' && status != 'error') {
+ if (chatBoxElm.length == 0) {
+ BeeChat.UI.ScrollBoxes.add(contactBareJid);
+ }
+ }*/
+
+ }
+ }
+
+ this.setIcons = function(icons)
+ {
+ if (_items) {
+ for (var key in icons) {
+ if (_items[key]) {
+ _items[key].icon_small = icons[key].small;
+ _items[key].icon_tiny = icons[key].tiny;
+ }
+ }
+ }
+ }
+
+ this.setStatuses = function(statuses)
+ {
+ if (_items) {
+ for (var key in statuses) {
+ if (_items[key]) {
+ _items[key].status = statuses[key];
+ }
+ }
+ }
+ }
+
+ /** Function: updateFromIQResult
+ * Update the roster items from an IQ result stanza
+ *
+ * Parameters:
+ * (XMLElement) iq - The IQ result stanza
+ */
+ this.updateFromIQResult = function(iq)
+ {
+ $(iq).find('item').each(function() {
+ var attr = {
+ bareJid: Strophe.getBareJidFromJid($(this).attr('jid')).toLowerCase(),
+ name: $(this).attr('name'),
+ subscription: $(this).attr('subscription'),
+ groups: [],
+ presences: {}
+ };
+
+ $(this).find('group').each(function() {
+ attr['groups'].push($(this).text());
+ });
+
+ if (attr['groups'].length == 0)
+ attr['groups'].push(BeeChat.Roster.DEFAULT_GROUP);
+
+ if (!_items[attr.bareJid])
+ _items[attr.bareJid] = new BeeChat.Core.RosterItem(attr);
+ else {
+ _items[attr.bareJid].bareJid = attr.bareJid;
+ _items[attr.bareJid].name = attr.name;
+ _items[attr.bareJid].subscription = attr.subscription;
+ _items[attr.bareJid].groups = attr.groups;
+ }
+ });
+ }
+
+ /** Function: updateFromPresence
+ * Update the roster items from a presence stanza
+ *
+ * Parameters:
+ * (XMLElement) presence - The presence stanza
+ *
+ * Returns:
+ * (String) The bare jid of the roster item who updated his presence
+ */
+ this.updateFromPresence = function(presence)
+ {
+ var jid = $(presence).attr('from').toLowerCase();
+ var attr = {
+ bareJid: Strophe.getBareJidFromJid(jid),
+ name: null,
+ subscription: null,
+ groups: null,
+ presences: {}
+ };
+
+ attr.presences[jid] = {};
+ attr.presences[jid].type = (!$(presence).attr('type')) ? 'available' : $(presence).attr('type');
+ //alert($(presence).attr('from')+presence.toString());
+ //alert("presencetype"+attr.presences[jid].type);
+
+ if (attr.presences[jid].type == 'available') {
+ $(presence).children().each(function() {
+ if (this.tagName == BeeChat.Presence.ChildElements.SHOW)
+ attr.presences[jid].show = $(this).text();
+ if (this.tagName == BeeChat.Presence.ChildElements.STATUS)
+ attr.presences[jid].status = $(this).text();
+ });
+
+ if (!attr.presences[jid].show)
+ attr.presences[jid].show = 'chat';
+ } else {
+ attr.presences[jid].show = 'offline';
+ }
+
+ if (!_items[attr.bareJid])
+ _items[attr.bareJid] = new BeeChat.Core.RosterItem(attr);
+ else
+ _items[attr.bareJid].presences[jid] = attr.presences[jid];
+ }
+
+ /** Function: getOnlineItems
+ *
+ *
+ */
+ this.getOnlineItems = function()
+ {
+ var sortedOnlineBareJid = [];
+ var sortedOnlineItems = {};
+
+ for (var key in _items) {
+ if (typeof _items[key] != 'object')
+ continue;
+
+ var pres = _items[key].getStrongestPresence();
+
+ if (pres != null && pres.type == 'available') {
+ sortedOnlineBareJid.push(key);
+ }
+ }
+
+ if (sortedOnlineBareJid.length > 1) {
+ sortedOnlineBareJid.sort();
+ sortedOnlineBareJid.sort(statusSort);
+ }
+
+ for (var key in sortedOnlineBareJid) {
+ sortedOnlineItems[sortedOnlineBareJid[key]] = _items[sortedOnlineBareJid[key]];
+ }
+
+ return (sortedOnlineItems);
+ }
+
+ /** Function: getSizeOnlineItems
+ * Return the number of available items
+ *
+ * Returns:
+ * (int) The number of available items
+ */
+ this.getSizeOnlineItems = function()
+ {
+ var n = 0;
+
+ for (var key in _items) {
+ if (typeof _items[key] != 'object')
+ continue;
+
+ var pres = _items[key].getStrongestPresence();
+
+ if (pres != null && pres.type == 'available')
+ ++n;
+ }
+ return (n);
+ }
+
+ /** Function: getItemsUsernamesAsList
+ *
+ */
+ this.getItemsUsernamesAsList = function()
+ {
+ var data = '';
+
+ for (var key in _items) {
+ if (typeof _items[key] != 'object')
+ continue;
+ data = data + Strophe.getBareJidFromJid(key) + ',';
+ // data = data + Strophe.getNodeFromJid(key) + ',';
+ }
+
+ return (data);
+ }
+
+ /** PrivateFunction: statusSort
+ *
+ */
+ function statusSort(x, y)
+ {
+ var xPres = _items[x].getStrongestPresence();
+ var yPres = _items[y].getStrongestPresence();
+
+ if (xPres != null && yPres != null)
+ return (BeeChat.Core.Roster.Utils.comparePresences(xPres, yPres));
+ return (0);
+ }
+
+ this.init();
+};
+
+BeeChat.Core.Roster.Utils = {
+
+ /** Function: comparePresences
+ * Compare the two presences x and y
+ *
+ * Parameters:
+ * (Object) xPres - The x presence in object notation
+ * (Object) yPres - The y presence in object notation
+ *
+ * Returns:
+ * 0 if presence are equal, 1 if x > y, -1 if y > x
+ *
+ * Note:
+ * Presences are tagged in the following order:
+ * ONLINE < DND < AWAY < XA < OFFLINE
+ *
+ */
+ comparePresences: function(xPres, yPres)
+ {
+ var xRate = 0;
+ var yRate = 0;
+
+ if (xPres.type == 'unavailable')
+ xRate += BeeChat.Core.ReferenceTables.AvailabilityRates[xPres.type.toUpperCase()];
+ if (yPres.type == 'unavailable')
+ yRate += BeeChat.Core.ReferenceTables.AvailabilityRates[yPres.type.toUpperCase()];
+
+ if (xPres.show != null)
+ xRate += BeeChat.Core.ReferenceTables.AvailabilityRates[xPres.show.toUpperCase()];
+ if (yPres.show != null)
+ yRate =+ BeeChat.Core.ReferenceTables.AvailabilityRates[yPres.show.toUpperCase()];
+
+ if (xRate > yRate)
+ return (1);
+ else if (xRate == yRate)
+ return (0);
+ return (-1);
+ }
+};
+
+
+/** Constructor: BeeChat.Core.RosterItem
+ * Create a BeeChat.Core.RosterItem object
+ *
+ * Parameters:
+ * (Object) attr - The RosterItem's attributes in object notation
+ *
+ * Returns:
+ * A new BeeChat.Core.RosterItem.
+ */
+BeeChat.Core.RosterItem = function()
+{
+ this.bareJid = (arguments.length > 0) ? arguments[0].bareJid : null;
+ this.name = (arguments.length > 0) ? arguments[0].name : null;
+ this.subscription = (arguments.length > 0) ? arguments[0].subscription : null;
+ this.groups = (arguments.length > 0) ? arguments[0].groups : null;
+ this.presences = (arguments.length > 0) ? arguments[0].presences : null;
+ this.icon_small = (arguments.length > 0) ? arguments[0].icon_small : null;
+ this.icon_tiny = (arguments.length > 0) ? arguments[0].icon_tiny : null;
+ this.status = (arguments.length > 0) ? arguments[0].status : null;
+};
+BeeChat.Core.RosterItem.prototype = {
+ /** Function: getStrongestPresence
+ * Return the strongest presence of the RosterItem
+ *
+ */
+ getStrongestPresence: function()
+ {
+ var res = null;
+
+ for (var key in this.presences) {
+ if (typeof this.presences[key] != 'object')
+ continue;
+ if (res == null)
+ res = this.presences[key];
+ else
+ if (BeeChat.Core.Roster.Utils.comparePresences(this.presences[key], res) == -1)
+ res = this.presences[key];
+ }
+ return (res);
+ }
+};
+
+
+/** Class: BeeChat.UI
+ * An object container for all BeeChat UI functions
+ *
+ */
+BeeChat.UI = {
+ HAS_FOCUS: true,
+
+ Resources: {
+ Paths: {
+ ICONS: '<?php echo $vars['config']->url; ?>mod/beechat/graphics/icons/',
+ MEMBER_PROFILE: '<?php echo $vars['url']; ?>profile/'
+ },
+
+ Sounds: {
+ NEW_MESSAGE: 'beechat_sounds_new_message'
+ },
+
+ /*
+ Cookies: {
+ DOMAIN: 'beechannels.com',
+ FILENAME_CONN: 'beechat_conn'
+ },
+ */
+
+ Emoticons: {
+ FILENAME_SMILE: 'emoticon_smile.png',
+ FILENAME_UNHAPPY: 'emoticon_unhappy.png',
+ FILENAME_GRIN: 'emoticon_grin.png',
+ FILENAME_EVILGRIN: 'emoticon_evilgrin.png',
+ FILENAME_SURPRISED: 'emoticon_surprised.png',
+ FILENAME_TONGUE: 'emoticon_tongue.png',
+ FILENAME_WINK: 'emoticon_wink.png'
+ },
+
+ Strings: {
+ Availability: {
+ AVAILABLE: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ CHAT: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ ONLINE: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ DND: "<?php echo elgg_echo('beechat:availability:dnd'); ?>",
+ AWAY: "<?php echo elgg_echo('beechat:availability:away'); ?>",
+ XA:"<?php echo elgg_echo('beechat:availability:xa'); ?>",
+ OFFLINE: "<?php echo elgg_echo('beechat:availability:offline'); ?>"
+ },
+
+ Contacts: {
+ BUTTON: "<?php echo elgg_echo('beechat:contacts:button'); ?>"
+ },
+
+ ChatMessages: {
+ SELF: "<?php echo $_SESSION['user']->name; ?>",
+ COMPOSING: "<?php echo elgg_echo('beechat:chat:composing'); ?>"
+ },
+
+ Box: {
+ MINIMIZE: "<?php echo elgg_echo('beechat:box:minimize'); ?>",
+ CLOSE: "<?php echo elgg_echo('beechat:box:close'); ?>",
+ SHOWHIDE: "<?php echo elgg_echo('beechat:box:showhide'); ?>"
+ }
+ },
+
+ StyleClasses: {
+ Availability: {
+ Left: {
+ ONLINE: 'beechat_left_availability_chat',
+ DND: 'beechat_left_availability_dnd',
+ AWAY: 'beechat_left_availability_away',
+ XA: 'beechat_left_availability_xa',
+ OFFLINE: 'beechat_left_availability_offline',
+ ROOM: 'beechat_left_availability_room'
+ },
+
+ Right: {
+ ONLINE: 'beechat_right_availability_chat',
+ DND: 'beechat_right_availability_dnd',
+ AWAY: 'beechat_right_availability_away',
+ XA: 'beechat_right_availability_xa',
+ OFFLINE: 'beechat_right_availability_offline',
+ ROOM: 'beechat_right_availability_room'
+ },
+
+ Control: {
+ UP: 'beechat_availability_switcher_control_up',
+ DOWN: 'beechat_availability_switcher_control_down'
+ }
+ },
+
+ ChatBox: {
+ MAIN: 'beechat_chatbox',
+ MAINROOM: 'beechat_chatbox_room',
+ TOP: 'beechat_chatbox_top',
+ SUBTOP: 'beechat_chatbox_subtop',
+ TOP_ICON: 'beechat_chatbox_top_icon',
+ TOP_CONTROLS: 'beechat_chatbox_top_controls',
+ CONTENT: 'beechat_chatbox_content',
+ INPUT: 'beechat_chatbox_input',
+ BOTTOM: 'beechat_chatbox_bottom',
+ CONTROL: 'beechat_chatbox_control',
+ STATE: 'beechat_chatbox_state',
+ MESSAGE: 'beechat_chatbox_message',
+ MESSAGE_SENDER: 'beechat_chatbox_message_sender',
+ MESSAGE_DATE: 'beechat_chatbox_message_date',
+ CHATROOM: 'beechat_chatbox_chatroom',
+ ROOMROSTER: 'beechat_chatbox_roomroster',
+ ROSTER_ITEM: 'beechat_chatbox_roomrosteritem'
+ },
+
+ ScrollBox: {
+ SELECTED: 'beechat_scrollbox_selected'
+ },
+
+ BOX_CONTROL: 'beechat_box_control',
+ LABEL: 'beechat_label',
+ UNREAD_COUNT: 'beechat_unread_count'
+ },
+
+ Elements: {
+ ID_DIV_BAR: 'beechat',
+ ID_DIV_BAR_CENTER: 'beechat_center',
+ ID_DIV_BAR_RIGHT: 'beechat_right',
+
+ ID_TOOLTIP_TRIGGER: 'beechat_tooltip_trigger',
+
+ ID_SPAN_CONTACTS_BUTTON: 'beechat_contacts_button',
+ ID_SPAN_CLOSE_BOX: 'beechat_box_control_close',
+
+ ID_DIV_CONTACTS: 'beechat_contacts',
+ ID_DIV_CONTACTS_CONTROLS: 'beechat_contacts_controls',
+ ID_SPAN_CONTACTS_CONTROL_MINIMIZE: 'beechat_contacts_control_minimize',
+ ID_DIV_CONTACTS_CONTENT: 'beechat_contacts_content',
+ ID_UL_CONTACTS_LIST: 'beechat_contacts_list',
+
+ ID_DIV_AVAILABILITY_SWITCHER: 'beechat_availability_switcher',
+ ID_SPAN_AVAILABILITY_SWITCHER_CONTROL: 'beechat_availability_switcher_control',
+ ID_SPAN_CURRENT_AVAILABILITY: 'beechat_current_availability',
+ ID_UL_AVAILABILITY_SWITCHER_LIST: 'beechat_availability_switcher_list',
+
+ ID_DIV_CHATBOXES: 'beechat_chatboxes',
+
+ ID_DIV_SCROLLBOXES: 'beechat_scrollboxes'
+ }
+ },
+
+
+ /** Function: initialize
+ * Initialize the BeeChat UI
+ *
+ */
+ initialize: function(ts, token)
+ {
+ this.ts = ts;
+ this.token = token;
+ $('#' + BeeChat.UI.Resources.Elements.ID_TOOLTIP_TRIGGER).tooltip({
+ offset: [-3, 8],
+ effect: 'fade'
+ });
+
+ $('#accountlinks').find('li').filter('[class=last]').bind('click', function() {
+ if (g_beechat_user != null)
+ g_beechat_user.disconnect();
+ });
+
+ BeeChat.UI.AvailabilitySwitcher.initialize(BeeChat.Presence.ShowElements.CHAT);
+ BeeChat.UI.ContactsList.initialize();
+ BeeChat.UI.ScrollBoxes.initialize();
+ BeeChat.UI.loadConnection();
+ },
+
+ /** Function: getUserDetails
+ * Retrieve user details
+ *
+ * Returns:
+ * User details in object notation.
+ *
+ */
+ addActionTokens: function(url_string, sep)
+ {
+ if (sep == null)
+ sep = "?";
+ return url_string + sep + "__elgg_ts="+this.ts + "&__elgg_token=" + this.token;
+ },
+
+ getUserDetails: function(cb_func)
+ {
+ var json = null;
+ var self = this;
+
+ $.ajax({
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/get_details"; ?>'),
+ async: true,
+ dataType: 'json',
+ success: function(data) {
+ cb_func(data);
+ }
+ });
+
+ return (json);
+ },
+
+ /** Function: connect
+ * Create the user and connect him to the BOSH service
+ *
+ * Parameters:
+ * (Object) conn - Running connection informations in object notation
+ */
+ connect: function()
+ {
+ var conn = (arguments.length > 0) ? arguments[0] : null;
+ var userDetails = {
+ jid: (conn != null) ? conn.jid : null,
+ password: null
+ }
+ var self = this;
+ //alert("connect");
+ if (conn == null || (conn != null && conn.attached)) {
+ BeeChat.UI.getUserDetails(function(retrievedUserDetails) {
+ userDetails.jid = retrievedUserDetails.username + '@' + BeeChat.DOMAIN + '/' + BeeChat.RESOURCE;
+ userDetails.password = retrievedUserDetails.password;
+ self.connect_end(conn, userDetails)
+ });
+ }
+ else
+ this.connect_end(conn, userDetails)
+ },
+
+ connect_end: function(conn, userDetails)
+ {
+ g_beechat_user = new BeeChat.Core.User(userDetails.jid);
+ g_beechat_user.addObserver(BeeChat.Events.Identifiers.UPDATE_CONNECTION_STATE, BeeChat.UI.updateConnectionStatus);
+ g_beechat_user.addObserver(BeeChat.Events.Identifiers.UPDATE_ROSTER, BeeChat.UI.onRosterUpdate);
+ g_beechat_user.addObserver(BeeChat.Events.Identifiers.RECV_PRESENCE, BeeChat.UI.ContactsList.update);
+ g_beechat_user.addObserver(BeeChat.Events.Identifiers.RECV_CHAT_MESSAGE, BeeChat.UI.onChatMessage);
+
+ if (conn == null || (conn != null && conn.attached))
+ g_beechat_user.connect(userDetails.password);
+ else
+ g_beechat_user.attach(conn.sid, conn.rid);
+ },
+
+ /** Function: disconnect
+ * Terminate the user's XMPP session
+ *
+ */
+ disconnect: function()
+ {
+ g_beechat_user.disconnect();
+ },
+
+ /** Function: updateConnectionStatus
+ *
+ */
+ updateConnectionStatus: function(connStatusMsg)
+ {
+ BeeChat.UI.ContactsList.updateButtonText(connStatusMsg);
+ if (connStatusMsg == BeeChat.Events.Messages.ConnectionStates.ONLINE) {
+ if (!g_beechat_user.isAttached()) {
+ debugXMPP("not attached");
+ BeeChat.UI.ScrollBoxes.isOpened = true;
+ g_beechat_user.requestRoster();
+ g_beechat_user.reconnectRooms();
+ //BeeChat.UI.ContactsList.toggleDisplay();
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_CONTACTS_LIST).show();
+ $('.' + BeeChat.UI.Resources.StyleClasses.ChatBox.INPUT + '>textarea').removeAttr('disabled');
+ for (room_idx in g_user_rooms) {
+ var room = g_user_rooms[room_idx];
+ var chatBox = BeeChat.UI.ChatBoxes.getChatBoxElm(room[0]);
+ if (chatBox.length == 0) {
+ g_beechat_user.joinRoom(room[0], room[1])
+ }
+ }
+
+ }
+ if (g_beechat_user.isAttached()) {
+ debugXMPP("attached");
+ BeeChat.UI.loadState();
+ }
+
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).attr('class', 'online');
+ BeeChat.UI.saveConnection();
+ }
+ else if (connStatusMsg == BeeChat.Events.Messages.ConnectionStates.OFFLINE) {
+ var contactsBoxElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CONTACTS);
+
+ if (!contactsBoxElm.is(':hidden'))
+ BeeChat.UI.ContactsList.toggleDisplay();
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_CONTACTS_LIST).empty();
+ BeeChat.UI.AvailabilitySwitcher.initialize(BeeChat.Presence.ShowElements.CHAT);
+ BeeChat.UI.ContactsList.updateButtonText(BeeChat.UI.Resources.Strings.Contacts.BUTTON);
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).attr('class', 'offline');
+ $('.' + BeeChat.UI.Resources.StyleClasses.ChatBox.INPUT + '>textarea').attr('disabled', 'true');
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children().hide();
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES).find('ul').children()
+ .attr('class', BeeChat.UI.Resources.StyleClasses.LABEL + ' ' + BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[BeeChat.Presence.Types.UNAVAILABLE.toUpperCase()]);
+ g_beechat_user = null;
+ BeeChat.UI.saveConnection();
+ }
+ },
+
+ /** Function: saveConnection
+ * Save connection informations (non sensible data) in $_SESSION.
+ *
+ */
+ saveConnection: function()
+ {
+ var conn = null;
+
+ if (g_beechat_user != null) {
+ var userConn = g_beechat_user.getConnection();
+
+ conn = {
+ 'jid': userConn.jid,
+ 'sid': userConn.sid,
+ 'rid': userConn.rid,
+ 'attached': g_beechat_user.isAttached()
+ };
+ }
+ var self = this;
+
+ $.ajax({
+ type: 'POST',
+ async: false,
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/save_state"; ?>'),
+ data: { beechat_conn: JSON.stringify(conn) }
+ });
+
+ /*
+ $.cookie(BeeChat.UI.Resources.Cookies.FILENAME_CONN, null);
+ $.cookie(BeeChat.UI.Resources.Cookies.FILENAME_CONN, JSON.stringify(conn), {path: '/', domain: BeeChat.UI.Resources.Cookies.DOMAIN});
+ */
+ },
+
+ /** Function: loadConnection
+ * Check if a connection already exists. In the case that a connection exists,
+ * this function triggers the connection process.
+ *
+ */
+ loadConnection: function()
+ {
+ var self = this;
+ $.ajax({
+ type: 'GET',
+ async: false,
+ cache: false,
+ dataType: 'json',
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/get_connection"; ?>'),
+ success: function(conn) {
+ if (conn != null) {
+ if (conn.attached)
+ BeeChat.UI.connect();
+ else
+ BeeChat.UI.connect(conn);
+ }
+ },
+ error: function() {
+ BeeChat.UI.connect();
+ }
+ });
+
+ /*
+ var conn = JSON.parse($.cookie(BeeChat.UI.Resources.Cookies.FILENAME_CONN));
+
+ if (conn != null) {
+ if (conn.attached)
+ BeeChat.UI.connect();
+ else
+ BeeChat.UI.connect(conn);
+ } else
+ BeeChat.UI.connect();
+ */
+ },
+
+ /** Function: saveState
+ * Save app state in $_SESSION
+ *
+ */
+ saveState: function()
+ {
+ var self = this;
+ var currentAvailabilityClass = $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CURRENT_AVAILABILITY).attr('class');
+ var currentAvailability = currentAvailabilityClass.substr(currentAvailabilityClass.lastIndexOf('_') + 1);
+
+ var data = {
+ availability: currentAvailability,
+ contacts: g_beechat_roster_items,
+ chats: {},
+ contacts_list: {
+ minimized: $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CONTACTS).is(':hidden')
+ }
+ };
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children().each(function() {
+ var contactBareJid = $(this).attr('bareJid');
+ //var contactBareJid = $(this).data('bareJid');
+ var isroom = ($(this).attr('isroom') == 'true');
+ if (isroom)
+ var roster = $(this).find('div').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.ROOMROSTER + ']');
+ var html_content = $(this).children().filter('[bareJid="' + contactBareJid + '"]').html();
+ data.chats[contactBareJid] = {
+ 'html_content': escape(html_content),
+ 'roster_content': isroom?escape(roster.html()):'',
+ 'isroom': $(this).attr('isroom'),
+ 'group_guid': (contactBareJid in g_beechat_rooms)?g_beechat_rooms[contactBareJid]:0,
+ 'minimized': $(this).is(':hidden'),
+ 'unread': BeeChat.UI.UnreadCountBox.getElm(contactBareJid).text()
+ };
+ });
+
+ $.ajax({
+ type: 'POST',
+ async: false,
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/save_state"; ?>'),
+ data: { beechat_state: JSON.stringify(data) }
+ });
+ },
+
+ /** Function: loadState
+ * Load app state from $_SESSION
+ *
+ */
+ loadState: function()
+ {
+ var self = this;
+ $.ajax({
+ type: 'GET',
+ async: true,
+ cache: false,
+ dataType: 'json',
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/get_state"; ?>'),
+ error: function() {
+ alert('error getting state');
+ },
+ success: function(json) {
+ debugXMPP('loadState');
+ BeeChat.UI.AvailabilitySwitcher.initialize(json.availability);
+
+ if (!json.contacts_list.minimized) {
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CONTACTS).show();
+ BeeChat.UI.ContactsList.showedStyle();
+ }
+
+ g_beechat_user.getRoster().setItems(json.contacts);
+ self.loadRosterItemsIcons(false);
+ self.loadRosterItemsStatuses(false);
+ g_beechat_roster_items = g_beechat_user.getRoster().getItems();
+ BeeChat.UI.ContactsList.update(g_beechat_user.getRoster().getOnlineItems())
+ g_beechat_user.setInitialized(true);
+
+ var scrollBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES);
+ var scrollBoxElmToShow = null;
+
+ // Load saved chats
+ for (var key in json.chats) {
+ var isroom = (json.chats[key].isroom == 'true');
+ if (isroom)
+ BeeChat.UI.ScrollBoxes.addRoom(key);
+ else
+ BeeChat.UI.ScrollBoxes.add(key);
+
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(key);
+ debugXMPP("load chat " + key);
+ chatBoxElm.hide();
+
+ if (!json.chats[key].minimized) {
+ scrollBoxElmToShow = BeeChat.UI.ScrollBoxes.getScrollBoxElm(key);
+ }
+
+ var chatBoxContentElm = chatBoxElm.children().filter('[bareJid="' + key + '"]');
+
+ chatBoxContentElm.append(unescape(json.chats[key].html_content));
+ chatBoxContentElm.attr({scrollTop: chatBoxContentElm.attr('scrollHeight')});
+ if (isroom) {
+ g_beechat_rooms[key] = json.chats[key].room_guid;
+ var rosterElm = chatBoxElm.find('div').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.ROOMROSTER + ']');
+ rosterElm.append(unescape(json.chats[key].roster_content));
+ }
+
+ BeeChat.UI.UnreadCountBox.update(key, json.chats[key].unread);
+ }
+ if (scrollBoxElmToShow != null)
+ scrollBoxesElm.trigger('goto', scrollBoxesElm.find('ul').children().index(scrollBoxElmToShow));
+ else
+ scrollBoxesElm.trigger('goto', 0);
+
+ // g_beechat_user.sendPresenceAvailability(json.availability, '');
+ BeeChat.UI.ScrollBoxes.isInitialized = true;
+ BeeChat.UI.ScrollBoxes.isOpened = true;
+
+ for (var key in json.chats) {
+ if (json.chats[key].minimized) {
+ BeeChat.UI.ChatBoxes.getChatBoxElm(key).hide();
+ BeeChat.UI.ScrollBoxes.unselect(key);
+ }
+ else {
+ BeeChat.UI.ChatBoxes.getChatBoxElm(key).show();
+ BeeChat.UI.ScrollBoxes.select(key);
+ }
+ }
+ for (room_idx in g_user_rooms) {
+ var room = g_user_rooms[room_idx];
+ var chatBox = BeeChat.UI.ChatBoxes.getChatBoxElm(room[0]);
+ if (chatBox.length == 0) {
+ g_beechat_user.joinRoom(room[0], room[1])
+ }
+ }
+
+ },
+ error: function() {
+ BeeChat.UI.ContactsList.initialize();
+ }
+ });
+ },
+
+ /** Function: loadRosterItemsIcons
+ *
+ */
+ loadRosterItemsIcons: function(is_async, cb)
+ {
+ var data = g_beechat_user.getRoster().getItemsUsernamesAsList();
+ var self = this;
+
+ $.ajax({
+ type: 'POST',
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/get_icons"; ?>'),
+ async: is_async,
+ cache: false,
+ data: {'beechat_roster_items_usernames': data},
+ dataType: 'json',
+ success: function(json) {
+ g_beechat_user.getRoster().setIcons(json);
+ g_beechat_roster_items = g_beechat_user.getRoster().getItems();
+
+ BeeChat.UI.ContactsList.update(g_beechat_user.getRoster().getOnlineItems())
+ if (cb) {
+ cb();
+ }
+ }
+ });
+ },
+
+ /** Function: loadRosterItemsStatuses
+ *
+ */
+ loadRosterItemsStatuses: function(is_async, cb)
+ {
+ var data = g_beechat_user.getRoster().getItemsUsernamesAsList();
+//alert(data)
+ var self = this;
+ $.ajax({
+ type: 'POST',
+ url: self.addActionTokens('<?php echo $vars['url'] . "action/beechat/get_statuses"; ?>'),
+ async: true, // force
+ cache: false,
+ data: {'beechat_roster_items_usernames': data},
+ dataType: 'json',
+ success: function(json) {
+ g_beechat_user.getRoster().setStatuses(json);
+ g_beechat_roster_items = g_beechat_user.getRoster().getItems();
+ BeeChat.UI.ContactsList.update(g_beechat_user.getRoster().getOnlineItems())
+ if (cb) {
+ cb();
+ }
+ }
+ });
+ },
+
+ /** Function: onRosterUpdate
+ * Notified by core on a roster update
+ *
+ */
+ onRosterUpdate: function(rosterItems)
+ {
+ g_beechat_roster_items = rosterItems;
+ //alert("get roster");
+ if (!g_beechat_user.isInitialized()) {
+ //alert("load roster" + rosterItems.length);
+ BeeChat.UI.loadRosterItemsStatuses(true,
+ function() { BeeChat.UI.loadRosterItemsIcons(true,
+ function() {g_beechat_user.sendInitialPresence();}); });
+ //BeeChat.UI.loadRosterItemsIcons(false);
+ //g_beechat_user.sendInitialPresence();
+ }
+ },
+
+ /** Function: onChatMessage
+ *
+ */
+ onChatMessage: function(data)
+ {
+ if ($(data.msg).find('body').length == 0) {
+ BeeChat.UI.ChatBoxes.updateChatState(data.contactBareJid, data.msg);
+ }
+ else {
+ BeeChat.UI.ChatBoxes.update(data.contactBareJid, BeeChat.UI.Utils.getContactName(data.contactBareJid), Strophe.getText($(data.msg).find('body')[0]));
+ }
+ }
+};
+
+
+/** Class: BeeChat.UI.Resources.ReferenceTables
+ * An object container for all reference tables
+ *
+ */
+BeeChat.UI.Resources.ReferenceTables = {
+ Styles: {
+ Availability: {
+ Left: {
+ AVAILABLE: BeeChat.UI.Resources.StyleClasses.Availability.Left.ONLINE,
+ CHAT: BeeChat.UI.Resources.StyleClasses.Availability.Left.ONLINE,
+ DND: BeeChat.UI.Resources.StyleClasses.Availability.Left.DND,
+ AWAY: BeeChat.UI.Resources.StyleClasses.Availability.Left.AWAY,
+ XA: BeeChat.UI.Resources.StyleClasses.Availability.Left.XA,
+ UNAVAILABLE: BeeChat.UI.Resources.StyleClasses.Availability.Left.OFFLINE,
+ OFFLINE: BeeChat.UI.Resources.StyleClasses.Availability.Left.OFFLINE,
+ ROOM: BeeChat.UI.Resources.StyleClasses.Availability.Left.ROOM
+ },
+
+ Right: {
+ AVAILABLE: BeeChat.UI.Resources.StyleClasses.Availability.Right.ONLINE,
+ CHAT: BeeChat.UI.Resources.StyleClasses.Availability.Right.ONLINE,
+ DND: BeeChat.UI.Resources.StyleClasses.Availability.Right.DND,
+ AWAY: BeeChat.UI.Resources.StyleClasses.Availability.Right.AWAY,
+ XA: BeeChat.UI.Resources.StyleClasses.Availability.Right.XA,
+ UNAVAILABLE: BeeChat.UI.Resources.StyleClasses.Availability.Right.OFFLINE,
+ OFFLINE: BeeChat.UI.Resources.StyleClasses.Availability.Right.OFFLINE,
+ ROOM: BeeChat.UI.Resources.StyleClasses.Availability.Right.ROOM
+ }
+ }
+ }
+};
+
+
+/** Class: BeeChat.UI.ContactsList
+ * An object container for all ContactsList functions
+ *
+ */
+BeeChat.UI.ContactsList = {
+ /** Function: initialize
+ * Initialize the contacts list by binding elements
+ *
+ */
+ initialize: function()
+ {
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_CONTROL_MINIMIZE).unbind('click').bind('click', BeeChat.UI.ContactsList.toggleDisplay);
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).unbind('click').bind('click', function() {
+ if (g_beechat_user == null)
+ BeeChat.UI.connect();
+ else
+ BeeChat.UI.ContactsList.toggleDisplay();
+ });
+ },
+
+ /** Function: update
+ * Update the contacts list content
+ *
+ * Parameters:
+ * (Object)(BeeChat.Core.RosterItem) onlineRosterItems - A hash of RosterItems in object notation
+ *
+ */
+ update: function(onlineRosterItems)
+ {
+ var contactsListElm = $('#' + BeeChat.UI.Resources.Elements.ID_UL_CONTACTS_LIST);
+
+ contactsListElm.children().each(function() {
+ var contactBareJid = $(this).attr('bareJid');
+
+ if (g_beechat_roster_items != null) {
+ if ($.inArray(contactBareJid, onlineRosterItems) == -1) {
+ BeeChat.UI.ScrollBoxes.updateAvailability(contactBareJid);
+ $(this).remove();
+ }
+ }
+ });
+
+ for (var key in onlineRosterItems) {
+ if (typeof onlineRosterItems[key] != 'object')
+ continue;
+
+ var contactElm = contactsListElm.find('li').filter('[bareJid="' + key + '"]');
+
+ if (contactElm.length == 0) {
+ contactElm = $('<li></li>')
+ .attr('bareJid', key)
+ .append($('<img />')
+ .attr('src', g_beechat_roster_items[key].icon_tiny))
+ .append(BeeChat.UI.Utils.getTruncatedContactName(key, 25))
+ .appendTo(contactsListElm)
+ .bind('click', function() {
+ if (!BeeChat.UI.ChatBoxes.getChatBoxElm($(this).attr('bareJid')).is(':visible')) {
+ BeeChat.UI.ContactsList.toggleDisplay();
+ }
+
+ BeeChat.UI.ScrollBoxes.add($(this).attr('bareJid'), false, true);
+ });
+ }
+
+ BeeChat.UI.ContactsList.updateContactAvailability(contactElm, key);
+ }
+
+ BeeChat.UI.ContactsList.updateButtonText(BeeChat.UI.Resources.Strings.Contacts.BUTTON + ' (<strong>' + g_beechat_user.getRoster().getSizeOnlineItems() + '</strong>)');
+ },
+
+ /** Function: updateContactAvailability
+ *
+ */
+ updateContactAvailability: function(contactElm, contactBareJid)
+ {
+ // Update from contactsList
+ contactElm.attr('class', BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Right[g_beechat_roster_items[contactBareJid].getStrongestPresence().show.toUpperCase()]);
+
+ // Update from scrollBoxes
+ BeeChat.UI.ScrollBoxes.updateAvailability(contactBareJid);
+ },
+
+ /** Function: updateButtonText
+ *
+ *
+ */
+ updateButtonText: function(msg)
+ {
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).html(msg);
+ },
+
+ /** Function: toggleDisplay
+ * Toggle the contacts box display (hide | show)
+ *
+ */
+ toggleDisplay: function()
+ {
+ var contactsBoxElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CONTACTS);
+
+ contactsBoxElm.toggle();
+ if (contactsBoxElm.is(':hidden')) {
+ BeeChat.UI.ContactsList.hiddenStyle();
+ } else {
+ BeeChat.UI.ContactsList.showedStyle();
+ }
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_AVAILABILITY_SWITCHER_LIST).hide();
+ },
+
+ /** Function: hiddenStyle
+ *
+ */
+ hiddenStyle: function()
+ {
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_BAR_RIGHT).css({'border-left': '1px solid #BBBBBB', 'border-right': '1px solid #BBBBBB', 'background-color': '#DDDDDD'});
+ },
+
+ /** Function: showedStyle
+ *
+ */
+ showedStyle: function()
+ {
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_BAR_RIGHT).css({'border-left': '1px solid #666666', 'border-right': '1px solid #666666', 'background-color': 'white'});
+ }
+};
+
+
+/** Class: BeeChat.UI.AvailabilitySwitcher
+ * An object container for all AvailabilitySwitcher functions
+ *
+ */
+BeeChat.UI.AvailabilitySwitcher = {
+ /** Function: initialize
+ * Initialize the availability switcher by setting the current user's availability
+ * and binding actions
+ *
+ */
+ initialize: function(availability)
+ {
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CURRENT_AVAILABILITY).unbind('click').bind('click', BeeChat.UI.AvailabilitySwitcher.toggleListDisplay);
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_AVAILABILITY_SWITCHER_CONTROL).unbind('click').bind('click', BeeChat.UI.AvailabilitySwitcher.toggleListDisplay);
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_AVAILABILITY_SWITCHER_LIST).find('li').each(function() {
+ $(this).unbind('click').bind('click', function() {
+ var availabilityClass = $(this).attr('class');
+ var availability = availabilityClass.substr(availabilityClass.lastIndexOf('_') + 1);
+
+ if (availability == 'offline')
+ BeeChat.UI.disconnect();
+ else {
+ g_beechat_user.sendPresenceAvailability(availability, '');
+ BeeChat.UI.AvailabilitySwitcher.update(availability);
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_AVAILABILITY_SWITCHER_LIST).hide('slow');
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_CONTACTS_LIST).show('slow');
+ }
+ });
+ });
+ BeeChat.UI.AvailabilitySwitcher.update(availability);
+ },
+
+ /** Function: update
+ * Update the current user's availability
+ *
+ * Parameters:
+ * (BeeChat.Presence.ShowElements) availability - The current user's availability
+ */
+ update: function(availability)
+ {
+ var upperCasedAvailability = availability.toUpperCase();
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CURRENT_AVAILABILITY)
+ .attr('class', BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[upperCasedAvailability])
+ .text(BeeChat.UI.Resources.Strings.Availability[upperCasedAvailability]);
+
+ if (availability == 'chat')
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).attr('class', 'online');
+ else if (availability == 'xa' || availability == 'away')
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).attr('class', 'away');
+ else if (availability == 'dnd')
+ $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_CONTACTS_BUTTON).attr('class', 'dnd');
+ },
+
+ /** Function: switchControlClass
+ *
+ */
+ switchControlClass: function()
+ {
+ var switcherControlElm = $('#' + BeeChat.UI.Resources.Elements.ID_SPAN_AVAILABILITY_SWITCHER_CONTROL);
+
+ if (switcherControlElm.attr('class') == BeeChat.UI.Resources.StyleClasses.Availability.Control.UP)
+ switcherControlElm.attr('class', BeeChat.UI.Resources.StyleClasses.Availability.Control.DOWN);
+ else
+ switcherControlElm.attr('class', BeeChat.UI.Resources.StyleClasses.Availability.Control.UP);
+ },
+
+ /** Function: toggleListDisplay
+ *
+ */
+ toggleListDisplay: function()
+ {
+ BeeChat.UI.AvailabilitySwitcher.switchControlClass();
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_CONTACTS_LIST).toggle('slow');
+ $('#' + BeeChat.UI.Resources.Elements.ID_UL_AVAILABILITY_SWITCHER_LIST).toggle('slow');
+ }
+};
+
+
+/** Class: BeeChat.UI.ScrollBoxes
+ * An object container for all ScrollBoxes related functions
+ *
+ */
+BeeChat.UI.ScrollBoxes = {
+ isInitialized: false,
+ isOpened: false,
+
+ /** Function: initialize
+ *
+ */
+ initialize: function() {
+ var $prev = $('#beechat_center_prev'),
+ $next = $('#beechat_center_next');
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_BAR_CENTER).serialScroll({
+ target: '#beechat_scrollboxes',
+ items: 'li',
+ prev: '#beechat_center_prev',
+ next: '#beechat_center_next',
+ axys: 'x',
+ start: 2,
+ step: -1,
+ interval: 0,
+ duration: 0,
+ cycle: false,
+ force: true,
+ jump: true,
+ lock: true,
+ lazy: true,
+ constant: true,
+
+ onBefore: function(e, elem, $pane, $items, pos) {
+ $next.add($prev).hide();
+ $prev.add($next).hide();
+ if (pos != 0) {
+ $next.show();
+ }
+ if (pos != $items.length - 1)
+ $prev.show();
+ },
+
+ onAfter: function(elem) {
+ BeeChat.UI.ChatBoxes.takeStand($(elem).attr('bareJid'));
+ BeeChat.UI.ScrollBoxes.isInitialized = true;
+ }
+ });
+ },
+
+ /** Function: add
+ * Add a scrollbox to the scrollboxes bar
+ *
+ */
+ addRoom: function(contactBareJid)
+ {
+ debugXMPP('addRoom' + contactBareJid);
+ BeeChat.UI.ScrollBoxes.add(contactBareJid, true);
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+ scrollBoxElm.attr('class', BeeChat.UI.Resources.StyleClasses.Availability.Left.ROOM);
+ },
+
+ add: function(contactBareJid, isroom)
+ {
+ var scrollBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES);
+ var scrollBoxElm = scrollBoxesElm.find('ul').children().filter('[bareJid="' + contactBareJid + '"]');
+ debugXMPP("add " + contactBareJid + " " + scrollBoxElm.length);
+ if (scrollBoxElm.length == 0) {
+ var availClass = null;
+ var pres = null;
+ if (g_beechat_roster_items != undefined)
+ pres = g_beechat_roster_items[contactBareJid] != null ? g_beechat_roster_items[contactBareJid].getStrongestPresence() : null;
+
+ if (pres != null)
+ availClass = BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[pres.show.toUpperCase()];
+ else
+ availClass = BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[BeeChat.Presence.Types.UNAVAILABLE.toUpperCase()];
+
+ scrollBoxElm = $('<li></li>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.LABEL + ' ' + availClass)
+ .attr('bareJid', contactBareJid)
+ .attr('isroom', isroom?'true':'false')
+ .attr('title', BeeChat.UI.Resources.Strings.Box.SHOWHIDE)
+ .text(BeeChat.UI.Utils.getTruncatedContactName(contactBareJid, 11))
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.BOX_CONTROL)
+ .attr('id', BeeChat.UI.Resources.Elements.ID_SPAN_CLOSE_BOX)
+ .text('X')
+ .attr('title', BeeChat.UI.Resources.Strings.Box.CLOSE)
+ .bind('click', function() {
+ if (isroom)
+ g_beechat_user.leaveRoom(contactBareJid);
+ var scrollBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES);
+
+ BeeChat.UI.ChatBoxes.remove($(this).parent().attr('bareJid'));
+ BeeChat.UI.UnreadCountBox.remove($(this).parent().attr('bareJid'));
+ scrollBoxesElm.trigger('goto', scrollBoxesElm.find('ul').children().index(BeeChat.UI.ScrollBoxes.getSelectedScrollBoxElm()));
+ BeeChat.UI.saveState();
+ }));
+
+ scrollBoxesElm.find('ul').append(scrollBoxElm);
+ BeeChat.UI.ChatBoxes.add(contactBareJid, isroom);
+ if (arguments.length == 3 && arguments[2])
+ scrollBoxesElm.trigger('goto', scrollBoxesElm.find('ul').children().index(scrollBoxElm));
+ if (!isroom) {
+ BeeChat.UI.loadRosterItemsStatuses(true, function () { BeeChat.UI.loadRosterItemsIcons(true); });
+ }
+ } else {
+ scrollBoxesElm.trigger('goto', scrollBoxesElm.find('ul').children().index(scrollBoxElm));
+ }
+ },
+
+ /** Function: remove
+ *
+ */
+ remove: function(contactBareJid)
+ {
+ BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid).remove();
+ },
+
+ /** Function: unselect
+ *
+ */
+ unselect: function(contactBareJid)
+ {
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+ scrollBoxElm.attr('class', (scrollBoxElm.attr('class')).replace(/beechat_scrollbox_selected/, ''));
+ },
+
+ /** Function: select
+ *
+ */
+ select: function(contactBareJid)
+ {
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+ var scrollBoxElmClasses = scrollBoxElm.attr('class');
+
+ if (scrollBoxElmClasses.search(/beechat_scrollbox_selected/) == -1)
+ scrollBoxElm.attr('class', scrollBoxElmClasses + ' ' + BeeChat.UI.Resources.StyleClasses.ScrollBox.SELECTED);
+ },
+
+ /** Function: updateAvailability
+ *
+ */
+ updateAvailability: function(contactBareJid)
+ {
+ var pres = g_beechat_roster_items[contactBareJid].getStrongestPresence();
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+ var scrollBoxElmClasses = scrollBoxElm.attr('class');
+ var updatedAvailability = null;
+
+ if (pres != null)
+ updatedAvailability = BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[pres.show.toUpperCase()];
+ else
+ updatedAvailability = BeeChat.UI.Resources.ReferenceTables.Styles.Availability.Left[BeeChat.Presence.Types.UNAVAILABLE.toUpperCase()];
+
+ if (scrollBoxElmClasses == undefined || scrollBoxElmClasses.search(/(beechat_left_availability_)/g) == -1) {
+ scrollBoxElm.attr('class', BeeChat.UI.Resources.StyleClasses.LABEL + ' ' + updatedAvailability);
+ } else {
+ updatedAvailability = updatedAvailability.replace(/(beechat_left_availability)/g, '');
+
+ scrollBoxElmClasses = scrollBoxElmClasses.replace(/(_chat)/g, updatedAvailability);
+ scrollBoxElmClasses = scrollBoxElmClasses.replace(/(_dnd)/g, updatedAvailability);
+ scrollBoxElmClasses = scrollBoxElmClasses.replace(/(_away)/g, updatedAvailability);
+ scrollBoxElmClasses = scrollBoxElmClasses.replace(/(_xa)/g, updatedAvailability);
+ scrollBoxElmClasses = scrollBoxElmClasses.replace(/(_offline)/g, updatedAvailability);
+
+ scrollBoxElm.attr('class', scrollBoxElmClasses);
+ }
+ },
+
+ /** Function: getSelectedScrollBoxElm
+ *
+ */
+ getSelectedScrollBoxElm: function(contactBareJid)
+ {
+ var elm = undefined;
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES).find('ul').children().each(function() {
+ if ($(this).attr('class').search(/beechat_scrollbox_selected/) != -1)
+ elm = $(this);
+ });
+
+ return (elm);
+ },
+
+ /** Function: getScrollBoxElm
+ *
+ */
+ getScrollBoxElm: function(contactBareJid)
+ {
+ return $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES).find('ul').children().filter('[bareJid="' + contactBareJid + '"]');
+ }
+};
+
+
+/** Class: BeeChat.UI.ChatBoxes
+ * An object container for all ChatBoxes related functions
+ *
+ */
+BeeChat.UI.ChatBoxes = {
+ dateLastComposing: {},
+ lastTimedPauses: {},
+
+ /** Function: add
+ *
+ */
+ add: function(contactBareJid, isroom)
+ {
+ var chatBoxes = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES);
+
+ if ($(chatBoxes).children().filter('[bareJid="' + contactBareJid + '"]').length == 0) {
+ debugXMPP("create chatbox " + contactBareJid);
+ var chatBox = $('<div></div>')
+ .attr('class', isroom ? BeeChat.UI.Resources.StyleClasses.ChatBox.MAIN : BeeChat.UI.Resources.StyleClasses.ChatBox.MAIN)
+ .attr('bareJid', contactBareJid)
+ .attr('isroom', isroom ? 'true' : 'false')
+ .hide();
+
+ var chatBoxTop = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.TOP);
+ if (!isroom)
+ chatBoxTop.append($('<a></a>')
+ .attr('href', BeeChat.UI.Resources.Paths.MEMBER_PROFILE + Strophe.getNodeFromJid(contactBareJid))
+ .append($('<img />')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.TOP_ICON)
+ .attr('src', (g_beechat_roster_items != null && g_beechat_roster_items[contactBareJid] != undefined)?g_beechat_roster_items[contactBareJid].icon_small:'')))
+ chatBoxTop.append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.LABEL)
+ .html(isroom?BeeChat.UI.Utils.getTruncatedContactName(contactBareJid).split('@')[0]:'<a href="' + BeeChat.UI.Resources.Paths.MEMBER_PROFILE + Strophe.getNodeFromJid(contactBareJid) + '">' + BeeChat.UI.Utils.getTruncatedContactName(contactBareJid) + '</a>'))
+ .append($('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.TOP_CONTROLS)
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.CONTROL)
+ .attr('id', BeeChat.UI.Resources.Elements.ID_SPAN_CLOSE_BOX)
+ .text('X')
+ .attr('title', BeeChat.UI.Resources.Strings.Box.CLOSE)
+ .bind('click', function() {
+ if (isroom)
+ g_beechat_user.leaveRoom(contactBareJid);
+ BeeChat.UI.ChatBoxes.remove(contactBareJid);
+ }))
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.CONTROL)
+ .attr('id', BeeChat.UI.Resources.Elements.ID_SPAN_CLOSE_BOX)
+ .text('_')
+ .attr('title', BeeChat.UI.Resources.Strings.Box.MINIMIZE)
+ .css({'font-size': '1.6em', 'position': 'relative', 'line-height': '4px'})
+ .bind('click', function() {
+ BeeChat.UI.ScrollBoxes.unselect($(this).parent().parent().parent().attr('bareJid'));
+ $(this).parent().parent().parent().fadeOut('slow');
+ })));
+
+ var chatBoxSubTop = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.SUBTOP)
+ .append(BeeChat.UI.Utils.getTruncatedContactStatus((g_beechat_roster_items != null && g_beechat_roster_items[contactBareJid] != undefined && g_beechat_roster_items[contactBareJid].status != undefined) ? g_beechat_roster_items[contactBareJid].status : ''));
+
+ var chatBoxContent = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.CONTENT)
+ .attr('bareJid', contactBareJid);
+
+ var chatBoxInput = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.INPUT)
+ .append($('<textarea></textarea>')
+ .attr('bareJid', contactBareJid)
+ .bind('keypress', isroom?BeeChat.UI.ChatBoxes.onRoomTypingMessage:BeeChat.UI.ChatBoxes.onTypingMessage)
+ .bind('keyup', function(e) {
+ if ((e.keyCode ? e.keyCode : e.which) == 13)
+ $(this).attr('value', '');
+ }));
+
+ var chatBoxBottom = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.BOTTOM)
+ .append($('<span></span>')
+ .append($('<span></span>')));
+ if (isroom) {
+ //var chatBoxBox = $('<div></div>')
+ // .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.CHATROOM)
+ var chatBoxRoster = $('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.ROOMROSTER)
+ //chatBoxBox.append(chatBoxTop).append(chatBoxSubTop).append(chatBoxContent).append(chatBoxInput).append(chatBoxBottom)
+ //chatBox.append(chatBoxRoster).append(chatBoxBox).appendTo(chatBoxes);
+ chatBox.append(chatBoxTop).append(chatBoxSubTop).append(chatBoxContent).append(chatBoxInput).append(chatBoxBottom).append(chatBoxRoster).appendTo(chatBoxes);
+ }
+ else
+ chatBox.append(chatBoxTop).append(chatBoxSubTop).append(chatBoxContent).append(chatBoxInput).append(chatBoxBottom).appendTo(chatBoxes);
+ }
+ else {
+ /*debugXMPP("show chatbox " + contactBareJid);
+ var chatBox = $(chatBoxes).children().filter('[bareJid="' + contactBareJid + '"]');
+ chatBox.show();*/
+ }
+ },
+
+ /** Function: takeStand
+ *
+ */
+ takeStand: function(contactBareJid)
+ {
+ var chatBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children();
+ var chatBoxElm = chatBoxesElm.filter('[bareJid="' + contactBareJid + '"]');
+ var chatBoxContentElm = chatBoxElm.children().filter('[bareJid="' + contactBareJid + '"]');
+ var scrollBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES);
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+
+ if (!chatBoxElm.is(':hidden')) {
+ BeeChat.UI.ScrollBoxes.unselect(contactBareJid);
+ chatBoxElm.hide();
+ } else {
+ // Hide all other chatboxes
+ $.each(chatBoxesElm.filter('[bareJid!="' + contactBareJid + '"]'), function() {
+ BeeChat.UI.ScrollBoxes.unselect($(this).attr('bareJid'));
+ $(this).hide();
+ });
+ // Add selected scrollbox style
+ BeeChat.UI.ScrollBoxes.select(contactBareJid);
+ // Remove UnreadCountBox
+ BeeChat.UI.UnreadCountBox.remove(contactBareJid);
+ // Position the chatbox
+ var pos = scrollBoxElm.position().left - (chatBoxElm.width() - scrollBoxElm.width()) + 24;
+ chatBoxElm.css({'left': pos});
+ if (!BeeChat.UI.ScrollBoxes.isOpened)
+ return;
+ chatBoxElm.show().css({'left': pos});
+ // Scroll down the content of the chatbox
+ chatBoxContentElm.attr({scrollTop: chatBoxContentElm.attr('scrollHeight')});
+ // Focus textarea
+ chatBoxElm.children().filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.INPUT + ']').find('textarea').focus();
+ }
+ },
+
+ /** Function: onTypingMessage
+ *
+ */
+ onRoomTypingMessage: function(e) {
+ BeeChat.UI.ChatBoxes._onTypingMessage(e, true, this);
+ },
+
+ onTypingMessage: function(e) {
+ BeeChat.UI.ChatBoxes._onTypingMessage(e, false, this);
+ },
+
+ _onTypingMessage: function(e, isroom, self)
+ {
+ var keyCode = (e.keyCode) ? e.keyCode : e.which;
+ var contactBareJid = $(self).attr('bareJid');
+
+ var msgtype = BeeChat.Message.Types.CHAT;
+ if (isroom)
+ msgtype = BeeChat.Message.Types.GROUPCHAT;
+
+ if (keyCode == 13 && $(self).val() != '') {
+ g_beechat_user.sendChatMessage(contactBareJid, jQuery.trim($(self).val()), msgtype);
+ if (!isroom)
+ BeeChat.UI.ChatBoxes.update(contactBareJid, BeeChat.UI.Utils.truncateString(BeeChat.UI.Resources.Strings.ChatMessages.SELF, 24), $(self).val(), isroom);
+ clearTimeout(BeeChat.UI.ChatBoxes.lastTimedPauses[contactBareJid]);
+ BeeChat.UI.ChatBoxes.lastTimedPauses[contactBareJid] = null;
+ } else {
+ var nowTime = new Date().getTime();
+
+ if (BeeChat.UI.ChatBoxes.dateLastComposing[contactBareJid] == null || BeeChat.UI.ChatBoxes.dateLastComposing[contactBareJid] + 2000 < nowTime) {
+ BeeChat.UI.ChatBoxes.dateLastComposing[contactBareJid] = nowTime;
+ g_beechat_user.sendChatStateMessage(contactBareJid, BeeChat.Message.ChatStates.COMPOSING);
+ }
+
+ clearTimeout(BeeChat.UI.ChatBoxes.lastTimedPauses[contactBareJid]);
+ BeeChat.UI.ChatBoxes.lastTimedPauses[contactBareJid] = setTimeout('g_beechat_user.sendChatStateMessage(\'' + contactBareJid + '\', BeeChat.Message.ChatStates.PAUSED)', 2000);
+
+ var chatBoxTextAreaElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid).children().filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.INPUT + ']').find('textarea');
+ chatBoxTextAreaElm.attr({scrollTop: chatBoxTextAreaElm.attr('scrollHeight')});
+ }
+ },
+
+ updateRoster: function(contactBareJid, fromName, presence)
+ {
+ var availability = $(presence).attr('type');
+ var item = $(presence).find('item');
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+
+ if (chatBoxElm.length == 0) {
+ BeeChat.UI.ScrollBoxes.add(contactBareJid);
+ //BeeChat.UI.ScrollBoxes.addRoom(contactBareJid);
+ chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+ }
+
+ //var chatBoxContentElm = chatBoxElm.children().filter('[bareJid="' + contactBareJid + '"]');
+
+ var roster = chatBoxElm.find('div').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.ROOMROSTER + ']');
+ if (availability == 'unavailable') {
+ roster.find('div').filter('[contactName='+fromName+']').remove();
+ }
+ else {
+ var hasName = roster.find('div').filter('[contactName='+fromName+']');
+ if (hasName.length == 0) {
+ roster.append($('<div>' + fromName + '</div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.ROSTER_ITEM)
+ .attr('title', item.attr('affiliation') + '/' + item.attr('role'))
+ .attr('contactName', fromName))
+ }
+ }
+ },
+
+
+ /** Function: update
+ *
+ */
+ update: function(contactBareJid, fromName, msg, isroom)
+ {
+ var chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+ debugXMPP(contactBareJid + " " + msg + " " + chatBoxElm.length);
+ if (chatBoxElm.length == 0) {
+ if (isroom) {
+ BeeChat.UI.ScrollBoxes.addRoom(contactBareJid);
+ BeeChat.UI.ChatBoxes.show(contactBareJid);
+ BeeChat.UI.ChatBoxes.takeStand(contactBareJid);
+ }
+ else {
+ BeeChat.UI.ScrollBoxes.add(contactBareJid,false,true);
+ // BeeChat.UI.ChatBoxes.show(contactBareJid);
+ BeeChat.UI.ChatBoxes.takeStand(contactBareJid);
+ }
+ chatBoxElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid);
+ }
+
+ var chatBoxContentElm = chatBoxElm.children().filter('[bareJid="' + contactBareJid + '"]');
+
+ chatBoxContentElm.find('p').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.STATE + ']').remove();
+
+ var chatBoxLastMessageElm = $(chatBoxContentElm).find('div').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.MESSAGE + ']').filter(':last');
+
+ if (chatBoxLastMessageElm && chatBoxLastMessageElm.find('span').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.MESSAGE_SENDER + ']').text() == fromName) {
+ chatBoxLastMessageElm.append('<p>' + BeeChat.UI.Utils.getPrintableChatMessage(msg) + '</p>');
+ } else {
+ chatBoxContentElm.append($('<div></div>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.MESSAGE)
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.MESSAGE_SENDER)
+ .text(fromName))
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.MESSAGE_DATE)
+ .text(BeeChat.UI.Utils.getNowFormattedTime()))
+ .append('<p>' + BeeChat.UI.Utils.getPrintableChatMessage(msg) + '</p>'));
+ }
+
+ chatBoxContentElm.attr({scrollTop: chatBoxContentElm.attr('scrollHeight')});
+
+ var scrollBoxesElm = $('#' + BeeChat.UI.Resources.Elements.ID_DIV_SCROLLBOXES);
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid);
+
+ if (BeeChat.UI.ScrollBoxes.isInitialized == false) {
+ scrollBoxesElm.trigger('goto', scrollBoxesElm.find('ul').children().index(scrollBoxElm));
+ }
+
+ debugXMPP("about to update number!");
+ if (chatBoxElm.is(':hidden')) {
+ debugXMPP("update number!");
+ BeeChat.UI.UnreadCountBox.update(contactBareJid);
+// if (BeeChat.UI.HAS_FOCUS)
+// document.getElementById(BeeChat.UI.Resources.Sounds.NEW_MESSAGE).Play();
+ }
+
+// if (!BeeChat.UI.HAS_FOCUS)
+// document.getElementById(BeeChat.UI.Resources.Sounds.NEW_MESSAGE).Play();
+ },
+
+ /** Function: updateChatState
+ *
+ */
+ updateChatState: function(contactBareJid, msg)
+ {
+ var chatBoxContentElm = BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid).children().filter('[bareJid="' + contactBareJid + '"]');
+
+ $(msg).children().each(function() {
+ if (this.tagName == BeeChat.Message.ChatStates.COMPOSING) {
+ if (chatBoxContentElm.find('p').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.STATE + ']').length == 0) {
+ $('<p></p>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.ChatBox.STATE)
+ .html(BeeChat.UI.Utils.getContactName(contactBareJid) + BeeChat.UI.Resources.Strings.ChatMessages.COMPOSING + "</br />")
+ .appendTo(chatBoxContentElm);
+ }
+ } else if (this.tagName == BeeChat.Message.ChatStates.PAUSED) {
+ chatBoxContentElm.find('p').filter('[class=' + BeeChat.UI.Resources.StyleClasses.ChatBox.STATE + ']').remove();
+ }
+ });
+ chatBoxContentElm.attr({scrollTop: chatBoxContentElm.attr('scrollHeight')});
+ },
+
+ /** Function: remove
+ *
+ */
+ remove: function(contactBareJid)
+ {
+ BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid).remove();
+ BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid).remove();
+ },
+
+ /** Function: show
+ *
+ */
+ show: function(contactBareJid)
+ {
+ BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid).show();
+ },
+
+ /** Function: hide
+ *
+ */
+ hide: function(contactBareJid)
+ {
+ BeeChat.UI.ChatBoxes.getChatBoxElm(contactBareJid).hide();
+ },
+
+ /** Function: getChatBoxElm
+ *
+ */
+ getChatBoxElm: function(contactBareJid)
+ {
+ return $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children().filter('[bareJid="' + contactBareJid + '"]');
+ }
+};
+
+BeeChat.UI.UnreadCountBox = {
+ /** Function: add
+ *
+ */
+ add: function(contactBareJid)
+ {
+ BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid)
+ .append($('<span></span>')
+ .attr('class', BeeChat.UI.Resources.StyleClasses.UNREAD_COUNT));
+ },
+
+ /** Function: remove
+ *
+ */
+ remove: function(contactBareJid)
+ {
+ BeeChat.UI.UnreadCountBox.getElm(contactBareJid).remove();
+ },
+
+ /** Function: update
+ *
+ */
+ update: function(contactBareJid)
+ {
+ if (arguments.length > 1 && !arguments[1])
+ return;
+
+ var unreadCountBoxElm = BeeChat.UI.UnreadCountBox.getElm(contactBareJid);
+ if (unreadCountBoxElm.length == 0) {
+ BeeChat.UI.UnreadCountBox.add(contactBareJid);
+ unreadCountBoxElm = BeeChat.UI.UnreadCountBox.getElm(contactBareJid);
+ }
+ if (arguments.length == 1) {
+ var unreadCount = unreadCountBoxElm.text();
+ unreadCountBoxElm.text(++unreadCount);
+ } else
+ unreadCountBoxElm.text(arguments[1]);
+ },
+
+ /** Function: getElm
+ *
+ */
+ getElm: function(contactBareJid)
+ {
+ return BeeChat.UI.ScrollBoxes.getScrollBoxElm(contactBareJid).find('span').filter('[class=' + BeeChat.UI.Resources.StyleClasses.UNREAD_COUNT +' ]');
+ }
+};
+
+/** Class: BeeChat.UI.Utils
+ * An object container for all UI utilities functions
+ *
+ */
+BeeChat.UI.Utils = {
+ /** Function: getTruncatedContactName
+ *
+ */
+ getTruncatedContactName: function(bareJid)
+ {
+ return (BeeChat.UI.Utils.truncateString(BeeChat.UI.Utils.getContactName(bareJid), (arguments.length == 2) ? arguments[1] : 21));
+ },
+
+ /** Function: getTruncatedContactStatus
+ *
+ */
+ getTruncatedContactStatus: function(contactStatus)
+ {
+ return (BeeChat.UI.Utils.truncateString(contactStatus, (arguments.length == 2 ? arguments[1] : 50)));
+ },
+
+ /** Function: getContactName
+ *
+ */
+ getContactName: function(bareJid)
+ {
+ var contactName = bareJid;
+
+ if (g_beechat_roster_items != null && g_beechat_roster_items[bareJid])
+ contactName = g_beechat_roster_items[bareJid].name;
+ // no contact name so we show bareJid
+ if (!contactName || contactName == '')
+ contactName = bareJid;
+
+ return (contactName);
+ },
+
+ /** Function: getPrintableChatMessage
+ *
+ */
+ getPrintableChatMessage: function(msg)
+ {
+ var val = new String;
+ val = $('<div>' + msg + '</div>');
+ msg = val.text();
+
+ msg = jQuery.trim(msg);
+ msg = BeeChat.UI.Utils.replaceLinks(msg);
+ msg = BeeChat.UI.Utils.replaceSmileys(msg);
+
+ return msg;
+ },
+
+ /** Function: getNowFormattedTime
+ *
+ */
+ getNowFormattedTime: function()
+ {
+ var date = new Date();
+
+ var hours = date.getHours();
+ var minutes = date.getMinutes();
+ var seconds = date.getSeconds();
+
+ if (hours < 10)
+ hours = '0' + hours;
+ if (minutes < 10)
+ minutes = '0' + minutes;
+ if (seconds < 10)
+ seconds = '0' + seconds;
+ return (hours + ':' + minutes + ':' + seconds);
+ },
+
+
+ /** Function: replaceSmileys
+ * Replace smileys founded in a string to beautiful icons :)
+ *
+ * Parameters:
+ * (String) str - The string containing smileys
+ *
+ */
+ replaceSmileys: function(str)
+ {
+ str = str.replace(/(;\))/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_WINK + '" />');
+ str = str.replace(/(:\))/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_SMILE + '" />');
+ str = str.replace(/(:\()/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_UNHAPPY + '" />');
+ str = str.replace(/(:D)/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_GRIN + '" />');
+ str = str.replace(/(:o)/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_SURPRISED + '" />');
+ str = str.replace(/(xD)/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_EVILGRIN + '" />');
+ str = str.replace(/(:p)/gi, '<img src="' + BeeChat.UI.Resources.Paths.ICONS + BeeChat.UI.Resources.Emoticons.FILENAME_TONGUE + '" />');
+
+ return (str);
+ },
+
+ /** Function: replaceLinks
+ * Transform links founded in a string to clickable links
+ *
+ * Parameters:
+ * (String) str - The string where will be replaced links
+ */
+ replaceLinks: function(str)
+ {
+ var xpr =
+ /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
+
+ return (str.replace(xpr, '<a href="$1" target="_blank">$1</a>'));
+ },
+
+ /** Function: truncateString
+ * Truncate a string at a specified length
+ *
+ * Parameters:
+ * (String) str - The string to truncate
+ * (int) len - The maximum length of str
+ */
+ truncateString: function(str, len)
+ {
+ if (str != null && str.length > len)
+ return ((str.substr(0, len) + '...'));
+ return (str);
+ }
+};
+
+
+/** Executed when the DOM is ready
+ *
+ */
+function init_beechat(ts, token) {
+ if (typeof document.body.style.maxHeight === "undefined") { // IE6
+ return;
+ }
+
+ BeeChat.UI.initialize(ts, token);
+}
+
+/** Window resizing
+ *
+ */
+$(window).resize(function() {
+ if (typeof document.body.style.maxHeight === "undefined") { // IE6
+ return;
+ }
+
+ $('#' + BeeChat.UI.Resources.Elements.ID_DIV_CHATBOXES).children().each(function() {
+ var scrollBoxElm = BeeChat.UI.ScrollBoxes.getScrollBoxElm($(this).attr('bareJid'));
+ var pos = scrollBoxElm.position().left - ($(this).width() - scrollBoxElm.width()) + 24;
+
+ $(this).css({'left': pos});
+ });
+});
+
+
+/** Executed when the page is unloaded
+ *
+ */
+$(window).unload(function() {
+ if (typeof document.body.style.maxHeight === "undefined") { // IE6
+ return;
+ }
+
+ if (!$('#beechat').length)
+ return;
+
+ if (g_beechat_user != null) {
+ g_beechat_user.requestSessionPause();
+ BeeChat.UI.saveState();
+ }
+
+ BeeChat.UI.saveConnection();
+ });
+
+
+/** Check whether the BeeChat tab is active or not
+ *
+ */
+$(window).bind('blur', function() {
+ BeeChat.UI.HAS_FOCUS = false;
+ });
+
+$(window).bind('focus', function() {
+ BeeChat.UI.HAS_FOCUS = true;
+ });
diff --git a/mod/beechat/views/default/beechat/beechat.php b/mod/beechat/views/default/beechat/beechat.php
new file mode 100644
index 000000000..397d35f74
--- /dev/null
+++ b/mod/beechat/views/default/beechat/beechat.php
@@ -0,0 +1,84 @@
+<?php
+ /**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+if (elgg_is_logged_in() && elgg_get_logged_in_user_entity()->chatenabled && elgg_get_context() != 'admin') {
+?>
+<div id="beechat">
+ <div id="beechat_left">
+ <a id="beechat_tooltip_trigger" href="<?php echo $vars['url']; ?>"><img src="<?php echo $vars['config']->wwwroot; ?>favicon.ico" /></a>
+ <div class="tooltip tooltipchat">
+ <h3><?php echo elgg_echo('beechat:icons:home'); ?></h3>
+ </div>
+ </div>
+ <div id="beechat_center">
+ <span id="beechat_center_prev" class="prev"></span>
+ <div id="beechat_scrollboxes"><ul></ul></div>
+ <span id="beechat_center_next" class="next"></span>
+ </div>
+ <div id="beechat_right">
+ <span id="beechat_contacts_button" class="offline">
+ <?php echo elgg_echo('beechat:contacts:button'); ?>
+ </span>
+ </div>
+ <div id="beechat_contacts">
+ <div id="beechat_contacts_top">
+ <span class="beechat_label"><?php echo elgg_echo('beechat:contacts:button'); ?></span>
+ <div id="beechat_contacts_controls">
+ <span id="beechat_contacts_control_minimize" class="beechat_control" title="<?php echo elgg_echo('beechat:box:minimize'); ?>">_</span>
+ </div>
+ <br clear="all" />
+ </div>
+ <div id="beechat_availability_switcher">
+ <span id="beechat_current_availability"></span>
+ <span class="beechat_availability_switcher_control_down" id="beechat_availability_switcher_control"></span>
+ </div>
+ <div id="beechat_contacts_content">
+ <ul id="beechat_contacts_list"></ul>
+ <ul id="beechat_availability_switcher_list">
+ <li class="beechat_left_availability_chat"><?php echo elgg_echo('beechat:availability:available'); ?></li>
+ <li class="beechat_left_availability_dnd"><?php echo elgg_echo('beechat:availability:dnd'); ?></li>
+ <li class="beechat_left_availability_away"><?php echo elgg_echo('beechat:availability:away'); ?></li>
+ <li class="beechat_left_availability_xa"><?php echo elgg_echo('beechat:availability:xa'); ?></li>
+ <li class="beechat_left_availability_offline"><?php echo elgg_echo('beechat:availability:offline'); ?></li>
+ </ul>
+ </div>
+ <div id="beechat_contacts_bottom">
+ <span id="beechat_contacts_bottom_bar"></span>
+ </div>
+ </div>
+ <div id="beechat_chatboxes"></div>
+</div>
+<!-- SOUNDS -->
+<!--
+<embed src="<?php echo $vars['config']->staticurl; ?>mod/beechat/sounds/newmessage.wav" autostart=false width=0 height=0
+ id="beechat_sounds_new_message"
+ enablejavascript="true" />
+-->
+
+<?php
+ $ts = time();
+ $token = generate_action_token($ts);
+?>
+
+<script>
+ $(function () {
+ var e = document.createElement('script');
+ e.async = true;
+ e.type = 'text/javascript';
+ e.text = 'init_beechat("<?php echo $ts; ?>","<?php echo $token; ?>");';
+ document.getElementById('beechat').appendChild(e);
+
+ })
+</script>
+
+<?php
+ }
+?>
diff --git a/mod/beechat/views/default/beechat/beechat.userjs.php b/mod/beechat/views/default/beechat/beechat.userjs.php
new file mode 100644
index 000000000..ed59b683f
--- /dev/null
+++ b/mod/beechat/views/default/beechat/beechat.userjs.php
@@ -0,0 +1,54 @@
+<script type="text/javascript">
+BeeChat.Events.Messages = {
+ ConnectionStates: {
+ CONNECTING: "<?php echo elgg_echo('beechat:connection:state:connecting'); ?>",
+ AUTHENTICATING: "<?php echo elgg_echo('beechat:connection:state:authenticating'); ?>",
+ FAILED: "<?php echo elgg_echo('beechat:connection:state:failed'); ?>",
+ DISCONNECTING: "<?php echo elgg_echo('beechat:connection:state:disconnecting'); ?>",
+ OFFLINE: "<?php echo elgg_echo('beechat:connection:state:offline'); ?>",
+ ONLINE: "<?php echo elgg_echo('beechat:connection:state:online'); ?>"
+ }
+ }
+
+BeeChat.UI.Resources.Strings = {
+ Availability: {
+ AVAILABLE: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ CHAT: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ ONLINE: "<?php echo elgg_echo('beechat:availability:available'); ?>",
+ DND: "<?php echo elgg_echo('beechat:availability:dnd'); ?>",
+ AWAY: "<?php echo elgg_echo('beechat:availability:away'); ?>",
+ XA:"<?php echo elgg_echo('beechat:availability:xa'); ?>",
+ OFFLINE: "<?php echo elgg_echo('beechat:availability:offline'); ?>"
+ },
+
+ Contacts: {
+ BUTTON: "<?php echo elgg_echo('beechat:contacts:button'); ?>"
+ },
+
+ ChatMessages: {
+ SELF: "<?php echo $_SESSION['user']->name; ?>",
+ COMPOSING: "<?php echo elgg_echo('beechat:chat:composing'); ?>"
+ },
+
+ Box: {
+ MINIMIZE: "<?php echo elgg_echo('beechat:box:minimize'); ?>",
+ CLOSE: "<?php echo elgg_echo('beechat:box:close'); ?>",
+ SHOWHIDE: "<?php echo elgg_echo('beechat:box:showhide'); ?>"
+ }
+ }
+g_user_rooms = new Array();
+<?php
+if (elgg_is_logged_in()) {
+ $user = elgg_get_logged_in_user_entity();
+ $chatrooms = elgg_get_entities_from_relationship(array('relationship' => 'groupchat',
+ 'relationship_guid' => $user->guid,
+ 'inverse_relationship' => false,
+ 'limit' => 0));
+ if (!empty($chatrooms)) {
+ foreach($chatrooms as $chatroom) {
+ echo "g_user_rooms.push(['".beechat_friendly_title($chatroom->name)."@".elgg_get_plugin_setting("groupdomain", "beechat")."', '".$chatroom->guid."']);";
+ }
+ }
+}
+?>
+</script>
diff --git a/mod/beechat/views/default/beechat/screen.css.php b/mod/beechat/views/default/beechat/screen.css.php
new file mode 100644
index 000000000..930e60089
--- /dev/null
+++ b/mod/beechat/views/default/beechat/screen.css.php
@@ -0,0 +1,672 @@
+<?php
+ global $CONFIG;
+ $url = $CONFIG->wwwroot;
+
+?>
+/**
+ * Beechat
+ *
+ * @package beechat
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Beechannels <contact@beechannels.com>
+ * @copyright Beechannels 2007-2010
+ * @link http://beechannels.com/
+ */
+
+div#beechat {
+ display: block !important;
+ display: none;
+ position: fixed;
+ left: 1%;
+ right: 1%;
+ bottom: 0;
+ margin: 0;
+ padding: 0;
+ height: 20px;
+ z-index: 999;
+
+ font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif;
+ font-size: 0.9em;
+ color: #222222;
+ background-color: #DDDDDD;
+ border-top: 1px solid #BBBBBB;
+ border-left: 1px solid #BBBBBB;
+}
+div#beechat a img {
+ border: none;
+}
+div#beechat a {
+ text-decoration: none;
+}
+div#beechat img {
+ vertical-align: middle;
+}
+div#beechat a:hover {
+ text-decoration: underline;
+}
+.beechat_control {
+ cursor: pointer;
+ color: #CCCCFF;
+ font-size: 1.6em;
+}
+.beechat_control:hover {
+ color: white;
+}
+.beechat_box_control {
+ cursor: pointer;
+ color: #888888;
+ font-size: 1em;
+}
+.beechat_box_control:hover {
+ color: #222222;
+}
+.beechat_chatbox_control {
+ cursor: pointer;
+ color: #CCCCFF;
+ font-size: 1.6em;
+}
+.beechat_chatbox_control:hover {
+ color: white;
+}
+.beechat_label {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+/*
+** -
+** left side
+** -
+*/
+div#beechat_left {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 116px;
+ height: 18px;
+ margin: 0;
+ padding: 1px 2px;
+}
+
+
+/*
+** -
+** right side
+** -
+*/
+div#beechat_right {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 220px;
+ height: 20px;
+ margin: 0;
+ padding: 0 0 0 0;
+
+ border-left: 1px solid #BBBBBB;
+ border-right: 1px solid #BBBBBB;
+}
+div#beechat_contacts {
+ position: absolute;
+ right: 0px;
+ bottom: 0;
+ width: 222px;
+ height: 240px;
+ margin: 0 auto 20px auto;
+ padding: 0;
+ display: none;
+
+ background-color: white;
+}
+div#beechat_contacts_top {
+ color: white;
+ background-color: #193C60;
+ width: 220px;
+ height: 32px;
+
+ border-top: 1px solid #0B2C4F;
+ border-left: 1px solid #0B2C4F;
+ border-right: 1px solid #0B2C4F;
+}
+div#beechat_contacts_top .beechat_label {
+ float: left;
+ height: 20px;
+ padding: 6px;
+}
+div#beechat_contacts_controls {
+ margin: 0;
+ padding: 0;
+}
+div#beechat_contacts_controls span#beechat_contacts_control_minimize {
+ position: relative;
+ top: -7px;
+ float: right;
+ display: block;
+ width: 20px;
+ height: 20px;
+ padding: 2px;
+
+ font-size: 1.6em;
+ font-weight: bold;
+ text-align: center;
+}
+span#beechat_contacts_button {
+ display: block;
+ width: 190px;
+ padding: 2px 6px 0 24px;
+ height: 18px;
+ cursor: pointer;
+ font-size: 1.1em;
+ font-weight: normal;
+
+ background-image: url('<?php echo $url; ?>mod/beechat/graphics/icons/statuses.png');
+}
+span#beechat_contacts_button.online {
+ background-position: 4px -750px;
+ background-repeat: no-repeat;
+}
+span#beechat_contacts_button.dnd {
+ background-position: 4px -796px;
+ background-repeat: no-repeat;
+}
+span#beechat_contacts_button.away {
+ background-position: 4px -842px;
+ background-repeat: no-repeat;
+}
+span#beechat_contacts_button.offline {
+ background-position: 4px -888px;
+ background-repeat: no-repeat;
+}
+span#beechat_contacts_button:hover {
+ background-color: white;
+}
+div#beechat_availability_switcher {
+ width: 218px;
+ height: 24px;
+ margin: 0;
+ padding: 0 0 0 2px;
+
+ background-color: #EEEEEE;
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ border-bottom: 1px solid #BBBBBB;
+}
+span#beechat_current_availability {
+ float: left;
+ padding: 4px 4px 4px 22px;
+
+ font-weight: bold;
+ cursor: pointer;
+}
+span#beechat_current_availability:hover {
+ text-decoration: underline;
+}
+span#beechat_availability_switcher_control {
+ float: right;
+ width: 24px;
+ height: 20px;
+ cursor: pointer;
+}
+span.beechat_availability_switcher_control_up {
+ background: no-repeat 50% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_arrow_up.png');
+}
+span.beechat_availability_switcher_control_down {
+ background: no-repeat 50% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_arrow_down.png');
+}
+ul#beechat_availability_switcher_list {
+ display: none;
+ padding:0;
+ margin:0;
+ list-style:none;
+}
+ul#beechat_availability_switcher_list li {
+ margin: 0;
+ padding: 4px 4px 4px 24px;
+
+ cursor: pointer;
+}
+ul#beechat_availability_switcher_list li:hover {
+ background-color: #EEEEEE;
+}
+div#beechat_contacts_content {
+ width: 220px;
+ height: 164px;
+ overflow: auto;
+
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ background-color: white;
+}
+ul#beechat_contacts_list {
+ background-color: white;
+ padding:0;
+ margin:0;
+ list-style:none;
+}
+ul#beechat_contacts_list li img {
+ margin: 0 4px 0 0;
+ width: 25px;
+ height: 25px;
+}
+ul#beechat_contacts_list li {
+ margin: 0;
+ padding: 4px 4px 4px 6px;
+
+ cursor: pointer;
+ color: #333;
+}
+ul#beechat_contacts_list li:hover {
+ background-color: #F5F6F8;
+ color: #333;
+}
+div#beechat_contacts_bottom {
+ width: 220px;
+ height: 18px;
+
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+}
+span#beechat_contacts_bottom_bar {
+ position: absolute;
+ display: block;
+ bottom: 0;
+ width: 210px;
+ height: 1px;
+
+ background-color: #BBBBBB;
+ margin: auto 4px;
+}
+
+
+/*
+** -
+** center area
+** -
+*/
+div#beechat_center {
+ float: right;
+ display: block;
+ width: 586px;
+ height: 20px;
+ margin: 0 220px 0 100px;
+ *margin: 0 312px 0 100px;
+ padding: 0;
+}
+div#beechat_center .next, div#beechat_center .prev {
+ display: none;
+
+ border-left: 1px solid #BBBBBB;
+ cursor: pointer;
+}
+div#beechat_center .next {
+ position: absolute;
+ right: 220px;
+ width: 24px;
+ height: 20px;
+
+ background: no-repeat 50% url("<?php echo $url; ?>mod/beechat/graphics/icons/resultset_next.png");
+}
+div#beechat_center .prev {
+ position: absolute;
+ right: 872px;
+ width: 24px;
+ height: 20px;
+
+ background: no-repeat 50% url("<?php echo $url; ?>mod/beechat/graphics/icons/resultset_previous.png");
+}
+div#beechat_scrollboxes {
+ float: right;
+ overflow: hidden;
+ width: 628px;
+ height: 21px;
+ margin: 0 24px 0 24px;
+ text-align: left;
+}
+div#beechat_scrollboxes ul {
+ width: 200000em;
+ list-style: none;
+ padding:0;
+ margin:0;
+}
+div#beechat_scrollboxes ul li {
+ float: right;
+ display: block;
+ width: 130px;
+ height: 20px;
+ padding: 1px 0 0 22px;
+
+ cursor: pointer;
+ border-left: 1px solid #BBBBBB;
+}
+div#beechat_scrollboxes ul li:hover {
+ color: #000000;
+ background-color: white;
+}
+div#beechat_scrollboxes ul li.beechat_scrollbox_selected {
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ background-color: white;
+}
+div#beechat_scrollboxes ul li span.beechat_unread_count {
+ float: right;
+ display: block;
+ width: 16px;
+ height: 14px;
+ padding-top: 2px;
+ margin: 0 6px 0 0;
+
+ text-align: center;
+ font-size: 0.7em;
+ color: white;
+ background: no-repeat 0% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/notification_pink.png');
+}
+div#beechat_scrollboxes ul li span#beechat_box_control_close {
+ float: right;
+ width: auto;
+ padding: 1px 4px;
+ height: 20px;
+}
+
+/*
+** --
+** availability classes
+** --
+*/
+.beechat_left_availability_chat {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_green.png');
+}
+.beechat_left_availability_dnd {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_delete.png');
+}
+.beechat_left_availability_away {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_orange.png');
+}
+.beechat_left_availability_xa {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_red.png');
+}
+.beechat_left_availability_offline {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_black.png');
+}
+.beechat_left_availability_room {
+ background: no-repeat 2% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/muc_icon.png');
+}
+
+
+
+.beechat_right_availability_chat {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_green.png');
+}
+.beechat_right_availability_dnd {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_delete.png');
+}
+.beechat_right_availability_away {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_orange.png');
+}
+.beechat_right_availability_xa {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_red.png');
+}
+.beechat_right_availability_offline {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/bullet_black.png');
+}
+.beechat_right_availability_room {
+ background: no-repeat 96% 50% url('<?php echo $url; ?>mod/beechat/graphics/icons/muc_icon.png');
+}
+
+/*
+** --
+** tooltips
+** --
+*/
+div.tooltip.tooltipchat {
+ display: none;
+ padding: 4px;
+ width: auto;
+ background: transparent no-repeat left bottom url('<?php echo $url; ?>mod/beechat/graphics/icons/pointer.png');
+}
+div.tooltip.tooltipchat h3 {
+ margin: 0;
+ padding: 4px;
+
+ font-weight: normal;
+ font-size: 0.9em;
+ color: white;
+ background-color: #222222;
+}
+
+
+/*
+** --
+** chatboxes
+** --
+*/
+div.beechat_chatbox {
+ position: absolute;
+ width: 240px;
+ height: 300px;
+ bottom: 25px;
+ margin: 0;
+ padding: 0;
+
+ background-color: #DDDDDD;
+}
+div.beechat_chatbox a {
+ color: white;
+}
+div.beechat_chatbox a:hover {
+ text-decoration: underline;
+}
+div.beechat_chatbox_roomroster {
+ position: absolute;
+ width: 100px;
+ height: 276px;
+ left: -101px;
+ bottom: -2px;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+
+ border: 1px solid #4B6C8F;
+
+ background-color: #EEEEEE;
+}
+div.beechat_chatbox_roomrosteritem {
+ background-color: #FFFFFF;
+ margin: 3px;
+ padding-left: 2px;
+}
+div.beechat_chatbox_chatroom {
+ position: absolute;
+ width: 240px;
+ height: 300px;
+ left: 100px;
+ bottom: 0px;
+ margin: 0;
+ padding: 0;
+
+ background-color: #DDDDDD;
+}
+div.beechat_chatbox_chatroom a {
+ color: white;
+}
+div.beechat_chatbox_chatroom a:hover {
+ text-decoration: underline;
+}
+
+div.beechat_chatbox_room {
+ position: absolute;
+ width: 340px;
+ height: 300px;
+ bottom: 25px;
+ margin: 0;
+ padding: 0;
+
+ background-color: #DDDDDD;
+}
+div.beechat_chatbox_room a {
+ color: white;
+}
+div.beechat_chatbox_room a:hover {
+ text-decoration: underline;
+}
+div.beechat_chatbox_top {
+ width: 238px;
+ height: 24px;
+ margin: 0;
+ padding: 0;
+
+ font-size: 0.9em;
+ color: white;
+ background-color: #193C60;
+ border-top: 1px solid #0B2C4F;
+ border-left: 1px solid #0B2C4F;
+ border-right: 1px solid #0B2C4F;
+}
+div.beechat_chatbox_top .beechat_chatbox_top_icon {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+ z-index: 2;
+
+ width: 50px;
+ height: 50px;
+}
+div.beechat_chatbox_top .beechat_label {
+ float: left;
+ height: 13px;
+ padding: 4px 6px 6px 6px;
+
+ margin-left: 54px;
+}
+div.beechat_chatbox_top_controls {
+ margin: 0;
+ padding: 0;
+}
+div.beechat_chatbox_top_controls .beechat_chatbox_control {
+ float: right;
+ display: block;
+ width: 20px;
+ height: 19px;
+ padding: 2px;
+ margin: 0;
+
+ font-size: 1.2em;
+ font-weight: bold;
+ text-align: center;
+}
+div.beechat_chatbox_subtop {
+ width: 172px;
+ height: 30px;
+ padding: 2px 6px 2px 60px;
+
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ border-bottom: 1px solid #CCCCCC;
+ background-color: #DDDDDD;
+}
+div.beechat_chatbox_content {
+ width: 238px;
+ height: 202px;
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ background-color: white;
+}
+div.beechat_chatbox_content div.beechat_chatbox_message {
+ width: auto;
+ height: auto;
+ margin: 0;
+ padding: 2px;
+ border-top: 1px solid #DDDDDD;
+}
+div.beechat_chatbox_message span.beechat_chatbox_message_sender {
+ position: relative;
+ top: 0;
+ left: 6px;
+ font-weight: bold;
+ font-size: 1em;
+}
+div.beechat_chatbox_message span.beechat_chatbox_message_date {
+ float: right;
+ margin: 0 6px 0 0;
+}
+div.beechat_chatbox_content a {
+ color: #003399;
+}
+div.beechat_chatbox_content a:hover {
+ text-decoration: underline;
+}
+div.beechat_chatbox_content p {
+ margin: 0;
+ padding: 2px 6px;
+}
+div.beechat_chatbox_content p.beechat_chatbox_state {
+ font-size: 1em;
+ color: #888888;
+}
+div.beechat_chatbox_input {
+ width: 238px;
+ height: 40px;
+ margin: 0;
+ padding: 0;
+
+ border-top: 2px solid #BBBBBB;
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ background-color: #DDDDDD;
+}
+div.beechat_chatbox_input textarea {
+ width: 204px;
+ height: 32px;
+ max-width: 240px;
+ max-height: 40px;
+ padding: 4px 4px 4px 30px;
+ margin: auto;
+ overflow: hidden;
+ vertical-align: top;
+ resize: none;
+
+ font-size: 1em;
+ font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif;
+ outline: none;
+ border: none;
+ background: white no-repeat 4px 3px url('<?php echo $url; ?>mod/beechat/graphics/icons/chat_icon.png');
+}
+div.beechat_chatbox_input textarea:focus {
+ outline: none;
+ border: none;
+ background-color: white;
+}
+div.beechat_chatbox_bottom {
+ position: absolute;
+ width: 238px;
+ height: 1px;
+
+ background-color: white;
+ border-left: 1px solid #666666;
+ border-right: 1px solid #666666;
+ border-bottom: 1px solid #666666;
+ z-index: 2;
+}
+div.beechat_chatbox_bottom span {
+ position: absolute;
+ display: block;
+ right: 0;
+ top: 0;
+ width: 152px;
+ height: 1px;
+
+ border-bottom: 1px solid white;
+}
+div.beechat_chatbox_bottom span span {
+ position: absolute;
+ display: block;
+ width: 146px;
+ height: 1px;
+ right: 4px;
+ top: 0;
+
+ border-bottom: 1px solid #BBBBBB;
+}
diff --git a/mod/beechat/views/default/js/b64.js.php b/mod/beechat/views/default/js/b64.js.php
new file mode 100644
index 000000000..201bdbd7c
--- /dev/null
+++ b/mod/beechat/views/default/js/b64.js.php
@@ -0,0 +1,74 @@
+// This code was written by Tyler Akins and has been placed in the
+// public domain. It would be nice if you left this header intact.
+// Base64 code from Tyler Akins -- http://rumkin.com
+
+var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+/**
+ * Encodes a string in base64
+ * @param {String} input The string to encode in base64.
+ */
+function encode64(input) {
+ var output = "";
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
+ keyStr.charAt(enc3) + keyStr.charAt(enc4);
+ } while (i < input.length);
+
+ return output;
+}
+
+/**
+ * Decodes a base64 string.
+ * @param {String} input The string to decode.
+ */
+function decode64(input) {
+ var output = "";
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+ } while (i < input.length);
+
+ return output;
+}
diff --git a/mod/beechat/views/default/js/jquery.cookie.min.js.php b/mod/beechat/views/default/js/jquery.cookie.min.js.php
new file mode 100644
index 000000000..cb09af984
--- /dev/null
+++ b/mod/beechat/views/default/js/jquery.cookie.min.js.php
@@ -0,0 +1,10 @@
+/**
+ * Cookie plugin
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=$.extend({},options);options.expires=-1;}var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}expires='; expires='+date.toUTCString();}var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}return cookieValue;}}; \ No newline at end of file
diff --git a/mod/beechat/views/default/js/jquery.localscroll-1.2.7-min.js.php b/mod/beechat/views/default/js/jquery.localscroll-1.2.7-min.js.php
new file mode 100644
index 000000000..fa583a451
--- /dev/null
+++ b/mod/beechat/views/default/js/jquery.localscroll-1.2.7-min.js.php
@@ -0,0 +1,9 @@
+/**
+ * jQuery.LocalScroll - Animated scrolling navigation, using anchors.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 3/11/2009
+ * @author Ariel Flesler
+ * @version 1.2.7
+ **/
+;(function($){var l=location.href.replace(/#.*/,'');var g=$.localScroll=function(a){$('body').localScroll(a)};g.defaults={duration:1e3,axis:'y',event:'click',stop:true,target:window,reset:true};g.hash=function(a){if(location.hash){a=$.extend({},g.defaults,a);a.hash=false;if(a.reset){var e=a.duration;delete a.duration;$(a.target).scrollTo(0,a);a.duration=e}i(0,location,a)}};$.fn.localScroll=function(b){b=$.extend({},g.defaults,b);return b.lazy?this.bind(b.event,function(a){var e=$([a.target,a.target.parentNode]).filter(d)[0];if(e)i(a,e,b)}):this.find('a,area').filter(d).bind(b.event,function(a){i(a,this,b)}).end().end();function d(){return!!this.href&&!!this.hash&&this.href.replace(this.hash,'')==l&&(!b.filter||$(this).is(b.filter))}};function i(a,e,b){var d=e.hash.slice(1),f=document.getElementById(d)||document.getElementsByName(d)[0];if(!f)return;if(a)a.preventDefault();var h=$(b.target);if(b.lock&&h.is(':animated')||b.onBefore&&b.onBefore.call(b,a,f,h)===false)return;if(b.stop)h.stop(true);if(b.hash){var j=f.id==d?'id':'name',k=$('<a> </a>').attr(j,d).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});f[j]='';$('body').prepend(k);location=e.hash;k.remove();f[j]=d}h.scrollTo(f,b).trigger('notify.serialScroll',[f])}})(jQuery); \ No newline at end of file
diff --git a/mod/beechat/views/default/js/jquery.scrollTo-min.js.php b/mod/beechat/views/default/js/jquery.scrollTo-min.js.php
new file mode 100755
index 000000000..5e7877810
--- /dev/null
+++ b/mod/beechat/views/default/js/jquery.scrollTo-min.js.php
@@ -0,0 +1,11 @@
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 5/25/2009
+ * @author Ariel Flesler
+ * @version 1.4.2
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); \ No newline at end of file
diff --git a/mod/beechat/views/default/js/jquery.serialScroll-min.js.php b/mod/beechat/views/default/js/jquery.serialScroll-min.js.php
new file mode 100755
index 000000000..d716124f9
--- /dev/null
+++ b/mod/beechat/views/default/js/jquery.serialScroll-min.js.php
@@ -0,0 +1,10 @@
+/*
+ * jQuery.SerialScroll - Animated scrolling of series
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 06/14/2009
+ * @author Ariel Flesler
+ * @version 1.2.2
+ * http://flesler.blogspot.com/2008/02/jqueryserialscroll.html
+ */
+;(function(a){var b=a.serialScroll=function(c){return a(window).serialScroll(c)};b.defaults={duration:1e3,axis:"x",event:"click",start:0,step:1,lock:!0,cycle:!0,constant:!0};a.fn.serialScroll=function(c){return this.each(function(){var t=a.extend({},b.defaults,c),s=t.event,i=t.step,r=t.lazy,e=t.target?this:document,u=a(t.target||this,e),p=u[0],m=t.items,h=t.start,g=t.interval,k=t.navigation,l;if(!r){m=d()}if(t.force){f({},h)}a(t.prev||[],e).bind(s,-i,q);a(t.next||[],e).bind(s,i,q);if(!p.ssbound){u.bind("prev.serialScroll",-i,q).bind("next.serialScroll",i,q).bind("goto.serialScroll",f)}if(g){u.bind("start.serialScroll",function(v){if(!g){o();g=!0;n()}}).bind("stop.serialScroll",function(){o();g=!1})}u.bind("notify.serialScroll",function(x,w){var v=j(w);if(v>-1){h=v}});p.ssbound=!0;if(t.jump){(r?u:d()).bind(s,function(v){f(v,j(v.target))})}if(k){k=a(k,e).bind(s,function(v){v.data=Math.round(d().length/k.length)*k.index(this);f(v,this)})}function q(v){v.data+=h;f(v,this)}function f(B,z){if(!isNaN(z)){B.data=z;z=p}var C=B.data,v,D=B.type,A=t.exclude?d().slice(0,-t.exclude):d(),y=A.length,w=A[C],x=t.duration;if(D){B.preventDefault()}if(g){o();l=setTimeout(n,t.interval)}if(!w){v=C<0?0:y-1;if(h!=v){C=v}else{if(!t.cycle){return}else{C=y-v-1}}w=A[C]}if(!w||t.lock&&u.is(":animated")||D&&t.onBefore&&t.onBefore(B,w,u,d(),C)===!1){return}if(t.stop){u.queue("fx",[]).stop()}if(t.constant){x=Math.abs(x/i*(h-C))}u.scrollTo(w,x,t).trigger("notify.serialScroll",[C])}function n(){u.trigger("next.serialScroll")}function o(){clearTimeout(l)}function d(){return a(m,p)}function j(w){if(!isNaN(w)){return w}var x=d(),v;while((v=x.index(w))==-1&&w!=p){w=w.parentNode}return v}})}})(jQuery); \ No newline at end of file
diff --git a/mod/beechat/views/default/js/jquery.tools.min.js.php b/mod/beechat/views/default/js/jquery.tools.min.js.php
new file mode 100644
index 000000000..1574af45b
--- /dev/null
+++ b/mod/beechat/views/default/js/jquery.tools.min.js.php
@@ -0,0 +1,49 @@
+/*
+ * jQuery Tools 1.2.2 - The missing UI library for the Web
+ *
+ * [tabs, tabs.slideshow, tooltip, tooltip.slide, tooltip.dynamic, scrollable, scrollable.autoscroll, scrollable.navigator, overlay]
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/
+ *
+ * File generated: Mon Jun 07 08:32:38 GMT 2010
+ */
+(function(c){function p(d,a,b){var e=this,l=d.add(this),h=d.find(b.tabs),j=a.jquery?a:d.children(a),i;h.length||(h=d.children());j.length||(j=d.parent().find(a));j.length||(j=c(a));c.extend(this,{click:function(f,g){var k=h.eq(f);if(typeof f=="string"&&f.replace("#","")){k=h.filter("[href*="+f.replace("#","")+"]");f=Math.max(h.index(k),0)}if(b.rotate){var n=h.length-1;if(f<0)return e.click(n,g);if(f>n)return e.click(0,g)}if(!k.length){if(i>=0)return e;f=b.initialIndex;k=h.eq(f)}if(f===i)return e;
+g=g||c.Event();g.type="onBeforeClick";l.trigger(g,[f]);if(!g.isDefaultPrevented()){o[b.effect].call(e,f,function(){g.type="onClick";l.trigger(g,[f])});i=f;h.removeClass(b.current);k.addClass(b.current);return e}},getConf:function(){return b},getTabs:function(){return h},getPanes:function(){return j},getCurrentPane:function(){return j.eq(i)},getCurrentTab:function(){return h.eq(i)},getIndex:function(){return i},next:function(){return e.click(i+1)},prev:function(){return e.click(i-1)}});c.each("onBeforeClick,onClick".split(","),
+function(f,g){c.isFunction(b[g])&&c(e).bind(g,b[g]);e[g]=function(k){c(e).bind(g,k);return e}});if(b.history&&c.fn.history){c.tools.history.init(h);b.event="history"}h.each(function(f){c(this).bind(b.event,function(g){e.click(f,g);return g.preventDefault()})});j.find("a[href^=#]").click(function(f){e.click(c(this).attr("href"),f)});if(location.hash)e.click(location.hash);else if(b.initialIndex===0||b.initialIndex>0)e.click(b.initialIndex)}c.tools=c.tools||{version:"1.2.2"};c.tools.tabs={conf:{tabs:"a",
+current:"current",onBeforeClick:null,onClick:null,effect:"default",initialIndex:0,event:"click",rotate:false,history:false},addEffect:function(d,a){o[d]=a}};var o={"default":function(d,a){this.getPanes().hide().eq(d).show();a.call()},fade:function(d,a){var b=this.getConf(),e=b.fadeOutSpeed,l=this.getPanes();e?l.fadeOut(e):l.hide();l.eq(d).fadeIn(b.fadeInSpeed,a)},slide:function(d,a){this.getPanes().slideUp(200);this.getPanes().eq(d).slideDown(400,a)},ajax:function(d,a){this.getPanes().eq(0).load(this.getTabs().eq(d).attr("href"),
+a)}},m;c.tools.tabs.addEffect("horizontal",function(d,a){m||(m=this.getPanes().eq(0).width());this.getCurrentPane().animate({width:0},function(){c(this).hide()});this.getPanes().eq(d).animate({width:m},function(){c(this).show();a.call()})});c.fn.tabs=function(d,a){var b=this.data("tabs");if(b)return b;if(c.isFunction(a))a={onBeforeClick:a};a=c.extend({},c.tools.tabs.conf,a);this.each(function(){b=new p(c(this),d,a);c(this).data("tabs",b)});return a.api?b:this}})(jQuery);
+(function(d){function r(g,a){function p(f){var e=d(f);return e.length<2?e:g.parent().find(f)}var c=this,j=g.add(this),b=g.data("tabs"),h,l,m,n=false,o=p(a.next).click(function(){b.next()}),k=p(a.prev).click(function(){b.prev()});d.extend(c,{getTabs:function(){return b},getConf:function(){return a},play:function(){if(!h){var f=d.Event("onBeforePlay");j.trigger(f);if(f.isDefaultPrevented())return c;n=false;h=setInterval(b.next,a.interval);j.trigger("onPlay");b.next()}},pause:function(){if(!h)return c;
+var f=d.Event("onBeforePause");j.trigger(f);if(f.isDefaultPrevented())return c;h=clearInterval(h);m=clearInterval(m);j.trigger("onPause")},stop:function(){c.pause();n=true}});d.each("onBeforePlay,onPlay,onBeforePause,onPause".split(","),function(f,e){d.isFunction(a[e])&&c.bind(e,a[e]);c[e]=function(s){return c.bind(e,s)}});if(a.autopause){var t=b.getTabs().add(o).add(k).add(b.getPanes());t.hover(function(){c.pause();l=clearInterval(l)},function(){n||(l=setTimeout(c.play,a.interval))})}if(a.autoplay)m=
+setTimeout(c.play,a.interval);else c.stop();a.clickable&&b.getPanes().click(function(){b.next()});if(!b.getConf().rotate){var i=a.disabledClass;b.getIndex()||k.addClass(i);b.onBeforeClick(function(f,e){if(e){k.removeClass(i);e==b.getTabs().length-1?o.addClass(i):o.removeClass(i)}else k.addClass(i)})}}var q;q=d.tools.tabs.slideshow={conf:{next:".forward",prev:".backward",disabledClass:"disabled",autoplay:false,autopause:true,interval:3E3,clickable:true,api:false}};d.fn.slideshow=function(g){var a=
+this.data("slideshow");if(a)return a;g=d.extend({},q.conf,g);this.each(function(){a=new r(d(this),g);d(this).data("slideshow",a)});return g.api?a:this}})(jQuery);
+(function(f){function p(a,b,c){var h=c.relative?a.position().top:a.offset().top,e=c.relative?a.position().left:a.offset().left,i=c.position[0];h-=b.outerHeight()-c.offset[0];e+=a.outerWidth()+c.offset[1];var j=b.outerHeight()+a.outerHeight();if(i=="center")h+=j/2;if(i=="bottom")h+=j;i=c.position[1];a=b.outerWidth()+a.outerWidth();if(i=="center")e-=a/2;if(i=="left")e-=a;return{top:h,left:e}}function t(a,b){var c=this,h=a.add(c),e,i=0,j=0,m=a.attr("title"),q=n[b.effect],k,r=a.is(":input"),u=r&&a.is(":checkbox, :radio, select, :button"),
+s=a.attr("type"),l=b.events[s]||b.events[r?u?"widget":"input":"def"];if(!q)throw'Nonexistent effect "'+b.effect+'"';l=l.split(/,\s*/);if(l.length!=2)throw"Tooltip: bad events configuration for "+s;a.bind(l[0],function(d){if(b.predelay){clearTimeout(i);j=setTimeout(function(){c.show(d)},b.predelay)}else c.show(d)}).bind(l[1],function(d){if(b.delay){clearTimeout(j);i=setTimeout(function(){c.hide(d)},b.delay)}else c.hide(d)});if(m&&b.cancelDefault){a.removeAttr("title");a.data("title",m)}f.extend(c,
+{show:function(d){if(!e){if(m)e=f(b.layout).addClass(b.tipClass).appendTo(document.body).hide().append(m);else if(b.tip)e=f(b.tip).eq(0);else{e=a.next();e.length||(e=a.parent().next())}if(!e.length)throw"Cannot find tooltip for "+a;}if(c.isShown())return c;e.stop(true,true);var g=p(a,e,b);d=d||f.Event();d.type="onBeforeShow";h.trigger(d,[g]);if(d.isDefaultPrevented())return c;g=p(a,e,b);e.css({position:"absolute",top:g.top,left:g.left});k=true;q[0].call(c,function(){d.type="onShow";k="full";h.trigger(d)});
+g=b.events.tooltip.split(/,\s*/);e.bind(g[0],function(){clearTimeout(i);clearTimeout(j)});g[1]&&!a.is("input:not(:checkbox, :radio), textarea")&&e.bind(g[1],function(o){o.relatedTarget!=a[0]&&a.trigger(l[1].split(" ")[0])});return c},hide:function(d){if(!e||!c.isShown())return c;d=d||f.Event();d.type="onBeforeHide";h.trigger(d);if(!d.isDefaultPrevented()){k=false;n[b.effect][1].call(c,function(){d.type="onHide";k=false;h.trigger(d)});return c}},isShown:function(d){return d?k=="full":k},getConf:function(){return b},
+getTip:function(){return e},getTrigger:function(){return a}});f.each("onHide,onBeforeShow,onShow,onBeforeHide".split(","),function(d,g){f.isFunction(b[g])&&f(c).bind(g,b[g]);c[g]=function(o){f(c).bind(g,o);return c}})}f.tools=f.tools||{version:"1.2.2"};f.tools.tooltip={conf:{effect:"toggle",fadeOutSpeed:"fast",predelay:0,delay:30,opacity:1,tip:0,position:["top","center"],offset:[0,0],relative:false,cancelDefault:true,events:{def:"mouseenter,mouseleave",input:"focus,blur",widget:"focus mouseenter,blur mouseleave",
+tooltip:"mouseenter,mouseleave"},layout:"<div/>",tipClass:"tooltip"},addEffect:function(a,b,c){n[a]=[b,c]}};var n={toggle:[function(a){var b=this.getConf(),c=this.getTip();b=b.opacity;b<1&&c.css({opacity:b});c.show();a.call()},function(a){this.getTip().hide();a.call()}],fade:[function(a){var b=this.getConf();this.getTip().fadeTo(b.fadeInSpeed,b.opacity,a)},function(a){this.getTip().fadeOut(this.getConf().fadeOutSpeed,a)}]};f.fn.tooltip=function(a){var b=this.data("tooltip");if(b)return b;a=f.extend(true,
+{},f.tools.tooltip.conf,a);if(typeof a.position=="string")a.position=a.position.split(/,?\s/);this.each(function(){b=new t(f(this),a);f(this).data("tooltip",b)});return a.api?b:this}})(jQuery);
+(function(d){var i=d.tools.tooltip;d.extend(i.conf,{direction:"up",bounce:false,slideOffset:10,slideInSpeed:200,slideOutSpeed:200,slideFade:!d.browser.msie});var e={up:["-","top"],down:["+","top"],left:["-","left"],right:["+","left"]};i.addEffect("slide",function(g){var a=this.getConf(),f=this.getTip(),b=a.slideFade?{opacity:a.opacity}:{},c=e[a.direction]||e.up;b[c[1]]=c[0]+"="+a.slideOffset;a.slideFade&&f.css({opacity:0});f.show().animate(b,a.slideInSpeed,g)},function(g){var a=this.getConf(),f=a.slideOffset,
+b=a.slideFade?{opacity:0}:{},c=e[a.direction]||e.up,h=""+c[0];if(a.bounce)h=h=="+"?"-":"+";b[c[1]]=h+"="+f;this.getTip().animate(b,a.slideOutSpeed,function(){d(this).hide();g.call()})})})(jQuery);
+(function(g){function j(a){var c=g(window),d=c.width()+c.scrollLeft(),h=c.height()+c.scrollTop();return[a.offset().top<=c.scrollTop(),d<=a.offset().left+a.width(),h<=a.offset().top+a.height(),c.scrollLeft()>=a.offset().left]}function k(a){for(var c=a.length;c--;)if(a[c])return false;return true}var i=g.tools.tooltip;i.dynamic={conf:{classNames:"top right bottom left"}};g.fn.dynamic=function(a){if(typeof a=="number")a={speed:a};a=g.extend({},i.dynamic.conf,a);var c=a.classNames.split(/\s/),d;this.each(function(){var h=
+g(this).tooltip().onBeforeShow(function(e,f){e=this.getTip();var b=this.getConf();d||(d=[b.position[0],b.position[1],b.offset[0],b.offset[1],g.extend({},b)]);g.extend(b,d[4]);b.position=[d[0],d[1]];b.offset=[d[2],d[3]];e.css({visibility:"hidden",position:"absolute",top:f.top,left:f.left}).show();f=j(e);if(!k(f)){if(f[2]){g.extend(b,a.top);b.position[0]="top";e.addClass(c[0])}if(f[3]){g.extend(b,a.right);b.position[1]="right";e.addClass(c[1])}if(f[0]){g.extend(b,a.bottom);b.position[0]="bottom";e.addClass(c[2])}if(f[1]){g.extend(b,
+a.left);b.position[1]="left";e.addClass(c[3])}if(f[0]||f[2])b.offset[0]*=-1;if(f[1]||f[3])b.offset[1]*=-1}e.css({visibility:"visible"}).hide()});h.onBeforeShow(function(){var e=this.getConf();this.getTip();setTimeout(function(){e.position=[d[0],d[1]];e.offset=[d[2],d[3]]},0)});h.onHide(function(){var e=this.getTip();e.removeClass(a.classNames)});ret=h});return a.api?ret:this}})(jQuery);
+(function(e){function n(f,c){var a=e(c);return a.length<2?a:f.parent().find(c)}function t(f,c){var a=this,l=f.add(a),g=f.children(),k=0,m=c.vertical;j||(j=a);if(g.length>1)g=e(c.items,f);e.extend(a,{getConf:function(){return c},getIndex:function(){return k},getSize:function(){return a.getItems().size()},getNaviButtons:function(){return o.add(p)},getRoot:function(){return f},getItemWrap:function(){return g},getItems:function(){return g.children(c.item).not("."+c.clonedClass)},move:function(b,d){return a.seekTo(k+
+b,d)},next:function(b){return a.move(1,b)},prev:function(b){return a.move(-1,b)},begin:function(b){return a.seekTo(0,b)},end:function(b){return a.seekTo(a.getSize()-1,b)},focus:function(){return j=a},addItem:function(b){b=e(b);if(c.circular){e(".cloned:last").before(b);e(".cloned:first").replaceWith(b.clone().addClass(c.clonedClass))}else g.append(b);l.trigger("onAddItem",[b]);return a},seekTo:function(b,d,h){if(c.circular&&b===0&&k==-1&&d!==0)return a;if(!c.circular&&b<0||b>a.getSize()||b<-1)return a;
+var i=b;if(b.jquery)b=a.getItems().index(b);else i=a.getItems().eq(b);var q=e.Event("onBeforeSeek");if(!h){l.trigger(q,[b,d]);if(q.isDefaultPrevented()||!i.length)return a}i=m?{top:-i.position().top}:{left:-i.position().left};k=b;j=a;if(d===undefined)d=c.speed;g.animate(i,d,c.easing,h||function(){l.trigger("onSeek",[b])});return a}});e.each(["onBeforeSeek","onSeek","onAddItem"],function(b,d){e.isFunction(c[d])&&e(a).bind(d,c[d]);a[d]=function(h){e(a).bind(d,h);return a}});if(c.circular){var r=a.getItems().slice(-1).clone().prependTo(g),
+s=a.getItems().eq(1).clone().appendTo(g);r.add(s).addClass(c.clonedClass);a.onBeforeSeek(function(b,d,h){if(!b.isDefaultPrevented())if(d==-1){a.seekTo(r,h,function(){a.end(0)});return b.preventDefault()}else d==a.getSize()&&a.seekTo(s,h,function(){a.begin(0)})});a.seekTo(0,0)}var o=n(f,c.prev).click(function(){a.prev()}),p=n(f,c.next).click(function(){a.next()});!c.circular&&a.getSize()>1&&a.onBeforeSeek(function(b,d){o.toggleClass(c.disabledClass,d<=0);p.toggleClass(c.disabledClass,d>=a.getSize()-
+1)});c.mousewheel&&e.fn.mousewheel&&f.mousewheel(function(b,d){if(c.mousewheel){a.move(d<0?1:-1,c.wheelSpeed||50);return false}});c.keyboard&&e(document).bind("keydown.scrollable",function(b){if(!(!c.keyboard||b.altKey||b.ctrlKey||e(b.target).is(":input")))if(!(c.keyboard!="static"&&j!=a)){var d=b.keyCode;if(m&&(d==38||d==40)){a.move(d==38?-1:1);return b.preventDefault()}if(!m&&(d==37||d==39)){a.move(d==37?-1:1);return b.preventDefault()}}});e(a).trigger("onBeforeSeek",[c.initialIndex])}e.tools=e.tools||
+{version:"1.2.2"};e.tools.scrollable={conf:{activeClass:"active",circular:false,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:null,items:".items",keyboard:true,mousewheel:false,next:".next",prev:".prev",speed:400,vertical:false,wheelSpeed:0}};var j;e.fn.scrollable=function(f){var c=this.data("scrollable");if(c)return c;f=e.extend({},e.tools.scrollable.conf,f);this.each(function(){c=new t(e(this),f);e(this).data("scrollable",c)});return f.api?c:this}})(jQuery);
+(function(c){var g=c.tools.scrollable;g.autoscroll={conf:{autoplay:true,interval:3E3,autopause:true}};c.fn.autoscroll=function(d){if(typeof d=="number")d={interval:d};var b=c.extend({},g.autoscroll.conf,d),h;this.each(function(){var a=c(this).data("scrollable");if(a)h=a;var e,i,f=true;a.play=function(){if(!e){f=false;e=setInterval(function(){a.next()},b.interval);a.next()}};a.pause=function(){e=clearInterval(e)};a.stop=function(){a.pause();f=true};b.autopause&&a.getRoot().add(a.getNaviButtons()).hover(function(){a.pause();
+clearInterval(i)},function(){f||(i=setTimeout(a.play,b.interval))});b.autoplay&&setTimeout(a.play,b.interval)});return b.api?h:this}})(jQuery);
+(function(d){function p(c,g){var h=d(g);return h.length<2?h:c.parent().find(g)}var m=d.tools.scrollable;m.navigator={conf:{navi:".navi",naviItem:null,activeClass:"active",indexed:false,idPrefix:null,history:false}};d.fn.navigator=function(c){if(typeof c=="string")c={navi:c};c=d.extend({},m.navigator.conf,c);var g;this.each(function(){function h(a,b,i){e.seekTo(b);if(j){if(location.hash)location.hash=a.attr("href").replace("#","")}else return i.preventDefault()}function f(){return k.find(c.naviItem||
+"> *")}function n(a){var b=d("<"+(c.naviItem||"a")+"/>").click(function(i){h(d(this),a,i)}).attr("href","#"+a);a===0&&b.addClass(l);c.indexed&&b.text(a+1);c.idPrefix&&b.attr("id",c.idPrefix+a);return b.appendTo(k)}function o(a,b){a=f().eq(b.replace("#",""));a.length||(a=f().filter("[href="+b+"]"));a.click()}var e=d(this).data("scrollable"),k=p(e.getRoot(),c.navi),q=e.getNaviButtons(),l=c.activeClass,j=c.history&&d.fn.history;if(e)g=e;e.getNaviButtons=function(){return q.add(k)};f().length?f().each(function(a){d(this).click(function(b){h(d(this),
+a,b)})}):d.each(e.getItems(),function(a){n(a)});e.onBeforeSeek(function(a,b){var i=f().eq(b);!a.isDefaultPrevented()&&i.length&&f().removeClass(l).eq(b).addClass(l)});e.onAddItem(function(a,b){b=n(e.getItems().index(b));j&&b.history(o)});j&&f().history(o)});return c.api?g:this}})(jQuery);
+(function(a){function t(d,b){var c=this,i=d.add(c),o=a(window),k,f,m,g=a.tools.expose&&(b.mask||b.expose),n=Math.random().toString().slice(10);if(g){if(typeof g=="string")g={color:g};g.closeOnClick=g.closeOnEsc=false}var p=b.target||d.attr("rel");f=p?a(p):d;if(!f.length)throw"Could not find Overlay: "+p;d&&d.index(f)==-1&&d.click(function(e){c.load(e);return e.preventDefault()});a.extend(c,{load:function(e){if(c.isOpened())return c;var h=q[b.effect];if(!h)throw'Overlay: cannot find effect : "'+b.effect+
+'"';b.oneInstance&&a.each(s,function(){this.close(e)});e=e||a.Event();e.type="onBeforeLoad";i.trigger(e);if(e.isDefaultPrevented())return c;m=true;g&&a(f).expose(g);var j=b.top,r=b.left,u=f.outerWidth({margin:true}),v=f.outerHeight({margin:true});if(typeof j=="string")j=j=="center"?Math.max((o.height()-v)/2,0):parseInt(j,10)/100*o.height();if(r=="center")r=Math.max((o.width()-u)/2,0);h[0].call(c,{top:j,left:r},function(){if(m){e.type="onLoad";i.trigger(e)}});g&&b.closeOnClick&&a.mask.getMask().one("click",
+c.close);b.closeOnClick&&a(document).bind("click."+n,function(l){a(l.target).parents(f).length||c.close(l)});b.closeOnEsc&&a(document).bind("keydown."+n,function(l){l.keyCode==27&&c.close(l)});return c},close:function(e){if(!c.isOpened())return c;e=e||a.Event();e.type="onBeforeClose";i.trigger(e);if(!e.isDefaultPrevented()){m=false;q[b.effect][1].call(c,function(){e.type="onClose";i.trigger(e)});a(document).unbind("click."+n).unbind("keydown."+n);g&&a.mask.close();return c}},getOverlay:function(){return f},
+getTrigger:function(){return d},getClosers:function(){return k},isOpened:function(){return m},getConf:function(){return b}});a.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","),function(e,h){a.isFunction(b[h])&&a(c).bind(h,b[h]);c[h]=function(j){a(c).bind(h,j);return c}});k=f.find(b.close||".close");if(!k.length&&!b.close){k=a('<div class="close"></div>');f.prepend(k)}k.click(function(e){c.close(e)});b.load&&c.load()}a.tools=a.tools||{version:"1.2.2"};a.tools.overlay={addEffect:function(d,
+b,c){q[d]=[b,c]},conf:{close:null,closeOnClick:true,closeOnEsc:true,closeSpeed:"fast",effect:"default",fixed:!a.browser.msie||a.browser.version>6,left:"center",load:false,mask:null,oneInstance:true,speed:"normal",target:null,top:"10%"}};var s=[],q={};a.tools.overlay.addEffect("default",function(d,b){var c=this.getConf(),i=a(window);if(!c.fixed){d.top+=i.scrollTop();d.left+=i.scrollLeft()}d.position=c.fixed?"fixed":"absolute";this.getOverlay().css(d).fadeIn(c.speed,b)},function(d){this.getOverlay().fadeOut(this.getConf().closeSpeed,
+d)});a.fn.overlay=function(d){var b=this.data("overlay");if(b)return b;if(a.isFunction(d))d={onBeforeLoad:d};d=a.extend(true,{},a.tools.overlay.conf,d);this.each(function(){b=new t(a(this),d);s.push(b);a(this).data("overlay",b)});return d.api?b:this}})(jQuery);
diff --git a/mod/beechat/views/default/js/json2.js.php b/mod/beechat/views/default/js/json2.js.php
new file mode 100644
index 000000000..7ae503202
--- /dev/null
+++ b/mod/beechat/views/default/js/json2.js.php
@@ -0,0 +1,476 @@
+/*
+ http://www.JSON.org/json2.js
+ 2009-06-29
+
+ Public Domain.
+
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+ See http://www.JSON.org/js.html
+
+ This file creates a global JSON object containing two methods: stringify
+ and parse.
+
+ JSON.stringify(value, replacer, space)
+ value any JavaScript value, usually an object or array.
+
+ replacer an optional parameter that determines how object
+ values are stringified for objects. It can be a
+ function or an array of strings.
+
+ space an optional parameter that specifies the indentation
+ of nested structures. If it is omitted, the text will
+ be packed without extra whitespace. If it is a number,
+ it will specify the number of spaces to indent at each
+ level. If it is a string (such as '\t' or '&nbsp;'),
+ it contains the characters used to indent at each level.
+
+ This method produces a JSON text from a JavaScript value.
+
+ When an object value is found, if the object contains a toJSON
+ method, its toJSON method will be called and the result will be
+ stringified. A toJSON method does not serialize: it returns the
+ value represented by the name/value pair that should be serialized,
+ or undefined if nothing should be serialized. The toJSON method
+ will be passed the key associated with the value, and this will be
+ bound to the object holding the key.
+
+ For example, this would serialize Dates as ISO strings.
+
+ Date.prototype.toJSON = function (key) {
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ You can provide an optional replacer method. It will be passed the
+ key and value of each member, with this bound to the containing
+ object. The value that is returned from your method will be
+ serialized. If your method returns undefined, then the member will
+ be excluded from the serialization.
+
+ If the replacer parameter is an array of strings, then it will be
+ used to select the members to be serialized. It filters the results
+ such that only members with keys listed in the replacer array are
+ stringified.
+
+ Values that do not have JSON representations, such as undefined or
+ functions, will not be serialized. Such values in objects will be
+ dropped; in arrays they will be replaced with null. You can use
+ a replacer function to replace those with JSON values.
+ JSON.stringify(undefined) returns undefined.
+
+ The optional space parameter produces a stringification of the
+ value that is filled with line breaks and indentation to make it
+ easier to read.
+
+ If the space parameter is a non-empty string, then that string will
+ be used for indentation. If the space parameter is a number, then
+ the indentation will be that many spaces.
+
+ Example:
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}]);
+ // text is '["e",{"pluribus":"unum"}]'
+
+
+ text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+ text = JSON.stringify([new Date()], function (key, value) {
+ return this[key] instanceof Date ?
+ 'Date(' + this[key] + ')' : value;
+ });
+ // text is '["Date(---current time---)"]'
+
+
+ JSON.parse(text, reviver)
+ This method parses a JSON text to produce an object or array.
+ It can throw a SyntaxError exception.
+
+ The optional reviver parameter is a function that can filter and
+ transform the results. It receives each of the keys and values,
+ and its return value is used instead of the original value.
+ If it returns what it received, then the structure is not modified.
+ If it returns undefined then the member is deleted.
+
+ Example:
+
+ // Parse the text. Values that look like ISO date strings will
+ // be converted to Date objects.
+
+ myData = JSON.parse(text, function (key, value) {
+ var a;
+ if (typeof value === 'string') {
+ a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+ if (a) {
+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+ +a[5], +a[6]));
+ }
+ }
+ return value;
+ });
+
+ myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+ var d;
+ if (typeof value === 'string' &&
+ value.slice(0, 5) === 'Date(' &&
+ value.slice(-1) === ')') {
+ d = new Date(value.slice(5, -1));
+ if (d) {
+ return d;
+ }
+ }
+ return value;
+ });
+
+
+ This is a reference implementation. You are free to copy, modify, or
+ redistribute.
+
+ This code should be minified before deployment.
+ See http://javascript.crockford.com/jsmin.html
+
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+ NOT CONTROL.
+*/
+
+/*jslint evil: true */
+
+/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
+ call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+ lastIndex, length, parse, prototype, push, replace, slice, stringify,
+ test, toJSON, toString, valueOf
+*/
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+var JSON = JSON || {};
+
+(function () {
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ if (typeof Date.prototype.toJSON !== 'function') {
+
+ Date.prototype.toJSON = function (key) {
+
+ return isFinite(this.valueOf()) ?
+ this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z' : null;
+ };
+
+ String.prototype.toJSON =
+ Number.prototype.toJSON =
+ Boolean.prototype.toJSON = function (key) {
+ return this.valueOf();
+ };
+ }
+
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ gap,
+ indent,
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ rep;
+
+
+ function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+ escapable.lastIndex = 0;
+ return escapable.test(string) ?
+ '"' + string.replace(escapable, function (a) {
+ var c = meta[a];
+ return typeof c === 'string' ? c :
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"' :
+ '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+// Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+// What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+ return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+ case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+// Is the value an array?
+
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+ v = partial.length === 0 ? '[]' :
+ gap ? '[\n' + gap +
+ partial.join(',\n' + gap) + '\n' +
+ mind + ']' :
+ '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ k = rep[i];
+ if (typeof k === 'string') {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+ v = partial.length === 0 ? '{}' :
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
+ mind + '}' : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+ if (typeof JSON.stringify !== 'function') {
+ JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+ return str('', {'': value});
+ };
+ }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+ if (typeof JSON.parse !== 'function') {
+ JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+ var j;
+
+ function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+ cx.lastIndex = 0;
+ if (cx.test(text)) {
+ text = text.replace(cx, function (a) {
+ return '\\u' +
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and 'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+ if (/^[\],:{}\s]*$/.
+test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
+replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
+replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+ j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+ return typeof reviver === 'function' ?
+ walk({'': j}, '') : j;
+ }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+ throw new SyntaxError('JSON.parse');
+ };
+ }
+}());
diff --git a/mod/beechat/views/default/js/md5.js.php b/mod/beechat/views/default/js/md5.js.php
new file mode 100644
index 000000000..4284f62bb
--- /dev/null
+++ b/mod/beechat/views/default/js/md5.js.php
@@ -0,0 +1,261 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
+function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
+function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
+function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
+function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
+function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+ return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length
+ */
+function core_md5(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << ((len) % 32);
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ var olda, oldb, oldc, oldd;
+ for(var i = 0; i < x.length; i += 16)
+ {
+ olda = a;
+ oldb = b;
+ oldc = c;
+ oldd = d;
+
+ a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+ d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+ c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
+ b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+ a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+ d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
+ c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+ b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+ a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
+ d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+ c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+ b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+ a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
+ d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+ c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+ b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
+
+ a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+ d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+ c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
+ b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+ a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+ d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
+ c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+ b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+ a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
+ d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+ c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+ b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
+ a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+ d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+ c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
+ b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+ a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+ d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+ c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
+ b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+ a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+ d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
+ c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+ b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+ a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
+ d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+ c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+ b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
+ a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+ d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+ c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
+ b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+ a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+ d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
+ c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+ b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+ a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
+ d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+ c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+ b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+ a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
+ d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+ c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+ b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
+ a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+ d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+ c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
+ b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ }
+ return [a, b, c, d];
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data
+ */
+function core_hmac_md5(key, data)
+{
+ var bkey = str2binl(key);
+ if(bkey.length > 16) { bkey = core_md5(bkey, key.length * chrsz); }
+
+ var ipad = new Array(16), opad = new Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+ return core_md5(opad.concat(hash), 512 + 128);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert a string to an array of little-endian words
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
+ */
+function str2binl(str)
+{
+ var bin = [];
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
+ {
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
+ }
+ return bin;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < bin.length * 32; i += chrsz)
+ {
+ str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of little-endian words to a base-64 string
+ */
+function binl2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ var triplet, j;
+ for(var i = 0; i < binarray.length * 4; i += 3)
+ {
+ triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) |
+ (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) |
+ ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+ for(j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > binarray.length * 32) { str += b64pad; }
+ else { str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); }
+ }
+ }
+ return str;
+}
diff --git a/mod/beechat/views/default/js/sha1.js.php b/mod/beechat/views/default/js/sha1.js.php
new file mode 100644
index 000000000..db3bf0544
--- /dev/null
+++ b/mod/beechat/views/default/js/sha1.js.php
@@ -0,0 +1,207 @@
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS PUB 180-1
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
+function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
+function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
+function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
+function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
+function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function sha1_vm_test()
+{
+ return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
+}
+
+/*
+ * Calculate the SHA-1 of an array of big-endian words, and a bit length
+ */
+function core_sha1(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << (24 - len % 32);
+ x[((len + 64 >> 9) << 4) + 15] = len;
+
+ var w = new Array(80);
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+ var e = -1009589776;
+
+ var i, j, t, olda, oldb, oldc, oldd, olde;
+ for (i = 0; i < x.length; i += 16)
+ {
+ olda = a;
+ oldb = b;
+ oldc = c;
+ oldd = d;
+ olde = e;
+
+ for (j = 0; j < 80; j++)
+ {
+ if (j < 16) { w[j] = x[i + j]; }
+ else { w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); }
+ t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
+ safe_add(safe_add(e, w[j]), sha1_kt(j)));
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = t;
+ }
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ e = safe_add(e, olde);
+ }
+ return [a, b, c, d, e];
+}
+
+/*
+ * Perform the appropriate triplet combination function for the current
+ * iteration
+ */
+function sha1_ft(t, b, c, d)
+{
+ if (t < 20) { return (b & c) | ((~b) & d); }
+ if (t < 40) { return b ^ c ^ d; }
+ if (t < 60) { return (b & c) | (b & d) | (c & d); }
+ return b ^ c ^ d;
+}
+
+/*
+ * Determine the appropriate additive constant for the current iteration
+ */
+function sha1_kt(t)
+{
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
+ (t < 60) ? -1894007588 : -899497514;
+}
+
+/*
+ * Calculate the HMAC-SHA1 of a key and some data
+ */
+function core_hmac_sha1(key, data)
+{
+ var bkey = str2binb(key);
+ if (bkey.length > 16) { bkey = core_sha1(bkey, key.length * chrsz); }
+
+ var ipad = new Array(16), opad = new Array(16);
+ for (var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
+ return core_sha1(opad.concat(hash), 512 + 160);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert an 8-bit or 16-bit string to an array of big-endian words
+ * In 8-bit function, characters >255 have their hi-byte silently ignored.
+ */
+function str2binb(str)
+{
+ var bin = [];
+ var mask = (1 << chrsz) - 1;
+ for (var i = 0; i < str.length * chrsz; i += chrsz)
+ {
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
+ }
+ return bin;
+}
+
+/*
+ * Convert an array of big-endian words to a string
+ */
+function binb2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for (var i = 0; i < bin.length * 32; i += chrsz)
+ {
+ str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a hex string.
+ */
+function binb2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for (var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a base-64 string
+ */
+function binb2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ var triplet, j;
+ for (var i = 0; i < binarray.length * 4; i += 3)
+ {
+ triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) |
+ (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) |
+ ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
+ for (j = 0; j < 4; j++)
+ {
+ if (i * 8 + j * 6 > binarray.length * 32) { str += b64pad; }
+ else { str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); }
+ }
+ }
+ return str;
+}
diff --git a/mod/beechat/views/default/js/strophe.min.js.php b/mod/beechat/views/default/js/strophe.min.js.php
new file mode 100644
index 000000000..f0eb17906
--- /dev/null
+++ b/mod/beechat/views/default/js/strophe.min.js.php
@@ -0,0 +1 @@
+var Base64=(function(){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var obj={encode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;do{chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64}else{if(isNaN(chr3)){enc4=64}}output=output+keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4)}while(i<input.length);return output},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2)}if(enc4!=64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output}};return obj})();var MD5=(function(){var hexcase=0;var b64pad="";var chrsz=8;var safe_add=function(x,y){var lsw=(x&65535)+(y&65535);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&65535)};var bit_rol=function(num,cnt){return(num<<cnt)|(num>>>(32-cnt))};var str2binl=function(str){var bin=[];var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz){bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32)}return bin};var binl2str=function(bin){var str="";var mask=(1<<chrsz)-1;for(var i=0;i<bin.length*32;i+=chrsz){str+=String.fromCharCode((bin[i>>5]>>>(i%32))&mask)}return str};var binl2hex=function(binarray){var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i<binarray.length*4;i++){str+=hex_tab.charAt((binarray[i>>2]>>((i%4)*8+4))&15)+hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&15)}return str};var binl2b64=function(binarray){var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";var triplet,j;for(var i=0;i<binarray.length*4;i+=3){triplet=(((binarray[i>>2]>>8*(i%4))&255)<<16)|(((binarray[i+1>>2]>>8*((i+1)%4))&255)<<8)|((binarray[i+2>>2]>>8*((i+2)%4))&255);for(j=0;j<4;j++){if(i*8+j*6>binarray.length*32){str+=b64pad}else{str+=tab.charAt((triplet>>6*(3-j))&63)}}}return str};var md5_cmn=function(q,a,b,x,s,t){return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b)};var md5_ff=function(a,b,c,d,x,s,t){return md5_cmn((b&c)|((~b)&d),a,b,x,s,t)};var md5_gg=function(a,b,c,d,x,s,t){return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t)};var md5_hh=function(a,b,c,d,x,s,t){return md5_cmn(b^c^d,a,b,x,s,t)};var md5_ii=function(a,b,c,d,x,s,t){return md5_cmn(c^(b|(~d)),a,b,x,s,t)};var core_md5=function(x,len){x[len>>5]|=128<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var olda,oldb,oldc,oldd;for(var i=0;i<x.length;i+=16){olda=a;oldb=b;oldc=c;oldd=d;a=md5_ff(a,b,c,d,x[i+0],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i+0],20,-373897302);a=md5_gg(a,b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i+0],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);a=md5_ii(a,b,c,d,x[i+0],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],21,-343485551);a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd)}return[a,b,c,d]};var core_hmac_md5=function(key,data){var bkey=str2binl(key);if(bkey.length>16){bkey=core_md5(bkey,key.length*chrsz)}var ipad=new Array(16),opad=new Array(16);for(var i=0;i<16;i++){ipad[i]=bkey[i]^909522486;opad[i]=bkey[i]^1549556828}var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);return core_md5(opad.concat(hash),512+128)};var obj={hexdigest:function(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz))},b64digest:function(s){return binl2b64(core_md5(str2binl(s),s.length*chrsz))},hash:function(s){return binl2str(core_md5(str2binl(s),s.length*chrsz))},hmac_hexdigest:function(key,data){return binl2hex(core_hmac_md5(key,data))},hmac_b64digest:function(key,data){return binl2b64(core_hmac_md5(key,data))},hmac_hash:function(key,data){return binl2str(core_hmac_md5(key,data))},test:function(){return MD5.hexdigest("abc")==="900150983cd24fb0d6963f7d28e17f72"}};return obj})();if(!Function.prototype.bind){Function.prototype.bind=function(obj){var func=this;return function(){return func.apply(obj,arguments)}}}if(!Function.prototype.prependArg){Function.prototype.prependArg=function(arg){var func=this;return function(){var newargs=[arg];for(var i=0;i<arguments.length;i++){newargs.push(arguments[i])}return func.apply(this,newargs)}}}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elt){var len=this.length;var from=Number(arguments[1])||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0){from+=len}for(;from<len;from++){if(from in this&&this[from]===elt){return from}}return -1}}(function(callback){var Strophe;function $build(name,attrs){return new Strophe.Builder(name,attrs)}function $msg(attrs){return new Strophe.Builder("message",attrs)}function $iq(attrs){return new Strophe.Builder("iq",attrs)}function $pres(attrs){return new Strophe.Builder("presence",attrs)}Strophe={VERSION:"1.0.1",NS:{HTTPBIND:"http://jabber.org/protocol/httpbind",BOSH:"urn:xmpp:xbosh",CLIENT:"jabber:client",AUTH:"jabber:iq:auth",ROSTER:"jabber:iq:roster",PROFILE:"jabber:iq:profile",DISCO_INFO:"http://jabber.org/protocol/disco#info",DISCO_ITEMS:"http://jabber.org/protocol/disco#items",MUC:"http://jabber.org/protocol/muc",SASL:"urn:ietf:params:xml:ns:xmpp-sasl",STREAM:"http://etherx.jabber.org/streams",BIND:"urn:ietf:params:xml:ns:xmpp-bind",SESSION:"urn:ietf:params:xml:ns:xmpp-session",VERSION:"jabber:iq:version",STANZAS:"urn:ietf:params:xml:ns:xmpp-stanzas"},addNamespace:function(name,value){Strophe.NS[name]=value},Status:{ERROR:0,CONNECTING:1,CONNFAIL:2,AUTHENTICATING:3,AUTHFAIL:4,CONNECTED:5,DISCONNECTED:6,DISCONNECTING:7,ATTACHED:8},LogLevel:{DEBUG:0,INFO:1,WARN:2,ERROR:3,FATAL:4},ElementType:{NORMAL:1,TEXT:3},TIMEOUT:1.1,SECONDARY_TIMEOUT:0.1,forEachChild:function(elem,elemName,func){var i,childNode;for(i=0;i<elem.childNodes.length;i++){childNode=elem.childNodes[i];if(childNode.nodeType==Strophe.ElementType.NORMAL&&(!elemName||this.isTagEqual(childNode,elemName))){func(childNode)}}},isTagEqual:function(el,name){return el.tagName.toLowerCase()==name.toLowerCase()},_xmlGenerator:null,_makeGenerator:function(){var doc;if(window.ActiveXObject){doc=new ActiveXObject("Microsoft.XMLDOM");doc.appendChild(doc.createElement("strophe"))}else{doc=document.implementation.createDocument("jabber:client","strophe",null)}return doc},xmlElement:function(name){if(!name){return null}var node=null;if(!Strophe._xmlGenerator){Strophe._xmlGenerator=Strophe._makeGenerator()}node=Strophe._xmlGenerator.createElement(name);var a,i,k;for(a=1;a<arguments.length;a++){if(!arguments[a]){continue}if(typeof(arguments[a])=="string"||typeof(arguments[a])=="number"){node.appendChild(Strophe.xmlTextNode(arguments[a]))}else{if(typeof(arguments[a])=="object"&&typeof(arguments[a].sort)=="function"){for(i=0;i<arguments[a].length;i++){if(typeof(arguments[a][i])=="object"&&typeof(arguments[a][i].sort)=="function"){node.setAttribute(arguments[a][i][0],arguments[a][i][1])}}}else{if(typeof(arguments[a])=="object"){for(k in arguments[a]){if(arguments[a].hasOwnProperty(k)){node.setAttribute(k,arguments[a][k])}}}}}}return node},xmlescape:function(text){text=text.replace(/\&/g,"&amp;");text=text.replace(/</g,"&lt;");text=text.replace(/>/g,"&gt;");return text},xmlTextNode:function(text){text=Strophe.xmlescape(text);if(!Strophe._xmlGenerator){Strophe._xmlGenerator=Strophe._makeGenerator()}return Strophe._xmlGenerator.createTextNode(text)},getText:function(elem){if(!elem){return null}var str="";if(elem.childNodes.length===0&&elem.nodeType==Strophe.ElementType.TEXT){str+=elem.nodeValue}for(var i=0;i<elem.childNodes.length;i++){if(elem.childNodes[i].nodeType==Strophe.ElementType.TEXT){str+=elem.childNodes[i].nodeValue}}return str},copyElement:function(elem){var i,el;if(elem.nodeType==Strophe.ElementType.NORMAL){el=Strophe.xmlElement(elem.tagName);for(i=0;i<elem.attributes.length;i++){el.setAttribute(elem.attributes[i].nodeName.toLowerCase(),elem.attributes[i].value)}for(i=0;i<elem.childNodes.length;i++){el.appendChild(Strophe.copyElement(elem.childNodes[i]))}}else{if(elem.nodeType==Strophe.ElementType.TEXT){el=Strophe.xmlTextNode(elem.nodeValue)}}return el},escapeNode:function(node){return node.replace(/^\s+|\s+$/g,"").replace(/\\/g,"\\5c").replace(/ /g,"\\20").replace(/\"/g,"\\22").replace(/\&/g,"\\26").replace(/\'/g,"\\27").replace(/\//g,"\\2f").replace(/:/g,"\\3a").replace(/</g,"\\3c").replace(/>/g,"\\3e").replace(/@/g,"\\40")},unescapeNode:function(node){return node.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(jid){if(jid.indexOf("@")<0){return null}return jid.split("@")[0]},getDomainFromJid:function(jid){var bare=Strophe.getBareJidFromJid(jid);if(bare.indexOf("@")<0){return bare}else{var parts=bare.split("@");parts.splice(0,1);return parts.join("@")}},getResourceFromJid:function(jid){var s=jid.split("/");if(s.length<2){return null}s.splice(0,1);return s.join("/")},getBareJidFromJid:function(jid){return jid.split("/")[0]},log:function(level,msg){return},debug:function(msg){this.log(this.LogLevel.DEBUG,msg)},info:function(msg){this.log(this.LogLevel.INFO,msg)},warn:function(msg){this.log(this.LogLevel.WARN,msg)},error:function(msg){this.log(this.LogLevel.ERROR,msg)},fatal:function(msg){this.log(this.LogLevel.FATAL,msg)},serialize:function(elem){var result;if(!elem){return null}if(typeof(elem.tree)==="function"){elem=elem.tree()}var nodeName=elem.nodeName;var i,child;if(elem.getAttribute("_realname")){nodeName=elem.getAttribute("_realname")}result="<"+nodeName;for(i=0;i<elem.attributes.length;i++){if(elem.attributes[i].nodeName!="_realname"){result+=" "+elem.attributes[i].nodeName.toLowerCase()+"='"+elem.attributes[i].value.replace("&","&amp;").replace("'","&apos;").replace("<","&lt;")+"'"}}if(elem.childNodes.length>0){result+=">";for(i=0;i<elem.childNodes.length;i++){child=elem.childNodes[i];if(child.nodeType==Strophe.ElementType.NORMAL){result+=Strophe.serialize(child)}else{if(child.nodeType==Strophe.ElementType.TEXT){result+=child.nodeValue}}}result+="</"+nodeName+">"}else{result+="/>"}return result},_requestId:0,_connectionPlugins:{},addConnectionPlugin:function(name,ptype){Strophe._connectionPlugins[name]=ptype}};Strophe.Builder=function(name,attrs){if(name=="presence"||name=="message"||name=="iq"){if(attrs&&!attrs.xmlns){attrs.xmlns=Strophe.NS.CLIENT}else{if(!attrs){attrs={xmlns:Strophe.NS.CLIENT}}}}this.nodeTree=Strophe.xmlElement(name,attrs);this.node=this.nodeTree};Strophe.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return Strophe.serialize(this.nodeTree)},up:function(){this.node=this.node.parentNode;return this},attrs:function(moreattrs){for(var k in moreattrs){if(moreattrs.hasOwnProperty(k)){this.node.setAttribute(k,moreattrs[k])}}return this},c:function(name,attrs){var child=Strophe.xmlElement(name,attrs);this.node.appendChild(child);this.node=child;return this},cnode:function(elem){this.node.appendChild(elem);this.node=elem;return this},t:function(text){var child=Strophe.xmlTextNode(text);this.node.appendChild(child);return this}};Strophe.Handler=function(handler,ns,name,type,id,from,options){this.handler=handler;this.ns=ns;this.name=name;this.type=type;this.id=id;this.options=options||{matchbare:false};if(!this.options.matchBare){this.options.matchBare=false}if(this.options.matchBare){this.from=Strophe.getBareJidFromJid(from)}else{this.from=from}this.user=true};Strophe.Handler.prototype={isMatch:function(elem){var nsMatch;var from=null;if(this.options.matchBare){from=Strophe.getBareJidFromJid(elem.getAttribute("from"))}else{from=elem.getAttribute("from")}nsMatch=false;if(!this.ns){nsMatch=true}else{var self=this;Strophe.forEachChild(elem,null,function(elem){if(elem.getAttribute("xmlns")==self.ns){nsMatch=true}});nsMatch=nsMatch||elem.getAttribute("xmlns")==this.ns}if(nsMatch&&(!this.name||Strophe.isTagEqual(elem,this.name))&&(!this.type||elem.getAttribute("type")===this.type)&&(!this.id||elem.getAttribute("id")===this.id)&&(!this.from||from===this.from)){return true}return false},run:function(elem){var result=null;try{result=this.handler(elem)}catch(e){if(e.sourceURL){Strophe.fatal("error: "+this.handler+" "+e.sourceURL+":"+e.line+" - "+e.name+": "+e.message)}else{if(e.fileName){if(typeof(console)!="undefined"){console.trace();console.error(this.handler," - error - ",e,e.message)}Strophe.fatal("error: "+this.handler+" "+e.fileName+":"+e.lineNumber+" - "+e.name+": "+e.message)}else{Strophe.fatal("error: "+this.handler)}}throw e}return result},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}};Strophe.TimedHandler=function(period,handler){this.period=period;this.handler=handler;this.lastCalled=new Date().getTime();this.user=true};Strophe.TimedHandler.prototype={run:function(){this.lastCalled=new Date().getTime();return this.handler()},reset:function(){this.lastCalled=new Date().getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}};Strophe.Request=function(elem,func,rid,sends){this.id=++Strophe._requestId;this.xmlData=elem;this.data=Strophe.serialize(elem);this.origFunc=func;this.func=func;this.rid=rid;this.date=NaN;this.sends=sends||0;this.abort=false;this.dead=null;this.age=function(){if(!this.date){return 0}var now=new Date();return(now-this.date)/1000};this.timeDead=function(){if(!this.dead){return 0}var now=new Date();return(now-this.dead)/1000};this.xhr=this._newXHR()};Strophe.Request.prototype={getResponse:function(){var node=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){node=this.xhr.responseXML.documentElement;if(node.tagName=="parsererror"){Strophe.error("invalid response received");Strophe.error("responseText: "+this.xhr.responseText);Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML));throw"parsererror"}}else{if(this.xhr.responseText){Strophe.error("invalid response received");Strophe.error("responseText: "+this.xhr.responseText);Strophe.error("responseXML: "+Strophe.serialize(this.xhr.responseXML))}}return node},_newXHR:function(){var xhr=null;if(window.XMLHttpRequest){xhr=new XMLHttpRequest();if(xhr.overrideMimeType){xhr.overrideMimeType("text/xml")}}else{if(window.ActiveXObject){xhr=new ActiveXObject("Microsoft.XMLHTTP")}}xhr.onreadystatechange=this.func.prependArg(this);return xhr}};Strophe.Connection=function(service){this.service=service;this.jid="";this.rid=Math.floor(Math.random()*4294967295);this.sid=null;this.streamId=null;this.do_session=false;this.do_bind=false;this.timedHandlers=[];this.handlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[];this._idleTimeout=null;this._disconnectTimeout=null;this.authenticated=false;this.disconnecting=false;this.connected=false;this.errors=0;this.paused=false;this.hold=1;this.wait=60;this.window=5;this._data=[];this._requests=[];this._uniqueId=Math.round(Math.random()*10000);this._sasl_success_handler=null;this._sasl_failure_handler=null;this._sasl_challenge_handler=null;this._idleTimeout=setTimeout(this._onIdle.bind(this),100);for(var k in Strophe._connectionPlugins){if(Strophe._connectionPlugins.hasOwnProperty(k)){var ptype=Strophe._connectionPlugins[k];var F=function(){};F.prototype=ptype;this[k]=new F();this[k].init(this)}}};Strophe.Connection.prototype={reset:function(){this.rid=Math.floor(Math.random()*4294967295);this.sid=null;this.streamId=null;this.do_session=false;this.do_bind=false;this.timedHandlers=[];this.handlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[];this.authenticated=false;this.disconnecting=false;this.connected=false;this.errors=0;this._requests=[];this._uniqueId=Math.round(Math.random()*10000)},pause:function(){this.paused=true},resume:function(){this.paused=false},getUniqueId:function(suffix){if(typeof(suffix)=="string"||typeof(suffix)=="number"){return ++this._uniqueId+":"+suffix}else{return ++this._uniqueId+""}},connect:function(jid,pass,callback,wait,hold){this.jid=jid;this.pass=pass;this.connect_callback=callback;this.disconnecting=false;this.connected=false;this.authenticated=false;this.errors=0;this.wait=wait||this.wait;this.hold=hold||this.hold;this.domain=Strophe.getDomainFromJid(this.jid);var body=this._buildBody().attrs({to:this.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":Strophe.NS.BOSH});this._changeConnectStatus(Strophe.Status.CONNECTING,null);this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this).prependArg(this._connect_cb.bind(this)),body.tree().getAttribute("rid")));this._throttledRequestHandler()},attach:function(jid,sid,rid,callback,wait,hold,wind){this.jid=jid;this.sid=sid;this.rid=rid;this.connect_callback=callback;this.domain=Strophe.getDomainFromJid(this.jid);this.authenticated=true;this.connected=true;this.wait=wait||this.wait;this.hold=hold||this.hold;this.window=wind||this.window;this._changeConnectStatus(Strophe.Status.ATTACHED,null)},xmlInput:function(elem){return},xmlOutput:function(elem){return},rawInput:function(data){return},rawOutput:function(data){return},send:function(elem){if(elem===null){return}if(typeof(elem.sort)==="function"){for(var i=0;i<elem.length;i++){this._queueData(elem[i])}}else{if(typeof(elem.tree)==="function"){this._queueData(elem.tree())}else{this._queueData(elem)}}this._throttledRequestHandler();clearTimeout(this._idleTimeout);this._idleTimeout=setTimeout(this._onIdle.bind(this),100)},flush:function(){clearTimeout(this._idleTimeout);this._onIdle()},sendIQ:function(elem,callback,errback,timeout){var timeoutHandler=null;var that=this;if(typeof(elem.tree)==="function"){elem=elem.tree()}var id=elem.getAttribute("id");if(!id){id=this.getUniqueId("sendIQ");elem.setAttribute("id",id)}var handler=this.addHandler(function(stanza){if(timeoutHandler){that.deleteTimedHandler(timeoutHandler)}var iqtype=stanza.getAttribute("type");if(iqtype==="result"){if(callback){callback(stanza)}}else{if(iqtype==="error"){if(errback){errback(stanza)}}else{throw {name:"StropheError",message:"Got bad IQ type of "+iqtype}}}},null,"iq",null,id);if(timeout){timeoutHandler=this.addTimedHandler(timeout,function(){that.deleteHandler(handler);if(errback){errback(null)}return false})}this.send(elem);return id},_queueData:function(element){if(element===null||!element.tagName||!element.childNodes){throw {name:"StropheError",message:"Cannot queue non-DOMElement."}}this._data.push(element)},_sendRestart:function(){this._data.push("restart");this._throttledRequestHandler();clearTimeout(this._idleTimeout);this._idleTimeout=setTimeout(this._onIdle.bind(this),100)},addTimedHandler:function(period,handler){var thand=new Strophe.TimedHandler(period,handler);this.addTimeds.push(thand);return thand},deleteTimedHandler:function(handRef){this.removeTimeds.push(handRef)},addHandler:function(handler,ns,name,type,id,from,options){var hand=new Strophe.Handler(handler,ns,name,type,id,from,options);this.addHandlers.push(hand);return hand},deleteHandler:function(handRef){this.removeHandlers.push(handRef)},disconnect:function(reason){this._changeConnectStatus(Strophe.Status.DISCONNECTING,reason);Strophe.info("Disconnect was called because: "+reason);if(this.connected){this._disconnectTimeout=this._addSysTimedHandler(3000,this._onDisconnectTimeout.bind(this));this._sendTerminate()}},_changeConnectStatus:function(status,condition){for(var k in Strophe._connectionPlugins){if(Strophe._connectionPlugins.hasOwnProperty(k)){var plugin=this[k];if(plugin.statusChanged){try{plugin.statusChanged(status,condition)}catch(err){Strophe.error(""+k+" plugin caused an exception changing status: "+err)}}}}if(this.connect_callback){try{this.connect_callback(status,condition)}catch(e){Strophe.error("User connection callback caused an exception: "+e)}}},_buildBody:function(){var bodyWrap=$build("body",{rid:this.rid++,xmlns:Strophe.NS.HTTPBIND});if(this.sid!==null){bodyWrap.attrs({sid:this.sid})}return bodyWrap},_removeRequest:function(req){Strophe.debug("removing request");var i;for(i=this._requests.length-1;i>=0;i--){if(req==this._requests[i]){this._requests.splice(i,1)}}req.xhr.onreadystatechange=function(){};this._throttledRequestHandler()},_restartRequest:function(i){var req=this._requests[i];if(req.dead===null){req.dead=new Date()}this._processRequest(i)},_processRequest:function(i){var req=this._requests[i];var reqStatus=-1;try{if(req.xhr.readyState==4){reqStatus=req.xhr.status}}catch(e){Strophe.error("caught an error in _requests["+i+"], reqStatus: "+reqStatus)}if(typeof(reqStatus)=="undefined"){reqStatus=-1}var time_elapsed=req.age();var primaryTimeout=(!isNaN(time_elapsed)&&time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait));var secondaryTimeout=(req.dead!==null&&req.timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait));var requestCompletedWithServerError=(req.xhr.readyState==4&&(reqStatus<1||reqStatus>=500));if(primaryTimeout||secondaryTimeout||requestCompletedWithServerError){if(secondaryTimeout){Strophe.error("Request "+this._requests[i].id+" timed out (secondary), restarting")}req.abort=true;req.xhr.abort();req.xhr.onreadystatechange=function(){};this._requests[i]=new Strophe.Request(req.xmlData,req.origFunc,req.rid,req.sends);req=this._requests[i]}if(req.xhr.readyState===0){Strophe.debug("request id "+req.id+"."+req.sends+" posting");req.date=new Date();try{req.xhr.open("POST",this.service,true)}catch(e2){Strophe.error("XHR open failed.");if(!this.connected){this._changeConnectStatus(Strophe.Status.CONNFAIL,"bad-service")}this.disconnect();return}var sendFunc=function(){req.xhr.send(req.data)};if(req.sends>1){var backoff=Math.pow(req.sends,3)*1000;setTimeout(sendFunc,backoff)}else{sendFunc()}req.sends++;this.xmlOutput(req.xmlData);this.rawOutput(req.data)}else{Strophe.debug("_processRequest: "+(i===0?"first":"second")+" request has readyState of "+req.xhr.readyState)}},_throttledRequestHandler:function(){if(!this._requests){Strophe.debug("_throttledRequestHandler called with undefined requests")}else{Strophe.debug("_throttledRequestHandler called with "+this._requests.length+" requests")}if(!this._requests||this._requests.length===0){return}if(this._requests.length>0){this._processRequest(0)}if(this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)<this.window-1){this._processRequest(1)}},_onRequestStateChange:function(func,req){Strophe.debug("request id "+req.id+"."+req.sends+" state changed to "+req.xhr.readyState);if(req.abort){req.abort=false;return}var reqStatus;if(req.xhr.readyState==4){reqStatus=0;try{reqStatus=req.xhr.status}catch(e){}if(typeof(reqStatus)=="undefined"){reqStatus=0}if(this.disconnecting){if(reqStatus>=400){this._hitError(reqStatus);return}}var reqIs0=(this._requests[0]==req);var reqIs1=(this._requests[1]==req);if((reqStatus>0&&reqStatus<500)||req.sends>5){this._removeRequest(req);Strophe.debug("request id "+req.id+" should now be removed")}if(reqStatus==200){if(reqIs1||(reqIs0&&this._requests.length>0&&this._requests[0].age()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait))){this._restartRequest(0)}Strophe.debug("request id "+req.id+"."+req.sends+" got 200");func(req);this.errors=0}else{Strophe.error("request id "+req.id+"."+req.sends+" error "+reqStatus+" happened");if(reqStatus===0||(reqStatus>=400&&reqStatus<600)||reqStatus>=12000){this._hitError(reqStatus);if(reqStatus>=400&&reqStatus<500){this._changeConnectStatus(Strophe.Status.DISCONNECTING,null);this._doDisconnect()}}}if(!((reqStatus>0&&reqStatus<10000)||req.sends>5)){this._throttledRequestHandler()}}},_hitError:function(reqStatus){this.errors++;Strophe.warn("request errored, status: "+reqStatus+", number of errors: "+this.errors);if(this.errors>4){this._onDisconnectTimeout()}},_doDisconnect:function(){Strophe.info("_doDisconnect was called");this.authenticated=false;this.disconnecting=false;this.sid=null;this.streamId=null;this.rid=Math.floor(Math.random()*4294967295);if(this.connected){this._changeConnectStatus(Strophe.Status.DISCONNECTED,null);this.connected=false}this.handlers=[];this.timedHandlers=[];this.removeTimeds=[];this.removeHandlers=[];this.addTimeds=[];this.addHandlers=[]},_dataRecv:function(req){try{var elem=req.getResponse()}catch(e){if(e!="parsererror"){throw e}this.disconnect("strophe-parsererror")}if(elem===null){return}this.xmlInput(elem);this.rawInput(Strophe.serialize(elem));var i,hand;while(this.removeHandlers.length>0){hand=this.removeHandlers.pop();i=this.handlers.indexOf(hand);if(i>=0){this.handlers.splice(i,1)}}while(this.addHandlers.length>0){this.handlers.push(this.addHandlers.pop())}if(this.disconnecting&&this._requests.length===0){this.deleteTimedHandler(this._disconnectTimeout);this._disconnectTimeout=null;this._doDisconnect();return}var typ=elem.getAttribute("type");var cond,conflict;if(typ!==null&&typ=="terminate"){cond=elem.getAttribute("condition");conflict=elem.getElementsByTagName("conflict");if(cond!==null){if(cond=="remote-stream-error"&&conflict.length>0){cond="conflict"}this._changeConnectStatus(Strophe.Status.CONNFAIL,cond)}else{this._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown")}this.disconnect();return}var self=this;Strophe.forEachChild(elem,null,function(child){var i,newList;newList=self.handlers;self.handlers=[];for(i=0;i<newList.length;i++){var hand=newList[i];if(hand.isMatch(child)&&(self.authenticated||!hand.user)){if(hand.run(child)){self.handlers.push(hand)}}else{self.handlers.push(hand)}}})},_sendTerminate:function(){Strophe.info("_sendTerminate was called");var body=this._buildBody().attrs({type:"terminate"});if(this.authenticated){body.c("presence",{xmlns:Strophe.NS.CLIENT,type:"unavailable"})}this.disconnecting=true;var req=new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this).prependArg(this._dataRecv.bind(this)),body.tree().getAttribute("rid"));this._requests.push(req);this._throttledRequestHandler()},_connect_cb:function(req){Strophe.info("_connect_cb was called");this.connected=true;var bodyWrap=req.getResponse();if(!bodyWrap){return}this.xmlInput(bodyWrap);this.rawInput(Strophe.serialize(bodyWrap));var typ=bodyWrap.getAttribute("type");var cond,conflict;if(typ!==null&&typ=="terminate"){cond=bodyWrap.getAttribute("condition");conflict=bodyWrap.getElementsByTagName("conflict");if(cond!==null){if(cond=="remote-stream-error"&&conflict.length>0){cond="conflict"}this._changeConnectStatus(Strophe.Status.CONNFAIL,cond)}else{this._changeConnectStatus(Strophe.Status.CONNFAIL,"unknown")}return}if(!this.sid){this.sid=bodyWrap.getAttribute("sid")}if(!this.stream_id){this.stream_id=bodyWrap.getAttribute("authid")}var wind=bodyWrap.getAttribute("requests");if(wind){this.window=parseInt(wind,10)}var hold=bodyWrap.getAttribute("hold");if(hold){this.hold=parseInt(hold,10)}var wait=bodyWrap.getAttribute("wait");if(wait){this.wait=parseInt(wait,10)}var do_sasl_plain=false;var do_sasl_digest_md5=false;var do_sasl_anonymous=false;var mechanisms=bodyWrap.getElementsByTagName("mechanism");var i,mech,auth_str,hashed_auth_str;if(mechanisms.length>0){for(i=0;i<mechanisms.length;i++){mech=Strophe.getText(mechanisms[i]);if(mech=="DIGEST-MD5"){do_sasl_digest_md5=true}else{if(mech=="PLAIN"){do_sasl_plain=true}else{if(mech=="ANONYMOUS"){do_sasl_anonymous=true}}}}}else{var body=this._buildBody();this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this).prependArg(this._connect_cb.bind(this)),body.tree().getAttribute("rid")));this._throttledRequestHandler();return}if(Strophe.getNodeFromJid(this.jid)===null&&do_sasl_anonymous){this._changeConnectStatus(Strophe.Status.AUTHENTICATING,null);this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null);this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null);this.send($build("auth",{xmlns:Strophe.NS.SASL,mechanism:"ANONYMOUS"}).tree())}else{if(Strophe.getNodeFromJid(this.jid)===null){this._changeConnectStatus(Strophe.Status.CONNFAIL,"x-strophe-bad-non-anon-jid");this.disconnect()}else{if(do_sasl_digest_md5){this._changeConnectStatus(Strophe.Status.AUTHENTICATING,null);this._sasl_challenge_handler=this._addSysHandler(this._sasl_challenge1_cb.bind(this),null,"challenge",null,null);this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null);this.send($build("auth",{xmlns:Strophe.NS.SASL,mechanism:"DIGEST-MD5"}).tree())}else{if(do_sasl_plain){auth_str=Strophe.getBareJidFromJid(this.jid);auth_str=auth_str+"\u0000";auth_str=auth_str+Strophe.getNodeFromJid(this.jid);auth_str=auth_str+"\u0000";auth_str=auth_str+this.pass;this._changeConnectStatus(Strophe.Status.AUTHENTICATING,null);this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null);this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null);hashed_auth_str=Base64.encode(auth_str);this.send($build("auth",{xmlns:Strophe.NS.SASL,mechanism:"PLAIN"}).t(hashed_auth_str).tree())}else{this._changeConnectStatus(Strophe.Status.AUTHENTICATING,null);this._addSysHandler(this._auth1_cb.bind(this),null,null,null,"_auth_1");this.send($iq({type:"get",to:this.domain,id:"_auth_1"}).c("query",{xmlns:Strophe.NS.AUTH}).c("username",{}).t(Strophe.getNodeFromJid(this.jid)).tree())}}}}},_sasl_challenge1_cb:function(elem){var attribMatch=/([a-z]+)=("[^"]+"|[^,"]+)(?:,|$)/;var challenge=Base64.decode(Strophe.getText(elem));var cnonce=MD5.hexdigest(Math.random()*1234567890);var realm="";var host=null;var nonce="";var qop="";var matches;this.deleteHandler(this._sasl_failure_handler);while(challenge.match(attribMatch)){matches=challenge.match(attribMatch);challenge=challenge.replace(matches[0],"");matches[2]=matches[2].replace(/^"(.+)"$/,"$1");switch(matches[1]){case"realm":realm=matches[2];break;case"nonce":nonce=matches[2];break;case"qop":qop=matches[2];break;case"host":host=matches[2];break}}var digest_uri="xmpp/"+this.domain;if(host!==null){digest_uri=digest_uri+"/"+host}var A1=MD5.hash(Strophe.getNodeFromJid(this.jid)+":"+realm+":"+this.pass)+":"+nonce+":"+cnonce;var A2="AUTHENTICATE:"+digest_uri;var responseText="";responseText+="username="+this._quote(Strophe.getNodeFromJid(this.jid))+",";responseText+="realm="+this._quote(realm)+",";responseText+="nonce="+this._quote(nonce)+",";responseText+="cnonce="+this._quote(cnonce)+",";responseText+='nc="00000001",';responseText+='qop="auth",';responseText+="digest-uri="+this._quote(digest_uri)+",";responseText+="response="+this._quote(MD5.hexdigest(MD5.hexdigest(A1)+":"+nonce+":00000001:"+cnonce+":auth:"+MD5.hexdigest(A2)))+",";responseText+='charset="utf-8"';this._sasl_challenge_handler=this._addSysHandler(this._sasl_challenge2_cb.bind(this),null,"challenge",null,null);this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null);this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null);this.send($build("response",{xmlns:Strophe.NS.SASL}).t(Base64.encode(responseText)).tree());return false},_quote:function(str){return'"'+str.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'},_sasl_challenge2_cb:function(elem){this.deleteHandler(this._sasl_success_handler);this.deleteHandler(this._sasl_failure_handler);this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null);this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null);this.send($build("response",{xmlns:Strophe.NS.SASL}).tree());return false},_auth1_cb:function(elem){var iq=$iq({type:"set",id:"_auth_2"}).c("query",{xmlns:Strophe.NS.AUTH}).c("username",{}).t(Strophe.getNodeFromJid(this.jid)).up().c("password").t(this.pass);if(!Strophe.getResourceFromJid(this.jid)){this.jid=Strophe.getBareJidFromJid(this.jid)+"/strophe"}iq.up().c("resource",{}).t(Strophe.getResourceFromJid(this.jid));this._addSysHandler(this._auth2_cb.bind(this),null,null,null,"_auth_2");this.send(iq.tree());return false},_sasl_success_cb:function(elem){Strophe.info("SASL authentication succeeded.");this.deleteHandler(this._sasl_failure_handler);this._sasl_failure_handler=null;if(this._sasl_challenge_handler){this.deleteHandler(this._sasl_challenge_handler);this._sasl_challenge_handler=null}this._addSysHandler(this._sasl_auth1_cb.bind(this),null,"stream:features",null,null);this._sendRestart();return false},_sasl_auth1_cb:function(elem){var i,child;for(i=0;i<elem.childNodes.length;i++){child=elem.childNodes[i];if(child.nodeName=="bind"){this.do_bind=true}if(child.nodeName=="session"){this.do_session=true}}if(!this.do_bind){this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);return false}else{this._addSysHandler(this._sasl_bind_cb.bind(this),null,null,null,"_bind_auth_2");var resource=Strophe.getResourceFromJid(this.jid);if(resource){this.send($iq({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:Strophe.NS.BIND}).c("resource",{}).t(resource).tree())}else{this.send($iq({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:Strophe.NS.BIND}).tree())}}return false},_sasl_bind_cb:function(elem){if(elem.getAttribute("type")=="error"){Strophe.info("SASL binding failed.");this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);return false}var bind=elem.getElementsByTagName("bind");var jidNode;if(bind.length>0){jidNode=bind[0].getElementsByTagName("jid");if(jidNode.length>0){this.jid=Strophe.getText(jidNode[0]);if(this.do_session){this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2");this.send($iq({type:"set",id:"_session_auth_2"}).c("session",{xmlns:Strophe.NS.SESSION}).tree())}else{this.authenticated=true;this._changeConnectStatus(Strophe.Status.CONNECTED,null)}}}else{Strophe.info("SASL binding failed.");this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);return false}},_sasl_session_cb:function(elem){if(elem.getAttribute("type")=="result"){this.authenticated=true;this._changeConnectStatus(Strophe.Status.CONNECTED,null)}else{if(elem.getAttribute("type")=="error"){Strophe.info("Session creation failed.");this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);return false}}return false},_sasl_failure_cb:function(elem){if(this._sasl_success_handler){this.deleteHandler(this._sasl_success_handler);this._sasl_success_handler=null}if(this._sasl_challenge_handler){this.deleteHandler(this._sasl_challenge_handler);this._sasl_challenge_handler=null}this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);return false},_auth2_cb:function(elem){if(elem.getAttribute("type")=="result"){this.authenticated=true;this._changeConnectStatus(Strophe.Status.CONNECTED,null)}else{if(elem.getAttribute("type")=="error"){this._changeConnectStatus(Strophe.Status.AUTHFAIL,null);this.disconnect()}}return false},_addSysTimedHandler:function(period,handler){var thand=new Strophe.TimedHandler(period,handler);thand.user=false;this.addTimeds.push(thand);return thand},_addSysHandler:function(handler,ns,name,type,id){var hand=new Strophe.Handler(handler,ns,name,type,id);hand.user=false;this.addHandlers.push(hand);return hand},_onDisconnectTimeout:function(){Strophe.info("_onDisconnectTimeout was called");var req;while(this._requests.length>0){req=this._requests.pop();req.abort=true;req.xhr.abort();req.xhr.onreadystatechange=function(){}}this._doDisconnect();return false},_onIdle:function(){var i,thand,since,newList;while(this.removeTimeds.length>0){thand=this.removeTimeds.pop();i=this.timedHandlers.indexOf(thand);if(i>=0){this.timedHandlers.splice(i,1)}}while(this.addTimeds.length>0){this.timedHandlers.push(this.addTimeds.pop())}var now=new Date().getTime();newList=[];for(i=0;i<this.timedHandlers.length;i++){thand=this.timedHandlers[i];if(this.authenticated||!thand.user){since=thand.lastCalled+thand.period;if(since-now<=0){if(thand.run()){newList.push(thand)}}else{newList.push(thand)}}}this.timedHandlers=newList;var body,time_elapsed;if(this.authenticated&&this._requests.length===0&&this._data.length===0&&!this.disconnecting){Strophe.info("no requests during idle cycle, sending blank request");this._data.push(null)}if(this._requests.length<2&&this._data.length>0&&!this.paused){body=this._buildBody();for(i=0;i<this._data.length;i++){if(this._data[i]!==null){if(this._data[i]==="restart"){body.attrs({to:this.domain,"xml:lang":"en","xmpp:restart":"true","xmlns:xmpp":Strophe.NS.BOSH})}else{body.cnode(this._data[i]).up()}}}delete this._data;this._data=[];this._requests.push(new Strophe.Request(body.tree(),this._onRequestStateChange.bind(this).prependArg(this._dataRecv.bind(this)),body.tree().getAttribute("rid")));this._processRequest(this._requests.length-1)}if(this._requests.length>0){time_elapsed=this._requests[0].age();if(this._requests[0].dead!==null){if(this._requests[0].timeDead()>Math.floor(Strophe.SECONDARY_TIMEOUT*this.wait)){this._throttledRequestHandler()}}if(time_elapsed>Math.floor(Strophe.TIMEOUT*this.wait)){Strophe.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(Strophe.TIMEOUT*this.wait)+" seconds since last activity");this._throttledRequestHandler()}}clearTimeout(this._idleTimeout);this._idleTimeout=setTimeout(this._onIdle.bind(this),100)}};if(callback){callback(Strophe,$build,$msg,$iq,$pres)}})(function(){window.Strophe=arguments[0];window.$build=arguments[1];window.$msg=arguments[2];window.$iq=arguments[3];window.$pres=arguments[4]}); \ No newline at end of file
diff --git a/mod/beechat/views/default/js/strophe.muc.js b/mod/beechat/views/default/js/strophe.muc.js
new file mode 100644
index 000000000..954ca8730
--- /dev/null
+++ b/mod/beechat/views/default/js/strophe.muc.js
@@ -0,0 +1,300 @@
+/*
+Plugin to implement the MUC extension. http://xmpp.org/extensions/xep-0045.html
+*/
+/* jslint configuration: */
+/* global document, window, setTimeout, clearTimeout, console,
+ XMLHttpRequest, ActiveXObject,
+ Base64, MD5,
+ Strophe, $build, $msg, $iq, $pres
+*/
+
+Strophe.addConnectionPlugin('muc', {
+ _connection: null,
+ // The plugin must have the init function
+ /***Function
+ Initialize the MUC plugin. Sets the correct connection object and
+ extends the namesace.
+ */
+ init: function(conn) {
+ this._connection = conn;
+ /* extend name space
+ * NS.MUC - XMPP Multi-user chat namespace
+ * from XEP 45.
+ *
+ */
+ Strophe.addNamespace('MUC_OWNER', Strophe.NS.MUC+"#owner");
+ Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC+"#admin");
+ },
+ /***Function
+ Join a multi-user chat room
+ Parameters:
+ (String) room - The multi-user chat room to join.
+ (String) nick - The nickname to use in the chat room. Optional
+ (Function) msg_handler_cb - The function call to handle messages from the
+ specified chat room.
+ (Function) pres_handler_cb - The function call back to handle presence
+ in the chat room.
+ (String) password - The optional password to use. (password protected
+ rooms only)
+ */
+ join: function(room, nick, msg_handler_cb, pres_handler_cb, password) {
+ var room_nick = this.test_append_nick(room, nick);
+ var msg = $pres({from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ if (password)
+ {
+ var password_elem = Strophe.xmlElement("password",
+ [],
+ password);
+ msg.cnode(password_elem);
+ }
+ if (msg_handler_cb)
+ {
+ this._connection.addHandler(function(stanza) {
+ var from = stanza.getAttribute('from');
+ var roomname = from.split("/");
+ // filter on room name
+ if (roomname.length > 1 && roomname[0] == room)
+ {
+ return msg_handler_cb(stanza);
+ }
+ else
+ {
+ return true;
+ }
+ },
+ null,
+ "message",
+ null,
+ null,
+ null);
+ }
+ if (pres_handler_cb)
+ {
+ this._connection.addHandler(function(stanza) {
+ var xquery = stanza.getElementsByTagName("x");
+ if (xquery.length > 0)
+ {
+ //Handle only MUC user protocol
+ for (var i = 0; i < xquery.length; i++)
+ {
+ var xmlns = xquery[i].getAttribute("xmlns");
+
+ if (xmlns && xmlns.match(Strophe.NS.MUC))
+ {
+ return pres_handler_cb(stanza);
+ }
+ }
+ }
+ return true;
+ },
+ null,
+ "presence",
+ null,
+ null,
+ null);
+ }
+ this._connection.send(msg);
+ },
+ /***Function
+ Leave a multi-user chat room
+ Parameters:
+ (String) room - The multi-user chat room to leave.
+ (String) nick - The nick name used in the room.
+ (Function) handler_cb - Optional function to handle the successful leave.
+ Returns:
+ iqid - The unique id for the room leave.
+ */
+ leave: function(room, nick, handler_cb) {
+ var room_nick = this.test_append_nick(room, nick);
+ var presenceid = this._connection.getUniqueId();
+ var presence = $pres({type: "unavailable",
+ id: presenceid,
+ from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ this._connection.addHandler(handler_cb,
+ null,
+ "presence",
+ null,
+ presenceid,
+ null);
+ this._connection.send(presence);
+ return presenceid;
+ },
+ /***Function
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) nick - The nick name used in the chat room.
+ (String) message - The message to send to the room.
+ Returns:
+ msgiq - the unique id used to send the message
+ */
+ message: function(room, nick, message) {
+ var room_nick = this.test_append_nick(room, nick);
+ var msgid = this._connection.getUniqueId();
+ var msg = $msg({to: room_nick,
+ from: this._connection.jid,
+ type: "groupchat",
+ id: msgid}).c("body",
+ {xmlns: Strophe.NS.CLIENT}).t(message);
+ msg.up().c("x", {xmlns: "jabber:x:event"}).c("composing");
+ this._connection.send(msg);
+ return msgid;
+ },
+ /***Function
+ Start a room configuration.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to send the configuration request
+ */
+ configure: function(room) {
+ //send iq to start room configuration
+ var config = $iq({to:room,
+ type: "get"}).c("query",
+ {xmlns: Strophe.NS.MUC_OWNER});
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Cancel the room configuration
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to cancel the configuration.
+ */
+ cancelConfigure: function(room) {
+ //send iq to start room configuration
+ var config = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data", type: "cancel"});
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Save a room configuration.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (Array) configarray - an array of form elements used to configure the room.
+ Returns:
+ id - the unique id used to save the configuration.
+ */
+ saveConfiguration: function(room, configarray) {
+ var config = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data", type: "submit"});
+ for (var i = 0; i >= configarray.length; i++) {
+ config.cnode(configarray[i]);
+ }
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to create the chat room.
+ */
+ createInstantRoom: function(room) {
+ var roomiq = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data",
+ type: "submit"});
+ return this._connection.sendIQ(roomiq.tree(),
+ function() {},
+ function() {});
+ },
+ /***
+ Set the topic of the chat room.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) topic - Topic message.
+ */
+ setTopic: function(room, topic) {
+ var msg = $msg({to: room,
+ from: this._connection.jid,
+ type: "groupchat"})
+ .c("subject", {xmlns: "jabber:client"}).t(topic);
+ this._connection.send(msg.tree());
+ },
+ /***Function
+ Changes the role and affiliation of a member of a MUC room.
+ The modification can only be done by a room moderator. An error will be
+ returned if the user doesn't have permission.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) nick - The nick name of the user to modify.
+ (String) role - The new role of the user.
+ (String) affiliation - The new affiliation of the user.
+ (String) reason - The reason for the change.
+ Returns:
+ iq - the id of the mode change request.
+ */
+ modifyUser: function(room, nick, role, affiliation, reason) {
+ var item_attrs = {nick: Strophe.escapeNode(nick)};
+ if (role !== null)
+ {
+ item_attrs.role = role;
+ }
+ if (affiliation !== null)
+ {
+ item_attrs.affiliation = affiliation;
+ }
+ var item = $build("item", item_attrs);
+ if (reason !== null)
+ {
+ item.cnode(Strophe.xmlElement("reason", reason));
+ }
+ var roomiq = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER}).cnode(item.tree());
+ return this._connection.sendIQ(roomiq.tree(),
+ function() {},
+ function() {});
+ },
+ /***Function
+ Change the current users nick name.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) user - The new nick name.
+ */
+ changeNick: function(room, user) {
+ var room_nick = this.test_append_nick(room, user);
+ var presence = $pres({from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ this._connection.send(presence.tree());
+ },
+ /***Function
+ List all chat room available on a server.
+ Parameters:
+ (String) server - name of chat server.
+ (String) handle_cb - Function to call for room list return.
+ */
+ listRooms: function(server, handle_cb) {
+ var iq = $iq({to: server,
+ from: this._connection.jid,
+ type: "get"})
+ .c("query",{xmlns: Strophe.NS.DISCO_ITEMS});
+ this._connection.sendIQ(iq, handle_cb, function(){});
+ },
+ test_append_nick: function(room, nick) {
+ var room_nick = room;
+ if (nick)
+ {
+ room_nick += "/" + Strophe.escapeNode(nick);
+ }
+ return room_nick;
+ }
+}); \ No newline at end of file
diff --git a/mod/beechat/views/default/js/strophe.muc.js.php b/mod/beechat/views/default/js/strophe.muc.js.php
new file mode 100644
index 000000000..e10750d02
--- /dev/null
+++ b/mod/beechat/views/default/js/strophe.muc.js.php
@@ -0,0 +1,300 @@
+/*
+Plugin to implement the MUC extension. http://xmpp.org/extensions/xep-0045.html
+*/
+/* jslint configuration: */
+/* global document, window, setTimeout, clearTimeout, console,
+ XMLHttpRequest, ActiveXObject,
+ Base64, MD5,
+ Strophe, $build, $msg, $iq, $pres
+*/
+
+Strophe.addConnectionPlugin('muc', {
+ _connection: null,
+ // The plugin must have the init function
+ /***Function
+ Initialize the MUC plugin. Sets the correct connection object and
+ extends the namesace.
+ */
+ init: function(conn) {
+ this._connection = conn;
+ /* extend name space
+ * NS.MUC - XMPP Multi-user chat namespace
+ * from XEP 45.
+ *
+ */
+ Strophe.addNamespace('MUC_OWNER', Strophe.NS.MUC+"#owner");
+ Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC+"#admin");
+ },
+ /***Function
+ Join a multi-user chat room
+ Parameters:
+ (String) room - The multi-user chat room to join.
+ (String) nick - The nickname to use in the chat room. Optional
+ (Function) msg_handler_cb - The function call to handle messages from the
+ specified chat room.
+ (Function) pres_handler_cb - The function call back to handle presence
+ in the chat room.
+ (String) password - The optional password to use. (password protected
+ rooms only)
+ */
+ join: function(room, nick, msg_handler_cb, pres_handler_cb, password) {
+ var room_nick = this.test_append_nick(room, nick);
+ var msg = $pres({from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ if (password)
+ {
+ var password_elem = Strophe.xmlElement("password",
+ [],
+ password);
+ msg.cnode(password_elem);
+ }
+ if (msg_handler_cb)
+ {
+ this._connection.addHandler(function(stanza) {
+ var from = stanza.getAttribute('from');
+ var roomname = from.split("/");
+ // filter on room name
+ if (roomname.length > 1 && roomname[0] == room)
+ {
+ return msg_handler_cb(stanza);
+ }
+ else
+ {
+ return true;
+ }
+ },
+ null,
+ "message",
+ null,
+ null,
+ null);
+ }
+ if (pres_handler_cb)
+ {
+ this._connection.addHandler(function(stanza) {
+ var xquery = stanza.getElementsByTagName("x");
+ if (xquery.length > 0)
+ {
+ //Handle only MUC user protocol
+ for (var i = 0; i < xquery.length; i++)
+ {
+ var xmlns = xquery[i].getAttribute("xmlns");
+
+ if (xmlns && xmlns.match(Strophe.NS.MUC))
+ {
+ return pres_handler_cb(stanza);
+ }
+ }
+ }
+ return true;
+ },
+ null,
+ "presence",
+ null,
+ null,
+ null);
+ }
+ this._connection.send(msg);
+ },
+ /***Function
+ Leave a multi-user chat room
+ Parameters:
+ (String) room - The multi-user chat room to leave.
+ (String) nick - The nick name used in the room.
+ (Function) handler_cb - Optional function to handle the successful leave.
+ Returns:
+ iqid - The unique id for the room leave.
+ */
+ leave: function(room, nick, handler_cb) {
+ var room_nick = this.test_append_nick(room, nick);
+ var presenceid = this._connection.getUniqueId();
+ var presence = $pres({type: "unavailable",
+ id: presenceid,
+ from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ this._connection.addHandler(handler_cb,
+ null,
+ "presence",
+ null,
+ presenceid,
+ null);
+ this._connection.send(presence);
+ return presenceid;
+ },
+ /***Function
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) nick - The nick name used in the chat room.
+ (String) message - The message to send to the room.
+ Returns:
+ msgiq - the unique id used to send the message
+ */
+ message: function(room, nick, message) {
+ var room_nick = this.test_append_nick(room, nick);
+ var msgid = this._connection.getUniqueId();
+ var msg = $msg({to: room_nick,
+ from: this._connection.jid,
+ type: "groupchat",
+ id: msgid}).c("body",
+ {xmlns: Strophe.NS.CLIENT}).t(message);
+ msg.up().c("x", {xmlns: "jabber:x:event"}).c("composing");
+ this._connection.send(msg);
+ return msgid;
+ },
+ /***Function
+ Start a room configuration.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to send the configuration request
+ */
+ configure: function(room) {
+ //send iq to start room configuration
+ var config = $iq({to:room,
+ type: "get"}).c("query",
+ {xmlns: Strophe.NS.MUC_OWNER});
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Cancel the room configuration
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to cancel the configuration.
+ */
+ cancelConfigure: function(room) {
+ //send iq to start room configuration
+ var config = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data", type: "cancel"});
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Save a room configuration.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (Array) configarray - an array of form elements used to configure the room.
+ Returns:
+ id - the unique id used to save the configuration.
+ */
+ saveConfiguration: function(room, configarray) {
+ var config = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data", type: "submit"});
+ for (var i = 0; i >= configarray.length; i++) {
+ config.cnode(configarray[i]);
+ }
+ var stanza = config.tree();
+ return this._connection.sendIQ(stanza,
+ function(){},
+ function(){});
+ },
+ /***Function
+ Parameters:
+ (String) room - The multi-user chat room name.
+ Returns:
+ id - the unique id used to create the chat room.
+ */
+ createInstantRoom: function(room) {
+ var roomiq = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+ .c("x", {xmlns: "jabber:x:data",
+ type: "submit"});
+ return this._connection.sendIQ(roomiq.tree(),
+ function() {},
+ function() {});
+ },
+ /***
+ Set the topic of the chat room.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) topic - Topic message.
+ */
+ setTopic: function(room, topic) {
+ var msg = $msg({to: room,
+ from: this._connection.jid,
+ type: "groupchat"})
+ .c("subject", {xmlns: "jabber:client"}).t(topic);
+ this._connection.send(msg.tree());
+ },
+ /***Function
+ Changes the role and affiliation of a member of a MUC room.
+ The modification can only be done by a room moderator. An error will be
+ returned if the user doesn't have permission.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) nick - The nick name of the user to modify.
+ (String) role - The new role of the user.
+ (String) affiliation - The new affiliation of the user.
+ (String) reason - The reason for the change.
+ Returns:
+ iq - the id of the mode change request.
+ */
+ modifyUser: function(room, nick, role, affiliation, reason) {
+ var item_attrs = {nick: Strophe.escapeNode(nick)};
+ if (role !== null)
+ {
+ item_attrs.role = role;
+ }
+ if (affiliation !== null)
+ {
+ item_attrs.affiliation = affiliation;
+ }
+ var item = $build("item", item_attrs);
+ if (reason !== null)
+ {
+ item.cnode(Strophe.xmlElement("reason", reason));
+ }
+ var roomiq = $iq({to: room,
+ type: "set"})
+ .c("query", {xmlns: Strophe.NS.MUC_OWNER}).cnode(item.tree());
+ return this._connection.sendIQ(roomiq.tree(),
+ function() {},
+ function() {});
+ },
+ /***Function
+ Change the current users nick name.
+ Parameters:
+ (String) room - The multi-user chat room name.
+ (String) user - The new nick name.
+ */
+ changeNick: function(room, user) {
+ var room_nick = this.test_append_nick(room, user);
+ var presence = $pres({from: this._connection.jid,
+ to: room_nick})
+ .c("x",{xmlns: Strophe.NS.MUC});
+ this._connection.send(presence.tree());
+ },
+ /***Function
+ List all chat room available on a server.
+ Parameters:
+ (String) server - name of chat server.
+ (String) handle_cb - Function to call for room list return.
+ */
+ listRooms: function(server, handle_cb) {
+ var iq = $iq({to: server,
+ from: this._connection.jid,
+ type: "get"})
+ .c("query",{xmlns: Strophe.NS.DISCO_ITEMS});
+ this._connection.sendIQ(iq, handle_cb, function(){});
+ },
+ test_append_nick: function(room, nick) {
+ var room_nick = room;
+ if (nick)
+ {
+ room_nick += "/" + Strophe.escapeNode(nick);
+ }
+ return room_nick;
+ }
+});
diff --git a/mod/beechat/views/default/settings/beechat/edit.php b/mod/beechat/views/default/settings/beechat/edit.php
new file mode 100755
index 000000000..ec4ab08de
--- /dev/null
+++ b/mod/beechat/views/default/settings/beechat/edit.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Barter Plugin
+ * @package Barters
+ **/
+ $domain = elgg_get_plugin_setting("domain", "beechat");
+ //$group_domain = elgg_get_plugin_setting("groupdomain", "beechat");
+ $xmlrpc_ip = elgg_get_plugin_setting("xmlrpcip", "beechat");
+ $dbname = elgg_get_plugin_setting("dbname", "beechat");
+ $dbhost = elgg_get_plugin_setting("dbhost", "beechat");
+ $dbuser = elgg_get_plugin_setting("dbuser", "beechat");
+ $dbpassword = elgg_get_plugin_setting("dbpassword", "beechat");
+?>
+<p>
+ <?php echo elgg_echo('beechat:domain'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[domain]','value' => $domain)); ?>
+ <!--<?php echo elgg_echo('beechat:groupdomain'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[groupdomain]','value' => $group_domain)); ?>-->
+ <?php echo elgg_echo('beechat:xmlrpcip'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[xmlrpcip]','value' => $xmlrpc_ip)); ?>
+ <?php echo elgg_echo('beechat:dbname'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[dbname]','value' => $dbname)); ?>
+ <?php echo elgg_echo('beechat:dbhost'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[dbhost]','value' => $dbhost)); ?>
+ <?php echo elgg_echo('beechat:dbuser'); ?>
+ <?php echo elgg_view('input/text', array('internalname' => 'params[dbuser]','value' => $dbuser)); ?>
+ <?php echo elgg_echo('beechat:dbpassword'); ?>
+ <?php echo elgg_view('input/password', array('internalname' => 'params[dbpassword]','value' => $dbpassword)); ?>
+
+</p>
+
diff --git a/mod/blog/actions/blog/auto_save_revision.php b/mod/blog/actions/blog/auto_save_revision.php
new file mode 100644
index 000000000..e33edfaab
--- /dev/null
+++ b/mod/blog/actions/blog/auto_save_revision.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Action called by AJAX periodic auto saving when editing.
+ *
+ * @package Blog
+ */
+
+$guid = get_input('guid');
+$user = elgg_get_logged_in_user_entity();
+$title = htmlspecialchars(get_input('title', '', false), ENT_QUOTES, 'UTF-8');
+$description = get_input('description');
+$excerpt = get_input('excerpt');
+
+// because get_input() doesn't use the default if the input is ''
+if (empty($excerpt)) {
+ $excerpt = $description;
+}
+
+// store errors to pass along
+$error = FALSE;
+
+if ($title && $description) {
+
+ if ($guid) {
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'object', 'blog') && $entity->canEdit()) {
+ $blog = $entity;
+ } else {
+ $error = elgg_echo('blog:error:post_not_found');
+ }
+ } else {
+ $blog = new ElggBlog();
+ $blog->subtype = 'blog';
+
+ // force draft and private for autosaves.
+ $blog->status = 'unsaved_draft';
+ $blog->access_id = ACCESS_PRIVATE;
+ $blog->title = $title;
+ $blog->description = $description;
+ $blog->excerpt = elgg_get_excerpt($excerpt);
+
+ // mark this as a brand new post so we can work out the
+ // river / revision logic in the real save action.
+ $blog->new_post = TRUE;
+
+ if (!$blog->save()) {
+ $error = elgg_echo('blog:error:cannot_save');
+ }
+ }
+
+ // creat draft annotation
+ if (!$error) {
+ // annotations don't have a "time_updated" so
+ // we have to delete everything or the times are wrong.
+
+ // don't save if nothing changed
+ if ($auto_save_annotations = $blog->getAnnotations('blog_auto_save', 1)) {
+ $auto_save = $auto_save_annotations[0];
+ } else {
+ $auto_save == FALSE;
+ }
+
+ if (!$auto_save) {
+ $annotation_id = $blog->annotate('blog_auto_save', $description);
+ } elseif ($auto_save instanceof ElggAnnotation && $auto_save->value != $description) {
+ $blog->deleteAnnotations('blog_auto_save');
+ $annotation_id = $blog->annotate('blog_auto_save', $description);
+ } elseif ($auto_save instanceof ElggAnnotation && $auto_save->value == $description) {
+ // this isn't an error because we have an up to date annotation.
+ $annotation_id = $auto_save->id;
+ }
+
+ if (!$annotation_id) {
+ $error = elgg_echo('blog:error:cannot_auto_save');
+ }
+ }
+} else {
+ $error = elgg_echo('blog:error:missing:description');
+}
+
+if ($error) {
+ $json = array('success' => FALSE, 'message' => $error);
+ echo json_encode($json);
+} else {
+ $msg = elgg_echo('blog:message:saved');
+ $json = array('success' => TRUE, 'message' => $msg, 'guid' => $blog->getGUID());
+ echo json_encode($json);
+}
+exit;
diff --git a/mod/blog/actions/blog/delete.php b/mod/blog/actions/blog/delete.php
new file mode 100644
index 000000000..ca4eb8a7f
--- /dev/null
+++ b/mod/blog/actions/blog/delete.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Delete blog entity
+ *
+ * @package Blog
+ */
+
+$blog_guid = get_input('guid');
+$blog = get_entity($blog_guid);
+
+if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $container = get_entity($blog->container_guid);
+ if ($blog->delete()) {
+ system_message(elgg_echo('blog:message:deleted_post'));
+ if (elgg_instanceof($container, 'group')) {
+ forward("blog/group/$container->guid/all");
+ } else {
+ forward("blog/owner/$container->username");
+ }
+ } else {
+ register_error(elgg_echo('blog:error:cannot_delete_post'));
+ }
+} else {
+ register_error(elgg_echo('blog:error:post_not_found'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/mod/blog/actions/blog/save.php b/mod/blog/actions/blog/save.php
new file mode 100644
index 000000000..82a9e6c51
--- /dev/null
+++ b/mod/blog/actions/blog/save.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Save blog entity
+ *
+ * Can be called by clicking save button or preview button. If preview button,
+ * we automatically save as draft. The preview button is only available for
+ * non-published drafts.
+ *
+ * Drafts are saved with the access set to private.
+ *
+ * @package Blog
+ */
+
+// start a new sticky form session in case of failure
+elgg_make_sticky_form('blog');
+
+// save or preview
+$save = (bool)get_input('save');
+
+// store errors to pass along
+$error = FALSE;
+$error_forward_url = REFERER;
+$user = elgg_get_logged_in_user_entity();
+
+// edit or create a new entity
+$guid = get_input('guid');
+
+if ($guid) {
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'object', 'blog') && $entity->canEdit()) {
+ $blog = $entity;
+ } else {
+ register_error(elgg_echo('blog:error:post_not_found'));
+ forward(get_input('forward', REFERER));
+ }
+
+ // save some data for revisions once we save the new edit
+ $revision_text = $blog->description;
+ $new_post = $blog->new_post;
+} else {
+ $blog = new ElggBlog();
+ $blog->subtype = 'blog';
+ $new_post = TRUE;
+}
+
+// set the previous status for the hooks to update the time_created and river entries
+$old_status = $blog->status;
+
+// set defaults and required values.
+$values = array(
+ 'title' => '',
+ 'description' => '',
+ 'status' => 'draft',
+ 'access_id' => ACCESS_DEFAULT,
+ 'comments_on' => 'On',
+ 'excerpt' => '',
+ 'tags' => '',
+ 'container_guid' => (int)get_input('container_guid'),
+);
+
+// fail if a required entity isn't set
+$required = array('title', 'description');
+
+// load from POST and do sanity and access checking
+foreach ($values as $name => $default) {
+ if ($name === 'title') {
+ $value = htmlspecialchars(get_input('title', $default, false), ENT_QUOTES, 'UTF-8');
+ } else {
+ $value = get_input($name, $default);
+ }
+
+ if (in_array($name, $required) && empty($value)) {
+ $error = elgg_echo("blog:error:missing:$name");
+ }
+
+ if ($error) {
+ break;
+ }
+
+ switch ($name) {
+ case 'tags':
+ $values[$name] = string_to_tag_array($value);
+ break;
+
+ case 'excerpt':
+ if ($value) {
+ $values[$name] = elgg_get_excerpt($value);
+ }
+ break;
+
+ case 'container_guid':
+ // this can't be empty or saving the base entity fails
+ if (!empty($value)) {
+ if (can_write_to_container($user->getGUID(), $value)) {
+ $values[$name] = $value;
+ } else {
+ $error = elgg_echo("blog:error:cannot_write_to_container");
+ }
+ } else {
+ unset($values[$name]);
+ }
+ break;
+
+ default:
+ $values[$name] = $value;
+ break;
+ }
+}
+
+// if preview, force status to be draft
+if ($save == false) {
+ $values['status'] = 'draft';
+}
+
+// if draft, set access to private and cache the future access
+if ($values['status'] == 'draft') {
+ $values['future_access'] = $values['access_id'];
+ $values['access_id'] = ACCESS_PRIVATE;
+}
+
+// assign values to the entity, stopping on error.
+if (!$error) {
+ foreach ($values as $name => $value) {
+ $blog->$name = $value;
+ }
+}
+
+// only try to save base entity if no errors
+if (!$error) {
+ if ($blog->save()) {
+ // remove sticky form entries
+ elgg_clear_sticky_form('blog');
+
+ // remove autosave draft if exists
+ $blog->deleteAnnotations('blog_auto_save');
+
+ // no longer a brand new post.
+ $blog->deleteMetadata('new_post');
+
+ // if this was an edit, create a revision annotation
+ if (!$new_post && $revision_text) {
+ $blog->annotate('blog_revision', $revision_text);
+ }
+
+ system_message(elgg_echo('blog:message:saved'));
+
+ $status = $blog->status;
+
+ // add to river if changing status or published, regardless of new post
+ // because we remove it for drafts.
+ if (($new_post || $old_status == 'draft') && $status == 'published') {
+ add_to_river('river/object/blog/create', 'create', $blog->owner_guid, $blog->getGUID());
+
+ // we only want notifications sent when post published
+ register_notification_object('object', 'blog', elgg_echo('blog:newpost'));
+ elgg_trigger_event('publish', 'object', $blog);
+
+ // reset the creation time for posts that move from draft to published
+ if ($guid) {
+ $blog->time_created = time();
+ $blog->save();
+ }
+ } elseif ($old_status == 'published' && $status == 'draft') {
+ elgg_delete_river(array(
+ 'object_guid' => $blog->guid,
+ 'action_type' => 'create',
+ ));
+ }
+
+ if ($blog->status == 'published' || $save == false) {
+ forward($blog->getURL());
+ } else {
+ forward("blog/edit/$blog->guid");
+ }
+ } else {
+ register_error(elgg_echo('blog:error:cannot_save'));
+ forward($error_forward_url);
+ }
+} else {
+ register_error($error);
+ forward($error_forward_url);
+}
diff --git a/mod/blog/activate.php b/mod/blog/activate.php
new file mode 100644
index 000000000..a90525291
--- /dev/null
+++ b/mod/blog/activate.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Register the ElggBlog class for the object/blog subtype
+ */
+
+if (get_subtype_id('object', 'blog')) {
+ update_subtype('object', 'blog', 'ElggBlog');
+} else {
+ add_subtype('object', 'blog', 'ElggBlog');
+}
diff --git a/mod/blog/classes/ElggBlog.php b/mod/blog/classes/ElggBlog.php
new file mode 100644
index 000000000..8d4401c57
--- /dev/null
+++ b/mod/blog/classes/ElggBlog.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Extended class to override the time_created
+ *
+ * @property string $status The published status of the blog post (published, draft)
+ * @property string $comments_on Whether commenting is allowed (Off, On)
+ * @property string $excerpt An excerpt of the blog post used when displaying the post
+ */
+class ElggBlog extends ElggObject {
+
+ /**
+ * Set subtype to blog.
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['subtype'] = "blog";
+ }
+
+ /**
+ * Can a user comment on this blog?
+ *
+ * @see ElggObject::canComment()
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @return bool
+ * @since 1.8.0
+ */
+ public function canComment($user_guid = 0) {
+ $result = parent::canComment($user_guid);
+ if ($result == false) {
+ return $result;
+ }
+
+ if ($this->comments_on == 'Off') {
+ return false;
+ }
+
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/mod/blog/deactivate.php b/mod/blog/deactivate.php
new file mode 100644
index 000000000..4a275fa94
--- /dev/null
+++ b/mod/blog/deactivate.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * Deregister the ElggBlog class
+ */
+
+update_subtype('object', 'blog');
diff --git a/mod/blog/languages/en.php b/mod/blog/languages/en.php
new file mode 100644
index 000000000..5248a6f51
--- /dev/null
+++ b/mod/blog/languages/en.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Blog English language file.
+ *
+ */
+
+$english = array(
+ 'blog' => 'Blogs',
+ 'blog:blogs' => 'Blogs',
+ 'blog:revisions' => 'Revisions',
+ 'blog:archives' => 'Archives',
+ 'blog:blog' => 'Blog',
+ 'item:object:blog' => 'Blogs',
+
+ 'blog:title:user_blogs' => '%s\'s blogs',
+ 'blog:title:all_blogs' => 'All site blogs',
+ 'blog:title:friends' => 'Friends\' blogs',
+
+ 'blog:group' => 'Group blog',
+ 'blog:enableblog' => 'Enable group blog',
+ 'blog:write' => 'Write a blog post',
+
+ // Editing
+ 'blog:add' => 'Add blog post',
+ 'blog:edit' => 'Edit blog post',
+ 'blog:excerpt' => 'Excerpt',
+ 'blog:body' => 'Body',
+ 'blog:save_status' => 'Last saved: ',
+ 'blog:never' => 'Never',
+
+ // Statuses
+ 'blog:status' => 'Status',
+ 'blog:status:draft' => 'Draft',
+ 'blog:status:published' => 'Published',
+ 'blog:status:unsaved_draft' => 'Unsaved Draft',
+
+ 'blog:revision' => 'Revision',
+ 'blog:auto_saved_revision' => 'Auto Saved Revision',
+
+ // messages
+ 'blog:message:saved' => 'Blog post saved.',
+ 'blog:error:cannot_save' => 'Cannot save blog post.',
+ 'blog:error:cannot_write_to_container' => 'Insufficient access to save blog to group.',
+ 'blog:messages:warning:draft' => 'There is an unsaved draft of this post!',
+ 'blog:edit_revision_notice' => '(Old version)',
+ 'blog:message:deleted_post' => 'Blog post deleted.',
+ 'blog:error:cannot_delete_post' => 'Cannot delete blog post.',
+ 'blog:none' => 'No blog posts',
+ 'blog:error:missing:title' => 'Please enter a blog title!',
+ 'blog:error:missing:description' => 'Please enter the body of your blog!',
+ 'blog:error:cannot_edit_post' => 'This post may not exist or you may not have permissions to edit it.',
+ 'blog:error:revision_not_found' => 'Cannot find this revision.',
+
+ // river
+ 'river:create:object:blog' => '%s published a blog post %s',
+ 'river:comment:object:blog' => '%s commented on the blog %s',
+
+ // notifications
+ 'blog:newpost' => 'A new blog post',
+ 'blog:notification' =>
+'
+%s made a new blog post.
+
+%s
+%s
+
+View and comment on the new blog post:
+%s
+',
+
+ // widget
+ 'blog:widget:description' => 'Display your latest blog posts',
+ 'blog:moreblogs' => 'More blog posts',
+ 'blog:numbertodisplay' => 'Number of blog posts to display',
+ 'blog:noblogs' => 'No blog posts'
+);
+
+add_translation('en', $english);
diff --git a/mod/blog/lib/blog.php b/mod/blog/lib/blog.php
new file mode 100644
index 000000000..9753f27a8
--- /dev/null
+++ b/mod/blog/lib/blog.php
@@ -0,0 +1,478 @@
+<?php
+/**
+ * Blog helper functions
+ *
+ * @package Blog
+ */
+
+
+/**
+ * Get page components to view a blog post.
+ *
+ * @param int $guid GUID of a blog entity.
+ * @return array
+ */
+function blog_get_page_content_read($guid = NULL) {
+
+ $return = array();
+
+ $blog = get_entity($guid);
+
+ // no header or tabs for viewing an individual blog
+ $return['filter'] = '';
+
+ if (!elgg_instanceof($blog, 'object', 'blog')) {
+ register_error(elgg_echo('noaccess'));
+ $_SESSION['last_forward_from'] = current_page_url();
+ forward('');
+ }
+
+ $return['title'] = $blog->title;
+
+ $container = $blog->getContainerEntity();
+ $crumbs_title = $container->name;
+ if (elgg_instanceof($container, 'group')) {
+ elgg_push_breadcrumb($crumbs_title, "blog/group/$container->guid/all");
+ } else {
+ elgg_push_breadcrumb($crumbs_title, "blog/owner/$container->username");
+ }
+
+ elgg_push_breadcrumb($blog->title);
+ $return['content'] = elgg_view_entity($blog, array('full_view' => true));
+ // check to see if we should allow comments
+ if ($blog->comments_on != 'Off' && $blog->status == 'published') {
+ $return['content'] .= elgg_view_comments($blog);
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to list a user's or all blogs.
+ *
+ * @param int $container_guid The GUID of the page owner or NULL for all blogs
+ * @return array
+ */
+function blog_get_page_content_list($container_guid = NULL) {
+
+ $return = array();
+
+ $return['filter_context'] = $container_guid ? 'mine' : 'all';
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => false,
+ );
+
+ $current_user = elgg_get_logged_in_user_entity();
+
+ if ($container_guid) {
+ // access check for closed groups
+ group_gatekeeper();
+
+ $options['container_guid'] = $container_guid;
+ $container = get_entity($container_guid);
+ if (!$container) {
+
+ }
+ $return['title'] = elgg_echo('blog:title:user_blogs', array($container->name));
+
+ $crumbs_title = $container->name;
+ elgg_push_breadcrumb($crumbs_title);
+
+ if ($current_user && ($container_guid == $current_user->guid)) {
+ $return['filter_context'] = 'mine';
+ } else if (elgg_instanceof($container, 'group')) {
+ $return['filter'] = false;
+ } else {
+ // do not show button or select a tab when viewing someone else's posts
+ $return['filter_context'] = 'none';
+ }
+ } else {
+ $return['filter_context'] = 'all';
+ $return['title'] = elgg_echo('blog:title:all_blogs');
+ elgg_pop_breadcrumb();
+ elgg_push_breadcrumb(elgg_echo('blog:blogs'));
+ }
+
+ elgg_register_title_button();
+
+ // show all posts for admin or users looking at their own blogs
+ // show only published posts for other users.
+ $show_only_published = true;
+ if ($current_user) {
+ if (($current_user->guid == $container_guid) || $current_user->isAdmin()) {
+ $show_only_published = false;
+ }
+ }
+ if ($show_only_published) {
+ $options['metadata_name_value_pairs'] = array(
+ array('name' => 'status', 'value' => 'published'),
+ );
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $return['content'] = elgg_echo('blog:none');
+ } else {
+ $return['content'] = $list;
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to list of the user's friends' posts.
+ *
+ * @param int $user_guid
+ * @return array
+ */
+function blog_get_page_content_friends($user_guid) {
+
+ $user = get_user($user_guid);
+ if (!$user) {
+ forward('blog/all');
+ }
+
+ $return = array();
+
+ $return['filter_context'] = 'friends';
+ $return['title'] = elgg_echo('blog:title:friends');
+
+ $crumbs_title = $user->name;
+ elgg_push_breadcrumb($crumbs_title, "blog/owner/{$user->username}");
+ elgg_push_breadcrumb(elgg_echo('friends'));
+
+ elgg_register_title_button();
+
+ if (!$friends = get_user_friends($user_guid, ELGG_ENTITIES_ANY_VALUE, 0)) {
+ $return['content'] .= elgg_echo('friends:none:you');
+ return $return;
+ } else {
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => FALSE,
+ );
+
+ foreach ($friends as $friend) {
+ $options['container_guids'][] = $friend->getGUID();
+ }
+
+ // admin / owners can see any posts
+ // everyone else can only see published posts
+ $show_only_published = true;
+ $current_user = elgg_get_logged_in_user_entity();
+ if ($current_user) {
+ if (($user_guid == $current_user->guid) || $current_user->isAdmin()) {
+ $show_only_published = false;
+ }
+ }
+ if ($show_only_published) {
+ $options['metadata_name_value_pairs'][] = array(
+ array('name' => 'status', 'value' => 'published')
+ );
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $return['content'] = elgg_echo('blog:none');
+ } else {
+ $return['content'] = $list;
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to show blogs with publish dates between $lower and $upper
+ *
+ * @param int $owner_guid The GUID of the owner of this page
+ * @param int $lower Unix timestamp
+ * @param int $upper Unix timestamp
+ * @return array
+ */
+function blog_get_page_content_archive($owner_guid, $lower = 0, $upper = 0) {
+
+ $now = time();
+
+ $owner = get_entity($owner_guid);
+ elgg_set_page_owner_guid($owner_guid);
+
+ $crumbs_title = $owner->name;
+ if (elgg_instanceof($owner, 'user')) {
+ $url = "blog/owner/{$owner->username}";
+ } else {
+ $url = "blog/group/$owner->guid/all";
+ }
+ elgg_push_breadcrumb($crumbs_title, $url);
+ elgg_push_breadcrumb(elgg_echo('blog:archives'));
+
+ if ($lower) {
+ $lower = (int)$lower;
+ }
+
+ if ($upper) {
+ $upper = (int)$upper;
+ }
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => FALSE,
+ );
+
+ if ($owner_guid) {
+ $options['container_guid'] = $owner_guid;
+ }
+
+ // admin / owners can see any posts
+ // everyone else can only see published posts
+ if (!(elgg_is_admin_logged_in() || (elgg_is_logged_in() && $owner_guid == elgg_get_logged_in_user_guid()))) {
+ if ($upper > $now) {
+ $upper = $now;
+ }
+
+ $options['metadata_name_value_pairs'] = array(
+ array('name' => 'status', 'value' => 'published')
+ );
+ }
+
+ if ($lower) {
+ $options['created_time_lower'] = $lower;
+ }
+
+ if ($upper) {
+ $options['created_time_upper'] = $upper;
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $content = elgg_echo('blog:none');
+ } else {
+ $content = $list;
+ }
+
+ $title = elgg_echo('date:month:' . date('m', $lower), array(date('Y', $lower)));
+
+ return array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => '',
+ );
+}
+
+/**
+ * Get page components to edit/create a blog post.
+ *
+ * @param string $page 'edit' or 'new'
+ * @param int $guid GUID of blog post or container
+ * @param int $revision Annotation id for revision to edit (optional)
+ * @return array
+ */
+function blog_get_page_content_edit($page, $guid = 0, $revision = NULL) {
+
+ elgg_load_js('elgg.blog');
+
+ $return = array(
+ 'filter' => '',
+ );
+
+ $vars = array();
+ $vars['id'] = 'blog-post-edit';
+ $vars['class'] = 'elgg-form-alt';
+
+ $sidebar = '';
+ if ($page == 'edit') {
+ $blog = get_entity((int)$guid);
+
+ $title = elgg_echo('blog:edit');
+
+ if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $vars['entity'] = $blog;
+
+ $title .= ": \"$blog->title\"";
+
+ if ($revision) {
+ $revision = elgg_get_annotation_from_id((int)$revision);
+ $vars['revision'] = $revision;
+ $title .= ' ' . elgg_echo('blog:edit_revision_notice');
+
+ if (!$revision || !($revision->entity_guid == $guid)) {
+ $content = elgg_echo('blog:error:revision_not_found');
+ $return['content'] = $content;
+ $return['title'] = $title;
+ return $return;
+ }
+ }
+
+ $body_vars = blog_prepare_form_vars($blog, $revision);
+
+ elgg_push_breadcrumb($blog->title, $blog->getURL());
+ elgg_push_breadcrumb(elgg_echo('edit'));
+
+ elgg_load_js('elgg.blog');
+
+ $content = elgg_view_form('blog/save', $vars, $body_vars);
+ $sidebar = elgg_view('blog/sidebar/revisions', $vars);
+ } else {
+ $content = elgg_echo('blog:error:cannot_edit_post');
+ }
+ } else {
+ elgg_push_breadcrumb(elgg_echo('blog:add'));
+ $body_vars = blog_prepare_form_vars(null);
+
+ $title = elgg_echo('blog:add');
+ $content = elgg_view_form('blog/save', $vars, $body_vars);
+ }
+
+ $return['title'] = $title;
+ $return['content'] = $content;
+ $return['sidebar'] = $sidebar;
+ return $return;
+}
+
+/**
+ * Pull together blog variables for the save form
+ *
+ * @param ElggBlog $post
+ * @param ElggAnnotation $revision
+ * @return array
+ */
+function blog_prepare_form_vars($post = NULL, $revision = NULL) {
+
+ // input names => defaults
+ $values = array(
+ 'title' => NULL,
+ 'description' => NULL,
+ 'status' => 'published',
+ 'access_id' => ACCESS_DEFAULT,
+ 'comments_on' => 'On',
+ 'excerpt' => NULL,
+ 'tags' => NULL,
+ 'container_guid' => NULL,
+ 'guid' => NULL,
+ 'draft_warning' => '',
+ );
+
+ if ($post) {
+ foreach (array_keys($values) as $field) {
+ if (isset($post->$field)) {
+ $values[$field] = $post->$field;
+ }
+ }
+
+ if ($post->status == 'draft') {
+ $values['access_id'] = $post->future_access;
+ }
+ }
+
+ if (elgg_is_sticky_form('blog')) {
+ $sticky_values = elgg_get_sticky_values('blog');
+ foreach ($sticky_values as $key => $value) {
+ $values[$key] = $value;
+ }
+ }
+
+ elgg_clear_sticky_form('blog');
+
+ if (!$post) {
+ return $values;
+ }
+
+ // load the revision annotation if requested
+ if ($revision instanceof ElggAnnotation && $revision->entity_guid == $post->getGUID()) {
+ $values['revision'] = $revision;
+ $values['description'] = $revision->value;
+ }
+
+ // display a notice if there's an autosaved annotation
+ // and we're not editing it.
+ if ($auto_save_annotations = $post->getAnnotations('blog_auto_save', 1)) {
+ $auto_save = $auto_save_annotations[0];
+ } else {
+ $auto_save = false;
+ }
+
+ if ($auto_save && $auto_save->id != $revision->id) {
+ $values['draft_warning'] = elgg_echo('blog:messages:warning:draft');
+ }
+
+ return $values;
+}
+
+/**
+ * Forward to the new style of URLs
+ *
+ * Pre-1.7.5
+ * Group blogs page: /blog/group:<container_guid>/
+ * Group blog view: /blog/group:<container_guid>/read/<guid>/<title>
+ * 1.7.5-1.8
+ * Group blogs page: /blog/owner/group:<container_guid>/
+ * Group blog view: /blog/read/<guid>
+ *
+ *
+ * @param string $page
+ */
+function blog_url_forwarder($page) {
+
+ $viewtype = elgg_get_viewtype();
+ $qs = ($viewtype === 'default') ? "" : "?view=$viewtype";
+
+ $url = "blog/all";
+
+ // easier to work with & no notices
+ $page = array_pad($page, 4, "");
+
+ // group usernames
+ if (preg_match('~/group\:([0-9]+)/~', "/{$page[0]}/{$page[1]}/", $matches)) {
+ $guid = $matches[1];
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'group')) {
+ if (!empty($page[2])) {
+ $url = "blog/view/$page[2]/";
+ } else {
+ $url = "blog/group/$guid/all";
+ }
+ register_error(elgg_echo("changebookmark"));
+ forward($url . $qs);
+ }
+ }
+
+ if (empty($page[0])) {
+ return;
+ }
+
+ // user usernames
+ $user = get_user_by_username($page[0]);
+ if (!$user) {
+ return;
+ }
+
+ if (empty($page[1])) {
+ $page[1] = 'owner';
+ }
+
+ switch ($page[1]) {
+ case "read":
+ $url = "blog/view/{$page[2]}/{$page[3]}";
+ break;
+ case "archive":
+ $url = "blog/archive/{$page[0]}/{$page[2]}/{$page[3]}";
+ break;
+ case "friends":
+ $url = "blog/friends/{$page[0]}";
+ break;
+ case "new":
+ $url = "blog/add/$user->guid";
+ break;
+ case "owner":
+ $url = "blog/owner/{$page[0]}";
+ break;
+ }
+
+ register_error(elgg_echo("changebookmark"));
+ forward($url . $qs);
+}
diff --git a/mod/blog/manifest.xml b/mod/blog/manifest.xml
new file mode 100644
index 000000000..29ee1bfc8
--- /dev/null
+++ b/mod/blog/manifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Blog</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <category>content</category>
+ <category>widget</category>
+ <blurb>Blog plugin</blurb>
+ <description>Adds simple blogging capabilities to your Elgg installation.</description>
+ <website>http://elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <activate_on_install>true</activate_on_install>
+</plugin_manifest>
diff --git a/mod/blog/start.php b/mod/blog/start.php
new file mode 100644
index 000000000..e724b91c2
--- /dev/null
+++ b/mod/blog/start.php
@@ -0,0 +1,302 @@
+<?php
+/**
+ * Blogs
+ *
+ * @package Blog
+ *
+ * @todo
+ * - Either drop support for "publish date" or duplicate more entity getter
+ * functions to work with a non-standard time_created.
+ * - Pingbacks
+ * - Notifications
+ * - River entry for posts saved as drafts and later published
+ */
+
+elgg_register_event_handler('init', 'system', 'blog_init');
+
+/**
+ * Init blog plugin.
+ */
+function blog_init() {
+
+ elgg_register_library('elgg:blog', elgg_get_plugins_path() . 'blog/lib/blog.php');
+
+ // add a site navigation item
+ $item = new ElggMenuItem('blog', elgg_echo('blog:blogs'), 'blog/all');
+ elgg_register_menu_item('site', $item);
+
+ elgg_register_event_handler('upgrade', 'upgrade', 'blog_run_upgrades');
+
+ // add to the main css
+ elgg_extend_view('css/elgg', 'blog/css');
+
+ // register the blog's JavaScript
+ $blog_js = elgg_get_simplecache_url('js', 'blog/save_draft');
+ elgg_register_simplecache_view('js/blog/save_draft');
+ elgg_register_js('elgg.blog', $blog_js);
+
+ // routing of urls
+ elgg_register_page_handler('blog', 'blog_page_handler');
+
+ // override the default url to view a blog object
+ elgg_register_entity_url_handler('object', 'blog', 'blog_url_handler');
+
+ // notifications - need to register for unique event because of draft/published status
+ elgg_register_event_handler('publish', 'object', 'object_notifications');
+ elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'blog_notify_message');
+
+ // add blog link to
+ elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'blog_owner_block_menu');
+
+ // pingbacks
+ //elgg_register_event_handler('create', 'object', 'blog_incoming_ping');
+ //elgg_register_plugin_hook_handler('pingback:object:subtypes', 'object', 'blog_pingback_subtypes');
+
+ // Register for search.
+ elgg_register_entity_type('object', 'blog');
+
+ // Add group option
+ add_group_tool_option('blog', elgg_echo('blog:enableblog'), true);
+ elgg_extend_view('groups/tool_latest', 'blog/group_module');
+
+ // add a blog widget
+ elgg_register_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description'));
+
+ // register actions
+ $action_path = elgg_get_plugins_path() . 'blog/actions/blog';
+ elgg_register_action('blog/save', "$action_path/save.php");
+ elgg_register_action('blog/auto_save_revision', "$action_path/auto_save_revision.php");
+ elgg_register_action('blog/delete', "$action_path/delete.php");
+
+ // entity menu
+ elgg_register_plugin_hook_handler('register', 'menu:entity', 'blog_entity_menu_setup');
+
+ // ecml
+ elgg_register_plugin_hook_handler('get_views', 'ecml', 'blog_ecml_views_hook');
+}
+
+/**
+ * Dispatches blog pages.
+ * URLs take the form of
+ * All blogs: blog/all
+ * User's blogs: blog/owner/<username>
+ * Friends' blog: blog/friends/<username>
+ * User's archives: blog/archives/<username>/<time_start>/<time_stop>
+ * Blog post: blog/view/<guid>/<title>
+ * New post: blog/add/<guid>
+ * Edit post: blog/edit/<guid>/<revision>
+ * Preview post: blog/preview/<guid>
+ * Group blog: blog/group/<guid>/all
+ *
+ * Title is ignored
+ *
+ * @todo no archives for all blogs or friends
+ *
+ * @param array $page
+ * @return bool
+ */
+function blog_page_handler($page) {
+
+ elgg_load_library('elgg:blog');
+
+ // forward to correct URL for blog pages pre-1.8
+ blog_url_forwarder($page);
+
+ // push all blogs breadcrumb
+ elgg_push_breadcrumb(elgg_echo('blog:blogs'), "blog/all");
+
+ if (!isset($page[0])) {
+ $page[0] = 'all';
+ }
+
+ $page_type = $page[0];
+ switch ($page_type) {
+ case 'owner':
+ $user = get_user_by_username($page[1]);
+ if (!$user) {
+ forward('', '404');
+ }
+ $params = blog_get_page_content_list($user->guid);
+ break;
+ case 'friends':
+ $user = get_user_by_username($page[1]);
+ if (!$user) {
+ forward('', '404');
+ }
+ $params = blog_get_page_content_friends($user->guid);
+ break;
+ case 'archive':
+ $user = get_user_by_username($page[1]);
+ if (!$user) {
+ forward('', '404');
+ }
+ $params = blog_get_page_content_archive($user->guid, $page[2], $page[3]);
+ break;
+ case 'view':
+ $params = blog_get_page_content_read($page[1]);
+ break;
+ case 'read': // Elgg 1.7 compatibility
+ register_error(elgg_echo("changebookmark"));
+ forward("blog/view/{$page[1]}");
+ break;
+ case 'add':
+ gatekeeper();
+ $params = blog_get_page_content_edit($page_type, $page[1]);
+ break;
+ case 'edit':
+ gatekeeper();
+ $params = blog_get_page_content_edit($page_type, $page[1], $page[2]);
+ break;
+ case 'group':
+ $group = get_entity($page[1]);
+ if (!elgg_instanceof($group, 'group')) {
+ forward('', '404');
+ }
+ if (!isset($page[2]) || $page[2] == 'all') {
+ $params = blog_get_page_content_list($page[1]);
+ } else {
+ $params = blog_get_page_content_archive($page[1], $page[3], $page[4]);
+ }
+ break;
+ case 'all':
+ $params = blog_get_page_content_list();
+ break;
+ default:
+ return false;
+ }
+
+ if (isset($params['sidebar'])) {
+ $params['sidebar'] .= elgg_view('blog/sidebar', array('page' => $page_type));
+ } else {
+ $params['sidebar'] = elgg_view('blog/sidebar', array('page' => $page_type));
+ }
+
+ $body = elgg_view_layout('content', $params);
+
+ echo elgg_view_page($params['title'], $body);
+ return true;
+}
+
+/**
+ * Format and return the URL for blogs.
+ *
+ * @param ElggObject $entity Blog object
+ * @return string URL of blog.
+ */
+function blog_url_handler($entity) {
+ if (!$entity->getOwnerEntity()) {
+ // default to a standard view if no owner.
+ return FALSE;
+ }
+
+ $friendly_title = elgg_get_friendly_title($entity->title);
+
+ return "blog/view/{$entity->guid}/$friendly_title";
+}
+
+/**
+ * Add a menu item to an ownerblock
+ */
+function blog_owner_block_menu($hook, $type, $return, $params) {
+ if (elgg_instanceof($params['entity'], 'user')) {
+ $url = "blog/owner/{$params['entity']->username}";
+ $item = new ElggMenuItem('blog', elgg_echo('blog'), $url);
+ $return[] = $item;
+ } else {
+ if ($params['entity']->blog_enable != "no") {
+ $url = "blog/group/{$params['entity']->guid}/all";
+ $item = new ElggMenuItem('blog', elgg_echo('blog:group'), $url);
+ $return[] = $item;
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Add particular blog links/info to entity menu
+ */
+function blog_entity_menu_setup($hook, $type, $return, $params) {
+ if (elgg_in_context('widgets')) {
+ return $return;
+ }
+
+ $entity = $params['entity'];
+ $handler = elgg_extract('handler', $params, false);
+ if ($handler != 'blog') {
+ return $return;
+ }
+
+ if ($entity->status != 'published') {
+ // draft status replaces access
+ foreach ($return as $index => $item) {
+ if ($item->getName() == 'access') {
+ unset($return[$index]);
+ }
+ }
+
+ $status_text = elgg_echo("blog:status:{$entity->status}");
+ $options = array(
+ 'name' => 'published_status',
+ 'text' => "<span>$status_text</span>",
+ 'href' => false,
+ 'priority' => 150,
+ );
+ $return[] = ElggMenuItem::factory($options);
+ }
+
+ return $return;
+}
+
+/**
+ * Set the notification message body
+ *
+ * @param string $hook Hook name
+ * @param string $type Hook type
+ * @param string $message The current message body
+ * @param array $params Parameters about the blog posted
+ * @return string
+ */
+function blog_notify_message($hook, $type, $message, $params) {
+ $entity = $params['entity'];
+ $to_entity = $params['to_entity'];
+ $method = $params['method'];
+ if (elgg_instanceof($entity, 'object', 'blog')) {
+ $descr = $entity->excerpt;
+ $title = $entity->title;
+ $owner = $entity->getOwnerEntity();
+ return elgg_echo('blog:notification', array(
+ $owner->name,
+ $title,
+ $descr,
+ $entity->getURL()
+ ));
+ }
+ return null;
+}
+
+/**
+ * Register blogs with ECML.
+ */
+function blog_ecml_views_hook($hook, $entity_type, $return_value, $params) {
+ $return_value['object/blog'] = elgg_echo('blog:blogs');
+
+ return $return_value;
+}
+
+/**
+ * Upgrade from 1.7 to 1.8.
+ */
+function blog_run_upgrades($event, $type, $details) {
+ $blog_upgrade_version = elgg_get_plugin_setting('upgrade_version', 'blogs');
+
+ if (!$blog_upgrade_version) {
+ // When upgrading, check if the ElggBlog class has been registered as this
+ // was added in Elgg 1.8
+ if (!update_subtype('object', 'blog', 'ElggBlog')) {
+ add_subtype('object', 'blog', 'ElggBlog');
+ }
+
+ elgg_set_plugin_setting('upgrade_version', 1, 'blogs');
+ }
+}
diff --git a/mod/blog/views/default/blog/css.php b/mod/blog/views/default/blog/css.php
new file mode 100644
index 000000000..12ac4df2a
--- /dev/null
+++ b/mod/blog/views/default/blog/css.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Blog CSS
+ *
+ * @package Blog
+*/
+?>
+
+/* Blog Plugin */
+
+/* force tinymce input height for a more useful editing / blog creation area */
+form#blog-post-edit #description_parent #description_ifr {
+ height:400px !important;
+}
diff --git a/mod/blog/views/default/blog/group_module.php b/mod/blog/views/default/blog/group_module.php
new file mode 100644
index 000000000..6082cdafd
--- /dev/null
+++ b/mod/blog/views/default/blog/group_module.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Group blog module
+ */
+
+$group = elgg_get_page_owner_entity();
+
+if ($group->blog_enable == "no") {
+ return true;
+}
+
+$all_link = elgg_view('output/url', array(
+ 'href' => "blog/group/$group->guid/all",
+ 'text' => elgg_echo('link:view:all'),
+ 'is_trusted' => true,
+));
+
+elgg_push_context('widgets');
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'container_guid' => elgg_get_page_owner_guid(),
+ 'metadata_name_value_pairs' => array('name' => 'status', 'value' => 'published'),
+ 'limit' => 6,
+ 'full_view' => false,
+ 'pagination' => false,
+);
+$content = elgg_list_entities_from_metadata($options);
+elgg_pop_context();
+
+if (!$content) {
+ $content = '<p>' . elgg_echo('blog:none') . '</p>';
+}
+
+$new_link = elgg_view('output/url', array(
+ 'href' => "blog/add/$group->guid",
+ 'text' => elgg_echo('blog:write'),
+ 'is_trusted' => true,
+));
+
+echo elgg_view('groups/profile/module', array(
+ 'title' => elgg_echo('blog:group'),
+ 'content' => $content,
+ 'all_link' => $all_link,
+ 'add_link' => $new_link,
+));
diff --git a/mod/blog/views/default/blog/sidebar.php b/mod/blog/views/default/blog/sidebar.php
new file mode 100644
index 000000000..0ae2b431c
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Blog sidebar
+ *
+ * @package Blog
+ */
+
+// fetch & display latest comments
+if ($vars['page'] == 'all') {
+ echo elgg_view('page/elements/comments_block', array(
+ 'subtypes' => 'blog',
+ ));
+} elseif ($vars['page'] == 'owner') {
+ echo elgg_view('page/elements/comments_block', array(
+ 'subtypes' => 'blog',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+ ));
+}
+
+// only users can have archives at present
+if ($vars['page'] == 'owner' || $vars['page'] == 'group') {
+ echo elgg_view('blog/sidebar/archives', $vars);
+}
+
+if ($vars['page'] != 'friends') {
+ echo elgg_view('page/elements/tagcloud_block', array(
+ 'subtypes' => 'blog',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+ ));
+}
diff --git a/mod/blog/views/default/blog/sidebar/archives.php b/mod/blog/views/default/blog/sidebar/archives.php
new file mode 100644
index 000000000..6529887d4
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar/archives.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Blog archives
+ */
+
+$page_owner = elgg_get_page_owner_entity();
+
+if (!$page_owner) {
+ return true;
+}
+
+if (elgg_instanceof($page_owner, 'user')) {
+ $url_segment = 'blog/archive/' . $page_owner->username;
+} else {
+ $url_segment = 'blog/group/' . $page_owner->getGUID() . '/archive';
+}
+
+// This is a limitation of the URL schema.
+if ($page_owner && $vars['page'] != 'friends') {
+ $dates = array_reverse(get_entity_dates('object', 'blog', $page_owner->getGUID()));
+
+ if ($dates) {
+ $title = elgg_echo('blog:archives');
+ $content = '<ul class="blog-archives">';
+ foreach ($dates as $date) {
+ $timestamplow = mktime(0, 0, 0, substr($date,4,2) , 1, substr($date, 0, 4));
+ $timestamphigh = mktime(0, 0, 0, ((int) substr($date, 4, 2)) + 1, 1, substr($date, 0, 4));
+
+ $link = elgg_get_site_url() . $url_segment . '/' . $timestamplow . '/' . $timestamphigh;
+ $month = elgg_echo('date:month:' . substr($date, 4, 2), array(substr($date, 0, 4)));
+ $content .= "<li><a href=\"$link\" title=\"$month\">$month</a></li>";
+ }
+ $content .= '</ul>';
+
+ echo elgg_view_module('aside', $title, $content);
+ }
+}
diff --git a/mod/blog/views/default/blog/sidebar/revisions.php b/mod/blog/views/default/blog/sidebar/revisions.php
new file mode 100644
index 000000000..cd2e7f3d8
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar/revisions.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Blog sidebar menu showing revisions
+ *
+ * @package Blog
+ */
+
+//If editing a post, show the previous revisions and drafts.
+$blog = elgg_extract('entity', $vars, FALSE);
+
+if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $owner = $blog->getOwnerEntity();
+ $revisions = array();
+
+ $auto_save_annotations = $blog->getAnnotations('blog_auto_save', 1);
+ if ($auto_save_annotations) {
+ $revisions[] = $auto_save_annotations[0];
+ }
+
+ // count(FALSE) == 1! AHHH!!!
+ $saved_revisions = $blog->getAnnotations('blog_revision', 10, 0, 'time_created DESC');
+ if ($saved_revisions) {
+ $revision_count = count($saved_revisions);
+ } else {
+ $revision_count = 0;
+ }
+
+ $revisions = array_merge($revisions, $saved_revisions);
+
+ if ($revisions) {
+ $title = elgg_echo('blog:revisions');
+
+ $n = count($revisions);
+ $body = '<ul class="blog-revisions">';
+
+ $load_base_url = "blog/edit/{$blog->getGUID()}";
+
+ // show the "published revision"
+ if ($blog->status == 'published') {
+ $load = elgg_view('output/url', array(
+ 'href' => $load_base_url,
+ 'text' => elgg_echo('blog:status:published'),
+ 'is_trusted' => true,
+ ));
+
+ $time = "<span class='elgg-subtext'>"
+ . elgg_view_friendly_time($blog->time_created) . "</span>";
+
+ $body .= "<li>$load : $time</li>";
+ }
+
+ foreach ($revisions as $revision) {
+ $time = "<span class='elgg-subtext'>"
+ . elgg_view_friendly_time($revision->time_created) . "</span>";
+
+ if ($revision->name == 'blog_auto_save') {
+ $revision_lang = elgg_echo('blog:auto_saved_revision');
+ } else {
+ $revision_lang = elgg_echo('blog:revision') . " $n";
+ }
+ $load = elgg_view('output/url', array(
+ 'href' => "$load_base_url/$revision->id",
+ 'text' => $revision_lang,
+ 'is_trusted' => true,
+ ));
+
+ $text = "$load: $time";
+ $class = 'class="auto-saved"';
+
+ $n--;
+
+ $body .= "<li $class>$text</li>";
+ }
+
+ $body .= '</ul>';
+
+ echo elgg_view_module('aside', $title, $body);
+ }
+} \ No newline at end of file
diff --git a/mod/blog/views/default/forms/blog/save.php b/mod/blog/views/default/forms/blog/save.php
new file mode 100644
index 000000000..f825acca1
--- /dev/null
+++ b/mod/blog/views/default/forms/blog/save.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * Edit blog form
+ *
+ * @package Blog
+ */
+
+$blog = get_entity($vars['guid']);
+$vars['entity'] = $blog;
+
+$draft_warning = $vars['draft_warning'];
+if ($draft_warning) {
+ $draft_warning = '<span class="mbm elgg-text-help">' . $draft_warning . '</span>';
+}
+
+$action_buttons = '';
+$delete_link = '';
+$preview_button = '';
+
+if ($vars['guid']) {
+ // add a delete button if editing
+ $delete_url = "action/blog/delete?guid={$vars['guid']}";
+ $delete_link = elgg_view('output/confirmlink', array(
+ 'href' => $delete_url,
+ 'text' => elgg_echo('delete'),
+ 'class' => 'elgg-button elgg-button-delete float-alt'
+ ));
+}
+
+// published blogs do not get the preview button
+if (!$vars['guid'] || ($blog && $blog->status != 'published')) {
+ $preview_button = elgg_view('input/submit', array(
+ 'value' => elgg_echo('preview'),
+ 'name' => 'preview',
+ 'class' => 'mls',
+ ));
+}
+
+$save_button = elgg_view('input/submit', array(
+ 'value' => elgg_echo('save'),
+ 'name' => 'save',
+));
+$action_buttons = $save_button . $preview_button . $delete_link;
+
+$title_label = elgg_echo('title');
+$title_input = elgg_view('input/text', array(
+ 'name' => 'title',
+ 'id' => 'blog_title',
+ 'value' => $vars['title']
+));
+
+$excerpt_label = elgg_echo('blog:excerpt');
+$excerpt_input = elgg_view('input/text', array(
+ 'name' => 'excerpt',
+ 'id' => 'blog_excerpt',
+ 'value' => _elgg_html_decode($vars['excerpt'])
+));
+
+$body_label = elgg_echo('blog:body');
+$body_input = elgg_view('input/longtext', array(
+ 'name' => 'description',
+ 'id' => 'blog_description',
+ 'value' => $vars['description']
+));
+
+$save_status = elgg_echo('blog:save_status');
+if ($vars['guid']) {
+ $entity = get_entity($vars['guid']);
+ $saved = date('F j, Y @ H:i', $entity->time_created);
+} else {
+ $saved = elgg_echo('blog:never');
+}
+
+$status_label = elgg_echo('blog:status');
+$status_input = elgg_view('input/dropdown', array(
+ 'name' => 'status',
+ 'id' => 'blog_status',
+ 'value' => $vars['status'],
+ 'options_values' => array(
+ 'draft' => elgg_echo('blog:status:draft'),
+ 'published' => elgg_echo('blog:status:published')
+ )
+));
+
+$comments_label = elgg_echo('comments');
+$comments_input = elgg_view('input/dropdown', array(
+ 'name' => 'comments_on',
+ 'id' => 'blog_comments_on',
+ 'value' => $vars['comments_on'],
+ 'options_values' => array('On' => elgg_echo('on'), 'Off' => elgg_echo('off'))
+));
+
+$tags_label = elgg_echo('tags');
+$tags_input = elgg_view('input/tags', array(
+ 'name' => 'tags',
+ 'id' => 'blog_tags',
+ 'value' => $vars['tags']
+));
+
+$access_label = elgg_echo('access');
+$access_input = elgg_view('input/access', array(
+ 'name' => 'access_id',
+ 'id' => 'blog_access_id',
+ 'value' => $vars['access_id']
+));
+
+$categories_input = elgg_view('input/categories', $vars);
+
+// hidden inputs
+$container_guid_input = elgg_view('input/hidden', array('name' => 'container_guid', 'value' => elgg_get_page_owner_guid()));
+$guid_input = elgg_view('input/hidden', array('name' => 'guid', 'value' => $vars['guid']));
+
+
+echo <<<___HTML
+
+$draft_warning
+
+<div>
+ <label for="blog_title">$title_label</label>
+ $title_input
+</div>
+
+<div>
+ <label for="blog_excerpt">$excerpt_label</label>
+ $excerpt_input
+</div>
+
+<div>
+ <label for="blog_description">$body_label</label>
+ $body_input
+</div>
+
+<div>
+ <label for="blog_tags">$tags_label</label>
+ $tags_input
+</div>
+
+$categories_input
+
+<div>
+ <label for="blog_comments_on">$comments_label</label>
+ $comments_input
+</div>
+
+<div>
+ <label for="blog_access_id">$access_label</label>
+ $access_input
+</div>
+
+<div>
+ <label for="blog_status">$status_label</label>
+ $status_input
+</div>
+
+<div class="elgg-foot">
+ <div class="elgg-subtext mbm">
+ $save_status <span class="blog-save-status-time">$saved</span>
+ </div>
+
+ $guid_input
+ $container_guid_input
+
+ $action_buttons
+</div>
+
+___HTML;
diff --git a/mod/blog/views/default/js/blog/save_draft.php b/mod/blog/views/default/js/blog/save_draft.php
new file mode 100644
index 000000000..8cd07ff5d
--- /dev/null
+++ b/mod/blog/views/default/js/blog/save_draft.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Save draft through ajax
+ *
+ * @package Blog
+ */
+?>
+elgg.provide('elgg.blog');
+
+/*
+ * Attempt to save and update the input with the guid.
+ */
+elgg.blog.saveDraftCallback = function(data, textStatus, XHR) {
+ if (textStatus == 'success' && data.success == true) {
+ var form = $('form[id=blog-post-edit]');
+
+ // update the guid input element for new posts that now have a guid
+ form.find('input[name=guid]').val(data.guid);
+
+ oldDescription = form.find('textarea[name=description]').val();
+
+ var d = new Date();
+ var mins = d.getMinutes() + '';
+ if (mins.length == 1) {
+ mins = '0' + mins;
+ }
+ $(".blog-save-status-time").html(d.toLocaleDateString() + " @ " + d.getHours() + ":" + mins);
+ } else {
+ $(".blog-save-status-time").html(elgg.echo('error'));
+ }
+};
+
+elgg.blog.saveDraft = function() {
+ if (typeof(tinyMCE) != 'undefined') {
+ tinyMCE.triggerSave();
+ }
+
+ // only save on changed content
+ var form = $('form[id=blog-post-edit]');
+ var description = form.find('textarea[name=description]').val();
+ var title = form.find('input[name=title]').val();
+
+ if (!(description && title) || (description == oldDescription)) {
+ return false;
+ }
+
+ var draftURL = elgg.config.wwwroot + "action/blog/auto_save_revision";
+ var postData = form.serializeArray();
+
+ // force draft status
+ $(postData).each(function(i, e) {
+ if (e.name == 'status') {
+ e.value = 'draft';
+ }
+ });
+
+ $.post(draftURL, postData, elgg.blog.saveDraftCallback, 'json');
+};
+
+elgg.blog.init = function() {
+ // get a copy of the body to compare for auto save
+ oldDescription = $('form[id=blog-post-edit]').find('textarea[name=description]').val();
+
+ setInterval(elgg.blog.saveDraft, 60000);
+};
+
+elgg.register_hook_handler('init', 'system', elgg.blog.init); \ No newline at end of file
diff --git a/mod/blog/views/default/object/blog.php b/mod/blog/views/default/object/blog.php
new file mode 100644
index 000000000..4403a6006
--- /dev/null
+++ b/mod/blog/views/default/object/blog.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * View for blog objects
+ *
+ * @package Blog
+ */
+
+$full = elgg_extract('full_view', $vars, FALSE);
+$blog = elgg_extract('entity', $vars, FALSE);
+
+if (!$blog) {
+ return TRUE;
+}
+
+$owner = $blog->getOwnerEntity();
+$container = $blog->getContainerEntity();
+$categories = elgg_view('output/categories', $vars);
+$excerpt = $blog->excerpt;
+if (!$excerpt) {
+ $excerpt = elgg_get_excerpt($blog->description);
+}
+
+$owner_icon = elgg_view_entity_icon($owner, 'tiny');
+$owner_link = elgg_view('output/url', array(
+ 'href' => "blog/owner/$owner->username",
+ 'text' => $owner->name,
+ 'is_trusted' => true,
+));
+$author_text = elgg_echo('byline', array($owner_link));
+$date = elgg_view_friendly_time($blog->time_created);
+
+// The "on" status changes for comments, so best to check for !Off
+if ($blog->comments_on != 'Off') {
+ $comments_count = $blog->countComments();
+ //only display if there are commments
+ if ($comments_count != 0) {
+ $text = elgg_echo("comments") . " ($comments_count)";
+ $comments_link = elgg_view('output/url', array(
+ 'href' => $blog->getURL() . '#blog-comments',
+ 'text' => $text,
+ 'is_trusted' => true,
+ ));
+ } else {
+ $comments_link = '';
+ }
+} else {
+ $comments_link = '';
+}
+
+$metadata = elgg_view_menu('entity', array(
+ 'entity' => $vars['entity'],
+ 'handler' => 'blog',
+ 'sort_by' => 'priority',
+ 'class' => 'elgg-menu-hz',
+));
+
+$subtitle = "$author_text $date $comments_link $categories";
+
+// do not show the metadata and controls in widget view
+if (elgg_in_context('widgets')) {
+ $metadata = '';
+}
+
+if ($full) {
+
+ $body = elgg_view('output/longtext', array(
+ 'value' => $blog->description,
+ 'class' => 'blog-post',
+ ));
+
+ $params = array(
+ 'entity' => $blog,
+ 'title' => false,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ );
+ $params = $params + $vars;
+ $summary = elgg_view('object/elements/summary', $params);
+
+ echo elgg_view('object/elements/full', array(
+ 'summary' => $summary,
+ 'icon' => $owner_icon,
+ 'body' => $body,
+ ));
+
+} else {
+ // brief view
+
+ $params = array(
+ 'entity' => $blog,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ 'content' => $excerpt,
+ );
+ $params = $params + $vars;
+ $list_body = elgg_view('object/elements/summary', $params);
+
+ echo elgg_view_image_block($owner_icon, $list_body);
+}
diff --git a/mod/blog/views/default/river/object/blog/create.php b/mod/blog/views/default/river/object/blog/create.php
new file mode 100644
index 000000000..b808f1bdc
--- /dev/null
+++ b/mod/blog/views/default/river/object/blog/create.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Blog river view.
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+$excerpt = $object->excerpt ? $object->excerpt : $object->description;
+$excerpt = strip_tags($excerpt);
+$excerpt = elgg_get_excerpt($excerpt);
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'message' => $excerpt,
+));
diff --git a/mod/blog/views/default/widgets/blog/content.php b/mod/blog/views/default/widgets/blog/content.php
new file mode 100644
index 000000000..330171662
--- /dev/null
+++ b/mod/blog/views/default/widgets/blog/content.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * User blog widget display view
+ */
+
+$num = $vars['entity']->num_display;
+
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'container_guid' => $vars['entity']->owner_guid,
+ 'limit' => $num,
+ 'full_view' => FALSE,
+ 'pagination' => FALSE,
+);
+$content = elgg_list_entities($options);
+
+echo $content;
+
+if ($content) {
+ $blog_url = "blog/owner/" . elgg_get_page_owner_entity()->username;
+ $more_link = elgg_view('output/url', array(
+ 'href' => $blog_url,
+ 'text' => elgg_echo('blog:moreblogs'),
+ 'is_trusted' => true,
+ ));
+ echo "<span class=\"elgg-widget-more\">$more_link</span>";
+} else {
+ echo elgg_echo('blog:noblogs');
+}
diff --git a/mod/blog/views/default/widgets/blog/edit.php b/mod/blog/views/default/widgets/blog/edit.php
new file mode 100644
index 000000000..30c3b2e73
--- /dev/null
+++ b/mod/blog/views/default/widgets/blog/edit.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * User blog widget edit view
+ */
+
+// set default value
+if (!isset($vars['entity']->num_display)) {
+ $vars['entity']->num_display = 4;
+}
+
+$params = array(
+ 'name' => 'params[num_display]',
+ 'value' => $vars['entity']->num_display,
+ 'options' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
+);
+$dropdown = elgg_view('input/dropdown', $params);
+
+?>
+<div>
+ <?php echo elgg_echo('blog:numbertodisplay'); ?>:
+ <?php echo $dropdown; ?>
+</div>
diff --git a/mod/bookmarks/actions/bookmarks/delete.php b/mod/bookmarks/actions/bookmarks/delete.php
new file mode 100644
index 000000000..2e9f41438
--- /dev/null
+++ b/mod/bookmarks/actions/bookmarks/delete.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Delete a bookmark
+ *
+ * @package Bookmarks
+ */
+
+$guid = get_input('guid');
+$bookmark = get_entity($guid);
+
+if (elgg_instanceof($bookmark, 'object', 'bookmarks') && $bookmark->canEdit()) {
+ $container = $bookmark->getContainerEntity();
+ if ($bookmark->delete()) {
+ system_message(elgg_echo("bookmarks:delete:success"));
+ if (elgg_instanceof($container, 'group')) {
+ forward("bookmarks/group/$container->guid/all");
+ } else {
+ forward("bookmarks/owner/$container->username");
+ }
+ }
+}
+
+register_error(elgg_echo("bookmarks:delete:failed"));
+forward(REFERER);
diff --git a/mod/bookmarks/actions/bookmarks/save.php b/mod/bookmarks/actions/bookmarks/save.php
new file mode 100644
index 000000000..46090b115
--- /dev/null
+++ b/mod/bookmarks/actions/bookmarks/save.php
@@ -0,0 +1,90 @@
+<?php
+/**
+* Elgg bookmarks save action
+*
+* @package Bookmarks
+*/
+
+$title = htmlspecialchars(get_input('title', '', false), ENT_QUOTES, 'UTF-8');
+$description = get_input('description');
+$address = get_input('address');
+$access_id = get_input('access_id');
+$tags = get_input('tags');
+$guid = get_input('guid');
+$share = get_input('share');
+$container_guid = get_input('container_guid', elgg_get_logged_in_user_guid());
+
+elgg_make_sticky_form('bookmarks');
+
+// don't use elgg_normalize_url() because we don't want
+// relative links resolved to this site.
+if ($address && !preg_match("#^((ht|f)tps?:)?//#i", $address)) {
+ $address = "http://$address";
+}
+
+if (!$title || !$address) {
+ register_error(elgg_echo('bookmarks:save:failed'));
+ forward(REFERER);
+}
+
+// see https://bugs.php.net/bug.php?id=51192
+$php_5_2_13_and_below = version_compare(PHP_VERSION, '5.2.14', '<');
+$php_5_3_0_to_5_3_2 = version_compare(PHP_VERSION, '5.3.0', '>=') &&
+ version_compare(PHP_VERSION, '5.3.3', '<');
+
+$validated = false;
+if ($php_5_2_13_and_below || $php_5_3_0_to_5_3_2) {
+ $tmp_address = str_replace("-", "", $address);
+ $validated = filter_var($tmp_address, FILTER_VALIDATE_URL);
+} else {
+ $validated = filter_var($address, FILTER_VALIDATE_URL);
+}
+if (!$validated) {
+ register_error(elgg_echo('bookmarks:save:failed'));
+ forward(REFERER);
+}
+
+if ($guid == 0) {
+ $bookmark = new ElggObject;
+ $bookmark->subtype = "bookmarks";
+ $bookmark->container_guid = (int)get_input('container_guid', $_SESSION['user']->getGUID());
+ $new = true;
+} else {
+ $bookmark = get_entity($guid);
+ if (!$bookmark->canEdit()) {
+ system_message(elgg_echo('bookmarks:save:failed'));
+ forward(REFERRER);
+ }
+}
+
+$tagarray = string_to_tag_array($tags);
+
+$bookmark->title = $title;
+$bookmark->address = $address;
+$bookmark->description = $description;
+$bookmark->access_id = $access_id;
+$bookmark->tags = $tagarray;
+
+if ($bookmark->save()) {
+
+ elgg_clear_sticky_form('bookmarks');
+
+ // @todo
+ if (is_array($shares) && sizeof($shares) > 0) {
+ foreach($shares as $share) {
+ $share = (int) $share;
+ add_entity_relationship($bookmark->getGUID(), 'share', $share);
+ }
+ }
+ system_message(elgg_echo('bookmarks:save:success'));
+
+ //add to river only if new
+ if ($new) {
+ add_to_river('river/object/bookmarks/create','create', elgg_get_logged_in_user_guid(), $bookmark->getGUID());
+ }
+
+ forward($bookmark->getURL());
+} else {
+ register_error(elgg_echo('bookmarks:save:failed'));
+ forward("bookmarks");
+}
diff --git a/mod/bookmarks/graphics/bookmark.gif b/mod/bookmarks/graphics/bookmark.gif
new file mode 100644
index 000000000..55c5e3e15
--- /dev/null
+++ b/mod/bookmarks/graphics/bookmark.gif
Binary files differ
diff --git a/mod/bookmarks/graphics/bookmarklet.gif b/mod/bookmarks/graphics/bookmarklet.gif
new file mode 100644
index 000000000..45b24709b
--- /dev/null
+++ b/mod/bookmarks/graphics/bookmarklet.gif
Binary files differ
diff --git a/mod/bookmarks/languages/en.php b/mod/bookmarks/languages/en.php
new file mode 100644
index 000000000..970b39415
--- /dev/null
+++ b/mod/bookmarks/languages/en.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Bookmarks English language file
+ */
+
+$english = array(
+
+ /**
+ * Menu items and titles
+ */
+ 'bookmarks' => "Bookmarks",
+ 'bookmarks:add' => "Add a bookmark",
+ 'bookmarks:edit' => "Edit bookmark",
+ 'bookmarks:owner' => "%s's bookmarks",
+ 'bookmarks:friends' => "Friends' bookmarks",
+ 'bookmarks:everyone' => "All site bookmarks",
+ 'bookmarks:this' => "Bookmark this page",
+ 'bookmarks:this:group' => "Bookmark in %s",
+ 'bookmarks:bookmarklet' => "Get bookmarklet",
+ 'bookmarks:bookmarklet:group' => "Get group bookmarklet",
+ 'bookmarks:inbox' => "Bookmarks inbox",
+ 'bookmarks:morebookmarks' => "More bookmarks",
+ 'bookmarks:more' => "More",
+ 'bookmarks:with' => "Share with",
+ 'bookmarks:new' => "A new bookmark",
+ 'bookmarks:address' => "Address of the bookmark",
+ 'bookmarks:none' => 'No bookmarks',
+
+ 'bookmarks:notification' =>
+'%s added a new bookmark:
+
+%s - %s
+%s
+
+View and comment on the new bookmark:
+%s
+',
+
+ 'bookmarks:delete:confirm' => "Are you sure you want to delete this resource?",
+
+ 'bookmarks:numbertodisplay' => 'Number of bookmarks to display',
+
+ 'bookmarks:shared' => "Bookmarked",
+ 'bookmarks:visit' => "Visit resource",
+ 'bookmarks:recent' => "Recent bookmarks",
+
+ 'river:create:object:bookmarks' => '%s bookmarked %s',
+ 'river:comment:object:bookmarks' => '%s commented on a bookmark %s',
+ 'bookmarks:river:annotate' => 'a comment on this bookmark',
+ 'bookmarks:river:item' => 'an item',
+
+ 'item:object:bookmarks' => 'Bookmarks',
+
+ 'bookmarks:group' => 'Group bookmarks',
+ 'bookmarks:enablebookmarks' => 'Enable group bookmarks',
+ 'bookmarks:nogroup' => 'This group does not have any bookmarks yet',
+ 'bookmarks:more' => 'More bookmarks',
+
+ 'bookmarks:no_title' => 'No title',
+
+ /**
+ * Widget and bookmarklet
+ */
+ 'bookmarks:widget:description' => "Display your latest bookmarks.",
+
+ 'bookmarks:bookmarklet:description' =>
+ "The bookmarks bookmarklet allows you to share any resource you find on the web with your friends, or just bookmark it for yourself. To use it, simply drag the following button to your browser's links bar:",
+
+ 'bookmarks:bookmarklet:descriptionie' =>
+ "If you are using Internet Explorer, you will need to right click on the bookmarklet icon, select 'add to favorites', and then the Links bar.",
+
+ 'bookmarks:bookmarklet:description:conclusion' =>
+ "You can then save any page you visit by clicking it at any time.",
+
+ /**
+ * Status messages
+ */
+
+ 'bookmarks:save:success' => "Your item was successfully bookmarked.",
+ 'bookmarks:delete:success' => "Your bookmark was deleted.",
+
+ /**
+ * Error messages
+ */
+
+ 'bookmarks:save:failed' => "Your bookmark could not be saved. Make sure you've entered a title and address and then try again.",
+ 'bookmarks:save:invalid' => "The address of the bookmark is invalid and could not be saved.",
+ 'bookmarks:delete:failed' => "Your bookmark could not be deleted. Please try again.",
+);
+
+add_translation('en', $english); \ No newline at end of file
diff --git a/mod/bookmarks/lib/bookmarks.php b/mod/bookmarks/lib/bookmarks.php
new file mode 100644
index 000000000..9a9dff18c
--- /dev/null
+++ b/mod/bookmarks/lib/bookmarks.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Bookmarks helper functions
+ *
+ * @package Bookmarks
+ */
+
+/**
+ * Prepare the add/edit form variables
+ *
+ * @param ElggObject $bookmark A bookmark object.
+ * @return array
+ */
+function bookmarks_prepare_form_vars($bookmark = null) {
+ // input names => defaults
+ $values = array(
+ 'title' => get_input('title', ''), // bookmarklet support
+ 'address' => get_input('address', ''),
+ 'description' => '',
+ 'access_id' => ACCESS_DEFAULT,
+ 'tags' => '',
+ 'shares' => array(),
+ 'container_guid' => elgg_get_page_owner_guid(),
+ 'guid' => null,
+ 'entity' => $bookmark,
+ );
+
+ if ($bookmark) {
+ foreach (array_keys($values) as $field) {
+ if (isset($bookmark->$field)) {
+ $values[$field] = $bookmark->$field;
+ }
+ }
+ }
+
+ if (elgg_is_sticky_form('bookmarks')) {
+ $sticky_values = elgg_get_sticky_values('bookmarks');
+ foreach ($sticky_values as $key => $value) {
+ $values[$key] = $value;
+ }
+ }
+
+ elgg_clear_sticky_form('bookmarks');
+
+ return $values;
+}
diff --git a/mod/bookmarks/manifest.xml b/mod/bookmarks/manifest.xml
new file mode 100644
index 000000000..b95af87f8
--- /dev/null
+++ b/mod/bookmarks/manifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Bookmarks</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <category>content</category>
+ <category>widget</category>
+ <blurb>Add and comment on bookmarks.</blurb>
+ <description>Adds the ability for users to bookmark internal and external sites. Other users can then comment on the bookmarks.</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <activate_on_install>true</activate_on_install>
+</plugin_manifest>
diff --git a/mod/bookmarks/pages/bookmarks/add.php b/mod/bookmarks/pages/bookmarks/add.php
new file mode 100644
index 000000000..d80d4a4bc
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/add.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Add bookmark page
+ *
+ * @package Bookmarks
+ */
+
+$page_owner = elgg_get_page_owner_entity();
+
+$title = elgg_echo('bookmarks:add');
+elgg_push_breadcrumb($title);
+
+$vars = bookmarks_prepare_form_vars();
+$content = elgg_view_form('bookmarks/save', array(), $vars);
+
+$body = elgg_view_layout('content', array(
+ 'filter' => '',
+ 'content' => $content,
+ 'title' => $title,
+));
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/bookmarks/pages/bookmarks/all.php b/mod/bookmarks/pages/bookmarks/all.php
new file mode 100644
index 000000000..5c6011ad9
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/all.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Elgg bookmarks plugin everyone page
+ *
+ * @package ElggBookmarks
+ */
+
+elgg_pop_breadcrumb();
+elgg_push_breadcrumb(elgg_echo('bookmarks'));
+
+elgg_register_title_button();
+
+$content = elgg_list_entities(array(
+ 'type' => 'object',
+ 'subtype' => 'bookmarks',
+ 'full_view' => false,
+ 'view_toggle_type' => false,
+));
+
+if (!$content) {
+ $content = elgg_echo('bookmarks:none');
+}
+
+$title = elgg_echo('bookmarks:everyone');
+
+$body = elgg_view_layout('content', array(
+ 'filter_context' => 'all',
+ 'content' => $content,
+ 'title' => $title,
+ 'sidebar' => elgg_view('bookmarks/sidebar'),
+));
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/bookmarks/pages/bookmarks/bookmarklet.php b/mod/bookmarks/pages/bookmarks/bookmarklet.php
new file mode 100644
index 000000000..99866e385
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/bookmarklet.php
@@ -0,0 +1,36 @@
+<?php
+/**
+* Elgg bookmarks plugin bookmarklet page
+*
+* @package Bookmarks
+*/
+
+gatekeeper();
+
+$container_guid = get_input('container_guid');
+$container = get_entity($container_guid);
+$page_owner = $container;
+
+if (elgg_instanceof($container, 'object')) {
+ $page_owner = $container->getContainerEntity();
+}
+
+elgg_set_page_owner_guid($page_owner->getGUID());
+
+$title = elgg_echo('bookmarks:bookmarklet');
+
+if ($page_owner instanceof ElggGroup) {
+ elgg_push_breadcrumb($page_owner->name, $page_owner->getURL());
+}
+
+elgg_push_breadcrumb($title);
+
+$content = elgg_view("bookmarks/bookmarklet");
+
+$body = elgg_view_layout('content', array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => false
+));
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/bookmarks/pages/bookmarks/edit.php b/mod/bookmarks/pages/bookmarks/edit.php
new file mode 100644
index 000000000..93b143c36
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/edit.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Add bookmark page
+ *
+ * @package ElggBookmarks
+ */
+
+$bookmark_guid = get_input('guid');
+$bookmark = get_entity($bookmark_guid);
+
+if (!elgg_instanceof($bookmark, 'object', 'bookmarks') || !$bookmark->canEdit()) {
+ register_error(elgg_echo('bookmarks:unknown_bookmark'));
+ forward(REFERRER);
+}
+
+$page_owner = elgg_get_page_owner_entity();
+
+$title = elgg_echo('bookmarks:edit');
+elgg_push_breadcrumb($title);
+
+$vars = bookmarks_prepare_form_vars($bookmark);
+$content = elgg_view_form('bookmarks/save', array(), $vars);
+
+$body = elgg_view_layout('content', array(
+ 'filter' => '',
+ 'content' => $content,
+ 'title' => $title,
+));
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/bookmarks/pages/bookmarks/friends.php b/mod/bookmarks/pages/bookmarks/friends.php
new file mode 100644
index 000000000..173996346
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/friends.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Elgg bookmarks plugin friends page
+ *
+ * @package ElggBookmarks
+ */
+
+$page_owner = elgg_get_page_owner_entity();
+if (!$page_owner) {
+ forward('', '404');
+}
+
+elgg_push_breadcrumb($page_owner->name, "bookmarks/owner/$page_owner->username");
+elgg_push_breadcrumb(elgg_echo('friends'));
+
+elgg_register_title_button();
+
+$title = elgg_echo('bookmarks:friends');
+
+$content = list_user_friends_objects($page_owner->guid, 'bookmarks', 10, false);
+if (!$content) {
+ $content = elgg_echo('bookmarks:none');
+}
+
+$params = array(
+ 'filter_context' => 'friends',
+ 'content' => $content,
+ 'title' => $title,
+);
+
+$body = elgg_view_layout('content', $params);
+
+echo elgg_view_page($title, $body);
diff --git a/mod/bookmarks/pages/bookmarks/owner.php b/mod/bookmarks/pages/bookmarks/owner.php
new file mode 100644
index 000000000..b7b907916
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/owner.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Elgg bookmarks plugin everyone page
+ *
+ * @package Bookmarks
+ */
+
+$page_owner = elgg_get_page_owner_entity();
+if (!$page_owner) {
+ forward('', '404');
+}
+
+elgg_push_breadcrumb($page_owner->name);
+
+elgg_register_title_button();
+
+$content .= elgg_list_entities(array(
+ 'type' => 'object',
+ 'subtype' => 'bookmarks',
+ 'container_guid' => $page_owner->guid,
+ 'full_view' => false,
+ 'view_toggle_type' => false
+));
+
+if (!$content) {
+ $content = elgg_echo('bookmarks:none');
+}
+
+$title = elgg_echo('bookmarks:owner', array($page_owner->name));
+
+$filter_context = '';
+if ($page_owner->getGUID() == elgg_get_logged_in_user_guid()) {
+ $filter_context = 'mine';
+}
+
+$vars = array(
+ 'filter_context' => $filter_context,
+ 'content' => $content,
+ 'title' => $title,
+ 'sidebar' => elgg_view('bookmarks/sidebar'),
+);
+
+// don't show filter if out of filter context
+if ($page_owner instanceof ElggGroup) {
+ $vars['filter'] = false;
+}
+
+$body = elgg_view_layout('content', $vars);
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/bookmarks/pages/bookmarks/view.php b/mod/bookmarks/pages/bookmarks/view.php
new file mode 100644
index 000000000..70a6a5bfe
--- /dev/null
+++ b/mod/bookmarks/pages/bookmarks/view.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * View a bookmark
+ *
+ * @package ElggBookmarks
+ */
+
+$bookmark = get_entity(get_input('guid'));
+if (!$bookmark) {
+ register_error(elgg_echo('noaccess'));
+ $_SESSION['last_forward_from'] = current_page_url();
+ forward('');
+}
+
+$page_owner = elgg_get_page_owner_entity();
+
+$crumbs_title = $page_owner->name;
+
+if (elgg_instanceof($page_owner, 'group')) {
+ elgg_push_breadcrumb($crumbs_title, "bookmarks/group/$page_owner->guid/all");
+} else {
+ elgg_push_breadcrumb($crumbs_title, "bookmarks/owner/$page_owner->username");
+}
+
+$title = $bookmark->title;
+
+elgg_push_breadcrumb($title);
+
+$content = elgg_view_entity($bookmark, array('full_view' => true));
+$content .= elgg_view_comments($bookmark);
+
+$body = elgg_view_layout('content', array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => '',
+));
+
+echo elgg_view_page($title, $body);
diff --git a/mod/bookmarks/start.php b/mod/bookmarks/start.php
new file mode 100644
index 000000000..caea43587
--- /dev/null
+++ b/mod/bookmarks/start.php
@@ -0,0 +1,316 @@
+<?php
+/**
+ * Elgg Bookmarks plugin
+ *
+ * @package ElggBookmarks
+ */
+
+elgg_register_event_handler('init', 'system', 'bookmarks_init');
+
+/**
+ * Bookmark init
+ */
+function bookmarks_init() {
+
+ $root = dirname(__FILE__);
+ elgg_register_library('elgg:bookmarks', "$root/lib/bookmarks.php");
+
+ // actions
+ $action_path = "$root/actions/bookmarks";
+ elgg_register_action('bookmarks/save', "$action_path/save.php");
+ elgg_register_action('bookmarks/delete', "$action_path/delete.php");
+ elgg_register_action('bookmarks/share', "$action_path/share.php");
+
+ // menus
+ elgg_register_menu_item('site', array(
+ 'name' => 'bookmarks',
+ 'text' => elgg_echo('bookmarks'),
+ 'href' => 'bookmarks/all'
+ ));
+
+ elgg_register_plugin_hook_handler('register', 'menu:page', 'bookmarks_page_menu');
+ elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'bookmarks_owner_block_menu');
+
+ elgg_register_page_handler('bookmarks', 'bookmarks_page_handler');
+
+ elgg_extend_view('css/elgg', 'bookmarks/css');
+ elgg_extend_view('js/elgg', 'bookmarks/js');
+
+ elgg_register_widget_type('bookmarks', elgg_echo('bookmarks'), elgg_echo('bookmarks:widget:description'));
+
+ if (elgg_is_logged_in()) {
+ $user_guid = elgg_get_logged_in_user_guid();
+ $address = urlencode(current_page_url());
+
+ elgg_register_menu_item('extras', array(
+ 'name' => 'bookmark',
+ 'text' => elgg_view_icon('push-pin-alt'),
+ 'href' => "bookmarks/add/$user_guid?address=$address",
+ 'title' => elgg_echo('bookmarks:this'),
+ 'rel' => 'nofollow',
+ ));
+ }
+ // Register granular notification for this type
+ register_notification_object('object', 'bookmarks', elgg_echo('bookmarks:new'));
+
+ // Listen to notification events and supply a more useful message
+ elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'bookmarks_notify_message');
+
+ // Register bookmarks view for ecml parsing
+ elgg_register_plugin_hook_handler('get_views', 'ecml', 'bookmarks_ecml_views_hook');
+
+ // Register a URL handler for bookmarks
+ elgg_register_entity_url_handler('object', 'bookmarks', 'bookmark_url');
+
+ // Register entity type for search
+ elgg_register_entity_type('object', 'bookmarks');
+
+ // Groups
+ add_group_tool_option('bookmarks', elgg_echo('bookmarks:enablebookmarks'), true);
+ elgg_extend_view('groups/tool_latest', 'bookmarks/group_module');
+}
+
+/**
+ * Dispatcher for bookmarks.
+ *
+ * URLs take the form of
+ * All bookmarks: bookmarks/all
+ * User's bookmarks: bookmarks/owner/<username>
+ * Friends' bookmarks: bookmarks/friends/<username>
+ * View bookmark: bookmarks/view/<guid>/<title>
+ * New bookmark: bookmarks/add/<guid> (container: user, group, parent)
+ * Edit bookmark: bookmarks/edit/<guid>
+ * Group bookmarks: bookmarks/group/<guid>/all
+ * Bookmarklet: bookmarks/bookmarklet/<guid> (user)
+ *
+ * Title is ignored
+ *
+ * @param array $page
+ * @return bool
+ */
+function bookmarks_page_handler($page) {
+
+ elgg_load_library('elgg:bookmarks');
+
+ if (!isset($page[0])) {
+ $page[0] = 'all';
+ }
+
+ elgg_push_breadcrumb(elgg_echo('bookmarks'), 'bookmarks/all');
+
+ // old group usernames
+ if (substr_count($page[0], 'group:')) {
+ preg_match('/group\:([0-9]+)/i', $page[0], $matches);
+ $guid = $matches[1];
+ if ($entity = get_entity($guid)) {
+ bookmarks_url_forwarder($page);
+ }
+ }
+
+ // user usernames
+ $user = get_user_by_username($page[0]);
+ if ($user) {
+ bookmarks_url_forwarder($page);
+ }
+
+ $pages = dirname(__FILE__) . '/pages/bookmarks';
+
+ switch ($page[0]) {
+ case "all":
+ include "$pages/all.php";
+ break;
+
+ case "owner":
+ include "$pages/owner.php";
+ break;
+
+ case "friends":
+ include "$pages/friends.php";
+ break;
+
+ case "view":
+ set_input('guid', $page[1]);
+ include "$pages/view.php";
+ break;
+ case 'read': // Elgg 1.7 compatibility
+ register_error(elgg_echo("changebookmark"));
+ forward("bookmarks/view/{$page[1]}");
+ break;
+
+ case "add":
+ gatekeeper();
+ include "$pages/add.php";
+ break;
+
+ case "edit":
+ gatekeeper();
+ set_input('guid', $page[1]);
+ include "$pages/edit.php";
+ break;
+
+ case 'group':
+ group_gatekeeper();
+ include "$pages/owner.php";
+ break;
+
+ case "bookmarklet":
+ set_input('container_guid', $page[1]);
+ include "$pages/bookmarklet.php";
+ break;
+
+ default:
+ return false;
+ }
+
+ elgg_pop_context();
+ return true;
+}
+
+/**
+ * Forward to the new style of URLs
+ *
+ * @param string $page
+ */
+function bookmarks_url_forwarder($page) {
+ global $CONFIG;
+
+ if (!isset($page[1])) {
+ $page[1] = 'items';
+ }
+
+ switch ($page[1]) {
+ case "read":
+ $url = "{$CONFIG->wwwroot}bookmarks/view/{$page[2]}/{$page[3]}";
+ break;
+ case "inbox":
+ $url = "{$CONFIG->wwwroot}bookmarks/inbox/{$page[0]}";
+ break;
+ case "friends":
+ $url = "{$CONFIG->wwwroot}bookmarks/friends/{$page[0]}";
+ break;
+ case "add":
+ $url = "{$CONFIG->wwwroot}bookmarks/add/{$page[0]}";
+ break;
+ case "items":
+ $url = "{$CONFIG->wwwroot}bookmarks/owner/{$page[0]}";
+ break;
+ case "bookmarklet":
+ $url = "{$CONFIG->wwwroot}bookmarks/bookmarklet/{$page[0]}";
+ break;
+ }
+
+ register_error(elgg_echo("changebookmark"));
+ forward($url);
+}
+
+/**
+ * Populates the ->getUrl() method for bookmarked objects
+ *
+ * @param ElggEntity $entity The bookmarked object
+ * @return string bookmarked item URL
+ */
+function bookmark_url($entity) {
+ global $CONFIG;
+
+ $title = $entity->title;
+ $title = elgg_get_friendly_title($title);
+ return $CONFIG->url . "bookmarks/view/" . $entity->getGUID() . "/" . $title;
+}
+
+/**
+ * Add a menu item to an ownerblock
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return
+ * @param array $params
+ */
+function bookmarks_owner_block_menu($hook, $type, $return, $params) {
+ if (elgg_instanceof($params['entity'], 'user')) {
+ $url = "bookmarks/owner/{$params['entity']->username}";
+ $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks'), $url);
+ $return[] = $item;
+ } else {
+ if ($params['entity']->bookmarks_enable != 'no') {
+ $url = "bookmarks/group/{$params['entity']->guid}/all";
+ $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks:group'), $url);
+ $return[] = $item;
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Returns the body of a notification message
+ *
+ * @param string $hook
+ * @param string $entity_type
+ * @param string $returnvalue
+ * @param array $params
+ */
+function bookmarks_notify_message($hook, $entity_type, $returnvalue, $params) {
+ $entity = $params['entity'];
+ $to_entity = $params['to_entity'];
+ $method = $params['method'];
+ if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'bookmarks')) {
+ $descr = $entity->description;
+ $title = $entity->title;
+ $owner = $entity->getOwnerEntity();
+
+ return elgg_echo('bookmarks:notification', array(
+ $owner->name,
+ $title,
+ $entity->address,
+ $descr,
+ $entity->getURL()
+ ));
+ }
+ return null;
+}
+
+/**
+ * Add a page menu menu.
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return
+ * @param array $params
+ */
+function bookmarks_page_menu($hook, $type, $return, $params) {
+ if (elgg_is_logged_in()) {
+ // only show bookmarklet in bookmark pages
+ if (elgg_in_context('bookmarks')) {
+ $page_owner = elgg_get_page_owner_entity();
+ if (!$page_owner) {
+ $page_owner = elgg_get_logged_in_user_entity();
+ }
+
+ if ($page_owner instanceof ElggGroup) {
+ if (!$page_owner->isMember()) {
+ return $return;
+ }
+ $title = elgg_echo('bookmarks:bookmarklet:group');
+ } else {
+ $title = elgg_echo('bookmarks:bookmarklet');
+ }
+
+ $return[] = new ElggMenuItem('bookmarklet', $title, 'bookmarks/bookmarklet/' . $page_owner->getGUID());
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Return bookmarks views to parse for ecml
+ *
+ * @param string $hook
+ * @param string $type
+ * @param array $return
+ * @param array $params
+ */
+function bookmarks_ecml_views_hook($hook, $type, $return, $params) {
+ $return['object/bookmarks'] = elgg_echo('item:object:bookmarks');
+ return $return;
+}
diff --git a/mod/bookmarks/views/default/bookmarks/bookmarklet.php b/mod/bookmarks/views/default/bookmarks/bookmarklet.php
new file mode 100644
index 000000000..b3e9737fe
--- /dev/null
+++ b/mod/bookmarks/views/default/bookmarks/bookmarklet.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Bookmarklet
+ *
+ * @package Bookmarks
+ */
+
+$page_owner = elgg_get_page_owner_entity();
+
+if ($page_owner instanceof ElggGroup) {
+ $title = elgg_echo("bookmarks:this:group", array($page_owner->name));
+} else {
+ $title = elgg_echo("bookmarks:this");
+}
+
+$guid = $page_owner->getGUID();
+
+if (!$name && ($user = elgg_get_logged_in_user_entity())) {
+ $name = $user->username;
+}
+
+$url = elgg_get_site_url();
+$img = elgg_view('output/img', array(
+ 'src' => 'mod/bookmarks/graphics/bookmarklet.gif',
+ 'alt' => $title,
+));
+$bookmarklet = "<a href=\"javascript:location.href='{$url}bookmarks/add/$guid?address='"
+ . "+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)\">"
+ . $img . "</a>";
+
+?>
+<p><?php echo elgg_echo("bookmarks:bookmarklet:description"); ?></p>
+<p><?php echo $bookmarklet; ?></p>
+<p><?php echo elgg_echo("bookmarks:bookmarklet:descriptionie"); ?></p>
+<p><?php echo elgg_echo("bookmarks:bookmarklet:description:conclusion"); ?></p>
diff --git a/mod/bookmarks/views/default/bookmarks/css.php b/mod/bookmarks/views/default/bookmarks/css.php
new file mode 100644
index 000000000..0d734c847
--- /dev/null
+++ b/mod/bookmarks/views/default/bookmarks/css.php
@@ -0,0 +1,3 @@
+.elgg-icon-bookmark {
+ background: transparent url(<?php echo elgg_get_site_url();?>mod/bookmarks/graphics/bookmark.gif);
+} \ No newline at end of file
diff --git a/mod/bookmarks/views/default/bookmarks/group_module.php b/mod/bookmarks/views/default/bookmarks/group_module.php
new file mode 100644
index 000000000..60a727819
--- /dev/null
+++ b/mod/bookmarks/views/default/bookmarks/group_module.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * List most recent bookmarks on group profile page
+ *
+ * @package Bookmarks
+ */
+
+$group = elgg_get_page_owner_entity();
+
+if ($group->bookmarks_enable == "no") {
+ return true;
+}
+
+$all_link = elgg_view('output/url', array(
+ 'href' => "bookmarks/group/$group->guid/all",
+ 'text' => elgg_echo('link:view:all'),
+ 'is_trusted' => true,
+));
+
+elgg_push_context('widgets');
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'bookmarks',
+ 'container_guid' => elgg_get_page_owner_guid(),
+ 'limit' => 6,
+ 'full_view' => false,
+ 'pagination' => false,
+);
+$content = elgg_list_entities($options);
+elgg_pop_context();
+
+if (!$content) {
+ $content = '<p>' . elgg_echo('bookmarks:none') . '</p>';
+}
+
+$new_link = elgg_view('output/url', array(
+ 'href' => "bookmarks/add/$group->guid",
+ 'text' => elgg_echo('bookmarks:add'),
+ 'is_trusted' => true,
+));
+
+echo elgg_view('groups/profile/module', array(
+ 'title' => elgg_echo('bookmarks:group'),
+ 'content' => $content,
+ 'all_link' => $all_link,
+ 'add_link' => $new_link,
+));
diff --git a/mod/bookmarks/views/default/bookmarks/js.php b/mod/bookmarks/views/default/bookmarks/js.php
new file mode 100644
index 000000000..c36823c09
--- /dev/null
+++ b/mod/bookmarks/views/default/bookmarks/js.php
@@ -0,0 +1,12 @@
+
+elgg.provide('elgg.bookmarks');
+
+elgg.bookmarks.init = function() {
+ // append the title to the url
+ var title = document.title;
+ var e = $('a.elgg-bookmark-page');
+ var link = e.attr('href') + '&title=' + encodeURIComponent(title);
+ e.attr('href', link);
+};
+
+elgg.register_hook_handler('init', 'system', elgg.bookmarks.init);
diff --git a/mod/bookmarks/views/default/bookmarks/sidebar.php b/mod/bookmarks/views/default/bookmarks/sidebar.php
new file mode 100644
index 000000000..811284ef3
--- /dev/null
+++ b/mod/bookmarks/views/default/bookmarks/sidebar.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Bookmarks sidebar
+ */
+
+echo elgg_view('page/elements/comments_block', array(
+ 'subtypes' => 'bookmarks',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+));
+
+echo elgg_view('page/elements/tagcloud_block', array(
+ 'subtypes' => 'bookmarks',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+));
diff --git a/mod/bookmarks/views/default/forms/bookmarks/save.php b/mod/bookmarks/views/default/forms/bookmarks/save.php
new file mode 100644
index 000000000..7d064a55b
--- /dev/null
+++ b/mod/bookmarks/views/default/forms/bookmarks/save.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Edit / add a bookmark
+ *
+ * @package Bookmarks
+ */
+
+// once elgg_view stops throwing all sorts of junk into $vars, we can use extract()
+$title = elgg_extract('title', $vars, '');
+$desc = elgg_extract('description', $vars, '');
+$address = elgg_extract('address', $vars, '');
+$tags = elgg_extract('tags', $vars, '');
+$access_id = elgg_extract('access_id', $vars, ACCESS_DEFAULT);
+$container_guid = elgg_extract('container_guid', $vars);
+$guid = elgg_extract('guid', $vars, null);
+$shares = elgg_extract('shares', $vars, array());
+
+?>
+<div>
+ <label><?php echo elgg_echo('title'); ?></label><br />
+ <?php echo elgg_view('input/text', array('name' => 'title', 'value' => $title)); ?>
+</div>
+<div>
+ <label><?php echo elgg_echo('bookmarks:address'); ?></label><br />
+ <?php echo elgg_view('input/text', array('name' => 'address', 'value' => $address)); ?>
+</div>
+<div>
+ <label><?php echo elgg_echo('description'); ?></label>
+ <?php echo elgg_view('input/longtext', array('name' => 'description', 'value' => $desc)); ?>
+</div>
+<div>
+ <label><?php echo elgg_echo('tags'); ?></label>
+ <?php echo elgg_view('input/tags', array('name' => 'tags', 'value' => $tags)); ?>
+</div>
+<?php
+
+$categories = elgg_view('input/categories', $vars);
+if ($categories) {
+ echo $categories;
+}
+
+?>
+<div>
+ <label><?php echo elgg_echo('access'); ?></label><br />
+ <?php echo elgg_view('input/access', array('name' => 'access_id', 'value' => $access_id)); ?>
+</div>
+<div class="elgg-foot">
+<?php
+
+echo elgg_view('input/hidden', array('name' => 'container_guid', 'value' => $container_guid));
+
+if ($guid) {
+ echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $guid));
+}
+
+echo elgg_view('input/submit', array('value' => elgg_echo("save")));
+
+?>
+</div> \ No newline at end of file
diff --git a/mod/bookmarks/views/default/object/bookmarks.php b/mod/bookmarks/views/default/object/bookmarks.php
new file mode 100644
index 000000000..83bae2b13
--- /dev/null
+++ b/mod/bookmarks/views/default/object/bookmarks.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Elgg bookmark view
+ *
+ * @package ElggBookmarks
+ */
+
+$full = elgg_extract('full_view', $vars, FALSE);
+$bookmark = elgg_extract('entity', $vars, FALSE);
+
+if (!$bookmark) {
+ return;
+}
+
+$owner = $bookmark->getOwnerEntity();
+$owner_icon = elgg_view_entity_icon($owner, 'tiny');
+$container = $bookmark->getContainerEntity();
+$categories = elgg_view('output/categories', $vars);
+
+$link = elgg_view('output/url', array('href' => $bookmark->address));
+$description = elgg_view('output/longtext', array('value' => $bookmark->description, 'class' => 'pbl'));
+
+$owner_link = elgg_view('output/url', array(
+ 'href' => "bookmarks/owner/$owner->username",
+ 'text' => $owner->name,
+ 'is_trusted' => true,
+));
+$author_text = elgg_echo('byline', array($owner_link));
+
+$date = elgg_view_friendly_time($bookmark->time_created);
+
+$comments_count = $bookmark->countComments();
+//only display if there are commments
+if ($comments_count != 0) {
+ $text = elgg_echo("comments") . " ($comments_count)";
+ $comments_link = elgg_view('output/url', array(
+ 'href' => $bookmark->getURL() . '#comments',
+ 'text' => $text,
+ 'is_trusted' => true,
+ ));
+} else {
+ $comments_link = '';
+}
+
+$metadata = elgg_view_menu('entity', array(
+ 'entity' => $vars['entity'],
+ 'handler' => 'bookmarks',
+ 'sort_by' => 'priority',
+ 'class' => 'elgg-menu-hz',
+));
+
+$subtitle = "$author_text $date $comments_link $categories";
+
+// do not show the metadata and controls in widget view
+if (elgg_in_context('widgets')) {
+ $metadata = '';
+}
+
+if ($full && !elgg_in_context('gallery')) {
+
+ $params = array(
+ 'entity' => $bookmark,
+ 'title' => false,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ );
+ $params = $params + $vars;
+ $summary = elgg_view('object/elements/summary', $params);
+
+ $bookmark_icon = elgg_view_icon('push-pin-alt');
+ $body = <<<HTML
+<div class="bookmark elgg-content mts">
+ $bookmark_icon<span class="elgg-heading-basic mbs">$link</span>
+ $description
+</div>
+HTML;
+
+ echo elgg_view('object/elements/full', array(
+ 'entity' => $bookmark,
+ 'icon' => $owner_icon,
+ 'summary' => $summary,
+ 'body' => $body,
+ ));
+
+} elseif (elgg_in_context('gallery')) {
+ echo <<<HTML
+<div class="bookmarks-gallery-item">
+ <h3>$bookmark->title</h3>
+ <p class='subtitle'>$owner_link $date</p>
+</div>
+HTML;
+} else {
+ // brief view
+ $url = $bookmark->address;
+ $display_text = $url;
+ $excerpt = elgg_get_excerpt($bookmark->description);
+ if ($excerpt) {
+ $excerpt = " - $excerpt";
+ }
+
+ if (strlen($url) > 25) {
+ $bits = parse_url($url);
+ if (isset($bits['host'])) {
+ $display_text = $bits['host'];
+ } else {
+ $display_text = elgg_get_excerpt($url, 100);
+ }
+ }
+
+ $link = elgg_view('output/url', array(
+ 'href' => $bookmark->address,
+ 'text' => $display_text,
+ ));
+
+ $content = elgg_view_icon('push-pin-alt') . "$link{$excerpt}";
+
+ $params = array(
+ 'entity' => $bookmark,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ 'content' => $content,
+ );
+ $params = $params + $vars;
+ $body = elgg_view('object/elements/summary', $params);
+
+ echo elgg_view_image_block($owner_icon, $body);
+}
diff --git a/mod/bookmarks/views/default/river/object/bookmarks/create.php b/mod/bookmarks/views/default/river/object/bookmarks/create.php
new file mode 100644
index 000000000..388f54ac9
--- /dev/null
+++ b/mod/bookmarks/views/default/river/object/bookmarks/create.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * New bookmarks river entry
+ *
+ * @package Bookmarks
+ */
+
+$object = $vars['item']->getObjectEntity();
+$excerpt = elgg_get_excerpt($object->description);
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'message' => $excerpt,
+ 'attachments' => elgg_view('output/url', array('href' => $object->address)),
+));
diff --git a/mod/bookmarks/views/default/widgets/bookmarks/content.php b/mod/bookmarks/views/default/widgets/bookmarks/content.php
new file mode 100644
index 000000000..0b85017fc
--- /dev/null
+++ b/mod/bookmarks/views/default/widgets/bookmarks/content.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Elgg bookmarks widget
+ *
+ * @package Bookmarks
+ */
+
+$max = (int) $vars['entity']->num_display;
+
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'bookmarks',
+ 'container_guid' => $vars['entity']->owner_guid,
+ 'limit' => $max,
+ 'full_view' => FALSE,
+ 'pagination' => FALSE,
+);
+$content = elgg_list_entities($options);
+
+echo $content;
+
+if ($content) {
+ $url = "bookmarks/owner/" . elgg_get_page_owner_entity()->username;
+ $more_link = elgg_view('output/url', array(
+ 'href' => $url,
+ 'text' => elgg_echo('bookmarks:more'),
+ 'is_trusted' => true,
+ ));
+ echo "<span class=\"elgg-widget-more\">$more_link</span>";
+} else {
+ echo elgg_echo('bookmarks:none');
+}
diff --git a/mod/bookmarks/views/default/widgets/bookmarks/edit.php b/mod/bookmarks/views/default/widgets/bookmarks/edit.php
new file mode 100644
index 000000000..ed9c7fd88
--- /dev/null
+++ b/mod/bookmarks/views/default/widgets/bookmarks/edit.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Elgg bookmark widget edit view
+ *
+ * @package Bookmarks
+ */
+
+// set default value
+if (!isset($vars['entity']->num_display)) {
+ $vars['entity']->num_display = 4;
+}
+
+$params = array(
+ 'name' => 'params[num_display]',
+ 'value' => $vars['entity']->num_display,
+ 'options' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
+);
+$dropdown = elgg_view('input/dropdown', $params);
+
+?>
+<div>
+ <?php echo elgg_echo('bookmarks:numbertodisplay'); ?>:
+ <?php echo $dropdown; ?>
+</div>
diff --git a/mod/bookmarks/views/rss/object/bookmarks.php b/mod/bookmarks/views/rss/object/bookmarks.php
new file mode 100644
index 000000000..1abda4710
--- /dev/null
+++ b/mod/bookmarks/views/rss/object/bookmarks.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Bookmark RSS object view
+ *
+ * @package ElggBookmarks
+ */
+
+$title = $vars['entity']->title;
+if (empty($title)) {
+ $title = strip_tags($vars['entity']->description);
+ $title = elgg_get_excerpt($title, 32);
+}
+
+$permalink = htmlspecialchars($vars['entity']->getURL(), ENT_NOQUOTES, 'UTF-8');
+$pubdate = date('r', $vars['entity']->getTimeCreated());
+
+$url_text = elgg_echo('bookmarks:address');
+$link = elgg_view('output/url', array('href' => $vars['entity']->address));
+$description = $vars['entity']->description . "<p>$url_text: $link</p>";
+
+$creator = elgg_view('page/components/creator', $vars);
+$georss = elgg_view('page/components/georss', $vars);
+$extension = elgg_view('extensions/item');
+
+$item = <<<__HTML
+<item>
+ <guid isPermaLink="true">$permalink</guid>
+ <pubDate>$pubdate</pubDate>
+ <link>$permalink</link>
+ <title><![CDATA[$title]]></title>
+ <description><![CDATA[$description]]></description>
+ $creator$georss$extension
+</item>
+
+__HTML;
+
+echo $item;
diff --git a/mod/bulk_user_admin/actions/bulk_user_admin/delete.php b/mod/bulk_user_admin/actions/bulk_user_admin/delete.php
new file mode 100644
index 000000000..0d7a7e7df
--- /dev/null
+++ b/mod/bulk_user_admin/actions/bulk_user_admin/delete.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Bulk delete users
+ */
+
+$guids = get_input('bulk_user_admin_guids');
+$errors = array();
+
+foreach ($guids as $guid) {
+ $user = get_entity($guid);
+
+ if (!$user instanceof ElggUser) {
+ $errors[] = "$guid is not a user.";
+ continue;
+ }
+
+ if (!$user->delete()) {
+ $errors[] = "Could not delete $user->name ($user->username).";
+ }
+}
+
+if ($errors) {
+ foreach ($errors as $error) {
+ register_error($error);
+ }
+} else {
+ system_message("Users deleted.");
+}
+
+forward(REFERER);
diff --git a/mod/bulk_user_admin/actions/bulk_user_admin/delete_by_domain.php b/mod/bulk_user_admin/actions/bulk_user_admin/delete_by_domain.php
new file mode 100644
index 000000000..c51076936
--- /dev/null
+++ b/mod/bulk_user_admin/actions/bulk_user_admin/delete_by_domain.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Bulk delete users by email
+ */
+
+$domain = get_input('domain');
+
+$errors = array();
+
+$options = array(
+ 'limit' => 50,
+ 'offset' => 0,
+);
+
+$users = bulk_user_admin_get_users_by_email_domain($domain, $options);
+
+while ($users) {
+ foreach ($users as $user) {
+ if (!$user->delete()) {
+ $errors[] = "Could not delete $user->name ($user->username).";
+ }
+ }
+
+ $options['offset'] = $options['offset'] + $options['limit'];
+ $users = bulk_user_admin_get_users_by_email_domain($domain, $options);
+}
+
+if ($errors) {
+ foreach ($errors as $error) {
+ register_error($error);
+ }
+} else {
+ system_message("Users deleted.");
+}
+
+forward(REFERER);
diff --git a/mod/bulk_user_admin/languages/en.php b/mod/bulk_user_admin/languages/en.php
new file mode 100644
index 000000000..d29b8398d
--- /dev/null
+++ b/mod/bulk_user_admin/languages/en.php
@@ -0,0 +1,9 @@
+<?php
+
+$english = array(
+ 'admin:users:email_domain_stats' => "User Email Domain Stats",
+);
+
+ add_translation("en",$english);
+
+?> \ No newline at end of file
diff --git a/mod/bulk_user_admin/manifest.xml b/mod/bulk_user_admin/manifest.xml
new file mode 100644
index 000000000..1d0679acb
--- /dev/null
+++ b/mod/bulk_user_admin/manifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Bulk User Admin</name>
+ <author>Brett Profitt</author>
+ <version>1.8</version>
+ <description>Delete users in bulk</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>(C) Brett Profitt 2011</copyright>
+ <license>GNU Public License version 2</license>
+
+ <!-- All plugins must require either elgg_version or elgg_release. -->
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+
+ <category>admin</category>
+</plugin_manifest> \ No newline at end of file
diff --git a/mod/bulk_user_admin/readme.md b/mod/bulk_user_admin/readme.md
new file mode 100644
index 000000000..39f41cd8d
--- /dev/null
+++ b/mod/bulk_user_admin/readme.md
@@ -0,0 +1,11 @@
+Bulk user Admin
+===============
+
+(C) 2011 Brett Profitt
+GPL 2
+
+About
+=====
+Adds ability to bulk delete users from the admin section.
+
+Adds menu to display users by domain and the most common domains registered.
diff --git a/mod/bulk_user_admin/start.php b/mod/bulk_user_admin/start.php
new file mode 100644
index 000000000..2af97b23e
--- /dev/null
+++ b/mod/bulk_user_admin/start.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Allow bulk delete operations
+ */
+
+/**
+ * Init
+ */
+function bulk_user_admin_init() {
+ elgg_register_event_handler('pagesetup', 'system', 'bulk_user_admin_admin_page_setup');
+
+ elgg_extend_view('admin/user_opt/search', 'bulk_user_admin/search_by_domain');
+ elgg_extend_view('css/admin', 'bulk_user_admin/css');
+
+ elgg_register_action('bulk_user_admin/delete', dirname(__FILE__) . '/actions/bulk_user_admin/delete.php', 'admin');
+ elgg_register_action('bulk_user_admin/delete_by_domain', dirname(__FILE__) . '/actions/bulk_user_admin/delete_by_domain.php', 'admin');
+
+}
+
+function bulk_user_admin_get_users_by_email_domain($domain, $options = array()) {
+ $domain = sanitise_string($domain);
+ $db_prefix = elgg_get_config('dbprefix');
+
+ $where = "ue.email LIKE '%@$domain'";
+ if (!isset($options['wheres'])) {
+ $options['wheres'] = array($where);
+ } else {
+ if (!is_array($options['wheres'])) {
+ $options['wheres'] = array($options['wheres']);
+ }
+ $options['wheres'][] = $where;
+ }
+
+ $join = "JOIN {$db_prefix}users_entity ue on e.guid = ue.guid";
+ if (!isset($options['joins'])) {
+ $options['joins'] = array($join);
+ } else {
+ if (!is_array($options['joins'])) {
+ $options['joins'] = array($options['joins']);
+ }
+ $options['joins'][] = $join;
+ }
+
+ $options['type'] = 'user';
+
+ return elgg_get_entities($options);
+}
+
+/**
+ * Sets up admin menu. Triggered on pagesetup.
+ */
+function bulk_user_admin_admin_page_setup() {
+ if (elgg_get_context() == 'admin' && elgg_is_admin_logged_in()) {
+ elgg_register_admin_menu_item('administer', 'email_domain_stats', 'users');
+ }
+}
+
+function bulk_user_admin_get_email_domain_stats() {
+ $db_prefix = elgg_get_config('dbprefix');
+ $q = "SELECT email, substring_index(email, '@', -1) as domain, count(*) as count
+ FROM {$db_prefix}users_entity ue
+ JOIN {$db_prefix}entities e ON ue.guid = e.guid
+ WHERE e.enabled = 'yes'
+ group by domain order by count desc, domain asc;";
+
+ return get_data($q);
+}
+
+elgg_register_event_handler('init', 'system', 'bulk_user_admin_init'); \ No newline at end of file
diff --git a/mod/bulk_user_admin/views/default/admin/user.php b/mod/bulk_user_admin/views/default/admin/user.php
new file mode 100644
index 000000000..c63f091ec
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/admin/user.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Display a list of users to delete in bulk.
+ *
+ * Also used to show the search by domain results
+ */
+
+// Are we performing a search
+$limit = get_input('limit', 10);
+$offset = get_input('offset', 0);
+$domain = get_input('domain');
+
+$context = elgg_get_context();
+
+if (!$domain) {
+ $title = elgg_echo('admin:user');
+} else {
+ $title = "Users in the domain $domain";
+}
+
+elgg_set_context('search');
+
+$options = array(
+ 'type' => 'user',
+ 'limit' => $limit,
+ 'offset' => $offset,
+ 'full_view' => false
+);
+
+if ($domain) {
+ $users = bulk_user_admin_get_users_by_email_domain($domain, $options);
+ $options['count'] = true;
+ $users_count = bulk_user_admin_get_users_by_email_domain($domain, $options);
+} else {
+ $users = elgg_get_entities($options);
+ $options['count'] = true;
+ $users_count = elgg_get_entities($options);
+}
+
+$pagination = elgg_view('navigation/pagination', array(
+ 'baseurl' => current_page_url(),
+ 'offset' => $offset,
+ 'count' => $users_count
+));
+
+$form_body = '';
+foreach ($users as $user) {
+ $form_body .= elgg_view('bulk_user_admin/user', array('entity' => $user));
+}
+
+$delete_button = elgg_view('input/submit', array(
+ 'value' => 'Delete checked',
+));
+
+$form_body .= $delete_button;
+
+$site = elgg_get_config('site');
+
+$checked_form = elgg_view('input/form', array(
+ 'action' => $site->url . 'action/bulk_user_admin/delete',
+ 'body' => $form_body
+));
+
+
+$domain_form = '';
+
+if ($domain) {
+ $delete_button = "<br /><br />" . elgg_view('input/submit', array(
+ 'value' => 'Delete all in domain',
+ ));
+
+ $hidden = elgg_view('input/hidden', array(
+ 'name' => 'domain',
+ 'value' => $domain
+ ));
+
+ $form_body = $delete_button . $hidden;
+
+ $domain_form = elgg_view('input/form', array(
+ 'action' => $site->url . 'action/bulk_user_admin/delete_by_domain',
+ 'body' => $form_body
+ ));
+
+}
+
+$summary = "<div>$users_count user(s) found</div>";
+
+if ($domain) {
+ $summary .= '<br />';
+ $summary .= elgg_view('output/url', array(
+ 'href' => elgg_http_remove_url_query_element(current_page_url(), 'domain'),
+ 'text' => 'All users'
+ ));
+}
+
+elgg_set_context('admin');
+
+echo $title . $summary . $pagination . $checked_form . $domain_form . $pagination; \ No newline at end of file
diff --git a/mod/bulk_user_admin/views/default/admin/users/email_domain_stats.php b/mod/bulk_user_admin/views/default/admin/users/email_domain_stats.php
new file mode 100644
index 000000000..0caa50331
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/admin/users/email_domain_stats.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Shows a list of email domains on the site and how many users have are part of the domain.
+ */
+
+$title = 'Email domain stats';
+
+$domain_list = elgg_view('bulk_user_admin/email_domain_stats', array(
+ 'domains' => bulk_user_admin_get_email_domain_stats()
+));
+
+echo $title . $domain_list; \ No newline at end of file
diff --git a/mod/bulk_user_admin/views/default/bulk_user_admin/css.php b/mod/bulk_user_admin/views/default/bulk_user_admin/css.php
new file mode 100644
index 000000000..3254c1700
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/bulk_user_admin/css.php
@@ -0,0 +1,26 @@
+
+table.bulk_user_admin_email_domains {
+ width: 300px;
+}
+
+table.bulk_user_admin_email_domains th {
+ text-align: center;
+ font-weight: bold;
+ font-size: 125%;
+}
+
+table.bulk_user_admin_email_domains td {
+ padding: 3px;
+}
+
+table.bulk_user_admin_email_domains td.center {
+ text-align: center;
+}
+
+table.bulk_user_admin_email_domains tr.odd {
+ background-color: #fff;
+}
+
+table.bulk_user_admin_email_domains tr.even {
+ background-color: #dedede;
+} \ No newline at end of file
diff --git a/mod/bulk_user_admin/views/default/bulk_user_admin/email_domain_stats.php b/mod/bulk_user_admin/views/default/bulk_user_admin/email_domain_stats.php
new file mode 100644
index 000000000..3936eb0ea
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/bulk_user_admin/email_domain_stats.php
@@ -0,0 +1,49 @@
+<?php
+
+$domains = $vars['domains'];
+
+?>
+<table class="bulk_user_admin_email_domains">
+ <tr>
+ <th>Domain</th>
+ <th>Registered users</th>
+ </tr>
+<?php
+
+
+$i = 0;
+foreach ($domains as $domain_info) {
+ if (!$domain_info->domain) {
+ continue;
+ }
+
+ $domain = elgg_view('output/url', array(
+ 'text' => $domain_info->domain,
+ 'href' => $domain_info->domain
+ ));
+
+ $url = elgg_http_add_url_query_elements($vars['url'] . 'admin/user', array('domain' => $domain_info->domain));
+
+ // can't use $_GET variables in admin
+ // otherwise admin_page_handler() tries to call the view: view/name?variable=value
+ // which clearly doesn't work
+ // so we'll pass the domain via post
+ $users = '<form id="domain:' . $domain_info->domain . '" action="' . elgg_get_site_url() . 'admin/user" method="post">';
+ $users .= elgg_view('input/hidden', array('name' => 'domain', 'value' => $domain_info->domain));
+ $users .= '</form>';
+ $users .= '<a href="javascript:document.forms[\'domain:' . $domain_info->domain . '\'].submit();">' . $domain_info->count . '</a>';
+
+ $class = ($i % 2) ? 'odd' : 'even';
+
+ echo <<<___HTML
+ <tr class="$class">
+ <td>$domain</td>
+ <td class="center">$users</td>
+ </tr>
+___HTML;
+
+ $i++;
+}
+
+?>
+</table> \ No newline at end of file
diff --git a/mod/bulk_user_admin/views/default/bulk_user_admin/search_by_domain.php b/mod/bulk_user_admin/views/default/bulk_user_admin/search_by_domain.php
new file mode 100644
index 000000000..5c65a3903
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/bulk_user_admin/search_by_domain.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Search by email domain
+ */
+?>
+<div id="search-box">
+ <form action="<?php echo current_page_url() ?>" method="get">
+ <b>Search by email domain</b>
+ <?php
+
+ echo elgg_view('input/text', array('name' => 'domain'));
+
+ ?>
+ <input type="submit" value="Search by domain" />
+ </form>
+</div>
diff --git a/mod/bulk_user_admin/views/default/bulk_user_admin/user.php b/mod/bulk_user_admin/views/default/bulk_user_admin/user.php
new file mode 100644
index 000000000..d05d92fd3
--- /dev/null
+++ b/mod/bulk_user_admin/views/default/bulk_user_admin/user.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Show a user for bulk actions. Includes a checkbox on the left.
+ */
+if($vars['entity'] instanceof ElggUser){
+$icon = elgg_view_entity_icon($vars['entity'], 'small');
+
+$banned = $vars['entity']->isBanned();
+$user = $vars['entity'];
+
+$checkbox = "<input type=\"checkbox\" name=\"bulk_user_admin_guids[]\" value=\"$user->guid\">";
+$first_login = elgg_view_friendly_time($user->time_created);
+$last_login = elgg_view_friendly_time($user->last_login);
+$last_action = elgg_view_friendly_time($user->last_action);
+$objects = elgg_get_entities(array(
+ 'owner_guid' => $user->guid,
+ 'count' => true
+));
+
+$db_prefix = elgg_get_config('dbprefix');
+
+$q = "SELECT COUNT(id) as count FROM {$db_prefix}annotations WHERE owner_guid = $user->guid";
+$data = get_data($q);
+$annotations = (int) $data[0]->count;
+
+$q = "SELECT COUNT(id) as count FROM {$db_prefix}metadata WHERE owner_guid = $user->guid";
+$data = get_data($q);
+$metadata = (int) $data[0]->count;
+
+// the CSS for classless <label> is really, really annoying.
+$info = <<<___HTML
+<label style="font-size: inherit; font-weight: inherit; color: inherit;">
+<p>$checkbox $user->name | $user->username | $user->email | $user->guid </p>
+<p>Last login: $last_login | First login: $first_login | Last action: $last_action</p>
+<p>Objects: $objects | Annotations: $annotations | Metadata: $metadata</p>
+___HTML;
+
+if ($banned) {
+ $info .= '<div id="profile_banned">';
+ $info .= elgg_echo('profile:banned');
+ $info .= '<br />';
+ $info .= $user->ban_reason;
+ $info .= '</div>';
+}
+
+$info .= '</label>';
+
+echo elgg_view('page/components/image_block', array('image' => $icon, 'body' => $info));
+} \ No newline at end of file
diff --git a/mod/captcha/backgrounds/bg1.jpg b/mod/captcha/backgrounds/bg1.jpg
new file mode 100644
index 000000000..0e16b2265
--- /dev/null
+++ b/mod/captcha/backgrounds/bg1.jpg
Binary files differ
diff --git a/mod/captcha/backgrounds/bg2.jpg b/mod/captcha/backgrounds/bg2.jpg
new file mode 100644
index 000000000..3357164a6
--- /dev/null
+++ b/mod/captcha/backgrounds/bg2.jpg
Binary files differ
diff --git a/mod/captcha/backgrounds/bg3.jpg b/mod/captcha/backgrounds/bg3.jpg
new file mode 100644
index 000000000..96610abf4
--- /dev/null
+++ b/mod/captcha/backgrounds/bg3.jpg
Binary files differ
diff --git a/mod/captcha/backgrounds/bg4.jpg b/mod/captcha/backgrounds/bg4.jpg
new file mode 100644
index 000000000..5123ed70e
--- /dev/null
+++ b/mod/captcha/backgrounds/bg4.jpg
Binary files differ
diff --git a/mod/captcha/backgrounds/bg5.jpg b/mod/captcha/backgrounds/bg5.jpg
new file mode 100644
index 000000000..7ae7e6c22
--- /dev/null
+++ b/mod/captcha/backgrounds/bg5.jpg
Binary files differ
diff --git a/mod/captcha/captcha.php b/mod/captcha/captcha.php
new file mode 100644
index 000000000..085641c79
--- /dev/null
+++ b/mod/captcha/captcha.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Elgg captcha plugin graphics file generator
+ *
+ * @package ElggCaptcha
+ */
+
+$token = get_input('captcha_token');
+
+// Output captcha
+if ($token) {
+ // Set correct header
+ header("Content-type: image/jpeg");
+
+ // Generate captcha
+ $captcha = captcha_generate_captcha($token);
+
+ // Pick a random background image
+ $n = rand(1, elgg_get_config('captcha_num_bg'));
+ $image = imagecreatefromjpeg(elgg_get_plugins_path() . "captcha/backgrounds/bg$n.jpg");
+
+ // Create a colour (black so its not a simple matter of masking out one colour and ocring the rest)
+ $colour = imagecolorallocate($image, 0,0,0);
+
+ // Write captcha to image
+ //imagestring($image, 5, 30, 4, $captcha, $black);
+ imagettftext($image, 30, 0, 10, 30, $colour, elgg_get_plugins_path() . "captcha/fonts/1.ttf", $captcha);
+
+ // Output image
+ imagejpeg($image);
+
+ // Free memory
+ imagedestroy($image);
+}
diff --git a/mod/captcha/fonts/1.ttf b/mod/captcha/fonts/1.ttf
new file mode 100644
index 000000000..f5534f943
--- /dev/null
+++ b/mod/captcha/fonts/1.ttf
Binary files differ
diff --git a/mod/captcha/fonts/Liberation_serif_License.txt b/mod/captcha/fonts/Liberation_serif_License.txt
new file mode 100644
index 000000000..41751f278
--- /dev/null
+++ b/mod/captcha/fonts/Liberation_serif_License.txt
@@ -0,0 +1,77 @@
+LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY LIBERATION FONT SOFTWARE
+This agreement governs the use of the Software and any updates to the
+Software, regardless of the delivery mechanism. Subject to the following
+terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to
+this collective work pursuant to the GNU General Public License v.2 with the
+exceptions set forth below and such other terms as our set forth in this End
+User License Agreement.
+1. The Software and License Exception. LIBERATION font software (the
+"Software") consists of TrueType-OpenType formatted font software for
+rendering LIBERATION typefaces in sans serif, serif, and monospaced character
+styles. You are licensed to use, modify, copy, and distribute the Software
+pursuant to the GNU General Public License v.2 with the following exceptions:
+1) As a special exception, if you create a document which uses this font, and
+embed this font or unaltered portions of this font into the document, this
+font does not by itself cause the resulting document to be covered by the GNU
+General Public License.  This exception does not however invalidate any other
+reasons why the document might be covered by the GNU General Public License. 
+If you modify this font, you may extend this exception to your version of the
+font, but you are not obligated to do so. If you do not wish to do so, delete
+this exception statement from your version.
+
+2) As a further exception, any distribution of the object code of the Software
+in a physical product must provide you the right to access and modify the
+source code for the Software and to reinstall that modified version of the
+Software in object code form on the same physical product on which you
+received it.
+2. Intellectual Property Rights. The Software and each of its components,
+including the source code, documentation, appearance, structure and
+organization are owned by Red Hat and others and are protected under copyright
+and other laws. Title to the Software and any component, or to any copy,
+modification, or merged portion shall remain with the aforementioned, subject
+to the applicable license. The "LIBERATION" trademark is a trademark of Red
+Hat, Inc. in the U.S. and other countries. This agreement does not permit
+Client to distribute modified versions of the Software using Red Hat's
+trademarks. If Client makes a redistribution of a modified version of the
+Software, then Client must modify the files names to remove any reference to
+the Red Hat trademarks and must not use the Red Hat trademarks in any way to
+reference or promote the modified Software.
+3. Limited Warranty. To the maximum extent permitted under applicable law, the
+Software is provided and licensed "as is" without warranty of any kind,
+expressed or implied, including the implied warranties of merchantability,
+non-infringement or fitness for a particular purpose. Red Hat does not warrant
+that the functions contained in the Software will meet Client's requirements
+or that the operation of the Software will be entirely error free or appear
+precisely as described in the accompanying documentation.
+4. Limitation of Remedies and Liability. To the maximum extent permitted by
+applicable law, Red Hat or any Red Hat authorized dealer will not be liable to
+Client for any incidental or consequential damages, including lost profits or
+lost savings arising out of the use or inability to use the Software, even if
+Red Hat or such dealer has been advised of the possibility of such damages.
+5. Export Control. As required by U.S. law, Client represents and warrants
+that it: (a) understands that the Software is subject to export controls under
+the U.S. Commerce Department's Export Administration Regulations ("EAR"); (b)
+is not located in a prohibited destination country under the EAR or U.S.
+sanctions regulations (currently Cuba, Iran, Iraq, Libya, North Korea, Sudan
+and Syria); (c) will not export, re-export, or transfer the Software to any
+prohibited destination, entity, or individual without the necessary export
+license(s) or authorizations(s) from the U.S. Government; (d) will not use or
+transfer the Software for use in any sensitive nuclear, chemical or biological
+weapons, or missile technology end-uses unless authorized by the U.S.
+Government by regulation or specific license; (e) understands and agrees that
+if it is in the United States and exports or transfers the Software to
+eligible end users, it will, as required by EAR Section 740.17(e), submit
+semi-annual reports to the Commerce Department's Bureau of Industry & Security
+(BIS), which include the name and address (including country) of each
+transferee; and (f) understands that countries other than the United States
+may restrict the import, use, or export of encryption products and that it
+shall be solely responsible for compliance with any such import, use, or
+export restrictions.
+6. General. If any provision of this agreement is held to be unenforceable,
+that shall not affect the enforceability of the remaining provisions. This
+agreement shall be governed by the laws of the State of North Carolina and of
+the United States, without regard to any conflict of laws provisions, except
+that the United Nations Convention on the International Sale of Goods shall
+not apply.
+Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark
+of Red Hat, Inc.
diff --git a/mod/captcha/languages/ca.php b/mod/captcha/languages/ca.php
new file mode 100644
index 000000000..75b5fea5e
--- /dev/null
+++ b/mod/captcha/languages/ca.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg captcha language pack.
+ *
+ * @package ElggCaptcha
+ */
+
+$catalan = array(
+ 'captcha:entercaptcha' => 'Introdueix el text de la imatge',
+ 'captcha:captchafail' => 'Perdona, el text que has introduït no correspon al text de la imatge.',
+);
+
+add_translation("ca", $catalan);
diff --git a/mod/captcha/languages/en.php b/mod/captcha/languages/en.php
new file mode 100644
index 000000000..2fdb564a3
--- /dev/null
+++ b/mod/captcha/languages/en.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg captcha language pack.
+ *
+ * @package ElggCaptcha
+ */
+
+$english = array(
+ 'captcha:entercaptcha' => 'Enter text from image',
+ 'captcha:captchafail' => 'Sorry, the text that you entered didn\'t match the text in the image.',
+);
+
+add_translation("en", $english);
diff --git a/mod/captcha/languages/es.php b/mod/captcha/languages/es.php
new file mode 100644
index 000000000..34257e908
--- /dev/null
+++ b/mod/captcha/languages/es.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Elgg captcha language pack.
+ *
+ * @package ElggCaptcha
+ */
+
+$spanish = array(
+ 'captcha:entercaptcha' => 'Introduce el texto de la imagen',
+ 'captcha:captchafail' => 'Perdona, el texto que has introducido no corresponde con el texto de la imagen.',
+);
+
+add_translation("es", $spanish);
diff --git a/mod/captcha/manifest.xml b/mod/captcha/manifest.xml
new file mode 100644
index 000000000..079d877db
--- /dev/null
+++ b/mod/captcha/manifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Captcha</name>
+ <author>Core developers, Lorea developers</author>
+ <version>1.8</version>
+ <blurb>Add site-wide categories</blurb>
+ <description>Provides captcha support.</description>
+ <website>https://lorea.org/</website>
+ <copyright>(C) Curverider 2008-2010, Lorea 2012</copyright>
+ <license>GNU General Public License version 2 or higher</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <requires>
+ <type>php_extension</type>
+ <name>gd</name>
+ </requires>
+</plugin_manifest>
diff --git a/mod/captcha/start.php b/mod/captcha/start.php
new file mode 100644
index 000000000..f451ffcc6
--- /dev/null
+++ b/mod/captcha/start.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Elgg captcha plugin
+ *
+ * @package ElggCaptcha
+ */
+
+
+register_elgg_event_handler('init','system','captcha_init');
+
+function captcha_init() {
+
+ // Register page handler for captcha functionality
+ elgg_register_page_handler('captcha', 'captcha_page_handler');
+
+ // Extend CSS
+ elgg_extend_view('css', 'captcha/css');
+
+ // Number of background images
+ elgg_set_config('captcha_num_bg', 5);
+
+ // Default length
+ elgg_set_config('captcha_length', 5);
+
+ elgg_register_plugin_hook_handler('register', 'user', 'captcha_verify_action_hook');
+ elgg_register_plugin_hook_handler('action', 'user/requestnewpassword', 'captcha_verify_action_hook');
+}
+
+function captcha_page_handler($page) {
+
+ if (isset($page[0])) {
+ set_input('captcha_token', $page[0]);
+ }
+
+ include(elgg_get_plugins_path() . "captcha/captcha.php");
+}
+
+/**
+ * Generate a token to act as a seed value for the captcha algorithm.
+ */
+function captcha_generate_token() {
+ return md5(generate_action_token(time()).rand()); // Use action token plus some random for uniqueness
+}
+
+/**
+ * Generate a captcha based on the given seed value and length.
+ *
+ * @param string $seed_token
+ * @return string
+ */
+function captcha_generate_captcha($seed_token) {
+ /*
+ * We generate a token out of the random seed value + some session data,
+ * this means that solving via pr0n site or indian cube farm becomes
+ * significantly more tricky (we hope).
+ *
+ * We also add the site secret, which is unavailable to the client and so should
+ * make it very very hard to guess values before hand.
+ *
+ */
+
+ return strtolower(substr(md5(generate_action_token(0) . $seed_token), 0, elgg_get_config('captcha_length')));
+}
+
+/**
+ * Verify a captcha based on the input value entered by the user and the seed token passed.
+ *
+ * @param string $input_value
+ * @param string $seed_token
+ * @return bool
+ */
+function captcha_verify_captcha($input_value, $seed_token) {
+ if (strcasecmp($input_value, captcha_generate_captcha($seed_token)) == 0) {
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Listen to the action plugin hook and check the captcha.
+ *
+ * @param unknown_type $hook
+ * @param unknown_type $entity_type
+ * @param unknown_type $returnvalue
+ * @param unknown_type $params
+ */
+function captcha_verify_action_hook($hook, $entity_type, $returnvalue, $params) {
+ $token = get_input('captcha_token');
+ $input = get_input('captcha_input');
+
+ if (($token) && (captcha_verify_captcha($input, $token))) {
+ return true;
+ }
+
+ register_error(elgg_echo('captcha:captchafail'));
+
+ // forward to referrer or else action code sends to front page
+ forward(REFERER);
+
+ return false;
+}
diff --git a/mod/captcha/views/default/captcha/css.php b/mod/captcha/views/default/captcha/css.php
new file mode 100644
index 000000000..d06a26d7d
--- /dev/null
+++ b/mod/captcha/views/default/captcha/css.php
@@ -0,0 +1,4 @@
+.captcha-input-image {
+ text-align: center;
+ margin: auto;
+}
diff --git a/mod/captcha/views/default/input/captcha.php b/mod/captcha/views/default/input/captcha.php
new file mode 100644
index 000000000..cc78ffb08
--- /dev/null
+++ b/mod/captcha/views/default/input/captcha.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Elgg captcha plugin captcha hook view override.
+ *
+ * @package ElggCaptcha
+ */
+
+// Generate a token which is then passed into the captcha algorithm for verification
+$token = captcha_generate_token();
+?>
+<div>
+ <label><?php echo elgg_echo('captcha:entercaptcha'); ?></label>
+ <br />
+ <?php
+ echo elgg_view('input/hidden', array('name' => "captcha_token", 'value' => $token));
+ echo elgg_view('output/img', array('src'=> elgg_get_site_url() . "captcha/$token", 'class' => 'captcha-input-image'));
+ echo elgg_view('input/text', array('name' => 'captcha_input', 'class' => 'captcha-input-text'));
+ ?>
+</div>
diff --git a/mod/categories/activate.php b/mod/categories/activate.php
new file mode 100644
index 000000000..80159d089
--- /dev/null
+++ b/mod/categories/activate.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Prompt the user to add categories after activating
+ */
+
+//categories_admin_notice_no_categories
+$site = get_config('site');
+if (!$site->categories) {
+ $message = elgg_echo('categories:on_activate_reminder', array(elgg_normalize_url('admin/plugin_settings/categories')));
+ elgg_add_admin_notice('categories_admin_notice_no_categories', $message);
+} \ No newline at end of file
diff --git a/mod/categories/deactivate.php b/mod/categories/deactivate.php
new file mode 100644
index 000000000..e15e2c6e9
--- /dev/null
+++ b/mod/categories/deactivate.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * Remove admin notice to populate categories.
+ */
+
+elgg_delete_admin_notice('categories_admin_notice_no_categories');
diff --git a/mod/categories/languages/en.php b/mod/categories/languages/en.php
new file mode 100644
index 000000000..422fe81a4
--- /dev/null
+++ b/mod/categories/languages/en.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Categories English language file
+ */
+
+$english = array(
+ 'categories' => 'Categories',
+ 'categories:settings' => 'Set site categories',
+ 'categories:explanation' => 'To set some predefined site-wide categories that will be used throughout your system, enter them below, separated with commas. Compatible tools will then display them when the user creates or edits content.',
+ 'categories:save:success' => 'Site categories were successfully saved.',
+ 'categories:results' => "Results for the site category: %s",
+ 'categories:on_activate_reminder' => "Site-wide Categories won't work until you add categories. <a href=\"%s\">Add categories now.</a>",
+);
+
+add_translation("en", $english); \ No newline at end of file
diff --git a/mod/categories/manifest.xml b/mod/categories/manifest.xml
new file mode 100644
index 000000000..4a6bd0864
--- /dev/null
+++ b/mod/categories/manifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Site-wide Categories</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <category>enhancement</category>
+ <blurb>Add site-wide categories</blurb>
+ <description>Site-wide Categories lets administrators define categories that users across the site can add content to.</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/categories/pages/categories/listing.php b/mod/categories/pages/categories/listing.php
new file mode 100644
index 000000000..d51e6c19e
--- /dev/null
+++ b/mod/categories/pages/categories/listing.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * List entities by category
+ *
+ * @package ElggCategories
+ */
+
+$limit = get_input("limit", 10);
+$offset = get_input("offset", 0);
+$category = get_input("category");
+$owner_guid = get_input("owner_guid", ELGG_ENTITIES_ANY_VALUE);
+$subtype = get_input("subtype", ELGG_ENTITIES_ANY_VALUE);
+$type = get_input("type", 'object');
+
+$params = array(
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $category,
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'owner_guid' => $owner_guid,
+ 'limit' => $limit,
+ 'full_view' => FALSE,
+ 'metadata_case_sensitive' => FALSE,
+);
+$objects = elgg_list_entities_from_metadata($params);
+
+$title = elgg_echo('categories:results', array($category));
+
+$content = elgg_view_title($title);
+$content .= $objects;
+
+$body = elgg_view_layout('content', array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => '',
+ 'header' => '',
+));
+
+echo elgg_view_page($title, $body);
diff --git a/mod/categories/readme.txt b/mod/categories/readme.txt
new file mode 100644
index 000000000..48d07fe8f
--- /dev/null
+++ b/mod/categories/readme.txt
@@ -0,0 +1,25 @@
+Site-wide categories
+--------------------
+
+NOTES FOR DEVELOPERS:
+
+If you're not a programmer, don't worry! All the main Elgg tools
+are already adapted to use categories, and a growing number of
+third party Elgg tools use it too.
+
+
+This plugin uses views and events hooks to allow you to easily add
+site-wide categories across Elgg tools.
+
+This is a two-line addition to any plugin.
+
+In your edit/create form:
+
+ echo elgg_view('input/categories', $vars);
+
+In your object view:
+
+ echo elgg_view('output/categories', $vars);
+
+Note that in both cases, $vars['entity'] MUST be populated with
+the entity the categories apply to, if it exists. \ No newline at end of file
diff --git a/mod/categories/start.php b/mod/categories/start.php
new file mode 100644
index 000000000..0aacf11e7
--- /dev/null
+++ b/mod/categories/start.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Elgg categories plugin
+ *
+ * @package ElggCategories
+ */
+
+elgg_register_event_handler('init', 'system', 'categories_init');
+
+/**
+ * Initialise categories plugin
+ *
+ */
+function categories_init() {
+
+ elgg_extend_view('css/elgg', 'categories/css');
+
+ elgg_register_page_handler('categories', 'categories_page_handler');
+
+ elgg_register_event_handler('update', 'all', 'categories_save');
+ elgg_register_event_handler('create', 'all', 'categories_save');
+
+ // To keep the category plugins in the settings area and because we have to do special stuff,
+ // handle saving ourself.
+ elgg_register_plugin_hook_handler('action', 'plugins/settings/save', 'categories_save_site_categories');
+}
+
+
+/**
+ * Category page handler
+ * @return bool
+ */
+function categories_page_handler() {
+ include(dirname(__FILE__) . "/pages/categories/listing.php");
+ return true;
+}
+
+/**
+ * Save categories to object upon save / edit
+ *
+ */
+function categories_save($event, $object_type, $object) {
+ if ($object instanceof ElggEntity) {
+ $marker = get_input('universal_category_marker');
+
+ if ($marker == 'on') {
+ $categories = get_input('universal_categories_list');
+
+ if (empty($categories)) {
+ $categories = array();
+ }
+
+ $object->universal_categories = $categories;
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * Saves the site categories.
+ *
+ * @param type $hook
+ * @param type $type
+ * @param type $value
+ * @param type $params
+ */
+function categories_save_site_categories($hook, $type, $value, $params) {
+ $plugin_id = get_input('plugin_id');
+ if ($plugin_id != 'categories') {
+ return $value;
+ }
+
+ $categories = get_input('categories');
+ $categories = string_to_tag_array($categories);
+
+ $site = elgg_get_site_entity();
+ $site->categories = $categories;
+ system_message(elgg_echo("categories:save:success"));
+
+ elgg_delete_admin_notice('categories_admin_notice_no_categories');
+
+ forward(REFERER);
+} \ No newline at end of file
diff --git a/mod/categories/views/default/categories.php b/mod/categories/views/default/categories.php
new file mode 100644
index 000000000..8577ef01b
--- /dev/null
+++ b/mod/categories/views/default/categories.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Categories input view
+ *
+ * @package ElggCategories
+ *
+ * @deprecated 1.8
+ */
+
+elgg_deprecated_notice("Use input/categories instead of categories", 1.8);
+
+echo elgg_view('input/categories', $vars);
diff --git a/mod/categories/views/default/categories/css.php b/mod/categories/views/default/categories/css.php
new file mode 100644
index 000000000..5f38e2867
--- /dev/null
+++ b/mod/categories/views/default/categories/css.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Categories CSS extender
+ *
+ * @package Categories
+ */
+?>
+
+.categories li label {
+ font-size: 100%;
+ line-height: 1.2em;
+}
diff --git a/mod/categories/views/default/categories/view.php b/mod/categories/views/default/categories/view.php
new file mode 100644
index 000000000..6d1f7c1bb
--- /dev/null
+++ b/mod/categories/views/default/categories/view.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * @deprecated 1.8
+ */
+
+elgg_deprecated_notice("Use output/categories instead of categories/view", 1.8);
+
+echo elgg_view('output/categories', $vars);
diff --git a/mod/categories/views/default/input/categories.php b/mod/categories/views/default/input/categories.php
new file mode 100644
index 000000000..b543cde45
--- /dev/null
+++ b/mod/categories/views/default/input/categories.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Categories input view
+ *
+ * @package ElggCategories
+ *
+ * @uses $vars['entity'] The entity being edited or created
+ */
+
+if (isset($vars['entity']) && $vars['entity'] instanceof ElggEntity) {
+ $selected_categories = $vars['entity']->universal_categories;
+}
+
+// use sticky values if set
+if (isset($vars['universal_categories_list'])) {
+ $selected_categories = $vars['universal_categories_list'];
+}
+
+$categories = elgg_get_site_entity()->categories;
+if (empty($categories)) {
+ $categories = array();
+}
+if (empty($selected_categories)) {
+ $selected_categories = array();
+}
+
+if (!empty($categories)) {
+ if (!is_array($categories)) {
+ $categories = array($categories);
+ }
+
+ // checkboxes want Label => value, so in our case we need category => category
+ $categories = array_flip($categories);
+ array_walk($categories, create_function('&$v, $k', '$v = $k;'));
+
+ ?>
+
+<div class="categories">
+ <label><?php echo elgg_echo('categories'); ?></label><br />
+ <?php
+ echo elgg_view('input/checkboxes', array(
+ 'options' => $categories,
+ 'value' => $selected_categories,
+ 'name' => 'universal_categories_list',
+ 'align' => 'horizontal',
+ ));
+
+ ?>
+ <input type="hidden" name="universal_category_marker" value="on" />
+</div>
+
+ <?php
+
+} else {
+ echo '<input type="hidden" name="universal_category_marker" value="on" />';
+}
diff --git a/mod/categories/views/default/output/categories.php b/mod/categories/views/default/output/categories.php
new file mode 100644
index 000000000..4b3a3fb6a
--- /dev/null
+++ b/mod/categories/views/default/output/categories.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * View categories on an entity
+ *
+ * @uses $vars['entity']
+ */
+
+$linkstr = '';
+if (isset($vars['entity']) && $vars['entity'] instanceof ElggEntity) {
+
+ $categories = $vars['entity']->universal_categories;
+ if (!empty($categories)) {
+ if (!is_array($categories)) {
+ $categories = array($categories);
+ }
+ foreach($categories as $category) {
+ $link = elgg_get_site_url() . 'categories/list?category=' . urlencode($category);
+ if (!empty($linkstr)) {
+ $linkstr .= ', ';
+ }
+ $linkstr .= '<a href="'.$link.'">' . $category . '</a>';
+ }
+ }
+
+}
+
+if ($linkstr) {
+ echo '<p class="elgg-output-categories">' . elgg_echo('categories') . ": $linkstr</p>";
+}
diff --git a/mod/categories/views/default/plugins/categories/settings.php b/mod/categories/views/default/plugins/categories/settings.php
new file mode 100644
index 000000000..3802da95a
--- /dev/null
+++ b/mod/categories/views/default/plugins/categories/settings.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Administrator sets the categories for the site
+ *
+ * @package ElggCategories
+ */
+
+// Get site categories
+$site = elgg_get_site_entity();
+$categories = $site->categories;
+
+if (empty($categories)) {
+ $categories = array();
+}
+
+?>
+<div>
+ <p><?php echo elgg_echo('categories:explanation'); ?></p>
+<?php
+ echo elgg_view('input/tags', array('value' => $categories, 'name' => 'categories'));
+?>
+</div> \ No newline at end of file
diff --git a/mod/ckeditor/README.md b/mod/ckeditor/README.md
new file mode 100644
index 000000000..98bd5e331
--- /dev/null
+++ b/mod/ckeditor/README.md
@@ -0,0 +1,21 @@
+CKEditor WYSIWYG plugin
+========================
+
+Configuration options
+----------------------
+CKEditor configuration is set in the view js/ckeditor. The configuration object
+is elgg.ckeditor.config. A plugin can modify the configuration object by registering
+a function to run before the ckeditor.init function on the 'init', 'system' hook.
+This is where toolbar options and the skin are set.
+
+Content CSS
+------------
+The content CSS is stored in the view css/wysiwyg. This view is extended by the
+css/elements/reset and css/elements/typography views so that content appears the
+same when editing and viewing. It also contains all the CSS applied to the
+elgg-output class for the same reason (see the typography view).
+
+Hints
+------------
+ * If your theme does not use borders with tables, enable the CKEditor showborders plugin.
+
diff --git a/mod/ckeditor/languages/en.php b/mod/ckeditor/languages/en.php
new file mode 100644
index 000000000..987b68c1b
--- /dev/null
+++ b/mod/ckeditor/languages/en.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * CKEditor language pack.
+ *
+ * @package ElggCKEditor
+ */
+
+$english = array(
+ 'ckeditor:remove' => "Remove editor",
+ 'ckeditor:add' => "Add editor",
+ 'ckeditor:word_count' => 'Word count: ',
+);
+
+add_translation("en", $english);
diff --git a/mod/ckeditor/manifest.xml b/mod/ckeditor/manifest.xml
new file mode 100644
index 000000000..e881c145b
--- /dev/null
+++ b/mod/ckeditor/manifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>CKEditor</name>
+ <author>Lorea developers</author>
+ <version>1.9</version>
+ <category>bundled</category>
+ <category>enhancement</category>
+ <description>Integrates the popular rich text editor CKEditor as a plugin.</description>
+ <website>http://lorea.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <conflicts>
+ <type>plugin</type>
+ <name>tinymce</name>
+ </conflicts>
+ <activate_on_install>true</activate_on_install>
+</plugin_manifest>
diff --git a/mod/ckeditor/start.php b/mod/ckeditor/start.php
new file mode 100644
index 000000000..62801eac3
--- /dev/null
+++ b/mod/ckeditor/start.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * CKEditor wysiwyg editor
+ *
+ * @package ElggCKEditor
+ */
+
+elgg_register_event_handler('init', 'system', 'ckeditor_init');
+
+function ckeditor_init() {
+ elgg_extend_view('css/elgg', 'ckeditor/css');
+ elgg_extend_view('css/admin', 'ckeditor/css');
+
+ $url = elgg_get_simplecache_url('css', 'wysiwyg');
+ elgg_register_css('elgg.wysiwyg', $url);
+ elgg_extend_view('css/wysiwyg', 'css/elements/reset', 100);
+ elgg_extend_view('css/wysiwyg', 'css/elements/typography', 100);
+
+ elgg_register_js('ckeditor', 'mod/ckeditor/vendors/ckeditor/ckeditor.js');
+ elgg_register_js('elgg.ckeditor', elgg_get_simplecache_url('js', 'ckeditor'));
+ elgg_register_simplecache_view('js/ckeditor');
+
+ elgg_extend_view('input/longtext', 'ckeditor/init');
+
+ elgg_extend_view('embed/custom_insert_js', 'ckeditor/embed_custom_insert_js');
+
+ elgg_register_plugin_hook_handler('register', 'menu:longtext', 'ckeditor_longtext_menu');
+}
+
+function ckeditor_longtext_menu($hook, $type, $items, $vars) {
+
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'ckeditor_toggler',
+ 'link_class' => 'ckeditor-toggle-editor elgg-longtext-control',
+ 'href' => "#{$vars['id']}",
+ 'text' => elgg_echo('ckeditor:remove'),
+ ));
+
+ return $items;
+}
diff --git a/mod/ckeditor/vendors/ckeditor/CHANGES.md b/mod/ckeditor/vendors/ckeditor/CHANGES.md
new file mode 100644
index 000000000..72813ff38
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/CHANGES.md
@@ -0,0 +1,60 @@
+CKEditor 4 Changelog
+====================
+
+## CKEditor 4.0.1.1
+
+* Security update: Added protection against XSS attack and possible path disclosure in PHP sample.
+
+## CKEditor 4.0.1
+
+Fixed issues:
+
+* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in new Moono skin.
+* Accessibility issues (mainly on inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844).
+* Magic-line:
+ * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic-line.
+ * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic-line support for forms.
+ * [#9573](http://dev.ckeditor.com/ticket/9573): Magic-line doesn't disappear on `mouseout` in the specific case.
+* [#9754](http://dev.ckeditor.com/ticket/9754): [Webkit] Cut & paste simple unformatted text generates inline wrapper in Webkits.
+* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS-Word.
+* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging.
+* Context menu:
+ * [#9712](http://dev.ckeditor.com/ticket/9712): Context menu open destroys editor focus.
+ * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over floating toolbar.
+ * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates JS error in inline mode when editor attached to header element.
+* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing window.
+* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div based editor puts editing area under bottom UI space.
+* [#9528](http://dev.ckeditor.com/ticket/9528): Host page's `box-sizing` style shouldn't influence editor UI elements.
+* [#9503](http://dev.ckeditor.com/ticket/9503): Forms plugin adds context menu listeners only on supported input types. Added support for `tel, email, search` and `url` input types.
+* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in narrow window.
+* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog doesn't populate width correctly.
+* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in nested table removes outer table cell.
+* [#9815](http://dev.ckeditor.com/ticket/9815): Can't edit dialog fields on editor initialized in jQuery UI modal dialog.
+* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialogs do not show completely in small window.
+* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a div stay permanently even after user exists editing the div.
+* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing format combo by clicking on its button.
+* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when `border-width` style is specified.
+* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read only mode.
+* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected image.
+* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>`.
+* [#9709](http://dev.ckeditor.com/ticket/9709): PasteFromWord should not depend on configuration from other styles.
+* [#9726](http://dev.ckeditor.com/ticket/9726): Removed color dialog dependency from table tools.
+* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly on Accessibility Instructions dialog.
+* [#9771](http://dev.ckeditor.com/ticket/9771): [Webkit & Opera] Fixed scrolling issues when pasting.
+* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] onChange isn't fired for checkboxes in dialogs.
+* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When we open toolbar menu for the first time & press down arrow key, focus goes to next toolbar button instead of menu options.
+* [#9847](http://dev.ckeditor.com/ticket/9847): Elements path shouldn't be initialized on inline editor.
+* [#9853](http://dev.ckeditor.com/ticket/9853): `Editor#addRemoveFormatFilter` is exposed before it really works.
+* [#8893](http://dev.ckeditor.com/ticket/8893): Value of `pasteFromWordCleanupFile` config is now taken from instance configuration.
+* [#9693](http://dev.ckeditor.com/ticket/9693): Removed "live preview" checkbox from UI color picker.
+
+
+## CKEditor 4.0
+
+The first stable release of the new CKEditor 4 code line.
+
+The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever
+possible. The list of relevant changes can be found in the [API Changes page of
+the CKEditor 4 documentation][1].
+
+[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes"" \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/LICENSE.md b/mod/ckeditor/vendors/ckeditor/LICENSE.md
new file mode 100644
index 000000000..d447c67b5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/LICENSE.md
@@ -0,0 +1,1264 @@
+Software License Agreement
+==========================
+
+CKEditor - The text editor for Internet - http://ckeditor.com
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+ - GNU General Public License Version 2 or later (the "GPL")
+ http://www.gnu.org/licenses/gpl.html
+ (See Appendix A)
+
+ - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ http://www.gnu.org/licenses/lgpl.html
+ (See Appendix B)
+
+ - Mozilla Public License Version 1.1 or later (the "MPL")
+ http://www.mozilla.org/MPL/MPL-1.1.html
+ (See Appendix C)
+
+You are not required to, but if you want to explicitly declare the
+license you have chosen to be bound to when using, reproducing,
+modifying and distributing this software, just include a text file
+titled "legal.txt" in your version of this software, indicating your
+license choice. In any case, your choice will not restrict any
+recipient of your version of this software to use, reproduce, modify
+and distribute this software under any of the above licenses.
+
+Sources of Intellectual Property Included in CKEditor
+-----------------------------------------------------
+
+Where not otherwise indicated, all CKEditor content is authored by
+CKSource engineers and consists of CKSource-owned intellectual
+property. In some specific instances, CKEditor will incorporate work
+done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
+and product names are trademarks, registered trademarks or service
+marks of their respective holders.
+
+---
+
+Appendix A: The GPL License
+---------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software-to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+GNU GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+Appendix B: The LGPL License
+----------------------------
+
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software-to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages-typically libraries-of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+GNU LESSER GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+Appendix C: The MPL License
+---------------------------
+
+MOZILLA PUBLIC LICENSE
+Version 1.1
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
diff --git a/mod/ckeditor/vendors/ckeditor/README.md b/mod/ckeditor/vendors/ckeditor/README.md
new file mode 100644
index 000000000..378c267ee
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/README.md
@@ -0,0 +1,39 @@
+CKEditor 4
+==========
+
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+http://ckeditor.com - See LICENSE.md for license information.
+
+CKEditor is a text editor to be used inside web pages. It's not a replacement
+for desktop text editors like Word or OpenOffice, but a component to be used as
+part of web applications and websites.
+
+## Documentation
+
+The full editor documentation is available online at the following address:
+http://docs.ckeditor.com
+
+## Installation
+
+Installing CKEditor is an easy task. Just follow these simple steps:
+
+ 1. **Download** the latest version from the CKEditor website:
+ http://ckeditor.com. You should have already completed this step, but be
+ sure you have the very latest version.
+ 2. **Extract** (decompress) the downloaded file into the root of your website.
+
+**Note:** CKEditor is by default installed in the `ckeditor` folder. You can
+place the files in whichever you want though.
+
+## Checking Your Installation
+
+The editor comes with a few sample pages that can be used to verify that
+installation proceeded properly. Take a look at the `samples` directory.
+
+To test your installation, just call the following page at your website:
+
+ http://<your site>/<CKEditor installation path>/samples/index.html
+
+For example:
+
+ http://www.example.com/ckeditor/samples/index.html
diff --git a/mod/ckeditor/vendors/ckeditor/build-config.js b/mod/ckeditor/vendors/ckeditor/build-config.js
new file mode 100644
index 000000000..70165bc66
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/build-config.js
@@ -0,0 +1,138 @@
+
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+/**
+ * This file was added automatically by CKEditor builder.
+ * You may re-use it at any time at http://ckeditor.com/builder to build CKEditor again.
+ *
+ * NOTE:
+ * This file is not used by CKEditor, you may remove it.
+ * Changing this file will not change your CKEditor configuration.
+ */
+
+var CKBUILDER_CONFIG = {
+ skin: 'moono',
+ preset: 'standard',
+ ignore: [
+ 'dev',
+ '.gitignore',
+ '.gitattributes',
+ 'README.md',
+ '.mailmap'
+ ],
+ plugins : {
+ 'about' : 1,
+ 'a11yhelp' : 1,
+ 'basicstyles' : 1,
+ 'blockquote' : 1,
+ 'clipboard' : 1,
+ 'contextmenu' : 1,
+ 'resize' : 1,
+ 'toolbar' : 1,
+ 'elementspath' : 1,
+ 'enterkey' : 1,
+ 'entities' : 1,
+ 'filebrowser' : 1,
+ 'floatingspace' : 1,
+ 'format' : 1,
+ 'htmlwriter' : 1,
+ 'horizontalrule' : 1,
+ 'wysiwygarea' : 1,
+ 'image' : 1,
+ 'indent' : 1,
+ 'link' : 1,
+ 'list' : 1,
+ 'magicline' : 1,
+ 'maximize' : 1,
+ 'pastetext' : 1,
+ 'pastefromword' : 1,
+ 'removeformat' : 1,
+ 'sourcearea' : 1,
+ 'specialchar' : 1,
+ 'scayt' : 1,
+ 'stylescombo' : 1,
+ 'tab' : 1,
+ 'table' : 1,
+ 'tabletools' : 1,
+ 'undo' : 1,
+ 'wsc' : 1,
+ 'dialog' : 1,
+ 'dialogui' : 1,
+ 'menu' : 1,
+ 'floatpanel' : 1,
+ 'panel' : 1,
+ 'button' : 1,
+ 'popup' : 1,
+ 'richcombo' : 1,
+ 'listblock' : 1,
+ 'fakeobjects' : 1,
+ 'menubutton' : 1
+ },
+ languages : {
+ 'af' : 1,
+ 'ar' : 1,
+ 'eu' : 1,
+ 'bn' : 1,
+ 'bs' : 1,
+ 'bg' : 1,
+ 'ca' : 1,
+ 'zh-cn' : 1,
+ 'zh' : 1,
+ 'hr' : 1,
+ 'cs' : 1,
+ 'da' : 1,
+ 'nl' : 1,
+ 'en' : 1,
+ 'en-au' : 1,
+ 'en-ca' : 1,
+ 'en-gb' : 1,
+ 'eo' : 1,
+ 'et' : 1,
+ 'fo' : 1,
+ 'fi' : 1,
+ 'fr' : 1,
+ 'fr-ca' : 1,
+ 'gl' : 1,
+ 'ka' : 1,
+ 'de' : 1,
+ 'el' : 1,
+ 'gu' : 1,
+ 'he' : 1,
+ 'hi' : 1,
+ 'hu' : 1,
+ 'is' : 1,
+ 'it' : 1,
+ 'ja' : 1,
+ 'km' : 1,
+ 'ko' : 1,
+ 'ku' : 1,
+ 'lv' : 1,
+ 'lt' : 1,
+ 'mk' : 1,
+ 'ms' : 1,
+ 'mn' : 1,
+ 'no' : 1,
+ 'nb' : 1,
+ 'fa' : 1,
+ 'pl' : 1,
+ 'pt-br' : 1,
+ 'pt' : 1,
+ 'ro' : 1,
+ 'ru' : 1,
+ 'sr' : 1,
+ 'sr-latn' : 1,
+ 'sk' : 1,
+ 'sl' : 1,
+ 'es' : 1,
+ 'sv' : 1,
+ 'th' : 1,
+ 'tr' : 1,
+ 'ug' : 1,
+ 'uk' : 1,
+ 'vi' : 1,
+ 'cy' : 1,
+ }
+}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/ckeditor.js b/mod/ckeditor/vendors/ckeditor/ckeditor.js
new file mode 100644
index 000000000..3862c2fa8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/ckeditor.js
@@ -0,0 +1,810 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"D08E",version:"4.0.1.1",revision:"270438fe31",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),d=0;d<b.length;d++){var c=b[d].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(c){a=c[1];break}}-1==a.indexOf(":/")&&(a=0===a.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+a:location.href.match(/^[^\?]*\/(?:)/)[0]+
+a);if(!a)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return a}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&("/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a))&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",a,
+!1),b()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),b())}catch(d){}}function b(){for(var a;a=d.shift();)a()}var d=[];return function(b){d.push(b);"complete"===document.readyState&&setTimeout(a,1);if(1==d.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",a);window.attachEvent("onload",a);b=!1;try{b=
+!window.frameElement}catch(e){}if(document.documentElement.doScroll&&b){var c=function(){try{document.documentElement.doScroll("left")}catch(b){setTimeout(c,1);return}a()};c()}}}}()},c=window.CKEDITOR_GETURL;if(c){var a=b.url;b.url=function(f){return c.call(b,f)||a.call(b,f)}}return b}());
+CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(b){var c=CKEDITOR.event.prototype,a;for(a in c)b[a]==void 0&&(b[a]=c[a])},CKEDITOR.event.prototype=function(){function b(f){var b=c(this);return b[f]||(b[f]=new a(f))}var c=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},a=function(a){this.name=a;this.listeners=[]};a.prototype={getListenerIndex:function(a){for(var b=0,d=this.listeners;b<d.length;b++)if(d[b].fn==a)return b;return-1}};
+return{define:function(a,e){var d=b.call(this,a);CKEDITOR.tools.extend(d,e,true)},on:function(a,e,d,c,k){function h(b,l,o,n){b={name:a,sender:this,editor:b,data:l,listenerData:c,stop:o,cancel:n,removeListener:m};return e.call(d,b)===false?false:b.data}function m(){o.removeListener(a,e)}var n=b.call(this,a);if(n.getListenerIndex(e)<0){n=n.listeners;d||(d=this);isNaN(k)&&(k=10);var o=this;h.fn=e;h.priority=k;for(var l=n.length-1;l>=0;l--)if(n[l].priority<=k){n.splice(l+1,0,h);return{removeListener:m}}n.unshift(h)}return{removeListener:m}},
+once:function(){var a=arguments[1];arguments[1]=function(b){b.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},d=0,g=function(){d=1};return function(k,h,m){var n=c(this)[k],k=a,o=d;a=d=0;if(n){var l=n.listeners;if(l.length)for(var l=l.slice(0),j,q=0;q<l.length;q++){if(n.errorProof)try{j=l[q].call(this,
+m,h,b,g)}catch(y){}else j=l[q].call(this,m,h,b,g);j===false?d=1:typeof j!="undefined"&&(h=j);if(a||d)break}}h=d?false:typeof h=="undefined"?true:h;a=k;d=o;return h}}(),fireOnce:function(a,b,d){b=this.fire(a,b,d);delete c(this)[a];return b},removeListener:function(a,b){var d=c(this)[a];if(d){var g=d.getListenerIndex(b);g>=0&&d.listeners.splice(g,1)}},removeAllListeners:function(){var a=c(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=c(this)[a])&&a.listeners.length>0}}}());
+CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fire.call(this,b,c,this)},CKEDITOR.editor.prototype.fireOnce=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fireOnce.call(this,b,c,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
+CKEDITOR.env||(CKEDITOR.env=function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,a={ie:eval("/*@cc_on!@*/false"),opera:!!c&&c.version,webkit:b.indexOf(" applewebkit/")>-1,air:b.indexOf(" adobeair/")>-1,mac:b.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat",mobile:b.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,b=window.location.hostname;return a!=b&&a!="["+b+"]"},secure:location.protocol==
+"https:"};a.gecko=navigator.product=="Gecko"&&!a.webkit&&!a.opera;if(a.webkit)b.indexOf("chrome")>-1?a.chrome=true:a.safari=true;var f=0;if(a.ie){f=a.quirks||!document.documentMode?parseFloat(b.match(/msie (\d+)/)[1]):document.documentMode;a.ie9Compat=f==9;a.ie8Compat=f==8;a.ie7Compat=f==7;a.ie6Compat=f<7||a.quirks}if(a.gecko){var e=b.match(/rv:([\d\.]+)/);if(e){e=e[1].split(".");f=e[0]*1E4+(e[1]||0)*100+(e[2]||0)*1}}a.opera&&(f=parseFloat(c.version()));a.air&&(f=parseFloat(b.match(/ adobeair\/(\d+)/)[1]));
+a.webkit&&(f=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]));a.version=f;a.isCompatible=a.iOS&&f>=534||!a.mobile&&(a.ie&&f>6||a.gecko&&f>=10801||a.opera&&f>=9.5||a.air&&f>=1||a.webkit&&f>=522||false);a.cssClass="cke_browser_"+(a.ie?"ie":a.gecko?"gecko":a.opera?"opera":a.webkit?"webkit":"unknown");if(a.quirks)a.cssClass=a.cssClass+" cke_browser_quirks";if(a.ie){a.cssClass=a.cssClass+(" cke_browser_ie"+(a.quirks||a.version<7?"6":a.version));if(a.quirks)a.cssClass=a.cssClass+" cke_browser_iequirks"}if(a.gecko)if(f<
+10900)a.cssClass=a.cssClass+" cke_browser_gecko18";else if(f<=11E3)a.cssClass=a.cssClass+" cke_browser_gecko19";if(a.air)a.cssClass=a.cssClass+" cke_browser_air";return a}());
+"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var b=document.createElement("script");b.type="text/javascript";b.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(b)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(b){(this._.pending||(this._.pending=[])).push(b)};(function(){CKEDITOR.domReady(function(){var b=
+CKEDITOR.loadFullCore,c=CKEDITOR.loadFullCoreTimeout;if(b){CKEDITOR.status="basic_ready";b&&b._load?b():c&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},c*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={};
+(function(){var b=[],c=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.opera?"-o-":CKEDITOR.env.ie?"-ms-":"";CKEDITOR.on("reset",function(){b=[]});CKEDITOR.tools={arrayCompare:function(a,b){if(!a&&!b)return true;if(!a||!b||a.length!=b.length)return false;for(var e=0;e<a.length;e++)if(a[e]!=b[e])return false;return true},clone:function(a){var b;if(a&&a instanceof Array){b=[];for(var e=0;e<a.length;e++)b[e]=this.clone(a[e]);return b}if(a===null||typeof a!="object"||a instanceof
+String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp)return a;b=new a.constructor;for(e in a)b[e]=this.clone(a[e]);return b},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substring(1).toLowerCase()},extend:function(a){var b=arguments.length,e,d;if(typeof(e=arguments[b-1])=="boolean")b--;else if(typeof(e=arguments[b-2])=="boolean"){d=arguments[b-1];b=b-2}for(var c=1;c<b;c++){var k=arguments[c],h;for(h in k)if(e===true||a[h]==void 0)if(!d||h in d)a[h]=
+k[h]}return a},prototypedCopy:function(a){var b=function(){};b.prototype=a;return new b},isArray:function(a){return!!a&&a instanceof Array},isEmpty:function(a){for(var b in a)if(a.hasOwnProperty(b))return false;return true},cssVendorPrefix:function(a,b,e){if(e)return c+a+":"+b+";"+a+":"+b;e={};e[a]=b;e[c+a]=b;return e},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b=typeof a.cssFloat!="undefined"?"cssFloat":typeof a.styleFloat!="undefined"?"styleFloat":"float";return function(a){return a==
+"float"?b:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){for(var a=[].concat(a),b,e=[],c=0;c<a.length;c++)if(b=a[c])/@import|[{}]/.test(b)?e.push("<style>"+b+"</style>"):e.push('<link type="text/css" rel=stylesheet href="'+b+'">');return e.join("")},htmlEncode:function(a){return(""+a).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;")},htmlEncodeAttr:function(a){return a.replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},getNextNumber:function(){var a=
+0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,b){var e=b(a);e.prototype=a.prototype;return e},setTimeout:function(a,b,e,c,g){g||(g=window);e||(e=g);return g.setTimeout(function(){c?a.apply(e,[].concat(c)):a.apply(e)},b||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;
+return function(b){return b.replace(a,"")}}(),indexOf:function(a,b){if(typeof b=="function")for(var c=0,d=a.length;c<d;c++){if(b(a[c]))return c}else{if(a.indexOf)return a.indexOf(b);c=0;for(d=a.length;c<d;c++)if(a[c]===b)return c}return-1},search:function(a,b){var c=CKEDITOR.tools.indexOf(a,b);return c>=0?a[c]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,c=a.base,d=a.privates||a._,g=a.proto,a=a.statics;!b&&(b=function(){c&&this.base.apply(this,
+arguments)});if(d)var k=b,b=function(){var a=this._||(this._={}),b;for(b in d){var f=d[b];a[b]=typeof f=="function"?CKEDITOR.tools.bind(f,this):f}k.apply(this,arguments)};if(c){b.prototype=this.prototypedCopy(c.prototype);b.prototype.constructor=b;b.base=c;b.baseProto=c.prototype;b.prototype.base=function(){this.base=c.prototype.base;c.apply(this,arguments);this.base=arguments.callee}}g&&this.extend(b.prototype,g,true);a&&this.extend(b,a,true);return b},addFunction:function(a,f){return b.push(function(){return a.apply(f||
+this,arguments)})-1},removeFunction:function(a){b[a]=null},callFunction:function(a){var f=b[a];return f&&f.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(c){b=CKEDITOR.tools.trim(c+"")+"px";return a.test(b)?b:c||""}}(),convertToPx:function(){var a;return function(b){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',CKEDITOR.document);
+CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,c=arguments.length;b<c;b++){var d=arguments[b];try{a=d();break}catch(g){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var b=arguments,c=this;window.setTimeout(function(){a.apply(c,b)},0)}},normalizeCssText:function(a,b){var c=[],
+d,g=CKEDITOR.tools.parseCssText(a,true,b);for(d in g)c.push(d+":"+g[d]);c.sort();return c.length?c.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(a,b,c,g){a=[b,c,g];for(b=0;b<3;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,b,c){var d={};if(c){c=new CKEDITOR.dom.element("span");c.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(c.getAttribute("style")||"")}if(!a||
+a==";")return d;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,e){if(b){c=c.toLowerCase();c=="font-family"&&(e=e.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));e=CKEDITOR.tools.trim(e)}d[c]=e});return d}}})();
+CKEDITOR.dtd=function(){var b=CKEDITOR.tools.extend,c=function(a,b){for(var f=CKEDITOR.tools.clone(a),l=1;l<arguments.length;l++){var b=arguments[l],j;for(j in b)delete f[j]}return f},a={},f={},e={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},d={command:1,link:1,meta:1,noscript:1,script:1,style:1},g={},k={"#":1},h={center:1,dir:1,noframes:1};
+b(a,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},k,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});b(f,e,a,h);c={a:c(a,{a:1,button:1}),abbr:a,address:f,
+area:g,article:b({style:1},f),aside:b({style:1},f),audio:b({source:1,track:1},f),b:a,base:g,bdi:a,bdo:a,blockquote:f,body:f,br:g,button:c(a,{a:1,button:1}),canvas:a,caption:f,cite:a,code:a,col:g,colgroup:{col:1},command:g,datalist:b({option:1},a),dd:f,del:a,details:b({summary:1},f),dfn:a,div:b({style:1},f),dl:{dt:1,dd:1},dt:f,em:a,embed:g,fieldset:b({legend:1},f),figcaption:f,figure:b({figcaption:1},f),footer:f,form:f,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,head:b({title:1,base:1},d),header:f,hgroup:{h1:1,
+h2:1,h3:1,h4:1,h5:1,h6:1},hr:g,html:b({head:1,body:1},f,d),i:a,iframe:k,img:g,input:g,ins:a,kbd:a,keygen:g,label:a,legend:a,li:f,link:g,map:f,mark:a,menu:b({li:1},f),meta:g,meter:c(a,{meter:1}),nav:f,noscript:b({link:1,meta:1,style:1},a),object:b({param:1},a),ol:{li:1},optgroup:{option:1},option:k,output:a,p:a,param:g,pre:a,progress:c(a,{progress:1}),q:a,rp:a,rt:a,ruby:b({rp:1,rt:1},a),s:a,samp:a,script:k,section:b({style:1},f),select:{optgroup:1,option:1},small:a,source:g,span:a,strong:a,style:k,
+sub:a,summary:a,sup:a,table:{caption:1,colgroup:1,thead:1,tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:f,textarea:k,tfoot:{tr:1},th:f,thead:{tr:1},time:c(a,{time:1}),title:k,tr:{th:1,td:1},track:g,u:a,ul:{li:1},"var":a,video:b({source:1,track:1},f),wbr:g,acronym:a,applet:b({param:1},f),basefont:g,big:a,center:f,dialog:g,dir:{li:1},font:a,isindex:g,noframes:f,strike:a,tt:a};b(c,{$block:b({audio:1,dd:1,dt:1,li:1,video:1},e,h),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,
+fieldset:1,figure:1,footer:1,form:1,header:1,hgroup:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1},$inline:a,$list:{dl:1,ol:1,
+ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:b({body:1,head:1,html:1},c.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,
+sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return c}();CKEDITOR.dom.event=function(b){this.$=b};
+CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var b=this.getKey();if(this.$.ctrlKey||this.$.metaKey)b=b+CKEDITOR.CTRL;this.$.shiftKey&&(b=b+CKEDITOR.SHIFT);this.$.altKey&&(b=b+CKEDITOR.ALT);return b},preventDefault:function(b){var c=this.$;c.preventDefault?c.preventDefault():c.returnValue=false;b&&this.stopPropagation()},stopPropagation:function(){var b=this.$;b.stopPropagation?b.stopPropagation():b.cancelBubble=true},getTarget:function(){var b=
+this.$.target||this.$.srcElement;return b?new CKEDITOR.dom.node(b):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var b=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(b.documentElement.scrollLeft||b.body.scrollLeft),y:this.$.pageY||this.$.clientY+(b.documentElement.scrollTop||b.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;
+CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(b){if(b)this.$=b};
+CKEDITOR.dom.domObject.prototype=function(){var b=function(b,a){return function(f){typeof CKEDITOR!="undefined"&&b.fire(a,new CKEDITOR.dom.event(f))}};return{getPrivate:function(){var b;if(!(b=this.getCustomData("_")))this.setCustomData("_",b={});return b},on:function(c){var a=this.getCustomData("_cke_nativeListeners");if(!a){a={};this.setCustomData("_cke_nativeListeners",a)}if(!a[c]){a=a[c]=b(this,c);this.$.addEventListener?this.$.addEventListener(c,a,!!CKEDITOR.event.useCapture):this.$.attachEvent&&
+this.$.attachEvent("on"+c,a)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(b){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(b)){var a=this.getCustomData("_cke_nativeListeners"),f=a&&a[b];if(f){this.$.removeEventListener?this.$.removeEventListener(b,f,false):this.$.detachEvent&&this.$.detachEvent("on"+b,f);delete a[b]}}},removeAllListeners:function(){var b=this.getCustomData("_cke_nativeListeners"),a;for(a in b){var f=b[a];this.$.detachEvent?
+this.$.detachEvent("on"+a,f):this.$.removeEventListener&&this.$.removeEventListener(a,f,false);delete b[a]}}}}();
+(function(b){var c={};CKEDITOR.on("reset",function(){c={}});b.equals=function(a){try{return a&&a.$===this.$}catch(b){return false}};b.setCustomData=function(a,b){var e=this.getUniqueId();(c[e]||(c[e]={}))[a]=b;return this};b.getCustomData=function(a){var b=this.$["data-cke-expando"];return(b=b&&c[b])&&a in b?b[a]:null};b.removeCustomData=function(a){var b=this.$["data-cke-expando"],b=b&&c[b],e,d;if(b){e=b[a];d=a in b;delete b[a]}return d?e:null};b.clearCustomData=function(){this.removeAllListeners();
+var a=this.$["data-cke-expando"];a&&delete c[a]};b.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(b)})(CKEDITOR.dom.domObject.prototype);
+CKEDITOR.dom.node=function(b){return b?new CKEDITOR.dom[b.nodeType==CKEDITOR.NODE_DOCUMENT?"document":b.nodeType==CKEDITOR.NODE_ELEMENT?"element":b.nodeType==CKEDITOR.NODE_TEXT?"text":b.nodeType==CKEDITOR.NODE_COMMENT?"comment":b.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](b):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;
+CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;
+CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(b,c){b.append(this,c);return b},clone:function(b,c){var a=this.$.cloneNode(b),f=function(a){a["data-cke-expando"]&&(a["data-cke-expando"]=false);if(a.nodeType==CKEDITOR.NODE_ELEMENT){c||a.removeAttribute("id",false);if(b)for(var a=a.childNodes,d=0;d<a.length;d++)f(a[d])}};f(a);return new CKEDITOR.dom.node(a)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(b){b.$.parentNode.insertBefore(this.$,
+b.$.nextSibling);return b},insertBefore:function(b){b.$.parentNode.insertBefore(this.$,b.$);return b},insertBeforeMe:function(b){this.$.parentNode.insertBefore(b.$,this.$);return b},getAddress:function(b){for(var c=[],a=this.getDocument().$.documentElement,f=this.$;f&&f!=a;){var e=f.parentNode;e&&c.unshift(this.getIndex.call({$:f},b));f=e}return c},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(b){var c=this.$,a=-1,
+f;if(!this.$.parentNode)return a;do if(!b||!(c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(f||!c.nodeValue))){a++;f=c.nodeType==CKEDITOR.NODE_TEXT}while(c=c.previousSibling);return a},getNextSourceNode:function(b,c,a){if(a&&!a.call)var f=a,a=function(a){return!a.equals(f)};var b=!b&&this.getFirst&&this.getFirst(),e;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getNext()}for(;!b&&(e=(e||this).getParent());){if(a&&a(e,true)===false)return null;b=e.getNext()}return!b||
+a&&a(b)===false?null:c&&c!=b.type?b.getNextSourceNode(false,c,a):b},getPreviousSourceNode:function(b,c,a){if(a&&!a.call)var f=a,a=function(a){return!a.equals(f)};var b=!b&&this.getLast&&this.getLast(),e;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getPrevious()}for(;!b&&(e=(e||this).getParent());){if(a&&a(e,true)===false)return null;b=e.getPrevious()}return!b||a&&a(b)===false?null:c&&b.type!=c?b.getPreviousSourceNode(false,c,a):b},getPrevious:function(b){var c=
+this.$,a;do a=(c=c.previousSibling)&&c.nodeType!=10&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getNext:function(b){var c=this.$,a;do a=(c=c.nextSibling)&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getParent:function(b){var c=this.$.parentNode;return c&&(c.nodeType==CKEDITOR.NODE_ELEMENT||b&&c.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(c):null},getParents:function(b){var c=this,a=[];do a[b?"push":"unshift"](c);while(c=c.getParent());return a},getCommonAncestor:function(b){if(b.equals(this))return this;
+if(b.contains&&b.contains(this))return b;var c=this.contains?this:this.getParent();do if(c.contains(b))return c;while(c=c.getParent());return null},getPosition:function(b){var c=this.$,a=b.$;if(c.compareDocumentPosition)return c.compareDocumentPosition(a);if(c==a)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&b.type==CKEDITOR.NODE_ELEMENT){if(c.contains){if(c.contains(a))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(a.contains(c))return CKEDITOR.POSITION_IS_CONTAINED+
+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in c)return c.sourceIndex<0||a.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:c.sourceIndex<a.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var c=this.getAddress(),b=b.getAddress(),a=Math.min(c.length,b.length),f=0;f<=a-1;f++)if(c[f]!=b[f]){if(f<a)return c[f]<b[f]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return c.length<b.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+
+CKEDITOR.POSITION_FOLLOWING},getAscendant:function(b,c){var a=this.$,f;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&(f=a.nodeName.toLowerCase(),typeof b=="string"?f==b:f in b))return new CKEDITOR.dom.node(a);a=a.parentNode}return null},hasAscendant:function(b,c){var a=this.$;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&a.nodeName.toLowerCase()==b)return true;a=a.parentNode}return false},move:function(b,c){b.append(this.remove(),c)},remove:function(b){var c=this.$,a=c.parentNode;if(a){if(b)for(;b=
+c.firstChild;)a.insertBefore(c.removeChild(b),c);a.removeChild(c)}return this},replace:function(b){this.insertBefore(b);b.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var b;this.getFirst&&(b=this.getFirst());){if(b.type==CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.ltrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(a-c.length);this.$.removeChild(this.$.firstChild)}}else{b.remove();continue}}break}},rtrim:function(){for(var b;this.getLast&&(b=this.getLast());){if(b.type==
+CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.rtrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(c.length);this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{b.remove();continue}}break}if(!CKEDITOR.env.ie&&!CKEDITOR.env.opera)(b=this.$.lastChild)&&(b.type==1&&b.nodeName.toLowerCase()=="br")&&b.parentNode.removeChild(b)},isReadOnly:function(){var b=this;this.type!=CKEDITOR.NODE_ELEMENT&&(b=this.getParent());if(b&&typeof b.$.isContentEditable!="undefined")return!(b.$.isContentEditable||
+b.data("cke-editable"));for(;b;){if(b.data("cke-editable"))break;if(b.getAttribute("contentEditable")=="false")return true;if(b.getAttribute("contentEditable")=="true")break;b=b.getParent()}return!b}});CKEDITOR.dom.window=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var b=this.$.document,c=b.compatMode=="CSS1Compat";return{width:(c?b.documentElement.clientWidth:b.body.clientWidth)||0,height:(c?b.documentElement.clientHeight:b.body.clientHeight)||0}},getScrollPosition:function(){var b=this.$;if("pageXOffset"in b)return{x:b.pageXOffset||0,y:b.pageYOffset||0};b=b.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||
+b.body.scrollTop||0}},getFrame:function(){var b=this.$.frameElement;return b?new CKEDITOR.dom.element.get(b):null}});CKEDITOR.dom.document=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(b){if(this.$.createStyleSheet)this.$.createStyleSheet(b);else{var c=new CKEDITOR.dom.element("link");c.setAttributes({rel:"stylesheet",type:"text/css",href:b});this.getHead().append(c)}},appendStyleText:function(b){if(this.$.createStyleSheet){var c=this.$.createStyleSheet("");c.cssText=b}else{var a=new CKEDITOR.dom.element("style",this);a.append(new CKEDITOR.dom.text(b,this));this.getHead().append(a)}return c||
+a.$.sheet},createElement:function(b,c){var a=new CKEDITOR.dom.element(b,this);if(c){c.attributes&&a.setAttributes(c.attributes);c.styles&&a.setStyles(c.styles)}return a},createText:function(b){return new CKEDITOR.dom.text(b,this)},focus:function(){this.getWindow().focus()},getActive:function(){return new CKEDITOR.dom.element(this.$.activeElement)},getById:function(b){return(b=this.$.getElementById(b))?new CKEDITOR.dom.element(b):null},getByAddress:function(b,c){for(var a=this.$.documentElement,f=
+0;a&&f<b.length;f++){var e=b[f];if(c)for(var d=-1,g=0;g<a.childNodes.length;g++){var k=a.childNodes[g];if(!(c===true&&k.nodeType==3&&k.previousSibling&&k.previousSibling.nodeType==3)){d++;if(d==e){a=k;break}}}else a=a.childNodes[e]}return a?new CKEDITOR.dom.node(a):null},getElementsByTag:function(b,c){if((!CKEDITOR.env.ie||document.documentMode>8)&&c)b=c+":"+b;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(b))},getHead:function(){var b=this.$.getElementsByTagName("head")[0];return b=
+b?new CKEDITOR.dom.element(b):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){var b=new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return b})()},write:function(b){this.$.open("text/html","replace");CKEDITOR.env.isCustomDomain()&&(this.$.domain=document.domain);
+this.$.write(b);this.$.close()}});CKEDITOR.dom.nodeList=function(b){this.$=b};CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(b){if(b<0||b>=this.$.length)return null;return(b=this.$[b])?new CKEDITOR.dom.node(b):null}};CKEDITOR.dom.element=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createElement(b));CKEDITOR.dom.domObject.call(this,b)};
+CKEDITOR.dom.element.get=function(b){return(b=typeof b=="string"?document.getElementById(b)||document.getElementsByName(b)[0]:b)&&(b.$?b:new CKEDITOR.dom.element(b))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(b,c){var a=new CKEDITOR.dom.element("div",c);a.setHtml(b);return a.getFirst().remove()};
+CKEDITOR.dom.element.setMarker=function(b,c,a,f){var e=c.getCustomData("list_marker_id")||c.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=c.getCustomData("list_marker_names")||c.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");b[e]=c;d[a]=1;return c.setCustomData(a,f)};CKEDITOR.dom.element.clearAllMarkers=function(b){for(var c in b)CKEDITOR.dom.element.clearMarkers(b,b[c],1)};
+CKEDITOR.dom.element.clearMarkers=function(b,c,a){var f=c.getCustomData("list_marker_names"),e=c.getCustomData("list_marker_id"),d;for(d in f)c.removeCustomData(d);c.removeCustomData("list_marker_names");if(a){c.removeCustomData("list_marker_id");delete b[e]}};
+(function(){function b(a){for(var b=0,e=0,d=c[a].length;e<d;e++)b=b+(parseInt(this.getComputedStyle(c[a][e])||0,10)||0);return b}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var b=this.$.className;b&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)","").test(b)||(b=b+(" "+a)));this.$.className=b||a},removeClass:function(a){var b=this.getAttribute("class");if(b){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(b))(b=b.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",
+b):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,b){typeof a=="string"&&(a=this.getDocument().createElement(a));b?this.$.insertBefore(a.$,this.$.firstChild):this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var b=new CKEDITOR.dom.element("div",this.getDocument());b.setHtml(a);b.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=
+void 0?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(){for(var a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is||!a.is("br")){a=CKEDITOR.env.opera?this.getDocument().createText(""):this.getDocument().createElement("br");CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}},breakParent:function(a){var b=new CKEDITOR.dom.range(this.getDocument());b.setStartAfter(this);b.setEndAfter(a);
+a=b.extractContents();b.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$):b!=a.$&&b.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(a){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,
+""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:function(){var a=function(a){return this.$.innerHTML=a};return CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{return this.$.innerHTML=
+a}catch(b){this.$.innerHTML="";var c=new CKEDITOR.dom.element("body",this.getDocument());c.$.innerHTML=a;for(c=c.getChildren();c.count();)this.append(c.getItem(0));return a}}:a}(),setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?
+function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?
+this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,
+getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||
+null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode>8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&
+(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b<arguments.length;b++)if(arguments[b]==a)return true;return false},isEditable:function(a){var b=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[b]||CKEDITOR.dtd.$empty[b]||this.is("a")&&
+(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[b]||CKEDITOR.dtd.span;return!(!a||!a["#"])}return true},isIdentical:function(a){var b=this.clone(0,1),a=a.clone(0,1);b.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(b.$.isEqualNode){b.$.style.cssText=CKEDITOR.tools.normalizeCssText(b.$.style.cssText);
+a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return b.$.isEqualNode(a.$)}b=b.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var c=this.getParent();if(c.type==CKEDITOR.NODE_ELEMENT){c=c.clone();c.setHtml(b);b=c.getHtml();c.setHtml(a);a=c.getHtml()}}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",b,c;if(a&&(CKEDITOR.env.webkit||CKEDITOR.env.opera)){b=
+this.getWindow();if(!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement))a=(new CKEDITOR.dom.element(c)).isVisible()}return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),b=0,c=a.count();b<c;b++){var d=a.getItem(b);if(!(d.type==CKEDITOR.NODE_ELEMENT&&d.data("cke-bookmark"))&&(d.type==CKEDITOR.NODE_ELEMENT&&!d.isEmptyInlineRemoveable()||d.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(d.getText())))return false}return true},
+hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(){for(var a=this.$.attributes,b=0;b<a.length;b++){var c=a[b];switch(c.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(c.specified)return true}}return false}:function(){var a=this.$.attributes,b=a.length,c={"data-cke-expando":1,_moz_dirty:1};return b>0&&(b>2||!c[a[0].nodeName]||b==2&&!c[a[1].nodeName])},hasAttribute:function(){function a(a){a=this.$.attributes.getNamedItem(a);
+return!(!a||!a.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"?!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$,a=a.$;if(c!=a){var d;if(b)for(;d=c.lastChild;)a.insertBefore(c.removeChild(d),a.firstChild);else for(;d=c.firstChild;)a.appendChild(c.removeChild(d))}},mergeSiblings:function(){function a(a,b,c){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var g=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){g.push(b);
+b=c?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(a.isIdentical(b)){for(var k=c?a.getLast():a.getFirst();g.length;)g.shift().move(a,!c);b.moveChildren(a,!c);b.remove();k&&k.type==CKEDITOR.NODE_ELEMENT&&k.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,
+b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(d){}else a.apply(this,arguments);
+return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<
+a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],d;a=="border"&&(d=["color","style","width"]);for(var b=[],g=0;g<c.length;g++)if(d)for(var k=0;k<d.length;k++)b.push([a,c[g],d[k]].join("-"));else b.push([a,c[g]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):
+b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
+"none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,d=b.count();c<d;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,d=this.getDocument(),g=d.getBody(),k=d.$.compatMode=="BackCompat";if(document.documentElement.getBoundingClientRect){var h=
+this.$.getBoundingClientRect(),m=d.$.documentElement,n=m.clientTop||g.$.clientTop||0,o=m.clientLeft||g.$.clientLeft||0,l=true;if(CKEDITOR.env.ie){l=d.getDocumentElement().contains(this);d=d.getBody().contains(this);l=k&&d||!k&&l}if(l){b=h.left+(!k&&m.scrollLeft||g.$.scrollLeft);b=b-o;c=h.top+(!k&&m.scrollTop||g.$.scrollTop);c=c-n}}else{g=this;for(d=null;g&&!(g.getName()=="body"||g.getName()=="html");){b=b+(g.$.offsetLeft-g.$.scrollLeft);c=c+(g.$.offsetTop-g.$.scrollTop);if(!g.equals(this)){b=b+(g.$.clientLeft||
+0);c=c+(g.$.clientTop||0)}for(;d&&!d.equals(g);){b=b-d.$.scrollLeft;c=c-d.$.scrollTop;d=d.getParent()}d=g;g=(h=g.$.offsetParent)?new CKEDITOR.dom.element(h):null}}if(a){g=this.getWindow();d=a.getWindow();if(!g.equals(d)&&g.$.frameElement){a=(new CKEDITOR.dom.element(g.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!k){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=
+this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var d=c.$.frameElement;d&&(b=new CKEDITOR.dom.element(d))}catch(g){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var d,g,k,h;function m(b,l){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,l);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+l}}
+function n(a,b){var o={x:0,y:0};if(!a.is(l?"body":"html")){var j=a.$.getBoundingClientRect();o.x=j.left;o.y=j.top}j=a.getWindow();if(!j.equals(b)){j=n(CKEDITOR.dom.element.get(j.$.frameElement),b);o.x=o.x+j.x;o.y=o.y+j.y}return o}function o(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());k=a.getDocument();var l=k.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=l?k.getBody():k.getDocumentElement());k=a.getWindow();g=n(this,k);var j=n(a,k),q=this.$.offsetHeight;
+d=this.$.offsetWidth;var y=a.$.clientHeight,z=a.$.clientWidth;k=g.x-o(this,"left")-j.x||0;h=g.y-o(this,"top")-j.y||0;d=g.x+d+o(this,"right")-(j.x+z)||0;g=g.y+q+o(this,"bottom")-(j.y+y)||0;if(h<0||g>0)m(0,b===true?h:b===false?g:h<0?h:g);if(c&&(k<0||d>0))m(k<0?k:d,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");
+break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},
+copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},d=0;d<c.length;d++){var g=c[d],k=g.nodeName.toLowerCase(),h;if(!(k in b))if(k=="checked"&&(h=this.getAttribute(k)))a.setAttribute(k,h);else if(g.specified||CKEDITOR.env.ie&&g.nodeValue&&k=="value"){h=this.getAttribute(k);if(h===null)h=g.nodeValue;a.setAttribute(k,h)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,
+b);this.copyAttributes(a);this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$}},getChild:function(){function a(a,b){var c=a.childNodes;if(b>=0&&b<c.length)return c[b]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",
+function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,
+b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null}});var c={width:["border-left-width","border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,e){if(typeof c=="number"){if(e&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,
+c){var e=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(e=e-b.call(this,a));return e}})();CKEDITOR.dom.documentFragment=function(b){b=b||CKEDITOR.document;this.$=b.type==CKEDITOR.NODE_DOCUMENT?b.$.createDocumentFragment():b};
+CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(b){b=b.$;b.parentNode.insertBefore(this.$,b.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});
+(function(){function b(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,n=c.startContainer;d=c.endContainer;var o=c.startOffset,l=c.endOffset,j,q=this.guard,f=this.type,e=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var i=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),s=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(l):d.getNext();this._.guardLTR=function(a,b){return(!b||!i.equals(a))&&(!s||
+!a.equals(s))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var A=n.type==CKEDITOR.NODE_ELEMENT?n:n.getParent(),B=n.type==CKEDITOR.NODE_ELEMENT?o?n.getChild(o-1):null:n.getPrevious();this._.guardRTL=function(a,b){return(!b||!A.equals(a))&&(!B||!a.equals(B))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var p=a?this._.guardRTL:this._.guardLTR;j=q?function(a,b){return p(a,b)===false?false:q(a,b)}:p;if(this.current)d=this.current[e](false,f,j);else{if(a)d.type==
+CKEDITOR.NODE_ELEMENT&&(d=l>0?d.getChild(l-1):j(d,true)===false?null:d.getPreviousSourceNode(true,f,j));else{d=n;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(o)))d=j(n,true)===false?null:n.getNextSourceNode(true,f,j)}d&&j(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[e](false,f,j)}this.end();return this.current=null}function c(a){for(var c,d=null;c=b.call(this,a);)d=c;return d}
+CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return b.call(this)},previous:function(){return b.call(this,1)},checkForward:function(){return b.call(this,0,1)!==false},checkBackward:function(){return b.call(this,1,1)!==false},lastForward:function(){return c.call(this)},lastBackward:function(){return c.call(this,1)},reset:function(){delete this.current;this._={}}}});var a={block:1,"list-item":1,table:1,"table-row-group":1,
+"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(b){b=b?CKEDITOR.tools.extend({},CKEDITOR.dtd.$block,b||{}):CKEDITOR.dtd.$block;return this.getComputedStyle("float")=="none"&&a[this.getComputedStyle("display")]||b[this.getName()]};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=
+function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var n,o;n=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(o=d.getParent())&&c(o);n=a?n:n||c(d);return!!(b^n)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible=
+function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&&(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!e(a)&&!d(a)}return function(c){var d=!CKEDITOR.env.ie?c.is&&c.is("br"):c.getText&&f.test(c.getText());if(d){d=c.getParent();c=c.getNext(b);d=d.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&
+c.isBlockBoundary())}return!!(a^d)}};var f=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,e=CKEDITOR.dom.walker.whitespaces(),d=CKEDITOR.dom.walker.bookmark();CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(d(a)||e(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty));return a&&(!CKEDITOR.env.ie?a.is&&a.is("br"):a.getText&&f.test(a.getText()))?a:false}})();
+CKEDITOR.dom.range=function(b){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var c=b instanceof CKEDITOR.dom.document;this.document=c?b:b.getDocument();this.root=c?b.getBody():b};
+(function(){function b(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),l=CKEDITOR.dom.walker.bookmark(true),c=CKEDITOR.dom.walker.bogus();return function(q){if(l(q)||b(q))return true;if(c(q)&&!a)return a=true;return q.type==CKEDITOR.NODE_TEXT&&(q.hasAscendant("pre")||CKEDITOR.tools.trim(q.getText()).length)||q.type==CKEDITOR.NODE_ELEMENT&&!q.is(d)?false:true}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),l=CKEDITOR.dom.walker.bookmark(1);return function(c){return l(c)||b(c)?true:!a&&g(c)||
+c.type==CKEDITOR.NODE_ELEMENT&&c.is(CKEDITOR.dtd.$removeEmpty)}}function a(a){return!k(a)&&!h(a)}var f=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},e=function(a,b,l,c){a.optimizeBookmark();var d=a.startContainer,g=a.endContainer,f=a.startOffset,i=a.endOffset,e,k;if(g.type==CKEDITOR.NODE_TEXT)g=g.split(i);else if(g.getChildCount()>0)if(i>=g.getChildCount()){g=g.append(a.document.createText(""));k=true}else g=g.getChild(i);
+if(d.type==CKEDITOR.NODE_TEXT){d.split(f);d.equals(g)&&(g=d.getNext())}else if(f)if(f>=d.getChildCount()){d=d.append(a.document.createText(""));e=true}else d=d.getChild(f).getPrevious();else{d=d.append(a.document.createText(""),1);e=true}var f=d.getParents(),i=g.getParents(),h,p,m;for(h=0;h<f.length;h++){p=f[h];m=i[h];if(!p.equals(m))break}for(var u=l,r,D,v,t=h;t<f.length;t++){r=f[t];u&&!r.equals(d)&&(D=u.append(r.clone()));for(r=r.getNext();r;){if(r.equals(i[t])||r.equals(g))break;v=r.getNext();
+if(b==2)u.append(r.clone(true));else{r.remove();b==1&&u.append(r)}r=v}u&&(u=D)}u=l;for(l=h;l<i.length;l++){r=i[l];b>0&&!r.equals(g)&&(D=u.append(r.clone()));if(!f[l]||r.$.parentNode!=f[l].$.parentNode)for(r=r.getPrevious();r;){if(r.equals(f[l])||r.equals(d))break;v=r.getPrevious();if(b==2)u.$.insertBefore(r.$.cloneNode(true),u.$.firstChild);else{r.remove();b==1&&u.$.insertBefore(r.$,u.$.firstChild)}r=v}u&&(u=D)}if(b==2){p=a.startContainer;if(p.type==CKEDITOR.NODE_TEXT){p.$.data=p.$.data+p.$.nextSibling.data;
+p.$.parentNode.removeChild(p.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(p&&m&&(d.$.parentNode!=p.$.parentNode||g.$.parentNode!=m.$.parentNode)){b=m.getIndex();e&&m.$.parentNode==d.$.parentNode&&b--;if(c&&p.type==CKEDITOR.NODE_ELEMENT){c=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>',a.document);c.insertAfter(p);p.mergeSiblings(false);
+a.moveToBookmark({startNode:c})}else a.setStart(m.getParent(),b)}a.collapse(true)}e&&d.remove();k&&g.$.parentNode&&g.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},g=CKEDITOR.dom.walker.bogus(),k=new CKEDITOR.dom.walker.whitespaces,h=new CKEDITOR.dom.walker.bookmark,m=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/;CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);
+a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,2,a);return a},deleteContents:function(a){this.collapsed||
+e(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,1,b,a);return b},createBookmark:function(a){var b,l,c,d,g=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){c="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",c+(g?"C":"S"))}if(!g){l=b.clone();l.setHtml("&nbsp;");a&&l.setAttribute("id",c+"E");d=this.clone();d.collapse();d.insertNode(l)}d=
+this.clone();d.collapse(true);d.insertNode(b);if(l){this.setStartAfter(b);this.setEndBefore(l)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?c+(g?"C":"S"):b,endNode:a?c+"E":l,serializable:a,collapsed:g}},createBookmark2:function(a){var b=this.startContainer,l=this.endContainer,c=this.startOffset,d=this.endOffset,g=this.collapsed,f,i;if(!b||!l)return{start:0,end:0};if(a){if(b.type==CKEDITOR.NODE_ELEMENT){if((f=b.getChild(c))&&f.type==CKEDITOR.NODE_TEXT&&c>0&&f.getPrevious().type==
+CKEDITOR.NODE_TEXT){b=f;c=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(c=f.getIndex(1))}for(;b.type==CKEDITOR.NODE_TEXT&&(i=b.getPrevious())&&i.type==CKEDITOR.NODE_TEXT;){b=i;c=c+i.getLength()}if(!g){if(l.type==CKEDITOR.NODE_ELEMENT){if((f=l.getChild(d))&&f.type==CKEDITOR.NODE_TEXT&&d>0&&f.getPrevious().type==CKEDITOR.NODE_TEXT){l=f;d=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(d=f.getIndex(1))}for(;l.type==CKEDITOR.NODE_TEXT&&(i=l.getPrevious())&&i.type==CKEDITOR.NODE_TEXT;){l=i;d=d+i.getLength()}}}return{start:b.getAddress(a),
+end:g?null:l.getAddress(a),startOffset:c,endOffset:d,normalized:a,collapsed:g,is2:true}},moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),l=a.startOffset,c=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,l);c?this.setEnd(c,a):this.collapse(true)}else{b=(l=a.serializable)?this.document.getById(a.startNode):a.startNode;a=l?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);
+a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,l=this.startOffset,c=this.endOffset,d;if(a.type==CKEDITOR.NODE_ELEMENT){d=a.getChildCount();if(d>l)a=a.getChild(l);else if(d<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){d=b.getChildCount();if(d>c)b=b.getChild(c).getPreviousSourceNode(true);else if(d<1)b=b.getPreviousSourceNode();
+else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var l=this.startContainer,c=this.endContainer,l=l.equals(c)?a&&l.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?l.getChild(this.startOffset):l:l.getCommonAncestor(c);return b&&!l.is?l.getParent():l},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=
+a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,
+j=this.startOffset,d=this.collapsed;if((!a||d)&&c&&c.type==CKEDITOR.NODE_TEXT){if(j)if(j>=c.getLength()){j=c.getIndex()+1;c=c.getParent()}else{var g=c.split(j),j=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(g,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{j=c.getIndex();c=c.getParent()}this.setStart(c,j);if(d){this.collapse(true);return}}c=this.endContainer;j=this.endOffset;if(!b&&!d&&c&&c.type==
+CKEDITOR.NODE_TEXT){if(j){j>=c.getLength()||c.split(j);j=c.getIndex()+1}else j=c.getIndex();c=c.getParent();this.setEnd(c,j)}},enlarge:function(a,b){switch(a){case CKEDITOR.ENLARGE_INLINE:var c=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var j=this.getCommonAncestor(),d=this.root,g,f,i,e,h,k=false,p,m;p=this.startContainer;m=this.startOffset;if(p.type==CKEDITOR.NODE_TEXT){if(m){p=!CKEDITOR.tools.trim(p.substring(0,m)).length&&p;k=!!p}if(p&&!(e=p.getPrevious()))i=p.getParent()}else{m&&
+(e=p.getChild(m-1)||p.getLast());e||(i=p)}for(;i||e;){if(i&&!e){!h&&i.equals(j)&&(h=true);if(c?i.isBlockBoundary():!d.contains(i))break;if(!k||i.getComputedStyle("display")!="inline"){k=false;h?g=i:this.setStartBefore(i)}e=i.getPrevious()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_COMMENT)e=e.getPrevious();else{if(e.type==CKEDITOR.NODE_TEXT){m=e.getText();/[^\s\ufeff]/.test(m)&&(e=null);p=/[\s\ufeff]$/.test(m)}else if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){m=
+e.getText();if(/[^\s\ufeff]/.test(m))e=null;else for(var u=e.$.getElementsByTagName("*"),r=0,D;D=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[D.nodeName.toLowerCase()]){e=null;break}e&&(p=!!m.length)}else e=null;p&&(k?h?g=i:i&&this.setStartBefore(i):k=true);if(e){p=e.getPrevious();if(!i&&!p){i=e;e=null;break}e=p}else i=null}}i&&(i=i.getParent())}p=this.endContainer;m=this.endOffset;i=e=null;h=k=false;if(p.type==CKEDITOR.NODE_TEXT){p=!CKEDITOR.tools.trim(p.substring(m)).length&&p;k=!(p&&p.getLength());if(p&&
+!(e=p.getNext()))i=p.getParent()}else(e=p.getChild(m))||(i=p);for(;i||e;){if(i&&!e){!h&&i.equals(j)&&(h=true);if(c?i.isBlockBoundary():!d.contains(i))break;if(!k||i.getComputedStyle("display")!="inline"){k=false;h?f=i:i&&this.setEndAfter(i)}e=i.getNext()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_TEXT){m=e.getText();/[^\s\ufeff]/.test(m)&&(e=null);p=/^[\s\ufeff]/.test(m)}else if(e.type==CKEDITOR.NODE_ELEMENT){if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){m=
+e.getText();if(/[^\s\ufeff]/.test(m))e=null;else{u=e.$.getElementsByTagName("*");for(r=0;D=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[D.nodeName.toLowerCase()]){e=null;break}}e&&(p=!!m.length)}else e=null}else p=1;p&&k&&(h?f=i:this.setEndAfter(i));if(e){p=e.getNext();if(!i&&!p){i=e;e=null;break}e=p}else i=null}i&&(i=i.getParent())}if(g&&f){j=g.contains(f)?f:g;this.setStartBefore(j);this.setEndAfter(j)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:i=new CKEDITOR.dom.range(this.root);
+d=this.root;i.setStartAt(d,CKEDITOR.POSITION_AFTER_START);i.setEnd(this.startContainer,this.startOffset);i=new CKEDITOR.dom.walker(i);var v,t,w=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),I=function(a){var b=w(a);b||(v=a);return b},c=function(a){var b=I(a);!b&&(a.is&&a.is("br"))&&(t=a);return b};i.guard=I;i=i.lastBackward();v=v||d;this.setStartAt(v,!v.is("br")&&(!i&&this.checkStartOfBlock()||i&&v.contains(i))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);
+if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){i=this.clone();i=new CKEDITOR.dom.walker(i);var G=CKEDITOR.dom.walker.whitespaces(),C=CKEDITOR.dom.walker.bookmark();i.evaluator=function(a){return!G(a)&&!C(a)};if((i=i.previous())&&i.type==CKEDITOR.NODE_ELEMENT&&i.is("br"))break}i=this.clone();i.collapse();i.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);i=new CKEDITOR.dom.walker(i);i.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?c:I;v=null;i=i.lastForward();v=v||d;this.setEndAt(v,!i&&this.checkEndOfBlock()||i&&
+v.contains(i)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);t&&this.setEndAfter(t)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,j=this.clone(),d=this.startContainer,g=this.endContainer,f=this.startOffset,e=this.endOffset,k=1,h=1;if(d&&d.type==CKEDITOR.NODE_TEXT)if(f)if(f>=d.getLength())j.setStartAfter(d);else{j.setStartBefore(d);k=0}else j.setStartBefore(d);if(g&&g.type==CKEDITOR.NODE_TEXT)if(e)if(e>=g.getLength())j.setEndAfter(g);else{j.setEndAfter(g);
+h=0}else j.setEndBefore(g);var j=new CKEDITOR.dom.walker(j),m=CKEDITOR.dom.walker.bookmark();j.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;j.guard=function(b,j){if(m(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||j&&b.equals(p)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary())return false;!j&&b.type==CKEDITOR.NODE_ELEMENT&&(p=b);return true};if(k)(d=j[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":
+"next"]())&&this.setStartAt(d,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(h){j.reset();(j=j[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(j,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!k&&!h)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},
+moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer=
+a;this.endOffset=b}f(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset=b}f(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),
+a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}f(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==
+CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}f(this)},fixBlock:function(a,b){var c=this.createBookmark(),j=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(j);j.trim();CKEDITOR.env.ie||j.appendBogus();this.insertNode(j);this.moveToBookmark(c);return j},splitBlock:function(a){var b=
+new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),j=b.block,d=c.block,g=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!j){j=this.fixBlock(true,a);d=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}d||(d=this.fixBlock(false,a))}a=j&&this.checkStartOfBlock();b=d&&this.checkEndOfBlock();this.deleteContents();if(j&&j.equals(d))if(b){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root);
+this.moveToPosition(d,CKEDITOR.POSITION_AFTER_END);d=null}else if(a){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(j,CKEDITOR.POSITION_BEFORE_START);j=null}else{d=this.splitElement(j);!CKEDITOR.env.ie&&!j.is("ul","ol")&&j.appendBogus()}return{previousBlock:j,nextBlock:d,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:g}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);
+b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(j){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||j.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),l=this[b?"endPath":"startPath"](),d=l.block||l.blockLimit,o;d&&!d.equals(l.root)&&!d.getFirst(a(d));){o=
+d.getParent();this[b?"setEndAt":"setStartAt"](d,CKEDITOR.POSITION_AFTER_END);d.remove(1);d=o}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var l=b==CKEDITOR.START,d=this.clone();d.collapse(l);d[l?"setStartAt":"setEndAt"](a,l?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d);
+d.evaluator=c(l);return d[l?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.ltrim(a.substring(0,c));m.test(a)&&this.trim(0,1)}this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(true);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=
+this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.rtrim(a.substring(c));m.test(a)&&this.trim(1,0)}this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);
+c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=
+b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(b,c){if(b.type==CKEDITOR.NODE_ELEMENT&&!b.isEditable(false)){this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var l=0;b;){if(b.type==CKEDITOR.NODE_TEXT){c&&this.checkEndOfBlock()&&m.test(b.getText())?this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:
+CKEDITOR.POSITION_BEFORE_START);l=1;break}if(b.type==CKEDITOR.NODE_ELEMENT)if(b.isEditable()){this.moveToPosition(b,c?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);l=1}else c&&(b.is("br")&&this.checkEndOfBlock())&&this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);var d=b,g=l,f=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(f=d[c?"getLast":"getFirst"](a));!g&&!f&&(f=d[c?"getPrevious":"getNext"](a));b=f}return!!l},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},
+moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=
+this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,g=this.clone();g.optimize();if(d=g.startContainer.type==CKEDITOR.NODE_TEXT){c=g.startContainer.getText();b=g.startContainer.split(g.startOffset);
+a.insertAfter(g.startContainer)}else g.insertNode(a);a.scrollIntoView();if(d){g.startContainer.setText(c);b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;
+(function(){function b(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function c(a,b,c){for(a=a.getNextSourceNode(b,null,c);!f(a);)a=a.getNextSourceNode(b,null,c);return a}var a=/^[\r\n\t ]+$/,f=CKEDITOR.dom.walker.bookmark(false,true),e=CKEDITOR.dom.walker.whitespaces(true),d=function(a){return f(a)&&e(a)};b.prototype={getNextParagraph:function(b){b=b||"p";if(!CKEDITOR.dtd[this.range.root.getName()][b])return null;var e,
+h,m,n,o,l;if(!this._.started){h=this.range.clone();h.shrink(CKEDITOR.NODE_ELEMENT,true);n=h.endContainer.hasAscendant("pre",true)||h.startContainer.hasAscendant("pre",true);h.enlarge(this.forceBrBreak&&!n||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!h.collapsed){n=new CKEDITOR.dom.walker(h.clone());var j=CKEDITOR.dom.walker.bookmark(true,true);n.evaluator=j;this._.nextNode=n.next();n=new CKEDITOR.dom.walker(h.clone());n.evaluator=j;n=n.previous();this._.lastNode=
+n.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){j=this.range.clone();j.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(j.checkEndOfBlock()){j=new CKEDITOR.dom.elementPath(j.endContainer,j.root);this._.lastNode=(j.block||j.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode){this._.lastNode=this._.docEndMarker=h.document.createText("");this._.lastNode.insertAfter(n)}h=
+null}this._.started=1}j=this._.nextNode;n=this._.lastNode;for(this._.nextNode=null;j;){var q=0,y=j.hasAscendant("pre"),z=j.type!=CKEDITOR.NODE_ELEMENT,i=0;if(z)j.type==CKEDITOR.NODE_TEXT&&a.test(j.getText())&&(z=0);else{var s=j.getName();if(j.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){if(s=="br")z=1;else if(!h&&!j.getChildCount()&&s!="hr"){e=j;m=j.equals(n);break}if(h){h.setEndAt(j,CKEDITOR.POSITION_BEFORE_START);if(s!="br")this._.nextNode=j}q=1}else{if(j.getFirst()){if(!h){h=this.range.clone();
+h.setStartAt(j,CKEDITOR.POSITION_BEFORE_START)}j=j.getFirst();continue}z=1}}if(z&&!h){h=this.range.clone();h.setStartAt(j,CKEDITOR.POSITION_BEFORE_START)}m=(!q||z)&&j.equals(n);if(h&&!q)for(;!j.getNext(d)&&!m;){s=j.getParent();if(s.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){q=1;z=0;m||s.equals(n);h.setEndAt(s,CKEDITOR.POSITION_BEFORE_END);break}j=s;z=1;m=j.equals(n);i=1}z&&h.setEndAt(j,CKEDITOR.POSITION_AFTER_END);j=c(j,i,n);if((m=!j)||q&&h)break}if(!e){if(!h){this._.docEndMarker&&this._.docEndMarker.remove();
+return this._.nextNode=null}e=new CKEDITOR.dom.elementPath(h.startContainer,h.root);j=e.blockLimit;q={div:1,th:1,td:1};e=e.block;if(!e&&j&&!this.enforceRealBlocks&&q[j.getName()]&&h.checkStartOfBlock()&&h.checkEndOfBlock()&&!j.equals(h.root))e=j;else if(!e||this.enforceRealBlocks&&e.getName()=="li"){e=this.range.document.createElement(b);h.extractContents().appendTo(e);e.trim();h.insertNode(e);o=l=true}else if(e.getName()!="li"){if(!h.checkStartOfBlock()||!h.checkEndOfBlock()){e=e.clone(false);h.extractContents().appendTo(e);
+e.trim();l=h.splitBlock();o=!l.wasStartOfBlock;l=!l.wasEndOfBlock;h.insertNode(e)}}else if(!m)this._.nextNode=e.equals(n)?null:c(h.getBoundaryNodes().endNode,1,n)}if(o)(h=e.getPrevious())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.getName()=="br"?h.remove():h.getLast()&&h.getLast().$.nodeName.toLowerCase()=="br"&&h.getLast().remove());if(l)(h=e.getLast())&&h.type==CKEDITOR.NODE_ELEMENT&&h.getName()=="br"&&(CKEDITOR.env.ie||h.getPrevious(f)||h.getNext(f))&&h.remove();if(!this._.nextNode)this._.nextNode=m||
+e.equals(n)||!n?null:c(e,1,n);return e}};CKEDITOR.dom.range.prototype.createIterator=function(){return new b(this)}})();
+CKEDITOR.command=function(b,c){this.uiItems=[];this.exec=function(a){if(this.state==CKEDITOR.TRISTATE_DISABLED)return false;this.editorFocus&&b.focus();return this.fire("exec")===false?true:c.exec.call(this,b,a)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}this.enable();return this.fire("refresh",{editor:a,path:b})===false?true:c.refresh&&c.refresh.apply(this,arguments)!==false};CKEDITOR.tools.extend(this,
+c,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!c.context,state:CKEDITOR.TRISTATE_OFF});CKEDITOR.event.call(this)};
+CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(b){if(this.state==b)return false;this.previousState=this.state;this.state=b;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&
+this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;
+CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};
+(function(){CKEDITOR.focusManager=function(b){if(b.focusManager)return b.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:b};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(){this._.timer&&clearTimeout(this._.timer);if(!this.hasFocus&&!this._.locked){var b=CKEDITOR.currentInstance;b&&b.focusManager.blur(1);this.hasFocus=true;(b=this._.editor.container)&&b.addClass("cke_focus");this._.editor.fire("focus")}},lock:function(){this._.locked=
+1},unlock:function(){delete this._.locked},blur:function(b){function c(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var a=CKEDITOR.focusManager._.blurDelay;b||!a?c.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;c.call(this)},a,this)}},add:function(b,c){var a=b.getCustomData("focusmanager");if(!a||a!=this){a&&a.remove(b);var a=
+"focus",f="blur";if(c)if(CKEDITOR.env.ie){a="focusin";f="focusout"}else CKEDITOR.event.useCapture=1;var e={blur:function(){b.equals(this.currentActive)&&this.blur()},focus:function(){this.currentActive=b;this.focus()}};b.on(a,e.focus,this);b.on(f,e.blur,this);if(c)CKEDITOR.event.useCapture=0;b.setCustomData("focusmanager",this);b.setCustomData("focusmanager_handlers",e)}},remove:function(b){b.removeCustomData("focusmanager");var c=b.removeCustomData("focusmanager_handlers");b.removeListener("blur",
+c.blur);b.removeListener("focus",c.focus)}}})();CKEDITOR.keystrokeHandler=function(b){if(b.keystrokeHandler)return b.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:b};return this};
+(function(){var b,c=function(a){var a=a.data,c=a.getKeystroke(),d=this.keystrokes[c],g=this._.editor;b=g.fire("key",{keyCode:c})===false;if(!b){d&&(b=g.execCommand(d,{from:"keystrokeHandler"})!==false);b||(b=!!this.blockedKeystrokes[c])}b&&a.preventDefault(true);return!b},a=function(a){if(b){b=false;a.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(b){b.on("keydown",c,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)b.on("keypress",a,this)}}})();
+(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,sk:1,sl:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,"zh-cn":1,zh:1},load:function(b,c,a){if(!b||!CKEDITOR.lang.languages[b])b=this.detect(c,b);this[b]?a(b,this[b]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+
+b+".js"),function(){a(b,this[b])},this)},detect:function(b,c){var a=this.languages,c=c||navigator.userLanguage||navigator.language||b,f=c.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=f[1],f=f[2];a[e+"-"+f]?e=e+"-"+f:a[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||b}}})();
+CKEDITOR.scriptLoader=function(){var b={},c={};return{load:function(a,f,e,d){var g=typeof a=="string";g&&(a=[a]);e||(e=CKEDITOR);var k=a.length,h=[],m=[],n=function(a){f&&(g?f.call(e,a):f.call(e,h,m))};if(k===0)n(true);else{var o=function(a,b){(b?h:m).push(a);if(--k<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");n(b)}},l=function(a,l){b[a]=1;var d=c[a];delete c[a];for(var j=0;j<d.length;j++)d[j](a,l)},j=function(a){if(b[a])o(a,true);else{var d=c[a]||(c[a]=[]);d.push(o);if(!(d.length>
+1)){var j=new CKEDITOR.dom.element("script");j.setAttributes({type:"text/javascript",src:a});if(f)if(CKEDITOR.env.ie)j.$.onreadystatechange=function(){if(j.$.readyState=="loaded"||j.$.readyState=="complete"){j.$.onreadystatechange=null;l(a,true)}};else{j.$.onload=function(){setTimeout(function(){l(a,true)},0)};j.$.onerror=function(){l(a,false)}}j.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var q=0;q<k;q++)j(a[q])}}}}();
+CKEDITOR.resourceManager=function(b,c){this.basePath=b;this.fileName=c;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};
+CKEDITOR.resourceManager.prototype={add:function(b,c){if(this.registered[b])throw'[CKEDITOR.resourceManager.add] The resource name "'+b+'" is already registered.';var a=this.registered[b]=c||{};a.name=b;a.path=this.getPath(b);CKEDITOR.fire(b+CKEDITOR.tools.capitalize(this.fileName)+"Ready",a);return this.get(b)},get:function(b){return this.registered[b]||null},getPath:function(b){var c=this.externals[b];return CKEDITOR.getUrl(c&&c.dir||this.basePath+b+"/")},getFilePath:function(b){var c=this.externals[b];
+return CKEDITOR.getUrl(this.getPath(b)+(c&&typeof c.file=="string"?c.file:this.fileName+".js"))},addExternal:function(b,c,a){for(var b=b.split(","),f=0;f<b.length;f++)this.externals[b[f]]={dir:c,file:a}},load:function(b,c,a){CKEDITOR.tools.isArray(b)||(b=b?[b]:[]);for(var f=this.loaded,e=this.registered,d=[],g={},k={},h=0;h<b.length;h++){var m=b[h];if(m)if(!f[m]&&!e[m]){var n=this.getFilePath(m);d.push(n);n in g||(g[n]=[]);g[n].push(m)}else k[m]=this.get(m)}CKEDITOR.scriptLoader.load(d,function(b,
+l){if(l.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+g[l[0]].join(",")+'" was not found at "'+l[0]+'".';for(var d=0;d<b.length;d++)for(var e=g[b[d]],h=0;h<e.length;h++){var m=e[h];k[m]=this.get(m);f[m]=1}c.call(a,k)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin");
+CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(b){var c={};return function(a,f,e){var d={},g=function(a){b.call(this,a,function(a){CKEDITOR.tools.extend(d,a);var b=[],k;for(k in a){var o=a[k],l=o&&o.requires;if(!c[k]){if(o.icons)for(var j=o.icons.split(","),q=0;q<j.length;q++)CKEDITOR.skin.addIcon(j[q],o.path+"icons/"+j[q]+".png");c[k]=1}if(l){l.split&&(l=l.split(","));for(o=0;o<l.length;o++)d[l[o]]||b.push(l[o])}}if(b.length)g.call(this,b);else{for(k in d){o=d[k];if(o.onLoad&&
+!o.onLoad._called){o.onLoad()===false&&delete d[k];o.onLoad._called=1}}f&&f.call(e||window,d)}},this)};g.call(this,a)}});CKEDITOR.plugins.setLang=function(b,c,a){var f=this.get(b),b=f.langEntries||(f.langEntries={}),f=f.lang||(f.lang=[]);f.split&&(f=f.split(","));CKEDITOR.tools.indexOf(f,c)==-1&&f.push(c);b[c]=a};CKEDITOR.ui=function(b){if(b.ui)return b.ui;this.items={};this.instances={};this.editor=b;this._={handlers:{}};return this};
+CKEDITOR.ui.prototype={add:function(b,c,a){a.name=b.toLowerCase();var f=this.items[b]={type:c,command:a.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(f,a)},get:function(b){return this.instances[b]},create:function(b){var c=this.items[b],a=c&&this._.handlers[c.type],f=c&&c.command&&this.editor.getCommand(c.command),a=a&&a.create.apply(this,c.args);this.instances[b]=a;f&&f.uiItems.push(a);if(a&&!a.type)a.type=c.type;return a},addHandler:function(b,c){this._.handlers[b]=
+c},space:function(b){return CKEDITOR.document.getById(this.spaceId(b))},spaceId:function(b){return this.editor.id+"_"+b}};CKEDITOR.event.implementOn(CKEDITOR.ui);
+(function(){function b(b,j,o){CKEDITOR.event.call(this);b=b&&CKEDITOR.tools.clone(b);if(j!==void 0){if(j instanceof CKEDITOR.dom.element){if(!o)throw Error("One of the element mode must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&o==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(o==CKEDITOR.ELEMENT_MODE_INLINE&&!j.is(CKEDITOR.dtd.$editable)||o==CKEDITOR.ELEMENT_MODE_REPLACE&&
+j.is(CKEDITOR.dtd.$nonBodyContent))throw Error('The specified element mode is not supported on element: "'+j.getName()+'".');this.element=j;this.elementMode=o;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(j.getId()||j.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||c();this.id=CKEDITOR.tools.getNextId();this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);this.focusManager=
+new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("mode",a);this.on("readOnly",a);this.on("selectionChange",f);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){d(this,b)},0,this)}function c(){do var a="editor"+ ++n;while(CKEDITOR.instances[a]);return a}function a(){var a,b=this.commands,c=this.mode;if(c)for(var d in b){a=b[d];
+a[a.startDisabled?"disable":this.readOnly&&!a.readOnly?"disable":a.modes[c]?"enable":"disable"]()}}function f(a){var b=this.commands,c=a.editor,d=a.data.path,o;for(o in b){a=b[o];a.contextSensitive&&a.refresh(c,d)}}function e(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=o[b]||(o[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b||!e(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.load(b,function(){c.fn=CKEDITOR.editorConfig?
+CKEDITOR.editorConfig:function(){};e(a)});return true}function d(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}a.readOnly=!(!a.config.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.isReadOnly():a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.getAttribute("disabled")));a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&!CKEDITOR.dtd[a.element.getName()].p;a.tabIndex=
+a.config.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;if(a.config.skin)CKEDITOR.skinName=a.config.skin;a.fireOnce("configLoaded");a.dataProcessor=new CKEDITOR.htmlDataProcessor(a);g(a)});if(b&&b.customConfig!=void 0)a.config.customConfig=b.customConfig;e(a)||a.fireOnce("customConfigLoaded")}function g(a){CKEDITOR.skin.loadPart("editor",function(){k(a)})}function k(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);
+if(CKEDITOR.env.gecko&&CKEDITOR.env.version<10900&&a.lang.dir=="rtl")a.lang.dir="ltr";if(!a.config.contentsLangDirection)a.config.contentsLangDirection=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");h(a)})}function h(a){var b=a.config,c=b.plugins,d=b.extraPlugins,o=b.removePlugins;if(d)var e=RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(e,""),c=c+(","+d);if(o)var g=RegExp("(?:^|,)(?:"+o.replace(/\s*,\s*/g,"|")+")(?=,|$)",
+"g"),c=c.replace(g,"");CKEDITOR.env.air&&(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],o=[],e=[];a.plugins=c;for(var f in c){var i=c[f],h=i.lang,q=null,t=i.requires,k;CKEDITOR.tools.isArray(t)&&(t=t.join(","));if(t&&(k=t.match(g)))for(;t=k.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",","")+'" cannot be removed from the plugins list, because it\'s required by "'+b+'" plugin.');},0,null,[t,f]);if(h&&!a.lang[f]){h.split&&(h=h.split(","));
+if(CKEDITOR.tools.indexOf(h,a.langCode)>=0)q=a.langCode;else{q=a.langCode.replace(/-.*/,"");q=q!=a.langCode&&CKEDITOR.tools.indexOf(h,q)>=0?q:CKEDITOR.tools.indexOf(h,"en")>=0?"en":h[0]}if(!i.langEntries||!i.langEntries[q])e.push(CKEDITOR.getUrl(i.path+"lang/"+q+".js"));else{a.lang[f]=i.langEntries[q];q=null}}o.push(q);d.push(i)}CKEDITOR.scriptLoader.load(e,function(){for(var c=["beforeInit","init","afterInit"],e=0;e<c.length;e++)for(var g=0;g<d.length;g++){var f=d[g];e===0&&(o[g]&&f.lang&&f.langEntries)&&
+(a.lang[f.name]=f.langEntries[o[g]]);if(f[c[e]])f[c[e]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(g=0;g<a.config.blockedKeystrokes.length;g++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[g]]=1;a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function m(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?
+a.setValue(b):a.setHtml(b);return true}return false}b.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=b;var n=0,o={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){return this.commands[a]=new CKEDITOR.command(this,b)},destroy:function(a){this.fire("beforeDestroy");!a&&m.call(this);this.editable(null);this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed",null,this)},elementPath:function(a){return(a=a||this.getSelection().getStartElement())?
+new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&this.fire("beforeCommandExec",d)!==true){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",d)!==true)return d.returnValue}return false},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&
+this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a=b.is("textarea")?b.getValue():b.getHtml())}return a},loadSnapshot:function(a){this.fire("loadSnapshot",a)},
+setData:function(a,b,c){if(b)this.on("dataReady",function(a){a.removeListener();b.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=a==void 0||a;if(this.readOnly!=a){this.readOnly=a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})},insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",
+a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return m.call(this)},setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c,d,o=b.length;o--;){c=b[o];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}}})})();
+CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}};
+(function(){var b=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,c={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(a){for(var f,e,d=0,g;f=this._.htmlPartsRegex.exec(a);){e=f.index;if(e>d){d=a.substring(d,e);if(g)g.push(d);else this.onText(d)}d=
+this._.htmlPartsRegex.lastIndex;if(e=f[1]){e=e.toLowerCase();if(g&&CKEDITOR.dtd.$cdata[e]){this.onCDATA(g.join(""));g=null}if(!g){this.onTagClose(e);continue}}if(g)g.push(f[0]);else if(e=f[3]){e=e.toLowerCase();if(!/="/.test(e)){var k={},h;f=f[4];var m=!!(f&&f.charAt(f.length-1)=="/");if(f)for(;h=b.exec(f);){var n=h[1].toLowerCase();h=h[2]||h[3]||h[4]||"";k[n]=!h&&c[n]?n:h}this.onTagOpen(e,k,m);!g&&CKEDITOR.dtd.$cdata[e]&&(g=[])}}else if(e=f[2])this.onComment(e)}if(a.length>d)this.onText(a.substring(d,
+a.length))}}})();
+CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(b){this._.output.push("<",b)},openTagClose:function(b,c){c?this._.output.push(" />"):this._.output.push(">")},attribute:function(b,c){typeof c=="string"&&(c=CKEDITOR.tools.htmlEncodeAttr(c));this._.output.push(" ",b,'="',c,'"')},closeTag:function(b){this._.output.push("</",b,">")},text:function(b){this._.output.push(b)},comment:function(b){this._.output.push("<\!--",b,"--\>")},write:function(b){this._.output.push(b)},
+reset:function(){this._.output=[];this._.indent=false},getHtml:function(b){var c=this._.output.join("");b&&this.reset();return c}}});CKEDITOR.htmlParser.comment=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.comment.prototype={type:CKEDITOR.NODE_COMMENT,writeHtml:function(b,c){var a=this.value;if(c){if(!(a=c.onComment(a,this)))return;if(typeof a!="string"){a.parent=this.parent;a.writeHtml(b,c);return}}b.comment(a)}};
+(function(){CKEDITOR.htmlParser.text=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b,c){var a=this.value;(!c||(a=c.onText(a,this)))&&b.text(a)}}})();(function(){CKEDITOR.htmlParser.cdata=function(b){this.value=b};CKEDITOR.htmlParser.cdata.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b){b.write(this.value)}}})();
+CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}};
+(function(){function b(a){return a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var c=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),a={ol:1,ul:1},f=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(e,d,g){function k(a){var b;if(y.length>0)for(var c=0;c<y.length;c++){var d=y[c],l=d.name,o=CKEDITOR.dtd[l],j=i.name&&
+CKEDITOR.dtd[i.name];if((!j||j[l])&&(!a||!o||o[a]||!CKEDITOR.dtd[a])){if(!b){h();b=1}d=d.clone();d.parent=i;i=d;y.splice(c,1);c--}else if(l==i.name){n(i,i.parent,1);c--}}}function h(){for(;z.length;)n(z.shift(),i)}function m(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?c.value=d:a.children.length=b-1}}function n(a,c,d){var c=c||i||q,l=i;if(a.previous===void 0){if(o(c,a)){i=c;
+j.onTagOpen(g,{});a.returnPoint=c=i}m(a);(!b(a)||a.children.length)&&c.add(a);a.name=="pre"&&(A=false);a.name=="textarea"&&(s=false)}if(a.returnPoint){i=a.returnPoint;delete a.returnPoint}else i=d?c:l}function o(a,b){if((a==q||a.name=="body")&&g&&(!a.name||CKEDITOR.dtd[a.name][g])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function l(a,b){return a in CKEDITOR.dtd.$listItem||
+a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var j=new CKEDITOR.htmlParser,q=d instanceof CKEDITOR.htmlParser.element?d:typeof d=="string"?new CKEDITOR.htmlParser.element(d):new CKEDITOR.htmlParser.fragment,y=[],z=[],i=q,s=q.name=="textarea",A=q.name=="pre";j.onTagOpen=function(d,o,g,e){o=new CKEDITOR.htmlParser.element(d,o);if(o.isUnknown&&g)o.isEmpty=true;o.isOptionalClose=e;if(b(o))y.push(o);else{if(d=="pre")A=true;else{if(d=="br"&&A){i.add(new CKEDITOR.htmlParser.text("\n"));
+return}d=="textarea"&&(s=true)}if(d=="br")z.push(o);else{for(;;){e=(g=i.name)?CKEDITOR.dtd[g]||(i._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):f;if(!o.isUnknown&&!i.isUnknown&&!e[d])if(i.isOptionalClose)j.onTagClose(g);else if(d in a&&g in a){g=i.children;(g=g[g.length-1])&&g.name=="li"||n(g=new CKEDITOR.htmlParser.element("li"),i);!o.returnPoint&&(o.returnPoint=i);i=g}else if(d in CKEDITOR.dtd.$listItem&&!l(d,g))j.onTagOpen(d=="li"?"ul":"dl",{},0,1);else if(g in c&&!l(d,g)){!o.returnPoint&&
+(o.returnPoint=i);i=i.parent}else{g in CKEDITOR.dtd.$inline&&y.unshift(i);if(i.parent)n(i,i.parent,1);else{o.isOrphan=1;break}}else break}k(d);h();o.parent=i;o.isEmpty?n(o):i=o}}};j.onTagClose=function(a){for(var b=y.length-1;b>=0;b--)if(a==y[b].name){y.splice(b,1);return}for(var c=[],d=[],o=i;o!=q&&o.name!=a;){o._.isBlockLike||d.unshift(o);c.push(o);o=o.returnPoint||o.parent}if(o!=q){for(b=0;b<c.length;b++){var l=c[b];n(l,l.parent)}i=o;o._.isBlockLike&&h();n(o,o.parent);if(o==i)i=i.parent;y=y.concat(d)}a==
+"body"&&(g=false)};j.onText=function(b){if((!i._.hasInlineStarted||z.length)&&!A&&!s){b=CKEDITOR.tools.ltrim(b);if(b.length===0)return}var d=i.name,l=d?CKEDITOR.dtd[d]||(i._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):f;if(!s&&!l["#"]&&d in c){j.onTagOpen(d in a?"li":d=="dl"?"dd":d=="table"?"tr":d=="tr"?"td":"");j.onText(b)}else{h();k();!A&&!s&&(b=b.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));b=new CKEDITOR.htmlParser.text(b);if(o(i,b))this.onTagOpen(g,{},0,1);i.add(b)}};j.onCDATA=function(a){i.add(new CKEDITOR.htmlParser.cdata(a))};
+j.onComment=function(a){h();k();i.add(new CKEDITOR.htmlParser.comment(a))};j.parse(e);for(h(!CKEDITOR.env.ie&&1);i!=q;)n(i,i.parent,1);m(q);return q};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;
+this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},writeHtml:function(a,b){var c;this.filterChildren=function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml.call(this,a,b);a=a.getHtml();this.children=(new CKEDITOR.htmlParser.fragment.fromHtml(a)).children;c=1};b&&b.onRoot(this);this.writeChildrenHtml(a,c?null:b)},writeChildrenHtml:function(a,b,c){if(c&&!this.parent&&b)b.onRoot(this);
+for(c=0;c<this.children.length;c++)this.children[c].writeHtml(a,b)}}})();
+(function(){function b(a,b){for(var c=0;a&&c<b.length;c++)var e=b[c],a=a.replace(e[0],e[1]);return a}function c(a,b,c){typeof b=="function"&&(b=[b]);var e,f;f=a.length;var n=b&&b.length;if(n){for(e=0;e<f&&a[e].pri<c;e++);for(f=n-1;f>=0;f--)if(n=b[f]){n.pri=c;a.splice(e,0,n)}}}function a(a,b,c){if(b)for(var e in b){var m=a[e];a[e]=f(m,b[e],c);m||a.$length++}}function f(a,b,f){if(b){b.pri=f;if(a){if(a.splice)c(a,b,f);else{a=a.pri>f?[b,a]:[a,b];a.filter=e}return a}return b.filter=b}}function e(a){for(var b=
+a.type||a instanceof CKEDITOR.htmlParser.fragment,c=0;c<this.length;c++){if(b)var e=a.type,f=a.name;var n=this[c].apply(window,arguments);if(n===false)return n;if(b){if(n&&(n.name!=f||n.type!=e))return n}else if(typeof n!="string")return n;n!=void 0&&(a=n)}return a}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(a){this._={elementNames:[],attributeNames:[],elements:{$length:0},attributes:{$length:0}};a&&this.addRules(a,10)},proto:{addRules:function(b,e){typeof e!="number"&&(e=10);
+c(this._.elementNames,b.elementNames,e);c(this._.attributeNames,b.attributeNames,e);a(this._.elements,b.elements,e);a(this._.attributes,b.attributes,e);this._.text=f(this._.text,b.text,e)||this._.text;this._.comment=f(this._.comment,b.comment,e)||this._.comment;this._.root=f(this._.root,b.root,e)||this._.root},onElementName:function(a){return b(a,this._.elementNames)},onAttributeName:function(a){return b(a,this._.attributeNames)},onText:function(a){var b=this._.text;return b?b.filter(a):a},onComment:function(a,
+b){var c=this._.comment;return c?c.filter(a,b):a},onRoot:function(a){var b=this._.root;return b?b.filter(a):a},onElement:function(a){for(var b=[this._.elements["^"],this._.elements[a.name],this._.elements.$],c,e=0;e<3;e++)if(c=b[e]){c=c.filter(a,this);if(c===false)return null;if(c&&c!=a)return this.onNode(c);if(a.parent&&!a.name)break}return a},onNode:function(a){var b=a.type;return b==CKEDITOR.NODE_ELEMENT?this.onElement(a):b==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a.value)):
+b==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a.value)):null},onAttribute:function(a,b,c){if(b=this._.attributes[b]){a=b.filter(c,a,this);if(a===false)return false;if(typeof a!="undefined")return a}return c}}})})();
+(function(){function b(b,c){function o(a){return a||CKEDITOR.env.ie?new CKEDITOR.htmlParser.text(" "):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function l(b,c){return function(l){if(l.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var e=[],g=a(l),i,K;if(g)for(j(g,1)&&e.push(g);g;){if(d(g)&&(i=f(g))&&j(i))if((K=f(i))&&!d(K))e.push(i);else{var h=i,q=o(t),m=h.parent.children,y=CKEDITOR.tools.indexOf(m,h);m.splice(y+1,0,q);m=h.next;h.next=q;q.previous=h;q.parent=h.parent;q.next=m;k(i)}g=g.previous}for(g=
+0;g<e.length;g++)k(e[g]);if(e=CKEDITOR.env.opera&&!b||(typeof c=="function"?c(l)!==false:c))if(!t&&CKEDITOR.env.ie&&l.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)e=false;else if(!t&&CKEDITOR.env.ie&&(document.documentMode>7||l.name in CKEDITOR.dtd.tr||l.name in CKEDITOR.dtd.$listItem))e=false;else{e=a(l);e=!e||l.name=="form"&&e.name=="input"}e&&l.add(o(b))}}}function j(a,b){if((!t||!CKEDITOR.env.ie)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==
+CKEDITOR.NODE_TEXT&&(c=a.value.match(s))){if(c.index){g(a,new CKEDITOR.htmlParser.text(a.value.substring(0,c.index)));a.value=c[0]}if(CKEDITOR.env.ie&&t&&(!b||a.parent.name in h))return true;if(!t)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var i={elements:{}},t=c=="html",h=CKEDITOR.tools.extend({},E),q;for(q in h)"#"in B[q]||delete h[q];for(q in h)i.elements[q]=l(t,b.config.fillEmptyBlocks!==false);i.root=l(t);i.elements.br=function(a){return function(b){if(b.parent.type!=
+CKEDITOR.NODE_DOCUMENT_FRAGMENT){var c=b.attributes;if("data-cke-bogus"in c||"data-cke-eol"in c)delete c["data-cke-bogus"];else{for(c=b.next;c&&e(c);)c=c.next;var l=f(b);if(!c&&d(b.parent)){b=b.parent;c=o(a);l=b.children[b.children.length-1];b.children.push(c);c.parent=b;if(l){l.next=c;c.previous=l}}else d(c)&&(l&&!d(l))&&g(c,o(a))}}}}(t);return i}function c(a){return a.enterMode!=CKEDITOR.ENTER_BR&&a.autoParagraph!==false?a.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false}function a(a){for(a=a.children[a.children.length-
+1];a&&e(a);)a=a.previous;return a}function f(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in E||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function g(a,b){var c=a.parent.children,d=CKEDITOR.tools.indexOf(c,a);c.splice(d,0,b);c=a.previous;a.previous=b;b.next=a;b.parent=a.parent;if(c){b.previous=
+c;c.next=b}}function k(a){var b=a.parent.children,c=CKEDITOR.tools.indexOf(b,a),d=a.previous,a=a.next;d&&(d.next=a);a&&(a.previous=d);b.splice(c,1)}function h(a){var b=a.parent;return b?CKEDITOR.tools.indexOf(b.children,a):-1}function m(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function n(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}function o(a){return a.replace(v,
+function(a,b,c){return"<"+b+c.replace(t,function(a,b){return!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1?" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a:a})+">"})}function l(a){return a.replace(w,function(a){return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function j(a){return a.replace(I,function(a,b){return decodeURIComponent(b)})}function q(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g,
+"%2D%2D")+"--\>"})}function y(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function z(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function i(a,b){for(var c=[],d=b.config.protectedSource,o=b._.dataStore||(b._.dataStore={id:1}),l=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,
+/<noscript[\s\S]*?<\/noscript>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),j=0;j<d.length;j++)a=a.replace(d[j],function(a){a=a.replace(l,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(l,function(a,b,d){return"<\!--"+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,
+function(a,b){o[o.id]=decodeURIComponent(b);return"{cke_protected_"+o.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(a){var c,d;this.editor=a;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(u);c.addRules(b(a,"data"));d.addRules(r);d.addRules(b(a,"html"))};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,d){var a=i(a,this.editor),a=o(a),a=l(a),a=a.replace(G,"$1cke:$2"),a=a.replace(Q,
+"<cke:$1$2></cke:$1>"),a=CKEDITOR.env.opera?a:a.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),e=this.editor.editable(),f;!b&&b!==null&&(b=e.getName());e=b||e.getName();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&e=="pre"){e="div";a="<pre>"+a+"</pre>";f=1}e=this.editor.document.createElement(e);e.setHtml("a"+a);a=e.getHtml().substr(1);a=a.replace(RegExp(" data-cke-"+CKEDITOR.rnd+"-","ig")," ");f&&(a=a.replace(/^<pre>|<\/pre>$/gi,""));a=a.replace(C,"$1$2");a=j(a);a=y(a);a=CKEDITOR.htmlParser.fragment.fromHtml(a,
+b,d===false?false:c(this.editor.config));b=new CKEDITOR.htmlParser.basicWriter;a.writeChildrenHtml(b,this.dataFilter,1);a=b.getHtml(true);return a=q(a)},toDataFormat:function(a){var b=this.editor.editable(),d=this.writer,a=CKEDITOR.htmlParser.fragment.fromHtml(a,b.getName(),c(this.editor.config));d.reset();a.writeChildrenHtml(d,this.htmlFilter,1);d=d.getHtml(true);d=y(d);return d=z(d,this.editor)}};var s=/(?:&nbsp;|\xa0)$/,A="{cke_protected}",B=CKEDITOR.dtd,p=["caption","colgroup","col","thead","tfoot",
+"tbody"],E=CKEDITOR.tools.extend({},B.$blockLimit,B.$block),u={elements:{},attributeNames:[[/^on/,"data-cke-pa-on"]]},r={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,o=0;o<c.length;o++){d="data-cke-saved-"+c[o];d in b&&delete b[c[o]]}}return a},table:function(a){a.children.slice(0).sort(function(a,
+b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(p,a.name);d=CKEDITOR.tools.indexOf(p,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=h(a);d=h(b)}return c>d?1:-1})},embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},param:function(a){a.children=[];a.isEmpty=true;return a},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false},
+span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];b&&(b.value=a.attributes["data-cke-title"]||"")}},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,
+""))||false}}};if(CKEDITOR.env.ie)r.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};for(var D in{input:1,textarea:1}){u.elements[D]=m;r.elements[D]=n}var v=/<(a|area|img|input|source)\b([^>]*)>/gi,t=/\b(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,w=/(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,I=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,G=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
+C=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,Q=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();
+CKEDITOR.htmlParser.element=function(b,c){this.name=b;this.attributes=c||{};this.children=[];var a=b||"",f=a.match(/^cke:(.*)/);f&&(a=f[1]);a=!(!CKEDITOR.dtd.$nonBodyContent[a]&&!CKEDITOR.dtd.$block[a]&&!CKEDITOR.dtd.$listItem[a]&&!CKEDITOR.dtd.$tableContent[a]&&!(CKEDITOR.dtd.$nonEditable[a]||a=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[b];this.isUnknown=!CKEDITOR.dtd[b];this._={isBlockLike:a,hasInlineStarted:this.isEmpty||!a}};
+CKEDITOR.htmlParser.cssStyle=function(b){var c={};((b instanceof CKEDITOR.htmlParser.element?b.attributes.style:b)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,b,e){b=="font-family"&&(e=e.replace(/["']/g,""));c[b.toLowerCase()]=e});return{rules:c,populate:function(a){var b=this.toString();if(b)a instanceof CKEDITOR.dom.element?a.setAttribute("style",b):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=b:a.style=b},toString:function(){var a=[],b;
+for(b in c)c[b]&&a.push(b,":",c[b],";");return a.join("")}}};
+(function(){var b=function(b,a){b=b[0];a=a[0];return b<a?-1:b>a?1:0};CKEDITOR.htmlParser.element.prototype={type:CKEDITOR.NODE_ELEMENT,add:CKEDITOR.htmlParser.fragment.prototype.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},writeHtml:function(c,a){var f=this.attributes,e=this,d=e.name,g,k,h,m;e.filterChildren=function(){if(!m){var b=new CKEDITOR.htmlParser.basicWriter;CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.call(e,b,a);e.children=(new CKEDITOR.htmlParser.fragment.fromHtml(b.getHtml(),
+e.clone(),0)).children;m=1}};if(a){if(!this.parent)a.onRoot(this);for(;;){if(!(d=a.onElementName(d)))return;e.name=d;if(!(e=a.onElement(e)))return;e.parent=this.parent;if(e.name==d)break;if(e.type!=CKEDITOR.NODE_ELEMENT){e.writeHtml(c,a);return}d=e.name;if(!d){for(var d=0,n=this.children.length;d<n;d++)this.children[d].parent=e.parent;this.writeChildrenHtml.call(e,c,m?null:a);return}}f=e.attributes}c.openTag(d,f);for(var n=[],o=0;o<2;o++)for(g in f){k=g;h=f[g];if(o==1)n.push([g,h]);else if(a){for(;;)if(k=
+a.onAttributeName(g))if(k!=g){delete f[g];g=k}else break;else{delete f[g];break}k&&((h=a.onAttribute(e,k,h))===false?delete f[k]:f[k]=h)}}c.sortAttributes&&n.sort(b);f=n.length;for(o=0;o<f;o++){g=n[o];c.attribute(g[0],g[1])}c.openTagClose(d,e.isEmpty);if(!e.isEmpty){this.writeChildrenHtml.call(e,c,m?null:a);c.closeTag(d)}},writeChildrenHtml:function(b,a){CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.apply(this,arguments)}}})();
+(function(){var b={};CKEDITOR.template=function(c){if(b[c])this.output=b[c];else{var a=c.replace(/'/g,"\\'").replace(/{([^}]+)}/g,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=b[c]=Function("data","buffer","return buffer?buffer.push('"+a+"'):['"+a+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);
+CKEDITOR.add=function(b){CKEDITOR.instances[b.name]=b;b.on("focus",function(){if(CKEDITOR.currentInstance!=b){CKEDITOR.currentInstance=b;CKEDITOR.fire("currentInstance")}});b.on("blur",function(){if(CKEDITOR.currentInstance==b){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,b)};CKEDITOR.remove=function(b){delete CKEDITOR.instances[b.name]};
+(function(){var b={};CKEDITOR.addTemplate=function(c,a){var f=b[c];if(f)return f;f={name:c,source:a};CKEDITOR.fire("template",f);return b[c]=new CKEDITOR.template(f.source)};CKEDITOR.getTemplate=function(c){return b[c]}})();(function(){var b=[];CKEDITOR.addCss=function(c){b.push(c)};CKEDITOR.getCss=function(){return b.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;
+CKEDITOR.TRISTATE_DISABLED=0;
+(function(){CKEDITOR.inline=function(b,c){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var a=new CKEDITOR.editor(c,b,CKEDITOR.ELEMENT_MODE_INLINE);a.setData(b.getHtml(),null,true);a.on("loaded",function(){a.fire("uiReady");a.editable(b);a.container=b;a.setData(a.getData(1));a.fire("contentDom");a.mode="wysiwyg";a.fire("mode");a.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",
+null,a);a.resetDirty()},null,null,1E4);a.on("destroy",function(){a.element.clearCustomData();delete a.element});return a};CKEDITOR.inlineAll=function(){var b,c,a;for(a in CKEDITOR.dtd.$editable)for(var f=CKEDITOR.document.getElementsByTag(a),e=0,d=f.count();e<d;e++){b=f.getItem(e);if(b.getAttribute("contenteditable")=="true"){c={element:b,config:{}};CKEDITOR.fire("inline",c)!==false&&CKEDITOR.inline(b,c.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();
+CKEDITOR.replaceClass="ckeditor";
+(function(){function b(b,e,k,h){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var m=new CKEDITOR.editor(e,b,h);h==CKEDITOR.ELEMENT_MODE_REPLACE&&b.setStyle("visibility","hidden");k&&m.setData(k,null,true);m.on("loaded",function(){a(m);h==CKEDITOR.ELEMENT_MODE_REPLACE&&m.config.autoUpdateElement&&f(m);m.setMode(m.config.startupMode,function(){m.fireOnce("instanceReady");
+CKEDITOR.fire("instanceReady",null,m);m.resetDirty()})});m.on("destroy",c);return m}function c(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.show();delete this.element}}function a(a){var b=a.name,c=a.element,f=a.elementMode,m=a.fire("uiSpace",{space:"top",html:""}).html,n=a.fireOnce("uiSpace",{space:"bottom",html:""}).html;e||(e=CKEDITOR.addTemplate("maincontainer",'<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+
+CKEDITOR.env.cssClass+'" dir="{langDir}" lang="{langCode}" role="application" aria-labelledby="cke_{name}_arialbl"><span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span><{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>'));b=CKEDITOR.dom.element.createFromHtml(e.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.lang.editor,
+topHtml:m?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+m+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:n?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+n+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(f==CKEDITOR.ELEMENT_MODE_REPLACE){c.hide();b.insertAfter(c)}else c.append(b);a.container=b;m&&a.ui.space("top").unselectable();n&&a.ui.space("bottom").unselectable();c=
+a.config.width;f=a.config.height;c&&b.setStyle("width",CKEDITOR.tools.cssLength(c));f&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(f));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}function f(a){var b=a.element;if(a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.is("textarea")){var c=b.$.form&&new CKEDITOR.dom.element(b.$.form);if(c){var e=function(){a.updateElement()};c.on("submit",e);if(!c.$.submit.nodeName&&!c.$.submit.length)c.$.submit=
+CKEDITOR.tools.override(c.$.submit,function(b){return function(){a.updateElement();b.apply?b.apply(this,arguments):b()}});a.on("destroy",function(){c.removeListener("submit",e)})}}}CKEDITOR.replace=function(a,c){return b(a,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(a,c,e){return b(a,c,e,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var c=null,e=a[b];if(e.name||e.id){if(typeof arguments[0]==
+"string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(e.className))continue}else if(typeof arguments[0]=="function"){c={};if(arguments[0](e,c)===false)continue}this.replace(e,c)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode=function(a,b){var c=this,e=this._.modes;if(!(a==c.mode||!e||!e[a])){c.fire("beforeSetMode",a);if(c.mode){var f=c.checkDirty();c._.previousMode=c.mode;c.fire("beforeModeUnload");c.editable(0);
+c.ui.space("contents").setHtml("");c.mode=""}this._.modes[a](function(){c.mode=a;if(f!==void 0){c.mayBeDirty=true;!f&&c.resetDirty()}setTimeout(function(){c.fire("mode");b&&b.call(c)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,c,e){var f=this.container,n=this.ui.space("contents"),o=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement,e=e?f.getChild(1):f;e.setSize("width",a,true);o&&(o.style.width="1%");n.setStyle("height",Math.max(b-(c?0:(e.$.offsetHeight||0)-(n.$.clientHeight||
+0)),0)+"px");o&&(o.style.width="100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};var e;CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg";
+(function(){function b(b){var c=b.editor,d=c.editable(),e=b.data.path,f=e.blockLimit,g=b.data.selection.getRanges()[0],i=c.config.enterMode;if(CKEDITOR.env.gecko){var h=e.block||e.blockLimit||e.root,m=h&&h.getLast(a);h&&(h.isBlockBoundary()&&(!m||!(m.type==CKEDITOR.NODE_ELEMENT&&m.isBlockBoundary()))&&!h.is("pre")&&!h.getBogus())&&h.appendBogus()}if(c.config.autoParagraph!==false&&i!=CKEDITOR.ENTER_BR&&g.collapsed&&d.equals(f)&&!e.block){d=g.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);e=new CKEDITOR.dom.walker(d);
+e.guard=function(b){return!a(b)||b.type==CKEDITOR.NODE_COMMENT||b.isReadOnly()};if(!e.checkForward()||d.checkStartOfBlock()&&d.checkEndOfBlock()){c=g.fixBlock(true,c.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p");if(CKEDITOR.env.ie)(c=c.getFirst(a))&&(c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText()).match(/^(?:&nbsp;|\xa0)$/))&&c.remove();g.select();b.cancel()}}}function c(a){var b=a.data.getTarget();if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}
+function a(a){return h(a)&&m(a)}function f(a,b){return function(c){var d=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!d||!b.equals(d)&&!b.contains(d))&&a.call(this,c)}}function e(b){var c,d=b.getRanges()[0],b=b.root,e=d.startPath(),f={table:1,ul:1,ol:1,dl:1},g=CKEDITOR.dom.walker.bogus();if(e.contains(f)){var i=d.clone();i.collapse(1);i.setStartAt(b,CKEDITOR.POSITION_AFTER_START);i=new CKEDITOR.dom.walker(i);e=function(b,d){return function(b,o){o&&(b.type==
+CKEDITOR.NODE_ELEMENT&&b.is(f))&&(c=b);if(a(b)&&!o&&(!d||!g(b)))return false}};i.guard=e(i);i.checkBackward();if(c){i=d.clone();i.collapse();i.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);i=new CKEDITOR.dom.walker(i);i.guard=e(i,1);c=0;i.checkForward();return c}}return null}function d(a){a.editor.focus();a.editor.fire("saveSnapshot")}function g(a,b){var c=a.editor;!b&&c.getSelection().scrollIntoView();setTimeout(function(){c.fire("saveSnapshot")},0)}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,
+$:function(a,b){this.base(b.$||b);this.editor=a;this.hasFocus=false;this.setup()},proto:{focus:function(){this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive":"focus"]();CKEDITOR.env.safari&&!this.isInline()&&(CKEDITOR.document.getActive().equals(this.getWindow().getFrame())||this.getWindow().focus())},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=a=="focus"?"focusin":"focusout";b=f(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,
+c)},attachListener:function(a,b,c,d,e,f){!this._.listeners&&(this._.listeners=[]);var g=Array.prototype.slice.call(arguments,1);this._.listeners.push(a.on.apply(a,g))},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&
+(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a);if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){d(this);n(this,b=="text"?"text":"html",a)},insertText:function(a){d(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",true)?CKEDITOR.ENTER_BR:b.config.enterMode,b=c==CKEDITOR.ENTER_BR,e=CKEDITOR.tools,
+a=e.htmlEncode(a.replace(/\r\n/g,"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var f=/\n{2}/g;if(f.test(a))var g="<"+c+">",i="</"+c+">",a=g+a.replace(f,function(){return i+g})+i}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return e.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,"&nbsp;");n(this,"text",a)},insertElement:function(b){d(this);for(var c=
+this.editor,e=c.config.enterMode,f=c.getSelection(),h=f.getRanges(),m=b.getName(),i=CKEDITOR.dtd.$block[m],n,k,B,p=h.length-1;p>=0;p--){n=h[p];if(!n.checkReadOnly()){n.deleteContents(1);k=!p&&b||b.clone(1);var E,u;if(i)for(;(E=n.getCommonAncestor(0,1))&&(u=CKEDITOR.dtd[E.getName()])&&(!u||!u[m]);)if(E.getName()in CKEDITOR.dtd.span)n.splitElement(E);else if(n.checkStartOfBlock()&&n.checkEndOfBlock()){n.setStartBefore(E);n.collapse(true);E.remove()}else n.splitBlock(e==CKEDITOR.ENTER_DIV?"div":"p",
+c.editable());n.insertNode(k);B||(B=k)}}if(B){n.moveToPosition(B,CKEDITOR.POSITION_AFTER_END);if(i)if((b=B.getNext(a))&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(CKEDITOR.dtd.$block))b.getDtd()["#"]?n.moveToElementEditStart(b):n.moveToElementEditEnd(B);else if(!b&&e!=CKEDITOR.ENTER_BR){b=n.fixBlock(true,e==CKEDITOR.ENTER_DIV?"div":"p");n.moveToElementEditStart(b)}}f.selectRanges([n]);g(this,CKEDITOR.env.opera)},setData:function(a,b){!b&&this.editor.dataProcessor&&(a=this.editor.dataProcessor.toHtml(a));
+this.setHtml(a);this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();!a&&this.editor.dataProcessor&&(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",
+function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(k,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||
+this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?
+"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=
+true;a.once("contentDom",function(){a.focusManager.focus()})}this.isInline()&&this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var b=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var d=a.config.contentsLangDirection;this.getDirection(1)!=d&&this.changeAttr("dir",d);var f=CKEDITOR.getCss();if(f){d=b.getHead();if(!d.getCustomData("stylesheet")){f=b.appendStyleText(f);f=new CKEDITOR.dom.element(f.ownerNode||
+f.owningElement);d.setCustomData("stylesheet",f);f.data("cke-temp",1)}}d=b.getCustomData("stylesheet_ref")||0;b.setCustomData("stylesheet_ref",d+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=a.getTarget();b.is("a")&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.keyCode,d;if(c in{8:1,46:1}){var l=a.getSelection(),b=l.getRanges()[0],
+f=b.startPath(),j,g,m,c=c==8;if(l=e(l)){a.fire("saveSnapshot");b.moveToPosition(l,CKEDITOR.POSITION_BEFORE_START);l.remove();b.select();a.fire("saveSnapshot");d=1}else if(b.collapsed)if((j=f.block)&&b[c?"checkStartOfBlock":"checkEndOfBlock"]()&&(m=j[c?"getPrevious":"getNext"](h))&&m.is("table")){a.fire("saveSnapshot");b[c?"checkEndOfBlock":"checkStartOfBlock"]()&&j.remove();b["moveToElementEdit"+(c?"End":"Start")](m);b.select();a.fire("saveSnapshot");d=1}else if(f.blockLimit&&f.blockLimit.is("td")&&
+(g=f.blockLimit.getAscendant("table"))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END)&&(m=g[c?"getPrevious":"getNext"](h))){a.fire("saveSnapshot");b["moveToElementEdit"+(c?"End":"Start")](m);b.checkStartOfBlock()&&b.checkEndOfBlock()?m.remove():b.select();a.fire("saveSnapshot");d=1}else if((g=f.contains(["td","th","caption"]))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END))if((m=g[c?"getPreviousSourceNode":"getNextSourceNode"](1,CKEDITOR.NODE_ELEMENT))&&!m.isReadOnly()&&b.root.contains(m)){b[c?
+"moveToElementEditEnd":"moveToElementEditStart"](m);b.select();d=1}}return!d});CKEDITOR.env.ie&&this.attachListener(this,"click",c);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget();
+if(!b.getOuterHtml().replace(k,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());
+a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var k=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,
+h=CKEDITOR.dom.walker.whitespaces(true),m=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(a){var c=a.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(a){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty();
+c.fire("lockSnapshot");b(a);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=this.lang.editor+", "+this.name;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);a.changeAttr("title",c);if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var d=CKEDITOR.tools.getNextId(),e=CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+
+this.lang.common.editorHelp+"</span>");c.append(e);a.changeAttr("aria-describedby",d)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var n=function(){function b(a){return a.type==CKEDITOR.NODE_ELEMENT}function c(a,d){var e,f,j,g,t=[],h=d.range.startContainer;e=d.range.startPath();for(var h=i[h.getName()],m=0,n=a.getChildren(),q=n.count(),k=-1,z=-1,y=0,s=e.contains(i.$list);m<q;++m){e=n.getItem(m);if(b(e)){j=e.getName();
+if(s&&j in CKEDITOR.dtd.$list)t=t.concat(c(e,d));else{g=!!h[j];if(j=="br"&&e.data("cke-eol")&&(!m||m==q-1)){y=(f=m?t[m-1].node:n.getItem(m+1))&&(!b(f)||!f.is("br"));f=f&&b(f)&&i.$block[f.getName()]}k==-1&&!g&&(k=m);g||(z=m);t.push({isElement:1,isLineBreak:y,isBlock:e.isBlockBoundary(),hasBlockSibling:f,node:e,name:j,allowed:g});f=y=0}}else t.push({isElement:0,node:e,allowed:1})}if(k>-1)t[k].firstNotAllowed=1;if(z>-1)t[z].lastNotAllowed=1;return t}function d(a,c){var e=[],f=a.getChildren(),l=f.count(),
+g,t=0,h=i[c],m=!a.is(i.$inline)||a.is("br");for(m&&e.push(" ");t<l;t++){g=f.getItem(t);b(g)&&!g.is(h)?e=e.concat(d(g,c)):e.push(g)}m&&e.push(" ");return e}function e(a){return a&&b(a)&&(a.is(i.$removeEmpty)||a.is("a")&&!a.isBlockBoundary())}function f(a,c,d,e){var l=a.clone(),j,g;l.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((j=(new CKEDITOR.dom.walker(l)).next())&&b(j)&&m[j.getName()]&&(g=j.getPrevious())&&b(g)&&!g.getParent().equals(a.startContainer)&&d.contains(g)&&e.contains(j)&&j.isIdentical(g)){j.moveChildren(g);
+j.remove();f(a,c,d,e)}}function h(a,c){function d(a,c){if(c.isBlock&&c.isElement&&!c.node.is("br")&&b(a)&&a.is("br")){a.remove();return 1}}var e=c.endContainer.getChild(c.endOffset),f=c.endContainer.getChild(c.endOffset-1);e&&d(e,a[a.length-1]);if(f&&d(f,a[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var i=CKEDITOR.dtd,m={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},n={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},k=CKEDITOR.tools.extend({},i.$inline);delete k.br;
+return function(m,s,u){var r=m.editor;m.getDocument();var D=r.getSelection().getRanges()[0];if(!D.checkReadOnly()){var v=(new CKEDITOR.dom.elementPath(D.startContainer,D.root)).blockLimit||D.root,s={type:s,editable:m,editor:r,range:D,blockLimit:v,mergeCandidates:[],zombies:[]},r=s.range,v=s.mergeCandidates,t,w,I,G,C;if(s.type=="text"&&r.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){w=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",r.document);r.insertNode(w);r.setStartAfter(w)}I=new CKEDITOR.dom.elementPath(r.startContainer);
+s.endPath=G=new CKEDITOR.dom.elementPath(r.endContainer);if(!r.collapsed){t=G.block||G.blockLimit;var Q=r.getCommonAncestor();t&&(!t.equals(Q)&&!t.contains(Q)&&r.checkEndOfBlock())&&s.zombies.push(t);r.deleteContents()}for(;(C=b(r.startContainer)&&r.startContainer.getChild(r.startOffset-1))&&b(C)&&C.isBlockBoundary()&&I.contains(C);)r.moveToPosition(C,CKEDITOR.POSITION_BEFORE_END);f(r,s.blockLimit,I,G);if(w){r.setEndBefore(w);r.collapse();w.remove()}w=r.startPath();if(t=w.contains(e,false,1)){r.splitElement(t);
+s.inlineStylesRoot=t;s.inlineStylesPeak=w.lastElement}w=r.createBookmark();(t=w.startNode.getPrevious(a))&&b(t)&&e(t)&&v.push(t);(t=w.startNode.getNext(a))&&b(t)&&e(t)&&v.push(t);for(t=w.startNode;(t=t.getParent())&&e(t);)v.push(t);r.moveToBookmark(w);if(u){C=u;u=s.range;if(s.type=="text"&&s.inlineStylesRoot){w=C;C=s.inlineStylesPeak;r=C.getDocument().createText("{cke-peak}");for(v=s.inlineStylesRoot.getParent();!C.equals(v);){r=r.appendTo(C.clone());C=C.getParent()}C=r.getOuterHtml().replace("{cke-peak}",
+w)}w=s.blockLimit.getName();if(/^\s+|\s+$/.test(C)&&"span"in CKEDITOR.dtd[w]){var K='<span data-cke-marker="1">&nbsp;</span>';C=K+C+K}C=s.editor.dataProcessor.toHtml(C,null,false);w=u.document.createElement("body");w.setHtml(C);if(K){w.getFirst().remove();w.getLast().remove()}if((K=u.startPath().block)&&!(K.getChildCount()==1&&K.getBogus()))a:{var F;if(w.getChildCount()==1&&b(F=w.getFirst())&&F.is(n)){K=F.getElementsByTag("*");u=0;for(r=K.count();u<r;u++){C=K.getItem(u);if(!C.is(k))break a}F.moveChildren(F.getParent(1));
+F.remove()}}s.dataWrapper=w;F=s.range;var K=F.document,x,u=s.blockLimit;w=0;var J;C=[];var H,N,v=r=0,L,O;I=F.startContainer;t=s.endPath.elements[0];var P;G=t.getPosition(I);Q=!!t.getCommonAncestor(I)&&G!=CKEDITOR.POSITION_IDENTICAL&&!(G&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);I=c(s.dataWrapper,s);for(h(I,F);w<I.length;w++){G=I[w];if(x=G.isLineBreak){x=F;L=u;var M=void 0,R=void 0;if(G.hasBlockSibling)x=1;else{M=x.startContainer.getAscendant(i.$block,1);if(!M||!M.is({div:1,p:1}))x=
+0;else{R=M.getPosition(L);if(R==CKEDITOR.POSITION_IDENTICAL||R==CKEDITOR.POSITION_CONTAINS)x=0;else{L=x.splitElement(M);x.moveToPosition(L,CKEDITOR.POSITION_AFTER_START);x=1}}}}if(x)v=w>0;else{x=F.startPath();if(!G.isBlock&&(N=s.editor.config.enterMode!=CKEDITOR.ENTER_BR&&s.editor.config.autoParagraph!==false?s.editor.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false)&&!x.block&&x.blockLimit&&x.blockLimit.equals(F.root)){N=K.createElement(N);!CKEDITOR.env.ie&&N.appendBogus();F.insertNode(N);!CKEDITOR.env.ie&&
+(J=N.getBogus())&&J.remove();F.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}if((x=F.startPath().block)&&!x.equals(H)){if(J=x.getBogus()){J.remove();C.push(x)}H=x}G.firstNotAllowed&&(r=1);if(r&&G.isElement){x=F.startContainer;for(L=null;x&&!i[x.getName()][G.name];){if(x.equals(u)){x=null;break}L=x;x=x.getParent()}if(x){if(L){O=F.splitElement(L);s.zombies.push(O);s.zombies.push(L)}}else{L=u.getName();P=!w;x=w==I.length-1;L=d(G.node,L);for(var M=[],R=L.length,T=0,U=void 0,V=0,W=-1;T<R;T++){U=L[T];
+if(U==" "){if(!V&&(!P||T)){M.push(new CKEDITOR.dom.text(" "));W=M.length}V=1}else{M.push(U);V=0}}x&&W==M.length&&M.pop();P=M}}if(P){for(;x=P.pop();)F.insertNode(x);P=0}else F.insertNode(G.node);if(G.lastNotAllowed&&w<I.length-1){(O=Q?t:O)&&F.setEndAt(O,CKEDITOR.POSITION_AFTER_START);r=0}F.collapse()}}s.dontMoveCaret=v;s.bogusNeededBlocks=C}J=s.range;var S;O=s.bogusNeededBlocks;for(P=J.createBookmark();H=s.zombies.pop();)if(H.getParent()){N=J.clone();N.moveToElementEditStart(H);N.removeEmptyBlocksAtEnd()}if(O)for(;H=
+O.pop();)H.append(CKEDITOR.env.ie?J.document.createText(" "):J.document.createElement("br"));for(;H=s.mergeCandidates.pop();)H.mergeSiblings();J.moveToBookmark(P);if(!s.dontMoveCaret){for(H=b(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);H&&b(H)&&!H.is(i.$empty);){if(H.isBlockBoundary())J.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END);else{if(e(H)&&H.getHtml().match(/(\s|&nbsp;)$/g)){S=null;break}S=J.clone();S.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END)}H=H.getLast(a)}S&&J.moveToRange(S)}D.select();
+g(m)}}}()})();
+(function(){function b(){var a=this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){this.fire("selectionCheck",a);var b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}}function c(){k=true;if(!g){a.call(this);g=CKEDITOR.tools.setTimeout(a,200,this)}}function a(){g=null;if(k){CKEDITOR.tools.setTimeout(b,0,this);k=false}}function f(a){function b(c,d){return!c||c.type==CKEDITOR.NODE_TEXT?false:
+a.clone()["moveToElementEdit"+(d?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var c=a.startContainer,d=a.getPreviousNode(h,null,c),e=a.getNextNode(h,null,c);return b(d)||b(e,1)||!d&&!e&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary()&&c.getBogus())?true:false}function e(a){return a.getCustomData("cke-fillingChar")}function d(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var d,e=a.getDocument().getSelection().getNative(),f=e&&e.type!="None"&&
+e.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){d=[e.anchorOffset,e.focusOffset];f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0]--;f&&d[1]--;var g;f=e;if(!f.isCollapsed){g=f.getRangeAt(0);g.setStart(f.anchorNode,f.anchorOffset);g.setEnd(f.focusNode,f.focusOffset);g=g.collapsed}g&&d.unshift(d.pop())}}c.setText(c.getText().replace(/\u200B/g,""));if(d){c=e.getRangeAt(0);c.setStart(c.startContainer,d[0]);c.setEnd(c.startContainer,d[1]);e.removeAllRanges();e.addRange(c)}}}
+var g,k,h=CKEDITOR.dom.walker.invisible(1);CKEDITOR.on("instanceCreated",function(a){function e(){var a=f.getSelection();a&&a.removeAllRanges()}var f=a.editor;f.define("selectionChange",{errorProof:1});f.on("contentDom",function(){var a=f.document,e=CKEDITOR.document,l=f.editable(),g=a.getBody(),o=a.getDocumentElement(),h=l.isInline();if(CKEDITOR.env.ie||CKEDITOR.env.opera||h){var n;l.attachListener(l,"focus",function(){f.unlockSelection(n);n=0},null,null,-1);var k,E=function(){k=f.getSelection(1);
+k.lock()};m?l.attachListener(l,"beforedeactivate",E,null,null,-1):l.attachListener(f,"selectionCheck",E,null,null,-1);l.attachListener(l,"blur",function(){f.lockSelection(k);n=1},null,null,-1);l.attachListener(l,"mousedown",function(){n=0})}if(CKEDITOR.env.ie&&!h){var u;l.attachListener(l,"mousedown",function(a){a.data.$.button==2&&f.document.$.selection.type=="None"&&(u=f.window.getScrollPosition())});l.attachListener(l,"mouseup",function(a){if(a.data.$.button==2&&u){f.document.$.documentElement.scrollLeft=
+u.x;f.document.$.documentElement.scrollTop=u.y}u=null});if(a.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)o.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=g.$.createTextRange();try{c.moveToPoint(a.x,a.y)}catch(e){}d.setEndPoint(l.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){o.removeListener("mousemove",b);e.removeListener("mouseup",c);o.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&&
+a.$.y<o.$.clientHeight&&a.$.x<o.$.clientWidth){var d=g.$.createTextRange();try{d.moveToPoint(a.$.x,a.$.y)}catch(f){}var l=d.duplicate();o.on("mousemove",b);e.on("mouseup",c);o.on("mouseup",c)}});if(CKEDITOR.env.version>7){o.on("mousedown",function(a){if(a.data.getTarget().is("html")){e.on("mouseup",r);o.on("mouseup",r)}});var r=function(){e.removeListener("mouseup",r);o.removeListener("mouseup",r);var b=CKEDITOR.document.$.selection,c=b.createRange();b.type!="None"&&c.parentElement().ownerDocument==
+a.$&&c.select()}}}}l.attachListener(l,"selectionchange",b,f);l.attachListener(l,"keyup",c,f);l.attachListener(l,"focus",function(){f.forceNextSelectionCheck();f.selectionChange(1)});if(l.isInline()?CKEDITOR.env.webkit||CKEDITOR.env.gecko:CKEDITOR.env.opera){var D;l.attachListener(l,"mousedown",function(){D=1});l.attachListener(a.getDocumentElement(),"mouseup",function(){D&&c.call(f);D=0})}else l.attachListener(l,"mouseup",c,f);if(CKEDITOR.env.webkit)a.on("keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:d(f.editable())}},
+null,null,-1)});f.on("contentDomUnload",f.forceNextSelectionCheck,f);f.on("dataReady",function(){f.selectionChange(1)});CKEDITOR.env.ie9Compat&&f.on("beforeDestroy",e,null,null,9);CKEDITOR.env.webkit&&f.on("setData",e);f.on("contentDomUnload",function(){f.unlockSelection()})});CKEDITOR.on("instanceReady",function(a){var b=a.editor,c=b.editable();if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=e(c);a&&(a.getCustomData("ready")?d(c):a.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",
+function(){d(c)},null,null,-1);var f,g,a=function(){var a=b.document,d=e(c);if(d){a=a.$.defaultView.getSelection();a.type=="Caret"&&a.anchorNode==d.$&&(g=1);f=d.getText();d.setText(f.replace(/\u200B/g,""))}},h=function(){var a=b.document,d=e(c);if(d){d.setText(f);if(g){a.$.defaultView.getSelection().setPosition(d.$,d.getLength());g=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage",h);b.on("beforeGetData",a,null,null,0);b.on("getData",h)}});CKEDITOR.editor.prototype.selectionChange=function(a){(a?
+b:c).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if(this._.savedSelection&&!a)return this._.savedSelection;return(a=this.editable())?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;
+return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var m=
+typeof window.getSelection!="function";CKEDITOR.dom.selection=function(a){var b=a instanceof CKEDITOR.dom.element;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=b?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(CKEDITOR.env.webkit){a=this.document.getWindow().$.getSelection();if(a.type=="None"&&this.document.getActive().equals(this.root)||a.type=="Caret"&&a.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT){var c=new CKEDITOR.dom.range(this.root);c.moveToPosition(this.root,
+CKEDITOR.POSITION_AFTER_START);b=this.document.$.createRange();b.setStart(c.startContainer.$,c.startOffset);b.collapse(1);a.addRange(b)}}var a=this.getNative(),d;if(a)if(a.getRangeAt)d=(c=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(c.commonAncestorContainer);else{try{c=a.createRange()}catch(e){}d=c&&CKEDITOR.dom.element.get(c.item&&c.item(0)||c.parentElement())}if(!d||!this.root.equals(d)&&!this.root.contains(d)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=
+null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var n={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype={getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=m?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:m?function(){var a=this._.cache;if(a.type)return a.type;
+var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-
+c.startOffset==1&&n[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=m?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement(),e=d.ownerDocument;if(!d.hasChildNodes())return{container:d,offset:0};for(var f=d.children,g,j,h=b.duplicate(),o=0,m=f.length-1,n=-1,k,v;o<=m;){n=Math.floor((o+m)/2);g=f[n];h.moveToElementText(g);k=h.compareEndPoints("StartToStart",
+b);if(k>0)m=n-1;else if(k<0)o=n+1;else{if(CKEDITOR.env.ie9Compat&&g.tagName=="BR"){f=e.defaultView.getSelection();return{container:f[c?"anchorNode":"focusNode"],offset:f[c?"anchorOffset":"focusOffset"]}}return{container:d,offset:a(g)}}}if(n==-1||n==f.length-1&&k<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;f=d.childNodes;if(!e){g=f[f.length-1];return g.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:f.length}:{container:g,offset:g.nodeValue.length}}for(d=
+f.length;e>0&&d>0;){j=f[--d];if(j.nodeType==CKEDITOR.NODE_TEXT){v=j;e=e-j.nodeValue.length}}return{container:v,offset:-e}}h.collapse(k>0?true:false);h.setEndPoint(k>0?"StartToStart":"EndToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!e)return{container:d,offset:a(g)+(k>0?0:1)};for(;e>0;)try{j=g[k>0?"previousSibling":"nextSibling"];if(j.nodeType==CKEDITOR.NODE_TEXT){e=e-j.nodeValue.length;v=j}g=j}catch(t){return{container:d,offset:a(g)}}return{container:v,offset:k>0?-e:v.nodeValue.length+
+e}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=
+c.item(e),g=f.parentNode,l=0,a=new CKEDITOR.dom.range(this.root);l<g.childNodes.length&&g.childNodes[l]!=f;l++);a.setStart(new CKEDITOR.dom.node(g),l);a.setEnd(new CKEDITOR.dom.node(g),l+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};
+return function(b){var c=this._.cache;if(c.ranges&&!b)return c.ranges;if(!c.ranges)c.ranges=new CKEDITOR.dom.rangeList(a.call(this));if(b)for(var d=c.ranges,e=0;e<d.length;e++){var f=d[e];f.getCommonAncestor().isReadOnly()&&d.splice(e,1);if(!f.collapsed){if(f.startContainer.isReadOnly())for(var b=f.startContainer,g;b;){if((g=b.type==CKEDITOR.NODE_ELEMENT)&&b.is("body")||!b.isReadOnly())break;g&&b.getAttribute("contentEditable")=="false"&&f.setStartAfter(b);b=b.getParent()}b=f.startContainer;g=f.endContainer;
+var h=f.startOffset,m=f.endOffset,n=f.clone();b&&b.type==CKEDITOR.NODE_TEXT&&(h>=b.getLength()?n.setStartAfter(b):n.setStartBefore(b));g&&g.type==CKEDITOR.NODE_TEXT&&(m?n.setEndAfter(g):n.setEndBefore(g));b=new CKEDITOR.dom.walker(n);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(n.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a);b.collapsed||d.splice(e+1,0,b)}return true}return false};
+b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);
+else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},
+function(){for(var a=b.getRanges()[0],c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&n[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=m?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();
+this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges();this.isLocked=0;this.reset();if(a)(a=b||c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={}},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){if(a.length)if(this.isLocked){var b=
+CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();!b.equals(this.root)&&b.focus()}else{if(m){var c=CKEDITOR.dom.walker.whitespaces(true),e=/\ufeff|\u00a0/,g={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,h,i,k,A=b.getEnclosedNode();if(A&&A.type==CKEDITOR.NODE_ELEMENT&&A.getName()in n&&(!A.is("a")||!A.getText()))try{k=A.$.createControlRange();k.addElement(A.$);k.select();return}catch(B){}(b.startContainer.type==
+CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in g||b.endContainer.type==CKEDITOR.NODE_ELEMENT&&b.endContainer.getName()in g)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);k=b.createBookmark();var g=k.startNode,p;if(!a)p=k.endNode;k=b.document.$.body.createTextRange();k.moveToElementText(g.$);k.moveStart("character",1);if(p){e=b.document.$.body.createTextRange();e.moveToElementText(p.$);k.setEndPoint("EndToEnd",e);k.moveEnd("character",-1)}else{h=g.getNext(c);i=g.hasAscendant("pre");h=!(h&&h.getText&&
+h.getText().match(e))&&(i||!g.hasPrevious()||g.getPrevious().is&&g.getPrevious().is("br"));i=b.document.createElement("span");i.setHtml("&#65279;");i.insertBefore(g);h&&b.document.createText("").insertBefore(g)}b.setStartBefore(g);g.remove();if(a){if(h){k.moveStart("character",-1);k.select();b.document.$.selection.clear()}else k.select();b.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START);i.remove()}else{b.setEndBefore(p);p.remove();k.select()}}else{p=this.getNative();if(!p)return;if(CKEDITOR.env.opera){b=
+this.document.$.createRange();b.selectNodeContents(this.root.$);p.addRange(b)}this.removeAllRanges();for(e=0;e<a.length;e++){if(e<a.length-1){b=a[e];k=a[e+1];i=b.clone();i.setStart(b.endContainer,b.endOffset);i.setEnd(k.startContainer,k.startOffset);if(!i.collapsed){i.shrink(CKEDITOR.NODE_ELEMENT,true);h=i.getCommonAncestor();i=i.getEnclosedNode();if(h.isReadOnly()||i&&i.isReadOnly()){k.setStart(b.startContainer,b.startOffset);a.splice(e--,1);continue}}}b=a[e];k=this.document.$.createRange();h=b.startContainer;
+if(CKEDITOR.env.opera&&b.collapsed&&h.type==CKEDITOR.NODE_ELEMENT){i=h.getChild(b.startOffset-1);c=h.getChild(b.startOffset);if(!i&&!c&&h.is(CKEDITOR.dtd.$removeEmpty)||i&&i.type==CKEDITOR.NODE_ELEMENT||c&&c.type==CKEDITOR.NODE_ELEMENT){b.insertNode(this.document.createText(""));b.collapse(1)}}if(b.collapsed&&CKEDITOR.env.webkit&&f(b)){h=this.root;d(h,false);i=h.getDocument().createText("​");h.setCustomData("cke-fillingChar",i);b.insertNode(i);if((h=i.getNext())&&!i.getPrevious()&&h.type==CKEDITOR.NODE_ELEMENT&&
+h.getName()=="br"){d(this.root);b.moveToPosition(h,CKEDITOR.POSITION_BEFORE_START)}else b.moveToPosition(i,CKEDITOR.POSITION_AFTER_END)}k.setStart(b.startContainer.$,b.startOffset);try{k.setEnd(b.endContainer.$,b.endOffset)}catch(E){if(E.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){b.collapse(1);k.setEnd(b.endContainer.$,b.endOffset)}else throw E;}p.addRange(k)}}this.reset();this.root.fire("selectionchange")}},createBookmarks:function(a){return this.getRanges().createBookmarks(a)},createBookmarks2:function(a){return this.getRanges().createBookmarks2(a)},
+selectBookmarks:function(a){for(var b=[],c=0;c<a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}this.selectRanges(b);return this},getCommonAncestor:function(){var a=this.getRanges();return a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){var a=this.getNative();try{a&&a[m?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}})();
+CKEDITOR.editor.prototype.attachStyleStateChange=function(b,c){var a=this._.styleStateChangeCallbacks;if(!a){a=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(b){for(var c=0;c<a.length;c++){var d=a[c],g=d.style.checkActive(b.data.path)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;d.fn.call(this,g)}})}a.push({style:b,fn:c})};CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;
+(function(){function b(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function c(a){var c=a.document;if(a.collapsed){c=y(this,c);a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_END)}else{var d=this.element,e=this._.definition,f,g=e.ignoreReadonly,h=g||e.includeReadonly;h==void 0&&(h=a.root.getCustomData("cke_includeReadonly"));var j=CKEDITOR.dtd[d]||
+(f=true,CKEDITOR.dtd.span);a.enlarge(CKEDITOR.ENLARGE_INLINE,1);a.trim();var m=a.createBookmark(),i=m.startNode,n=m.endNode,k=i,o;if(!g){var q=a.getCommonAncestor(),g=b(i,q),q=b(n,q);g&&(k=g.getNextSourceNode(true));q&&(n=q)}for(k.getPosition(n)==CKEDITOR.POSITION_FOLLOWING&&(k=0);k;){g=false;if(k.equals(n)){k=null;g=true}else{var p=k.type,r=p==CKEDITOR.NODE_ELEMENT?k.getName():null,q=r&&k.getAttribute("contentEditable")=="false",s=r&&k.getAttribute("data-nostyle");if(r&&k.data("cke-bookmark")){k=
+k.getNextSourceNode(true);continue}if(!r||j[r]&&!s&&(!q||h)&&(k.getPosition(n)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||e.childRule(k))){var u=k.getParent();if(u&&((u.getDtd()||CKEDITOR.dtd.span)[d]||f)&&(!e.parentRule||e.parentRule(u))){if(!o&&(!r||!CKEDITOR.dtd.$removeEmpty[r]||(k.getPosition(n)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|
+CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED)){o=a.clone();o.setStartBefore(k)}if(p==CKEDITOR.NODE_TEXT||q||p==CKEDITOR.NODE_ELEMENT&&!k.getChildCount()){for(var p=k,v;(g=!p.getNext(D))&&(v=p.getParent(),j[v.getName()])&&(v.getPosition(i)|CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_FOLLOWING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||
+e.childRule(v));)p=v;o.setEndAfter(p)}}else g=true}else g=true;k=k.getNextSourceNode(s||q&&!h)}if(g&&o&&!o.collapsed){for(var g=y(this,c),q=g.hasAttributes(),s=o.getCommonAncestor(),p={},r={},u={},z={},A,B,E;g&&s;){if(s.getName()==d){for(A in e.attributes)if(!z[A]&&(E=s.getAttribute(B)))g.getAttribute(A)==E?r[A]=1:z[A]=1;for(B in e.styles)if(!u[B]&&(E=s.getStyle(B)))g.getStyle(B)==E?p[B]=1:u[B]=1}s=s.getParent()}for(A in r)g.removeAttribute(A);for(B in p)g.removeStyle(B);q&&!g.hasAttributes()&&(g=
+null);if(g){o.extractContents().appendTo(g);l.call(this,g);o.insertNode(g);g.mergeSiblings();CKEDITOR.env.ie||g.$.normalize()}else{g=new CKEDITOR.dom.element("span");o.extractContents().appendTo(g);o.insertNode(g);l.call(this,g);g.remove(true)}o=null}}a.moveToBookmark(m);a.shrink(CKEDITOR.SHRINK_TEXT)}}function a(a){a.enlarge(CKEDITOR.ENLARGE_INLINE,1);var b=a.createBookmark(),c=b.startNode;if(a.collapsed){for(var d=new CKEDITOR.dom.elementPath(c.getParent(),a.root),e,f=0,g;f<d.elements.length&&(g=
+d.elements[f]);f++){if(g==d.block||g==d.blockLimit)break;if(this.checkElementRemovable(g)){var h;if(a.collapsed&&(a.checkBoundaryOfElement(g,CKEDITOR.END)||(h=a.checkBoundaryOfElement(g,CKEDITOR.START)))){e=g;e.match=h?"start":"end"}else{g.mergeSiblings();g.getName()==this.element?o.call(this,g):j(g,s(this)[g.getName()])}}}if(e){g=c;for(f=0;;f++){h=d.elements[f];if(h.equals(e))break;else if(h.match)continue;else h=h.clone();h.append(g);g=h}g[e.match=="start"?"insertBefore":"insertAfter"](e)}}else{var m=
+b.endNode,l=this,d=function(){for(var a=new CKEDITOR.dom.elementPath(c.getParent()),b=new CKEDITOR.dom.elementPath(m.getParent()),d=null,e=null,f=0;f<a.elements.length;f++){var g=a.elements[f];if(g==a.block||g==a.blockLimit)break;l.checkElementRemovable(g)&&(d=g)}for(f=0;f<b.elements.length;f++){g=b.elements[f];if(g==b.block||g==b.blockLimit)break;l.checkElementRemovable(g)&&(e=g)}e&&m.breakParent(e);d&&c.breakParent(d)};d();for(e=c;!e.equals(m);){f=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&
+this.checkElementRemovable(e)){e.getName()==this.element?o.call(this,e):j(e,s(this)[e.getName()]);if(f.type==CKEDITOR.NODE_ELEMENT&&f.contains(c)){d();f=c.getNext()}}e=f}}a.moveToBookmark(b)}function f(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&z(a,this)}function e(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,
+c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&a.removeStyle(e)}}function d(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document;d=c.getNextParagraph();)if(!d.isReadOnly()){var f=y(this,e,d);k(d,f)}a.moveToBookmark(b)}function g(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=
+this._.enterMode!=CKEDITOR.ENTER_BR;for(var d;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){var e=this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div");e&&d.copyAttributes(e);k(d,e)}else o.call(this,d);a.moveToBookmark(b)}function k(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=m(f,
+/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g," ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var g=a.getDocument().createElement("div");g.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(g.getFirst());e=g.getFirst().remove()}else e.setHtml(f);b=e}else f?b=n(c?[a.getHtml()]:h(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,j;if((j=c.getPrevious(v))&&j.is&&j.is("pre")){d=m(j.getHtml(),/\n$/,"")+
+"\n\n"+m(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);j.remove()}}else c&&q(b)}function h(a){a.getName();var b=[];m(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function m(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,
+b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function n(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=m(e,/^[ \t]*\n/,""),e=m(e,/\n$/,""),e=m(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",
+a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function o(a){var b=this._.definition,c=b.attributes,b=b.styles,d=s(this)[a.getName()],e=CKEDITOR.tools.isEmpty(c)&&CKEDITOR.tools.isEmpty(b),f;for(f in c)if(!((f=="class"||this._.definition.fullMatch)&&a.getAttribute(f)!=A(f,c[f]))){e=a.hasAttribute(f);a.removeAttribute(f)}for(var g in b)if(!(this._.definition.fullMatch&&a.getStyle(g)!=A(g,b[g],true))){e=e||!!a.getStyle(g);a.removeStyle(g)}j(a,d,p[a.getName()]);
+e&&(this._.definition.alwaysRemoveElement?q(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?q(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function l(a){for(var b=s(this),c=a.getElementsByTag(this.element),d=c.count();--d>=0;)o.call(this,c.getItem(d));for(var e in b)if(e!=this.element){c=a.getElementsByTag(e);for(d=c.count()-1;d>=0;d--){var f=c.getItem(d);j(f,b[e])}}}function j(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=
+b[d][0],f;if(f=a.getAttribute(e)){var g=b[d][1];(g===null||g.test&&g.test(f)||typeof g=="string"&&f==g)&&a.removeAttribute(e)}}c||q(a)}function q(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(v),d=a.getNext(v);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&
+c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&&d.mergeSiblings()}}}function y(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=z(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function z(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);
+return a}function i(a,b){for(var c in a)a[c]=a[c].replace(r,function(a,c){return b[c]})}function s(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function A(a,
+b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a,b);return d[c?"getStyle":"getAttribute"](a)}function B(a,b){for(var c=a.document,d=a.getRanges(),e=b?this.removeFromRange:this.applyToRange,f,g=d.createIterator();f=g.getNextRange();)e.call(this,f);a.selectRanges(d);c.removeCustomData("doc_processing_style")}var p={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,
+keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},E={a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},u=/\s*(?:;\s*|$)/,r=/#\((.+?)\)/g,D=CKEDITOR.dom.walker.bookmark(0,1),v=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);i(a.attributes,b);i(a.styles,
+b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase():a.element:"*";this.type=a.type||(p[c]?CKEDITOR.STYLE_BLOCK:E[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.editor.prototype.applyStyle=function(a){B.call(a,this.getSelection())};CKEDITOR.editor.prototype.removeStyle=function(a){B.call(a,this.getSelection(),1)};CKEDITOR.style.prototype={apply:function(a){B.call(this,a.getSelection())},
+remove:function(a){B.call(this,a.getSelection(),1)},applyToRange:function(a){return(this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?c:this.type==CKEDITOR.STYLE_BLOCK?d:this.type==CKEDITOR.STYLE_OBJECT?f:null).call(this,a)},removeFromRange:function(b){return(this.removeFromRange=this.type==CKEDITOR.STYLE_INLINE?a:this.type==CKEDITOR.STYLE_BLOCK?g:this.type==CKEDITOR.STYLE_OBJECT?e:null).call(this,b)},applyToObject:function(a){z(a,this)},checkActive:function(a){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||
+a.blockLimit,true);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var b=a.elements,c=0,d;c<b.length;c++){d=b[c];if(!(this.type==CKEDITOR.STYLE_INLINE&&(d==a.block||d==a.blockLimit))){if(this.type==CKEDITOR.STYLE_OBJECT){var e=d.getName();if(!(typeof this.element=="string"?e==this.element:e in this.element))continue}if(this.checkElementRemovable(d,true))return true}}}return false},checkApplicable:function(a){switch(this.type){case CKEDITOR.STYLE_OBJECT:return a.contains(this.element)}return true},
+checkElementMatch:function(a,b){var c=this._.definition;if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!="_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d==
+"string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e=="string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b){if(this.checkElementMatch(a,b))return true;var c=s(this)[a.getName()];if(c){var d;if(!(c=c.attributes))return true;for(var e=0;e<c.length;e++){d=
+c[e][0];if(d=a.getAttribute(d)){var f=c[e][1];if(f===null||typeof f=="string"&&d==f||f.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||
+"",d="";c.length&&(c=c.replace(u,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(u,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d}})();CKEDITOR.styleCommand=function(b){this.style=b};CKEDITOR.styleCommand.prototype.exec=function(b){b.focus();this.state==CKEDITOR.TRISTATE_OFF?b.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&b.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");
+CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(b,c,a){CKEDITOR.stylesSet.addExternal(b,c,"");CKEDITOR.stylesSet.load(b,a)};
+CKEDITOR.editor.prototype.getStylesSet=function(b){if(this._.stylesDefinitions)b(this._.stylesDefinitions);else{var c=this,a=c.config.stylesCombo_stylesSet||c.config.stylesSet||"default";if(a instanceof Array){c._.stylesDefinitions=a;b(a)}else{var a=a.split(":"),f=a[0];CKEDITOR.stylesSet.addExternal(f,a[1]?a.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(f,function(a){c._.stylesDefinitions=a[f];b(c._.stylesDefinitions)})}}};
+CKEDITOR.dom.comment=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createComment(b));CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});
+(function(){var b={},c;for(c in CKEDITOR.dtd.$blockLimit)c in CKEDITOR.dtd.$list||(b[c]=1);var a={};for(c in CKEDITOR.dtd.$block)c in CKEDITOR.dtd.$blockLimit||c in CKEDITOR.dtd.$empty||(a[c]=1);CKEDITOR.dom.elementPath=function(c,e){var d=null,g=null,k=[],e=e||c.getDocument().getBody(),h=c;do if(h.type==CKEDITOR.NODE_ELEMENT){k.push(h);if(!this.lastElement){this.lastElement=h;if(h.is(CKEDITOR.dtd.$object))continue}var m=h.getName();if(!g){!d&&a[m]&&(d=h);if(b[m]){var n;if(n=!d){if(m=m=="div"){a:{m=
+h.getChildren();n=0;for(var o=m.count();n<o;n++){var l=m.getItem(n);if(l.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[l.getName()]){m=true;break a}}m=false}m=!m&&!h.equals(e)}n=m}n?d=h:g=h}}if(h.equals(e))break}while(h=h.getParent());this.block=d;this.blockLimit=g;this.root=e;this.elements=k}})();
+CKEDITOR.dom.elementPath.prototype={compare:function(b){var c=this.elements,b=b&&b.elements;if(!b||c.length!=b.length)return false;for(var a=0;a<c.length;a++)if(!c[a].equals(b[a]))return false;return true},contains:function(b,c,a){var f;typeof b=="string"&&(f=function(a){return a.getName()==b});b instanceof CKEDITOR.dom.element?f=function(a){return a.equals(b)}:CKEDITOR.tools.isArray(b)?f=function(a){return CKEDITOR.tools.indexOf(b,a.getName())>-1}:typeof b=="function"?f=b:typeof b=="object"&&(f=
+function(a){return a.getName()in b});var e=this.elements,d=e.length;c&&d--;if(a){e=Array.prototype.slice.call(e,0);e.reverse()}for(c=0;c<d;c++)if(f(e[c]))return e[c];return null},isContextFor:function(b){var c;if(b in CKEDITOR.dtd.$block){c=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!c.getDtd()[b]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};
+CKEDITOR.dom.text=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createTextNode(b));this.$=b};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;
+CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(b){this.$.nodeValue=b},split:function(b){var c=this.$.parentNode,a=c.childNodes.length,f=this.getLength(),e=this.getDocument(),d=new CKEDITOR.dom.text(this.$.splitText(b),e);if(c.childNodes.length==a)if(b>=f){d=e.createText("");d.insertAfter(this)}else{b=e.createText("");b.insertAfter(d);b.remove()}return d},substring:function(b,
+c){return typeof c!="number"?this.$.nodeValue.substr(b):this.$.nodeValue.substring(b,c)}});
+(function(){function b(a,b,c){var d=a.serializable,g=b[c?"endContainer":"startContainer"],k=c?"endOffset":"startOffset",h=d?b.document.getById(a.startNode):a.startNode,a=d?b.document.getById(a.endNode):a.endNode;if(g.equals(h.getPrevious())){b.startOffset=b.startOffset-g.getLength()-a.getPrevious().getLength();g=a.getNext()}else if(g.equals(a.getPrevious())){b.startOffset=b.startOffset-g.getLength();g=a.getNext()}g.equals(h.getParent())&&b[k]++;g.equals(a.getParent())&&b[k]++;b[c?"endContainer":"startContainer"]=
+g;return b}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,c)};var c={createIterator:function(){var a=this,b=CKEDITOR.dom.walker.bookmark(),c=[],d;return{getNextRange:function(g){d=d==void 0?0:d+1;var k=a[d];if(k&&a.length>1){if(!d)for(var h=a.length-1;h>=0;h--)c.unshift(a[h].createBookmark(true));if(g)for(var m=0;a[d+m+1];){for(var n=k.document,g=0,h=n.getById(c[m].endNode),n=n.getById(c[m+
+1].startNode);;){h=h.getNextSourceNode(false);if(n.equals(h))g=1;else if(b(h)||h.type==CKEDITOR.NODE_ELEMENT&&h.isBlockBoundary())continue;break}if(!g)break;m++}for(k.moveToBookmark(c.shift());m--;){h=a[++d];h.moveToBookmark(c.shift());k.setEnd(h.endContainer,h.endOffset)}}return k}}},createBookmarks:function(a){for(var c=[],e,d=0;d<this.length;d++){c.push(e=this[d].createBookmark(a,true));for(var g=d+1;g<this.length;g++){this[g]=b(e,this[g]);this[g]=b(e,this[g],true)}}return c},createBookmarks2:function(a){for(var b=
+[],c=0;c<this.length;c++)b.push(this[c].createBookmark2(a));return b},moveToBookmarks:function(a){for(var b=0;b<this.length;b++)this[b].moveToBookmark(a[b])}}})();
+(function(){function b(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function c(a){var c=CKEDITOR.skin["ua_"+a],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,f;e<c.length;e++){f=c[e];if(d.ie&&(f.replace(/^ie/,"")==d.version||d.quirks&&f=="iequirks"))f="ie";if(d[f]){a=a+("_"+c[e]);break}}return CKEDITOR.getUrl(b()+a+".css")}function a(a,b){if(!d[a]){CKEDITOR.document.appendStyleSheet(c(a));d[a]=1}b&&b()}
+function f(a){var b=a.getById(g);if(!b){b=a.getHead().append("style");b.setAttribute("id",g);b.setAttribute("type","text/css")}return b}function e(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var g=0;g<a.length;g++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[g].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie?
+a[g].$.styleSheet.cssText=a[g].$.styleSheet.cssText+f:a[g].$.innerHTML=a[g].$.innerHTML+f}}var d={};CKEDITOR.skin={path:b,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(b()+"skin.js"),function(){a(c,d)}):a(c,d)},getPath:function(a){return CKEDITOR.getUrl(c(a))},icons:{},addIcon:function(a,b,c){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0})},getIconStyle:function(a,b,c,d){var e;if(a){a=a.toLowerCase();b&&
+(e=this.icons[a+"-rtl"]);e||(e=this.icons[a])}a=c||e&&e.path||"";d=d||e&&e.offset;return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=f(CKEDITOR.document);return(this.setUiColor=function(a){var c=CKEDITOR.skin.chameleon,d=[[h,a]];this.uiColor=a;e([b],c(this,"editor"),d);e(k,c(this,"panel"),d)}).call(this,a)}});var g="cke_ui_color",k=[],h=/\$color/g;
+CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=f(a);k.push(a);var c=b.getUiColor();c&&e([a],CKEDITOR.skin.chameleon(b,"panel"),[[h,c]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})();
+(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var b=CKEDITOR.dom.element.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',CKEDITOR.document);b.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=b.getComputedStyle("border-top-color")==b.getComputedStyle("border-right-color")}catch(c){CKEDITOR.env.hc=false}b.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");
+CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(b=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var a=0;a<b.length;a++){CKEDITOR.editor.prototype.constructor.apply(b[a][0],b[a][1]);CKEDITOR.add(b[a][0])}}})();
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera";
+CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
+a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
+panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
+return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
+"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!=
+this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})},
+this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,e){if(!(4>arguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!=
+a.labelLayout?f.push('<label class="cke_dialog_ui_labeled_label'+d+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+' role="presentation">',e.call(this,b,a),"</div>"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+d+'" id="'+c.labelId+'" for="'+c.inputId+'"'+
+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+e.call(this,b,a)+"</span>"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,d,f));return f.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var e=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:e,type:a.type};
+a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var f=this,i=!1;b.on("load",function(){f.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(i=true)});f.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&i){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);i=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=
+['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var f in c)b.push(f+'="'+c[f]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var e=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",f={};a.validate&&(this.validate=a.validate);f.rows=a.rows||5;f.cols=
+a.cols||20;"undefined"!=typeof a.inputStyle&&(f.style=a.inputStyle);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f["aria-labelledby"]=this._.labelId;this._.required&&(f["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea class="cke_dialog_ui_input_textarea" id="',c,'" '],b;for(b in f)a.push(b+'="'+CKEDITOR.tools.htmlEncode(f[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(e._["default"]),"</textarea></div>");return a.join("")})}},
+checkbox:function(b,a,d){if(!(3>arguments.length)){var e=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),f=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};p(c);if(a["default"])g.checked="checked";if(typeof c.inputStyle!=
+"undefined")c.style=c.inputStyle;e.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,f,"input",null,g);f.push(' <label id="',d,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return f.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var e=[],c=this;CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){for(var f=
+[],d=[],g=a.id?a.id+"_radio":CKEDITOR.tools.getNextId()+"_radio",j=0;j<a.items.length;j++){var k=a.items[j],h=k[2]!==void 0?k[2]:k[0],l=k[1]!==void 0?k[1]:k[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),h=CKEDITOR.tools.extend({},m,{title:h},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==l)o.checked="checked";p(m);p(h);if(typeof m.inputStyle!="undefined")m.style=
+m.inputStyle;e.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,h,q,"label",null,{id:n,"for":o.id},k[0]);f.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,e,f,d);return d.join("")});this._.children=e}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));h.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);var e=this;b.on("load",function(){var a=this.getElement();(function(){a.on("click",
+e.click,e);a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(e.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var f=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button","aria-labelledby":f},'<span id="'+f+'" class="cke_dialog_ui_button">'+CKEDITOR.tools.htmlEncode(a.label)+"</span>")}},
+select:function(b,a,d){if(!(3>arguments.length)){var e=h.call(this,a);a.validate&&(this.validate=a.validate);e.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),d=[],i=[],g={id:e.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};d.push('<div class="cke_dialog_ui_input_',a.type,'" role="presentation"');a.width&&d.push('style="width:'+
+a.width+'" ');d.push(">");if(a.size!=void 0)g.size=a.size;if(a.multiple!=void 0)g.multiple=a.multiple;p(c);for(var j=0,k;j<a.items.length&&(k=a.items[j]);j++)i.push('<option value="',CKEDITOR.tools.htmlEncode(k[1]!==void 0?k[1]:k[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(k[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.select=new CKEDITOR.ui.dialog.uiElement(b,c,d,"select",null,g,i.join(""));d.push("</div>");return d.join("")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===
+a["default"]&&(a["default"]="");var e=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(e.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=CKEDITOR.env.isCustomDomain(),d=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',
+e.frameId,'" title="',a.label,'" src="javascript:void('];d.push(b?"(function(){document.open();document.domain='"+document.domain+"';document.close();})()":"0");d.push(')"></iframe>');return d.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],
+d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var i=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var j=c.focus;j&&(this.focus=function(){this.selectParentTab();"function"==typeof j&&j.call(this);this.fire("focus")},c.isFocusable&&
+(this.isFocusable=this.isFocusable),this.keyboardFocusable=!0);CKEDITOR.ui.dialog.uiElement.call(this,e,c,i,"span",null,null,"");i=i.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",i[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push("<legend"+(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+f+"</legend>");
+for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?
+"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},isEnabled:function(){return!this._.disabled},
+eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},focus:function(){var b=this.selectParentTab();
+setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,
+{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0<b.length;)b.remove(0);return this},keyboardFocusable:!0},
+n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this,arguments);b.on("load",
+function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,e,c=0;c<d.length&&(e=d[c]);c++)e.getElement().$.checked=e.getValue()==b;!a&&this.fire("change",{value:b})},getValue:function(){for(var b=
+this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&&this.$.checked&&
+b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();
+return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,e=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):e(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();CKEDITOR.env.isCustomDomain()&&(d.$.domain=document.domain);var b="";e.size&&
+(b=e.size-(CKEDITOR.env.ie?7:0));var h=a.frameId+"_input";d.$.write(['<html dir="'+g+'" lang="'+j+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+j+'" action="',CKEDITOR.tools.htmlEncode(e.action),'"><label id="',a.labelId,'" for="',h,'" style="display:none">',CKEDITOR.tools.htmlEncode(e.label),'</label><input id="',h,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(e.id||
+"cke_upload"),'" size="',CKEDITOR.tools.htmlEncode(0<b?b:""),'" /></form></body></html>',"<script>window.parent.CKEDITOR.tools.callFunction("+f+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+i+")}<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),e=a.definition,c=a.buttons,f=this.formLoadedNumber,i=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,j=a.dialog._.editor.langCode;
+f||(f=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),i=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(f);CKEDITOR.tools.removeFunction(i)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=""},eventProcessors:{onChange:function(b,
+a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",r);CKEDITOR.dialog.addUIElement("textarea",
+l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var e=a.children,c,f=[],i=[],g=0;g<e.length&&(c=e[g]);g++){var h=[];f.push(h);i.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,c,h))}return new CKEDITOR.ui.dialog[a.type](b,
+i,f,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;
+(function(){function p(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function q(a,b){for(var c=a.$.getElementsByTagName("input"),
+e=0,d=c.length;e<d;e++){var g=new CKEDITOR.dom.element(c[e]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})}
+function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),e=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var d=CKEDITOR.env.isCustomDomain(),
+d="javascript:void(function(){"+encodeURIComponent("document.open();"+(d?'document.domain="'+document.domain+'";':"")+"document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+d+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();e.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:e,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;
+this.focusIndex=c;this.tabIndex=0;this.isFocusable=function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",
+b)})}function I(a,b){this._={dialog:a};CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),h=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,i=b.data.$.screenY,n=o-e.x,l=i-e.y;e={x:o,y:i};d.x+=n;d.y+=l;a.move(d.x+k[3]<f?-k[3]:d.x-k[1]>h.width-c.width-f?h.width-c.width+("rtl"==g.lang.dir?0:k[1]):d.x,d.y+k[0]<f?-k[0]:d.y-k[2]>h.height-c.height-f?h.height-c.height+k[2]:d.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",
+b);CKEDITOR.document.removeListener("mouseup",c);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null;a.getElement().getFirst();var g=a.getParentEditor(),f=g.config.dialog_magnetDistance,k=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){e={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);d=
+a.getPosition();if(CKEDITOR.env.ie6Compat){var g=r.getChild(0).getFrameDocument();g.on("mousemove",b);g.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function e(d){var e="rtl"==k.lang.dir,i=o.width,D=o.height,E=i+(d.data.$.screenX-b)*(e?-1:1)*(a._.moved?1:2),n=D+(d.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=e&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>h.height&&(n=h.height-y.y);if((e?x:y.x)+E>h.width)E=h.width-(e?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||
+f==CKEDITOR.DIALOG_RESIZE_BOTH)i=Math.max(g.minWidth||0,E-m);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||f==CKEDITOR.DIALOG_RESIZE_BOTH)D=Math.max(g.minHeight||0,n-j);a.resize(i,D);a._.moved||a.layout();d.data.preventDefault()}function d(){CKEDITOR.document.removeListener("mouseup",d);CKEDITOR.document.removeListener("mousemove",e);i&&(i.remove(),i=null);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mouseup",d);a.removeListener("mousemove",e)}}var g=a.definition,f=g.resizable;
+if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var k=a.getParentEditor(),m,j,h,o,i,n=CKEDITOR.tools.addFunction(function(f){o=a.getSize();var g=a.parts.contents;g.$.getElementsByTagName("iframe").length&&(i=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),g.append(i));j=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.opera||CKEDITOR.env.ie&&CKEDITOR.env.quirks));m=o.width-a.parts.contents.getSize("width",
+1);b=f.screenX;c=f.screenY;h=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",e);CKEDITOR.document.on("mouseup",d);CKEDITOR.env.ie6Compat&&(g=r.getChild(0).getFrameDocument(),g.on("mousemove",e),g.on("mouseup",d));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+
+b+" cke_resizer_"+k.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(k.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+("ltr"==k.lang.dir?"â—¢":"â—£")+"</div>");a.parts.footer.append(b,1)});k.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function F(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=c.dialog_backgroundCoverColor||"white",d=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(e,
+d,g),f=w[c];if(f)f.show();else{g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?"background-color: "+e:"",'" class="cke_dialog_background_cover">'];if(CKEDITOR.env.ie6Compat){var k=CKEDITOR.env.isCustomDomain(),e="<html><body style=\\'background-color:"+e+";\\'></body></html>";g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');g.push("void((function(){document.open();"+
+(k?"document.domain='"+document.domain+"';":"")+"document.write( '"+e+"' );document.close();})())");g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')}g.push("</div>");f=CKEDITOR.dom.element.createFromHtml(g.join(""));f.setOpacity(void 0!=d?d:0.5);f.on("keydown",F);f.on("keypress",F);f.on("keyup",F);f.appendTo(CKEDITOR.document.getBody());w[c]=f}a.focusManager.add(f);r=f;var a=function(){var a=b.getViewPaneSize();
+f.setStyles({width:a.width+"px",height:a.height+"px"})},m=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do a=c.getPosition(),c.move(a.x,a.y);while(c=c._.parentDialog)}};G=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var j=function(){m();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){j.prevScrollHandler=window.onscroll||function(){};
+window.onscroll=j},0);m()}}function K(a){r&&(a.focusManager.remove(r),a=CKEDITOR.document.getWindow(),r.hide(),a.removeListener("resize",G),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||null},0),G=null)}var s=CKEDITOR.tools.cssLength,S='<div class="cke cke_reset_all {editorId} {editorDialogClass}" dir="{langDir}" lang="{langCode}" role="application"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" aria-labelledby="cke_dialog_title_{id}" style="position:absolute" role="dialog"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>';
+CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function e(a){var b=l._.focusList,a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(d){}for(var f=c=(c+a+b.length)%b.length;a&&!b[f].isFocusable()&&!(f=(f+a+b.length)%b.length,f==c););b[f].focus();"text"==b[f].type&&b[f].select()}}function d(b){if(l==
+CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),f="rtl"==a.lang.dir;o=i=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,l._.tabBarMode?(c=c?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus()):e(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&l._.tabBarMode)c=c==(f?39:37)?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&l._.tabBarMode)this.selectPage(this._.currentTabId),
+this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;i=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),i=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):i&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b],
+k=CKEDITOR.tools.clone(W),m=a.config.dialog_buttonsOrder||"OS",j=a.lang.dir,h={},o,i;("OS"==m&&CKEDITOR.env.mac||"rtl"==m&&"ltr"==j||"ltr"==m&&"rtl"==j)&&k.buttons.reverse();f=CKEDITOR.tools.extend(f(a),k);f=CKEDITOR.tools.clone(f);f=new L(this,f);k=R(a);this._={editor:a,element:k.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],
+currentFocusIndex:0,hasFocus:!1};this.parts=k.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);k={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};k["rtl"==j?"right":"left"]=0;this.parts.dialog.setStyles(k);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){k=a.config.removeDialogTabs.split(";");for(j=0;j<
+k.length;j++)if(m=k[j].split(":"),2==m.length){var n=m[0];h[n]||(h[n]=[]);h[n].push(m[1])}a._.removeDialogTabs=h}if(a._.removeDialogTabs&&(h=a._.removeDialogTabs[b]))for(j=0;j<h.length;j++)f.removeContents(h[j]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel",
+function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,C=function(a){var b=l._.contents,c=!1,f;for(f in b)for(var d in b[f])if(c=a.call(this,b[f][d]))return};this.on("ok",function(a){C(function(b){if(b.validate){var c=b.validate(this),f="string"==typeof c||!1===c;f&&(a.data.hide=!1,a.stop());P.call(b,!f,"string"==typeof c?c:void 0);return f}})},this,null,0);this.on("cancel",function(b){C(function(c){if(c.isChanged())return confirm(a.lang.common.confirmCancel)||(b.data.hide=!1),!0})},
+this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=e;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",d,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",d);(CKEDITOR.env.opera||CKEDITOR.env.gecko)&&v.removeListener("keypress",g);C(function(a){Q.apply(a)})});this.on("iframeAdded",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",
+d,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<l._.pageCount)l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else e(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);
+for(j=0;j<f.contents.length;j++)(h=f.contents[j])&&this.addPage(h);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1)),a.data.preventDefault())},this);j=[];h=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox",className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},j).getChild();this.parts.footer.setHtml(j.join(""));
+for(j=0;j<h.length;j++)this._.buttons[h[j].id]=h[j]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=
+CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var e=this._.element.getFirst(),d="rtl"==this._.editor.lang.dir,g="fixed"==e.getComputedStyle("position");CKEDITOR.env.ie&&e.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==
+a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),d&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[d?"right":"left"]=(0<a?a:0)+"px",e.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):
+a.setStyle("display","block");if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version){var c=this.parts.dialog;c.setStyle("position","absolute");setTimeout(function(){c.setStyle("position","fixed")},0)}this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);
+this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on(CKEDITOR.env.opera?"keypress":"keyup",N);this._.hasFocus=!1;CKEDITOR.tools.setTimeout(function(){this.layout();
+T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),e=(c.width-b.width)/2,d=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<d?d:0)>c.height||
+b.width+(0<e?e:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},
+commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();
+if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener(CKEDITOR.env.opera?"keypress":"keyup",N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock()},0)}delete this._.parentDialog;
+this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");var d=CKEDITOR.env,g="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber(),
+c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',0<this._.pageCount?" cke_last":"cke_first",c,a.hidden?' style="display:none"':"",' id="',g,'"',d.gecko&&10900<=d.version&&!d.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",g);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();g=this._.contents[a.id]={};for(d=e.getChild();e=
+d.shift();)g[e.id]=e,"function"==typeof e.getChild&&d.push.apply(d,e.getChild());b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+a.accessKey]=a.id)},selectPage:function(a){if(this._.currentTabId!=a&&!0!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=this._.tabs[b][0],e=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),
+e.hide());e.setAttribute("aria-hidden",b!=a)}var d=this._.tabs[a];d[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?(q(d[1]),d[1].show(),setTimeout(function(){q(d[1],1)},0)):d[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&
+b.isVisible())&&(a==this._.currentTabId&&this.selectPage(p.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,
+b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,
+this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]||"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",
+type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==
+a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,
+buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,b,c){for(var e=0,d;d=a[e];e++)if(d.id==b||c&&d[c]&&(d=z(d[c],b,c)))return d;return null},A=function(a,b,c,e,d){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(e&&f[e]&&(f=A(f[e],b,c,e,!0)))return f}if(d)return null}a.push(b);return b},B=function(a,b,c){for(var e=0,d;d=a[e];e++){if(d.id==b)return a.splice(e,1);if(c&&d[c]&&(d=B(d[c],b,c)))return d}return null},L=function(a,b){this.dialog=a;for(var c=
+b.contents,e=0,d;d=c[e];e++)c[e]=d&&new I(a,d);CKEDITOR.tools.extend(this,b)};L.prototype={getContents:function(a){return z(this.contents,a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,
+"children")},remove:function(a){B(this.elements,a,"children")}};var G,w={},r,t={},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);
+if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},O=function(a,b,c,e,d){(t[c]||(t[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:d||a.accessKeyUp,keydown:e||a.accessKeyDown})},X=function(a){for(var b in t){for(var c=t[b],e=c.length-1;0<=e;e--)(c[e].dialog==a||c[e].uiElement==a)&&c.splice(e,1);0===c.length&&delete t[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},
+Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,e,d,g,f){if(!(4>arguments.length)){var k=(e.call?e(b):e)||"div",m=["<",k," "],j=(d&&d.call?d(b):d)||{},h=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",i=this.domId=h.id||CKEDITOR.tools.getNextId()+"_uiElement";this.id=b.id;h.id=i;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var l=h["class"]&&h["class"].split?h["class"].split(" "):[],i=0;i<l.length;i++)l[i]&&
+(n[l[i]]=1);l=[];for(i in n)l.push(i);h["class"]=l.join(" ");b.title&&(h.title=b.title);n=(b.style||"").split(";");b.align&&(l=b.align,j["margin-left"]="left"==l?0:"auto",j["margin-right"]="right"==l?0:"auto");for(i in j)n.push(i+":"+j[i]);b.hidden&&n.push("display:none");for(i=n.length-1;0<=i;i--)""===n[i]&&n.splice(i,1);0<n.length&&(h.style=(h.style?h.style+"; ":"")+n.join("; "));for(i in h)m.push(i+'="'+CKEDITOR.tools.htmlEncode(h[i])+'" ');m.push(">",o,"</",k,">");c.push(m.join(""));(this._||
+(this._={})).dialog=a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));CKEDITOR.event.implementOn(this);
+this.registerEvents(b);this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=
+a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}));CKEDITOR.tools.extend(this,b)}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.widths||null,k=d&&d.height||null,m,j={role:"presentation"};d&&d.align&&(j.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},j,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(m=0;m<c.length;m++){var b="cke_dialog_ui_hbox_child",
+e=[];0===m&&(b="cke_dialog_ui_hbox_first");m==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[m]&&e.push("width:"+s(f[m])):e.push("width:"+Math.floor(100/c.length)+"%");k&&e.push("height:"+s(k));d&&void 0!=d.padding&&e.push("padding:"+s(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[m].align)&&e.push("text-align:"+g[m].align);0<e.length&&a.push('style="'+e.join("; ")+'" ');a.push(">",c[m],"</td>")}a.push("</tr></tbody>");return a.join("")})}},vbox:function(a,
+b,c,e,d){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.width||null,k=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];b.push('style="');d&&d.expand&&b.push("height:100%;");b.push("width:"+s(f||"100%"),";");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(d&&d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');
+b.push("><tbody>");for(var e=0;e<c.length;e++){var h=[];b.push('<tr><td role="presentation" ');f&&h.push("width:"+s(f||"100%"));k?h.push("height:"+s(k[e])):d&&d.expand&&h.push("height:"+Math.floor(100/c.length)+"%");d&&void 0!=d.padding&&h.push("padding:"+s(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[e].align)&&h.push("text-align:"+g[e].align);0<h.length&&b.push('style="',h.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',c[e],"</td></tr>")}b.push("</tbody></table>");return b.join("")})}}}})();
+CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=this.getInputElement();(a=a.getParent())&&-1==a.$.className.search("cke_dialog_page_contents"););
+if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=/^on([A-Z]\w+)/,c,e=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},d;for(d in a)if(c=d.match(b))this.eventProcessors[d]?this.eventProcessors[d].call(this,this._.dialog,a[d]):e(this,this._.dialog,c[1].toLowerCase(),a[d]);return this},eventProcessors:{onLoad:function(a,
+b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")},isVisible:function(){return this.getInputElement().isVisible()},
+isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,
+c,e){for(var d=c.children,g,f=[],k=[],m=0;m<d.length&&(g=d[m]);m++){var j=[];f.push(j);k.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,j))}return new CKEDITOR.ui.dialog[c.type](a,k,f,e,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){CKEDITOR.env.opera?CKEDITOR.tools.setTimeout(function(){a.openDialog(this.dialogName)},
+0,this):a.openDialog(this.dialogName)},canUndo:!1,editorFocus:CKEDITOR.env.ie||CKEDITOR.env.webkit};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue():a[0],c=void 0,d=CKEDITOR.VALIDATE_AND,
+e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var i=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)i=d==CKEDITOR.VALIDATE_AND?i&&e[g](b):i||e[g](b);return!i?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,a)},number:function(a){return this.regex(c,
+a)},cssLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed",function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=
+CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,e=CKEDITOR.dialog._.dialogDefinitions[a];null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof e)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,c),c.show();else{if("failed"==e)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+
+a+'" failed when loading definition.');"string"==typeof e&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(e),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})();
+CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(p){p.on("contentDom",function(){var u=p.editable();u.attachListener(u,"dblclick",function(q){if(p.readOnly)return!1;q={element:q.data.getTarget()};p.fire("doubleclick",q);q.dialog&&p.openDialog(q.dialog);return 1})})}});CKEDITOR.plugins.add("about",{requires:"dialog",init:function(a){var b=a.addCommand("about",new CKEDITOR.dialogCommand("about"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton("About",{label:a.lang.about.title,command:"about",toolbar:"about"});CKEDITOR.dialog.add("about",this.path+"dialogs/about.js")}});(function(){CKEDITOR.plugins.add("a11yhelp",{requires:"dialog",availableLangs:{en:1,ar:1,bg:1,ca:1,et:1,cs:1,cy:1,da:1,de:1,el:1,eo:1,es:1,fa:1,fi:1,fr:1,gu:1,he:1,hi:1,hr:1,hu:1,it:1,ja:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ro:1,ru:1,sk:1,sl:1,sv:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1},init:function(b){var c=this;b.addCommand("a11yHelp",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?a:c.availableLangs[a.replace(/-.*/,"")]?a.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+
+"dialogs/lang/"+a+".js"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog("a11yHelp")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,"a11yHelp");CKEDITOR.dialog.add("a11yHelp",this.path+"dialogs/a11yhelp.js")}})})();CKEDITOR.plugins.add("basicstyles",{init:function(c){var f=0,a=function(a,d,b,e){e&&(e=new CKEDITOR.style(e),c.attachStyleStateChange(e,function(a){!c.readOnly&&c.getCommand(b).setState(a)}),c.addCommand(b,new CKEDITOR.styleCommand(e)),c.ui.addButton&&c.ui.addButton(a,{label:d,command:b,toolbar:"basicstyles,"+(f+=10)}))},d=c.config,b=c.lang.basicstyles;a("Bold",b.bold,"bold",d.coreStyles_bold);a("Italic",b.italic,"italic",d.coreStyles_italic);a("Underline",b.underline,"underline",d.coreStyles_underline);
+a("Strike",b.strike,"strike",d.coreStyles_strike);a("Subscript",b.subscript,"subscript",d.coreStyles_subscript);a("Superscript",b.superscript,"superscript",d.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};
+CKEDITOR.config.coreStyles_strike={element:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"};CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges(!0)[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();
+f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,
+tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];
+for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")||
+(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type==
+CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote"};
+CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();(function(){function v(b){function a(){var e=b.editable();e.on(q,function(b){(!CKEDITOR.env.ie||!m)&&u(b)});CKEDITOR.env.ie&&e.on("paste",function(e){r||(f(),e.data.preventDefault(),u(e),l("paste")||b.openDialog("paste"))});CKEDITOR.env.ie&&(e.on("contextmenu",h,null,null,0),e.on("beforepaste",function(b){b.data&&!b.data.$.ctrlKey&&h()},null,null,0));e.on("beforecut",function(){!m&&j(b)});e.on("mouseup",function(){setTimeout(function(){s()},0)});e.on("keyup",s)}function d(e){return{type:e,canUndo:"cut"==
+e,startDisabled:!0,exec:function(){"cut"==this.type&&j();var e;var a=this.type;if(CKEDITOR.env.ie)e=l(a);else try{e=b.document.$.execCommand(a,!1,null)}catch(c){e=!1}e||alert(b.lang.clipboard[this.type+"Error"]);return e}}}function c(){return{canUndo:!1,async:!0,exec:function(b,a){var c=function(a,c){a&&g(a.type,a.dataValue,!!c);b.fire("afterCommandExec",{name:"paste",command:d,returnValue:!!a})},d=this;"string"==typeof a?c({type:"auto",dataValue:a},1):b.getClipboardData(c)}}}function f(){r=1;setTimeout(function(){r=
+0},100)}function h(){m=1;setTimeout(function(){m=0},10)}function l(e){var a=b.document,c=a.getBody(),d=!1,j=function(){d=!0};c.on(e,j);(7<CKEDITOR.env.version?a.$:a.$.selection.createRange()).execCommand(e);c.removeListener(e,j);return d}function g(e,a,c){e={type:e};if(c&&!b.fire("beforePaste",e)||!a)return!1;e.dataValue=a;return b.fire("paste",e)}function j(){if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var e=b.getSelection(),a,c,d;if(e.getType()==CKEDITOR.SELECTION_ELEMENT&&(a=e.getSelectedElement()))c=
+e.getRanges()[0],d=b.document.createText(""),d.insertBefore(a),c.setStartBefore(d),c.setEndAfter(a),e.selectRanges([c]),setTimeout(function(){a.getParent()&&(d.remove(),e.selectElement(a))},0)}}function k(a,c){var d=b.document,j=b.editable(),k=function(b){b.cancel()},f=CKEDITOR.env.gecko&&10902>=CKEDITOR.env.version;if(!d.getById("cke_pastebin")){var h=b.getSelection(),o=h.createBookmarks(),i=new CKEDITOR.dom.element(j.is("body")&&!CKEDITOR.env.ie&&!CKEDITOR.env.opera?"body":"div",d);i.setAttribute("id",
+"cke_pastebin");CKEDITOR.env.opera&&i.appendBogus();var g=0,d=d.getWindow();f?(i.insertAfter(o[0].startNode),i.setStyle("display","inline")):(CKEDITOR.env.webkit?(j.append(i),i.addClass("cke_editable"),g=(j.is("body")?j:CKEDITOR.dom.element.get(i.$.offsetParent)).getDocumentPosition().y):j.getAscendant(CKEDITOR.env.ie||CKEDITOR.env.opera?"body":"html",1).append(i),i.setStyles({position:"absolute",top:d.getScrollPosition().y-g+10+"px",width:"1px",height:Math.max(1,d.getViewPaneSize().height-20)+"px",
+overflow:"hidden",margin:0,padding:0}));(f=i.getParent().isReadOnly())?(i.setOpacity(0),i.setAttribute("contenteditable",!0)):i.setStyle("ltr"==b.config.contentsLangDirection?"left":"right","-1000px");b.on("selectionChange",k,null,null,0);f&&i.focus();f=new CKEDITOR.dom.range(i);f.selectNodeContents(i);var l=f.select();if(CKEDITOR.env.ie)var m=j.once("blur",function(){b.lockSelection(l)});var n=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit||CKEDITOR.env.opera)CKEDITOR.document[CKEDITOR.env.webkit?
+"getBody":"getDocumentElement"]().$.scrollTop=n;m&&m.removeListener();CKEDITOR.env.ie&&j.focus();h.selectBookmarks(o);i.remove();var a;if(CKEDITOR.env.webkit&&(a=i.getFirst())&&a.is&&a.hasClass("Apple-style-span"))i=a;b.removeListener("selectionChange",k);c(i.getHtml())},0)}}function o(){if(CKEDITOR.env.ie){b.focus();f();var a=b.focusManager;a.lock();if(b.editable().fire(q)&&!l("paste"))return a.unlock(),!1;a.unlock()}else try{if(b.editable().fire(q)&&!b.document.$.execCommand("Paste",!1,null))throw 0;
+}catch(c){return!1}return!0}function p(a){if("wysiwyg"==b.mode)switch(a.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:a=b.editable();f();!CKEDITOR.env.ie&&a.fire("beforepaste");(CKEDITOR.env.opera||CKEDITOR.env.gecko&&10900>CKEDITOR.env.version)&&a.fire("paste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:b.fire("saveSnapshot"),setTimeout(function(){b.fire("saveSnapshot")},0)}}function u(a){var c={type:"auto"},d=b.fire("beforePaste",c);k(a,function(b){b=b.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,
+"");d&&g(c.type,b,0,1)})}function s(){if("wysiwyg"==b.mode){var a=n("Paste");b.getCommand("cut").setState(n("Cut"));b.getCommand("copy").setState(n("Copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function n(a){var c;if(t&&a in{Paste:1,Cut:1})return CKEDITOR.TRISTATE_DISABLED;if("Paste"==a){CKEDITOR.env.ie&&(m=1);try{c=b.document.$.queryCommandEnabled(a)||CKEDITOR.env.webkit}catch(d){}m=0}else a=b.getSelection(),c=a.getRanges(),c=a.type!=CKEDITOR.SELECTION_NONE&&!(1==c.length&&c[0].collapsed);
+return c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}var m=0,r=0,t=0,q=CKEDITOR.env.ie?"beforepaste":"paste";(function(){b.on("key",p);b.on("contentDom",a);b.on("selectionChange",function(b){t=b.data.selection.getRanges()[0].checkReadOnly();s()});b.contextMenu&&b.contextMenu.addListener(function(b,a){t=a.getRanges()[0].checkReadOnly();return{cut:n("Cut"),copy:n("Copy"),paste:n("Paste")}})})();(function(){function a(c,d,j,e,f){var k=b.lang.clipboard[d];b.addCommand(d,j);b.ui.addButton&&b.ui.addButton(c,
+{label:k,command:d,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(d,{label:k,command:d,group:"clipboard",order:f})}a("Cut","cut",d("cut"),10,1);a("Copy","copy",d("copy"),20,4);a("Paste","paste",c(),30,8)})();b.getClipboardData=function(a,c){function d(a){a.removeListener();a.cancel();c(a.data)}function j(a){a.removeListener();a.cancel();g=!0;c({type:h,dataValue:a.data})}function f(){this.customTitle=a&&a.title}var k=!1,h="auto",g=!1;c||(c=a,a=null);b.on("paste",d,null,null,0);b.on("beforePaste",
+function(a){a.removeListener();k=true;h=a.data.type},null,null,1E3);!1===o()&&(b.removeListener("paste",d),k&&b.fire("pasteDialog",f)?(b.on("pasteDialogCommit",j),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",j);setTimeout(function(){g||c(null)},10)})):c(null))}}function w(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi)&&
+!b.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko||CKEDITOR.env.opera){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function x(b,a){function d(a){return CKEDITOR.tools.repeat("</p><p>",~~(a/2))+(1==a%2?"<br>":"")}a=a.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1<a.indexOf("<div>")&&
+(a=a.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),a.match(/<div>(<br>|)<\/div>/)&&(a="<p>"+a.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return d(a.split("</div><div>").length+1)})+"</p>"),a=a.replace(/<\/div><div>/g,"<br>"),a=a.replace(/<\/?div>/g,""));if((CKEDITOR.env.gecko||CKEDITOR.env.opera)&&b.enterMode!=CKEDITOR.ENTER_BR)CKEDITOR.env.gecko&&(a=a.replace(/^<br><br>$/,"<br>")),-1<a.indexOf("<br><br>")&&(a="<p>"+
+a.replace(/(<br>){2,}/g,function(a){return d(a.length/4)})+"</p>");return p(b,a)}function y(){var b=new CKEDITOR.htmlParser.filter,a={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},d=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),c={p:1,br:1,"cke:br":1},f=CKEDITOR.dtd,h=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),l=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},
+g=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};b.addRules({elements:{h1:g,h2:g,h3:g,h4:g,h5:g,h6:g,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt||""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:l,th:l,$:function(b){var k=b.name,g;if(h[k])return!1;delete b.attributes;if("br"==k)return b;if(a[k])b.name=
+"p";else if(d[k])delete b.name;else if(f[k]){g=new CKEDITOR.htmlParser.element("cke:br");g.isEmpty=!0;if(CKEDITOR.dtd.$empty[k])return g;b.add(g,0);g=g.clone();g.isEmpty=!0;b.add(g);delete b.name}c[b.name]||delete b.name;return b}}});return b}function z(b,a,d){var a=new CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,d);var a=c.getHtml(),a=a.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,
+"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,""),f=0,a=a.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++f)return"</p><p>"}else if(0<--f)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return p(b,a)}function p(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"<$1div>"));
+return a}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a;v(b);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));b.on("paste",function(a){var b=a.data.dataValue,f=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi," "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&
+(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var h,l,g=new CKEDITOR.dom.element("div");for(g.setHtml(b);1==g.getChildCount()&&(h=g.getFirst())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.hasClass("cke_editable")||h.hasClass("cke_contents"));)g=l=h;l&&(b=l.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,
+c){if(c.toLowerCase()in f){a.data.preSniffing="html";return"<"+c}return b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,c){if(c in f){a.data.endsWithEOL=1;return"</"+c+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null,null,3);b.on("paste",function(d){var d=d.data,c=d.type,f=d.dataValue,h,l=b.config.clipboard_defaultContentType||"html";h="html"==c||"html"==d.preSniffing?"html":w(f);"htmlifiedtext"==h?f=x(b.config,f):"text"==c&&"html"==
+h&&(f=z(b.config,f,a||(a=y(b))));d.startsWithEOL&&(f='<br data-cke-eol="1">'+f);d.endsWithEOL&&(f+='<br data-cke-eol="1">');"auto"==c&&(c="html"==h||"html"==l?"html":"text");d.type=c;d.dataValue=f;delete d.preSniffing;delete d.startsWithEOL;delete d.endsWithEOL},null,null,6);b.on("paste",function(a){a=a.data;b.insertHtml(a.dataValue,a.type);setTimeout(function(){b.fire("afterPaste")},0)},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}})})();(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var e=CKEDITOR.addTemplate("panel",
+'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),f=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="application" frameborder="0" src="{src}"></iframe>'),g=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>');
+CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(g.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+
+b+");"},c)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("key"+(CKEDITOR.env.opera?"press":"down"),function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var c=
+{editorId:a.id,id:this.id,langCode:a.langCode,dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};this.isFramed&&(c.frame=f.output({id:this.id+"_frame",src:"javascript:void(document.open(),"+(CKEDITOR.env.isCustomDomain()?"document.domain='"+document.domain+"',":"")+'document.close())">'}));var d=e.output(c);b&&b.push(d);return d},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?b:new CKEDITOR.ui.panel.block(this.getHolderElement(),
+b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,c=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&(c.removeAttributes(b.attributes),b.hide());this._.currentBlock=a;c.setAttributes(a.attributes);CKEDITOR.fire("ariaWidget",c);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,a);a.show();return a},destroy:function(){this.element&&
+this.element.remove()}};CKEDITOR.ui.panel.block=CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabIndex:-1,"class":"cke_panel_block",role:"presentation"},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.attributes.title||(this.attributes.title=this.attributes["aria-label"]);this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=
+a),(CKEDITOR.env.webkit||CKEDITOR.env.opera)&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a){var b=this.keys[a];switch(b){case "next":for(var a=this._.focusIndex,b=this.element.getElementsByTag("a"),c;c=b.getItem(++a);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=
+a;c.focus();break}return!1;case "prev":a=this._.focusIndex;for(b=this.element.getElementsByTag("a");0<a&&(c=b.getItem(--a));)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=a;c.focus();break}return!1;case "click":case "mouseup":return a=this._.focusIndex,(c=0<=a&&this.element.getElementsByTag("a").getItem(a))&&(c.$[b]?c.$[b]():c.$["on"+b]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"});
+(function(){function o(a,b,c,h,g){var g=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",h.css||"",g||""),e=i[g];e||(e=i[g]=new CKEDITOR.ui.panel(b,h),e.element=c.append(CKEDITOR.dom.element.createFromHtml(e.render(a),b)),e.element.setStyles({display:"none",position:"absolute"}));return e}var i={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,h){function g(){j.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&
+(b=CKEDITOR.document.getById("cke_"+a.name));var e=b.getDocument(),h=o(a,e,b,c,h||0),k=h.element,d=k.getFirst(),j=this;k.disableContextMenu();k.setAttribute("role","application");this.element=k;this._={editor:a,panel:h,parentElement:b,definition:c,document:e,iframe:d,children:[],dir:a.lang.dir};a.on("mode",g);a.on("resize",g);e.getWindow().on("resize",g)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)},
+showBlock:function(a,b,c,h,g){var e=this._.panel,k=e.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),j=d.getDocument(),i=this._.parentElement.getPositionedAncestor(),n=b.getDocumentPosition(j),j=i?i.getDocumentPosition(j):{x:0,y:0},m="rtl"==this._.dir,f=n.x+(h||0)-j.x,l=n.y+(g||0)-j.y;if(m&&(1==c||4==
+c))f+=b.$.offsetWidth;else if(!m&&(2==c||3==c))f+=b.$.offsetWidth-1;if(3==c||4==c)l+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:l+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&(delete this._.returnFocus,this.hide())},this),a.on("focus",
+function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.event.useCapture=!1,this._.blurSet=1);e.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(k.autoSize){var a=k.element.getDocument(),a=(CKEDITOR.env.webkit?k.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth||
+0)+3));d.setStyle("width",a+10+"px");a=k.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");e._.currentBlock.element.setStyle("display","none").removeStyle("display")}else d.removeStyle("height");m&&(f=f-d.$.offsetWidth);d.setStyle("left",f+"px");var b=e.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,g=a.height||a.bottom-a.top,h=m?a.right:b.width-a.left,
+i=m?b.width-a.right:a.left;m?h<c&&(f=i>c?f+c:b.width>c?f-a.left:f-a.right+b.width):h<c&&(f=i>c?f-c:b.width>c?f-a.right+b.width:f-a.left);c=a.top;b.height-a.top<g&&(l=c>g?l-g:b.height>g?l-a.bottom+b.height:l-a.top);if(CKEDITOR.env.ie){b=a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(f=CKEDITOR.env.ie8Compat?f-d.getDocument().getDocumentElement().$.scrollLeft*2:f-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(),
+j;(j=a.getCustomData("activePanel"))&&j.onHide&&j.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:l+"px",left:f+"px"});d.setOpacity(1)},this);e.isLoaded?a():e.onLoad=a;CKEDITOR.tools.setTimeout(function(){this.focus();this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||
+this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),
+a.focus();delete this._.lastFocused;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!=a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,h,g,e){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,h,g,e),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&
+setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in i){var c=i[b];a?c.destroy():c.element.hide()}a&&(i={})})})();CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(k){for(var g=k.config.menu_groups.split(","),m=k._.menuGroups={},l=k._.menuItems={},a=0;a<g.length;a++)m[g[a]]=a+1;k.addMenuGroup=function(b,a){m[b]=a||100};k.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};k.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};k.getMenuItem=function(a){return l[a]};k.removeMenuItem=function(a){delete l[a]}}});
+(function(){function k(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var g='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem" aria-haspopup="{hasPopup}" aria-disabled="{disabled}" aria-pressed="{pressed}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)g+=' onkeypress="return false;"';
+CKEDITOR.env.gecko&&(g+=' onblur="this.style.cssText = this.style.cssText;"');var g=g+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",g+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'),
+l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),j=c.block.attributes=c.attributes||{};!j.role&&(j.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a=
+this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),j=this._.listeners;this.removeAll();for(var e=0;e<j.length;e++){var i=j[e](b,a,c);if(i)for(var f in i){var h=this.editor.getMenuItem(f);if(h&&(!h.command||this.editor.getCommand(h.command).state))h.state=i[f],this.add(h)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1},
+onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var j in c){var e=this.editor.getMenuItem(j);e&&(e.state=c[j],b.add(e))}var i=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(i,
+2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,j){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,i=this.editor,f=this._.panel,h=this._.element;if(!f){f=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);f.onEscape=CKEDITOR.tools.bind(function(a){if(!1===
+this._.onEscape(a))return!1},this);f.onShow=function(){f._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};f.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);h=f.addBlock(this.id,this._.panelDefinition.block);h.autoSize=!0;var d=h.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==i.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");h=this._.element=
+h.element;d=h.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,i.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=
+this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}k(e);for(var d=i.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=i.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],g=e.length,m=g&&e[0].group,l=0;l<g;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");h.setHtml(d.join(""));CKEDITOR.ui.fire("ready",
+this);this.parent?this.parent._.panel.showAsChild(f,this.id,a,b,c,j):f.showBlock(this.id,a,b,c,j);i.fire("menuShow",[f])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var g=a.id+(""+
+b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off",f=this.getItems,h="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",d=this.name;this.icon&&!/\./.test(this.icon)&&(d=this.icon);a={id:g,name:this.name,iconName:d,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true":"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,pressed:e==CKEDITOR.TRISTATE_ON,title:this.label,href:"javascript:void('"+(this.label||
+"").replace("'")+"')",hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(d,"rtl"==this.editor.lang.dir,d==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:h}):""};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(b){this.base.call(this,b,{panel:{className:"cke_menu_panel",attributes:{"aria-label":b.lang.contextmenu.options}}})},proto:{addTarget:function(b,d){if(CKEDITOR.env.opera&&!("oncontextmenu"in document.body)){var c;b.on("mousedown",function(a){a=a.data;if(2!=a.$.button)a.getKeystroke()==CKEDITOR.CTRL+1&&b.fire("contextmenu",a);else if(!d||!(CKEDITOR.env.mac?
+a.$.metaKey:a.$.ctrlKey)){var g=a.getTarget();c||(g=g.getDocument(),c=g.createElement("input"),c.$.type="button",g.getBody().append(c));c.setAttribute("style","position:absolute;top:"+(a.$.clientY-2)+"px;left:"+(a.$.clientX-2)+"px;width:5px;height:5px;opacity:0.01")}});b.on("mouseup",function(a){c&&(c.remove(),c=void 0,b.fire("contextmenu",a.data))})}b.on("contextmenu",function(a){a=a.data;if(!d||!(CKEDITOR.env.webkit?e:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey)){a.preventDefault();var b=a.getTarget().getDocument(),
+c=a.getTarget().getDocument().getDocumentElement(),f=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),h=f?a.$.clientX:a.$.pageX||b.x+a.$.clientX,i=f?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(c,null,h,i)},CKEDITOR.env.ie?200:0,this)}},this);if(CKEDITOR.env.opera)b.on("keypress",function(a){a=a.data;0===a.$.keyCode&&a.preventDefault()});if(CKEDITOR.env.webkit){var e,f=function(){e=0};b.on("keydown",function(a){e=CKEDITOR.env.mac?a.data.$.metaKey:
+a.data.$.ctrlKey});b.on("keyup",f);b.on("contextmenu",f)}},open:function(b,d,c,e){this.editor.focus();b=b||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(b,d,c,e)}}})},beforeInit:function(b){var d=b.contextMenu=new CKEDITOR.plugins.contextMenu(b);b.on("contentDom",function(){d.addTarget(b.editable(),!1!==b.config.browserContextMenuOnCtrl)});b.addCommand("contextMenu",{exec:function(){b.contextMenu.open(b.document.getBody())}});b.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");
+b.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o,a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0==a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0==a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0==a.resize_minWidth&&(a.resize_minWidth=750);void 0==a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var c=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,
+l=("both"==a.resize_dir||"vertical"==a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,j=function(d){var e=f,m=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=m+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));l&&(m=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,m)},k=function(){CKEDITOR.document.removeListener("mousemove",j);CKEDITOR.document.removeListener("mouseup",k);b.document&&(b.document.removeListener("mousemove",j),b.document.removeListener("mouseup",
+k))},p=CKEDITOR.tools.addFunction(function(d){c||(c=b.getResizable());f=c.$.offsetWidth||0;g=c.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",j);CKEDITOR.document.on("mouseup",k);b.document&&(b.document.on("mousemove",j),b.document.on("mouseup",k));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});b.on("uiSpace",function(a){if("bottom"==
+a.data.space){var e="";i&&!l&&(e=" cke_resizer_horizontal");!i&&l&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"â—¢":"â—£")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}});(function(){var a='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)a+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(a+=' onblur="this.style.cssText = this.style.cssText;"');var a=
+a+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),a=a+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label">{label}</span>{arrowHtml}</a>',
+m=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),n=CKEDITOR.addTemplate("button",a);CKEDITOR.plugins.add("button",{beforeInit:function(b){b.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(b){CKEDITOR.tools.extend(this,b,{title:b.label,click:b.click||function(e){e.execCommand(b.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(b){return new CKEDITOR.ui.button(b)}};
+CKEDITOR.ui.button.prototype={render:function(b,e){var a=CKEDITOR.env,i=this._.id=CKEDITOR.tools.getNextId(),f="",d=this.command,l;this._.editor=b;var c={id:i,button:this,editor:b,focus:function(){CKEDITOR.document.getById(i).focus()},execute:function(){this.button.click(b)},attach:function(b){this.button.attach(b)}},o=CKEDITOR.tools.addFunction(function(b){if(c.onkey)return b=new CKEDITOR.dom.event(b),!1!==c.onkey(c,b.getKeystroke())}),p=CKEDITOR.tools.addFunction(function(b){var a;c.onfocus&&(a=
+!1!==c.onfocus(c,new CKEDITOR.dom.event(b)));CKEDITOR.env.gecko&&10900>CKEDITOR.env.version&&b.preventBubble();return a}),j=0,q=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var a=b.editable();a.isInline()&&a.hasFocus&&(b.lockSelection(),j=1)}});c.clickFn=l=CKEDITOR.tools.addFunction(function(){j&&(b.unlockSelection(1),j=0);c.execute()});if(this.modes){var k={},g=function(){var a=b.mode;a&&(a=this.modes[a]?void 0!=k[a]?k[a]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,this.setState(b.readOnly&&
+!this.readOnly?CKEDITOR.TRISTATE_DISABLED:a))};b.on("beforeModeUnload",function(){b.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(k[b.mode]=this._.state)},this);b.on("mode",g,this);!this.readOnly&&b.on("readOnly",g,this)}else if(d&&(d=b.getCommand(d)))d.on("state",function(){this.setState(d.state)},this),f+=d.state==CKEDITOR.TRISTATE_ON?"on":d.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)b.on("contentDirChanged",function(a){var e=CKEDITOR.document.getById(this._.id),c=
+e.getFirst(),a=a.data;a!=b.lang.dir?e.addClass("cke_"+a):e.removeClass("cke_ltr").removeClass("cke_rtl");c.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==a,this.icon,this.iconOffset))},this);d||(f+="off");var h=g=this.name||this.command;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);a={id:i,name:g,iconName:h,label:this.label,cls:this.className||"",state:f,title:this.title,titleJs:a.gecko&&10900<=a.version&&!a.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?
+"true":"false",keydownFn:o,mousedownFn:q,focusFn:p,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==b.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?m.output():""};n.output(a,e);if(this.onRender)this.onRender();return c},setState:function(b){if(this._.state==b)return!1;this._.state=b;var a=CKEDITOR.document.getById(this._.id);return a?(a.setState(b,"cke_button"),b==CKEDITOR.TRISTATE_DISABLED?a.setAttribute("aria-disabled",!0):a.removeAttribute("aria-disabled"),b==CKEDITOR.TRISTATE_ON?
+a.setAttribute("aria-pressed",!0):a.removeAttribute("aria-pressed"),!0):!1}};CKEDITOR.ui.prototype.addButton=function(b,a){this.add(b,CKEDITOR.UI_BUTTON,a)}})();(function(){function w(a){function e(){for(var b=h(),g=CKEDITOR.tools.clone(a.config.toolbarGroups)||o(a),f=0;f<g.length;f++){var d=g[f];if("/"!=d){"string"==typeof d&&(d=g[f]={name:d});var e,n=d.groups;if(n)for(var l=0;l<n.length;l++)e=n[l],(e=b[e])&&c(d,e);(e=b[d.name])&&c(d,e)}}return g}function h(){var b={},c,f,d;for(c in a.ui.items)f=a.ui.items[c],d=f.toolbar||"others",d=d.split(","),f=d[0],d=parseInt(d[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:d});for(f in b)b[f]=b[f].sort(function(a,
+b){return a.order==b.order?0:0>b.order?-1:0>a.order?1:a.order<b.order?-1:1});return b}function c(a,c){if(c.length){a.items?a.items.push("-"):a.items=[];for(var d;d=c.shift();)a.items.push(d.name)}}var d=a.config.toolbar;"string"==typeof d&&(d=a.config["toolbar_"+d]);return a.toolbar=d||e()}function o(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},
+{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list","indent","blocks","align"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var t=function(){this.toolbars=[];this.focusCommandExecuted=!1};t.prototype.focus=function(){for(var a=0,e;e=this.toolbars[a++];)for(var h=0,c;c=e.items[h++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&
+(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var e,h=function(c,d){var b,g="rtl"==a.lang.dir,f=a.config.toolbarGroupCycling,f=void 0===f||f;switch(d){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==d?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-
+1],b.items.length)for(c=b.items[e?b.items.length-1:0];c&&!c.focus;)(c=e?c.previous:c.next)||(b=0);c&&c.focus();return!1;case g?37:39:case 40:b=c;do b=b.next,!b&&f&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():h(c,9);return!1;case g?39:37:case 38:b=c;do b=b.previous,!b&&f&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(e=1,h(c,CKEDITOR.SHIFT+9),e=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),!1}return!0};a.on("uiSpace",function(c){if(c.data.space==
+a.config.toolbarLocation){a.toolbox=new t;var d=CKEDITOR.tools.getNextId(),b=a.config.removeButtons,b=b&&b.split(","),g=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,f,e;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&g.push('<span class="cke_toolbox_main"'+(d?">":' style="display:none">'));
+for(var o=a.toolbox.toolbars,n=w(a),l=0;l<n.length;l++){var j,i=0,q,m=n[l],r;if(m)if(f&&(g.push("</span>"),e=f=0),"/"===m)g.push('<span class="cke_toolbar_break"></span>');else{r=m.items||m;for(var s=0;s<r.length;s++){var k;k=r[s];var u;if(!(b&&0<=CKEDITOR.tools.indexOf(b,k))&&(k=a.ui.create(k)))if(k.type==CKEDITOR.UI_SEPARATOR)e=f&&k;else{u=!1!==k.canGroup;if(!i){j=CKEDITOR.tools.getNextId();i={id:j,items:[]};q=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);g.push('<span id="',j,'" class="cke_toolbar"',
+q?' aria-labelledby="'+j+'_label"':"",' role="toolbar">');q&&g.push('<span id="',j,'_label" class="cke_voice_label">',q,"</span>");g.push('<span class="cke_toolbar_start"></span>');var p=o.push(i)-1;0<p&&(i.previous=o[p-1],i.previous.next=i)}u?f||(g.push('<span class="cke_toolgroup" role="presentation">'),f=1):f&&(g.push("</span>"),f=0);j=function(b){b=b.render(a,g);p=i.items.push(b)-1;if(p>0){b.previous=i.items[p-1];b.previous.next=b}b.toolbar=i;b.onkey=h;b.onfocus=function(){a.toolbox.focusCommandExecuted||
+a.focus()}};e&&(j(e),e=0);j(k)}}f&&(g.push("</span>"),e=f=0);i&&g.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&g.push("</span>");if(a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(a){var b=a.ui.space("toolbar_collapser"),c=b.getPrevious(),d=
+a.ui.space("contents"),e=c.getParent(),f=parseInt(d.$.style.height,10),g=e.$.offsetHeight,h=b.hasClass("cke_toolbox_collapser_min");h?(c.show(),b.removeClass("cke_toolbox_collapser_min"),b.setAttribute("title",a.lang.toolbar.toolbarCollapse)):(c.hide(),b.addClass("cke_toolbox_collapser_min"),b.setAttribute("title",a.lang.toolbar.toolbarExpand));b.getFirst().setText(h?"â–²":"â—€");d.setStyle("height",f-(e.$.offsetHeight-g)+"px");a.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+
+(CKEDITOR.env.ie||CKEDITOR.env.webkit?189:109),"toolbarCollapse");g.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');d||g.push(" cke_toolbox_collapser_min");g.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}g.push("</span>");c.data.html+=g.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,f;for(a=this.toolbox.toolbars;d<
+a.length;d++){e=a[d].items;for(b=0;b<e.length;b++)f=e[b],f.clickFn&&CKEDITOR.tools.removeFunction(f.clickFn),f.keyDownFn&&CKEDITOR.tools.removeFunction(f.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');
+return{}}}}})}});CKEDITOR.ui.prototype.addToolbarGroup=function(a,e,h){var c=o(this.editor),d=0===e,b={name:a};if(h){if(h=CKEDITOR.tools.search(c,function(a){return a.name==h})){!h.groups&&(h.groups=[]);if(e&&(e=CKEDITOR.tools.indexOf(h.groups,e),0<=e)){h.groups.splice(e+1,0,a);return}d?h.groups.splice(0,0,a):h.groups.push(a);return}e=null}e&&(e=CKEDITOR.tools.indexOf(c,function(a){return a.name==e}));d?c.splice(0,0,a):"number"==typeof e?c.splice(e+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator";
+CKEDITOR.config.toolbarLocation="top";(function(){var o={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}},m='<span class="cke_path_empty">&nbsp;</span>',d="";if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)d+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');var p=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+
+(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version?' onfocus="event.preventBubble();"':"")+d+' hidefocus="true" onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');CKEDITOR.plugins.add("elementspath",{init:function(a){function d(b){a.focus();b=a._.elementsPath.list[b];if(b.equals(a.editable())){var e=a.createRange();e.selectNodeContents(b);e.select()}else a.getSelection().selectElement(b)}
+function h(){i&&i.setHtml(m);delete a._.elementsPath.list}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var l=a.ui.spaceId("path"),i,n="cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_";a._.elementsPath={idBase:n,filters:[]};a.on("uiSpace",function(b){"bottom"==b.data.space&&(b.data.html+='<span id="'+l+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+l+'" class="cke_path" role="group" aria-labelledby="'+l+'_label">'+m+"</span>")});a.on("uiReady",function(){var b=
+a.ui.space("path");b&&a.focusManager.add(b,1)});var q=CKEDITOR.tools.addFunction(d),r=CKEDITOR.tools.addFunction(function(b,e){var c=a._.elementsPath.idBase,f,e=new CKEDITOR.dom.event(e);f="rtl"==a.lang.dir;switch(e.getKeystroke()){case f?39:37:case 9:return(f=CKEDITOR.document.getById(c+(b+1)))||(f=CKEDITOR.document.getById(c+"0")),f.focus(),!1;case f?37:39:case CKEDITOR.SHIFT+9:return(f=CKEDITOR.document.getById(c+(b-1)))||(f=CKEDITOR.document.getById(c+(a._.elementsPath.list.length-1))),f.focus(),
+!1;case 27:return a.focus(),!1;case 13:case 32:return d(b),!1}return!0});a.on("selectionChange",function(b){for(var e=a.editable(),c=b.data.selection.getStartElement(),b=[],f=a._.elementsPath.list=[],d=a._.elementsPath.filters;c;){var j=0,g;g=c.data("cke-display-name")?c.data("cke-display-name"):c.data("cke-real-element-type")?c.data("cke-real-element-type"):c.getName();for(var k=0;k<d.length;k++){var h=d[k](c,g);if(!1===h){j=1;break}g=h||g}j||(j=f.push(c)-1,k=a.lang.elementspath.eleTitle.replace(/%1/,
+g),g=p.output({id:n+j,label:k,text:g,jsTitle:"javascript:void('"+g+"')",index:j,keyDownFn:r,clickFn:q}),b.unshift(g));if(c.equals(e))break;c=c.getParent()}i||(i=CKEDITOR.document.getById(l));e=i;e.setHtml(b.join("")+m);a.fire("elementsPathUpdate",{space:e})});a.on("readOnly",h);a.on("contentDomUnload",h);a.addCommand("elementsPathFocus",o);a.setKeystroke(CKEDITOR.ALT+122,"elementsPathFocus")}}})})();(function(){function C(c,j,f){function b(b){if((d=a[b?"getFirst":"getLast"]())&&(!d.is||!d.isBlockBoundary())&&(m=j.root[b?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))c.document.createElement("br")[b?"insertBefore":"insertAfter"](d)}for(var i=CKEDITOR.plugins.list.listToArray(j.root,f),e=[],h=0;h<j.contents.length;h++){var g=j.contents[h];if((g=g.getAscendant("li",!0))&&!g.getCustomData("list_item_processed"))e.push(g),CKEDITOR.dom.element.setMarker(f,
+g,"list_item_processed",!0)}g=null;for(h=0;h<e.length;h++)g=e[h].getCustomData("listarray_index"),i[g].indent=-1;for(h=g+1;h<i.length;h++)if(i[h].indent>i[h-1].indent+1){e=i[h-1].indent+1-i[h].indent;for(g=i[h].indent;i[h]&&i[h].indent>=g;)i[h].indent+=e,h++;h--}var a=CKEDITOR.plugins.list.arrayToList(i,f,null,c.config.enterMode,j.root.getAttribute("dir")).listNode,d,m;b(!0);b();a.replace(j.root)}function x(c,j){this.name=c;this.context=this.type=j}function y(c,j,f,b){for(var i,e;i=c[b?"getLast":
+"getFirst"](D);)(e=i.getDirection(1))!==j.getDirection(1)&&i.setAttribute("dir",e),i.remove(),f?i[b?"insertBefore":"insertAfter"](f):j.append(i,b)}function A(c){var j;(j=function(f){var b=c[f?"getPrevious":"getNext"](q);b&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(c.getName()))&&(y(c,b,null,!f),c.remove(),c=b)})();j(1)}function B(c){return c.type==CKEDITOR.NODE_ELEMENT&&(c.getName()in CKEDITOR.dtd.$block||c.getName()in CKEDITOR.dtd.$listItem)&&CKEDITOR.dtd[c.getName()]["#"]}function v(c,j,f){c.fire("saveSnapshot");
+f.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var b=f.extractContents();j.trim(!1,!0);var i=j.createBookmark(),e=new CKEDITOR.dom.elementPath(j.startContainer),h=e.block,e=e.lastElement.getAscendant("li",1)||h,g=new CKEDITOR.dom.elementPath(f.startContainer),a=g.contains(CKEDITOR.dtd.$listItem),g=g.contains(CKEDITOR.dtd.$list);h?(h=h.getBogus())&&h.remove():g&&(h=g.getPrevious(q))&&u(h)&&h.remove();(h=b.getLast())&&(h.type==CKEDITOR.NODE_ELEMENT&&h.is("br"))&&h.remove();(h=j.startContainer.getChild(j.startOffset))?
+b.insertBefore(h):j.startContainer.append(b);if(a&&(b=w(a)))e.contains(a)?(y(b,a.getParent(),a),b.remove()):e.append(b);for(;f.checkStartOfBlock()&&f.checkEndOfBlock();)g=f.startPath(),b=g.block,b.is("li")&&(e=b.getParent(),b.equals(e.getLast(q))&&b.equals(e.getFirst(q))&&(b=e)),f.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START),b.remove();f=f.clone();b=c.editable();f.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);f=new CKEDITOR.dom.walker(f);f.evaluator=function(a){return q(a)&&!u(a)};(f=f.next())&&(f.type==
+CKEDITOR.NODE_ELEMENT&&f.getName()in CKEDITOR.dtd.$list)&&A(f);j.moveToBookmark(i);j.select();c.fire("saveSnapshot")}function w(c){return(c=c.getLast(q))&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in r?c:null}var r={ol:1,ul:1},E=CKEDITOR.dom.walker.whitespaces(),F=CKEDITOR.dom.walker.bookmark(),q=function(c){return!(E(c)||F(c))},u=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(c,j,f,b,i){if(!r[c.getName()])return[];b||(b=0);f||(f=[]);for(var e=0,h=c.getChildCount();e<h;e++){var g=
+c.getChild(e);g.type==CKEDITOR.NODE_ELEMENT&&g.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(g,j,f,b+1);if("li"==g.$.nodeName.toLowerCase()){var a={parent:c,indent:b,element:g,contents:[]};i?a.grandparent=i:(a.grandparent=c.getParent(),a.grandparent&&"li"==a.grandparent.$.nodeName.toLowerCase()&&(a.grandparent=a.grandparent.getParent()));j&&CKEDITOR.dom.element.setMarker(j,g,"listarray_index",f.length);f.push(a);for(var d=0,m=g.getChildCount(),k;d<m;d++)k=g.getChild(d),k.type==
+CKEDITOR.NODE_ELEMENT&&r[k.getName()]?CKEDITOR.plugins.list.listToArray(k,j,f,b+1,a.grandparent):a.contents.push(k)}}return f},arrayToList:function(c,j,f,b,i){f||(f=0);if(!c||c.length<f+1)return null;for(var e,h=c[f].parent.getDocument(),g=new CKEDITOR.dom.documentFragment(h),a=null,d=f,m=Math.max(c[f].indent,0),k=null,n,l,p=b==CKEDITOR.ENTER_P?"p":"div";;){var o=c[d];e=o.grandparent;n=o.element.getDirection(1);if(o.indent==m){if(!a||c[d].parent.getName()!=a.getName())a=c[d].parent.clone(!1,1),i&&
+a.setAttribute("dir",i),g.append(a);k=a.append(o.element.clone(0,1));n!=a.getDirection(1)&&k.setAttribute("dir",n);for(e=0;e<o.contents.length;e++)k.append(o.contents[e].clone(1,1));d++}else if(o.indent==Math.max(m,0)+1)l=c[d-1].element.getDirection(1),d=CKEDITOR.plugins.list.arrayToList(c,null,d,b,l!=n?n:null),!k.getChildCount()&&(CKEDITOR.env.ie&&!(7<h.$.documentMode))&&k.append(h.createText(" ")),k.append(d.listNode),d=d.nextIndex;else if(-1==o.indent&&!f&&e){r[e.getName()]?(k=o.element.clone(!1,
+!0),n!=e.getDirection(1)&&k.setAttribute("dir",n)):k=new CKEDITOR.dom.documentFragment(h);var a=e.getDirection(1)!=n,s=o.element,z=s.getAttribute("class"),u=s.getAttribute("style"),w=k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(b!=CKEDITOR.ENTER_BR||a||u||z),t,x=o.contents.length;for(e=0;e<x;e++){t=o.contents[e];if(t.type==CKEDITOR.NODE_ELEMENT&&t.isBlockBoundary()){a&&!t.getDirection()&&t.setAttribute("dir",n);var v=t,y=s.getAttribute("style");y&&v.setAttribute("style",y.replace(/([^;])$/,"$1;")+(v.getAttribute("style")||
+""));z&&t.addClass(z)}else w&&(l||(l=h.createElement(p),a&&l.setAttribute("dir",n)),u&&l.setAttribute("style",u),z&&l.setAttribute("class",z),l.append(t.clone(1,1)));k.append(l||t.clone(1,1))}k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&d!=c.length-1&&((n=k.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&"_moz"==n.getAttribute("type"))&&n.remove(),(!k.getLast(q)||!(n.type==CKEDITOR.NODE_ELEMENT&&n.getName()in CKEDITOR.dtd.$block))&&k.append(h.createElement("br")));n=k.$.nodeName.toLowerCase();!CKEDITOR.env.ie&&
+("div"==n||"p"==n)&&k.appendBogus();g.append(k);a=null;d++}else return null;l=null;if(c.length<=d||Math.max(c[d].indent,0)<m)break}if(j)for(c=g.getFirst();c;){if(c.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(j,c),c.getName()in CKEDITOR.dtd.$listItem&&(f=c,h=i=b=void 0,b=f.getDirection()))){for(i=f.getParent();i&&!(h=i.getDirection());)i=i.getParent();b==h&&f.removeAttribute("dir")}c=c.getNextSourceNode()}return{listNode:g,nextIndex:d}}};var G=/^h[1-6]$/,D=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);
+x.prototype={exec:function(c){this.refresh(c,c.elementPath());var j=c.config,f=c.getSelection(),b=f&&f.getRanges(!0);if(this.state==CKEDITOR.TRISTATE_OFF){var i=c.editable();if(i.getFirst(q)){var e=1==b.length&&b[0];(j=e&&e.getEnclosedNode())&&(j.is&&this.type==j.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else j.enterMode==CKEDITOR.ENTER_BR?i.appendBogus():b[0].fixBlock(1,j.enterMode==CKEDITOR.ENTER_P?"p":"div"),f.selectRanges(b)}for(var j=f.createBookmarks(!0),i=[],h={},b=b.createIterator(),
+g=0;(e=b.getNextRange())&&++g;){var a=e.getBoundaryNodes(),d=a.startNode,m=a.endNode;d.type==CKEDITOR.NODE_ELEMENT&&"td"==d.getName()&&e.setStartAt(a.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&&"td"==m.getName()&&e.setEndAt(a.endNode,CKEDITOR.POSITION_BEFORE_END);e=e.createIterator();for(e.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;a=e.getNextParagraph();)if(!a.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(h,a,"list_block",1);for(var k=c.elementPath(a),
+d=k.elements,m=0,k=k.blockLimit,n,l=d.length-1;0<=l&&(n=d[l]);l--)if(r[n.getName()]&&k.contains(n)){k.removeCustomData("list_group_object_"+g);(d=n.getCustomData("list_group_object"))?d.contents.push(a):(d={root:n,contents:[a]},i.push(d),CKEDITOR.dom.element.setMarker(h,n,"list_group_object",d));m=1;break}m||(m=k,m.getCustomData("list_group_object_"+g)?m.getCustomData("list_group_object_"+g).contents.push(a):(d={root:m,contents:[a]},CKEDITOR.dom.element.setMarker(h,m,"list_group_object_"+g,d),i.push(d)))}}for(n=
+[];0<i.length;)if(d=i.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[d.root.getName()]){a=c;b=d;d=h;g=n;m=CKEDITOR.plugins.list.listToArray(b.root,d);k=[];for(e=0;e<b.contents.length;e++)if(l=b.contents[e],(l=l.getAscendant("li",!0))&&!l.getCustomData("list_item_processed"))k.push(l),CKEDITOR.dom.element.setMarker(d,l,"list_item_processed",!0);for(var l=b.root.getDocument(),p=void 0,o=void 0,e=0;e<k.length;e++){var s=k[e].getCustomData("listarray_index"),p=m[s].parent;p.is(this.type)||(o=l.createElement(this.type),
+p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[s].parent=o)}a=CKEDITOR.plugins.list.arrayToList(m,d,null,a.config.enterMode);d=void 0;m=a.listNode.getChildCount();for(e=0;e<m&&(d=a.listNode.getChild(e));e++)d.getName()==this.type&&g.push(d);a.listNode.replace(b.root)}else{m=c;a=d;e=n;k=a.contents;b=a.root.getDocument();g=[];1==k.length&&k[0].equals(a.root)&&(d=b.createElement("div"),k[0].moveChildren&&k[0].moveChildren(d),k[0].append(d),k[0]=d);a=a.contents[0].getParent();
+for(l=0;l<k.length;l++)a=a.getCommonAncestor(k[l].getParent());p=m.config.useComputedState;m=d=void 0;p=void 0===p||p;for(l=0;l<k.length;l++)for(o=k[l];s=o.getParent();){if(s.equals(a)){g.push(o);!m&&o.getDirection()&&(m=1);o=o.getDirection(p);null!==d&&(d=d&&d!=o?null:o);break}o=s}if(!(1>g.length)){k=g[g.length-1].getNext();l=b.createElement(this.type);e.push(l);for(p=e=void 0;g.length;)e=g.shift(),p=b.createElement("li"),e.is("pre")||G.test(e.getName())?e.appendTo(p):(e.copyAttributes(p),d&&e.getDirection()&&
+(p.removeStyle("direction"),p.removeAttribute("dir")),e.moveChildren(p),e.remove()),p.appendTo(l);d&&m&&l.setAttribute("dir",d);k?l.insertBefore(k):l.appendTo(a)}}else this.state==CKEDITOR.TRISTATE_ON&&r[d.root.getName()]&&C.call(this,c,d,h);for(l=0;l<n.length;l++)A(n[l]);CKEDITOR.dom.element.clearAllMarkers(h);f.selectBookmarks(j);c.focus()},refresh:function(c,j){var f=j.contains(r,1),b=j.blockLimit||j.root;f&&b.contains(f)?this.setState(f.is(this.type)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):
+this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{init:function(c){c.blockless||(c.addCommand("numberedlist",new x("numberedlist","ol")),c.addCommand("bulletedlist",new x("bulletedlist","ul")),c.ui.addButton&&(c.ui.addButton("NumberedList",{label:c.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),c.ui.addButton("BulletedList",{label:c.lang.list.bulletedlist,command:"bulletedlist",directional:!0,toolbar:"list,20"})),c.on("key",function(j){var f=j.data.keyCode;
+if(c.mode=="wysiwyg"&&f in{8:1,46:1}){var b=c.getSelection().getRanges()[0],i=b.startPath();if(b.collapsed){var i=new CKEDITOR.dom.elementPath(b.startContainer),e=f==8,h=c.editable(),g=new CKEDITOR.dom.walker(b.clone());g.evaluator=function(a){return q(a)&&!u(a)};g.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};f=b.clone();if(e){var a,d;if((a=i.contains(r))&&b.checkBoundaryOfElement(a,CKEDITOR.START)&&(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);f.moveToPosition(a&&
+u(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{g.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);g.range.setEnd(b.startContainer,b.startOffset);if((a=g.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in r||a.is("li"))){if(!a.is("li")){g.range.selectNodeContents(a);g.reset();g.evaluator=B;a=g.previous()}d=a;f.moveToElementEditEnd(d)}}if(d){v(c,f,b);j.cancel()}else if((f=i.contains(r))&&b.checkBoundaryOfElement(f,CKEDITOR.START)){d=f.getFirst(q);if(b.checkBoundaryOfElement(d,CKEDITOR.START)){a=
+f.getPrevious(q);if(w(d)){if(a){b.moveToElementEditEnd(a);b.select()}}else c.execCommand("outdent");j.cancel()}}}else if(d=i.contains("li")){g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);h=(i=d.getLast(q))&&B(i)?i:d;d=0;if((a=g.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(i)){d=1;a=g.next()}else b.checkBoundaryOfElement(h,CKEDITOR.END)&&(d=1);if(d&&a){b=b.clone();b.moveToElementEditStart(a);v(c,f,b);j.cancel()}}else{g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=g.next())&&
+a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(i.block&&b.checkStartOfBlock()&&b.checkEndOfBlock()){i.block.remove();b.moveToElementEditStart(a);b.select()}else if(w(a)){b.moveToElementEditStart(a);b.select()}else{b=b.clone();b.moveToElementEditStart(a);v(c,f,b)}j.cancel()}}setTimeout(function(){c.selectionChange(1)})}}}))}})})();(function(){function p(d,i){this.name=i;if(this.useIndentClasses=d.config.indentClasses&&0<d.config.indentClasses.length){this.classNameRegex=RegExp("(?:^|\\s+)("+d.config.indentClasses.join("|")+")(?=$|\\s)");this.indentClassMap={};for(var a=0;a<d.config.indentClasses.length;a++)this.indentClassMap[d.config.indentClasses[a]]=a+1}this.startDisabled="outdent"==i}function r(d,i){return"ltr"==(i||d.getComputedStyle("direction"))?"margin-left":"margin-right"}function q(d){return d.type==CKEDITOR.NODE_ELEMENT&&
+d.is("li")}var m={ol:1,ul:1},t=CKEDITOR.dom.walker.whitespaces(!0),u=CKEDITOR.dom.walker.bookmark(!1,!0);p.prototype={context:"p",refresh:function(d,i){var a=i&&i.contains(m),f=i.block||i.blockLimit;a?this.setState(CKEDITOR.TRISTATE_OFF):!this.useIndentClasses&&"indent"==this.name?this.setState(CKEDITOR.TRISTATE_OFF):f?this.useIndentClasses?(a=f.$.className.match(this.classNameRegex),f=0,a&&(a=a[1],f=this.indentClassMap[a]),"outdent"==this.name&&!f||"indent"==this.name&&f==d.config.indentClasses.length?
+this.setState(CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_OFF)):(a=parseInt(f.getStyle(r(f)),10),isNaN(a)&&(a=0),0>=a?this.setState(CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_OFF)):this.setState(CKEDITOR.TRISTATE_DISABLED)},exec:function(d){function i(n){for(var h=l.startContainer,b=l.endContainer;h&&!h.getParent().equals(n);)h=h.getParent();for(;b&&!b.getParent().equals(n);)b=b.getParent();if(h&&b){for(var c=h,h=[],a=!1;!a;)c.equals(b)&&(a=!0),h.push(c),c=c.getNext();
+if(!(1>h.length)){c=n.getParents(!0);for(b=0;b<c.length;b++)if(c[b].getName&&m[c[b].getName()]){n=c[b];break}for(var c="indent"==e.name?1:-1,b=h[0],h=h[h.length-1],a=CKEDITOR.plugins.list.listToArray(n,o),k=a[h.getCustomData("listarray_index")].indent,b=b.getCustomData("listarray_index");b<=h.getCustomData("listarray_index");b++)if(a[b].indent+=c,0<c){var i=a[b].parent;a[b].parent=new CKEDITOR.dom.element(i.getName(),i.getDocument())}for(b=h.getCustomData("listarray_index")+1;b<a.length&&a[b].indent>
+k;b++)a[b].indent+=c;h=CKEDITOR.plugins.list.arrayToList(a,o,null,d.config.enterMode,n.getDirection());if("outdent"==e.name){var j;if((j=n.getParent())&&j.is("li"))for(var c=h.listNode.getChildren(),f=[],g,b=c.count()-1;0<=b;b--)(g=c.getItem(b))&&(g.is&&g.is("li"))&&f.push(g)}h&&h.listNode.replace(n);if(f&&f.length)for(b=0;b<f.length;b++){for(g=n=f[b];(g=g.getNext())&&g.is&&g.getName()in m;)CKEDITOR.env.ie&&!n.getFirst(function(b){return t(b)&&u(b)})&&n.append(l.document.createText(" ")),n.append(g);
+n.insertAfter(j)}}}}function a(){var a=l.createIterator(),e=d.config.enterMode;a.enforceRealBlocks=!0;a.enlargeBr=e!=CKEDITOR.ENTER_BR;for(var b;b=a.getNextParagraph(e==CKEDITOR.ENTER_P?"p":"div");)f(b)}function f(a,g){if(a.getCustomData("indent_processed"))return!1;if(e.useIndentClasses){var b=a.$.className.match(e.classNameRegex),c=0;b&&(b=b[1],c=e.indentClassMap[b]);"outdent"==e.name?c--:c++;if(0>c)return!1;c=Math.min(c,d.config.indentClasses.length);c=Math.max(c,0);a.$.className=CKEDITOR.tools.ltrim(a.$.className.replace(e.classNameRegex,
+""));0<c&&a.addClass(d.config.indentClasses[c-1])}else{b=r(a,g);c=parseInt(a.getStyle(b),10);isNaN(c)&&(c=0);var f=d.config.indentOffset||40,c=c+("indent"==e.name?1:-1)*f;if(0>c)return!1;c=Math.max(c,0);c=Math.ceil(c/f)*f;a.setStyle(b,c?c+(d.config.indentUnit||"px"):"");""===a.getAttribute("style")&&a.removeAttribute("style")}CKEDITOR.dom.element.setMarker(o,a,"indent_processed",1);return!0}for(var e=this,o={},g=d.getSelection(),v=g.createBookmarks(1),l,p=(g&&g.getRanges(1)).createIterator();l=p.getNextRange();){for(var j=
+l.getCommonAncestor();j&&!(j.type==CKEDITOR.NODE_ELEMENT&&m[j.getName()]);)j=j.getParent();if(!j){var k=l.getEnclosedNode();k&&(k.type==CKEDITOR.NODE_ELEMENT&&k.getName()in m)&&(l.setStartAt(k,CKEDITOR.POSITION_AFTER_START),l.setEndAt(k,CKEDITOR.POSITION_BEFORE_END),j=k)}j&&(l.startContainer.type==CKEDITOR.NODE_ELEMENT&&l.startContainer.getName()in m)&&(k=new CKEDITOR.dom.walker(l),k.evaluator=q,l.startContainer=k.next());j&&(l.endContainer.type==CKEDITOR.NODE_ELEMENT&&l.endContainer.getName()in m)&&
+(k=new CKEDITOR.dom.walker(l),k.evaluator=q,l.endContainer=k.previous());if(j){var k=j.getFirst(q),w=!!k.getNext(q),s=l.startContainer;(!k.equals(s)&&!k.contains(s)||!("indent"==e.name||e.useIndentClasses||parseInt(j.getStyle(r(j)),10))||!f(j,!w&&k.getDirection()))&&i(j)}else a()}CKEDITOR.dom.element.clearAllMarkers(o);d.forceNextSelectionCheck();g.selectBookmarks(v)}};CKEDITOR.plugins.add("indent",{requires:"list",onLoad:function(){(CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat)&&CKEDITOR.addCss(".cke_editable ul,.cke_editable ol{\tmargin-left: 0px;\tpadding-left: 40px;}")},
+init:function(d){d.blockless||(d.addCommand("indent",new p(d,"indent")),d.addCommand("outdent",new p(d,"outdent")),d.ui.addButton&&(d.ui.addButton("Indent",{label:d.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),d.ui.addButton("Outdent",{label:d.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"})),d.on("dirChanged",function(i){var a=d.createRange();a.setStartBefore(i.data.node);a.setEndAfter(i.data.node);for(var f=new CKEDITOR.dom.walker(a),e;e=f.next();)if(e.type==
+CKEDITOR.NODE_ELEMENT)if(!e.equals(i.data.node)&&e.getDirection()){a.setStartAfter(e);f=new CKEDITOR.dom.walker(a)}else{var o=d.config.indentClasses;if(o)for(var g=i.data.dir=="ltr"?["_rtl",""]:["","_rtl"],m=0;m<o.length;m++)if(e.hasClass(o[m]+g[0])){e.removeClass(o[m]+g[0]);e.addClass(o[m]+g[1])}o=e.getStyle("margin-right");g=e.getStyle("margin-left");o?e.setStyle("margin-left",o):e.removeStyle("margin-left");g?e.setStyle("margin-right",g):e.removeStyle("margin-right")}}))}})})();(function(){function m(a,d,b){b=a.config.forceEnterMode||b;if("wysiwyg"!=a.mode)return!1;d||(d=a.config.enterMode);a.elementPath().isContextFor("p")||(d=CKEDITOR.ENTER_BR,b=1);a.fire("saveSnapshot");d==CKEDITOR.ENTER_BR?n(a,d,null,b):o(a,d,null,b);a.fire("saveSnapshot");return!0}function p(a){for(var a=a.getSelection().getRanges(!0),d=a.length-1;0<d;d--)a[d].deleteContents();return a[0]}CKEDITOR.plugins.add("enterkey",{requires:"indent",init:function(a){a.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,
+exec:function(a){m(a)}});a.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(a){"wysiwyg"==a.mode&&m(a,a.config.shiftEnterMode,1)}});a.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var s=CKEDITOR.dom.walker.whitespaces(),t=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(a,d,b,i){if(b=b||p(a)){var f=b.document,j=b.checkStartOfBlock(),h=b.checkEndOfBlock(),c=a.elementPath(b.startContainer).block;if(j&&h){if(c&&(c.is("li")||c.getParent().is("li"))){a.execCommand("outdent");
+return}if(c&&c.getParent().is("blockquote")){c.breakParent(c.getParent());c.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getPrevious().remove();c.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getNext().remove();b.moveToElementEditStart(c);b.select();return}}else if(c&&c.is("pre")&&!h){n(a,d,b,i);return}var c=d==CKEDITOR.ENTER_DIV?"div":"p",l=b.splitBlock(c);if(l){var d=l.previousBlock,a=l.nextBlock,j=l.wasStartOfBlock,h=l.wasEndOfBlock,g;if(a)g=a.getParent(),g.is("li")&&(a.breakParent(g),
+a.move(a.getNext(),1));else if(d&&(g=d.getParent())&&g.is("li"))d.breakParent(g),g=d.getNext(),b.moveToElementEditStart(g),d.move(d.getPrevious());if(!j&&!h){if(a.is("li")){var e=b.clone();e.selectNodeContents(a);e=new CKEDITOR.dom.walker(e);e.evaluator=function(a){return!(t(a)||s(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))};(g=e.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.ie?f.createText(" "):f.createElement("br")).insertBefore(g)}a&&
+b.moveToElementEditStart(a)}else{var k;if(d){if(d.is("li")||!q.test(d.getName())&&!d.is("pre"))e=d.clone()}else a&&(e=a.clone());e?i&&!e.is("li")&&e.renameNode(c):g&&g.is("li")?e=g:(e=f.createElement(c),d&&(k=d.getDirection())&&e.setAttribute("dir",k));if(f=l.elementPath){i=0;for(g=f.elements.length;i<g;i++){k=f.elements[i];if(k.equals(f.block)||k.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[k.getName()]&&(k=k.clone(),e.moveChildren(k),e.append(k))}}CKEDITOR.env.ie||e.appendBogus();e.getParent()||
+b.insertNode(e);e.is("li")&&e.removeAttribute("value");if(CKEDITOR.env.ie&&j&&(!h||!d.getChildCount()))b.moveToElementEditStart(h?d:e),b.select();b.moveToElementEditStart(j&&!h?a:e)}b.select();b.scrollIntoView()}}},enterBr:function(a,d,b,i){if(b=b||p(a)){var f=b.document,j=b.checkEndOfBlock(),h=new CKEDITOR.dom.elementPath(a.getSelection().getStartElement()),c=h.block,h=c&&h.block.getName();!i&&"li"==h?o(a,d,b,i):(!i&&j&&q.test(h)?(j=c.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",
+j),f.insertAfter(c),b.setStart(f,0)):(f.createElement("br").insertAfter(c),CKEDITOR.env.gecko&&f.createText("").insertAfter(c),b.setStartAt(c.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(c="pre"==h&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),b.deleteContents(),b.insertNode(c),CKEDITOR.env.ie?b.setStartAt(c,CKEDITOR.POSITION_AFTER_END):(f.createText("").insertAfter(c),j&&c.getParent().appendBogus(),c.getNext().$.nodeValue=
+"",b.setStartAt(c.getNext(),CKEDITOR.POSITION_AFTER_START))),b.collapse(!0),b.select(),b.scrollIntoView())}}};var r=CKEDITOR.plugins.enterkey,n=r.enterBr,o=r.enterBlock,q=/^h[1-6]$/})();(function(){function j(a,b){var d={},e=[],f={nbsp:" ",shy:"­",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},a=a.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(a,h){var c=b?"&"+h+";":f[h];d[c]=b?f[h]:"&"+h+";";e.push(c);return""});if(!b&&a){var a=a.split(","),c=document.createElement("div"),g;c.innerHTML="&"+a.join(";&")+";";g=c.innerHTML;c=null;for(c=0;c<g.length;c++){var i=g.charAt(c);d[i]="&"+a[c]+";";e.push(i)}}d.regex=e.join(b?"|":"");return d}CKEDITOR.plugins.add("entities",{afterInit:function(a){var b=
+a.config;if(a=(a=a.dataProcessor)&&a.htmlFilter){var d=[];!1!==b.basicEntities&&d.push("nbsp,gt,lt,amp");b.entities&&(d.length&&d.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"),
+b.entities_latin&&d.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),b.entities_greek&&d.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"),
+b.entities_additional&&d.push(b.entities_additional));var e=j(d.join(",")),f=e.regex?"["+e.regex+"]":"a^";delete e.regex;b.entities&&b.entities_processNumerical&&(f="[^ -~]|"+f);var f=RegExp(f,"g"),c=function(a){return b.entities_processNumerical=="force"||!e[a]?"&#"+a.charCodeAt(0)+";":e[a]},g=j("nbsp,gt,lt,amp,shy",!0),i=RegExp(g.regex,"g"),k=function(a){return g[a]};a.addRules({text:function(a){return a.replace(i,k).replace(f,c)}})}}})})();CKEDITOR.config.basicEntities=!0;
+CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup");
+CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+
+a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%",
+b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{};
+b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){var e,g;for(g in b)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+i(c)+"BrowseUrl"],void 0===
+f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a,c,d){if(-1!==d.indexOf(";")){for(var d=
+d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),b=b.filebrowser.target||null)))if(b=
+b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){var c=a.data.definition,d,b;for(b in c.contents)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements),d.hidden&&d.filebrowser&&(d.hidden=!h(c,d.id,d.filebrowser))})})();(function(){function t(a){var e="left"==a?"pageXOffset":"pageYOffset";return e in g.$?g.$[e]:CKEDITOR.document.$.documentElement["left"==a?"scrollLeft":"scrollTop"]}function p(a){var e,f=a.config,p=f.floatSpaceDockedOffsetX||0,o=f.floatSpaceDockedOffsetY||0,u=f.floatSpacePinnedOffsetX||0,q=f.floatSpacePinnedOffsetY||0,i=function(c){function f(a,c,b){d.setStyle(c,s(b));d.setStyle("position",a)}function j(a){var c=n.getDocumentPosition();switch(a){case "top":f("absolute","top",c.y-l-o);break;case "pin":f("fixed",
+"top",q);break;case "bottom":f("absolute","top",c.y+(b.height||b.bottom-b.top)+o)}e=a}"focus"==c.name&&d.show();d.removeStyle("left");d.removeStyle("right");var n=a.editable(),k=d.getClientRect(),b=n.getClientRect(),l=k.height,r=t("left");if(e){"top"==e&&k.top<q?j("pin"):"pin"==e?b.top>o+l?j("top"):b.bottom-k.bottom<l&&j("bottom"):"bottom"==e&&(b.top>o+l?j("top"):b.bottom>2*l+q&&j("pin"));var c=g.getViewPaneSize(),h=c.width/2,h=0<b.left&&b.right<c.width&&b.width>k.width?"rtl"==a.config.contentsLangDirection?
+"right":"left":h-b.left>b.right-h?"left":"right",m;k.width>c.width?(h="left",m=0):(m="left"==h?0<b.left?b.left:0:b.right<c.width?c.width-b.right:0,m+k.width>c.width&&(h="left"==h?"right":"left",m=0));d.setStyle(h,s(("pin"==e?u:p)+m+("pin"==e?0:r)))}else e="pin",j("pin"),i(c)},f=CKEDITOR.document.getBody(),r={id:a.id,name:a.name,langDir:a.lang.dir,langCode:a.langCode},n=a.fire("uiSpace",{space:"top",html:""}).html;if(n){var d=f.append(CKEDITOR.dom.element.createFromHtml(v.output(CKEDITOR.tools.extend({topId:a.ui.spaceId("top"),
+content:n,style:"display:none;z-index:"+(a.config.baseFloatZIndex-1)},r))));d.unselectable();d.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(a){i(a);g.on("scroll",i);g.on("resize",i)});a.on("blur",function(){d.hide();g.removeListener("scroll",i);g.removeListener("resize",i)});a.on("destroy",function(){g.removeListener("scroll",i);g.removeListener("resize",i);d.clearCustomData();d.remove()});a.focusManager.hasFocus&&d.show();a.focusManager.add(d,
+1)}}var v=CKEDITOR.addTemplate("floatcontainer",'<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}"><div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>');CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("contentDom",function(){p(a)})}});var g=CKEDITOR.document.getWindow(),
+s=CKEDITOR.tools.cssLength})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var e=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),f=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')" {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),g=CKEDITOR.addTemplate("panel-list-group",
+'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>');CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);c=this.keys;c[40]="next";
+c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=e.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);if(this.onClick)this.onClick(a,
+b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;a={id:d,val:a,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:c||a,text:b||a};this._.pendingList.push(f.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(g.output({id:b,label:a}))},commit:function(){this._.close();
+this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},showAll:function(){var a=this._.items,b=
+this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},unmark:function(a){var b=this.element.getDocument(),
+a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},focus:function(a){this._.focusIndex=
+-1;if(a){for(var b=this.element.getDocument().getById(this._.items[a]).getFirst(),a=this.element.getElementsByTag("a"),c,d=-1;c=a.getItem(++d);)if(c.equals(b)){this._.focusIndex=d;break}setTimeout(function(){b.focus()},0)}}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(c){c.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});
+(function(){var c='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" hidefocus=true title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';
+CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+
+(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),h=CKEDITOR.addTemplate("combo",c);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect,
+attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function j(){var d=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;this.setState(a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:d);this.setValue("")}var c=CKEDITOR.env,g="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){i&&(a.unlockSelection(1),i=0);d.execute(b)},this),f=this,d={id:g,combo:this,
+focus:function(){CKEDITOR.document.getById(g).getChild(1).focus()},execute:function(d){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var c=f.getValue();c?b.list.mark(c):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(d),4)}},clickFn:e};a.on("mode",j,this);!this.readOnly&&a.on("readOnly",j,this);var k=CKEDITOR.tools.addFunction(function(a,b){var a=new CKEDITOR.dom.event(a),c=a.getKeystroke();switch(c){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,
+b);break;default:d.onkey(d,c)}a.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){d.onfocus&&d.onfocus()}),i=0,m=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),i=1)}});d.keyDownFn=k;c={id:g,name:this.name||this.command,label:this.label,title:this.title,cls:this.className||"",titleJs:c.gecko&&10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),keydownFn:k,mousedownFn:m,focusFn:l,clickFn:e};h.output(c,b);
+if(this.onRender)this.onRender();return d},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,c=this._.panelDefinition.block,h=b.parent||CKEDITOR.document.getBody(),g="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,h,b),f=e.addListBlock(this.id,c),d=this;e.onShow=function(){this.element.addClass(g);d.setState(CKEDITOR.TRISTATE_ON);f.focus(!f.multiSelect&&d.getValue());d._.on=1;d.editorFocus&&a.focus();if(d.onOpen)d.onOpen()};e.onHide=function(b){this.element.removeClass(g);
+d.setState(d.modes&&d.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);d._.on=0;if(!b&&d.onClose)d.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){d.onClick&&d.onClick.call(d,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){d._.on=0;d.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var c=this.document.getById("cke_"+this.id+"_text");c&&(!a&&!b?(b=this.label,c.addClass("cke_combo_inlinelabel")):
+c.removeClass("cke_combo_inlinelabel"),c.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,c){this._.items[a]=c||a;this._.list.add(a,b,c)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),
+this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},
+statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var g=a.config,c=a.lang.format,j=g.format_tags.split(";"),d={},h=0;h<j.length;h++){var i=j[h];d[i]=new CKEDITOR.style(g["format_"+i]);d[i]._.enterMode=a.config.enterMode}a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",panel:{css:[CKEDITOR.skin.getPath("editor")].concat(g.contentsCss),multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);
+for(var a in d){var e=c["tag_"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],e=a.elementPath();a[b.checkActive(e)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var e=this.getValue(),b=b.data.path,c=!a.readOnly&&b.isContextFor("p");this[c?"enable":"disable"]();if(c){for(var f in d)if(d[f].checkActive(b)){f!=e&&this.setValue(f,a.lang.format["tag_"+f]);return}this.setValue("")}},
+this)}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"};CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}});
+CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in
+b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0},
+openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b];
+a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation();
+this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)}};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();(function(){function n(a){var c=this.editor,d=a.document,b=d.body;(a=d.getElementById("cke_actscrpt"))&&a.parentNode.removeChild(a);(a=d.getElementById("cke_shimscrpt"))&&a.parentNode.removeChild(a);CKEDITOR.env.gecko&&(b.contentEditable=!1,2E4>CKEDITOR.env.version&&(b.innerHTML=b.innerHTML.replace(/^.*<\!-- cke-content-start --\>/,""),setTimeout(function(){var a=new CKEDITOR.dom.range(new CKEDITOR.dom.document(d));a.setStart(new CKEDITOR.dom.node(b),0);c.getSelection().selectRanges([a])},0)));b.contentEditable=
+!0;CKEDITOR.env.ie&&(b.hideFocus=!0,b.disabled=!0,b.removeAttribute("disabled"));delete this._.isLoadingData;this.$=b;d=new CKEDITOR.dom.document(d);this.setup();CKEDITOR.env.ie&&(d.getDocumentElement().addClass(d.$.compatMode),c.config.enterMode!=CKEDITOR.ENTER_P&&d.on("selectionchange",function(){var a=d.getBody(),b=c.getSelection(),e=b&&b.getRanges()[0];e&&(a.getHtml().match(/^<p>&nbsp;<\/p>$/i)&&e.startContainer.equals(a))&&setTimeout(function(){e=c.getSelection().getRanges()[0];if(!e.startContainer.equals("body")){a.getFirst().remove(1);
+e.moveToElementEditEnd(a);e.select()}},0)}));CKEDITOR.env.gecko&&CKEDITOR.tools.setTimeout(o,0,this,c);try{c.document.$.execCommand("2D-position",!1,!0)}catch(e){}try{c.document.$.execCommand("enableInlineTableEditing",!1,!c.config.disableNativeTableHandles)}catch(f){}if(c.config.disableObjectResizing)try{this.getDocument().$.execCommand("enableObjectResizing",!1,!1)}catch(g){this.attachListener(this,CKEDITOR.env.ie?"resizestart":"resize",function(a){a.data.preventDefault()})}(CKEDITOR.env.gecko||
+CKEDITOR.env.ie&&"CSS1Compat"==c.document.$.compatMode)&&this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){c.getSelection().scrollIntoView()},0);else if(c.window.$.innerHeight>this.$.offsetHeight){var d=c.createRange();d[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this);d.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(d,"blur",function(){try{d.$.selection.empty()}catch(a){}});c.document.getElementsByTag("title").getItem(0).data("cke-title",
+c.document.$.title);CKEDITOR.env.ie&&(c.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){c.fire("contentDom");if(this._.isPendingFocus){c.focus();this._.isPendingFocus=false}setTimeout(function(){c.fire("dataReady")},0);CKEDITOR.env.ie&&setTimeout(function(){if(c.document){var a=c.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function p(a){a.checkDirty()||setTimeout(function(){a.resetDirty()},0)}function o(a){if(!a.readOnly){var c=
+a.window,d=a.document,b=d.getBody(),e=b.getFirst(),f=b.getChildren().count();if(!f||1==f&&e.type==CKEDITOR.NODE_ELEMENT&&e.hasAttribute("_moz_editor_bogus_node")){p(a);var e=CKEDITOR.document,g=e.getDocumentElement(),h=g.$.scrollTop,i=g.$.scrollLeft,j=d.$.createEvent("KeyEvents");j.initKeyEvent("keypress",!0,!0,c.$,!1,!1,!1,!1,0,32);d.$.dispatchEvent(j);(h!=g.$.scrollTop||i!=g.$.scrollLeft)&&e.getWindow().$.scrollTo(i,h);f&&b.getFirst().remove();d.getBody().appendBogus();a=a.createRange();a.setStartAt(b,
+CKEDITOR.POSITION_AFTER_START);a.select()}}}function q(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");var c=[],d;for(d in CKEDITOR.dtd.$removeEmpty)c.push("html.CSS1Compat "+d+"[contenteditable=false]");a.push(c.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");
+a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.addMode("wysiwyg",function(c){function d(d){d&&d.removeListener();a.editable(new k(a,b.$.contentWindow.document.body));a.setData(a.getData(1),c)}var b=CKEDITOR.document.createElement("iframe");b.setStyles({width:"100%",height:"100%"});b.addClass("cke_wysiwyg_frame cke_reset");var e=a.ui.space("contents");e.append(b);var f="document.open();"+(l?'document.domain="'+document.domain+
+'";':"")+"document.close();",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(f)+"}())":"",g=CKEDITOR.env.ie||CKEDITOR.env.gecko;if(g)b.on("load",d);var h=[a.lang.editor,a.name].join(),i=a.lang.common.editorHelp;CKEDITOR.env.ie&&(h+=", "+i);var j=CKEDITOR.tools.getNextId(),m=CKEDITOR.dom.element.createFromHtml('<span id="'+j+'" class="cke_voice_label">'+i+"</span>");e.append(m,1);a.on("beforeModeUnload",function(a){a.removeListener();m.remove()});
+b.setAttributes({frameBorder:0,"aria-describedby":j,title:h,src:f,tabIndex:a.tabIndex,allowTransparency:"true"});!g&&d();CKEDITOR.env.webkit&&(f=function(){e.setStyle("width","100%");b.hide();b.setSize("width",e.getSize("width"));e.removeStyle("width");b.show()},b.setCustomData("onResize",f),CKEDITOR.document.getWindow().on("resize",f));a.fire("ariaWidget",b)})}});var l=CKEDITOR.env.isCustomDomain(),k=CKEDITOR.tools.createClass({$:function(a){this.base.apply(this,arguments);this._.frameLoadedHandler=
+CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(n,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,c){var d=this.editor;if(c)this.setHtml(a);else{this._.isLoadingData=!0;d._.dataStore={id:1};var b=d.config,e=b.fullPage,f=b.docType,g=CKEDITOR.tools.buildStyleHtml(q()).replace(/<style>/,'<style data-cke-temp="1">');e||(g+=CKEDITOR.tools.buildStyleHtml(d.config.contentsCss));var h=b.baseHref?'<base href="'+
+b.baseHref+'" data-cke-temp="1" />':"";e&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){d.docType=f=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){d.xmlDeclaration=a;return""}));d.dataProcessor&&(a=d.dataProcessor.toHtml(a));e?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,"$&<title></title>")):a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head>/,"$&"+
+h)),a=a.replace(/<\/head\s*>/,g+"$&"),a=f+a):a=b.docType+'<html dir="'+b.contentsLangDirection+'" lang="'+(b.contentsLanguage||d.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+g+"</head><body"+(b.bodyId?' id="'+b.bodyId+'"':"")+(b.bodyClass?' class="'+b.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/,"$&<\!-- cke-content-start --\>")));b='<script id="cke_actscrpt" type="text/javascript"'+
+(CKEDITOR.env.ie?' defer="defer" ':"")+">"+(l?'document.domain="'+document.domain+'";':"")+"var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(b+='<script id="cke_shimscrpt">(function(){var e="abbr,article,aside,audio,bdi,canvas,data,datalist,details,figcaption,figure,footer,header,hgroup,mark,meter,nav,output,progress,section,summary,time,video".split(","),i=e.length;while(i--){document.createElement(e[i])}})()<\/script>');
+a=a.replace(/(?=\s*<\/(:?head)>)/,b);this.clearCustomData();this.clearListeners();d.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,c=a.config.fullPage,d=c&&a.docType,b=c&&a.xmlDeclaration,e=this.getDocument(),c=c?e.getDocumentElement().getOuterHtml():e.getBody().getHtml();CKEDITOR.env.gecko&&(c=c.replace(/<br>(?=\s*(:?$|<\/body>))/,""));a.dataProcessor&&(c=a.dataProcessor.toDataFormat(c));
+b&&(c=b+"\n"+c);d&&(c=d+"\n"+c);return c},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:k.baseProto.focus.call(this)},detach:function(){var a=this.editor,c=a.document,d=a.window.getFrame();k.baseProto.detach.call(this);this.clearCustomData();c.getDocumentElement().clearCustomData();d.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(c=d.removeCustomData("onResize"))&&c.removeListener();a.fire("contentDomUnload");d.remove()}}});CKEDITOR.env.gecko&&function(){var a=
+document.body;if(a){var c=a.getAttribute("onpageshow");a.setAttribute("onpageshow",(c?c+";":"")+'event.persisted&&(function(){var x=CKEDITOR.instances,d,i;for(i in x){d=x[i].document;if(d){d.$.designMode="off";d.$.designMode="on";}}})();')}else window.addEventListener("load",arguments.callee,!1)}()})();CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.basePath+"contents.css";(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");b.addCommand("image",new CKEDITOR.dialogCommand("image"));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,
+command:"image",toolbar:"insert,10"});b.on("doubleclick",function(a){var b=a.data.element;b.is("img")&&(!b.data("cke-realelement")&&!b.isReadOnly())&&(a.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=
+e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")):c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}a("left");a("right");a("center");a("block")}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,l={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c=
+c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}},k=CKEDITOR.plugins.add("fakeobjects",{afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(l)}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+
+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),
+"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!=c&&(a.rules.width=h(c)),void 0!=d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement=function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;
+var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function b(b){return c.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var a="background:url("+CKEDITOR.getUrl(this.path+"images/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;",c=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+a+"padding-%1:18px;cursor:auto;}"+(CKEDITOR.env.ie?"a.cke_anchor_empty{display:inline-block;}":"")+".%2 img.cke_anchor{"+
+a+"width:16px;min-height:15px;height:1.15em;vertical-align:"+(CKEDITOR.env.opera?"middle":"text-bottom")+";}";CKEDITOR.addCss(b("ltr")+b("rtl"))},init:function(b){b.addCommand("link",new CKEDITOR.dialogCommand("link"));b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor"));b.addCommand("unlink",new CKEDITOR.unlinkCommand);b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);b.setKeystroke(CKEDITOR.CTRL+76,"link");b.ui.addButton&&(b.ui.addButton("Link",{label:b.lang.link.toolbar,command:"link",
+toolbar:"links,10"}),b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"}),b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");b.on("doubleclick",function(a){var c=CKEDITOR.plugins.link.getSelectedLink(b)||a.data.element;if(!c.isReadOnly())if(c.is("a")){a.data.dialog=c.getAttribute("name")&&(!c.getAttribute("href")||
+!c.getChildCount())?"anchor":"link";b.getSelection().selectElement(c)}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,c))a.data.dialog="anchor"});b.addMenuItems&&b.addMenuItems({anchor:{label:b.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:b.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:b.lang.link.menu,command:"link",group:"link",order:1},unlink:{label:b.lang.link.unlink,command:"unlink",group:"link",order:5}});b.contextMenu&&
+b.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(b)))return null;var c={};a.getAttribute("href")&&a.getChildCount()&&(c={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))c.anchor=c.removeAnchor=CKEDITOR.TRISTATE_OFF;return c})},afterInit:function(b){var a=b.dataProcessor,c=a&&a.dataFilter,a=a&&a.htmlFilter,d=b._.elementsPath&&b._.elementsPath.filters;
+c&&c.addRules({elements:{a:function(a){var c=a.attributes;if(!c.name)return null;var d=!a.children.length;if(CKEDITOR.plugins.link.synAnchorSelector){var a=d?"cke_anchor_empty":"cke_anchor",e=c["class"];if(c.name&&(!e||0>e.indexOf(a)))c["class"]=(e||"")+" "+a;d&&CKEDITOR.plugins.link.emptyAnchorFix&&(c.contenteditable="false",c["data-cke-editable"]=1)}else if(CKEDITOR.plugins.link.fakeAnchor&&d)return b.createFakeParserElement(a,"cke_anchor","anchor");return null}}});CKEDITOR.plugins.link.emptyAnchorFix&&
+a&&a.addRules({elements:{a:function(a){delete a.attributes.contenteditable}}});d&&d.push(function(a,c){if("a"==c&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,a)||a.getAttribute("name")&&(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}});
+CKEDITOR.plugins.link={getSelectedLink:function(b){var a=b.getSelection(),c=a.getSelectedElement();return c&&c.is("a")?c:(a=a.getRanges(!0)[0])?(a.shrink(CKEDITOR.SHRINK_TEXT),b.elementPath(a.getCommonAncestor()).contains("a",1)):null},fakeAnchor:CKEDITOR.env.opera||CKEDITOR.env.webkit,synAnchorSelector:CKEDITOR.env.ie,emptyAnchorFix:CKEDITOR.env.ie&&8>CKEDITOR.env.version,tryRestoreFakeAnchor:function(b,a){if(a&&a.data("cke-real-element-type")&&"anchor"==a.data("cke-real-element-type")){var c=b.restoreRealElement(a);
+if(c.data("cke-saved-name"))return c}}};CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype={exec:function(b){var a=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});b.removeStyle(a)},refresh:function(b,a){var c=a.lastElement&&a.lastElement.getAscendant("a",!0);c&&"a"==c.getName()&&c.getAttribute("href")&&c.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1};
+CKEDITOR.removeAnchorCommand=function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(b){var a=b.getSelection(),c=a.createBookmarks(),d;if(a&&(d=a.getSelectedElement())&&(CKEDITOR.plugins.link.fakeAnchor&&!d.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,d):d.is("a")))d.remove(1);else if(d=CKEDITOR.plugins.link.getSelectedLink(b))d.hasAttribute("href")?(d.removeAttributes({name:1,"data-cke-saved-name":1}),d.removeClass("cke_anchor")):d.remove(1);a.selectBookmarks(c)}};
+CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,linkShowTargetTab:!0});(function(){function N(a,b,d){return l(b)&&l(d)&&d.equals(b.getNext(function(a){return!(y(a)||z(a)||o(a))}))}function t(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function H(a){var b=a.element,d;return b&&l(b)?(d=b.getAscendant(a.triggers,!0))&&!d.contains(a.editable)&&!d.equals(a.editable)?d:null:null}function ba(a,b,d){m(a,b);m(a,d);a=b.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function q(a,b,d){return b=b[d?"getPrevious":"getNext"](function(e){return e&&e.type==
+CKEDITOR.NODE_TEXT&&!y(e)||l(e)&&!o(e)&&!u(a,e)})}function ca(a){var b=a.doc,d=A('<span contenteditable="false" style="'+I+"position:absolute;border-top:1px dashed "+a.boxColor+'"></span>',b);p(d,{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[p(A('<span title="'+a.editor.lang.magicline.title+'" contenteditable="false">&#8629;</span>',b),{base:I+"height:17px;width:17px;"+(a.rtl?"left":"right")+":17px;background:url("+this.path+"images/icon.png) center no-repeat "+
+a.boxColor+";cursor:pointer;"+(n.hc?"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;":""),looks:["top:-8px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px",1),"top:-17px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px 2px 0px 0px",1),"top:-1px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","0px 0px 2px 2px",1)]}),p(A(O,b),{base:P+"left:0px;border-left-color:"+a.boxColor+";",looks:["border-width:8px 0 8px 8px;top:-8px","border-width:8px 0 0 8px;top:-8px","border-width:0 0 8px 8px;top:0px"]}),
+p(A(O,b),{base:P+"right:0px;border-right-color:"+a.boxColor+";",looks:["border-width:8px 8px 8px 0;top:-8px","border-width:8px 8px 0 0;top:-8px","border-width:0 8px 8px 0;top:0px"]})],detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){m(a,this);var e=a.holdDistance,b=this.size;return b&&a.mouse.y>b.top-e&&a.mouse.y<b.bottom+e&&a.mouse.x>b.left-e&&a.mouse.x<b.right+e?!0:!1},place:function(){var e=a.view,b=a.editable,c=a.trigger,d=c.upper,i=c.lower,h=d||i,
+k=h.getParent(),g={};this.trigger=c;d&&m(a,d,!0);i&&m(a,i,!0);m(a,k,!0);a.inInlineMode&&B(a,!0);k.equals(b)?(g.left=e.scroll.x,g.right=-e.scroll.x,g.width=""):(g.left=h.size.left-h.size.margin.left+e.scroll.x-(a.inInlineMode?e.editable.left+e.editable.border.left:0),g.width=h.size.outerWidth+h.size.margin.left+h.size.margin.right+e.scroll.x,g.right="");d&&i?g.top=d.size.margin.bottom===i.size.margin.top?0|d.size.bottom+d.size.margin.bottom/2:d.size.margin.bottom<i.size.margin.top?d.size.bottom+d.size.margin.bottom:
+d.size.bottom+d.size.margin.bottom-i.size.margin.top:d?i||(g.top=d.size.bottom+d.size.margin.bottom):g.top=i.size.top-i.size.margin.top;c.is(w)||g.top>e.scroll.y-15&&g.top<e.scroll.y+5?(g.top=a.inInlineMode?0:e.scroll.y,this.look(w)):c.is(x)||g.top>e.pane.bottom-5&&g.top<e.pane.bottom+15?(g.top=a.inInlineMode?e.editable.height+e.editable.padding.top+e.editable.padding.bottom:e.pane.bottom-1,this.look(x)):(a.inInlineMode&&(g.top-=e.editable.top+e.editable.border.top),this.look(r));a.inInlineMode&&
+(g.top--,g.top+=e.editable.scroll.top,g.left+=e.editable.scroll.left);for(var Q in g)g[Q]=CKEDITOR.tools.cssLength(g[Q]);this.setStyles(g)},look:function(a){if(this.oldLook!=a){for(var d=this.lineChildren.length,c;d--;)(c=this.lineChildren[d]).setAttribute("style",c.base+c.looks[0|a/2]);this.oldLook=a}},wrap:new J("span",a.doc)});for(b=d.lineChildren.length;b--;)d.lineChildren[b].appendTo(d);d.look(r);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on("mouseup",function(b){d.detach();K(a,function(d){var c=
+a.line.trigger;d[c.is(C)?"insertBefore":"insertAfter"](c.is(C)?c.lower:c.upper)},!0);a.editor.focus();!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();b.data.preventDefault(!0)});d.on("mousedown",function(a){a.data.preventDefault(!0)});a.line=d}function K(a,b,d){var e=new CKEDITOR.dom.range(a.doc),f=a.editor,c;n.ie&&a.enterMode==CKEDITOR.ENTER_BR?c=a.doc.createText(D):(c=new J(a.enterBehavior,a.doc),a.enterMode!=CKEDITOR.ENTER_BR&&a.doc.createText(D).appendTo(c));d&&f.fire("saveSnapshot");
+b(c);e.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);f.getSelection().selectRanges([e]);a.hotNode=c;d&&f.fire("saveSnapshot")}function R(a,b){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){function d(d){var f=n.ie&&9>n.version?" ":D,c=a.hotNode&&a.hotNode.getText()==f&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!b;K(a,function(f){c&&a.hotNode&&a.hotNode.remove();f[b?"insertAfter":"insertBefore"](d);f.setAttributes({"data-cke-magicline-hot":1,"data-cke-magicline-dir":!!b});a.lastCmdDirection=
+!!b});!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();a.line.detach()}return function(e){e=e.getSelection().getStartElement();if((e=e.getAscendant(S,1))&&!e.equals(a.editable)&&!e.contains(a.editable)){a.element=e;var f=q(a,e,!b),c;l(f)&&f.is(a.triggers)&&f.is(da)&&(!q(a,f,!b)||(c=q(a,f,!b))&&l(c)&&c.is(a.triggers))?d(f):(c=H(a,e),l(c)&&(q(a,c,!b)?(e=q(a,c,!b))&&(l(e)&&e.is(a.triggers))&&d(c):d(c)))}}}()}}function u(a,b){if(!b||!(b.type==CKEDITOR.NODE_ELEMENT&&b.$))return!1;var d=
+a.line;return d.wrap.equals(b)||d.wrap.contains(b)}function l(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.$}function o(a){if(!l(a))return!1;var b;if(!(b=T(a)))l(a)?(b={left:1,right:1,center:1},b=!(!b[a.getComputedStyle("float")]&&!b[a.getAttribute("align")])):b=!1;return b}function T(a){return!!{absolute:1,fixed:1,relative:1}[a.getComputedStyle("position")]}function E(a,b){return l(b)?b.is(a.triggers):null}function ea(a,b,d){b=b[d?"getLast":"getFirst"](function(d){return a.isRelevant(d)&&!d.is(fa)});
+if(!b)return!1;m(a,b);return d?b.size.top>a.mouse.y:b.size.bottom<a.mouse.y}function U(a){var b=a.editable,d=a.mouse,e=a.view,f=a.triggerOffset;B(a);var c=d.y>(a.inInlineMode?e.editable.top+e.editable.height/2:Math.min(e.editable.height,e.pane.height)/2),b=b[c?"getLast":"getFirst"](function(a){return!(y(a)||z(a))});if(!b)return null;u(a,b)&&(b=a.line.wrap[c?"getPrevious":"getNext"](function(a){return!(y(a)||z(a))}));if(!l(b)||o(b)||!E(a,b))return null;m(a,b);return!c&&0<=b.size.top&&0<d.y&&d.y<b.size.top+
+f?(a=a.inInlineMode||0===e.scroll.y?w:r,new t([null,b,C,F,a])):c&&b.size.bottom<=e.pane.height&&d.y>b.size.bottom-f&&d.y<e.pane.height?(a=a.inInlineMode||b.size.bottom>e.pane.height-f&&b.size.bottom<e.pane.height?x:r,new t([b,null,V,F,a])):null}function W(a){var b=a.mouse,d=a.view,e=a.triggerOffset,f=H(a);if(!f)return null;m(a,f);var e=Math.min(e,0|f.size.outerHeight/2),c=[],j,i;if(b.y>f.size.top-1&&b.y<f.size.top+e)i=!1;else if(b.y>f.size.bottom-e&&b.y<f.size.bottom+1)i=!0;else return null;if(o(f)||
+ea(a,f,i)||f.getParent().is(X))return null;var h=q(a,f,!i);if(h){if(h&&h.type==CKEDITOR.NODE_TEXT)return null;if(l(h)){if(o(h)||!E(a,h)||h.getParent().is(X))return null;c=[h,f][i?"reverse":"concat"]().concat([L,F])}}else f.equals(a.editable[i?"getLast":"getFirst"](a.isRelevant))?(B(a),i&&b.y>f.size.bottom-e&&b.y<d.pane.height&&f.size.bottom>d.pane.height-e&&f.size.bottom<d.pane.height?j=x:0<b.y&&b.y<f.size.top+e&&(j=w)):j=r,c=[null,f][i?"reverse":"concat"]().concat([i?V:C,F,j,f.equals(a.editable[i?
+"getLast":"getFirst"](a.isRelevant))?i?x:w:r]);return 0 in c?new t(c):null}function M(a,b,d,e){for(var f=function(){var d=n.ie?b.$.currentStyle:a.win.$.getComputedStyle(b.$,"");return n.ie?function(a){return d[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){return d.getPropertyValue(a)}}(),c=b.getDocumentPosition(),j={},i={},h={},k={},g=s.length;g--;)j[s[g]]=parseInt(f("border-"+s[g]+"-width"),10)||0,h[s[g]]=parseInt(f("padding-"+s[g]),10)||0,i[s[g]]=parseInt(f("margin-"+s[g]),10)||0;(!d||e)&&
+G(a,e);k.top=c.y-(d?0:a.view.scroll.y);k.left=c.x-(d?0:a.view.scroll.x);k.outerWidth=b.$.offsetWidth;k.outerHeight=b.$.offsetHeight;k.height=k.outerHeight-(h.top+h.bottom+j.top+j.bottom);k.width=k.outerWidth-(h.left+h.right+j.left+j.right);k.bottom=k.top+k.outerHeight;k.right=k.left+k.outerWidth;a.inInlineMode&&(k.scroll={top:b.$.scrollTop,left:b.$.scrollLeft});return p({border:j,padding:h,margin:i,ignoreScroll:d},k,!0)}function m(a,b,d){if(!l(b))return b.size=null;if(b.size){if(b.size.ignoreScroll==
+d&&b.size.date>new Date-Y)return null}else b.size={};return p(b.size,M(a,b,d),{date:+new Date},!0)}function B(a,b){a.view.editable=M(a,a.editable,b,!0)}function G(a,b){a.view||(a.view={});var d=a.view;if(b||!(d&&d.date>new Date-Y)){var e=a.win,d=e.getScrollPosition(),e=e.getViewPaneSize();p(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-e.width,height:a.doc.$.documentElement.scrollHeight-e.height},pane:{width:e.width,height:e.height,bottom:e.height+d.y},date:+new Date},!0)}}
+function ga(a,b,d,e){for(var f=e,c=e,j=0,i=!1,h=!1,k=a.view.pane.height,g=a.mouse;g.y+j<k&&0<g.y-j;){i||(i=b(f,e));h||(h=b(c,e));!i&&0<g.y-j&&(f=d(a,{x:g.x,y:g.y-j}));!h&&g.y+j<k&&(c=d(a,{x:g.x,y:g.y+j}));if(i&&h)break;j+=2}return new t([f,c,null,null])}CKEDITOR.plugins.add("magicline",{init:function(a){var b={};b[CKEDITOR.ENTER_BR]="br";b[CKEDITOR.ENTER_P]="p";b[CKEDITOR.ENTER_DIV]="div";var d=a.config,e=d.magicline_triggerOffset||30,f=d.enterMode,c={editor:a,enterBehavior:b[f],enterMode:f,triggerOffset:e,
+holdDistance:0|e*(d.magicline_holdDistance||0.5),boxColor:d.magicline_color||"#ff0000",rtl:"rtl"==d.contentsLangDirection,triggers:d.magicline_everywhere?S:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},j,i,h;c.isRelevant=function(a){return l(a)&&!u(c,a)&&!o(a)};a.on("contentDom",function(){var b=a.editable(),e=a.document,f=a.window;p(c,{editable:b,inInlineMode:b.isInline(),doc:e,win:f},!0);c.boundary=c.inInlineMode?c.editable:c.doc.getDocumentElement();b.is(v.$inline)||(c.inInlineMode&&
+!T(b)&&b.setStyles({position:"relative",top:null,left:null}),ca.call(this,c),G(c),b.attachListener(a,"beforeUndoImage",function(){c.line.detach()}),b.attachListener(a,"beforeGetData",function(){c.line.wrap.getParent()&&(c.line.detach(),a.once("getData",function(){c.line.attach()},null,null,1E3))},null,null,0),b.attachListener(c.inInlineMode?e:e.getWindow().getFrame(),"mouseout",function(b){if("wysiwyg"==a.mode)if(c.inInlineMode){var d=b.data.$.clientX,b=b.data.$.clientY;G(c);B(c,!0);var e=c.view.editable,
+f=c.view.scroll;if(!(d>e.left-f.x&&d<e.right-f.x)||!(b>e.top-f.y&&b<e.bottom-f.y))clearTimeout(h),h=null,c.line.detach()}else clearTimeout(h),h=null,c.line.detach()}),b.attachListener(b,"keyup",function(){c.hiddenMode=0}),b.attachListener(b,"keydown",function(b){if("wysiwyg"==a.mode)switch(b=b.data.getKeystroke(),a.getSelection().getStartElement(),b){case 2228240:case 16:c.hiddenMode=1,c.line.detach()}}),b.attachListener(c.inInlineMode?b:e,"mousemove",function(b){i=!0;if(!("wysiwyg"!=a.mode||h)){var d=
+{x:b.data.$.clientX,y:b.data.$.clientY};h=setTimeout(function(){c.mouse=d;h=c.trigger=null;G(c);if(i&&!c.hiddenMode&&a.focusManager.hasFocus&&!c.line.mouseNear()&&(c.element=Z(c,!0)))(c.trigger=U(c)||W(c)||$(c))?c.line.attach().place():(c.trigger=null,c.line.detach()),i=!1},30)}}),b.attachListener(f,"scroll",function(){"wysiwyg"==a.mode&&(c.line.detach(),n.webkit&&(c.hiddenMode=1,clearTimeout(j),j=setTimeout(function(){c.hiddenMode=0},50)))}),b.attachListener(f,"mousedown",function(){"wysiwyg"==a.mode&&
+(c.line.detach(),c.hiddenMode=1)}),b.attachListener(f,"mouseup",function(){c.hiddenMode=0}),a.addCommand("accessPreviousSpace",R(c)),a.addCommand("accessNextSpace",R(c,!0)),a.setKeystroke([[d.magicline_keystrokePrevious,"accessPreviousSpace"],[d.magicline_keystrokeNext,"accessNextSpace"]]),a.on("loadSnapshot",function(){for(var a=e.getElementsByTag(c.enterBehavior),b,d=a.count();d--;)if((b=a.getItem(d)).hasAttribute("data-cke-magicline-hot")){c.hotNode=b;c.lastCmdDirection="true"===b.getAttribute("data-cke-magicline-dir")?
+!0:!1;break}}),this.backdoor={accessFocusSpace:K,boxTrigger:t,isLine:u,getAscendantTrigger:H,getNonEmptyNeighbour:q,getSize:M,that:c,triggerEdge:W,triggerEditable:U,triggerExpand:$})},this)}});var p=CKEDITOR.tools.extend,J=CKEDITOR.dom.element,A=J.createFromHtml,n=CKEDITOR.env,v=CKEDITOR.dtd,C=128,V=64,L=32,F=16,aa=8,w=4,x=2,r=1,D=" ",X=v.$listItem,fa=v.$tableContent,da=p({},v.$nonEditable,v.$empty),S=v.$block,Y=100,I="width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;",
+P=I+"border-color:transparent;display:block;border-style:solid;",O="<span>"+D+"</span>";t.prototype={set:function(a,b,d){this.properties=a+b+(d||r);return this},is:function(a){return(this.properties&a)==a}};var Z=function(){return function(a,b,d){if(!a.mouse)return null;var e=a.doc,f=a.line.wrap,d=d||a.mouse,c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y));b&&u(a,c)&&(f.hide(),c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y)),f.show());return!c||!(c.type==CKEDITOR.NODE_ELEMENT&&c.$)||
+n.ie&&9>n.version&&!a.boundary.equals(c)&&!a.boundary.contains(c)?null:c}}(),y=CKEDITOR.dom.walker.whitespaces(),z=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT),$=function(){function a(a){var e=a.element,f,c,j;if(!l(e)||e.contains(a.editable))return null;j=ga(a,function(a,b){return!b.equals(a)},function(a,b){return Z(a,!0,b)},e);f=j.upper;c=j.lower;if(N(a,f,c))return j.set(L,aa);if(f&&e.contains(f))for(;!f.getParent().equals(e);)f=f.getParent();else f=e.getFirst(function(c){return b(a,c)});
+if(c&&e.contains(c))for(;!c.getParent().equals(e);)c=c.getParent();else c=e.getLast(function(c){return b(a,c)});if(!f||!c)return null;m(a,f);m(a,c);if(!(a.mouse.y>f.size.top&&a.mouse.y<c.size.bottom))return null;for(var e=Number.MAX_VALUE,i,h,k,g;c&&!c.equals(f)&&(h=f.getNext(a.isRelevant));)i=Math.abs(ba(a,f,h)-a.mouse.y),i<e&&(e=i,k=f,g=h),f=h,m(a,f);if(!k||!g||!(a.mouse.y>k.size.top&&a.mouse.y<g.size.bottom))return null;j.upper=k;j.lower=g;return j.set(L,aa)}function b(a,b){return!(b&&b.type==
+CKEDITOR.NODE_TEXT||z(b)||o(b)||u(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is("br"))}return function(b){var e=a(b),f;if(f=e){f=e.upper;var c=e.lower;f=!f||!c||o(c)||o(f)||c.equals(f)||f.equals(c)||c.contains(f)||f.contains(c)?!1:E(b,f)&&E(b,c)&&N(b,f,c)?!0:!1}return f?e:null}}(),s=["top","left","right","bottom"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.ALT+219;CKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.ALT+221;(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className||
+"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(),a.focus())}CKEDITOR.plugins.add("maximize",
+{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getChild(1),g=a.ui.space("contents");if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges();k=d.getScrollPosition()}else{var i=a.editable().$;
+j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0};b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&
+b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");e();g=h.getDocumentPosition();h.setStyles({left:-1*g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==
+CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&&(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display",
+"block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&i.scrollIntoView(!0)):d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=
+k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste",
+function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste",
+{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e);
+else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a)});g&&b.cancel()}},null,null,3)}})})();CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}});
+CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(1),l=k.createIterator(),c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var i=c.createBookmark(),b=i.startNode,j=i.endNode,
+d=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};d(b);if(j){d(j);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(j);)d=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=d}c.moveToBookmark(i)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}},
+filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var";CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var e=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?"99%":"100%",height:"100%",resize:"none",
+outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",e.commands.source);a.ui.addButton&&a.ui.addButton("Source",
+{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)})}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set":"remove")+"Attribute"]("readOnly",
+"readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};CKEDITOR.plugins.add("specialchar",{availableLangs:{ca:1,cs:1,cy:1,de:1,en:1,eo:1,et:1,fa:1,fi:1,fr:1,he:1,hr:1,it:1,ku:1,lv:1,nb:1,nl:1,no:1,"pt-br":1,sk:1,sv:1,tr:1,ug:1,"zh-cn":1},requires:"dialog",init:function(a){var c=this;CKEDITOR.dialog.add("specialchar",this.path+"dialogs/specialchar.js");a.addCommand("specialchar",{exec:function(){var b=a.langCode,b=c.availableLangs[b]?b:c.availableLangs[b.replace(/-.*/,"")]?b.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+
+b+".js"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog("specialchar")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton("SpecialChar",{label:a.lang.specialchar.toolbar,command:"specialchar",toolbar:"insert,50"})}});CKEDITOR.config.specialChars="! &quot; # $ % &amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; &lt; = &gt; ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ &euro; &lsquo; &rsquo; &ldquo; &rdquo; &ndash; &mdash; &iexcl; &cent; &pound; &curren; &yen; &brvbar; &sect; &uml; &copy; &ordf; &laquo; &not; &reg; &macr; &deg; &sup2; &sup3; &acute; &micro; &para; &middot; &cedil; &sup1; &ordm; &raquo; &frac14; &frac12; &frac34; &iquest; &Agrave; &Aacute; &Acirc; &Atilde; &Auml; &Aring; &AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml; &Igrave; &Iacute; &Icirc; &Iuml; &ETH; &Ntilde; &Ograve; &Oacute; &Ocirc; &Otilde; &Ouml; &times; &Oslash; &Ugrave; &Uacute; &Ucirc; &Uuml; &Yacute; &THORN; &szlig; &agrave; &aacute; &acirc; &atilde; &auml; &aring; &aelig; &ccedil; &egrave; &eacute; &ecirc; &euml; &igrave; &iacute; &icirc; &iuml; &eth; &ntilde; &ograve; &oacute; &ocirc; &otilde; &ouml; &divide; &oslash; &ugrave; &uacute; &ucirc; &uuml; &yacute; &thorn; &yuml; &OElig; &oelig; &#372; &#374 &#373 &#375; &sbquo; &#8219; &bdquo; &hellip; &trade; &#9658; &bull; &rarr; &rArr; &hArr; &diams; &asymp;".split(" ");CKEDITOR.plugins.add("menubutton",{requires:"button,menu",onLoad:function(){var d=function(a){var b=this._;if(b.state!==CKEDITOR.TRISTATE_DISABLED){b.previousState=b.state;var c=b.menu;c||(c=b.menu=new CKEDITOR.menu(a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.common.options}}}),c.onHide=CKEDITOR.tools.bind(function(){this.setState(this.modes&&this.modes[a.mode]?b.previousState:CKEDITOR.TRISTATE_DISABLED)},this),this.onMenu&&c.addListener(this.onMenu));b.on?c.hide():(this.setState(CKEDITOR.TRISTATE_ON),
+setTimeout(function(){c.show(CKEDITOR.document.getById(b.id),4)},0))}};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(a){delete a.panel;this.base(a);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(a){return new CKEDITOR.ui.menuButton(a)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}});CKEDITOR.UI_MENUBUTTON="menubutton";(function(){function k(a,c){var b=0,d;for(d in c)if(c[d]==a){b=1;break}return b}var i="",r=function(){function a(){b.once("focus",f);b.once("blur",c)}function c(b){var b=b.editor,c=d.getScayt(b),f=b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE;c&&(d.setPaused(b,!c.disabled),d.setControlId(b,c.id),c.destroy(!0),delete d.instances[b.name],f&&a())}var b=this,f=function(){if(!("undefined"!=typeof d.instances[b.name]||null!=d.instances[b.name])){var a=b.config,c={};c.srcNodeRef="BODY"==b.editable().$.nodeName?
+b.document.getWindow().$.frameElement:b.editable().$;c.assocApp="CKEDITOR."+CKEDITOR.version+"@"+CKEDITOR.revision;c.customerid=a.scayt_customerid||"1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2";c.customDictionaryIds=a.scayt_customDictionaryIds||"";c.userDictionaryName=a.scayt_userDictionaryName||"";c.sLang=a.scayt_sLang||"en_US";c.onLoad=function(){CKEDITOR.env.ie&&8>CKEDITOR.env.version||this.addStyle(this.selectorCss(),"padding-bottom: 2px !important;");b.editable().hasFocus&&
+!d.isControlRestored(b)&&this.focus()};c.onBeforeChange=function(){d.getScayt(b)&&!b.checkDirty()&&setTimeout(function(){b.resetDirty()},0)};a=window.scayt_custom_params;if("object"==typeof a)for(var f in a)c[f]=a[f];d.getControlId(b)&&(c.id=d.getControlId(b));var o=new window.scayt(c);o.afterMarkupRemove.push(function(a){(new CKEDITOR.dom.element(a,o.document)).mergeSiblings()});if(c=d.instances[b.name])o.sLang=c.sLang,o.option(c.option()),o.paused=c.paused;d.instances[b.name]=o;try{o.setDisabled(!1===
+d.isPaused(b))}catch(e){}b.fire("showScaytState")}};b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a():b.on("contentDom",f);b.on("contentDomUnload",function(){for(var a=CKEDITOR.document.getElementsByTag("script"),b=/^dojoIoScript(\d+)$/i,c=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i,d=0;d<a.count();d++){var f=a.getItem(d),e=f.getId(),h=f.getAttribute("src");e&&(h&&e.match(b)&&h.match(c))&&f.remove()}});b.on("beforeCommandExec",function(a){"source"==a.data.name&&"source"==
+b.mode&&d.markControlRestore(b)});b.on("afterCommandExec",function(a){d.isScaytEnabled(b)&&"wysiwyg"==b.mode&&("undo"==a.data.name||"redo"==a.data.name)&&window.setTimeout(function(){d.getScayt(b).refresh()},10)});b.on("destroy",c);b.on("setData",c);b.on("insertElement",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("insertHtml",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&
+(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("scaytDialog",function(a){a.data.djConfig=window.djConfig;a.data.scayt_control=d.getScayt(b);a.data.tab=i;a.data.scayt=window.scayt});var e=b.dataProcessor;(e=e&&e.htmlFilter)&&e.addRules({elements:{span:function(a){if(a.attributes["data-scayt_word"]&&a.attributes["data-scaytid"])return delete a.name,a}}});e=CKEDITOR.plugins.undo.Image.prototype;e.equals=CKEDITOR.tools.override(e.equals,
+function(a){return function(b){var c=this.contents,f=b.contents,e=d.getScayt(this.editor);e&&d.isScaytReady(this.editor)&&(this.contents=e.reset(c)||"",b.contents=e.reset(f)||"");e=a.apply(this,arguments);this.contents=c;b.contents=f;return e}});b.document&&(b.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||b.focusManager.hasFocus)&&f()};CKEDITOR.plugins.scayt={engineLoaded:!1,instances:{},controlInfo:{},setControlInfo:function(a,c){a&&(a.name&&"object"!=typeof this.controlInfo[a.name])&&(this.controlInfo[a.name]=
+{});for(var b in c)this.controlInfo[a.name][b]=c[b]},isControlRestored:function(a){return a&&a.name&&this.controlInfo[a.name]?this.controlInfo[a.name].restored:!1},markControlRestore:function(a){this.setControlInfo(a,{restored:!0})},setControlId:function(a,c){this.setControlInfo(a,{id:c})},getControlId:function(a){return a&&a.name&&this.controlInfo[a.name]&&this.controlInfo[a.name].id?this.controlInfo[a.name].id:null},setPaused:function(a,c){this.setControlInfo(a,{paused:c})},isPaused:function(a){if(a&&
+a.name&&this.controlInfo[a.name])return this.controlInfo[a.name].paused},getScayt:function(a){return this.instances[a.name]},isScaytReady:function(a){return!0===this.engineLoaded&&"undefined"!==typeof window.scayt&&this.getScayt(a)},isScaytEnabled:function(a){return(a=this.getScayt(a))?!1===a.disabled:!1},getUiTabs:function(a){var c=[],b=a.config.scayt_uiTabs||"1,1,1",b=b.split(",");b[3]="1";for(var d=0;4>d;d++)c[d]="undefined"!=typeof window.scayt&&"undefined"!=typeof window.scayt.uiTags?parseInt(b[d],
+10)&&window.scayt.uiTags[d]:parseInt(b[d],10);"object"==typeof a.plugins.wsc?c.push(1):c.push(0);return c},loadEngine:function(a){if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version||CKEDITOR.env.opera||CKEDITOR.env.air)return a.fire("showScaytState");if(!0===this.engineLoaded)return r.apply(a);if(-1==this.engineLoaded)return CKEDITOR.on("scaytReady",function(){r.apply(a)});CKEDITOR.on("scaytReady",r,a);CKEDITOR.on("scaytReady",function(){this.engineLoaded=!0},this,null,0);this.engineLoaded=-1;var c=
+document.location.protocol,c=-1!=c.search(/https?:/)?c:"http:",c=a.config.scayt_srcUrl||c+"//svc.webspellchecker.net/scayt26/loader__base.js",b=d.parseUrl(c).path+"/";void 0==window.scayt?(CKEDITOR._djScaytConfig={baseUrl:b,addOnLoad:[function(){CKEDITOR.fireOnce("scaytReady")}],isDebug:!1},CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",{attributes:{type:"text/javascript",async:"true",src:c}}))):CKEDITOR.fireOnce("scaytReady");return null},parseUrl:function(a){var c;return a.match&&
+(c=a.match(/(.*)[\/\\](.*?\.\w+)$/))?{path:c[1],file:c[2]}:a}};var d=CKEDITOR.plugins.scayt,s=function(a,c,b,d,e,k,g){a.addCommand(d,e);a.addMenuItem(d,{label:b,command:d,group:k,order:g})},v={preserveState:!0,editorFocus:!1,canUndo:!1,exec:function(a){if(d.isScaytReady(a)){var c=d.isScaytEnabled(a);this.setState(c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_ON);a=d.getScayt(a);a.focus();a.setDisabled(c)}else!a.config.scayt_autoStartup&&0<=d.engineLoaded&&(a.focus(),this.setState(CKEDITOR.TRISTATE_DISABLED),
+d.loadEngine(a))}};CKEDITOR.plugins.add("scayt",{requires:"menubutton,dialog",beforeInit:function(a){var c=a.config.scayt_contextMenuItemsOrder||"suggest|moresuggest|control",b="";if((c=c.split("|"))&&c.length)for(var d=0;d<c.length;d++)b+="scayt_"+c[d]+(c.length!=parseInt(d,10)+1?",":"");a.config.menu_groups=b+","+a.config.menu_groups},init:function(a){var c=a.dataProcessor&&a.dataProcessor.dataFilter,b={elements:{span:function(a){var b=a.attributes;b&&b["data-scaytid"]&&delete a.name}}};c&&c.addRules(b);
+var f={},e={},p=a.addCommand("scaytcheck",v);CKEDITOR.dialog.add("scaytcheck",CKEDITOR.getUrl(this.path+"dialogs/options.js"));c=d.getUiTabs(a);a.addMenuGroup("scaytButton");a.addMenuGroup("scayt_suggest",-10);a.addMenuGroup("scayt_moresuggest",-9);a.addMenuGroup("scayt_control",-8);var b={},g=a.lang.scayt;b.scaytToggle={label:g.enable,command:"scaytcheck",group:"scaytButton"};1==c[0]&&(b.scaytOptions={label:g.options,group:"scaytButton",onClick:function(){i="options";a.openDialog("scaytcheck")}});
+1==c[1]&&(b.scaytLangs={label:g.langs,group:"scaytButton",onClick:function(){i="langs";a.openDialog("scaytcheck")}});1==c[2]&&(b.scaytDict={label:g.dictionariesTab,group:"scaytButton",onClick:function(){i="dictionaries";a.openDialog("scaytcheck")}});b.scaytAbout={label:a.lang.scayt.about,group:"scaytButton",onClick:function(){i="about";a.openDialog("scaytcheck")}};1==c[4]&&(b.scaytWSC={label:a.lang.wsc.toolbar,group:"scaytButton",command:"checkspell"});a.addMenuItems(b);a.ui.add("Scayt",CKEDITOR.UI_MENUBUTTON,
+{label:g.title,title:CKEDITOR.env.opera?g.opera_title:g.title,modes:{wysiwyg:1},toolbar:"spellchecker,20",onRender:function(){p.on("state",function(){this.setState(p.state)},this)},onMenu:function(){var b=d.isScaytEnabled(a);a.getMenuItem("scaytToggle").label=g[b?"disable":"enable"];var c=d.getUiTabs(a);return{scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b&&c[0]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytLangs:b&&c[1]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b&&c[2]?
+CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b&&c[3]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytWSC:c[4]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}});a.contextMenu&&a.addMenuItems&&a.contextMenu.addListener(function(b,c){if(!d.isScaytEnabled(a)||c.getRanges()[0].checkReadOnly())return null;var l=d.getScayt(a),q=l.getScaytNode();if(!q)return null;var h=l.getWord(q);if(!h)return null;var i=l.getLang(),m=a.config.scayt_contextCommands||"all",h=window.scayt.getSuggestion(h,
+i),m=m.split("|"),n;for(n in f){delete a._.menuItems[n];delete a.commands[n]}for(n in e){delete a._.menuItems[n];delete a.commands[n]}if(!h||!h.length){s(a,"no_sugg",g.noSuggestions,"scayt_no_sugg",{exec:function(){}},"scayt_control",1,true);e.scayt_no_sugg=CKEDITOR.TRISTATE_OFF}else{f={};e={};n=a.config.scayt_moreSuggestions||"on";var i=false,u=a.config.scayt_maxSuggestions;typeof u!="number"&&(u=5);!u&&(u=h.length);for(var j=0,p=h.length;j<p;j=j+1){var t="scayt_suggestion_"+h[j].replace(" ","_"),
+r=function(a,b){return{exec:function(){l.replace(a,b)}}}(q,h[j]);if(j<u){s(a,"button_"+t,h[j],t,r,"scayt_suggest",j+1);e[t]=CKEDITOR.TRISTATE_OFF}else if(n=="on"){s(a,"button_"+t,h[j],t,r,"scayt_moresuggest",j+1);f[t]=CKEDITOR.TRISTATE_OFF;i=true}}if(i){a.addMenuItem("scayt_moresuggest",{label:g.moreSuggestions,group:"scayt_moresuggest",order:10,getItems:function(){return f}});e.scayt_moresuggest=CKEDITOR.TRISTATE_OFF}}if(k("all",m)||k("ignore",m)){s(a,"ignore",g.ignore,"scayt_ignore",{exec:function(){l.ignore(q)}},
+"scayt_control",2);e.scayt_ignore=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("ignoreall",m)){s(a,"ignore_all",g.ignoreAll,"scayt_ignore_all",{exec:function(){l.ignoreAll(q)}},"scayt_control",3);e.scayt_ignore_all=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("add",m)){s(a,"add_word",g.addWord,"scayt_add_word",{exec:function(){window.scayt.addWordToUserDictionary(q)}},"scayt_control",4);e.scayt_add_word=CKEDITOR.TRISTATE_OFF}l.fireOnContextMenu&&l.fireOnContextMenu(a);return e});c=function(b){b.removeListener();
+CKEDITOR.env.opera||CKEDITOR.env.air?p.setState(CKEDITOR.TRISTATE_DISABLED):p.setState(d.isScaytEnabled(a)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)};a.on("showScaytState",c);a.on("instanceReady",c);if(a.config.scayt_autoStartup)a.on("instanceReady",function(){d.loadEngine(a)})},afterInit:function(a){var c,b=function(a){if(a.hasAttribute("data-scaytid"))return!1};a._.elementsPath&&(c=a._.elementsPath.filters)&&c.push(b);a.addRemoveFormatFilter&&a.addRemoveFormatFilter(b)}})})();(function(){function m(b,j){var k=b.type,f=j.type;return k==f?0:k==CKEDITOR.STYLE_OBJECT?-1:f==CKEDITOR.STYLE_OBJECT?1:f==CKEDITOR.STYLE_BLOCK?1:-1}CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(b){function j(a){b.getStylesSet(function(g){if(!i.length){for(var c,l,e=0,f=g.length;e<f;e++)c=g[e],b.blockless&&c.element in CKEDITOR.dtd.$block||(l=c.name,c=h[l]=new CKEDITOR.style(c),c._name=l,c._.enterMode=k.enterMode,i.push(c));i.sort(m)}a&&a()})}var k=b.config,f=b.lang.stylescombo,
+h={},i=[],d;b.ui.addRichCombo("Styles",{label:f.label,title:f.panelTitle,toolbar:"styles,10",panel:{css:[CKEDITOR.skin.getPath("editor")].concat(k.contentsCss),multiSelect:!0,attributes:{"aria-label":f.panelTitle}},init:function(){d=this;j(function(){var a,g,c,b,e,h;e=0;for(h=i.length;e<h;e++)a=i[e],g=a._name,b=a.type,b!=c&&(d.startGroup(f["panelTitle"+b]),c=b),d.add(g,a.type==CKEDITOR.STYLE_OBJECT?g:a.buildPreview(),g);d.commit()})},onClick:function(a){b.focus();b.fire("saveSnapshot");var a=h[a],
+g=b.elementPath();b[a.checkActive(g)?"removeStyle":"applyStyle"](a);b.fire("saveSnapshot")},onRender:function(){b.on("selectionChange",function(a){for(var b=this.getValue(),a=a.data.path.elements,c=0,f=a.length,e;c<f;c++){e=a[c];for(var d in h)if(h[d].checkElementRemovable(e,!0)){d!=b&&this.setValue(d);return}}this.setValue("")},this)},onOpen:function(){var a=b.getSelection().getSelectedElement(),a=b.elementPath(a),g=[0,0,0,0];this.showAll();this.unmarkAll();for(var c in h){var d=h[c],e=d.type;e==
+CKEDITOR.STYLE_BLOCK&&!a.isContextFor(d.element)?this.hideItem(c):(d.checkActive(a)?this.mark(c):e==CKEDITOR.STYLE_OBJECT&&!d.checkApplicable(a)&&(this.hideItem(c),g[e]--),g[e]++)}g[CKEDITOR.STYLE_BLOCK]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_BLOCK]);g[CKEDITOR.STYLE_INLINE]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_INLINE]);g[CKEDITOR.STYLE_OBJECT]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_OBJECT])},reset:function(){d&&(delete d._.panel,delete d._.list,d._.committed=0,d._.items={},
+d._.state=CKEDITOR.TRISTATE_OFF);h={};i=[];j()}});b.on("instanceReady",function(){j()})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:
+0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++){var i=f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1));!CKEDITOR.env.ie&&i.appendBogus()}e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,
+source:1}},g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+=" ";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertHtml(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});
+c.addCommand("blur",CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})();
+CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&
+(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()};
+CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,e){this.setState(e.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var b=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table"}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",d()));a.addCommand("tableDelete",d({exec:function(a){var c=a.elementPath().contains("table",
+1);if(c){var b=c.getParent();1==b.getChildCount()&&!b.is("body","td","th")&&(c=b);a=a.createRange();a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove();a.select()}}}));a.ui.addButton&&a.ui.addButton("Table",{label:b.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:b.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:b.deleteTable,
+command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog="tableProperties")});a.contextMenu&&a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function o(c){function d(c){!(0<b.length)&&(c.type==CKEDITOR.NODE_ELEMENT&&z.test(c.getName())&&!c.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(a,c,"selected_cell",!0),b.push(c))}for(var c=c.getRanges(),b=[],a={},e=0;e<c.length;e++){var f=c[e];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g=
+g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(a,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(a);return b}function m(c,d){for(var b=o(c),a=b[0],e=a.getAscendant("table"),a=a.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(e.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(e),e=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,
+a=a.createElement("tr"),h=0;e[h]&&h<b;h++){var i;1<e[h].rowSpan&&g&&e[h]==g[h]?(i=e[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(e[h])).clone(),i.removeAttribute("rowSpan"),!CKEDITOR.env.ie&&i.appendBogus(),a.append(i),i=i.$);h+=i.colSpan-1}d?a.insertBefore(f):a.insertAfter(f)}function p(c){if(c instanceof CKEDITOR.dom.selection){for(var d=o(c),b=d[0].getAscendant("table"),a=CKEDITOR.tools.buildTableMap(b),c=d[0].getParent().$.rowIndex,d=d[d.length-1],e=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],
+f=c;f<=e;f++){for(var g=a[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),k=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,k==f&&(k=a[f+1],k[i-1]?j.insertAfter(new CKEDITOR.dom.element(k[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}a=b.$.rows;b=new CKEDITOR.dom.element(a[e+1]||(0<c?a[c-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)p(d[f]);return b}c instanceof CKEDITOR.dom.element&&
+(b=c.getAscendant("table"),1==b.$.rows.length?b.remove():c.remove());return null}function q(c,d){for(var b=d?Infinity:0,a=0;a<c.length;a++){var e;e=c[a];for(var f=d,g=e.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==e.$)break}e=h-1;if(d?e<b:e>b)b=e}return b}function n(c,d){for(var b=o(c),a=b[0].getAscendant("table"),e=q(b,1),b=q(b),e=d?e:b,f=CKEDITOR.tools.buildTableMap(a),a=[],b=[],g=f.length,h=0;h<g;h++)a.push(f[h][e]),b.push(d?f[h][e-1]:f[h][e+1]);for(h=0;h<g;h++)a[h]&&
+(1<a[h].colSpan&&b[h]==a[h]?(e=a[h],e.colSpan+=1):(e=(new CKEDITOR.dom.element(a[h])).clone(),e.removeAttribute("colSpan"),!CKEDITOR.env.ie&&e.appendBogus(),e[d?"insertBefore":"insertAfter"].call(e,new CKEDITOR.dom.element(a[h])),e=e.$),h+=e.rowSpan-1)}function t(c,d){var b=c.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var a=b.clone();CKEDITOR.env.ie||a.appendBogus();d?a.insertBefore(b):a.insertAfter(b)}}function s(c){if(c instanceof CKEDITOR.dom.selection){var c=o(c),d=
+c[0]&&c[0].getAscendant("table"),b;a:{var a=0;b=c.length-1;for(var e={},f,g;f=c[a++];)CKEDITOR.dom.element.setMarker(e,f,"delete_cell",!0);for(a=0;f=c[a++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(e);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(e);g=c[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=c[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=c.length-1;0<=g;g--)s(c[g]);
+b?u(b,!0):d&&d.remove()}else c instanceof CKEDITOR.dom.element&&(d=c.getParent(),1==d.getChildCount()?d.remove():c.remove())}function u(c,d){var b=new CKEDITOR.dom.range(c.getDocument());if(!b["moveToElementEdit"+(d?"End":"Start")](c))b.selectNodeContents(c),b.collapse(d?!1:!0);b.select(!0)}function v(c,d,b){c=c[d];if("undefined"==typeof b)return c;for(d=0;c&&d<c.length;d++){if(b.is&&c[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(c[d])}return b.is?-1:null}function r(c,d,b){var a=o(c),
+e;if((d?1!=a.length:2>a.length)||(e=c.getCommonAncestor())&&e.type==CKEDITOR.NODE_ELEMENT&&e.is("table"))return!1;var f,c=a[0];e=c.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(e),h=g.length,i=g[0].length,j=c.getParent().$.rowIndex,k=v(g,j,c);if(d){var w;try{var l=parseInt(c.getAttribute("rowspan"),10)||1;f=parseInt(c.getAttribute("colspan"),10)||1;w=g["up"==d?j-l:"down"==d?j+l:j]["left"==d?k-f:"right"==d?k+f:k]}catch(u){return!1}if(!w||c.$==w)return!1;a["up"==d||"left"==d?"unshift":"push"](new CKEDITOR.dom.element(w))}for(var d=
+c.getDocument(),m=j,l=w=0,p=!b&&new CKEDITOR.dom.documentFragment(d),r=0,d=0;d<a.length;d++){f=a[d];var n=f.getParent(),s=f.getFirst(),q=f.$.colSpan,t=f.$.rowSpan,n=n.$.rowIndex,x=v(g,n,f),r=r+q*t,l=Math.max(l,x-k+q);w=Math.max(w,n-j+t);if(!b){q=f;(t=q.getBogus())&&t.remove();q.trim();if(f.getChildren().count()){if(n!=m&&s&&(!s.isBlockBoundary||!s.isBlockBoundary({br:1})))(m=p.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!m.is||!m.is("br"))&&p.append("br");f.moveChildren(p)}d?f.remove():f.setHtml("")}m=
+n}if(b)return w*l==r;p.moveChildren(c);CKEDITOR.env.ie||c.appendBogus();l>=i?c.removeAttribute("rowSpan"):c.$.rowSpan=w;w>=h?c.removeAttribute("colSpan"):c.$.colSpan=l;b=new CKEDITOR.dom.nodeList(e.$.rows);a=b.count();for(d=a-1;0<=d;d--)e=b.getItem(d),e.$.cells.length||(e.remove(),a++);return c}function x(c,d){var b=o(c);if(1<b.length)return!1;if(d)return!0;var b=b[0],a=b.getParent(),e=a.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(e),g=a.$.rowIndex,h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/
+2);for(var i=Math.floor(i/2),a=g+j,e=new CKEDITOR.dom.element(e.$.rows[a]),f=v(f,a),k,a=b.clone(),g=0;g<f.length;g++)if(k=f[g],k.parentNode==e.$&&g>h){a.insertBefore(new CKEDITOR.dom.element(k));break}else k=null;k||e.append(a,!0)}else{i=j=1;e=a.clone();e.insertAfter(a);e.append(a=b.clone());k=v(f,g);for(h=0;h<k.length;h++)k[h].rowSpan++}CKEDITOR.env.ie||a.appendBogus();b.$.rowSpan=j;a.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&a.removeAttribute("rowSpan");return a}function y(c,d){var b=
+o(c);if(1<b.length)return!1;if(d)return!0;var b=b[0],a=b.getParent(),e=a.getAscendant("table"),e=CKEDITOR.tools.buildTableMap(e),f=v(e,a.$.rowIndex,b),g=b.$.colSpan;if(1<g)a=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=a=1,h=[],i=0;i<e.length;i++){var j=e[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(e=0;e<h.length;e++)h[e].colSpan++}e=b.clone();e.insertAfter(b);CKEDITOR.env.ie||e.appendBogus();b.$.colSpan=a;e.$.colSpan=g;1==a&&b.removeAttribute("colSpan");1==g&&e.removeAttribute("colSpan");
+return e}var z=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(c){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}var b=c.lang.table;c.addCommand("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d()));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");c.addCommand("rowDelete",d({exec:function(a){a=
+a.getSelection();u(p(a))}}));c.addCommand("rowInsertBefore",d({exec:function(a){a=a.getSelection();m(a,!0)}}));c.addCommand("rowInsertAfter",d({exec:function(a){a=a.getSelection();m(a)}}));c.addCommand("columnDelete",d({exec:function(a){for(var a=a.getSelection(),a=o(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"),d=CKEDITOR.tools.buildTableMap(a),h,i,j=[],k=0,m=d.length;k<m;k++)for(var l=0,n=d[k].length;l<n;l++)d[k][l]==b.$&&(h=l),d[k][l]==c.$&&(i=l);for(k=h;k<=i;k++)for(l=0;l<d.length;l++)c=
+d[l],b=new CKEDITOR.dom.element(a.$.rows[l]),c=new CKEDITOR.dom.element(c[k]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,l+=c.$.rowSpan-1,b.$.cells.length||j.push(b));i=a.$.rows[0]&&a.$.rows[0].cells;h=new CKEDITOR.dom.element(i[h]||(h?i[h-1]:a.$.parentNode));j.length==m&&a.remove();h&&u(h,!0)}}));c.addCommand("columnInsertBefore",d({exec:function(a){a=a.getSelection();n(a,!0)}}));c.addCommand("columnInsertAfter",d({exec:function(a){a=a.getSelection();n(a)}}));c.addCommand("cellDelete",d({exec:function(a){a=
+a.getSelection();s(a)}}));c.addCommand("cellMerge",d({exec:function(a){u(r(a.getSelection()),!0)}}));c.addCommand("cellMergeRight",d({exec:function(a){u(r(a.getSelection(),"right"),!0)}}));c.addCommand("cellMergeDown",d({exec:function(a){u(r(a.getSelection(),"down"),!0)}}));c.addCommand("cellVerticalSplit",d({exec:function(a){u(x(a.getSelection()))}}));c.addCommand("cellHorizontalSplit",d({exec:function(a){u(y(a.getSelection()))}}));c.addCommand("cellInsertBefore",d({exec:function(a){a=a.getSelection();
+t(a,!0)}}));c.addCommand("cellInsertAfter",d({exec:function(a){a=a.getSelection();t(a)}}));c.addMenuItems&&c.addMenuItems({tablecell:{label:b.cell.menu,group:"tablecell",order:1,getItems:function(){var a=c.getSelection(),b=o(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:r(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:r(a,"right",!0)?CKEDITOR.TRISTATE_OFF:
+CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:r(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:y(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:b.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:b.cell.insertAfter,
+group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:b.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:b.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:b.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:b.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:b.cell.splitHorizontal,group:"tablecell",
+command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:b.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:b.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:b.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:b.row.insertBefore,
+group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:b.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:b.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:b.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:b.column.insertBefore,
+group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:b.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:b.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});c.contextMenu&&c.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:o};
+CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(o){for(var o=o.$.rows,m=-1,p=[],q=0;q<o.length;q++){m++;!p[m]&&(p[m]=[]);for(var n=-1,t=0;t<o[q].cells.length;t++){var s=o[q].cells[t];for(n++;p[m][n];)n++;for(var u=isNaN(s.colSpan)?1:s.colSpan,s=isNaN(s.rowSpan)?1:s.rowSpan,v=0;v<s;v++){p[m+v]||(p[m+v]=[]);for(var r=0;r<u;r++)p[m+v][n+r]=o[q].cells[t]}n+=u-1}}return p};(function(){function h(a){this.editor=a;this.reset()}CKEDITOR.plugins.add("undo",{init:function(a){function c(a){b.enabled&&!1!==a.data.command.canUndo&&b.save()}var b=new h(a),d=a.addCommand("undo",{exec:function(){b.undo()&&(a.selectionChange(),this.fire("afterUndo"))},state:CKEDITOR.TRISTATE_DISABLED,canUndo:!1}),e=a.addCommand("redo",{exec:function(){b.redo()&&(a.selectionChange(),this.fire("afterRedo"))},state:CKEDITOR.TRISTATE_DISABLED,canUndo:!1});a.setKeystroke([[CKEDITOR.CTRL+90,"undo"],
+[CKEDITOR.CTRL+89,"redo"],[CKEDITOR.CTRL+CKEDITOR.SHIFT+90,"redo"]]);b.onChange=function(){d.setState(b.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);e.setState(b.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",c);a.on("afterCommandExec",c);a.on("saveSnapshot",function(a){b.save(a.data&&a.data.contentOnly)});a.on("contentDom",function(){a.editable().on("keydown",function(a){!a.data.$.ctrlKey&&!a.data.$.metaKey&&b.type(a)})});a.on("beforeModeUnload",
+function(){"wysiwyg"==a.mode&&b.save(!0)});a.on("mode",function(){b.enabled=a.readOnly?!1:"wysiwyg"==a.mode;b.onChange()});a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){b.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){b.currentImage&&b.update()});a.on("lockSnapshot",b.lock,b);a.on("unlockSnapshot",b.unlock,b)}});CKEDITOR.plugins.undo=
+{};var i=CKEDITOR.plugins.undo.Image=function(a){this.editor=a;a.fire("beforeUndoImage");var c=a.getSnapshot(),b=c&&a.getSelection();CKEDITOR.env.ie&&c&&(c=c.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=c;this.bookmarks=b&&b.createBookmarks2(!0);a.fire("afterUndoImage")},j=/\b(?:href|src|name)="[^"]*?"/gi;i.prototype={equals:function(a,c){var b=this.contents,d=a.contents;if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat))b=b.replace(j,""),d=d.replace(j,"");if(b!=d)return!1;
+if(c)return!0;b=this.bookmarks;d=a.bookmarks;if(b||d){if(!b||!d||b.length!=d.length)return!1;for(var e=0;e<b.length;e++){var g=b[e],f=d[e];if(g.startOffset!=f.startOffset||g.endOffset!=f.endOffset||!CKEDITOR.tools.arrayCompare(g.start,f.start)||!CKEDITOR.tools.arrayCompare(g.end,f.end))return!1}}return!0}};var k={8:1,46:1},m={16:1,17:1,18:1},l={37:1,38:1,39:1,40:1};h.prototype={type:function(a){var a=a&&a.data.getKey(),c=a in k,b=this.lastKeystroke in k,d=c&&a==this.lastKeystroke,e=a in l,g=this.lastKeystroke in
+l;if(!(a in m||this.typing)||!c&&!e&&(b||g)||c&&!d){var f=new i(this.editor),h=this.snapshots.length;CKEDITOR.tools.setTimeout(function(){var a=this.editor.getSnapshot();CKEDITOR.env.ie&&(a=a.replace(/\s+data-cke-expando=".*?"/g,""));f.contents!=a&&h==this.snapshots.length&&(this.typing=!0,this.save(!1,f,!1)||this.snapshots.splice(this.index+1,this.snapshots.length-this.index-1),this.hasUndo=!0,this.hasRedo=!1,this.modifiersCount=this.typesCount=1,this.onChange())},0,this)}this.lastKeystroke=a;c?
+(this.typesCount=0,this.modifiersCount++,25<this.modifiersCount&&(this.save(!1,null,!1),this.modifiersCount=1)):e||(this.modifiersCount=0,this.typesCount++,25<this.typesCount&&(this.save(!1,null,!1),this.typesCount=1))},reset:function(){this.lastKeystroke=0;this.snapshots=[];this.index=-1;this.limit=this.editor.config.undoStackSize||20;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.typing=!1;delete this.lastKeystroke;this.modifiersCount=
+this.typesCount=0},fireChange:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,c,b){if(this.locked)return!1;var d=this.snapshots;c||(c=new i(this.editor));if(!1===c.contents||this.currentImage&&c.equals(this.currentImage,a))return!1;d.splice(this.index+1,d.length-this.index-1);d.length==this.limit&&d.shift();this.index=d.push(c)-1;this.currentImage=c;!1!==b&&this.fireChange();return!0},restoreImage:function(a){var c=
+this.editor,b;a.bookmarks&&(c.focus(),b=c.getSelection());this.locked=1;this.editor.loadSnapshot(a.contents);a.bookmarks?b.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=0;this.index=a.index;this.update();this.fireChange()},getNextImage:function(a){var c=this.snapshots,b=this.currentImage,d;if(b)if(a)for(d=this.index-1;0<=d;d--){if(a=c[d],!b.equals(a,!0))return a.index=d,a}else for(d=this.index+1;d<c.length;d++)if(a=
+c[d],!b.equals(a,!0))return a.index=d,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(){this.locked||this.snapshots.splice(this.index,1,this.currentImage=
+new i(this.editor))},lock:function(){if(!this.locked){var a=this.editor.getSnapshot();this.locked={update:this.currentImage&&a==this.currentImage.contents?a:null}}},unlock:function(){if(this.locked){var a=this.locked.update,c=this.editor.getSnapshot();this.locked=null;"string"==typeof a&&c!=a&&this.update()}}}})();CKEDITOR.plugins.add("wsc",{requires:"dialog",init:function(a){a.addCommand("checkspell",new CKEDITOR.dialogCommand("checkspell")).modes={wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname};"undefined"==typeof a.plugins.scayt&&a.ui.addButton&&a.ui.addButton("SpellChecker",{label:a.lang.wsc.toolbar,command:"checkspell",toolbar:"spellchecker,10"});CKEDITOR.dialog.add("checkspell",this.path+"dialogs/wsc.js")}});
+CKEDITOR.config.wsc_customerId=CKEDITOR.config.wsc_customerId||"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk";CKEDITOR.config.wsc_customLoaderScript=CKEDITOR.config.wsc_customLoaderScript||null;CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,basicstyles,blockquote,clipboard,panel,floatpanel,menu,contextmenu,resize,button,toolbar,elementspath,list,indent,enterkey,entities,popup,filebrowser,floatingspace,listblock,richcombo,format,htmlwriter,horizontalrule,wysiwygarea,image,fakeobjects,link,magicline,maximize,pastetext,pastefromword,removeformat,sourcearea,specialchar,menubutton,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moono';(function() {var icons = ( 'about,0,bold,32,italic,64,strike,96,subscript,128,superscript,160,underline,192,blockquote,224,copy-rtl,256,copy,288,cut-rtl,320,cut,352,paste-rtl,384,paste,416,bulletedlist-rtl,448,bulletedlist,480,numberedlist-rtl,512,numberedlist,544,indent-rtl,576,indent,608,outdent-rtl,640,outdent,672,horizontalrule,704,image,736,anchor-rtl,768,anchor,800,link,832,unlink,864,maximize,896,pastetext-rtl,928,pastetext,960,pastefromword-rtl,992,pastefromword,1024,removeformat,1056,source-rtl,1088,source,1120,specialchar,1152,scayt,1184,table,1216,redo-rtl,1248,redo,1280,undo-rtl,1312,undo,1344,spellchecker,1376' ),path = CKEDITOR.getUrl( 'plugins/icons.png' ),icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ] };})();CKEDITOR.lang.languages={"af":1,"ar":1,"eu":1,"bn":1,"bs":1,"bg":1,"ca":1,"zh-cn":1,"zh":1,"hr":1,"cs":1,"da":1,"nl":1,"en":1,"en-au":1,"en-ca":1,"en-gb":1,"eo":1,"et":1,"fo":1,"fi":1,"fr":1,"fr-ca":1,"gl":1,"ka":1,"de":1,"el":1,"gu":1,"he":1,"hi":1,"hu":1,"is":1,"it":1,"ja":1,"km":1,"ko":1,"ku":1,"lv":1,"lt":1,"mk":1,"ms":1,"mn":1,"no":1,"nb":1,"fa":1,"pl":1,"pt-br":1,"pt":1,"ro":1,"ru":1,"sr":1,"sr-latn":1,"sk":1,"sl":1,"es":1,"sv":1,"th":1,"tr":1,"ug":1,"uk":1,"vi":1,"cy":1};}()); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/config.js b/mod/ckeditor/vendors/ckeditor/config.js
new file mode 100644
index 000000000..bbf70c432
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/config.js
@@ -0,0 +1,32 @@
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+CKEDITOR.editorConfig = function( config ) {
+ // Define changes to default configuration here.
+ // For the complete reference:
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.config
+
+ // The toolbar groups arrangement, optimized for two toolbar rows.
+ config.toolbarGroups = [
+ { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
+ { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] },
+ { name: 'links' },
+ { name: 'insert' },
+ { name: 'forms' },
+ { name: 'tools' },
+ { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
+ { name: 'others' },
+ '/',
+ { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align' ] },
+ { name: 'styles' },
+ { name: 'colors' },
+ { name: 'about' }
+ ];
+
+ // Remove some buttons, provided by the standard plugins, which we don't
+ // need to have in the Standard(s) toolbar.
+ config.removeButtons = 'Underline,Subscript,Superscript';
+};
diff --git a/mod/ckeditor/vendors/ckeditor/contents.css b/mod/ckeditor/vendors/ckeditor/contents.css
new file mode 100644
index 000000000..a5e5fd48f
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/contents.css
@@ -0,0 +1,99 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+body
+{
+ /* Font */
+ font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
+ font-size: 12px;
+
+ /* Text color */
+ color: #333;
+
+ /* Remove the background color to make it transparent */
+ background-color: #fff;
+
+ margin: 20px;
+}
+
+.cke_editable
+{
+ font-size: 13px;
+ line-height: 1.6em;
+}
+
+blockquote
+{
+ font-style: italic;
+ font-family: Georgia, Times, "Times New Roman", serif;
+ padding: 2px 0;
+ border-style: solid;
+ border-color: #ccc;
+ border-width: 0;
+}
+
+.cke_contents_ltr blockquote
+{
+ padding-left: 20px;
+ padding-right: 8px;
+ border-left-width: 5px;
+}
+
+.cke_contents_rtl blockquote
+{
+ padding-left: 8px;
+ padding-right: 20px;
+ border-right-width: 5px;
+}
+
+a
+{
+ color: #0782C1;
+}
+
+ol,ul,dl
+{
+ /* IE7: reset rtl list margin. (#7334) */
+ *margin-right: 0px;
+ /* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/
+ padding: 0 40px;
+}
+
+h1,h2,h3,h4,h5,h6
+{
+ font-weight: normal;
+ line-height: 1.2em;
+}
+
+hr
+{
+ border: 0px;
+ border-top: 1px solid #ccc;
+}
+
+img.right {
+ border: 1px solid #ccc;
+ float: right;
+ margin-left: 15px;
+ padding: 5px;
+}
+
+img.left {
+ border: 1px solid #ccc;
+ float: left;
+ margin-right: 15px;
+ padding: 5px;
+}
+
+img:hover {
+ opacity: .9;
+ filter: alpha(opacity = 90);
+}
+
+pre
+{
+ white-space: pre-wrap; /* CSS 2.1 */
+ word-wrap: break-word; /* IE7 */
+}
diff --git a/mod/ckeditor/vendors/ckeditor/lang/af.js b/mod/ckeditor/vendors/ckeditor/lang/af.js
new file mode 100644
index 000000000..d8f349ecc
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/af.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['af']={"dir":"ltr","editor":"Teksverwerker","common":{"editorHelp":"Druk op ALT 0 vir hulp","browseServer":"Blaai op bediener","url":"URL","protocol":"Protokol","upload":"Oplaai","uploadSubmit":"Stuur na bediener","image":"Afbeelding","flash":"Flash","form":"Vorm","checkbox":"Merkhokkie","radio":"Radioknoppie","textField":"Teksveld","textarea":"Teks-area","hiddenField":"Blinde veld","button":"Knop","select":"Keuseveld","imageButton":"Afbeeldingsknop","notSet":"<geen instelling>","id":"Id","name":"Naam","langDir":"Skryfrigting","langDirLtr":"Links na regs (LTR)","langDirRtl":"Regs na links (RTL)","langCode":"Taalkode","longDescr":"Lang beskrywing URL","cssClass":"CSS klasse","advisoryTitle":"Aanbevole titel","cssStyle":"Styl","ok":"OK","cancel":"Kanselleer","close":"Sluit","preview":"Voorbeeld","resize":"Sleep om te herskaal","generalTab":"Algemeen","advancedTab":"Gevorderd","validateNumberFailed":"Hierdie waarde is nie 'n getal nie.","confirmNewPage":"Alle wysiginge sal verlore gaan. Is u seker dat u 'n nuwe bladsy wil laai?","confirmCancel":"Sommige opsies is gewysig. Is u seker dat u hierdie dialoogvenster wil sluit?","options":"Opsies","target":"Doel","targetNew":"Nuwe venster (_blank)","targetTop":"Boonste venster (_top)","targetSelf":"Selfde venster (_self)","targetParent":"Oorspronklike venster (_parent)","langDirLTR":"Links na Regs (LTR)","langDirRTL":"Regs na Links (RTL)","styles":"Styl","cssClasses":"CSS klasse","width":"Breedte","height":"Hoogte","align":"Oplyn","alignLeft":"Links","alignRight":"Regs","alignCenter":"Sentreer","alignTop":"Bo","alignMiddle":"Middel","alignBottom":"Onder","invalidValue":"Invalid value.","invalidHeight":"Hoogte moet 'n getal wees","invalidWidth":"Breedte moet 'n getal wees.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nie beskikbaar nie</span>"},"about":{"copy":"Kopiereg &copy; $1. Alle regte voorbehou.","dlgTitle":"Info oor CKEditor","help":"Check $1 for help.","moreInfo":"Vir lisensie-informasie, besoek asb. ons webwerf:","title":"Info oor CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Vet","italic":"Skuins","strike":"Deurstreep","subscript":"Onderskrif","superscript":"Bo-skrif","underline":"Onderstreep"},"blockquote":{"toolbar":"Sitaatblok"},"clipboard":{"copy":"Kopiëer","copyError":"U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).","cut":"Knip","cutError":"U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).","paste":"Plak","pasteArea":"Plak-area","pasteMsg":"Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.","securityMsg":"Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.","title":"Byvoeg"},"contextmenu":{"options":"Konteks Spyskaart-opsies"},"toolbar":{"toolbarCollapse":"Verklein werkbalk","toolbarExpand":"Vergroot werkbalk","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elemente-pad","eleTitle":"%1 element"},"list":{"bulletedlist":"Ongenommerde lys","numberedlist":"Genommerde lys"},"indent":{"indent":"Vergroot inspring","outdent":"Verklein inspring"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Opskrif 1","tag_h2":"Opskrif 2","tag_h3":"Opskrif 3","tag_h4":"Opskrif 4","tag_h5":"Opskrif 5","tag_h6":"Opskrif 6","tag_p":"Normaal","tag_pre":"Opgemaak"},"horizontalrule":{"toolbar":"Horisontale lyn invoeg"},"image":{"alertUrl":"Gee URL van afbeelding.","alt":"Alternatiewe teks","border":"Rand","btnUpload":"Stuur na bediener","button2Img":"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?","hSpace":"HSpasie","img2Button":"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?","infoTab":"Afbeelding informasie","linkTab":"Skakel","lockRatio":"Vaste proporsie","menu":"Afbeelding eienskappe","resetSize":"Herstel grootte","title":"Afbeelding eienskappe","titleButton":"Afbeeldingsknop eienskappe","upload":"Oplaai","urlMissing":"Die URL na die afbeelding ontbreek.","vSpace":"VSpasie","validateBorder":"Rand moet 'n heelgetal wees.","validateHSpace":"HSpasie moet 'n heelgetal wees.","validateVSpace":"VSpasie moet 'n heelgetal wees."},"fakeobjects":{"anchor":"Anker","flash":"Flash animasie","hiddenfield":"Verborge veld","iframe":"IFrame","unknown":"Onbekende objek"},"link":{"acccessKey":"Toegangsleutel","advanced":"Gevorderd","advisoryContentType":"Aanbevole inhoudstipe","advisoryTitle":"Aanbevole titel","anchor":{"toolbar":"Anker byvoeg/verander","menu":"Anker-eienskappe","title":"Anker-eienskappe","name":"Ankernaam","errorName":"Voltooi die ankernaam asseblief","remove":"Remove Anchor"},"anchorId":"Op element Id","anchorName":"Op ankernaam","charset":"Karakterstel van geskakelde bron","cssClasses":"CSS klasse","emailAddress":"E-posadres","emailBody":"Berig-inhoud","emailSubject":"Berig-onderwerp","id":"Id","info":"Skakel informasie","langCode":"Taalkode","langDir":"Skryfrigting","langDirLTR":"Links na regs (LTR)","langDirRTL":"Regs na links (RTL)","menu":"Wysig skakel","name":"Naam","noAnchors":"(Geen ankers beskikbaar in dokument)","noEmail":"Gee die e-posadres","noUrl":"Gee die skakel se URL","other":"<ander>","popupDependent":"Afhanklik (Netscape)","popupFeatures":"Eienskappe van opspringvenster","popupFullScreen":"Volskerm (IE)","popupLeft":"Posisie links","popupLocationBar":"Adresbalk","popupMenuBar":"Spyskaartbalk","popupResizable":"Herskaalbaar","popupScrollBars":"Skuifbalke","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Posisie bo","rel":"Relationship","selectAnchor":"Kies 'n anker","styles":"Styl","tabIndex":"Tab indeks","target":"Doel","targetFrame":"<raam>","targetFrameName":"Naam van doelraam","targetPopup":"<opspringvenster>","targetPopupName":"Naam van opspringvenster","title":"Skakel","toAnchor":"Anker in bladsy","toEmail":"E-pos","toUrl":"URL","toolbar":"Skakel invoeg/wysig","type":"Skakelsoort","unlink":"Verwyder skakel","upload":"Oplaai"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimaliseer","minimize":"Minimaliseer"},"pastetext":{"button":"Plak as eenvoudige teks","title":"Plak as eenvoudige teks"},"pastefromword":{"confirmCleanup":"Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?","error":"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout","title":"Plak vanuit Word","toolbar":"Plak vanuit Word"},"removeformat":{"toolbar":"Verwyder opmaak"},"sourcearea":{"toolbar":"Bron"},"specialchar":{"options":"Spesiale karakter-opsies","title":"Kies spesiale karakter","toolbar":"Voeg spesiaale karakter in"},"scayt":{"about":"SCAYT info","aboutTab":"Info","addWord":"Voeg woord by","allCaps":"Ignoreer woorde in hoofletters","dic_create":"Skep","dic_delete":"Verwijder","dic_field_name":"Naam van woordeboek","dic_info":"Aanvanklik word die gebruikerswoordeboek in 'n koekie gestoor. Koekies is egter beperk in grootte. Wanneer die gebruikerswoordeboek te groot vir 'n koekie geword het, kan dit op ons bediener gestoor word. Om u persoonlike woordeboek op ons bediener te stoor, gee asb. 'n naam vir u woordeboek. Indien u alreeds 'n gestoorde woordeboek het, tik die naam en kliek op die Herstel knop.","dic_rename":"Hernoem","dic_restore":"Herstel","dictionariesTab":"Woordeboeke","disable":"SCAYT af","emptyDic":"Woordeboeknaam mag nie leeg wees nie.","enable":"SCAYT aan","ignore":"Ignoreer","ignoreAll":"Ignoreer alles","ignoreDomainNames":"Ignoreer domeinname","langs":"Tale","languagesTab":"Tale","mixedCase":"Ignoreer woorde met hoof- en kleinletters","mixedWithDigits":"Ignoreer woorde met syfers","moreSuggestions":"Meer voorstelle","opera_title":"Nie ondersteun deur Opera nie","options":"Opsies","optionsTab":"Opsies","title":"Speltoets terwyl u tik","toggle":"SCAYT wissel aan/af","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Opmaak style","panelTitle1":"Blok style","panelTitle2":"Inlyn style","panelTitle3":"Objek style"},"table":{"border":"Randbreedte","caption":"Naam","cell":{"menu":"Sel","insertBefore":"Voeg sel in voor","insertAfter":"Voeg sel in na","deleteCell":"Verwyder sel","merge":"Voeg selle saam","mergeRight":"Voeg saam na regs","mergeDown":"Voeg saam ondertoe","splitHorizontal":"Splits sel horisontaal","splitVertical":"Splits sel vertikaal","title":"Sel eienskappe","cellType":"Sel tipe","rowSpan":"Omspan rye","colSpan":"Omspan kolomme","wordWrap":"Woord terugloop","hAlign":"Horisontale oplyning","vAlign":"Vertikale oplyning","alignBaseline":"Basislyn","bgColor":"Agtergrondkleur","borderColor":"Randkleur","data":"Inhoud","header":"Opskrif","yes":"Ja","no":"Nee","invalidWidth":"Selbreedte moet 'n getal wees.","invalidHeight":"Selhoogte moet 'n getal wees.","invalidRowSpan":"Omspan rye moet 'n heelgetal wees.","invalidColSpan":"Omspan kolomme moet 'n heelgetal wees.","chooseColor":"Kies"},"cellPad":"Sel-spasie","cellSpace":"Sel-afstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Verwyder kolom"},"columns":"Kolomme","deleteTable":"Verwyder tabel","headers":"Opskrifte","headersBoth":"Beide ","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste ry","invalidBorder":"Randbreedte moet 'n getal wees.","invalidCellPadding":"Sel-spasie moet 'n getal wees.","invalidCellSpacing":"Sel-afstand moet 'n getal wees.","invalidCols":"Aantal kolomme moet 'n getal groter as 0 wees.","invalidHeight":"Tabelhoogte moet 'n getal wees.","invalidRows":"Aantal rye moet 'n getal groter as 0 wees.","invalidWidth":"Tabelbreedte moet 'n getal wees.","menu":"Tabel eienskappe","row":{"menu":"Ry","insertBefore":"Voeg ry in voor","insertAfter":"Voeg ry in na","deleteRow":"Verwyder ry"},"rows":"Rye","summary":"Opsomming","title":"Tabel eienskappe","toolbar":"Tabel","widthPc":"persent","widthPx":"piksels","widthUnit":"breedte-eenheid"},"undo":{"redo":"Oordoen","undo":"Ontdoen"},"wsc":{"btnIgnore":"Ignoreer","btnIgnoreAll":"Ignoreer alles","btnReplace":"Vervang","btnReplaceAll":"vervang alles","btnUndo":"Ontdoen","changeTo":"Verander na","errorLoading":"Fout by inlaai van diens: %s.","ieSpellDownload":"Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?","manyChanges":"Klaar met speltoets: %1 woorde verander","noChanges":"Klaar met speltoets: Geen woorde verander nie","noMispell":"Klaar met speltoets: Geen foute nie","noSuggestions":"- Geen voorstel -","notAvailable":"Jammer, hierdie diens is nie nou beskikbaar nie.","notInDic":"Nie in woordeboek nie","oneChange":"Klaar met speltoets: Een woord verander","progress":"Spelling word getoets...","title":"Speltoetser","toolbar":"Speltoets"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ar.js b/mod/ckeditor/vendors/ckeditor/lang/ar.js
new file mode 100644
index 000000000..a31671889
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ar.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ar']={"dir":"rtl","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"ØªØµÙØ­","url":"الرابط","protocol":"البروتوكول","upload":"Ø±ÙØ¹","uploadSubmit":"أرسل","image":"صورة","flash":"Ùلاش","form":"نموذج","checkbox":"خانة إختيار","radio":"زر اختيار","textField":"مربع نص","textarea":"مساحة نصية","hiddenField":"إدراج حقل Ø®ÙÙŠ","button":"زر ضغط","select":"اختار","imageButton":"زر صورة","notSet":"<بدون تحديد>","id":"الرقم","name":"الاسم","langDir":"إتجاه النص","langDirLtr":"اليسار لليمين (LTR)","langDirRtl":"اليمين لليسار (RTL)","langCode":"رمز اللغة","longDescr":"Ø§Ù„ÙˆØµÙ Ø§Ù„ØªÙØµÙŠÙ„Ù‰","cssClass":"ÙØ¦Ø§Øª التنسيق","advisoryTitle":"عنوان التقرير","cssStyle":"نمط","ok":"مواÙÙ‚","cancel":"إلغاء الأمر","close":"أغلق","preview":"استعراض","resize":"اسحب لتغيير الحجم","generalTab":"عام","advancedTab":"متقدم","validateNumberFailed":"لايوجد نتيجة","confirmNewPage":"ستÙقد أي متغييرات اذا لم تقم Ø¨Ø­ÙØ¸Ù‡Ø§ اولا. هل أنت متأكد أنك تريد ØµÙØ­Ø© جديدة؟","confirmCancel":"بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟","options":"خيارات","target":"هد٠الرابط","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","styles":"نمط","cssClasses":"ÙØ¦Ø§Øª التنسيق","width":"العرض","height":"Ø§Ù„Ø¥Ø±ØªÙØ§Ø¹","align":"محاذاة","alignLeft":"يسار","alignRight":"يمين","alignCenter":"وسط","alignTop":"أعلى","alignMiddle":"وسط","alignBottom":"أسÙÙ„","invalidValue":"Invalid value.","invalidHeight":"Ø§Ù„Ø§Ø±ØªÙØ§Ø¹ يجب أن يكون عدداً.","invalidWidth":"العرض يجب أن يكون عدداً.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, غير متاح</span>"},"about":{"copy":"حقوق النشر &copy; $1. جميع الحقوق محÙوظة.","dlgTitle":"عن CKEditor","help":"Check $1 for help.","moreInfo":"للحصول على معلومات الترخيص ØŒ يرجى زيارة موقعنا على شبكة الانترنت:","title":"عن CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"غامق","italic":"مائل","strike":"يتوسطه خط","subscript":"Ù…Ù†Ø®ÙØ¶","superscript":"Ù…Ø±ØªÙØ¹","underline":"تسطير"},"blockquote":{"toolbar":"اقتباس"},"clipboard":{"copy":"نسخ","copyError":"الإعدادات الأمنية Ù„Ù„Ù…ØªØµÙØ­ الذي تستخدمه تمنع النسخ التلقائي. ÙØ¶Ù„اً إستخدم لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ù„ÙØ¹Ù„ ذلك (Ctrl/Cmd+C).","cut":"قص","cutError":"الإعدادات الأمنية Ù„Ù„Ù…ØªØµÙØ­ الذي تستخدمه تمنع القص التلقائي. ÙØ¶Ù„اً إستخدم لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ù„ÙØ¹Ù„ ذلك (Ctrl/Cmd+X).","paste":"لصق","pasteArea":"Paste Area","pasteMsg":"الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) ÙÙŠ لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ØŒ ثم اضغط زر <STRONG>مواÙÙ‚</STRONG>.","securityMsg":"نظراً لإعدادات الأمان الخاصة Ø¨Ù…ØªØµÙØ­ÙƒØŒ لن يتمكن هذا المحرر من الوصول لمحتوى Ø­Ø§ÙØ¸ØªÙƒØŒ لذلك يجب عليك لصق المحتوى مرة أخرى ÙÙŠ هذه Ø§Ù„Ù†Ø§ÙØ°Ø©.","title":"لصق"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"عنصر 1%"},"list":{"bulletedlist":"ادخال/حذ٠تعداد نقطي","numberedlist":"ادخال/حذ٠تعداد رقمي"},"indent":{"indent":"زيادة Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة","outdent":"إنقاص Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة"},"format":{"label":"تنسيق","panelTitle":"تنسيق الÙقرة","tag_address":"عنوان","tag_div":"عادي (DIV)","tag_h1":"العنوان 1","tag_h2":"العنوان 2","tag_h3":"العنوان 3","tag_h4":"العنوان 4","tag_h5":"العنوان 5","tag_h6":"العنوان 6","tag_p":"عادي","tag_pre":"منسّق"},"horizontalrule":{"toolbar":"خط ÙØ§ØµÙ„"},"image":{"alertUrl":"ÙØ¶Ù„اً أكتب الموقع الذي توجد عليه هذه الصورة.","alt":"عنوان الصورة","border":"سمك الحدود","btnUpload":"أرسلها للخادم","button2Img":"هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟","hSpace":"تباعد Ø£Ùقي","img2Button":"هل تريد تحويل الصورة المختارة إلى زر صورة؟","infoTab":"معلومات الصورة","linkTab":"الرابط","lockRatio":"تناسق الحجم","menu":"خصائص الصورة","resetSize":"إستعادة الحجم الأصلي","title":"خصائص الصورة","titleButton":"خصائص زر الصورة","upload":"Ø±ÙØ¹","urlMissing":"عنوان مصدر الصورة Ù…Ùقود","vSpace":"تباعد عمودي","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"إرساء","flash":"رسم متحرك بالÙلاش","hiddenfield":"إدراج حقل Ø®ÙÙŠ","iframe":"IFrame","unknown":"كائن غير معروÙ"},"link":{"acccessKey":"Ù…ÙØ§ØªÙŠØ­ الإختصار","advanced":"متقدم","advisoryContentType":"نوع التقرير","advisoryTitle":"عنوان التقرير","anchor":{"toolbar":"إشارة مرجعية","menu":"تحرير الإشارة المرجعية","title":"خصائص الإشارة المرجعية","name":"اسم الإشارة المرجعية","errorName":"الرجاء كتابة اسم الإشارة المرجعية","remove":"Remove Anchor"},"anchorId":"حسب رقم العنصر","anchorName":"حسب الاسم","charset":"ترميز المادة المطلوبة","cssClasses":"ÙØ¦Ø§Øª التنسيق","emailAddress":"عنوان البريد إلكتروني","emailBody":"محتوى الرسالة","emailSubject":"موضوع الرسالة","id":"هوية","info":"معلومات الرابط","langCode":"كود النص","langDir":"إتجاه النص","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","menu":"تحرير رابط","name":"الاسم","noAnchors":"(لا توجد علامات مرجعية ÙÙŠ هذا المستند)","noEmail":"من ÙØ¶Ù„Ùƒ أدخل عنوان البريد الإلكتروني","noUrl":"من ÙØ¶Ù„Ùƒ أدخل عنوان الموقع الذي يشير إليه الرابط","other":"<أخرى>","popupDependent":"تابع (Netscape)","popupFeatures":"خصائص Ø§Ù„Ù†Ø§ÙØ°Ø© المنبثقة","popupFullScreen":"ملئ الشاشة (IE)","popupLeft":"التمركز لليسار","popupLocationBar":"شريط العنوان","popupMenuBar":"القوائم الرئيسية","popupResizable":"قابلة التشكيل","popupScrollBars":"أشرطة التمرير","popupStatusBar":"شريط الحالة","popupToolbar":"شريط الأدوات","popupTop":"التمركز للأعلى","rel":"Relationship","selectAnchor":"اختر علامة مرجعية","styles":"نمط","tabIndex":"الترتيب","target":"هد٠الرابط","targetFrame":"<إطار>","targetFrameName":"اسم الإطار المستهدÙ","targetPopup":"<Ù†Ø§ÙØ°Ø© منبثقة>","targetPopupName":"اسم Ø§Ù„Ù†Ø§ÙØ°Ø© المنبثقة","title":"إرتباط تشعبي","toAnchor":"مكان ÙÙŠ هذا المستند","toEmail":"بريد إلكتروني","toUrl":"الرابط","toolbar":"رابط","type":"نوع الربط","unlink":"إزالة رابط","upload":"Ø±ÙØ¹"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"تكبير","minimize":"تصغير"},"pastetext":{"button":"لصق كنص بسيط","title":"لصق كنص بسيط"},"pastefromword":{"confirmCleanup":"يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيÙÙ‡ قبل الشروع ÙÙŠ عملية اللصق؟","error":"It was not possible to clean up the pasted data due to an internal error","title":"لصق من وورد","toolbar":"لصق من وورد"},"removeformat":{"toolbar":"إزالة التنسيقات"},"sourcearea":{"toolbar":"المصدر"},"specialchar":{"options":"Special Character Options","title":"اختر الخواص","toolbar":"إدراج خاص.Ù"},"scayt":{"about":"عن SCAYT","aboutTab":"عن","addWord":"Ø¥Ø¶Ø§ÙØ© كلمة","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"قواميس","disable":"تعطيل SCAYT","emptyDic":"اسم القاموس يجب ألا يكون ÙØ§Ø±ØºØ§Ù‹.","enable":"ØªÙØ¹ÙŠÙ„ SCAYT","ignore":"تجاهل","ignoreAll":"تجاهل الكل","ignoreDomainNames":"Ignore Domain Names","langs":"لغات","languagesTab":"لغات","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"المزيد من المقترحات","opera_title":"Not supported by Opera","options":"خيارات","optionsTab":"خيارات","title":"تدقيق إملائي أثناء الكتابة","toggle":"تثبيت SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"أنماط","panelTitle":"Formatting Styles","panelTitle1":"أنماط الÙقرة","panelTitle2":"أنماط مضمنة","panelTitle3":"أنماط الكائن"},"table":{"border":"الحدود","caption":"الوصÙ","cell":{"menu":"خلية","insertBefore":"إدراج خلية قبل","insertAfter":"إدراج خلية بعد","deleteCell":"حذ٠خلية","merge":"دمج خلايا","mergeRight":"دمج لليمين","mergeDown":"دمج للأسÙÙ„","splitHorizontal":"تقسيم الخلية Ø£Ùقياً","splitVertical":"تقسيم الخلية عمودياً","title":"خصائص الخلية","cellType":"نوع الخلية","rowSpan":"امتداد الصÙÙˆÙ","colSpan":"امتداد الأعمدة","wordWrap":"Ø§Ù„ØªÙØ§Ù النص","hAlign":"محاذاة Ø£Ùقية","vAlign":"محاذاة رأسية","alignBaseline":"خط القاعدة","bgColor":"لون الخلÙية","borderColor":"لون الحدود","data":"بيانات","header":"عنوان","yes":"نعم","no":"لا","invalidWidth":"عرض الخلية يجب أن يكون عدداً.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ الخلية يجب أن يكون عدداً.","invalidRowSpan":"امتداد الصÙو٠يجب أن يكون عدداً صحيحاً.","invalidColSpan":"امتداد الأعمدة يجب أن يكون عدداً صحيحاً.","chooseColor":"اختر"},"cellPad":"Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة","cellSpace":"تباعد الخلايا","column":{"menu":"عمود","insertBefore":"إدراج عمود قبل","insertAfter":"إدراج عمود بعد","deleteColumn":"حذ٠أعمدة"},"columns":"أعمدة","deleteTable":"حذ٠الجدول","headers":"العناوين","headersBoth":"كلاهما","headersColumn":"العمود الأول","headersNone":"بدون","headersRow":"الص٠الأول","invalidBorder":"حجم الحد يجب أن يكون عدداً.","invalidCellPadding":"Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة يجب أن تكون عدداً","invalidCellSpacing":"Ø§Ù„Ù…Ø³Ø§ÙØ© بين الخلايا يجب أن تكون عدداً.","invalidCols":"عدد الأعمدة يجب أن يكون عدداً أكبر من ØµÙØ±.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ الجدول يجب أن يكون عدداً.","invalidRows":"عدد الصÙو٠يجب أن يكون عدداً أكبر من ØµÙØ±.","invalidWidth":"عرض الجدول يجب أن يكون عدداً.","menu":"خصائص الجدول","row":{"menu":"صÙ","insertBefore":"إدراج ص٠قبل","insertAfter":"إدراج ص٠بعد","deleteRow":"حذ٠صÙÙˆÙ"},"rows":"صÙÙˆÙ","summary":"الخلاصة","title":"خصائص الجدول","toolbar":"جدول","widthPc":"بالمئة","widthPx":"بكسل","widthUnit":"width unit"},"undo":{"redo":"إعادة","undo":"تراجع"},"wsc":{"btnIgnore":"تجاهل","btnIgnoreAll":"تجاهل الكل","btnReplace":"تغيير","btnReplaceAll":"تغيير الكل","btnUndo":"تراجع","changeTo":"التغيير إلى","errorLoading":"خطأ ÙÙŠ تحميل تطبيق خدمة Ø§Ù„Ø§Ø³ØªØ¶Ø§ÙØ©: %s.","ieSpellDownload":"المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟","manyChanges":"تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات","noChanges":"تم التدقيق الإملائي: لم يتم تغيير أي كلمة","noMispell":"تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية","noSuggestions":"- لا توجد إقتراحات -","notAvailable":"عÙواً، ولكن هذه الخدمة غير متاحة الان","notInDic":"ليست ÙÙŠ القاموس","oneChange":"تم التدقيق الإملائي: تم تغيير كلمة واحدة Ùقط","progress":"جاري التدقيق الاملائى","title":"التدقيق الإملائي","toolbar":"تدقيق إملائي"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/bg.js b/mod/ckeditor/vendors/ckeditor/lang/bg.js
new file mode 100644
index 000000000..c1682a2f7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/bg.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bg']={"dir":"ltr","editor":"ТекÑтов редактор за форматиран текÑÑ‚","common":{"editorHelp":"натиÑнете ALT 0 за помощ","browseServer":"Избор от Ñървъра","url":"URL","protocol":"Протокол","upload":"Качване","uploadSubmit":"Изпращане към Ñървъра","image":"Снимка","flash":"Флаш","form":"Форма","checkbox":"Поле за избор","radio":"Радио бутон","textField":"ТекÑтово поле","textarea":"ТекÑтова зона","hiddenField":"Скрито поле","button":"Бутон","select":"Поле за избор","imageButton":"Бутон за Ñнимка","notSet":"<не е избрано>","id":"ID","name":"Име","langDir":"ПоÑока на езика","langDirLtr":"ЛÑво на дÑÑно (ЛнД)","langDirRtl":"ДÑÑно на лÑво (ДнЛ)","langCode":"Код на езика","longDescr":"Уеб Ð°Ð´Ñ€ÐµÑ Ð·Ð° дълго опиÑание","cssClass":"КлаÑове за CSS","advisoryTitle":"Препоръчително заглавие","cssStyle":"Стил","ok":"ОК","cancel":"Отказ","close":"Затвори","preview":"Преглед","resize":"Влачете за да оразмерите","generalTab":"Общо","advancedTab":"Разширено","validateNumberFailed":"Тази ÑтойноÑÑ‚ не е чиÑло","confirmNewPage":"Ð’Ñички незапазени промени ще бъдат изгубени. Сигурни ли Ñте, че желаете да заредите нова Ñтраница?","confirmCancel":"ÐÑкои от опциите Ñа променени. Сигурни ли Ñте, че желаете да затворите прозореца?","options":"Опции","target":"Цел","targetNew":"Ðов прозорец (_blank)","targetTop":"Горна Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ (_top)","targetSelf":"Ð¢ÐµÐºÑƒÑ‰Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† (_self)","targetParent":"ОÑновен прозорец (_parent)","langDirLTR":"ЛÑво на дÑÑно (ЛнД)","langDirRTL":"ДÑÑно на лÑво (ДнЛ)","styles":"Стил","cssClasses":"КлаÑове за CSS","width":"Ширина","height":"ВиÑочина","align":"ПодравнÑване","alignLeft":"ЛÑво","alignRight":"ДÑÑно","alignCenter":"Център","alignTop":"Горе","alignMiddle":"По Ñредата","alignBottom":"Долу","invalidValue":"Ðевалидна ÑтойноÑÑ‚.","invalidHeight":"ВиÑочината трÑбва да е чиÑло.","invalidWidth":"Ширина требе да е чиÑло.","invalidCssLength":"СтойноÑтта на полето \"%1\" трÑбва да бъде положително чиÑло Ñ Ð¸Ð»Ð¸ без валидна CSS измервателна единица (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"СтойноÑтта на полето \"%1\" трÑбва да бъде положително чиÑло Ñ Ð¸Ð»Ð¸ без валидна HTML измервателна единица (px or %).","invalidInlineStyle":"СтойноÑтта на Ñтилa трÑбва да Ñъдържат една или повече двойки във формат \"name : value\", разделени Ñ Ð´Ð²Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸Ðµ.","cssLengthTooltip":"Въведете чиÑлена ÑтойноÑÑ‚ в пикÑели или друга валидна CSS единица (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, недоÑтъпно</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"ОтноÑно CKEditor","help":"Проверете $1 за помощ.","moreInfo":"За лицензионна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð»Ñ Ð¿Ð¾Ñетете Ñайта ни:","title":"ОтноÑно CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Удебелен","italic":"Ðаклонен","strike":"Зачертан текÑÑ‚","subscript":"ИндекÑиран текÑÑ‚","superscript":"СуперÑкрипт","underline":"Подчертан"},"blockquote":{"toolbar":"Блок за цитат"},"clipboard":{"copy":"Копирай","copyError":"ÐаÑтройките за ÑигурноÑÑ‚ на Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°Ð·ÑƒÑŠÑ€ не разрешават на редактора да изпълни запаметÑването. За целта използвайте клавиатурата (Ctrl/Cmd+C).","cut":"Отрежи","cutError":"ÐаÑтройките за ÑигурноÑÑ‚ на Ð’Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ не позволÑват на редактора автоматично да изъплни дейÑтвиÑта за отрÑзване. ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ‚Ðµ клавиатурните команди за целта (ctrl+x).","paste":"Вмъкни","pasteArea":"Paste Area","pasteMsg":"Вмъкнете тук Ñъдъжанието Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÐ°Ñ€Ð°Ñ‚Ð° (<STRONG>Ctrl/Cmd+V</STRONG>) и натиÑнете <STRONG>OK</STRONG>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Вмъкни"},"contextmenu":{"options":"Опции на контекÑтното меню"},"toolbar":{"toolbarCollapse":"Свиване на лентата Ñ Ð¸Ð½Ñтрументи","toolbarExpand":"РазширÑване на лентата Ñ Ð¸Ð½Ñтрументи","toolbarGroups":{"document":"Документ","clipboard":"Clipboard/Undo","editing":"ПромÑна","forms":"Форми","basicstyles":"Базови Ñтилове","paragraph":"Параграф","links":"Връзки","insert":"Вмъкване","styles":"Стилове","colors":"Цветове","tools":"ИнÑтрументи"},"toolbars":"Ленти Ñ Ð¸Ð½Ñтрументи"},"elementspath":{"eleLabel":"Път за елементите","eleTitle":"%1 елемент"},"list":{"bulletedlist":"Вмъкване/Премахване на точков ÑпиÑък","numberedlist":"Вмъкване/Премахване на номериран ÑпиÑък"},"indent":{"indent":"Увеличаване на отÑтъпа","outdent":"ÐамалÑване на отÑтъпа"},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"ÐдреÑ","tag_div":"Параграф (DIV)","tag_h1":"Заглавие 1","tag_h2":"Заглавие 2","tag_h3":"Заглавие 3","tag_h4":"Заглавие 4","tag_h5":"Заглавие 5","tag_h6":"Заглавие 6","tag_p":"Ðормален","tag_pre":"Форматиран"},"horizontalrule":{"toolbar":"Вмъкване на хоризонтална линиÑ"},"image":{"alertUrl":"МолÑ, въведете Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð¿ÑŠÑ‚ до изображението","alt":"Ðлтернативен текÑÑ‚","border":"Рамка","btnUpload":"Изпрати Ñ Ð½Ð° Ñървъра","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хоризонтален отÑтъп","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Инфо за Ñнимка","linkTab":"Връзка","lockRatio":"Заключване на Ñъотношението","menu":"ÐаÑтройки за Ñнимка","resetSize":"Ðулиране на размер","title":"ÐаÑтройки за Ñнимка","titleButton":"ÐаÑтойки за бутон за Ñнимка","upload":"Качване","urlMissing":"Image source URL is missing.","vSpace":"Вертикален отÑтъп","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Кука","flash":"Флаш анимациÑ","hiddenfield":"Скрито поле","iframe":"IFrame","unknown":"ÐеизвеÑтен обект"},"link":{"acccessKey":"Ключ за доÑтъп","advanced":"Разширено","advisoryContentType":"Препоръчителен тип на Ñъдържанието","advisoryTitle":"Препоръчително заглавие","anchor":{"toolbar":"Котва","menu":"ПромÑна на котва","title":"ÐаÑтройки на котва","name":"Име на котва","errorName":"ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ име на котвата","remove":"Премахване на котва"},"anchorId":"По ID на елемент","anchorName":"По име на котва","charset":"Тип на ÑÐ²ÑŠÑ€Ð·Ð°Ð½Ð¸Ñ Ñ€ÐµÑурÑ","cssClasses":"КлаÑове за CSS","emailAddress":"E-mail aдреÑ","emailBody":"Съдържание","emailSubject":"Тема","id":"ID","info":"Инфо за връзката","langCode":"Код за езика","langDir":"ПоÑока на езика","langDirLTR":"ЛÑво на ДÑÑно (ЛнД)","langDirRTL":"ДÑÑно на ЛÑво (ДнЛ)","menu":"ПромÑна на връзка","name":"Име","noAnchors":"(ÐÑма котви в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚)","noEmail":"ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ e-mail aдреÑ","noUrl":"ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ URL адреÑа","other":"<друго>","popupDependent":"ЗавиÑимоÑÑ‚ (Netscape)","popupFeatures":"Функции на изкачащ прозорец","popupFullScreen":"ЦÑл екран (IE)","popupLeft":"ЛÑва позициÑ","popupLocationBar":"Лента Ñ Ð»Ð¾ÐºÐ°Ñ†Ð¸Ñта","popupMenuBar":"Лента за меню","popupResizable":"ОразмерÑем","popupScrollBars":"Скролери","popupStatusBar":"СтатуÑна лента","popupToolbar":"Лента Ñ Ð¸Ð½Ñтрументи","popupTop":"Горна позициÑ","rel":"Връзка","selectAnchor":"Изберете котва","styles":"Стил","tabIndex":"Ред на доÑтъп","target":"Цел","targetFrame":"<frame>","targetFrameName":"Име на целевиÑÑ‚ прозорец","targetPopup":"<изкачащ прозорец>","targetPopupName":"Име на изкачащ прозорец","title":"Връзка","toAnchor":"Връзка към котва в текÑта","toEmail":"E-mail","toUrl":"Уеб адреÑ","toolbar":"Връзка","type":"Тип на връзката","unlink":"Премахни връзката","upload":"Качване"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"МакÑимизиране","minimize":"Минимизиране"},"pastetext":{"button":"Вмъкни като чиÑÑ‚ текÑÑ‚","title":"Вмъкни като чиÑÑ‚ текÑÑ‚"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Вмъкни от MS Word","toolbar":"Вмъкни от MS Word"},"removeformat":{"toolbar":"Премахване на форматирането"},"sourcearea":{"toolbar":"Източник"},"specialchar":{"options":"Опции за Ñпециален знак","title":"Избор на Ñпециален знак","toolbar":"Вмъкване на Ñпециален знак"},"scayt":{"about":"About SCAYT","aboutTab":"ОтноÑно","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Ðов","dic_delete":"Изтриване","dic_field_name":"Име на речнк","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Преименуване","dic_restore":"ВъзтановÑване","dictionariesTab":"Речници","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Езици","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Игнорирани думи и цифри","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стилове","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Размер на рамката","caption":"Заглавие","cell":{"menu":"Клетка","insertBefore":"Вмъкване на клетка преди","insertAfter":"Вмъкване на клетка Ñлед","deleteCell":"Изтриване на клетки","merge":"Сливане на клетки","mergeRight":"Сливане в дÑÑно","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"ÐаÑтройки на клетката","cellType":"Тип на клетката","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Ðвто. преноÑ","hAlign":"Хоризонтално подравнÑване","vAlign":"Вертикално подравнÑване","alignBaseline":"Базова линиÑ","bgColor":"Фон","borderColor":"ЦвÑÑ‚ на рамката","data":"Данни","header":"Хедър","yes":"Да","no":"Ðе","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Изберете"},"cellPad":"ОтделÑне на клетките","cellSpace":"РазтоÑние между клетките","column":{"menu":"Колона","insertBefore":"Вмъкване на колона преди","insertAfter":"Вмъкване на колона Ñлед","deleteColumn":"Изтриване на колони"},"columns":"Колони","deleteTable":"Изтриване на таблица","headers":"Хедъри","headersBoth":"Заедно","headersColumn":"Първа колона","headersNone":"ÐÑма","headersRow":"Първи ред","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"БроÑÑ‚ колони трÑбва да е по-голÑм от 0.","invalidHeight":"Table height must be a number.","invalidRows":"БроÑÑ‚ редове трÑбва да е по-голÑм от 0.","invalidWidth":"Table width must be a number.","menu":"ÐаÑтройки на таблицата","row":{"menu":"Ред","insertBefore":"Insert Row Before","insertAfter":"Вмъкване на ред Ñлед","deleteRow":"Изтриване на редове"},"rows":"Редове","summary":"Обща информациÑ","title":"ÐаÑтройки на таблицата","toolbar":"Таблица","widthPc":"процент","widthPx":"пикÑела","widthUnit":"единица за ширина"},"undo":{"redo":"Връщане на предишен ÑтатуÑ","undo":"Възтанови"},"wsc":{"btnIgnore":"Игнорирай","btnIgnoreAll":"Игнорирай вÑичко","btnReplace":"Препокриване","btnReplaceAll":"Препокрий вÑичко","btnUndo":"Възтанови","changeTo":"Промени на","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- ÐÑма препоръчани -","notAvailable":"СъжалÑваме, но уÑлугата не е доÑтъпна за момента","notInDic":"Ðе е в речника","oneChange":"Spell check complete: One word changed","progress":"ПроверÑва Ñе правопиÑа...","title":"Проверка на правопиÑ","toolbar":"Проверка на правопиÑ"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/bn.js b/mod/ckeditor/vendors/ckeditor/lang/bn.js
new file mode 100644
index 000000000..c47e9a1dd
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/bn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bn']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"বà§à¦°à¦¾à¦‰à¦œ সারà§à¦­à¦¾à¦°","url":"URL","protocol":"পà§à¦°à§‹à¦Ÿà§‹à¦•ল","upload":"আপলোড","uploadSubmit":"ইহাকে সারà§à¦­à¦¾à¦°à§‡ পà§à¦°à§‡à¦°à¦¨ কর","image":"ছবির লেবেল যà§à¦•à§à¦¤ কর","flash":"ফà§à¦²à¦¾à¦¶ লেবেল যà§à¦•à§à¦¤ কর","form":"ফরà§à¦®","checkbox":"চেক বাকà§à¦¸","radio":"রেডিও বাটন","textField":"টেকà§à¦¸à¦Ÿ ফীলà§à¦¡","textarea":"টেকà§à¦¸à¦Ÿ à¦à¦°à¦¿à§Ÿà¦¾","hiddenField":"গà§à¦ªà§à¦¤ ফীলà§à¦¡","button":"বাটন","select":"বাছাই ফীলà§à¦¡","imageButton":"ছবির বাটন","notSet":"<সেট নেই>","id":"আইডি","name":"নাম","langDir":"ভাষা লেখার দিক","langDirLtr":"বাম থেকে ডান (LTR)","langDirRtl":"ডান থেকে বাম (RTL)","langCode":"ভাষা কোড","longDescr":"URL à¦à¦° লমà§à¦¬à¦¾ বরà§à¦£à¦¨à¦¾","cssClass":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","advisoryTitle":"পরামরà§à¦¶ শীরà§à¦·à¦•","cssStyle":"সà§à¦Ÿà¦¾à¦‡à¦²","ok":"ওকে","cancel":"বাতিল","close":"Close","preview":"পà§à¦°à¦¿à¦­à¦¿à¦‰","resize":"Resize","generalTab":"General","advancedTab":"à¦à¦¡à¦­à¦¾à¦¨à§à¦¸à¦¡","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"টারà§à¦—েট","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","styles":"সà§à¦Ÿà¦¾à¦‡à¦²","cssClasses":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","width":"পà§à¦°à¦¸à§à¦¥","height":"দৈরà§à¦˜à§à¦¯","align":"à¦à¦²à¦¾à¦‡à¦¨","alignLeft":"বামে","alignRight":"ডানে","alignCenter":"মাà¦à¦–ানে","alignTop":"উপর","alignMiddle":"মধà§à¦¯","alignBottom":"নীচে","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"বোলà§à¦¡","italic":"ইটালিক","strike":"সà§à¦Ÿà§à¦°à¦¾à¦‡à¦• থà§à¦°à§","subscript":"অধোলেখ","superscript":"অভিলেখ","underline":"আনà§à¦¡à¦¾à¦°à¦²à¦¾à¦‡à¦¨"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"কপি","copyError":"আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•ে অটোমেটিক কপি করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl/Cmd+C)।","cut":"কাট","cutError":"আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•ে অটোমেটিক কাট করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl/Cmd+X)।","paste":"পেসà§à¦Ÿ","pasteArea":"Paste Area","pasteMsg":"অনà§à¦—à§à¦°à¦¹ করে নীচের বাকà§à¦¸à§‡ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেসà§à¦Ÿ করà§à¦¨ à¦à¦¬à¦‚ <STRONG>OK</STRONG> চাপ দিন","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"পেসà§à¦Ÿ"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"বà§à¦²à§‡à¦Ÿ লিসà§à¦Ÿ লেবেল","numberedlist":"সাংখà§à¦¯à¦¿à¦• লিসà§à¦Ÿà§‡à¦° লেবেল"},"indent":{"indent":"ইনডেনà§à¦Ÿ বাড়াও","outdent":"ইনডেনà§à¦Ÿ কমাও"},"format":{"label":"ফনà§à¦Ÿ ফরমেট","panelTitle":"ফনà§à¦Ÿ ফরমেট","tag_address":"ঠিকানা","tag_div":"শীরà§à¦·à¦• (DIV)","tag_h1":"শীরà§à¦·à¦• à§§","tag_h2":"শীরà§à¦·à¦• ২","tag_h3":"শীরà§à¦·à¦• à§©","tag_h4":"শীরà§à¦·à¦• ৪","tag_h5":"শীরà§à¦·à¦• à§«","tag_h6":"শীরà§à¦·à¦• ৬","tag_p":"সাধারণ","tag_pre":"ফরà§à¦®à§‡à¦Ÿà§‡à¦¡"},"horizontalrule":{"toolbar":"রেখা যà§à¦•à§à¦¤ কর"},"image":{"alertUrl":"অনà§à¦—à§à¦°à¦¹à¦• করে ছবির URL টাইপ করà§à¦¨","alt":"বিকলà§à¦ª টেকà§à¦¸à¦Ÿ","border":"বরà§à¦¡à¦¾à¦°","btnUpload":"ইহাকে সারà§à¦­à¦¾à¦°à§‡ পà§à¦°à§‡à¦°à¦¨ কর","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"হরাইজনà§à¦Ÿà¦¾à¦² সà§à¦ªà§‡à¦¸","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ছবির তথà§à¦¯","linkTab":"লিংক","lockRatio":"অনà§à¦ªà¦¾à¦¤ লক কর","menu":"ছবির পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","resetSize":"সাইজ পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à§Ÿ ফিরিয়ে দাও","title":"ছবির পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","titleButton":"ছবি বাটন পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","upload":"আপলোড","urlMissing":"Image source URL is missing.","vSpace":"ভারà§à¦Ÿà¦¿à¦•েল সà§à¦ªà§‡à¦¸","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"à¦à¦•à§à¦¸à§‡à¦¸ কী","advanced":"à¦à¦¡à¦­à¦¾à¦¨à§à¦¸à¦¡","advisoryContentType":"পরামরà§à¦¶ কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° পà§à¦°à¦•ার","advisoryTitle":"পরামরà§à¦¶ শীরà§à¦·à¦•","anchor":{"toolbar":"নোঙà§à¦—র","menu":"নোঙর পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","title":"নোঙর পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","name":"নোঙরের নাম","errorName":"নোঙরের নাম টাইপ করà§à¦¨","remove":"Remove Anchor"},"anchorId":"নোঙরের আইডি দিয়ে","anchorName":"নোঙরের নাম দিয়ে","charset":"লিংক রিসোরà§à¦¸ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦° সেট","cssClasses":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","emailAddress":"ইমেইল ঠিকানা","emailBody":"মেসেজের দেহ","emailSubject":"মেসেজের বিষয়","id":"আইডি","info":"লিংক তথà§à¦¯","langCode":"ভাষা লেখার দিক","langDir":"ভাষা লেখার দিক","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","menu":"লিংক সমà§à¦ªà¦¾à¦¦à¦¨","name":"নাম","noAnchors":"(No anchors available in the document)","noEmail":"অনà§à¦—à§à¦°à¦¹ করে ইমেইল à¦à¦¡à§à¦°à§‡à¦¸ টাইপ করà§à¦¨","noUrl":"অনà§à¦—à§à¦°à¦¹ করে URL লিংক টাইপ করà§à¦¨","other":"<other>","popupDependent":"ডিপেনà§à¦¡à§‡à¦¨à§à¦Ÿ (Netscape)","popupFeatures":"পপআপ উইনà§à¦¡à§‹ ফীচার সমূহ","popupFullScreen":"পূরà§à¦£ পরà§à¦¦à¦¾ জà§à§œà§‡ (IE)","popupLeft":"বামের পজিশন","popupLocationBar":"লোকেশন বার","popupMenuBar":"মেনà§à¦¯à§ বার","popupResizable":"Resizable","popupScrollBars":"সà§à¦•à§à¦°à¦² বার","popupStatusBar":"সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¾à¦¸ বার","popupToolbar":"টà§à¦² বার","popupTop":"ডানের পজিশন","rel":"Relationship","selectAnchor":"নোঙর বাছাই","styles":"সà§à¦Ÿà¦¾à¦‡à¦²","tabIndex":"টà§à¦¯à¦¾à¦¬ ইনà§à¦¡à§‡à¦•à§à¦¸","target":"টারà§à¦—েট","targetFrame":"<ফà§à¦°à§‡à¦®>","targetFrameName":"টারà§à¦—েট ফà§à¦°à§‡à¦®à§‡à¦° নাম","targetPopup":"<পপআপ উইনà§à¦¡à§‹>","targetPopupName":"পপআপ উইনà§à¦¡à§‹à¦° নাম","title":"লিংক","toAnchor":"à¦à¦‡ পেজে নোঙর কর","toEmail":"ইমেইল","toUrl":"URL","toolbar":"লিংক যà§à¦•à§à¦¤ কর","type":"লিংক পà§à¦°à¦•ার","unlink":"লিংক সরাও","upload":"আপলোড"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"সাদা টেকà§à¦¸à¦Ÿ হিসেবে পেসà§à¦Ÿ কর","title":"সাদা টেকà§à¦¸à¦Ÿ হিসেবে পেসà§à¦Ÿ কর"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"পেসà§à¦Ÿ (শবà§à¦¦)","toolbar":"পেসà§à¦Ÿ (শবà§à¦¦)"},"removeformat":{"toolbar":"ফরমেট সরাও"},"sourcearea":{"toolbar":"সোরà§à¦¸"},"specialchar":{"options":"Special Character Options","title":"বিশেষ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° বাছাই কর","toolbar":"বিশেষ অকà§à¦·à¦° যà§à¦•à§à¦¤ কর"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"সà§à¦Ÿà¦¾à¦‡à¦²","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"বরà§à¦¡à¦¾à¦° সাইজ","caption":"শীরà§à¦·à¦•","cell":{"menu":"সেল","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"সেল মà§à¦›à§‡ দাও","merge":"সেল জোড়া দাও","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"সেল পà§à¦¯à¦¾à¦¡à¦¿à¦‚","cellSpace":"সেল সà§à¦ªà§‡à¦¸","column":{"menu":"কলাম","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"কলাম মà§à¦›à§‡ দাও"},"columns":"কলাম","deleteTable":"টেবিল ডিলীট কর","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","row":{"menu":"রো","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"রো মà§à¦›à§‡ দাও"},"rows":"রো","summary":"সারাংশ","title":"টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","toolbar":"টেবিলের লেবেল যà§à¦•à§à¦¤ কর","widthPc":"শতকরা","widthPx":"পিকà§à¦¸à§‡à¦²","widthUnit":"width unit"},"undo":{"redo":"রি-ডà§","undo":"আনডà§"},"wsc":{"btnIgnore":"ইগনোর কর","btnIgnoreAll":"সব ইগনোর কর","btnReplace":"বদলে দাও","btnReplaceAll":"সব বদলে দাও","btnUndo":"আনà§à¦¡à§","changeTo":"à¦à¦¤à§‡ বদলাও","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"বানান পরীকà§à¦·à¦• ইনসà§à¦Ÿà¦² করা নেই। আপনি কি à¦à¦–নই à¦à¦Ÿà¦¾ ডাউনলোড করতে চান?","manyChanges":"বানান পরীকà§à¦·à¦¾ শেষ: %1 গà§à¦²à§‹ শবà§à¦¦ বদলে গà§à¦¯à¦¾à¦›à§‡","noChanges":"বানান পরীকà§à¦·à¦¾ শেষ: কোন শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়নি","noMispell":"বানান পরীকà§à¦·à¦¾ শেষ: কোন ভà§à¦² বানান পাওয়া যায়নি","noSuggestions":"- কোন সাজেশন নেই -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"শবà§à¦¦à¦•োষে নেই","oneChange":"বানান পরীকà§à¦·à¦¾ শেষ: à¦à¦•টি মাতà§à¦° শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়েছে","progress":"বানান পরীকà§à¦·à¦¾ চলছে...","title":"Spell Check","toolbar":"বানান চেক"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/bs.js b/mod/ckeditor/vendors/ckeditor/lang/bs.js
new file mode 100644
index 000000000..7f5791b35
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/bs.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bs']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Šalji","uploadSubmit":"Šalji na server","image":"Slika","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije podešeno>","id":"Id","name":"Naziv","langDir":"Smjer pisanja","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Jezièni kôd","longDescr":"Dugaèki opis URL-a","cssClass":"Klase CSS stilova","advisoryTitle":"Advisory title","cssStyle":"Stil","ok":"OK","cancel":"Odustani","close":"Close","preview":"Prikaži","resize":"Resize","generalTab":"General","advancedTab":"Naprednije","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Prozor","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase CSS stilova","width":"Širina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Centar","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dno","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Boldiraj","italic":"Ukosi","strike":"Precrtaj","subscript":"Subscript","superscript":"Superscript","underline":"Podvuci"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Zalijepi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Lista","numberedlist":"Numerisana lista"},"indent":{"indent":"Poveæaj uvod","outdent":"Smanji uvod"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Ubaci horizontalnu liniju"},"image":{"alertUrl":"Molimo ukucajte URL od slike.","alt":"Tekst na slici","border":"Okvir","btnUpload":"Šalji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zakljuèaj odnos","menu":"Svojstva slike","resetSize":"Resetuj dimenzije","title":"Svojstva slike","titleButton":"Image Button Properties","upload":"Šalji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupna tipka","advanced":"Naprednije","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Klase CSS stilova","emailAddress":"E-Mail Adresa","emailBody":"Poruka","emailSubject":"Subjekt poruke","id":"Id","info":"Link info","langCode":"Smjer pisanja","langDir":"Smjer pisanja","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Izmjeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra na stranici)","noEmail":"Molimo ukucajte e-mail adresu","noUrl":"Molimo ukucajte URL link","other":"<other>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Moguænosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Resizable","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka sa alatima","popupTop":"Gornja pozicija","rel":"Relationship","selectAnchor":"Izaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Prozor","targetFrame":"<frejm>","targetFrameName":"Target Frame Name","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/Izmjeni link","type":"Tip linka","unlink":"Izbriši link","upload":"Šalji"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalijepi kao obièan tekst","title":"Zalijepi kao obièan tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalijepi iz Word-a","toolbar":"Zalijepi iz Word-a"},"removeformat":{"toolbar":"Poništi format"},"sourcearea":{"toolbar":"HTML kôd"},"specialchar":{"options":"Special Character Options","title":"Izaberi specijalni karakter","toolbar":"Ubaci specijalni karater"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Okvir","caption":"Naslov","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Briši æelije","merge":"Spoji æelije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Uvod æelija","cellSpace":"Razmak æelija","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Briši kolone"},"columns":"Kolona","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Svojstva tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Briši redove"},"rows":"Redova","summary":"Summary","title":"Svojstva tabele","toolbar":"Tabela","widthPc":"posto","widthPx":"piksela","widthUnit":"width unit"},"undo":{"redo":"Ponovi","undo":"Vrati"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ca.js b/mod/ckeditor/vendors/ckeditor/lang/ca.js
new file mode 100644
index 000000000..f4a37df5b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ca']={"dir":"ltr","editor":"Editor de text enriquit","common":{"editorHelp":"Premeu ALT 0 per ajuda","browseServer":"Veure servidor","url":"URL","protocol":"Protocol","upload":"Puja","uploadSubmit":"Envia-la al servidor","image":"Imatge","flash":"Flash","form":"Formulari","checkbox":"Casella de verificació","radio":"Botó d'opció","textField":"Camp de text","textarea":"Àrea de text","hiddenField":"Camp ocult","button":"Botó","select":"Camp de selecció","imageButton":"Botó d'imatge","notSet":"<no definit>","id":"Id","name":"Nom","langDir":"Direcció de l'idioma","langDirLtr":"D'esquerra a dreta (LTR)","langDirRtl":"De dreta a esquerra (RTL)","langCode":"Codi d'idioma","longDescr":"Descripció llarga de la URL","cssClass":"Classes del full d'estil","advisoryTitle":"Títol consultiu","cssStyle":"Estil","ok":"D'acord","cancel":"Cancel·la","close":"Tanca","preview":"Previsualitza","resize":"Arrossegueu per redimensionar","generalTab":"General","advancedTab":"Avançat","validateNumberFailed":"Aquest valor no és un número.","confirmNewPage":"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?","confirmCancel":"Algunes opcions s'han canviat. Esteu segur que voleu tancar la finestra de diàleg?","options":"Opcions","target":"Destí","targetNew":"Nova finestra (_blank)","targetTop":"Finestra major (_top)","targetSelf":"Mateixa finestra (_self)","targetParent":"Finestra pare (_parent)","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","styles":"Estil","cssClasses":"Classes del full d'estil","width":"Amplada","height":"Alçada","align":"Alineació","alignLeft":"Ajusta a l'esquerra","alignRight":"Ajusta a la dreta","alignCenter":"Centre","alignTop":"Superior","alignMiddle":"Centre","alignBottom":"Inferior","invalidValue":"Valor no vàlid.","invalidHeight":"L'alçada ha de ser un nombre.","invalidWidth":"L'amplada ha de ser un nombre.","invalidCssLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","invalidHtmlLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida d'HTML (px o %).","invalidInlineStyle":"El valor especificat per l'estil en línia ha de constar d'una o més tuples amb el format \"name: value\", separats per punt i coma.","cssLengthTooltip":"Introduïu un número per un valor en píxels o un número amb una unitat vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Tots els drets reservats.","dlgTitle":"Quant al CKEditor","help":"Premeu $1 per obtenir ajuda.","moreInfo":"Per informació sobre llicències visiteu el web:","title":"Quant al CKEditor","userGuide":"Manual d'usuari de CKEditor"},"basicstyles":{"bold":"Negreta","italic":"Cursiva","strike":"Barrat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat"},"blockquote":{"toolbar":"Bloc de cita"},"clipboard":{"copy":"Copia","copyError":"La seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl+C).","cut":"Retalla","cutError":"La seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl+X).","paste":"Enganxa","pasteArea":"Àrea d'enganxat","pasteMsg":"Si us plau, enganxeu dins del següent camp utilitzant el teclat (<STRONG>Ctrl+V</STRONG>) i premeu <STRONG>OK</STRONG>.","securityMsg":"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir al porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.","title":"Enganxa"},"contextmenu":{"options":"Opcions del menú contextual"},"toolbar":{"toolbarCollapse":"Redueix la barra d'eines","toolbarExpand":"Amplia la barra d'eines","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barra d'eines"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Llista de pics","numberedlist":"Llista numerada"},"indent":{"indent":"Augmenta el sagnat","outdent":"Redueix el sagnat"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adreça","tag_div":"Normal (DIV)","tag_h1":"Encapçalament 1","tag_h2":"Encapçalament 2","tag_h3":"Encapçalament 3","tag_h4":"Encapçalament 4","tag_h5":"Encapçalament 5","tag_h6":"Encapçalament 6","tag_p":"Normal","tag_pre":"Formatejat"},"horizontalrule":{"toolbar":"Insereix línia horitzontal"},"image":{"alertUrl":"Si us plau, escriviu la URL de la imatge","alt":"Text alternatiu","border":"Vora","btnUpload":"Envia-la al servidor","button2Img":"Voleu transformar el botó d'imatge seleccionat en una simple imatge?","hSpace":"Espaiat horit.","img2Button":"Voleu transformar la imatge seleccionada en un botó d'imatge?","infoTab":"Informació de la imatge","linkTab":"Enllaç","lockRatio":"Bloqueja les proporcions","menu":"Propietats de la imatge","resetSize":"Restaura la mida","title":"Propietats de la imatge","titleButton":"Propietats del botó d'imatge","upload":"Puja","urlMissing":"Falta la URL de la imatge.","vSpace":"Espaiat vert.","validateBorder":"La vora ha de ser un nombre enter.","validateHSpace":"HSpace ha de ser un nombre enter.","validateVSpace":"VSpace ha de ser un nombre enter."},"fakeobjects":{"anchor":"Àncora","flash":"Animació Flash","hiddenfield":"Camp ocult","iframe":"IFrame","unknown":"Objecte desconegut"},"link":{"acccessKey":"Clau d'accés","advanced":"Avançat","advisoryContentType":"Tipus de contingut consultiu","advisoryTitle":"Títol consultiu","anchor":{"toolbar":"Insereix/Edita àncora","menu":"Propietats de l'àncora","title":"Propietats de l'àncora","name":"Nom de l'àncora","errorName":"Si us plau, escriviu el nom de l'ancora","remove":"Remove Anchor"},"anchorId":"Per Id d'element","anchorName":"Per nom d'àncora","charset":"Conjunt de caràcters font enllaçat","cssClasses":"Classes del full d'estil","emailAddress":"Adreça de correu electrònic","emailBody":"Cos del missatge","emailSubject":"Assumpte del missatge","id":"Id","info":"Informació de l'enllaç","langCode":"Direcció de l'idioma","langDir":"Direcció de l'idioma","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","menu":"Edita l'enllaç","name":"Nom","noAnchors":"(No hi ha àncores disponibles en aquest document)","noEmail":"Si us plau, escrigui l'adreça correu electrònic","noUrl":"Si us plau, escrigui l'enllaç URL","other":"<altre>","popupDependent":"Depenent (Netscape)","popupFeatures":"Característiques finestra popup","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posició esquerra","popupLocationBar":"Barra d'adreça","popupMenuBar":"Barra de menú","popupResizable":"Redimensionable","popupScrollBars":"Barres d'scroll","popupStatusBar":"Barra d'estat","popupToolbar":"Barra d'eines","popupTop":"Posició dalt","rel":"Relació","selectAnchor":"Selecciona una àncora","styles":"Estil","tabIndex":"Index de Tab","target":"Destí","targetFrame":"<marc>","targetFrameName":"Nom del marc de destí","targetPopup":"<finestra emergent>","targetPopupName":"Nom finestra popup","title":"Enllaç","toAnchor":"Àncora en aquesta pàgina","toEmail":"Correu electrònic","toUrl":"URL","toolbar":"Insereix/Edita enllaç","type":"Tipus d'enllaç","unlink":"Elimina l'enllaç","upload":"Puja"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximitza","minimize":"Minimitza"},"pastetext":{"button":"Enganxa com a text no formatat","title":"Enganxa com a text no formatat"},"pastefromword":{"confirmCleanup":"El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?","error":"No ha estat possible netejar les dades enganxades degut a un error intern","title":"Enganxa des del Word","toolbar":"Enganxa des del Word"},"removeformat":{"toolbar":"Elimina Format"},"sourcearea":{"toolbar":"Codi font"},"specialchar":{"options":"Opcions de caràcters especials","title":"Selecciona el caràcter especial","toolbar":"Insereix caràcter especial"},"scayt":{"about":"Quant a l'SCAYT","aboutTab":"Quant a","addWord":"Afegeix una paraula","allCaps":"Ignora paraules en majúscules","dic_create":"Crea","dic_delete":"Elimina","dic_field_name":"Nom del diccionari","dic_info":"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.","dic_rename":"Canvia el nom","dic_restore":"Restaura","dictionariesTab":"Diccionaris","disable":"Deshabilita SCAYT","emptyDic":"El nom del diccionari no hauria d'estar buit.","enable":"Habilitat l'SCAYT","ignore":"Ignora","ignoreAll":"Ignora'ls tots","ignoreDomainNames":"Ignora els noms de domini","langs":"Idiomes","languagesTab":"Idiomes","mixedCase":"Ignora paraules amb majúscules i minúscules","mixedWithDigits":"Ignora paraules amb números ","moreSuggestions":"Més suggerències","opera_title":"No és compatible amb l'Opera","options":"Opcions","optionsTab":"Opcions","title":"Spell Check As You Type","toggle":"Commuta l'SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estil","panelTitle":"Estils de format","panelTitle1":"Estils de bloc","panelTitle2":"Estils incrustats","panelTitle3":"Estils d'objecte"},"table":{"border":"Mida vora","caption":"Títol","cell":{"menu":"Cel·la","insertBefore":"Insereix abans","insertAfter":"Insereix després","deleteCell":"Suprimeix","merge":"Fusiona","mergeRight":"Fusiona a la dreta","mergeDown":"Fusiona avall","splitHorizontal":"Divideix horitzontalment","splitVertical":"Divideix verticalment","title":"Propietats de la cel·la","cellType":"Tipus de cel·la","rowSpan":"Expansió de files","colSpan":"Expansió de columnes","wordWrap":"Ajustar al contingut","hAlign":"Alineació Horizontal","vAlign":"Alineació Vertical","alignBaseline":"A la línia base","bgColor":"Color de fons","borderColor":"Color de la vora","data":"Dades","header":"Capçalera","yes":"Sí","no":"No","invalidWidth":"L'amplada de cel·la ha de ser un nombre.","invalidHeight":"L'alçada de cel·la ha de ser un nombre.","invalidRowSpan":"L'expansió de files ha de ser un nombre enter.","invalidColSpan":"L'expansió de columnes ha de ser un nombre enter.","chooseColor":"Trieu"},"cellPad":"Encoixinament de cel·les","cellSpace":"Espaiat de cel·les","column":{"menu":"Columna","insertBefore":"Insereix columna abans de","insertAfter":"Insereix columna darrera","deleteColumn":"Suprimeix una columna"},"columns":"Columnes","deleteTable":"Suprimeix la taula","headers":"Capçaleres","headersBoth":"Ambdues","headersColumn":"Primera columna","headersNone":"Cap","headersRow":"Primera fila","invalidBorder":"El gruix de la vora ha de ser un nombre.","invalidCellPadding":"L'encoixinament de cel·la ha de ser un nombre.","invalidCellSpacing":"L'espaiat de cel·la ha de ser un nombre.","invalidCols":"El nombre de columnes ha de ser un nombre major que 0.","invalidHeight":"L'alçada de la taula ha de ser un nombre.","invalidRows":"El nombre de files ha de ser un nombre major que 0.","invalidWidth":"L'amplada de la taula ha de ser un nombre.","menu":"Propietats de la taula","row":{"menu":"Fila","insertBefore":"Insereix fila abans de","insertAfter":"Insereix fila darrera","deleteRow":"Suprimeix una fila"},"rows":"Files","summary":"Resum","title":"Propietats de la taula","toolbar":"Taula","widthPc":"percentatge","widthPx":"píxels","widthUnit":"unitat d'amplada"},"undo":{"redo":"Refés","undo":"Desfés"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora-les totes","btnReplace":"Canvia","btnReplaceAll":"Canvia-les totes","btnUndo":"Desfés","changeTo":"Reemplaça amb","errorLoading":"Error carregant el servidor: %s.","ieSpellDownload":"Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?","manyChanges":"Verificació ortogràfica: s'han canviat %1 paraules","noChanges":"Verificació ortogràfica: no s'ha canviat cap paraula","noMispell":"Verificació ortogràfica acabada: no hi ha cap paraula mal escrita","noSuggestions":"Cap suggeriment","notAvailable":"El servei no es troba disponible ara.","notInDic":"No és al diccionari","oneChange":"Verificació ortogràfica: s'ha canviat una paraula","progress":"Verificació ortogràfica en curs...","title":"Comprova l'ortografia","toolbar":"Revisa l'ortografia"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/cs.js b/mod/ckeditor/vendors/ckeditor/lang/cs.js
new file mode 100644
index 000000000..5697e4d95
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/cs.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cs']={"dir":"ltr","editor":"Textový editor","common":{"editorHelp":"StisknÄ›te ALT 0 pro nápovÄ›du","browseServer":"Vybrat na serveru","url":"URL","protocol":"Protokol","upload":"Odeslat","uploadSubmit":"Odeslat na server","image":"Obrázek","flash":"Flash","form":"Formulář","checkbox":"ZaÅ¡krtávací políÄko","radio":"PÅ™epínaÄ","textField":"Textové pole","textarea":"Textová oblast","hiddenField":"Skryté pole","button":"TlaÄítko","select":"Seznam","imageButton":"Obrázkové tlaÄítko","notSet":"<nenastaveno>","id":"Id","name":"Jméno","langDir":"SmÄ›r jazyka","langDirLtr":"Zleva doprava (LTR)","langDirRtl":"Zprava doleva (RTL)","langCode":"Kód jazyka","longDescr":"Dlouhý popis URL","cssClass":"Třída stylu","advisoryTitle":"Pomocný titulek","cssStyle":"Styl","ok":"OK","cancel":"ZruÅ¡it","close":"Zavřít","preview":"Náhled","resize":"Uchopit pro zmÄ›nu velikosti","generalTab":"Obecné","advancedTab":"Rozšířené","validateNumberFailed":"Zadaná hodnota není Äíselná.","confirmNewPage":"Jakékoliv neuložené zmÄ›ny obsahu budou ztraceny. SkuteÄnÄ› chcete otevřít novou stránku?","confirmCancel":"NÄ›která z nastavení byla zmÄ›nÄ›na. SkuteÄnÄ› chcete zavřít dialogové okno?","options":"Nastavení","target":"Cíl","targetNew":"Nové okno (_blank)","targetTop":"Okno nejvyšší úrovnÄ› (_top)","targetSelf":"Stejné okno (_self)","targetParent":"RodiÄovské okno (_parent)","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","styles":"Styly","cssClasses":"Třídy stylů","width":"Šířka","height":"Výška","align":"Zarovnání","alignLeft":"Vlevo","alignRight":"Vpravo","alignCenter":"Na stÅ™ed","alignTop":"Nahoru","alignMiddle":"Na stÅ™ed","alignBottom":"Dolů","invalidValue":"Neplatná hodnota.","invalidHeight":"Zadaná výška musí být Äíslo.","invalidWidth":"Šířka musí být Äíslo.","invalidCssLength":"Hodnota urÄená pro pole \"%1\" musí být kladné Äíslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).","invalidHtmlLength":"Hodnota urÄená pro pole \"%1\" musí být kladné Äíslo bez nebo s platnou jednotkou míry HTML (px nebo %).","invalidInlineStyle":"Hodnota urÄená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu \"název : hodnota\", oddÄ›lené stÅ™edníky","cssLengthTooltip":"Zadejte Äíslo jako hodnotu v pixelech nebo Äíslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupné</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O aplikaci CKEditor","help":"ProhlédnÄ›te si $1 pro nápovÄ›du.","moreInfo":"Pro informace o lincenci navÅ¡tivte naÅ¡i webovou stránku:","title":"O aplikaci CKEditor","userGuide":"Uživatelská příruÄka CKEditor"},"basicstyles":{"bold":"TuÄné","italic":"Kurzíva","strike":"PÅ™eÅ¡krtnuté","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržené"},"blockquote":{"toolbar":"Citace"},"clipboard":{"copy":"Kopírovat","copyError":"BezpeÄnostní nastavení vaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).","cut":"Vyjmout","cutError":"BezpeÄnostní nastavení vaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjmÄ›te zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).","paste":"Vložit","pasteArea":"Oblast vkládání","pasteMsg":"Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stisknÄ›te <STRONG>OK</STRONG>.","securityMsg":"Z důvodů nastavení bezpeÄnosti vaÅ¡eho prohlížeÄe nemůže editor pÅ™istupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.","title":"Vložit"},"contextmenu":{"options":"Nastavení kontextové nabídky"},"toolbar":{"toolbarCollapse":"Skrýt panel nástrojů","toolbarExpand":"Zobrazit panel nástrojů","toolbarGroups":{"document":"Dokument","clipboard":"Schránka/ZpÄ›t","editing":"Úpravy","forms":"Formuláře","basicstyles":"Základní styly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložit","styles":"Styly","colors":"Barvy","tools":"Nástroje"},"toolbars":"Panely nástrojů editoru"},"elementspath":{"eleLabel":"Cesta objektu","eleTitle":"%1 objekt"},"list":{"bulletedlist":"Odrážky","numberedlist":"Číslování"},"indent":{"indent":"ZvÄ›tÅ¡it odsazení","outdent":"ZmenÅ¡it odsazení"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normální (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normální","tag_pre":"Naformátováno"},"horizontalrule":{"toolbar":"Vložit vodorovnou linku"},"image":{"alertUrl":"Zadejte prosím URL obrázku","alt":"Alternativní text","border":"Okraje","btnUpload":"Odeslat na server","button2Img":"SkuteÄnÄ› chcete pÅ™evést zvolené obrázkové tlaÄítko na obyÄejný obrázek?","hSpace":"Horizontální mezera","img2Button":"SkuteÄnÄ› chcete pÅ™evést zvolený obrázek na obrázkové tlaÄítko?","infoTab":"Informace o obrázku","linkTab":"Odkaz","lockRatio":"Zámek","menu":"Vlastnosti obrázku","resetSize":"Původní velikost","title":"Vlastnosti obrázku","titleButton":"Vlastností obrázkového tlaÄítka","upload":"Odeslat","urlMissing":"Zadané URL zdroje obrázku nebylo nalezeno.","vSpace":"Vertikální mezera","validateBorder":"Okraj musí být nastaven v celých Äíslech.","validateHSpace":"Horizontální mezera musí být nastavena v celých Äíslech.","validateVSpace":"Vertikální mezera musí být nastavena v celých Äíslech."},"fakeobjects":{"anchor":"Záložka","flash":"Flash animace","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámý objekt"},"link":{"acccessKey":"Přístupový klíÄ","advanced":"Rozšířené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulek","anchor":{"toolbar":"Záložka","menu":"Vlastnosti záložky","title":"Vlastnosti záložky","name":"Název záložky","errorName":"Zadejte prosím název záložky","remove":"Odstranit záložku"},"anchorId":"Podle Id objektu","anchorName":"Podle jména kotvy","charset":"PÅ™iÅ™azená znaková sada","cssClasses":"Třída stylu","emailAddress":"E-mailová adresa","emailBody":"TÄ›lo zprávy","emailSubject":"PÅ™edmÄ›t zprávy","id":"Id","info":"Informace o odkazu","langCode":"Kód jazyka","langDir":"SmÄ›r jazyka","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","menu":"ZmÄ›nit odkaz","name":"Jméno","noAnchors":"(Ve stránce není definována žádná kotva!)","noEmail":"Zadejte prosím e-mailovou adresu","noUrl":"Zadejte prosím URL odkazu","other":"<jiný>","popupDependent":"Závislost (Netscape)","popupFeatures":"Vlastnosti vyskakovacího okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Levý okraj","popupLocationBar":"Panel umístÄ›ní","popupMenuBar":"Panel nabídky","popupResizable":"Umožňující mÄ›nit velikost","popupScrollBars":"Posuvníky","popupStatusBar":"Stavový řádek","popupToolbar":"Panel nástrojů","popupTop":"Horní okraj","rel":"Vztah","selectAnchor":"Vybrat kotvu","styles":"Styl","tabIndex":"PoÅ™adí prvku","target":"Cíl","targetFrame":"<rámec>","targetFrameName":"Název cílového rámu","targetPopup":"<vyskakovací okno>","targetPopupName":"Název vyskakovacího okna","title":"Odkaz","toAnchor":"Kotva v této stránce","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstranit odkaz","upload":"Odeslat"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximalizovat","minimize":"Minimalizovat"},"pastetext":{"button":"Vložit jako Äistý text","title":"Vložit jako Äistý text"},"pastefromword":{"confirmCleanup":"Jak je vidÄ›t, vkládaný text je kopírován z Wordu. Chcete jej pÅ™ed vložením vyÄistit?","error":"Z důvodu vnitÅ™ní chyby nebylo možné provést vyÄiÅ¡tÄ›ní vkládaného textu.","title":"Vložit z Wordu","toolbar":"Vložit z Wordu"},"removeformat":{"toolbar":"Odstranit formátování"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Nastavení speciálních znaků","title":"VýbÄ›r speciálního znaku","toolbar":"Vložit speciální znaky"},"scayt":{"about":"O aplikaci SCAYT","aboutTab":"O aplikaci","addWord":"PÅ™idat slovo","allCaps":"Ignorovat slova tvoÅ™ená velkými písmeny","dic_create":"VytvoÅ™it","dic_delete":"Smazat","dic_field_name":"Název slovníku","dic_info":"ZpoÄátku se uživatelský slovník ukládá do cookies ve vaÅ¡em prohlížeÄi. OvÅ¡em cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na naÅ¡em serveru. Chcete-li uložit váš osobní slovník na naÅ¡em serveru, je tÅ™eba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepnÄ›te na tlaÄítko Obnovit.","dic_rename":"PÅ™ejmenovat","dic_restore":"Obnovit","dictionariesTab":"Slovníky","disable":"Vypnout SCAYT","emptyDic":"Název slovníku nesmí být prázdný.","enable":"Zapnout SCAYT","ignore":"PÅ™eskoÄit","ignoreAll":"PÅ™eskoÄit vÅ¡e","ignoreDomainNames":"Ignorovat doménová jména","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovat slova obsahující různou velikost písma","mixedWithDigits":"Ignorovat slova obsahující Äísla","moreSuggestions":"Více návrhů","opera_title":"Toto Opera nepodporuje","options":"Nastavení","optionsTab":"Nastavení","title":"Kontrola pravopisu bÄ›hem psaní (SCAYT)","toggle":"VypínaÄ SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Formátovací styly","panelTitle1":"Blokové styly","panelTitle2":"Řádkové styly","panelTitle3":"Objektové styly"},"table":{"border":"OhraniÄení","caption":"Popis","cell":{"menu":"Buňka","insertBefore":"Vložit buňku pÅ™ed","insertAfter":"Vložit buňku za","deleteCell":"Smazat buňky","merge":"SlouÄit buňky","mergeRight":"SlouÄit doprava","mergeDown":"SlouÄit dolů","splitHorizontal":"RozdÄ›lit buňky vodorovnÄ›","splitVertical":"RozdÄ›lit buňky svisle","title":"Vlastnosti buňky","cellType":"Typ buňky","rowSpan":"Spojit řádky","colSpan":"Spojit sloupce","wordWrap":"Zalamování","hAlign":"Vodorovné zarovnání","vAlign":"Svislé zarovnání","alignBaseline":"Na úÄaří","bgColor":"Barva pozadí","borderColor":"Barva okraje","data":"Data","header":"HlaviÄka","yes":"Ano","no":"Ne","invalidWidth":"Šířka buňky musí být Äíslo.","invalidHeight":"Zadaná výška buňky musí být Äíslená.","invalidRowSpan":"Zadaný poÄet slouÄených řádků musí být celé Äíslo.","invalidColSpan":"Zadaný poÄet slouÄených sloupců musí být celé Äíslo.","chooseColor":"VýbÄ›r"},"cellPad":"Odsazení obsahu v buňce","cellSpace":"Vzdálenost bunÄ›k","column":{"menu":"Sloupec","insertBefore":"Vložit sloupec pÅ™ed","insertAfter":"Vložit sloupec za","deleteColumn":"Smazat sloupec"},"columns":"Sloupce","deleteTable":"Smazat tabulku","headers":"Záhlaví","headersBoth":"Obojí","headersColumn":"První sloupec","headersNone":"Žádné","headersRow":"První řádek","invalidBorder":"Zdaná velikost okraje musí být Äíselná.","invalidCellPadding":"Zadané odsazení obsahu v buňce musí být Äíselné.","invalidCellSpacing":"Zadaná vzdálenost bunÄ›k musí být Äíselná.","invalidCols":"PoÄet sloupců musí být Äíslo vÄ›tší než 0.","invalidHeight":"Zadaná výška tabulky musí být Äíselná.","invalidRows":"PoÄet řádků musí být Äíslo vÄ›tší než 0.","invalidWidth":"Šířka tabulky musí být Äíslo.","menu":"Vlastnosti tabulky","row":{"menu":"Řádek","insertBefore":"Vložit řádek pÅ™ed","insertAfter":"Vložit řádek za","deleteRow":"Smazat řádky"},"rows":"Řádky","summary":"Souhrn","title":"Vlastnosti tabulky","toolbar":"Tabulka","widthPc":"procent","widthPx":"bodů","widthUnit":"jednotka šířky"},"undo":{"redo":"Znovu","undo":"ZpÄ›t"},"wsc":{"btnIgnore":"PÅ™eskoÄit","btnIgnoreAll":"PÅ™eskakovat vÅ¡e","btnReplace":"ZamÄ›nit","btnReplaceAll":"Zaměňovat vÅ¡e","btnUndo":"ZpÄ›t","changeTo":"ZmÄ›nit na","errorLoading":"Chyba nahrávání služby aplikace z: %s.","ieSpellDownload":"Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?","manyChanges":"Kontrola pravopisu dokonÄena: %1 slov zmÄ›nÄ›no","noChanges":"Kontrola pravopisu dokonÄena: Beze zmÄ›n","noMispell":"Kontrola pravopisu dokonÄena: Žádné pravopisné chyby nenalezeny","noSuggestions":"- žádné návrhy -","notAvailable":"Omlouváme se, ale služba nyní není dostupná.","notInDic":"Není ve slovníku","oneChange":"Kontrola pravopisu dokonÄena: Jedno slovo zmÄ›nÄ›no","progress":"Probíhá kontrola pravopisu...","title":"Kontrola pravopisu","toolbar":"Zkontrolovat pravopis"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/cy.js b/mod/ckeditor/vendors/ckeditor/lang/cy.js
new file mode 100644
index 000000000..cab6b30e8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/cy.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cy']={"dir":"ltr","editor":"Golygydd Testun Cyfoethog","common":{"editorHelp":"Gwasgwch ALT 0 am gymorth","browseServer":"Pori'r Gweinydd","url":"URL","protocol":"Protocol","upload":"Lanlwytho","uploadSubmit":"Anfon i'r Gweinydd","image":"Delwedd","flash":"Flash","form":"Ffurflen","checkbox":"Blwch ticio","radio":"Botwm Radio","textField":"Maes Testun","textarea":"Ardal Testun","hiddenField":"Maes Cudd","button":"Botwm","select":"Maes Dewis","imageButton":"Botwm Delwedd","notSet":"<heb osod>","id":"Id","name":"Name","langDir":"Cyfeiriad Iaith","langDirLtr":"Chwith i'r Dde (LTR)","langDirRtl":"Dde i'r Chwith (RTL)","langCode":"Cod Iaith","longDescr":"URL Disgrifiad Hir","cssClass":"Dosbarth Dalen Arddull","advisoryTitle":"Teitl Cynghorol","cssStyle":"Arddull","ok":"Iawn","cancel":"Diddymu","close":"Cau","preview":"Rhagolwg","resize":"Llusgo i ailfeintio","generalTab":"Cyffredinol","advancedTab":"Uwch","validateNumberFailed":"Nid yw'r gwerth hwn yn rhif.","confirmNewPage":"Byddwch yn colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. A ydych am barhau i lwytho tudalen newydd?","confirmCancel":"Mae rhai o'r opsiynau wedi'u newid. A ydych wir am gau'r deialog?","options":"Opsiynau","target":"Targed","targetNew":"Ffenest Newydd (_blank)","targetTop":"Ffenest ar y Brig (_top)","targetSelf":"Yr un Ffenest (_self)","targetParent":"Ffenest y Rhiant (_parent)","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","styles":"Arddull","cssClasses":"Dosbarthiadau Ffeil Ddiwyg","width":"Lled","height":"Uchder","align":"Alinio","alignLeft":"Chwith","alignRight":"Dde","alignCenter":"Canol","alignTop":"Brig","alignMiddle":"Canol","alignBottom":"Gwaelod","invalidValue":"Gwerth annilys.","invalidHeight":"Rhaid i'r Uchder fod yn rhif.","invalidWidth":"Rhaid i'r Lled fod yn rhif.","invalidCssLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).","invalidHtmlLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).","invalidInlineStyle":"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw:gwerth\", wedi'u gwahanu gyda hanner colon.","cssLengthTooltip":"Rhowch rif ar gyfer gwerth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).","unavailable":"%1<span class=\"cke_accessibility\">, ddim ar gael</span>"},"about":{"copy":"Hawlfraint &copy; $1. Cedwir pob hawl.","dlgTitle":"Ynghylch CKEditor","help":"Gwirio $1 am gymorth.","moreInfo":"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:","title":"Ynghylch CKEditor","userGuide":"Canllawiau Defnyddiwr CKEditor"},"basicstyles":{"bold":"Bras","italic":"Italig","strike":"Llinell Trwyddo","subscript":"Is-sgript","superscript":"Uwchsgript","underline":"Tanlinellu"},"blockquote":{"toolbar":"Dyfyniad bloc"},"clipboard":{"copy":"Copïo","copyError":"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).","cut":"Torri","cutError":"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).","paste":"Gludo","pasteArea":"Ardal Gludo","pasteMsg":"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.","securityMsg":"Oherwydd gosodiadau diogelwch eich porwr, nid yw'r porwr yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.","title":"Gludo"},"contextmenu":{"options":"Opsiynau Dewislen Cyd-destun"},"toolbar":{"toolbarCollapse":"Cyfangu'r Bar Offer","toolbarExpand":"Ehangu'r Bar Offer","toolbarGroups":{"document":"Dogfen","clipboard":"Clipfwrdd/Dadwneud","editing":"Golygu","forms":"Ffurflenni","basicstyles":"Arddulliau Sylfaenol","paragraph":"Paragraff","links":"Dolenni","insert":"Mewnosod","styles":"Arddulliau","colors":"Lliwiau","tools":"Offer"},"toolbars":"Bariau offer golygydd"},"elementspath":{"eleLabel":"Llwybr elfennau","eleTitle":"Elfen %1"},"list":{"bulletedlist":"Mewnosod/Tynnu Rhestr Bwled","numberedlist":"Mewnosod/Tynnu Rhestr Rhifol"},"indent":{"indent":"Cynyddu'r Mewnoliad","outdent":"Lleihau'r Mewnoliad"},"format":{"label":"Fformat","panelTitle":"Fformat Paragraff","tag_address":"Cyfeiriad","tag_div":"Normal (DIV)","tag_h1":"Pennawd 1","tag_h2":"Pennawd 2","tag_h3":"Pennawd 3","tag_h4":"Pennawd 4","tag_h5":"Pennawd 5","tag_h6":"Pennawd 6","tag_p":"Normal","tag_pre":"Wedi'i Fformatio"},"horizontalrule":{"toolbar":"Mewnosod Llinell Lorweddol"},"image":{"alertUrl":"Rhowch URL y ddelwedd","alt":"Testun Amgen","border":"Ymyl","btnUpload":"Anfon i'r Gweinydd","button2Img":"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?","hSpace":"BwlchLl","img2Button":"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?","infoTab":"Gwyb Delwedd","linkTab":"Dolen","lockRatio":"Cloi Cymhareb","menu":"Priodweddau Delwedd","resetSize":"Ailosod Maint","title":"Priodweddau Delwedd","titleButton":"Priodweddau Botwm Delwedd","upload":"lanlwytho","urlMissing":"URL gwreiddiol y ddelwedd ar goll.","vSpace":"BwlchF","validateBorder":"Rhaid i'r ymyl fod yn gyfanrif.","validateHSpace":"Rhaid i'r HSpace fod yn gyfanrif.","validateVSpace":"Rhaid i'r VSpace fod yn gyfanrif."},"fakeobjects":{"anchor":"Angor","flash":"Animeiddiant Flash","hiddenfield":"Maes Cudd","iframe":"IFrame","unknown":"Gwrthrych Anhysbys"},"link":{"acccessKey":"Allwedd Mynediad","advanced":"Uwch","advisoryContentType":"Math y Cynnwys Cynghorol","advisoryTitle":"Teitl Cynghorol","anchor":{"toolbar":"Angor","menu":"Golygwch yr Angor","title":"Priodweddau'r Angor","name":"Enw'r Angor","errorName":"Teipiwch enw'r angor","remove":"Tynnwch yr Angor"},"anchorId":"Gan Id yr Elfen","anchorName":"Gan Enw'r Angor","charset":"Set nodau'r Adnodd Cysylltiedig","cssClasses":"Dosbarthiadau Dalen Arddull","emailAddress":"Cyfeiriad E-Bost","emailBody":"Pwnc y Neges","emailSubject":"Testun y Message Subject","id":"Id","info":"Gwyb ar y Ddolen","langCode":"Cod Iaith","langDir":"Cyfeiriad Iaith","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","menu":"Golygu Dolen","name":"Enw","noAnchors":"(Dim angorau ar gael yn y ddogfen)","noEmail":"Teipiwch gyfeiriad yr e-bost","noUrl":"Teipiwch URL y ddolen","other":"<eraill>","popupDependent":"Dibynnol (Netscape)","popupFeatures":"Nodweddion Ffenestr Bop","popupFullScreen":"Sgrin Llawn (IE)","popupLeft":"Safle Chwith","popupLocationBar":"Bar Safle","popupMenuBar":"Dewislen","popupResizable":"Ailfeintiol","popupScrollBars":"Barrau Sgrolio","popupStatusBar":"Bar Statws","popupToolbar":"Bar Offer","popupTop":"Safle Top","rel":"Perthynas","selectAnchor":"Dewiswch Angor","styles":"Arddull","tabIndex":"Indecs Tab","target":"Targed","targetFrame":"<ffrâm>","targetFrameName":"Enw Ffrâm y Targed","targetPopup":"<ffenestr bop>","targetPopupName":"Enw Ffenestr Bop","title":"Dolen","toAnchor":"Dolen at angor yn y testun","toEmail":"E-bost","toUrl":"URL","toolbar":"Dolen","type":"Math y Ddolen","unlink":"Datgysylltu","upload":"Lanlwytho"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Mwyhau","minimize":"Lleihau"},"pastetext":{"button":"Gludo fel testun plaen","title":"Gludo fel Testun Plaen"},"pastefromword":{"confirmCleanup":"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?","error":"Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol","title":"Gludo o Word","toolbar":"Gludo o Word"},"removeformat":{"toolbar":"Tynnu Fformat"},"sourcearea":{"toolbar":"HTML"},"specialchar":{"options":"Opsiynau Nodau Arbennig","title":"Dewis Nod Arbennig","toolbar":"Mewnosod Nodau Arbennig"},"scayt":{"about":"Ynghylch SCAYT","aboutTab":"Ynghylch","addWord":"Ychwanegu Gair","allCaps":"Anwybyddu Geiriau Nodau Uwch i Gyd","dic_create":"Creu","dic_delete":"Dileu","dic_field_name":"Enw'r geiriadur","dic_info":"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.","dic_rename":"Ailenwi","dic_restore":"Adfer","dictionariesTab":"Geiriaduron","disable":"Analluogi SCAYT","emptyDic":"Ni ddylai enw'r geiriadur fod yn wag.","enable":"Galluogi SCAYT","ignore":"Anwybyddu","ignoreAll":"Anwybyddu pob","ignoreDomainNames":"Anwybyddu Enwau Parth","langs":"Ieithoedd","languagesTab":"Ieithoedd","mixedCase":"Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is","mixedWithDigits":"Anwybyddu Geiriau â Rhifau","moreSuggestions":"Awgrymiadau pellach","opera_title":"Heb ei gynnal gan Opera","options":"Opsiynau","optionsTab":"Opsiynau","title":"Gwirio'r Sillafu Wrth Deipio","toggle":"Togl SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Arddulliau","panelTitle":"Arddulliau Fformatio","panelTitle1":"Arddulliau Bloc","panelTitle2":"Arddulliau Mewnol","panelTitle3":"Arddulliau Gwrthrych"},"table":{"border":"Maint yr Ymyl","caption":"Pennawd","cell":{"menu":"Cell","insertBefore":"Mewnosod Cell Cyn","insertAfter":"Mewnosod Cell Ar Ôl","deleteCell":"Dileu Celloedd","merge":"Cyfuno Celloedd","mergeRight":"Cyfuno i'r Dde","mergeDown":"Cyfuno i Lawr","splitHorizontal":"Hollti'r Gell yn Lorweddol","splitVertical":"Hollti'r Gell yn Fertigol","title":"Priodweddau'r Gell","cellType":"Math y Gell","rowSpan":"Rhychwant Rhesi","colSpan":"Rhychwant Colofnau","wordWrap":"Lapio Geiriau","hAlign":"Aliniad Llorweddol","vAlign":"Aliniad Fertigol","alignBaseline":"Baslinell","bgColor":"Lliw Cefndir","borderColor":"Lliw Ymyl","data":"Data","header":"Pennyn","yes":"Ie","no":"Na","invalidWidth":"Mae'n rhaid i led y gell fod yn rhif.","invalidHeight":"Mae'n rhaid i uchder y gell fod yn rhif.","invalidRowSpan":"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.","invalidColSpan":"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.","chooseColor":"Choose"},"cellPad":"Padio'r gell","cellSpace":"Bylchu'r gell","column":{"menu":"Colofn","insertBefore":"Mewnosod Colofn Cyn","insertAfter":"Mewnosod Colofn Ar Ôl","deleteColumn":"Dileu Colofnau"},"columns":"Colofnau","deleteTable":"Dileu Tabl","headers":"Penynnau","headersBoth":"Y Ddau","headersColumn":"Colofn gyntaf","headersNone":"Dim","headersRow":"Rhes gyntaf","invalidBorder":"Mae'n rhaid i faint yr ymyl fod yn rhif.","invalidCellPadding":"Mae'n rhaid i badiad y gell fod yn rhif positif.","invalidCellSpacing":"Mae'n rhaid i fylchiad y gell fod yn rhif positif.","invalidCols":"Mae'n rhaid cael o leiaf un golofn.","invalidHeight":"Mae'n rhaid i uchder y tabl fod yn rhif.","invalidRows":"Mae'n rhaid cael o leiaf un rhes.","invalidWidth":"Mae'n rhaid i led y tabl fod yn rhif.","menu":"Nodweddion Tabl","row":{"menu":"Rhes","insertBefore":"Mewnosod Rhes Cyn","insertAfter":"Mewnosod Rhes Ar Ôl","deleteRow":"Dileu Rhesi"},"rows":"Rhesi","summary":"Crynodeb","title":"Nodweddion Tabl","toolbar":"Tabl","widthPc":"y cant","widthPx":"picsel","widthUnit":"uned lled"},"undo":{"redo":"Ailadrodd","undo":"Dadwneud"},"wsc":{"btnIgnore":"Anwybyddu Un","btnIgnoreAll":"Anwybyddu Pob","btnReplace":"Amnewid Un","btnReplaceAll":"Amnewid Pob","btnUndo":"Dadwneud","changeTo":"Newid i","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?","manyChanges":"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair","noChanges":"Gwirio sillafu wedi gorffen: Dim newidiadau","noMispell":"Gwirio sillafu wedi gorffen: Dim camsillaf.","noSuggestions":"- Dim awgrymiadau -","notAvailable":"Nid yw'r gwasanaeth hwn ar gael yn bresennol.","notInDic":"Nid i'w gael yn y geiriadur","oneChange":"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair","progress":"Gwirio sillafu yn ar y gweill...","title":"Gwirio Sillafu","toolbar":"Gwirio Sillafu"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/da.js b/mod/ckeditor/vendors/ckeditor/lang/da.js
new file mode 100644
index 000000000..4c6f17e4a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/da.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['da']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Tryk ALT 0 for hjælp","browseServer":"Gennemse...","url":"URL","protocol":"Protokol","upload":"Upload","uploadSubmit":"Upload","image":"Indsæt billede","flash":"Indsæt Flash","form":"Indsæt formular","checkbox":"Indsæt afkrydsningsfelt","radio":"Indsæt alternativknap","textField":"Indsæt tekstfelt","textarea":"Indsæt tekstboks","hiddenField":"Indsæt skjult felt","button":"Indsæt knap","select":"Indsæt liste","imageButton":"Indsæt billedknap","notSet":"<intet valgt>","id":"Id","name":"Navn","langDir":"Tekstretning","langDirLtr":"Fra venstre mod højre (LTR)","langDirRtl":"Fra højre mod venstre (RTL)","langCode":"Sprogkode","longDescr":"Udvidet beskrivelse","cssClass":"Typografiark (CSS)","advisoryTitle":"Titel","cssStyle":"Typografi (CSS)","ok":"OK","cancel":"Annullér","close":"Luk","preview":"Forhåndsvisning","resize":"Træk for at skalere","generalTab":"Generelt","advancedTab":"Avanceret","validateNumberFailed":"Værdien er ikke et tal.","confirmNewPage":"Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?","confirmCancel":"Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?","options":"Vis muligheder","target":"Mål","targetNew":"Nyt vindue (_blank)","targetTop":"Øverste vindue (_top)","targetSelf":"Samme vindue (_self)","targetParent":"Samme vindue (_parent)","langDirLTR":"Venstre til højre (LTR)","langDirRTL":"Højre til venstre (RTL)","styles":"Style","cssClasses":"Stylesheetklasser","width":"Bredde","height":"Højde","align":"Justering","alignLeft":"Venstre","alignRight":"Højre","alignCenter":"Centreret","alignTop":"Øverst","alignMiddle":"Centreret","alignBottom":"Nederst","invalidValue":"Invalid value.","invalidHeight":"Højde skal være et tal.","invalidWidth":"Bredde skal være et tal.","invalidCssLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px eller %).","invalidInlineStyle":"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \"name:value\", separeret af semikoloner","cssLengthTooltip":"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikke tilgængelig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheder forbeholdes.","dlgTitle":"Om CKEditor","help":"Se $1 for at få hjælp.","moreInfo":"For informationer omkring licens, se venligst vores hjemmeside (på engelsk):","title":"Om CKEditor","userGuide":"CKEditor-brugermanual"},"basicstyles":{"bold":"Fed","italic":"Kursiv","strike":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget"},"blockquote":{"toolbar":"Blokcitat"},"clipboard":{"copy":"Kopiér","copyError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).","cut":"Klip","cutError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).","paste":"Indsæt","pasteArea":"Indsæt område","pasteMsg":"Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.","securityMsg":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.","title":"Indsæt"},"contextmenu":{"options":"Muligheder for hjælpemenu"},"toolbar":{"toolbarCollapse":"Sammenklap værktøjslinje","toolbarExpand":"Udvid værktøjslinje","toolbarGroups":{"document":"Dokument","clipboard":"Udklipsholder/Fortryd","editing":"Redigering","forms":"Formularer","basicstyles":"Basis styles","paragraph":"Paragraf","links":"Links","insert":"Indsæt","styles":"Typografier","colors":"Farver","tools":"Værktøjer"},"toolbars":"Editors værktøjslinjer"},"elementspath":{"eleLabel":"Sti på element","eleTitle":"%1 element"},"list":{"bulletedlist":"Punktopstilling","numberedlist":"Talopstilling"},"indent":{"indent":"Forøg indrykning","outdent":"Formindsk indrykning"},"format":{"label":"Formatering","panelTitle":"Formatering","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formateret"},"horizontalrule":{"toolbar":"Indsæt vandret streg"},"image":{"alertUrl":"Indtast stien til billedet","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Upload fil til serveren","button2Img":"Vil du lave billedknappen om til et almindeligt billede?","hSpace":"Vandret margen","img2Button":"Vil du lave billedet om til en billedknap?","infoTab":"Generelt","linkTab":"Hyperlink","lockRatio":"Lås størrelsesforhold","menu":"Egenskaber for billede","resetSize":"Nulstil størrelse","title":"Egenskaber for billede","titleButton":"Egenskaber for billedknap","upload":"Upload","urlMissing":"Kilde på billed-URL mangler","vSpace":"Lodret margen","validateBorder":"Kant skal være et helt nummer.","validateHSpace":"HSpace skal være et helt nummer.","validateVSpace":"VSpace skal være et helt nummer."},"fakeobjects":{"anchor":"Anker","flash":"Flashanimation","hiddenfield":"Skjult felt","iframe":"Iframe","unknown":"Ukendt objekt"},"link":{"acccessKey":"Genvejstast","advanced":"Avanceret","advisoryContentType":"Indholdstype","advisoryTitle":"Titel","anchor":{"toolbar":"Indsæt/redigér bogmærke","menu":"Egenskaber for bogmærke","title":"Egenskaber for bogmærke","name":"Bogmærkenavn","errorName":"Indtast bogmærkenavn","remove":"Fjern bogmærke"},"anchorId":"Efter element-Id","anchorName":"Efter ankernavn","charset":"Tegnsæt","cssClasses":"Typografiark","emailAddress":"E-mailadresse","emailBody":"Besked","emailSubject":"Emne","id":"Id","info":"Generelt","langCode":"Tekstretning","langDir":"Tekstretning","langDirLTR":"Fra venstre mod højre (LTR)","langDirRTL":"Fra højre mod venstre (RTL)","menu":"Redigér hyperlink","name":"Navn","noAnchors":"(Ingen bogmærker i dokumentet)","noEmail":"Indtast e-mailadresse!","noUrl":"Indtast hyperlink-URL!","other":"<anden>","popupDependent":"Koblet/dependent (Netscape)","popupFeatures":"Egenskaber for popup","popupFullScreen":"Fuld skærm (IE)","popupLeft":"Position fra venstre","popupLocationBar":"Adresselinje","popupMenuBar":"Menulinje","popupResizable":"Justérbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Værktøjslinje","popupTop":"Position fra toppen","rel":"Relation","selectAnchor":"Vælg et anker","styles":"Typografi","tabIndex":"Tabulatorindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Destinationsvinduets navn","targetPopup":"<popup vindue>","targetPopupName":"Popupvinduets navn","title":"Egenskaber for hyperlink","toAnchor":"Bogmærke på denne side","toEmail":"E-mail","toUrl":"URL","toolbar":"Indsæt/redigér hyperlink","type":"Type","unlink":"Fjern hyperlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimér","minimize":"Minimér"},"pastetext":{"button":"Indsæt som ikke-formateret tekst","title":"Indsæt som ikke-formateret tekst"},"pastefromword":{"confirmCleanup":"Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?","error":"Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl","title":"Indsæt fra Word","toolbar":"Indsæt fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Muligheder for specialkarakterer","title":"Vælg symbol","toolbar":"Indsæt symbol"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Tilføj ord","allCaps":"Ignorer alle store bogstaver","dic_create":"Opret","dic_delete":"Slet","dic_field_name":"Navn på ordbog","dic_info":"Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning på størrelse. Når ordbogen når en bestemt størrelse kan den blive gemt på vores server. For at gemme din personlige ordbog på vores server skal du angive et navn for denne. Såfremt du allerede har gemt en ordbog, skriv navnet på denne og klik på Gendan knappen.","dic_rename":"Omdøb","dic_restore":"Gendan","dictionariesTab":"Ordbøger","disable":"Deaktivér SCAYT","emptyDic":"Ordbogsnavn må ikke være tom.","enable":"Aktivér SCAYT","ignore":"Ignorér","ignoreAll":"Ignorér alle","ignoreDomainNames":"Ignorér domænenavne","langs":"Sprog","languagesTab":"Sprog","mixedCase":"Ignorer ord med store og små bogstaver","mixedWithDigits":"Ignorér ord med numre","moreSuggestions":"Flere forslag","opera_title":"Ikke supporteret af Opera","options":"Indstillinger","optionsTab":"Indstillinger","title":"Stavekontrol mens du skriver","toggle":"Skift/toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formattering på stylesheet","panelTitle1":"Block typografi","panelTitle2":"Inline typografi","panelTitle3":"Object typografi"},"table":{"border":"Rammebredde","caption":"Titel","cell":{"menu":"Celle","insertBefore":"Indsæt celle før","insertAfter":"Indsæt celle efter","deleteCell":"Slet celle","merge":"Flet celler","mergeRight":"Flet til højre","mergeDown":"Flet nedad","splitHorizontal":"Del celle vandret","splitVertical":"Del celle lodret","title":"Celleegenskaber","cellType":"Celletype","rowSpan":"Række span (rows span)","colSpan":"Kolonne span (columns span)","wordWrap":"Tekstombrydning","hAlign":"Vandret justering","vAlign":"Lodret justering","alignBaseline":"Grundlinje","bgColor":"Baggrundsfarve","borderColor":"Rammefarve","data":"Data","header":"Hoved","yes":"Ja","no":"Nej","invalidWidth":"Cellebredde skal være et tal.","invalidHeight":"Cellehøjde skal være et tal.","invalidRowSpan":"Række span skal være et heltal.","invalidColSpan":"Kolonne span skal være et heltal.","chooseColor":"Vælg"},"cellPad":"Cellemargen","cellSpace":"Celleafstand","column":{"menu":"Kolonne","insertBefore":"Indsæt kolonne før","insertAfter":"Indsæt kolonne efter","deleteColumn":"Slet kolonne"},"columns":"Kolonner","deleteTable":"Slet tabel","headers":"Hoved","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første række","invalidBorder":"Rammetykkelse skal være et tal.","invalidCellPadding":"Cellemargen skal være et tal.","invalidCellSpacing":"Celleafstand skal være et tal.","invalidCols":"Antallet af kolonner skal være større end 0.","invalidHeight":"Tabelhøjde skal være et tal.","invalidRows":"Antallet af rækker skal være større end 0.","invalidWidth":"Tabelbredde skal være et tal.","menu":"Egenskaber for tabel","row":{"menu":"Række","insertBefore":"Indsæt række før","insertAfter":"Indsæt række efter","deleteRow":"Slet række"},"rows":"Rækker","summary":"Resumé","title":"Egenskaber for tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"Bredde på enhed"},"undo":{"redo":"Annullér fortryd","undo":"Fortryd"},"wsc":{"btnIgnore":"Ignorér","btnIgnoreAll":"Ignorér alle","btnReplace":"Erstat","btnReplaceAll":"Erstat alle","btnUndo":"Tilbage","changeTo":"Forslag","errorLoading":"Fejl ved indlæsning af host: %s.","ieSpellDownload":"Stavekontrol ikke installeret. Vil du installere den nu?","manyChanges":"Stavekontrol færdig: %1 ord ændret","noChanges":"Stavekontrol færdig: Ingen ord ændret","noMispell":"Stavekontrol færdig: Ingen fejl fundet","noSuggestions":"(ingen forslag)","notAvailable":"Stavekontrol er desværre ikke tilgængelig.","notInDic":"Ikke i ordbogen","oneChange":"Stavekontrol færdig: Et ord ændret","progress":"Stavekontrollen arbejder...","title":"Stavekontrol","toolbar":"Stavekontrol"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/de.js b/mod/ckeditor/vendors/ckeditor/lang/de.js
new file mode 100644
index 000000000..a0f230ee3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/de.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['de']={"dir":"ltr","editor":"WYSIWYG-Editor","common":{"editorHelp":"Drücken Sie ALT 0 für Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"<nichts>","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"Sprachenkürzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"Schließen","preview":"Vorschau","resize":"Zum Vergrößern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","invalidValue":"Invalid value.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1<span class=\"cke_accessibility\">, nicht verfügbar</span>"},"about":{"copy":"Copyright &copy; $1. Alle Rechte vorbehalten.","dlgTitle":"Über CKEditor","help":"Prüfe $1 für Hilfe.","moreInfo":"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:","title":"Über CKEditor","userGuide":"CKEditor Benutzerhandbuch"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"blockquote":{"toolbar":"Zitatblock"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).","paste":"Einfügen","pasteArea":"Einfügebereich","pasteMsg":"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.","title":"Einfügen"},"contextmenu":{"options":"Kontextmenü Optionen"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/Rückgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"Einfügen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"elementspath":{"eleLabel":"Elements Pfad","eleTitle":"%1 Element"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Überschrift 1","tag_h2":"Überschrift 2","tag_h3":"Überschrift 3","tag_h4":"Überschrift 4","tag_h5":"Überschrift 5","tag_h6":"Überschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"horizontalrule":{"toolbar":"Horizontale Linie einfügen"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"Größenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"Größe zurücksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muß eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muß eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muß eine ganze Zahl sein."},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfügen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"Sprachenkürzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"<andere>","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"Menü-Leiste","popupResizable":"Größe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"<Frame>","targetFrameName":"Ziel-Fenster-Name","targetPopup":"<Pop-up Fenster>","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfügen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximieren","minimize":"Minimieren"},"pastetext":{"button":"Als Text einfügen","title":"Als Text einfügen"},"pastefromword":{"confirmCleanup":"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?","error":"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen","title":"Aus MS-Word einfügen","toolbar":"Aus MS-Word einfügen"},"removeformat":{"toolbar":"Formatierungen entfernen"},"sourcearea":{"toolbar":"Quellcode"},"specialchar":{"options":"Sonderzeichen Optionen","title":"Sonderzeichen auswählen","toolbar":"Sonderzeichen einfügen/editieren"},"scayt":{"about":"Über SCAYT","aboutTab":"Über","addWord":"Wort hinzufügen","allCaps":"Groß geschriebenen Wörter ignorieren","dic_create":"Erzeugen","dic_delete":"Löschen","dic_field_name":"Wörterbuchname","dic_info":"Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.","dic_rename":"Umbenennen","dic_restore":"Wiederherstellen","dictionariesTab":"Wörterbücher","disable":"SCAYT ausschalten","emptyDic":"Wörterbuchname sollte leer sein.","enable":"SCAYT einschalten","ignore":"Ignorieren","ignoreAll":"Alle ignorieren","ignoreDomainNames":"Domain-Namen ignorieren","langs":"Sprachen","languagesTab":"Sprachen","mixedCase":"Wörter mit gemischte Setzkasten ignorieren","mixedWithDigits":"Wörter mit Zahlen ignorieren","moreSuggestions":"Mehr Vorschläge","opera_title":"Nicht von Opera unterstützt","options":"Optionen","optionsTab":"Optionen","title":"Rechtschreibprüfung während der Texteingabe (SCAYT)","toggle":"SCAYT umschalten","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatierungenstil","panelTitle1":"Block Stilart","panelTitle2":"Inline Stilart","panelTitle3":"Objekt Stilart"},"table":{"border":"Rahmen","caption":"Überschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfügen","insertAfter":"Zelle danach einfügen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Überschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muß eine Zahl sein.","invalidHeight":"Zellenhöhe muß eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand außen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfügen","insertAfter":"Spalte rechts danach einfügen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muß eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muß eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand außen muß eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muß größer als 0 sein..","invalidHeight":"Die Tabellenbreite muß eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muß größer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfügen","insertAfter":"Zeile unterhalb einfügen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"Inhaltsübersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"undo":{"redo":"Wiederherstellen","undo":"Rückgängig"},"wsc":{"btnIgnore":"Ignorieren","btnIgnoreAll":"Alle Ignorieren","btnReplace":"Ersetzen","btnReplaceAll":"Alle Ersetzen","btnUndo":"Rückgängig","changeTo":"Ändern in","errorLoading":"Fehler beim laden des Dienstanbieters: %s.","ieSpellDownload":"Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?","manyChanges":"Rechtschreibprüfung abgeschlossen - %1 Wörter geändert","noChanges":"Rechtschreibprüfung abgeschlossen - keine Worte geändert","noMispell":"Rechtschreibprüfung abgeschlossen - keine Fehler gefunden","noSuggestions":" - keine Vorschläge - ","notAvailable":"Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.","notInDic":"Nicht im Wörterbuch","oneChange":"Rechtschreibprüfung abgeschlossen - ein Wort geändert","progress":"Rechtschreibprüfung läuft...","title":"Rechtschreibprüfung","toolbar":"Rechtschreibprüfung"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/el.js b/mod/ckeditor/vendors/ckeditor/lang/el.js
new file mode 100644
index 000000000..b936e65c5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/el.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['el']={"dir":"ltr","editor":"ΕπεξεÏγαστής ΠλοÏσιου Κειμένου","common":{"editorHelp":"Πατήστε το ALT 0 για βοήθεια","browseServer":"ΕξεÏεÏνηση διακομιστή","url":"URL","protocol":"ΠÏωτόκολλο","upload":"Ανέβασμα","uploadSubmit":"Αποστολή στον Διακομιστή","image":"Εικόνα","flash":"Εισαγωγή Flash","form":"ΦόÏμα","checkbox":"Κουτί επιλογής","radio":"Κουμπί επιλογής","textField":"Πεδίο κειμένου","textarea":"ΠεÏιοχή κειμένου","hiddenField":"ΚÏυφό πεδίο","button":"Κουμπί","select":"Πεδίο επιλογής","imageButton":"Κουμπί εικόνας","notSet":"<δεν έχει Ïυθμιστεί>","id":"Id","name":"Όνομα","langDir":"ΚατεÏθυνση κειμένου","langDirLtr":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRtl":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","langCode":"Κωδικός Γλώσσας","longDescr":"Αναλυτική πεÏιγÏαφή URL","cssClass":"Stylesheet Classes","advisoryTitle":"Ενδεικτικός τίτλος","cssStyle":"ΜοÏφή κειμένου","ok":"OK","cancel":"ΑκÏÏωση","close":"Κλείσιμο","preview":"ΠÏοεπισκόπηση","resize":"ΣÏÏσιμο για αλλαγή μεγέθους","generalTab":"Γενικά","advancedTab":"Για Ï€ÏοχωÏημένους","validateNumberFailed":"Αυτή η τιμή δεν είναι αÏιθμός.","confirmNewPage":"Οι όποιες αλλαγές στο πεÏιεχόμενο θα χαθοÏν. Είσαστε σίγουÏοι ότι θέλετε να φοÏτώσετε μια νέα σελίδα;","confirmCancel":"ΜεÏικές επιλογές έχουν αλλάξει. Είσαστε σίγουÏοι ότι θέλετε να κλείσετε το παÏάθυÏο διαλόγου;","options":"Επιλογές","target":"ΠÏοοÏισμός","targetNew":"Îέο ΠαÏάθυÏο (_blank)","targetTop":"ΑÏχική ΠεÏιοχή (_top)","targetSelf":"Ίδια ΠεÏιοχή (_self)","targetParent":"Γονεϊκό ΠαÏάθυÏο (_parent)","langDirLTR":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRTL":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","styles":"ΜοÏφή","cssClasses":"Stylesheet Classes","width":"Πλάτος","height":"Ύψος","align":"Στοίχιση","alignLeft":"ΑÏιστεÏά","alignRight":"Δεξιά","alignCenter":"ΚέντÏο","alignTop":"Πάνω","alignMiddle":"Μέση","alignBottom":"Κάτω","invalidValue":"Μη έγκυÏη τιμή.","invalidHeight":"Το Ïψος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidWidth":"Το πλάτος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidCssLength":"Η τιμή που οÏίζεται για το πεδίο \"%1\" Ï€Ïέπει να είναι ένας θετικός αÏιθμός με ή χωÏίς μια έγκυÏη μονάδα μέτÏησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","invalidHtmlLength":"Η τιμή που οÏίζεται για το πεδίο \"%1\" Ï€Ïέπει να είναι ένας θετικός αÏιθμός με ή χωÏίς μια έγκυÏη μονάδα μέτÏησης HTML (px or %).","invalidInlineStyle":"Η τιμή για το εν σειÏά στυλ Ï€Ïέπει να πεÏιέχει ένα ή πεÏισσότεÏα ζεÏγη με την μοÏφή \"όνομα: τιμή\" διαχωÏισμένα με Ελληνικό εÏωτηματικό.","cssLengthTooltip":"Εισάγεται μια τιμή σε pixel ή έναν αÏιθμό μαζί με μια έγκυÏη μονάδα μέτÏησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","unavailable":"%1<span class=\"cke_accessibility\">, δεν είναι διαθέσιμο</span>"},"about":{"copy":"Πνευματικά δικαιώματα &copy; $1 Με επιφÏλαξη παντός δικαιώματος.","dlgTitle":"ΠεÏί του CKEditor","help":"Ελέγξτε το $1 για βοήθεια.","moreInfo":"Για πληÏοφοÏίες αδειών παÏακαλοÏμε επισκεφθείτε την ιστοσελίδα μας:","title":"ΠεÏί του CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Έντονα","italic":"Πλάγια","strike":"ΔιαγÏάμμιση","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"ΥπογÏάμμιση"},"blockquote":{"toolbar":"ΠεÏιοχή ΠαÏάθεσης"},"clipboard":{"copy":"ΑντιγÏαφή","copyError":"Οι Ïυθμίσεις ασφαλείας του φυλλομετÏητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αντιγÏαφής. ΧÏησιμοποιείστε το πληκτÏολόγιο (Ctrl/Cmd+C).","cut":"Αποκοπή","cutError":"Οι Ïυθμίσεις ασφαλείας του φυλλομετÏητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αποκοπής. ΧÏησιμοποιείστε το πληκτÏολόγιο (Ctrl/Cmd+X).","paste":"Επικόλληση","pasteArea":"ΠεÏιοχή Επικόλλησης","pasteMsg":"ΠαÏακαλώ επικολήστε στο ακόλουθο κουτί χÏησιμοποιόντας το πληκτÏολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.","securityMsg":"Λόγων των Ïυθμίσεων ασφάλειας του πεÏιηγητή σας, ο επεξεÏγαστής δεν μποÏεί να έχει Ï€Ïόσβαση στην μνήμη επικόλλησης. ΧÏειάζεται να επικολλήσετε ξανά σε αυτό το παÏάθυÏο.","title":"Επικόλληση"},"contextmenu":{"options":"Επιλογές Αναδυόμενου ΜενοÏ"},"toolbar":{"toolbarCollapse":"ΣÏμπτηξη ΕÏγαλειοθήκης","toolbarExpand":"Ανάπτυξη ΕÏγαλειοθήκης","toolbarGroups":{"document":"ΈγγÏαφο","clipboard":"Clipboard/Undo","editing":"Σε επεξεÏγασία","forms":"ΦόÏμες","basicstyles":"Βασικά στυλ","paragraph":"ΠαÏάγÏαφος","links":"Συνδέσμοι","insert":"Εισαγωγή","styles":"Στυλ","colors":"ΧÏώματα","tools":"ΕÏγαλεία"},"toolbars":"ΕÏγαλειοθήκες ΕπεξεÏγαστή"},"elementspath":{"eleLabel":"ΔιαδÏομή στοιχείων","eleTitle":"%1 στοιχείο"},"list":{"bulletedlist":"Εισαγωγή/ΑπομάκÏυνση Λίστας Κουκκίδων","numberedlist":"Εισαγωγή/ΑπομάκÏυνση ΑÏιθμημένης Λίστας"},"indent":{"indent":"ΑÏξηση Εσοχής","outdent":"Μείωση Εσοχής"},"format":{"label":"ΜοÏφοποίηση","panelTitle":"ΜοÏφοποίηση ΠαÏαγÏάφου","tag_address":"ΔιεÏθυνση","tag_div":"Κανονικό (DIV)","tag_h1":"Επικεφαλίδα 1","tag_h2":"Επικεφαλίδα 2","tag_h3":"Επικεφαλίδα 3","tag_h4":"Επικεφαλίδα 4","tag_h5":"Επικεφαλίδα 5","tag_h6":"Επικεφαλίδα 6","tag_p":"Κανονικό","tag_pre":"ΜοÏφοποιημένο"},"horizontalrule":{"toolbar":"Εισαγωγή ΟÏιζόντιας ΓÏαμμής"},"image":{"alertUrl":"Εισάγετε την τοποθεσία (URL) της εικόνας","alt":"Εναλλακτικό Κείμενο","border":"ΠεÏίγÏαμμα","btnUpload":"Αποστολή στον Διακομιστή","button2Img":"Θέλετε να μετατÏέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;","hSpace":"ΟÏιζόντιο Διάστημα","img2Button":"Θέλετε να μεταμοÏφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;","infoTab":"ΠληÏοφοÏίες Εικόνας","linkTab":"ΣÏνδεσμος","lockRatio":"Κλείδωμα Αναλογίας","menu":"Ιδιότητες Εικόνας","resetSize":"ΕπαναφοÏά ΑÏÏ‡Î¹ÎºÎ¿Ï ÎœÎµÎ³Î­Î¸Î¿Ï…Ï‚","title":"Ιδιότητες Εικόνας","titleButton":"Ιδιότητες ÎšÎ¿Ï…Î¼Ï€Î¹Î¿Ï Î•Î¹ÎºÏŒÎ½Î±Ï‚","upload":"Ανέβασμα","urlMissing":"Το URL πηγής για την εικόνα λείπει.","vSpace":"Κάθετο Διάστημα","validateBorder":"Το πεÏίγÏαμμα Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός.","validateHSpace":"Το HSpace Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός.","validateVSpace":"Το VSpace Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός."},"fakeobjects":{"anchor":"Εισαγωγή/επεξεÏγασία ΆγκυÏας","flash":"Ταινία Flash","hiddenfield":"ΚÏυφό πεδίο","iframe":"IFrame","unknown":"Άγνωστο Αντικείμενο"},"link":{"acccessKey":"Συντόμευση","advanced":"Για Ï€ÏοχωÏημένους","advisoryContentType":"Ενδεικτικός ΤÏπος ΠεÏιεχομένου","advisoryTitle":"Ενδεικτικός Τίτλος","anchor":{"toolbar":"Εισαγωγή/επεξεÏγασία ΆγκυÏας","menu":"Ιδιότητες άγκυÏας","title":"Ιδιότητες άγκυÏας","name":"Όνομα άγκυÏας","errorName":"ΠαÏακαλοÏμε εισάγετε όνομα άγκυÏας","remove":"ΑφαίÏεση ΆγκυÏας"},"anchorId":"Βάσει του Element Id","anchorName":"Βάσει του Ονόματος της άγκυÏας","charset":"Κωδικοποίηση ΧαÏακτήÏων ΠÏοσαÏτημένης Πηγής","cssClasses":"Stylesheet Classes","emailAddress":"ΔιεÏθυνση e-mail","emailBody":"Κείμενο ΜηνÏματος","emailSubject":"Θέμα ΜηνÏματος","id":"Id","info":"ΠληÏοφοÏίες Συνδέσμου","langCode":"ΚατεÏθυνση Κειμένου","langDir":"ΚατεÏθυνση Κειμένου","langDirLTR":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRTL":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","menu":"ΕπεξεÏγασία Συνδέσμου","name":"Όνομα","noAnchors":"(Δεν υπάÏχουν άγκυÏες στο κείμενο)","noEmail":"Εισάγετε την διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου","noUrl":"Εισάγετε την τοποθεσία (URL) του υπεÏσυνδέσμου (Link)","other":"<άλλο>","popupDependent":"ΕξαÏτημένο (Netscape)","popupFeatures":"Επιλογές Αναδυόμενου ΠαÏαθÏÏου","popupFullScreen":"ΠλήÏης Οθόνη (IE)","popupLeft":"Θέση ΑÏιστεÏά","popupLocationBar":"ΓÏαμμή Τοποθεσίας","popupMenuBar":"ΓÏαμμή Επιλογών","popupResizable":"ΠÏοσαÏμοζόμενο Μέγεθος","popupScrollBars":"ΜπάÏες ΚÏλισης","popupStatusBar":"ΓÏαμμή Κατάστασης","popupToolbar":"ΕÏγαλειοθήκη","popupTop":"Θέση Πάνω","rel":"Σχέση","selectAnchor":"Επιλέξτε μια άγκυÏα","styles":"ΜοÏφή","tabIndex":"ΣειÏά Μεταπήδησης","target":"ΠαÏάθυÏο ΠÏοοÏισμοÏ","targetFrame":"<πλαίσιο>","targetFrameName":"Όνομα ΠαÏαθÏÏου ΠÏοοÏισμοÏ","targetPopup":"<αναδυόμενο παÏάθυÏο>","targetPopupName":"Όνομα Αναδυόμενου ΠαÏαθÏÏου","title":"ΣÏνδεσμος","toAnchor":"ΆγκυÏα σε αυτή τη σελίδα","toEmail":"E-Mail","toUrl":"URL","toolbar":"ΣÏνδεσμος","type":"ΤÏπος Συνδέσμου","unlink":"ΑφαίÏεση Συνδέσμου (Link)","upload":"Ανέβασμα"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Μεγιστοποίηση","minimize":"Ελαχιστοποίηση"},"pastetext":{"button":"Επικόλληση ως Απλό Κείμενο","title":"Επικόλληση ως Απλό Κείμενο"},"pastefromword":{"confirmCleanup":"Το κείμενο που επικολλάται φαίνεται να είναι αντιγÏαμμένο από το Word. Μήπως θα θέλατε να καθαÏιστεί Ï€ÏÎ¿Ï„Î¿Ï ÎµÏ€Î¹ÎºÎ¿Î»Î»Î·Î¸ÎµÎ¯;","error":"Δεν ήταν δυνατό να καθαÏιστοÏν τα δεδομένα λόγω ενός εσωτεÏÎ¹ÎºÎ¿Ï ÏƒÏ†Î¬Î»Î¼Î±Ï„Î¿Ï‚","title":"Επικόλληση από το Word","toolbar":"Επικόλληση από το Word"},"removeformat":{"toolbar":"ΑφαίÏεση ΜοÏφοποίησης"},"sourcearea":{"toolbar":"HTML κώδικας"},"specialchar":{"options":"Επιλογές Ειδικών ΧαÏακτήÏων","title":"Επιλέξτε έναν Ειδικό ΧαÏακτήÏα","toolbar":"Εισαγωγή Î•Î¹Î´Î¹ÎºÎ¿Ï Î§Î±ÏακτήÏα"},"scayt":{"about":"About SCAYT","aboutTab":"ΠεÏί","addWord":"ΠÏοσθήκη στο λεξικό","allCaps":"Îα αγνοοÏνται όλες οι λέξεις σε κεφαλαία","dic_create":"ΔημιουÏγία","dic_delete":"ΔιαγÏαφή","dic_field_name":"Όνομα λεξικοÏ","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Μετονομασία","dic_restore":"Ανάκτηση","dictionariesTab":"Λεξικά","disable":"Disable SCAYT","emptyDic":"Το όνομα του Î»ÎµÎ¾Î¹ÎºÎ¿Ï Î´ÎµÎ½ Ï€Ïέπει να είναι κενό.","enable":"Enable SCAYT","ignore":"Αγνόησε το","ignoreAll":"Îα αγνοηθοÏν όλα","ignoreDomainNames":"Ignore Domain Names","langs":"Γλώσσες","languagesTab":"Γλώσσες","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"ΠεÏισσότεÏες Ï€Ïοτάσεις","opera_title":"Not supported by Opera","options":"Επιλογές","optionsTab":"Επιλογές","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"ΜοÏφές","panelTitle":"Στυλ ΜοÏφοποίησης","panelTitle1":"Στυλ Κομματιών","panelTitle2":"Στυλ Εν ΣειÏά","panelTitle3":"Στυλ Αντικειμένων"},"table":{"border":"Πάχος ΠεÏιγÏάμματος","caption":"Λεζάντα","cell":{"menu":"Κελί","insertBefore":"Εισαγωγή ÎšÎµÎ»Î¹Î¿Ï Î Ïιν","insertAfter":"Εισαγωγή ÎšÎµÎ»Î¹Î¿Ï ÎœÎµÏ„Î¬","deleteCell":"ΔιαγÏαφή Κελιών","merge":"Ενοποίηση Κελιών","mergeRight":"Συγχώνευση Με Δεξιά","mergeDown":"Συγχώνευση Με Κάτω","splitHorizontal":"ΟÏιζόντιο ΜοίÏασμα ΚελιοÏ","splitVertical":"ΚατακόÏυφο ΜοίÏασμα ΚελιοÏ","title":"Ιδιότητες ΚελιοÏ","cellType":"ΤÏπος ΚελιοÏ","rowSpan":"ΕÏÏος ΣειÏών","colSpan":"ΕÏÏος Στηλών","wordWrap":"Word Wrap","hAlign":"ΟÏιζόντια Στοίχιση","vAlign":"Κάθετη Στοίχιση","alignBaseline":"Baseline","bgColor":"ΧÏώμα Φόντου","borderColor":"ΧÏώμα ΠεÏιγÏάμματος","data":"Δεδομένα","header":"Κεφαλίδα","yes":"Îαι","no":"Όχι","invalidWidth":"Το πλάτος του ÎºÎµÎ»Î¹Î¿Ï Ï€Ïέπει να είναι ένας αÏιθμός.","invalidHeight":"Το Ïψος του ÎºÎµÎ»Î¹Î¿Ï Ï€Ïέπει να είναι ένας αÏιθμός.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Επιλέξτε"},"cellPad":"Γέμισμα κελιών","cellSpace":"Διάστημα κελιών","column":{"menu":"Στήλη","insertBefore":"Εισαγωγή Στήλης ΠÏιν","insertAfter":"Εισαγωγή ΣειÏάς Μετά","deleteColumn":"ΔιαγÏαφή Κολωνών"},"columns":"Κολώνες","deleteTable":"ΔιαγÏαφή πίνακα","headers":"Κεφαλίδες","headersBoth":"Και τα δÏο","headersColumn":"ΠÏώτη Στήλη","headersNone":"Κανένα","headersRow":"ΠÏώτη ΣειÏά","invalidBorder":"Το πάχος του πεÏιγÏάμματος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidCellPadding":"Το γέμισμα μέσα στα κελιά Ï€Ïέπει να είναι ένας θετικός αÏιθμός.","invalidCellSpacing":"Η απόσταση Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ κελιών Ï€Ïέπει να είναι ένας θετικός αÏιθμός.","invalidCols":"Ο αÏιθμός των στηλών Ï€Ïέπει να είναι μεγαλÏτεÏος από 0.","invalidHeight":"Το Ïψος του πίνακα Ï€Ïέπει να είναι ένας αÏιθμός.","invalidRows":"Ο αÏιθμός των σειÏών Ï€Ïέπει να είναι μεγαλÏτεÏος από 0.","invalidWidth":"Το πλάτος του πίνακα Ï€Ïέπει να είναι ένας αÏιθμός.","menu":"Ιδιότητες Πίνακα","row":{"menu":"ΣειÏά","insertBefore":"Εισαγωγή ΣειÏάς Από Πάνω","insertAfter":"Εισαγωγή ΣειÏάς Από Κάτω","deleteRow":"ΔιαγÏαφή ΓÏαμμών"},"rows":"ΓÏαμμές","summary":"ΠεÏίληψη","title":"Ιδιότητες Πίνακα","toolbar":"Πίνακας","widthPc":"τοις εκατό","widthPx":"pixels","widthUnit":"μονάδα πλάτους"},"undo":{"redo":"ΕπαναφοÏά","undo":"ΑναίÏεση"},"wsc":{"btnIgnore":"Αγνόηση","btnIgnoreAll":"Αγνόηση όλων","btnReplace":"Αντικατάσταση","btnReplaceAll":"Αντικατάσταση όλων","btnUndo":"ΑναίÏεση","changeTo":"Αλλαγή σε","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Δεν υπάÏχει εγκατεστημένος οÏθογÏάφος. Θέλετε να τον κατεβάσετε τώÏα;","manyChanges":"Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Άλλαξαν %1 λέξεις","noChanges":"Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Δεν άλλαξαν λέξεις","noMispell":"Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Δεν βÏέθηκαν λάθη","noSuggestions":"- Δεν υπάÏχουν Ï€Ïοτάσεις -","notAvailable":"Η υπηÏεσία δεν είναι διαθέσιμη αυτήν την στιγμή.","notInDic":"Δεν υπάÏχει στο λεξικό","oneChange":"Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Άλλαξε μια λέξη","progress":"Γίνεται οÏθογÏαφικός έλεγχος...","title":"ΟÏθογÏαφικός Έλεγχος","toolbar":"ΟÏθογÏαφικός Έλεγχος"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/en-au.js b/mod/ckeditor/vendors/ckeditor/lang/en-au.js
new file mode 100644
index 000000000..162b44d4d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/en-au.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-au']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/en-ca.js b/mod/ckeditor/vendors/ckeditor/lang/en-ca.js
new file mode 100644
index 000000000..c24da9728
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/en-ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-ca']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/en-gb.js b/mod/ckeditor/vendors/ckeditor/lang/en-gb.js
new file mode 100644
index 000000000..f8bd12978
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/en-gb.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-gb']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Drag to resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximise","minimize":"Minimise"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/en.js b/mod/ckeditor/vendors/ckeditor/lang/en.js
new file mode 100644
index 000000000..166cfc8d0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/en.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/eo.js b/mod/ckeditor/vendors/ckeditor/lang/eo.js
new file mode 100644
index 000000000..6d26e1454
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/eo.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eo']={"dir":"ltr","editor":"Redaktilo por Riĉiga Teksto","common":{"editorHelp":"Premu ALT 0 por helpilo","browseServer":"Foliumi en la Servilo","url":"URL","protocol":"Protokolo","upload":"AlÅuti","uploadSubmit":"Sendu al Servilo","image":"Bildo","flash":"FlaÅo","form":"Formularo","checkbox":"Markobutono","radio":"Radiobutono","textField":"Teksta kampo","textarea":"Teksta Areo","hiddenField":"KaÅita Kampo","button":"Butono","select":"Elekta Kampo","imageButton":"Bildbutono","notSet":"<DefaÅ­lta>","id":"Id","name":"Nomo","langDir":"Skribdirekto","langDirLtr":"De maldekstro dekstren (LTR)","langDirRtl":"De dekstro maldekstren (RTL)","langCode":"Lingva Kodo","longDescr":"URL de Longa Priskribo","cssClass":"Klasoj de Stilfolioj","advisoryTitle":"Priskriba Titolo","cssStyle":"Stilo","ok":"Akcepti","cancel":"Rezigni","close":"Fermi","preview":"Vidigi Aspekton","resize":"Movigi por ÅanÄi la grandon","generalTab":"Äœenerala","advancedTab":"Speciala","validateNumberFailed":"Tiu valoro ne estas nombro.","confirmNewPage":"La neregistritaj ÅanÄoj estas perdotaj. Ĉu vi certas, ke vi volas Åargi novan paÄon?","confirmCancel":"Iuj opcioj esta ÅanÄitaj. Ĉu vi certas, ke vi volas fermi la dialogon?","options":"Opcioj","target":"Celo","targetNew":"Nova Fenestro (_blank)","targetTop":"Supra Fenestro (_top)","targetSelf":"Sama Fenestro (_self)","targetParent":"Patra Fenestro (_parent)","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","styles":"Stilo","cssClasses":"Stilfoliaj Klasoj","width":"LarÄo","height":"Alto","align":"Äœisrandigo","alignLeft":"Maldekstre","alignRight":"Dekstre","alignCenter":"Centre","alignTop":"Supre","alignMiddle":"Centre","alignBottom":"Malsupre","invalidValue":"Nevalida Valoro","invalidHeight":"Alto devas esti nombro.","invalidWidth":"LarÄo devas esti nombro.","invalidCssLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aÅ­ sen valida CSSmezurunuo (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aÅ­ sen valida HTMLmezurunuo (px or %).","invalidInlineStyle":"La valoro indikita por la enlinia stilo devas konsisti el unu aÅ­ pluraj elementoj kun la formato de \"nomo : valoro\", apartigitaj per punktokomoj.","cssLengthTooltip":"Entajpu nombron por rastrumera valoro aÅ­ nombron kun valida CSSunuo (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nehavebla</span>"},"about":{"copy":"Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.","dlgTitle":"Pri CKEditor","help":"Kontroli $1 por helpo.","moreInfo":"Por informoj pri licenco, bonvolu viziti nian retpaÄaron:","title":"Pri CKEditor","userGuide":"CKEditor Uzindikoj"},"basicstyles":{"bold":"Grasa","italic":"Kursiva","strike":"Trastreko","subscript":"Suba indico","superscript":"Supra indico","underline":"Substreko"},"blockquote":{"toolbar":"Citaĵo"},"clipboard":{"copy":"Kopii","copyError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).","cut":"Eltondi","cutError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).","paste":"Interglui","pasteArea":"Intergluoareo","pasteMsg":"Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK","securityMsg":"Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poÅo. Bonvolu denove interglui la datenojn en tiun fenestron.","title":"Interglui"},"contextmenu":{"options":"Opcioj de Kunteksta Menuo"},"toolbar":{"toolbarCollapse":"Faldi la ilbreton","toolbarExpand":"Malfaldi la ilbreton","toolbarGroups":{"document":"Dokumento","clipboard":"PoÅo/Malfari","editing":"Redaktado","forms":"Formularoj","basicstyles":"Bazaj stiloj","paragraph":"Paragrafo","links":"Ligiloj","insert":"Enmeti","styles":"Stiloj","colors":"Koloroj","tools":"Iloj"},"toolbars":"Ilobretoj de la redaktilo"},"elementspath":{"eleLabel":"Vojo al Elementoj","eleTitle":"%1 elementoj"},"list":{"bulletedlist":"Bula Listo","numberedlist":"Numera Listo"},"indent":{"indent":"Pligrandigi KrommarÄenon","outdent":"Malpligrandigi KrommarÄenon"},"format":{"label":"Formato","panelTitle":"ParagrafFormato","tag_address":"Adreso","tag_div":"Normala (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normala","tag_pre":"Formatita"},"horizontalrule":{"toolbar":"Enmeti Horizontalan Linion"},"image":{"alertUrl":"Bonvolu tajpi la retadreson de la bildo","alt":"AnstataÅ­iga Teksto","border":"Bordero","btnUpload":"Sendu al Servilo","button2Img":"Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?","hSpace":"Horizontala Spaco","img2Button":"Ĉu vi volas transformi la selektitan bildon en bildbutonon?","infoTab":"Informoj pri Bildo","linkTab":"Ligilo","lockRatio":"Konservi Proporcion","menu":"Atributoj de Bildo","resetSize":"Origina Grando","title":"Atributoj de Bildo","titleButton":"Bildbutonaj Atributoj","upload":"AlÅuti","urlMissing":"La fontretadreso de la bildo mankas.","vSpace":"Vertikala Spaco","validateBorder":"La bordero devas esti entjera nombro.","validateHSpace":"La horizontala spaco devas esti entjera nombro.","validateVSpace":"La vertikala spaco devas esti entjera nombro."},"fakeobjects":{"anchor":"Ankro","flash":"FlaÅAnimacio","hiddenfield":"KaÅita kampo","iframe":"Enlinia Kadro (IFrame)","unknown":"Nekonata objekto"},"link":{"acccessKey":"Fulmoklavo","advanced":"Speciala","advisoryContentType":"Enhavotipo","advisoryTitle":"Priskriba Titolo","anchor":{"toolbar":"Ankro","menu":"Enmeti/ÅœanÄi Ankron","title":"Ankraj Atributoj","name":"Ankra Nomo","errorName":"Bv entajpi la ankran nomon","remove":"Forigi Ankron"},"anchorId":"Per Elementidentigilo","anchorName":"Per Ankronomo","charset":"Signaro de la Ligita Rimedo","cssClasses":"Klasoj de Stilfolioj","emailAddress":"RetpoÅto","emailBody":"MesaÄa korpo","emailSubject":"MesaÄa Temo","id":"Id","info":"Informoj pri la Ligilo","langCode":"Lingva Kodo","langDir":"Skribdirekto","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","menu":"ÅœanÄi Ligilon","name":"Nomo","noAnchors":"<Ne disponeblas ankroj en la dokumento>","noEmail":"Bonvolu entajpi la retpoÅtadreson","noUrl":"Bonvolu entajpi la URL-on","other":"<alia>","popupDependent":"Dependa (Netscape)","popupFeatures":"Atributoj de la Åœprucfenestro","popupFullScreen":"Tutekrane (IE)","popupLeft":"Maldekstra Pozicio","popupLocationBar":"Adresobreto","popupMenuBar":"Menubreto","popupResizable":"DimensiÅanÄebla","popupScrollBars":"Rulumskaloj","popupStatusBar":"Statobreto","popupToolbar":"Ilobreto","popupTop":"Supra Pozicio","rel":"Rilato","selectAnchor":"Elekti Ankron","styles":"Stilo","tabIndex":"Taba Indekso","target":"Celo","targetFrame":"<kadro>","targetFrameName":"Nomo de CelKadro","targetPopup":"<Åprucfenestro>","targetPopupName":"Nomo de Åœprucfenestro","title":"Ligilo","toAnchor":"Ankri en tiu ĉi paÄo","toEmail":"RetpoÅto","toUrl":"URL","toolbar":"Enmeti/ÅœanÄi Ligilon","type":"Tipo de Ligilo","unlink":"Forigi Ligilon","upload":"AlÅuti"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Pligrandigi","minimize":"Malgrandigi"},"pastetext":{"button":"Interglui kiel platan tekston","title":"Interglui kiel platan tekston"},"pastefromword":{"confirmCleanup":"La teksto, kiun vi volas interglui, Åajnas esti kopiita el Word. Ĉu vi deziras purigi Äin antaÅ­ intergluo?","error":"Ne eblis purigi la intergluitajn datenojn pro interna eraro","title":"Interglui el Word","toolbar":"Interglui el Word"},"removeformat":{"toolbar":"Forigi Formaton"},"sourcearea":{"toolbar":"Fonto"},"specialchar":{"options":"Opcioj pri Specialaj Signoj","title":"Selekti Specialan Signon","toolbar":"Enmeti Specialan Signon"},"scayt":{"about":"Pri OKDVT","aboutTab":"Pri","addWord":"Almeti la vorton","allCaps":"Ignori la vortojn skribitajn nur per ĉefliteroj","dic_create":"Krei","dic_delete":"Forigi","dic_field_name":"Vortaronomo","dic_info":"Komence la vortaro de la uzanto estas konservita en kuketo. Tamen la kuketgrando estas limigita. Kiam la vortaro de la uzanto atingas grandon, kiu ne plu ebligas konservi Äin en kuketo, tiam la vortaro povas esti konservata en niaj serviloj. Por konservi vian personan vortaron en nian servilon, vi devas indiki nomon por tiu vortaro. Se vi jam havas konservitan vortaron, bonvolu entajpi ties nomon kaj alklaki la restaÅ­rbutonon.","dic_rename":"Renomi","dic_restore":"RestaÅ­ri","dictionariesTab":"Vortaroj","disable":"Malebligi OKDVT","emptyDic":"La vortaronomo ne devus esti malplena.","enable":"Ebligi OKDVT","ignore":"Ignori","ignoreAll":"Ignori ĉion","ignoreDomainNames":"Ignori domajnajn nomojn","langs":"Lingvoj","languagesTab":"Lingvoj","mixedCase":"Ignori vortojn kun miksa uskleco","mixedWithDigits":"Ignori vortojn kun nombroj","moreSuggestions":"Pli da sugestoj","opera_title":"Ne subportata de Opera","options":"Opcioj","optionsTab":"Opcioj","title":"OrtografiKontrolado Dum Vi Tajpas (OKDVT)","toggle":"Baskuligi OKDVT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiloj","panelTitle":"Stiloj pri enpaÄigo","panelTitle1":"Stiloj de blokoj","panelTitle2":"Enliniaj Stiloj","panelTitle3":"Stiloj de objektoj"},"table":{"border":"Bordero","caption":"Tabeltitolo","cell":{"menu":"Ĉelo","insertBefore":"Enmeti Ĉelon AntaÅ­","insertAfter":"Enmeti Ĉelon Post","deleteCell":"Forigi la Ĉelojn","merge":"Kunfandi la Ĉelojn","mergeRight":"Kunfandi dekstren","mergeDown":"Kunfandi malsupren ","splitHorizontal":"Horizontale dividi","splitVertical":"Vertikale dividi","title":"Ĉelatributoj","cellType":"Ĉeltipo","rowSpan":"Kunfando de linioj","colSpan":"Kunfando de kolumnoj","wordWrap":"Cezuro","hAlign":"Horizontala Äisrandigo","vAlign":"Vertikala Äisrandigo","alignBaseline":"Malsupro de la teksto","bgColor":"Fonkoloro","borderColor":"Borderkoloro","data":"Datenoj","header":"Supra paÄotitolo","yes":"Jes","no":"No","invalidWidth":"ĈellarÄo devas esti nombro.","invalidHeight":"Ĉelalto devas esti nombro.","invalidRowSpan":"Kunfando de linioj devas esti entjera nombro.","invalidColSpan":"Kunfando de kolumnoj devas esti entjera nombro.","chooseColor":"Elektu"},"cellPad":"Interna MarÄeno de la ĉeloj","cellSpace":"Spaco inter la Ĉeloj","column":{"menu":"Kolumno","insertBefore":"Enmeti kolumnon antaÅ­","insertAfter":"Enmeti kolumnon post","deleteColumn":"Forigi Kolumnojn"},"columns":"Kolumnoj","deleteTable":"Forigi Tabelon","headers":"Supraj PaÄotitoloj","headersBoth":"AmbaÅ­","headersColumn":"Unua kolumno","headersNone":"Neniu","headersRow":"Unua linio","invalidBorder":"La bordergrando devas esti nombro.","invalidCellPadding":"La interna marÄeno en la ĉeloj devas esti pozitiva nombro.","invalidCellSpacing":"La spaco inter la ĉeloj devas esti pozitiva nombro.","invalidCols":"La nombro de la kolumnoj devas superi 0.","invalidHeight":"La tabelalto devas esti nombro.","invalidRows":"La nombro de la linioj devas superi 0.","invalidWidth":"La tabellarÄo devas esti nombro.","menu":"Atributoj de Tabelo","row":{"menu":"Linio","insertBefore":"Enmeti linion antaÅ­","insertAfter":"Enmeti linion post","deleteRow":"Forigi Liniojn"},"rows":"Linioj","summary":"Resumo","title":"Atributoj de Tabelo","toolbar":"Tabelo","widthPc":"elcentoj","widthPx":"Rastrumeroj","widthUnit":"unuo de larÄo"},"undo":{"redo":"Refari","undo":"Malfari"},"wsc":{"btnIgnore":"Ignori","btnIgnoreAll":"Ignori Ĉion","btnReplace":"AnstataÅ­igi","btnReplaceAll":"AnstataÅ­igi Ĉion","btnUndo":"Malfari","changeTo":"ÅœanÄi al","errorLoading":"Eraro en la servoelÅuto el la gastiga komputiko: %s.","ieSpellDownload":"Ortografikontrolilo ne instalita. Ĉu vi volas elÅuti Äin nun?","manyChanges":"Ortografikontrolado finita: %1 vortoj korektitaj","noChanges":"Ortografikontrolado finita: neniu vorto korektita","noMispell":"Ortografikontrolado finita: neniu eraro trovita","noSuggestions":"- Neniu propono -","notAvailable":"BedaÅ­rinde la servo ne funkcias nuntempe.","notInDic":"Ne trovita en la vortaro","oneChange":"Ortografikontrolado finita: unu vorto korektita","progress":"La ortografio estas kontrolata...","title":"Kontroli la ortografion","toolbar":"Kontroli la ortografion"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/es.js b/mod/ckeditor/vendors/ckeditor/lang/es.js
new file mode 100644
index 000000000..ca366dae7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/es.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['es']={"dir":"ltr","editor":"Editor de texto enriquecido","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de Verificación","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"Botón","select":"Campo de Selección","imageButton":"Botón Imagen","notSet":"<No definido>","id":"Id","name":"Nombre","langDir":"Orientación","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"Cód. de idioma","longDescr":"Descripción larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"Previsualización","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un número.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"Alineación","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","invalidValue":"Valor no válido","invalidHeight":"Altura debe ser un número.","invalidWidth":"Anchura debe ser un número.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o más pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Todos los derechos reservados.","dlgTitle":"Acerca de CKEditor","help":"Lea la $1 para resolver sus dudas.","moreInfo":"Para información de licencia, por favor visite nuestro sitio web:","title":"Acerca de CKEditor","userGuide":"Guía de usuario de CKEditor"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.","securityMsg":"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"contextmenu":{"options":"Opciones del menú contextual"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Párrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"elementspath":{"eleLabel":"Ruta de los elementos","eleTitle":"%1 elemento"},"list":{"bulletedlist":"Viñetas","numberedlist":"Numeración"},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Dirección","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"horizontalrule":{"toolbar":"Insertar Línea Horizontal"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botón de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botón de imagen?","infoTab":"Información de Imagen","linkTab":"Vínculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de Botón de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un número.","validateHSpace":"El espaciado horizontal debe ser un número.","validateVSpace":"El espaciado vertical debe ser un número."},"fakeobjects":{"anchor":"Ancla","flash":"Animación flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"Título","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"Dirección de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"Título del Mensaje","id":"Id","info":"Información de Vínculo","langCode":"Código idioma","langDir":"Orientación","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar Vínculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la dirección de e-mail","noUrl":"Por favor escriba el vínculo URL","other":"<otro>","popupDependent":"Dependiente (Netscape)","popupFeatures":"Características de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"Posición Izquierda","popupLocationBar":"Barra de ubicación","popupMenuBar":"Barra de Menú","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"Posición Derecha","rel":"Relación","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nombre del Marco Destino","targetPopup":"<ventana emergente>","targetPopupName":"Nombre de Ventana Emergente","title":"Vínculo","toAnchor":"Referencia en esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar Vínculo","type":"Tipo de vínculo","unlink":"Eliminar Vínculo","upload":"Cargar"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"pastefromword":{"confirmCleanup":"El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?","error":"No ha sido posible limpiar los datos debido a un error interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fuente HTML"},"specialchar":{"options":"Opciones de caracteres especiales","title":"Seleccione un caracter especial","toolbar":"Insertar Caracter Especial"},"scayt":{"about":"Acerca de Corrector","aboutTab":"Acerca de","addWord":"Añadir palabra","allCaps":"Omitir palabras en MAYÚSCULAS","dic_create":"Crear","dic_delete":"Borrar","dic_field_name":"Nombre del diccionario","dic_info":"Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar","dic_rename":"Renombrar","dic_restore":"Recuperar","dictionariesTab":"Diccionarios","disable":"Desactivar Corrector","emptyDic":"El nombre del diccionario no puede estar en blanco.","enable":"Activar Corrector","ignore":"Ignorar","ignoreAll":"Ignorar Todas","ignoreDomainNames":"Omitir nombres de dominio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palabras con combinación de mayúsculas y minúsculas","mixedWithDigits":"Omitir palabras con números","moreSuggestions":"Más sugerencias","opera_title":"No soportado en Opera","options":"Opciones","optionsTab":"Opciones","title":"Comprobar Ortografía Mientras Escribe","toggle":"Cambiar Corrector","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos para formatear","panelTitle1":"Estilos de párrafo","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de objeto"},"table":{"border":"Tamaño de Borde","caption":"Título","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"Alineación Horizontal","vAlign":"Alineación Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"Sí","no":"No","invalidWidth":"La anchura de celda debe ser un número.","invalidHeight":"La altura de celda debe ser un número.","invalidRowSpan":"La expansión de filas debe ser un número entero.","invalidColSpan":"La expansión de columnas debe ser un número entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un número.","invalidCellPadding":"El espaciado interior debe ser un número.","invalidCellSpacing":"El espaciado entre celdas debe ser un número.","invalidCols":"El número de columnas debe ser un número mayor que 0.","invalidHeight":"La altura de tabla debe ser un número.","invalidRows":"El número de filas debe ser un número mayor que 0.","invalidWidth":"La anchura de tabla debe ser un número.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"Síntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todo","btnReplace":"Reemplazar","btnReplaceAll":"Reemplazar Todo","btnUndo":"Deshacer","changeTo":"Cambiar a","errorLoading":"Error cargando la aplicación del servidor: %s.","ieSpellDownload":"Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?","manyChanges":"Control finalizado: se ha cambiado %1 palabras","noChanges":"Control finalizado: no se ha cambiado ninguna palabra","noMispell":"Control finalizado: no se encontraron errores","noSuggestions":"- No hay sugerencias -","notAvailable":"Lo sentimos pero el servicio no está disponible.","notInDic":"No se encuentra en el Diccionario","oneChange":"Control finalizado: se ha cambiado una palabra","progress":"Control de Ortografía en progreso...","title":"Comprobar ortografía","toolbar":"Ortografía"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/et.js b/mod/ckeditor/vendors/ckeditor/lang/et.js
new file mode 100644
index 000000000..5c10bd32b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/et.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['et']={"dir":"ltr","editor":"Rikkalik tekstiredaktor","common":{"editorHelp":"Abi saamiseks vajuta ALT 0","browseServer":"Serveri sirvimine","url":"URL","protocol":"Protokoll","upload":"Laadi üles","uploadSubmit":"Saada serverisse","image":"Pilt","flash":"Flash","form":"Vorm","checkbox":"Märkeruut","radio":"Raadionupp","textField":"Tekstilahter","textarea":"Tekstiala","hiddenField":"Varjatud lahter","button":"Nupp","select":"Valiklahter","imageButton":"Piltnupp","notSet":"<määramata>","id":"ID","name":"Nimi","langDir":"Keele suund","langDirLtr":"Vasakult paremale (LTR)","langDirRtl":"Paremalt vasakule (RTL)","langCode":"Keele kood","longDescr":"Pikk kirjeldus URL","cssClass":"Stiilistiku klassid","advisoryTitle":"Soovituslik pealkiri","cssStyle":"Laad","ok":"OK","cancel":"Loobu","close":"Sulge","preview":"Eelvaade","resize":"Suuruse muutmiseks lohista","generalTab":"Üldine","advancedTab":"Täpsemalt","validateNumberFailed":"See väärtus pole number.","confirmNewPage":"Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?","confirmCancel":"Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?","options":"Valikud","target":"Sihtkoht","targetNew":"Uus aken (_blank)","targetTop":"Kõige ülemine aken (_top)","targetSelf":"Sama aken (_self)","targetParent":"Vanemaken (_parent)","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","styles":"Stiili","cssClasses":"Stiililehe klassid","width":"Laius","height":"Kõrgus","align":"Joondus","alignLeft":"Vasak","alignRight":"Paremale","alignCenter":"Kesk","alignTop":"Üles","alignMiddle":"Keskele","alignBottom":"Alla","invalidValue":"Invalid value.","invalidHeight":"Kõrgus peab olema number.","invalidWidth":"Laius peab olema number.","invalidCssLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.","invalidHtmlLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.","invalidInlineStyle":"Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: \"nimi : väärtus\".","cssLengthTooltip":"Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).","unavailable":"%1<span class=\"cke_accessibility\">, pole saadaval</span>"},"about":{"copy":"Copyright &copy; $1. Kõik õigused kaitstud.","dlgTitle":"CKEditorist","help":"Abi jaoks vaata $1.","moreInfo":"Litsentsi andmed leiab meie veebilehelt:","title":"CKEditorist","userGuide":"CKEditori kasutusjuhendit"},"basicstyles":{"bold":"Paks","italic":"Kursiiv","strike":"Läbijoonitud","subscript":"Allindeks","superscript":"Ülaindeks","underline":"Allajoonitud"},"blockquote":{"toolbar":"Blokktsitaat"},"clipboard":{"copy":"Kopeeri","copyError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).","cut":"Lõika","cutError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).","paste":"Aseta","pasteArea":"Asetamise ala","pasteMsg":"Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.","securityMsg":"Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.","title":"Asetamine"},"contextmenu":{"options":"Kontekstimenüü valikud"},"toolbar":{"toolbarCollapse":"Tööriistariba peitmine","toolbarExpand":"Tööriistariba näitamine","toolbarGroups":{"document":"Dokument","clipboard":"Lõikelaud/tagasivõtmine","editing":"Muutmine","forms":"Vormid","basicstyles":"Põhistiilid","paragraph":"Lõik","links":"Lingid","insert":"Sisesta","styles":"Stiilid","colors":"Värvid","tools":"Tööriistad"},"toolbars":"Redaktori tööriistaribad"},"elementspath":{"eleLabel":"Elementide asukoht","eleTitle":"%1 element"},"list":{"bulletedlist":"Punktloend","numberedlist":"Numberloend"},"indent":{"indent":"Taande suurendamine","outdent":"Taande vähendamine"},"format":{"label":"Vorming","panelTitle":"Vorming","tag_address":"Aadress","tag_div":"Tavaline (DIV)","tag_h1":"Pealkiri 1","tag_h2":"Pealkiri 2","tag_h3":"Pealkiri 3","tag_h4":"Pealkiri 4","tag_h5":"Pealkiri 5","tag_h6":"Pealkiri 6","tag_p":"Tavaline","tag_pre":"Vormindatud"},"horizontalrule":{"toolbar":"Horisontaaljoone sisestamine"},"image":{"alertUrl":"Palun kirjuta pildi URL","alt":"Alternatiivne tekst","border":"Joon","btnUpload":"Saada serverisse","button2Img":"Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?","hSpace":"H. vaheruum","img2Button":"Kas tahad teisendada valitud tavalise pildi pildiga nupuks?","infoTab":"Pildi info","linkTab":"Link","lockRatio":"Lukusta kuvasuhe","menu":"Pildi omadused","resetSize":"Lähtesta suurus","title":"Pildi omadused","titleButton":"Piltnupu omadused","upload":"Lae üles","urlMissing":"Pildi lähte-URL on puudu.","vSpace":"V. vaheruum","validateBorder":"Äärise laius peab olema täisarv.","validateHSpace":"Horisontaalne vaheruum peab olema täisarv.","validateVSpace":"Vertikaalne vaheruum peab olema täisarv."},"fakeobjects":{"anchor":"Ankur","flash":"Flashi animatsioon","hiddenfield":"Varjatud väli","iframe":"IFrame","unknown":"Tundmatu objekt"},"link":{"acccessKey":"Juurdepääsu võti","advanced":"Täpsemalt","advisoryContentType":"Juhendava sisu tüüp","advisoryTitle":"Juhendav tiitel","anchor":{"toolbar":"Ankru sisestamine/muutmine","menu":"Ankru omadused","title":"Ankru omadused","name":"Ankru nimi","errorName":"Palun sisesta ankru nimi","remove":"Eemalda ankur"},"anchorId":"Elemendi id järgi","anchorName":"Ankru nime järgi","charset":"Lingitud ressursi märgistik","cssClasses":"Stiilistiku klassid","emailAddress":"E-posti aadress","emailBody":"Sõnumi tekst","emailSubject":"Sõnumi teema","id":"ID","info":"Lingi info","langCode":"Keele suund","langDir":"Keele suund","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","menu":"Muuda linki","name":"Nimi","noAnchors":"(Selles dokumendis pole ankruid)","noEmail":"Palun kirjuta e-posti aadress","noUrl":"Palun kirjuta lingi URL","other":"<muu>","popupDependent":"Sõltuv (Netscape)","popupFeatures":"Hüpikakna omadused","popupFullScreen":"Täisekraan (IE)","popupLeft":"Vasak asukoht","popupLocationBar":"Aadressiriba","popupMenuBar":"Menüüriba","popupResizable":"Suurust saab muuta","popupScrollBars":"Kerimisribad","popupStatusBar":"Olekuriba","popupToolbar":"Tööriistariba","popupTop":"Ülemine asukoht","rel":"Suhe","selectAnchor":"Vali ankur","styles":"Laad","tabIndex":"Tab indeks","target":"Sihtkoht","targetFrame":"<raam>","targetFrameName":"Sihtmärk raami nimi","targetPopup":"<hüpikaken>","targetPopupName":"Hüpikakna nimi","title":"Link","toAnchor":"Ankur sellel lehel","toEmail":"E-post","toUrl":"URL","toolbar":"Lingi lisamine/muutmine","type":"Lingi liik","unlink":"Lingi eemaldamine","upload":"Lae üles"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimeerimine","minimize":"Minimeerimine"},"pastetext":{"button":"Asetamine tavalise tekstina","title":"Asetamine tavalise tekstina"},"pastefromword":{"confirmCleanup":"Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?","error":"Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik","title":"Asetamine Wordist","toolbar":"Asetamine Wordist"},"removeformat":{"toolbar":"Vormingu eemaldamine"},"sourcearea":{"toolbar":"Lähtekood"},"specialchar":{"options":"Erimärkide valikud","title":"Erimärgi valimine","toolbar":"Erimärgi sisestamine"},"scayt":{"about":"SCAYT-ist lähemalt","aboutTab":"Lähemalt","addWord":"Lisa sõna","allCaps":"Läbivate suurtähtedega sõnade eiramine","dic_create":"Loo","dic_delete":"Kustuta","dic_field_name":"Sõnaraamatu nimi","dic_info":"Alguses säilitatakse kasutaja sõnaraamatut küpsises. Küpsise suurus on piiratud. Pärast sõnaraamatu kasvamist nii suureks, et see küpsisesse ei mahu, võib sõnaraamatut hoida meie serveris. Oma isikliku sõnaraamatu hoidmiseks meie serveris pead andma sellele nime. Kui sa juba oled sõnaraamatu salvestanud, sisesta selle nimi ja klõpsa taastamise nupule.","dic_rename":"Nimeta ümber","dic_restore":"Taasta","dictionariesTab":"Sõnaraamatud","disable":"SCAYT keelatud","emptyDic":"Sõnaraamatu nimi ei tohi olla tühi.","enable":"SCAYT lubatud","ignore":"Eira","ignoreAll":"Eira kõiki","ignoreDomainNames":"Domeeninimede eiramine","langs":"Keeled","languagesTab":"Keeled","mixedCase":"Tavapäratu tõstuga sõnade eiramine","mixedWithDigits":"Numbreid sisaldavate sõnade eiramine","moreSuggestions":"Veel soovitusi","opera_title":"Operas pole toetatud","options":"Valikud","optionsTab":"Valikud","title":"Õigekirjakontroll kirjutamise ajal","toggle":"SCAYT sisse/välja lülitamine","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiil","panelTitle":"Vormindusstiilid","panelTitle1":"Blokkstiilid","panelTitle2":"Reasisesed stiilid","panelTitle3":"Objektistiilid"},"table":{"border":"Joone suurus","caption":"Tabeli tiitel","cell":{"menu":"Lahter","insertBefore":"Sisesta lahter enne","insertAfter":"Sisesta lahter peale","deleteCell":"Eemalda lahtrid","merge":"Ühenda lahtrid","mergeRight":"Ühenda paremale","mergeDown":"Ühenda alla","splitHorizontal":"Poolita lahter horisontaalselt","splitVertical":"Poolita lahter vertikaalselt","title":"Lahtri omadused","cellType":"Lahtri liik","rowSpan":"Ridade vahe","colSpan":"Tulpade vahe","wordWrap":"Sõnade murdmine","hAlign":"Horisontaalne joondus","vAlign":"Vertikaalne joondus","alignBaseline":"Baasjoon","bgColor":"Tausta värv","borderColor":"Äärise värv","data":"Andmed","header":"Päis","yes":"Jah","no":"Ei","invalidWidth":"Lahtri laius peab olema number.","invalidHeight":"Lahtri kõrgus peab olema number.","invalidRowSpan":"Ridade vahe peab olema täisarv.","invalidColSpan":"Tulpade vahe peab olema täisarv.","chooseColor":"Vali"},"cellPad":"Lahtri täidis","cellSpace":"Lahtri vahe","column":{"menu":"Veerg","insertBefore":"Sisesta veerg enne","insertAfter":"Sisesta veerg peale","deleteColumn":"Eemalda veerud"},"columns":"Veerud","deleteTable":"Kustuta tabel","headers":"Päised","headersBoth":"Mõlemad","headersColumn":"Esimene tulp","headersNone":"Puudub","headersRow":"Esimene rida","invalidBorder":"Äärise suurus peab olema number.","invalidCellPadding":"Lahtrite polsterdus (padding) peab olema positiivne arv.","invalidCellSpacing":"Lahtrite vahe peab olema positiivne arv.","invalidCols":"Tulpade arv peab olema nullist suurem.","invalidHeight":"Tabeli kõrgus peab olema number.","invalidRows":"Ridade arv peab olema nullist suurem.","invalidWidth":"Tabeli laius peab olema number.","menu":"Tabeli omadused","row":{"menu":"Rida","insertBefore":"Sisesta rida enne","insertAfter":"Sisesta rida peale","deleteRow":"Eemalda read"},"rows":"Read","summary":"Kokkuvõte","title":"Tabeli omadused","toolbar":"Tabel","widthPc":"protsenti","widthPx":"pikslit","widthUnit":"laiuse ühik"},"undo":{"redo":"Toimingu kordamine","undo":"Tagasivõtmine"},"wsc":{"btnIgnore":"Ignoreeri","btnIgnoreAll":"Ignoreeri kõiki","btnReplace":"Asenda","btnReplaceAll":"Asenda kõik","btnUndo":"Võta tagasi","changeTo":"Muuda","errorLoading":"Viga rakenduse teenushosti laadimisel: %s.","ieSpellDownload":"Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?","manyChanges":"Õigekirja kontroll sooritatud: %1 sõna muudetud","noChanges":"Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud","noMispell":"Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud","noSuggestions":"- Soovitused puuduvad -","notAvailable":"Kahjuks ei ole teenus praegu saadaval.","notInDic":"Puudub sõnastikust","oneChange":"Õigekirja kontroll sooritatud: üks sõna muudeti","progress":"Toimub õigekirja kontroll...","title":"Õigekirjakontroll","toolbar":"Õigekirjakontroll"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/eu.js b/mod/ckeditor/vendors/ckeditor/lang/eu.js
new file mode 100644
index 000000000..17a0e2af6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/eu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eu']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Zerbitzaria arakatu","url":"URL","protocol":"Protokoloa","upload":"Gora kargatu","uploadSubmit":"Zerbitzarira bidalia","image":"Irudia","flash":"Flasha","form":"Formularioa","checkbox":"Kontrol-laukia","radio":"Aukera-botoia","textField":"Testu Eremua","textarea":"Testu-area","hiddenField":"Ezkutuko Eremua","button":"Botoia","select":"Hautespen Eremua","imageButton":"Irudi Botoia","notSet":"<Ezarri gabe>","id":"Id","name":"Izena","langDir":"Hizkuntzaren Norabidea","langDirLtr":"Ezkerretik Eskumara(LTR)","langDirRtl":"Eskumatik Ezkerrera (RTL)","langCode":"Hizkuntza Kodea","longDescr":"URL Deskribapen Luzea","cssClass":"Estilo-orriko Klaseak","advisoryTitle":"Izenburua","cssStyle":"Estiloa","ok":"Ados","cancel":"Utzi","close":"Close","preview":"Aurrebista","resize":"Arrastatu tamaina aldatzeko","generalTab":"Orokorra","advancedTab":"Aurreratua","validateNumberFailed":"Balio hau ez da zenbaki bat.","confirmNewPage":"Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?","confirmCancel":"Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?","options":"Aukerak","target":"Target (Helburua)","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","styles":"Estiloa","cssClasses":"Estilo-orriko Klaseak","width":"Zabalera","height":"Altuera","align":"Lerrokatu","alignLeft":"Ezkerrera","alignRight":"Eskuman","alignCenter":"Erdian","alignTop":"Goian","alignMiddle":"Erdian","alignBottom":"Behean","invalidValue":"Invalid value.","invalidHeight":"Altuera zenbaki bat izan behar da.","invalidWidth":"Zabalera zenbaki bat izan behar da.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, erabilezina</span>"},"about":{"copy":"Copyright &copy; $1. Eskubide guztiak erreserbaturik.","dlgTitle":"CKEditor(r)i buruz","help":"Check $1 for help.","moreInfo":"Lizentziari buruzko informazioa gure webgunean:","title":"CKEditor(r)i buruz","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Lodia","italic":"Etzana","strike":"Marratua","subscript":"Azpi-indize","superscript":"Goi-indize","underline":"Azpimarratu"},"blockquote":{"toolbar":"Aipamen blokea"},"clipboard":{"copy":"Kopiatu","copyError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).","cut":"Ebaki","cutError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).","paste":"Itsatsi","pasteArea":"Paste Area","pasteMsg":"Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.","securityMsg":"Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.","title":"Itsatsi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 elementua"},"list":{"bulletedlist":"Buletdun Zerrenda","numberedlist":"Zenbakidun Zerrenda"},"indent":{"indent":"Handitu Koska","outdent":"Txikitu Koska"},"format":{"label":"Formatua","panelTitle":"Formatua","tag_address":"Helbidea","tag_div":"Paragrafoa (DIV)","tag_h1":"Izenburua 1","tag_h2":"Izenburua 2","tag_h3":"Izenburua 3","tag_h4":"Izenburua 4","tag_h5":"Izenburua 5","tag_h6":"Izenburua 6","tag_p":"Arrunta","tag_pre":"Formateatua"},"horizontalrule":{"toolbar":"Txertatu Marra Horizontala"},"image":{"alertUrl":"Mesedez Irudiaren URLa idatzi","alt":"Ordezko Testua","border":"Ertza","btnUpload":"Zerbitzarira bidalia","button2Img":"Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?","hSpace":"HSpace","img2Button":"Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?","infoTab":"Irudi informazioa","linkTab":"Esteka","lockRatio":"Erlazioa Blokeatu","menu":"Irudi Ezaugarriak","resetSize":"Tamaina Berrezarri","title":"Irudi Ezaugarriak","titleButton":"Irudi Botoiaren Ezaugarriak","upload":"Gora Kargatu","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Aingura","flash":"Flash Animazioa","hiddenfield":"Ezkutuko Eremua","iframe":"IFrame","unknown":"Objektu ezezaguna"},"link":{"acccessKey":"Sarbide-gakoa","advanced":"Aurreratua","advisoryContentType":"Eduki Mota (Content Type)","advisoryTitle":"Izenburua","anchor":{"toolbar":"Aingura","menu":"Ainguraren Ezaugarriak","title":"Ainguraren Ezaugarriak","name":"Ainguraren Izena","errorName":"Idatzi ainguraren izena","remove":"Remove Anchor"},"anchorId":"Elementuaren ID-gatik","anchorName":"Aingura izenagatik","charset":"Estekatutako Karaktere Multzoa","cssClasses":"Estilo-orriko Klaseak","emailAddress":"ePosta Helbidea","emailBody":"Mezuaren Gorputza","emailSubject":"Mezuaren Gaia","id":"Id","info":"Estekaren Informazioa","langCode":"Hizkuntzaren Norabidea","langDir":"Hizkuntzaren Norabidea","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","menu":"Aldatu Esteka","name":"Izena","noAnchors":"(Ez daude aingurak eskuragarri dokumentuan)","noEmail":"Mesedez ePosta helbidea idatzi","noUrl":"Mesedez URL esteka idatzi","other":"<other>","popupDependent":"Menpekoa (Netscape)","popupFeatures":"Popup Leihoaren Ezaugarriak","popupFullScreen":"Pantaila Osoa (IE)","popupLeft":"Ezkerreko Posizioa","popupLocationBar":"Kokaleku Barra","popupMenuBar":"Menu Barra","popupResizable":"Tamaina Aldakorra","popupScrollBars":"Korritze Barrak","popupStatusBar":"Egoera Barra","popupToolbar":"Tresna Barra","popupTop":"Goiko Posizioa","rel":"Relationship","selectAnchor":"Aingura bat hautatu","styles":"Estiloa","tabIndex":"Tabulazio Indizea","target":"Target (Helburua)","targetFrame":"<marko>","targetFrameName":"Marko Helburuaren Izena","targetPopup":"<popup leihoa>","targetPopupName":"Popup Leihoaren Izena","title":"Esteka","toAnchor":"Aingura orrialde honetan","toEmail":"ePosta","toUrl":"URL","toolbar":"Txertatu/Editatu Esteka","type":"Esteka Mota","unlink":"Kendu Esteka","upload":"Gora kargatu"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximizatu","minimize":"Minimize"},"pastetext":{"button":"Testu Arrunta bezala Itsatsi","title":"Testu Arrunta bezala Itsatsi"},"pastefromword":{"confirmCleanup":"Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Itsatsi Word-etik","toolbar":"Itsatsi Word-etik"},"removeformat":{"toolbar":"Kendu Formatua"},"sourcearea":{"toolbar":"HTML Iturburua"},"specialchar":{"options":"Special Character Options","title":"Karaktere Berezia Aukeratu","toolbar":"Txertatu Karaktere Berezia"},"scayt":{"about":"SCAYTi buruz","aboutTab":"Honi buruz","addWord":"Hitza Gehitu","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Hiztegiak","disable":"Desgaitu SCAYT","emptyDic":"Hiztegiaren izena ezin da hutsik egon.","enable":"Gaitu SCAYT","ignore":"Baztertu","ignoreAll":"Denak baztertu","ignoreDomainNames":"Ignore Domain Names","langs":"Hizkuntzak","languagesTab":"Hizkuntzak","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Iradokizun gehiago","opera_title":"Not supported by Opera","options":"Aukerak","optionsTab":"Aukerak","title":"Ortografia Zuzenketa Idatzi Ahala (SCAYT)","toggle":"SCAYT aldatu","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estiloa","panelTitle":"Formatting Styles","panelTitle1":"Bloke Estiloak","panelTitle2":"Inline Estiloak","panelTitle3":"Objektu Estiloak"},"table":{"border":"Ertzaren Zabalera","caption":"Epigrafea","cell":{"menu":"Gelaxka","insertBefore":"Txertatu Gelaxka Aurretik","insertAfter":"Txertatu Gelaxka Ostean","deleteCell":"Kendu Gelaxkak","merge":"Batu Gelaxkak","mergeRight":"Elkartu Eskumara","mergeDown":"Elkartu Behera","splitHorizontal":"Banatu Gelaxkak Horizontalki","splitVertical":"Banatu Gelaxkak Bertikalki","title":"Gelaxken Ezaugarriak","cellType":"Gelaxka Mota","rowSpan":"Hedatutako Lerroak","colSpan":"Hedatutako Zutabeak","wordWrap":"Itzulbira","hAlign":"Lerrokatze Horizontala","vAlign":"Lerrokatze Bertikala","alignBaseline":"Oinarri-lerroan","bgColor":"Fondoaren Kolorea","borderColor":"Ertzaren Kolorea","data":"Data","header":"Goiburua","yes":"Bai","no":"Ez","invalidWidth":"Gelaxkaren zabalera zenbaki bat izan behar da.","invalidHeight":"Gelaxkaren altuera zenbaki bat izan behar da.","invalidRowSpan":"Lerroen hedapena zenbaki osoa izan behar da.","invalidColSpan":"Zutabeen hedapena zenbaki osoa izan behar da.","chooseColor":"Choose"},"cellPad":"Gelaxken betegarria","cellSpace":"Gelaxka arteko tartea","column":{"menu":"Zutabea","insertBefore":"Txertatu Zutabea Aurretik","insertAfter":"Txertatu Zutabea Ostean","deleteColumn":"Ezabatu Zutabeak"},"columns":"Zutabeak","deleteTable":"Ezabatu Taula","headers":"Goiburuak","headersBoth":"Biak","headersColumn":"Lehen zutabea","headersNone":"Bat ere ez","headersRow":"Lehen lerroa","invalidBorder":"Ertzaren tamaina zenbaki bat izan behar da.","invalidCellPadding":"Gelaxken betegarria zenbaki bat izan behar da.","invalidCellSpacing":"Gelaxka arteko tartea zenbaki bat izan behar da.","invalidCols":"Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidHeight":"Taularen altuera zenbaki bat izan behar da.","invalidRows":"Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidWidth":"Taularen zabalera zenbaki bat izan behar da.","menu":"Taularen Ezaugarriak","row":{"menu":"Lerroa","insertBefore":"Txertatu Lerroa Aurretik","insertAfter":"Txertatu Lerroa Ostean","deleteRow":"Ezabatu Lerroak"},"rows":"Lerroak","summary":"Laburpena","title":"Taularen Ezaugarriak","toolbar":"Taula","widthPc":"ehuneko","widthPx":"pixel","widthUnit":"width unit"},"undo":{"redo":"Berregin","undo":"Desegin"},"wsc":{"btnIgnore":"Ezikusi","btnIgnoreAll":"Denak Ezikusi","btnReplace":"Ordezkatu","btnReplaceAll":"Denak Ordezkatu","btnUndo":"Desegin","changeTo":"Honekin ordezkatu","errorLoading":"Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.","ieSpellDownload":"Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?","manyChanges":"Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira","noChanges":"Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu","noMispell":"Zuzenketa ortografikoa bukatuta: Akatsik ez","noSuggestions":"- Iradokizunik ez -","notAvailable":"Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.","notInDic":"Ez dago hiztegian","oneChange":"Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da","progress":"Zuzenketa ortografikoa martxan...","title":"Ortografia zuzenketa","toolbar":"Ortografia"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/fa.js b/mod/ckeditor/vendors/ckeditor/lang/fa.js
new file mode 100644
index 000000000..5349144c7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/fa.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fa']={"dir":"rtl","editor":"ویرایشگر متن غنی","common":{"editorHelp":"کلید Alt+0 را برای راهنمایی Ø¨ÙØ´Ø§Ø±ÛŒØ¯","browseServer":"Ùهرستنمایی سرور","url":"URL","protocol":"پروتکل","upload":"انتقال به سرور","uploadSubmit":"به سرور Ø¨ÙØ±Ø³Øª","image":"تصویر","flash":"Ùلش","form":"ÙØ±Ù…","checkbox":"خانهٴ گزینهای","radio":"دکمهٴ رادیویی","textField":"Ùیلد متنی","textarea":"ناحیهٴ متنی","hiddenField":"Ùیلد پنهان","button":"دکمه","select":"Ùیلد چندگزینهای","imageButton":"دکمهٴ تصویری","notSet":"<تعین نشده>","id":"شناسه","name":"نام","langDir":"جهتنمای زبان","langDirLtr":"Ú†Ù¾ به راست (LTR)","langDirRtl":"راست به Ú†Ù¾ (RTL)","langCode":"کد زبان","longDescr":"URL توصی٠طولانی","cssClass":"کلاسهای شیوهنامه(Stylesheet)","advisoryTitle":"عنوان Ú©Ù…Ú©ÛŒ","cssStyle":"شیوه(style)","ok":"پذیرش","cancel":"انصراÙ","close":"بستن","preview":"پیشنمایش","resize":"کشیدن برای تغییر اندازه","generalTab":"عمومی","advancedTab":"Ù¾ÛŒØ´Ø±ÙØªÙ‡","validateNumberFailed":"این مقدار یک عدد نیست.","confirmNewPage":"هر تغییر ایجاد شدهی ذخیره نشده از بین خواهد Ø±ÙØª. آیا اطمینان دارید Ú©Ù‡ قصد بارگیری ØµÙØ­Ù‡ جدیدی را دارید؟","confirmCancel":"برخی از گزینهها تغییر کردهاند. آیا واقعا قصد بستن این پنجره را دارید؟","options":"گزینهها","target":"مسیر","targetNew":"پنجره جدید (_blank)","targetTop":"بالاترین پنجره (_top)","targetSelf":"همان پنجره (_self)","targetParent":"پنجره والد (_parent)","langDirLTR":"Ú†Ù¾ به راست (LTR)","langDirRTL":"راست به Ú†Ù¾ (RTL)","styles":"سبک","cssClasses":"کلاسهای شیوهنامه","width":"پهنا","height":"درازا","align":"چینش","alignLeft":"Ú†Ù¾","alignRight":"راست","alignCenter":"وسط","alignTop":"بالا","alignMiddle":"وسط","alignBottom":"پائین","invalidValue":"Invalid value.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ باید یک عدد باشد.","invalidWidth":"پهنا باید یک عدد باشد.","invalidCssLength":"عدد تعیین شده برای Ùیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"عدد تعیین شده برای Ùیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).","invalidInlineStyle":"عدد تعیین شده برای سبک درونخطی(Inline Style) باید دارای یک یا چند چندتایی با Ø´Ú©Ù„ÛŒ شبیه \"name : value\" Ú©Ù‡ باید با یک \",\"(semi-colons) از هم جدا شوند.","cssLengthTooltip":"یک عدد برای یک مقدار بر حسب پیکسل Ùˆ یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">ØŒ غیر قابل دسترس</span>"},"about":{"copy":"حق نشر &copy; $1. کلیه حقوق محÙوظ است.","dlgTitle":"درباره CKEditor","help":"بررسی $1 برای راهنمایی.","moreInfo":"برای کسب اطلاعات مجوز Ù„Ø·ÙØ§ به وب سایت ما مراجعه کنید:","title":"درباره CKEditor","userGuide":"راهنمای کاربران CKEditor"},"basicstyles":{"bold":"درشت","italic":"خمیده","strike":"میانخط","subscript":"زیرنویس","superscript":"بالانویس","underline":"زیرخطدار"},"blockquote":{"toolbar":"بلوک نقل قول"},"clipboard":{"copy":"Ú©Ù¾ÛŒ","copyError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای Ú©Ù¾ÛŒ کردن را انجام دهد. Ù„Ø·ÙØ§ با دکمههای ØµÙØ­Ù‡ کلید این کار را انجام دهید (Ctrl/Cmd+C).","cut":"برش","cutError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. Ù„Ø·ÙØ§ با دکمههای ØµÙØ­Ù‡ کلید این کار را انجام دهید (Ctrl/Cmd+X).","paste":"چسباندن","pasteArea":"محل چسباندن","pasteMsg":"Ù„Ø·ÙØ§ متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید Ùˆ <STRONG>پذیرش</STRONG> را بزنید.","securityMsg":"به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.","title":"چسباندن"},"contextmenu":{"options":"گزینههای منوی زمینه"},"toolbar":{"toolbarCollapse":"بستن نوار ابزار","toolbarExpand":"بازکردن نوار ابزار","toolbarGroups":{"document":"سند","clipboard":"Ø­Ø§ÙØ¸Ù‡ موقت/برگشت","editing":"در حال ویرایش","forms":"ÙØ±Ù…ها","basicstyles":"شیوههای پایه","paragraph":"بند","links":"پیوندها","insert":"ورود","styles":"شیوهها","colors":"رنگها","tools":"ابزارها"},"toolbars":"نوار ابزار"},"elementspath":{"eleLabel":"مسیر عناصر","eleTitle":"%1 عنصر"},"list":{"bulletedlist":"Ùهرست نقطهای","numberedlist":"Ùهرست شمارهدار"},"indent":{"indent":"Ø§ÙØ²Ø§ÛŒØ´ ØªÙˆØ±ÙØªÚ¯ÛŒ","outdent":"کاهش ØªÙˆØ±ÙØªÚ¯ÛŒ"},"format":{"label":"ÙØ±Ù…ت","panelTitle":"ÙØ±Ù…ت","tag_address":"آدرس","tag_div":"بند","tag_h1":"سرنویس 1","tag_h2":"سرنویس 2","tag_h3":"سرنویس 3","tag_h4":"سرنویس 4","tag_h5":"سرنویس 5","tag_h6":"سرنویس 6","tag_p":"نرمال","tag_pre":"ÙØ±Ù…ت شده"},"horizontalrule":{"toolbar":"گنجاندن خط اÙÙ‚ÛŒ"},"image":{"alertUrl":"Ù„Ø·ÙØ§ URL تصویر را بنویسید","alt":"متن جایگزین","border":"لبه","btnUpload":"به سرور Ø¨ÙØ±Ø³Øª","button2Img":"آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید؟","hSpace":"ÙØ§ØµÙ„هٴ اÙÙ‚ÛŒ","img2Button":"آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید؟","infoTab":"اطلاعات تصویر","linkTab":"پیوند","lockRatio":"Ù‚ÙÙ„ کردن نسبت","menu":"ویژگیهای تصویر","resetSize":"بازنشانی اندازه","title":"ویژگیهای تصویر","titleButton":"ویژگیهای دکمهٴ تصویری","upload":"انتقال به سرور","urlMissing":"آدرس URL اصلی تصویر ÛŒØ§ÙØª نشد.","vSpace":"ÙØ§ØµÙ„هٴ عمودی","validateBorder":"مقدار خطوط باید یک عدد باشد.","validateHSpace":"مقدار ÙØ§ØµÙ„هگذاری اÙÙ‚ÛŒ باید یک عدد باشد.","validateVSpace":"مقدار ÙØ§ØµÙ„هگذاری عمودی باید یک عدد باشد."},"fakeobjects":{"anchor":"لنگر","flash":"انیمشن Ùلش","hiddenfield":"Ùیلد پنهان","iframe":"IFrame","unknown":"شیء ناشناخته"},"link":{"acccessKey":"کلید دستیابی","advanced":"Ù¾ÛŒØ´Ø±ÙØªÙ‡","advisoryContentType":"نوع محتوای Ú©Ù…Ú©ÛŒ","advisoryTitle":"عنوان Ú©Ù…Ú©ÛŒ","anchor":{"toolbar":"گنجاندن/ویرایش لنگر","menu":"ویژگیهای لنگر","title":"ویژگیهای لنگر","name":"نام لنگر","errorName":"Ù„Ø·ÙØ§ نام لنگر را بنویسید","remove":"حذ٠لنگر"},"anchorId":"با شناسهٴ المان","anchorName":"با نام لنگر","charset":"نویسهگان منبع پیوند شده","cssClasses":"کلاسهای شیوهنامه(Stylesheet)","emailAddress":"نشانی پست الکترونیکی","emailBody":"متن پیام","emailSubject":"موضوع پیام","id":"شناسه","info":"اطلاعات پیوند","langCode":"جهتنمای زبان","langDir":"جهتنمای زبان","langDirLTR":"Ú†Ù¾ به راست (LTR)","langDirRTL":"راست به Ú†Ù¾ (RTL)","menu":"ویرایش پیوند","name":"نام","noAnchors":"(در این سند لنگری دردسترس نیست)","noEmail":"Ù„Ø·ÙØ§ نشانی پست الکترونیکی را بنویسید","noUrl":"Ù„Ø·ÙØ§ URL پیوند را بنویسید","other":"<سایر>","popupDependent":"وابسته (Netscape)","popupFeatures":"ویژگیهای پنجرهٴ پاپاپ","popupFullScreen":"ØªÙ…Ø§Ù…ØµÙØ­Ù‡ (IE)","popupLeft":"موقعیت Ú†Ù¾","popupLocationBar":"نوار موقعیت","popupMenuBar":"نوار منو","popupResizable":"قابل تغییر اندازه","popupScrollBars":"میلههای پیمایش","popupStatusBar":"نوار وضعیت","popupToolbar":"نوارابزار","popupTop":"موقعیت بالا","rel":"وابستگی","selectAnchor":"یک لنگر برگزینید","styles":"شیوه(style)","tabIndex":"نمایهٴ دسترسی با برگه","target":"مقصد","targetFrame":"<ÙØ±ÛŒÙ…>","targetFrameName":"نام ÙØ±ÛŒÙ… مقصد","targetPopup":"<پنجرهٴ پاپاپ>","targetPopupName":"نام پنجرهٴ پاپاپ","title":"پیوند","toAnchor":"لنگر در همین ØµÙØ­Ù‡","toEmail":"پست الکترونیکی","toUrl":"URL","toolbar":"گنجاندن/ویرایش پیوند","type":"نوع پیوند","unlink":"برداشتن پیوند","upload":"انتقال به سرور"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"حداکثر کردن","minimize":"حداقل کردن"},"pastetext":{"button":"چسباندن به عنوان متن ÙØ³Ø§Ø¯Ù‡","title":"چسباندن به عنوان متن ÙØ³Ø§Ø¯Ù‡"},"pastefromword":{"confirmCleanup":"متنی Ú©Ù‡ میخواهید بچسبانید به نظر میرسد Ú©Ù‡ از Word Ú©Ù¾ÛŒ شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟","error":"به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.","title":"چسباندن از Word","toolbar":"چسباندن از Word"},"removeformat":{"toolbar":"برداشتن ÙØ±Ù…ت"},"sourcearea":{"toolbar":"منبع"},"specialchar":{"options":"گزینههای نویسههای ویژه","title":"گزینش نویسهٴ ویژه","toolbar":"گنجاندن نویسهٴ ویژه"},"scayt":{"about":"درباره SCAYT","aboutTab":"درباره","addWord":"Ø§ÙØ²ÙˆØ¯Ù† Word","allCaps":"نادیده Ú¯Ø±ÙØªÙ† همه کلاه-واژهها","dic_create":"ایجاد","dic_delete":"حذÙ","dic_field_name":"نام دیکشنری","dic_info":"در ابتدا دیکشنری کاربر در Ú©ÙˆÚ©ÛŒ ذخیره میشود. با این حال، کوکیها در اندازه محدود شدهاند. وقتی Ú©Ù‡ دیکشنری کاربری بزرگ میشود Ùˆ به نقطهای Ú©Ù‡ نمیتواند در Ú©ÙˆÚ©ÛŒ ذخیره شود، پس از آن دیکشنری ممکن است بر روی سرور ما ذخیره شود. برای ذخیره دیکشنری شخصی شما بر روی سرور ما، باید یک نام برای دیکشنری خود مشخص نمایید. اگر شما قبلا یک دیکشنری روی سرور ما ذخیره کردهاید، Ù„Ø·ÙØ§ نام آنرا درج Ùˆ روی دکمه Ø¨Ø§Ø²ÛŒØ§ÙØª کلیک نمایید.","dic_rename":"تغییر نام","dic_restore":"Ø¨Ø§Ø²ÛŒØ§ÙØª","dictionariesTab":"دیکشنریها","disable":"ØºÛŒØ±ÙØ¹Ø§Ù„سازی SCAYT","emptyDic":"نام دیکشنری نباید خالی باشد.","enable":"ÙØ¹Ø§Ù„سازی SCAYT","ignore":"عبور کردن","ignoreAll":"عبور کردن از همه","ignoreDomainNames":"عبور از نامهای دامنه","langs":"زبانها","languagesTab":"زبانها","mixedCase":"عبور از کلماتی مرکب از حرو٠بزرگ Ùˆ Ú©ÙˆÚ†Ú©","mixedWithDigits":"عبور از کلمات به همراه عدد","moreSuggestions":"پیشنهادهای بیشتر","opera_title":"توسط اپرا پشتیبانی نمیشود","options":"گزینهها","optionsTab":"گزینهها","title":"بررسی املای تایپ شما","toggle":"ضامن SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"سبک","panelTitle":"سبکهای قالببندی","panelTitle1":"سبکهای بلوک","panelTitle2":"سبکهای درونخطی","panelTitle3":"سبکهای شیء"},"table":{"border":"اندازهٴ لبه","caption":"عنوان","cell":{"menu":"سلول","insertBefore":"Ø§ÙØ²ÙˆØ¯Ù† سلول قبل از","insertAfter":"Ø§ÙØ²ÙˆØ¯Ù† سلول بعد از","deleteCell":"حذ٠سلولها","merge":"ادغام سلولها","mergeRight":"ادغام به راست","mergeDown":"ادغام به پایین","splitHorizontal":"جدا کردن اÙÙ‚ÛŒ سلول","splitVertical":"جدا کردن عمودی سلول","title":"ویژگیهای سلول","cellType":"نوع سلول","rowSpan":"محدوده ردیÙها","colSpan":"محدوده ستونها","wordWrap":"شکستن کلمه","hAlign":"چینش اÙÙ‚ÛŒ","vAlign":"چینش عمودی","alignBaseline":"خط مبنا","bgColor":"رنگ زمینه","borderColor":"رنگ خطوط","data":"اطلاعات","header":"سرنویس","yes":"بله","no":"خیر","invalidWidth":"عرض سلول باید یک عدد باشد.","invalidHeight":"Ø§Ø±ØªÙØ§Ø¹ سلول باید عدد باشد.","invalidRowSpan":"مقدار محدوده ردیÙها باید یک عدد باشد.","invalidColSpan":"مقدار محدوده ستونها باید یک عدد باشد.","chooseColor":"انتخاب"},"cellPad":"ÙØ§ØµÙ„هٴ پرشده در سلول","cellSpace":"ÙØ§ØµÙ„هٴ میان سلولها","column":{"menu":"ستون","insertBefore":"Ø§ÙØ²ÙˆØ¯Ù† ستون قبل از","insertAfter":"Ø§ÙØ²ÙˆØ¯Ù† ستون بعد از","deleteColumn":"حذ٠ستونها"},"columns":"ستونها","deleteTable":"پاک کردن جدول","headers":"سرنویسها","headersBoth":"هردو","headersColumn":"اولین ستون","headersNone":"هیچ","headersRow":"اولین ردیÙ","invalidBorder":"مقدار اندازه خطوط باید یک عدد باشد.","invalidCellPadding":"بالشتک سلول باید یک عدد باشد.","invalidCellSpacing":"مقدار ÙØ§ØµÙ„هگذاری سلول باید یک عدد باشد.","invalidCols":"تعداد ستونها باید یک عدد بزرگتر از 0 باشد.","invalidHeight":"مقدار Ø§Ø±ØªÙØ§Ø¹ جدول باید یک عدد باشد.","invalidRows":"تعداد ردیÙها باید یک عدد بزرگتر از 0 باشد.","invalidWidth":"مقدار پهنای جدول باید یک عدد باشد.","menu":"ویژگیهای جدول","row":{"menu":"سطر","insertBefore":"Ø§ÙØ²ÙˆØ¯Ù† سطر قبل از","insertAfter":"Ø§ÙØ²ÙˆØ¯Ù† سطر بعد از","deleteRow":"حذ٠سطرها"},"rows":"سطرها","summary":"خلاصه","title":"ویژگیهای جدول","toolbar":"جدول","widthPc":"درصد","widthPx":"پیکسل","widthUnit":"واحد پهنا"},"undo":{"redo":"بازچیدن","undo":"واچیدن"},"wsc":{"btnIgnore":"چشمپوشی","btnIgnoreAll":"چشمپوشی همه","btnReplace":"جایگزینی","btnReplaceAll":"جایگزینی همه","btnUndo":"واچینش","changeTo":"تغییر به","errorLoading":"خطا در بارگیری برنامه خدمات میزبان: %s.","ieSpellDownload":"بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون Ø¯Ø±ÛŒØ§ÙØª کنید؟","manyChanges":"بررسی املا انجام شد. %1 واژه تغییر ÛŒØ§ÙØª","noChanges":"بررسی املا انجام شد. هیچ واژهای تغییر Ù†ÛŒØ§ÙØª","noMispell":"بررسی املا انجام شد. هیچ غلط املائی ÛŒØ§ÙØª نشد","noSuggestions":"- پیشنهادی نیست -","notAvailable":"با عرض پوزش خدمات الان در دسترس نیستند.","notInDic":"در واژه~نامه ÛŒØ§ÙØª نشد","oneChange":"بررسی املا انجام شد. یک واژه تغییر ÛŒØ§ÙØª","progress":"بررسی املا در حال انجام...","title":"بررسی املا","toolbar":"بررسی املا"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/fi.js b/mod/ckeditor/vendors/ckeditor/lang/fi.js
new file mode 100644
index 000000000..b86c9dacc
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/fi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fi']={"dir":"ltr","editor":"Rikastekstieditori","common":{"editorHelp":"Paina ALT 0 nähdäksesi ohjeen","browseServer":"Selaa palvelinta","url":"Osoite","protocol":"Protokolla","upload":"Lisää tiedosto","uploadSubmit":"Lähetä palvelimelle","image":"Kuva","flash":"Flash-animaatio","form":"Lomake","checkbox":"Valintaruutu","radio":"Radiopainike","textField":"Tekstikenttä","textarea":"Tekstilaatikko","hiddenField":"Piilokenttä","button":"Painike","select":"Valintakenttä","imageButton":"Kuvapainike","notSet":"<ei asetettu>","id":"Tunniste","name":"Nimi","langDir":"Kielen suunta","langDirLtr":"Vasemmalta oikealle (LTR)","langDirRtl":"Oikealta vasemmalle (RTL)","langCode":"Kielikoodi","longDescr":"Pitkän kuvauksen URL","cssClass":"Tyyliluokat","advisoryTitle":"Avustava otsikko","cssStyle":"Tyyli","ok":"OK","cancel":"Peruuta","close":"Sulje","preview":"Esikatselu","resize":"Raahaa muuttaaksesi kokoa","generalTab":"Yleinen","advancedTab":"Lisäominaisuudet","validateNumberFailed":"Arvon pitää olla numero.","confirmNewPage":"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?","confirmCancel":"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?","options":"Asetukset","target":"Kohde","targetNew":"Uusi ikkuna (_blank)","targetTop":"Päällimmäinen ikkuna (_top)","targetSelf":"Sama ikkuna (_self)","targetParent":"Ylemmän tason ikkuna (_parent)","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","styles":"Tyyli","cssClasses":"Tyylitiedoston luokat","width":"Leveys","height":"Korkeus","align":"Kohdistus","alignLeft":"Vasemmalle","alignRight":"Oikealle","alignCenter":"Keskelle","alignTop":"Ylös","alignMiddle":"Keskelle","alignBottom":"Alas","invalidValue":"Virheellinen arvo.","invalidHeight":"Korkeuden täytyy olla numero.","invalidWidth":"Leveyden täytyy olla numero.","invalidCssLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.","invalidHtmlLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.","invalidInlineStyle":"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \"nimi : arvo\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.","cssLengthTooltip":"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).","unavailable":"%1<span class=\"cke_accessibility\">, ei saatavissa</span>"},"about":{"copy":"Copyright &copy; $1. Kaikki oikeuden pidätetään.","dlgTitle":"Tietoa CKEditorista","help":"Katso ohjeet: $1.","moreInfo":"Lisenssitiedot löytyvät kotisivuiltamme:","title":"Tietoa CKEditorista","userGuide":"CKEditorin käyttäjäopas"},"basicstyles":{"bold":"Lihavoitu","italic":"Kursivoitu","strike":"Yliviivattu","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivattu"},"blockquote":{"toolbar":"Lainaus"},"clipboard":{"copy":"Kopioi","copyError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).","cut":"Leikkaa","cutError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).","paste":"Liitä","pasteArea":"Leikealue","pasteMsg":"Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.","securityMsg":"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.","title":"Liitä"},"contextmenu":{"options":"Pikavalikon ominaisuudet"},"toolbar":{"toolbarCollapse":"Kutista työkalupalkki","toolbarExpand":"Laajenna työkalupalkki","toolbarGroups":{"document":"Dokumentti","clipboard":"Leikepöytä/Kumoa","editing":"Muokkaus","forms":"Lomakkeet","basicstyles":"Perustyylit","paragraph":"Kappale","links":"Linkit","insert":"Lisää","styles":"Tyylit","colors":"Värit","tools":"Työkalut"},"toolbars":"Editorin työkalupalkit"},"elementspath":{"eleLabel":"Elementin polku","eleTitle":"%1 elementti"},"list":{"bulletedlist":"Luottelomerkit","numberedlist":"Numerointi"},"indent":{"indent":"Suurenna sisennystä","outdent":"Pienennä sisennystä"},"format":{"label":"Muotoilu","panelTitle":"Muotoilu","tag_address":"Osoite","tag_div":"Normaali (DIV)","tag_h1":"Otsikko 1","tag_h2":"Otsikko 2","tag_h3":"Otsikko 3","tag_h4":"Otsikko 4","tag_h5":"Otsikko 5","tag_h6":"Otsikko 6","tag_p":"Normaali","tag_pre":"Muotoiltu"},"horizontalrule":{"toolbar":"Lisää murtoviiva"},"image":{"alertUrl":"Kirjoita kuvan osoite (URL)","alt":"Vaihtoehtoinen teksti","border":"Kehys","btnUpload":"Lähetä palvelimelle","button2Img":"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?","hSpace":"Vaakatila","img2Button":"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?","infoTab":"Kuvan tiedot","linkTab":"Linkki","lockRatio":"Lukitse suhteet","menu":"Kuvan ominaisuudet","resetSize":"Alkuperäinen koko","title":"Kuvan ominaisuudet","titleButton":"Kuvapainikkeen ominaisuudet","upload":"Lisää kuva","urlMissing":"Kuvan lähdeosoite puuttuu.","vSpace":"Pystytila","validateBorder":"Kehyksen täytyy olla kokonaisluku.","validateHSpace":"HSpace-määrityksen täytyy olla kokonaisluku.","validateVSpace":"VSpace-määrityksen täytyy olla kokonaisluku."},"fakeobjects":{"anchor":"Ankkuri","flash":"Flash animaatio","hiddenfield":"Piilokenttä","iframe":"IFrame-kehys","unknown":"Tuntematon objekti"},"link":{"acccessKey":"Pikanäppäin","advanced":"Lisäominaisuudet","advisoryContentType":"Avustava sisällön tyyppi","advisoryTitle":"Avustava otsikko","anchor":{"toolbar":"Lisää ankkuri/muokkaa ankkuria","menu":"Ankkurin ominaisuudet","title":"Ankkurin ominaisuudet","name":"Nimi","errorName":"Ankkurille on kirjoitettava nimi","remove":"Poista ankkuri"},"anchorId":"Ankkurin ID:n mukaan","anchorName":"Ankkurin nimen mukaan","charset":"Linkitetty kirjaimisto","cssClasses":"Tyyliluokat","emailAddress":"Sähköpostiosoite","emailBody":"Viesti","emailSubject":"Aihe","id":"Tunniste","info":"Linkin tiedot","langCode":"Kielen suunta","langDir":"Kielen suunta","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","menu":"Muokkaa linkkiä","name":"Nimi","noAnchors":"(Ei ankkureita tässä dokumentissa)","noEmail":"Kirjoita sähköpostiosoite","noUrl":"Linkille on kirjoitettava URL","other":"<muu>","popupDependent":"Riippuva (Netscape)","popupFeatures":"Popup ikkunan ominaisuudet","popupFullScreen":"Täysi ikkuna (IE)","popupLeft":"Vasemmalta (px)","popupLocationBar":"Osoiterivi","popupMenuBar":"Valikkorivi","popupResizable":"Venytettävä","popupScrollBars":"Vierityspalkit","popupStatusBar":"Tilarivi","popupToolbar":"Vakiopainikkeet","popupTop":"Ylhäältä (px)","rel":"Suhde","selectAnchor":"Valitse ankkuri","styles":"Tyyli","tabIndex":"Tabulaattori indeksi","target":"Kohde","targetFrame":"<kehys>","targetFrameName":"Kohdekehyksen nimi","targetPopup":"<popup ikkuna>","targetPopupName":"Popup ikkunan nimi","title":"Linkki","toAnchor":"Ankkuri tässä sivussa","toEmail":"Sähköposti","toUrl":"Osoite","toolbar":"Lisää linkki/muokkaa linkkiä","type":"Linkkityyppi","unlink":"Poista linkki","upload":"Lisää tiedosto"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Suurenna","minimize":"Pienennä"},"pastetext":{"button":"Liitä tekstinä","title":"Liitä tekstinä"},"pastefromword":{"confirmCleanup":"Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)","error":"Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia","title":"Liitä Word-dokumentista","toolbar":"Liitä Word-dokumentista"},"removeformat":{"toolbar":"Poista muotoilu"},"sourcearea":{"toolbar":"Koodi"},"specialchar":{"options":"Erikoismerkin ominaisuudet","title":"Valitse erikoismerkki","toolbar":"Lisää erikoismerkki"},"scayt":{"about":"Tietoja oikoluvusta kirjoitetaessa","aboutTab":"Tietoa","addWord":"Lisää sana","allCaps":"Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla","dic_create":"Luo","dic_delete":"Poista","dic_field_name":"Sanakirjan nimi","dic_info":"Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta","dic_rename":"Nimeä uudelleen","dic_restore":"Palauta","dictionariesTab":"Sanakirjat","disable":"Poista käytöstä oikoluku kirjoitetaessa","emptyDic":"Sanakirjan nimi on annettava.","enable":"Ota käyttöön oikoluku kirjoitettaessa","ignore":"Ohita","ignoreAll":"Ohita kaikki","ignoreDomainNames":"Ohita verkkotunnukset","langs":"Kielet","languagesTab":"Kielet","mixedCase":"Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia","mixedWithDigits":"Ohita sanat, joissa on numeroita","moreSuggestions":"Lisää ehdotuksia","opera_title":"Opera ei tue tätä ominaisuutta","options":"Asetukset","optionsTab":"Asetukset","title":"Oikolue kirjoitettaessa","toggle":"Vaihda oikoluku kirjoittaessa tilaa","noSuggestions":"No suggestion"},"stylescombo":{"label":"Tyyli","panelTitle":"Muotoilujen tyylit","panelTitle1":"Lohkojen tyylit","panelTitle2":"Rivinsisäiset tyylit","panelTitle3":"Objektien tyylit"},"table":{"border":"Rajan paksuus","caption":"Otsikko","cell":{"menu":"Solu","insertBefore":"Lisää solu eteen","insertAfter":"Lisää solu perään","deleteCell":"Poista solut","merge":"Yhdistä solut","mergeRight":"Yhdistä oikealla olevan kanssa","mergeDown":"Yhdistä alla olevan kanssa","splitHorizontal":"Jaa solu vaakasuunnassa","splitVertical":"Jaa solu pystysuunnassa","title":"Solun ominaisuudet","cellType":"Solun tyyppi","rowSpan":"Rivin jatkuvuus","colSpan":"Solun jatkuvuus","wordWrap":"Rivitys","hAlign":"Horisontaali kohdistus","vAlign":"Vertikaali kohdistus","alignBaseline":"Alas (teksti)","bgColor":"Taustan väri","borderColor":"Reunan väri","data":"Data","header":"Ylätunniste","yes":"Kyllä","no":"Ei","invalidWidth":"Solun leveyden täytyy olla numero.","invalidHeight":"Solun korkeuden täytyy olla numero.","invalidRowSpan":"Rivin jatkuvuuden täytyy olla kokonaisluku.","invalidColSpan":"Solun jatkuvuuden täytyy olla kokonaisluku.","chooseColor":"Valitse"},"cellPad":"Solujen sisennys","cellSpace":"Solujen väli","column":{"menu":"Sarake","insertBefore":"Lisää sarake vasemmalle","insertAfter":"Lisää sarake oikealle","deleteColumn":"Poista sarakkeet"},"columns":"Sarakkeet","deleteTable":"Poista taulu","headers":"Ylätunnisteet","headersBoth":"Molemmat","headersColumn":"Ensimmäinen sarake","headersNone":"Ei","headersRow":"Ensimmäinen rivi","invalidBorder":"Reunan koon täytyy olla numero.","invalidCellPadding":"Solujen sisennyksen täytyy olla numero.","invalidCellSpacing":"Solujen välin täytyy olla numero.","invalidCols":"Sarakkeiden määrän täytyy olla suurempi kuin 0.","invalidHeight":"Taulun korkeuden täytyy olla numero.","invalidRows":"Rivien määrän täytyy olla suurempi kuin 0.","invalidWidth":"Taulun leveyden täytyy olla numero.","menu":"Taulun ominaisuudet","row":{"menu":"Rivi","insertBefore":"Lisää rivi yläpuolelle","insertAfter":"Lisää rivi alapuolelle","deleteRow":"Poista rivit"},"rows":"Rivit","summary":"Yhteenveto","title":"Taulun ominaisuudet","toolbar":"Taulu","widthPc":"prosenttia","widthPx":"pikseliä","widthUnit":"leveysyksikkö"},"undo":{"redo":"Toista","undo":"Kumoa"},"wsc":{"btnIgnore":"Jätä huomioimatta","btnIgnoreAll":"Jätä kaikki huomioimatta","btnReplace":"Korvaa","btnReplaceAll":"Korvaa kaikki","btnUndo":"Kumoa","changeTo":"Vaihda","errorLoading":"Virhe ladattaessa oikolukupalvelua isännältä: %s.","ieSpellDownload":"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?","manyChanges":"Tarkistus valmis: %1 sanaa muutettiin","noChanges":"Tarkistus valmis: Yhtään sanaa ei muutettu","noMispell":"Tarkistus valmis: Ei virheitä","noSuggestions":"Ei ehdotuksia","notAvailable":"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.","notInDic":"Ei sanakirjassa","oneChange":"Tarkistus valmis: Yksi sana muutettiin","progress":"Tarkistus käynnissä...","title":"Oikoluku","toolbar":"Tarkista oikeinkirjoitus"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/fo.js b/mod/ckeditor/vendors/ckeditor/lang/fo.js
new file mode 100644
index 000000000..c1cb558e9
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/fo.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fo']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Trýst ALT og 0 fyri vegleiðing","browseServer":"Ambætarakagi","url":"URL","protocol":"Protokoll","upload":"Send til ambætaran","uploadSubmit":"Send til ambætaran","image":"Myndir","flash":"Flash","form":"Formur","checkbox":"Flugubein","radio":"Radioknøttur","textField":"Tekstteigur","textarea":"Tekstumráði","hiddenField":"Fjaldur teigur","button":"Knøttur","select":"Valskrá","imageButton":"Myndaknøttur","notSet":"<ikki sett>","id":"Id","name":"Navn","langDir":"Tekstkós","langDirLtr":"Frá vinstru til høgru (LTR)","langDirRtl":"Frá høgru til vinstru (RTL)","langCode":"Málkoda","longDescr":"Víðkað URL frágreiðing","cssClass":"Typografi klassar","advisoryTitle":"Vegleiðandi heiti","cssStyle":"Typografi","ok":"Góðkent","cancel":"Avlýst","close":"Lat aftur","preview":"Frumsýn","resize":"Drag fyri at broyta stødd","generalTab":"Generelt","advancedTab":"Fjølbroytt","validateNumberFailed":"Hetta er ikki eitt tal.","confirmNewPage":"Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?","confirmCancel":"Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?","options":"Options","target":"Target","targetNew":"Nýtt vindeyga (_blank)","targetTop":"Vindeyga ovast (_top)","targetSelf":"Sama vindeyga (_self)","targetParent":"Upphavligt vindeyga (_parent)","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Breidd","height":"Hædd","align":"Justering","alignLeft":"Vinstra","alignRight":"Høgra","alignCenter":"Miðsett","alignTop":"Ovast","alignMiddle":"Miðja","alignBottom":"Botnur","invalidValue":"Invalid value.","invalidHeight":"Hædd má vera eitt tal.","invalidWidth":"Breidd má vera eitt tal.","invalidCssLength":"Virðið sett í \"%1\" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).","invalidHtmlLength":"Virðið sett í \"%1\" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).","invalidInlineStyle":"Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum \"name : value\", hvørt parið sundurskilt við semi-colon.","cssLengthTooltip":"Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikki tøkt</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Um CKEditor","help":"Kekka $1 fyri hjálp.","moreInfo":"Licens upplýsingar finnast á heimasíðu okkara:","title":"Um CKEditor","userGuide":"CKEditor Brúkaravegleiðing"},"basicstyles":{"bold":"Feit skrift","italic":"Skráskrift","strike":"Yvirstrikað","subscript":"Lækkað skrift","superscript":"Hækkað skrift","underline":"Undirstrikað"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Avrita","copyError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).","cut":"Kvett","cutError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).","paste":"Innrita","pasteArea":"Avritingarumráði","pasteMsg":"Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.","securityMsg":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.","title":"Innrita"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Lat Toolbar aftur","toolbarExpand":"Vís Toolbar","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editering","forms":"Formar","basicstyles":"Grundleggjandi Styles","paragraph":"Reglubrot","links":"Leinkjur","insert":"Set inn","styles":"Styles","colors":"Litir","tools":"Tól"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Slóð til elementir","eleTitle":"%1 element"},"list":{"bulletedlist":"Punktmerktur listi","numberedlist":"Talmerktur listi"},"indent":{"indent":"Økja reglubrotarinntriv","outdent":"Minka reglubrotarinntriv"},"format":{"label":"Skriftsnið","panelTitle":"Skriftsnið","tag_address":"Adressa","tag_div":"Vanligt (DIV)","tag_h1":"Yvirskrift 1","tag_h2":"Yvirskrift 2","tag_h3":"Yvirskrift 3","tag_h4":"Yvirskrift 4","tag_h5":"Yvirskrift 5","tag_h6":"Yvirskrift 6","tag_p":"Vanligt","tag_pre":"Sniðgivið"},"horizontalrule":{"toolbar":"Ger vatnrætta linju"},"image":{"alertUrl":"Rita slóðina til myndina","alt":"Alternativur tekstur","border":"Bordi","btnUpload":"Send til ambætaran","button2Img":"Skal valdi myndaknøttur gerast til vanliga mynd?","hSpace":"Høgri breddi","img2Button":"Skal valda mynd gerast til myndaknøtt?","infoTab":"Myndaupplýsingar","linkTab":"Tilknýti","lockRatio":"Læs lutfallið","menu":"Myndaeginleikar","resetSize":"Upprunastødd","title":"Myndaeginleikar","titleButton":"Eginleikar fyri myndaknøtt","upload":"Send","urlMissing":"URL til mynd manglar.","vSpace":"Vinstri breddi","validateBorder":"Bordi má vera eitt heiltal.","validateHSpace":"HSpace má vera eitt heiltal.","validateVSpace":"VSpace má vera eitt heiltal."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Fjaldur teigur","iframe":"IFrame","unknown":"Ókent Object"},"link":{"acccessKey":"Snarvegisknöttur","advanced":"Fjølbroytt","advisoryContentType":"Vegleiðandi innihaldsslag","advisoryTitle":"Vegleiðandi heiti","anchor":{"toolbar":"Ger/broyt marknastein","menu":"Eginleikar fyri marknastein","title":"Eginleikar fyri marknastein","name":"Heiti marknasteinsins","errorName":"Vinarliga rita marknasteinsins heiti","remove":"Strika marknastein"},"anchorId":"Eftir element Id","anchorName":"Eftir navni á marknasteini","charset":"Atknýtt teknsett","cssClasses":"Typografi klassar","emailAddress":"Teldupost-adressa","emailBody":"Breyðtekstur","emailSubject":"Evni","id":"Id","info":"Tilknýtis upplýsingar","langCode":"Tekstkós","langDir":"Tekstkós","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","menu":"Broyt tilknýti","name":"Navn","noAnchors":"(Eingir marknasteinar eru í hesum dokumentið)","noEmail":"Vinarliga skriva teldupost-adressu","noUrl":"Vinarliga skriva tilknýti (URL)","other":"<annað>","popupDependent":"Bundið (Netscape)","popupFeatures":"Popup vindeygans víðkaðu eginleikar","popupFullScreen":"Fullur skermur (IE)","popupLeft":"Frástøða frá vinstru","popupLocationBar":"Adressulinja","popupMenuBar":"Skrábjálki","popupResizable":"Stødd kann broytast","popupScrollBars":"Rullibjálki","popupStatusBar":"Støðufrágreiðingarbjálki","popupToolbar":"Amboðsbjálki","popupTop":"Frástøða frá íerva","rel":"Relatión","selectAnchor":"Vel ein marknastein","styles":"Typografi","tabIndex":"Tabulator indeks","target":"Target","targetFrame":"<ramma>","targetFrameName":"Vís navn vindeygans","targetPopup":"<popup vindeyga>","targetPopupName":"Popup vindeygans navn","title":"Tilknýti","toAnchor":"Tilknýti til marknastein í tekstinum","toEmail":"Teldupostur","toUrl":"URL","toolbar":"Ger/broyt tilknýti","type":"Tilknýtisslag","unlink":"Strika tilknýti","upload":"Send til ambætaran"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimera","minimize":"Minimera"},"pastetext":{"button":"Innrita som reinan tekst","title":"Innrita som reinan tekst"},"pastefromword":{"confirmCleanup":"Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?","error":"Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil","title":"Innrita frá Word","toolbar":"Innrita frá Word"},"removeformat":{"toolbar":"Strika sniðgeving"},"sourcearea":{"toolbar":"Kelda"},"specialchar":{"options":"Møguleikar við serteknum","title":"Vel sertekn","toolbar":"Set inn sertekn"},"scayt":{"about":"Um SCAYT","aboutTab":"Um","addWord":"Legg orð afturat","allCaps":"Loyp orð við bert stórum stavum um","dic_create":"Upprætta nýggja","dic_delete":"Strika","dic_field_name":"Orðabókanavn","dic_info":"Upprunaliga er brúkara-orðabókin goymd í eini cookie í tínum egna kaga. Men hesar cookies eru avmarkaðar í stødd. Tá brúkara-orðabókin veksur seg ov stóra til eina cookie, so er møguligt at goyma hana á ambætara okkara. Fyri at goyma persónligu orðabókina á ambætaranum eigur tú at velja eitt navn til tína skuffu. Hevur tú longu goymt eina orðabók, so vinarliga skriva navnið og klikk á knøttin Endurskapa.","dic_rename":"Broyt","dic_restore":"Endurskapa","dictionariesTab":"Orðabøkur","disable":"Nokta SCAYT","emptyDic":"Heiti á orðabók eigur ikki at vera tómt.","enable":"Loyv SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alt","ignoreDomainNames":"loyp økisnøvn um","langs":"Tungumál","languagesTab":"Tungumál","mixedCase":"Loyp orð við blandaðum smáum og stórum stavum um","mixedWithDigits":"Loyp orð við tølum um","moreSuggestions":"Fleiri tilráðingar","opera_title":"Ikki stuðlað í Opera","options":"Uppseting","optionsTab":"Uppseting","title":"Kanna stavseting, meðan tú skrivar","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formatterings stílir","panelTitle1":"Blokk stílir","panelTitle2":"Inline stílir","panelTitle3":"Object stílir"},"table":{"border":"Bordabreidd","caption":"Tabellfrágreiðing","cell":{"menu":"Meski","insertBefore":"Set meska inn áðrenn","insertAfter":"Set meska inn aftaná","deleteCell":"Strika meskar","merge":"Flætta meskar","mergeRight":"Flætta meskar til høgru","mergeDown":"Flætta saman","splitHorizontal":"Kloyv meska vatnrætt","splitVertical":"Kloyv meska loddrætt","title":"Mesku eginleikar","cellType":"Mesku slag","rowSpan":"Ræð spenni","colSpan":"Kolonnu spenni","wordWrap":"Orðkloyving","hAlign":"Horisontal plasering","vAlign":"Loddrøtt plasering","alignBaseline":"Basislinja","bgColor":"Bakgrundslitur","borderColor":"Bordalitur","data":"Data","header":"Header","yes":"Ja","no":"Nei","invalidWidth":"Meskubreidd má vera eitt tal.","invalidHeight":"Meskuhædd má vera eitt tal.","invalidRowSpan":"Raðspennið má vera eitt heiltal.","invalidColSpan":"Kolonnuspennið má vera eitt heiltal.","chooseColor":"Vel"},"cellPad":"Meskubreddi","cellSpace":"Fjarstøða millum meskar","column":{"menu":"Kolonna","insertBefore":"Set kolonnu inn áðrenn","insertAfter":"Set kolonnu inn aftaná","deleteColumn":"Strika kolonnur"},"columns":"Kolonnur","deleteTable":"Strika tabell","headers":"Yvirskriftir","headersBoth":"Báðir","headersColumn":"Fyrsta kolonna","headersNone":"Eingin","headersRow":"Fyrsta rað","invalidBorder":"Borda-stødd má vera eitt tal.","invalidCellPadding":"Cell padding má vera eitt tal.","invalidCellSpacing":"Cell spacing má vera eitt tal.","invalidCols":"Talið av kolonnum má vera eitt tal størri enn 0.","invalidHeight":"Tabell-hædd má vera eitt tal.","invalidRows":"Talið av røðum má vera eitt tal størri enn 0.","invalidWidth":"Tabell-breidd má vera eitt tal.","menu":"Eginleikar fyri tabell","row":{"menu":"Rað","insertBefore":"Set rað inn áðrenn","insertAfter":"Set rað inn aftaná","deleteRow":"Strika røðir"},"rows":"Røðir","summary":"Samandráttur","title":"Eginleikar fyri tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"pixels","widthUnit":"breiddar unit"},"undo":{"redo":"Vend aftur","undo":"Angra"},"wsc":{"btnIgnore":"Forfjóna","btnIgnoreAll":"Forfjóna alt","btnReplace":"Yvirskriva","btnReplaceAll":"Yvirskriva alt","btnUndo":"Angra","changeTo":"Broyt til","errorLoading":"Feilur við innlesing av application service host: %s.","ieSpellDownload":"Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?","manyChanges":"Rættstavarin liðugur: %1 orð broytt","noChanges":"Rættstavarin liðugur: Einki orð varð broytt","noMispell":"Rættstavarin liðugur: Eingin feilur funnin","noSuggestions":"- Einki uppskot -","notAvailable":"Tíverri, ikki tøkt í løtuni.","notInDic":"Finst ikki í orðabókini","oneChange":"Rættstavarin liðugur: Eitt orð er broytt","progress":"Rættstavarin arbeiðir...","title":"Kanna stavseting","toolbar":"Kanna stavseting"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/fr-ca.js b/mod/ckeditor/vendors/ckeditor/lang/fr-ca.js
new file mode 100644
index 000000000..edf2a52fb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/fr-ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr-ca']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Prem ALT 0 per obtenir ajuda","browseServer":"Parcourir le serveur","url":"URL","protocol":"Protocole","upload":"Télécharger","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Animation Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Champ de sélection","imageButton":"Bouton image","notSet":"<Par défaut>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"De gauche à droite (LTR)","langDirRtl":"De droite à gauche (RTL)","langCode":"Code langue","longDescr":"URL de description longue","cssClass":"Classes de feuilles de style","advisoryTitle":"Titre","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Close","preview":"Previsualiser","resize":"Resize","generalTab":"Général","advancedTab":"Avancée","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Destination","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","styles":"Style","cssClasses":"Classes de feuilles de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barrer","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Paste Area","pasteMsg":"Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.","title":"Coller"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Liste à puces","numberedlist":"Liste numérotée"},"indent":{"indent":"Augmenter le retrait","outdent":"Diminuer le retrait"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"En-tête 1","tag_h2":"En-tête 2","tag_h3":"En-tête 3","tag_h4":"En-tête 4","tag_h5":"En-tête 5","tag_h6":"En-tête 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Insérer un séparateur"},"image":{"alertUrl":"Veuillez saisir l'URL de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Espacement horizontal","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Garder les proportions","menu":"Propriétés de l'image","resetSize":"Taille originale","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Télécharger","urlMissing":"Image source URL is missing.","vSpace":"Espacement vertical","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Équivalent clavier","advanced":"Avancée","advisoryContentType":"Type de contenu","advisoryTitle":"Titre","anchor":{"toolbar":"Insérer/modifier l'ancre","menu":"Propriétés de l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez saisir le nom de l'ancre","remove":"Remove Anchor"},"anchorId":"Par id","anchorName":"Par nom","charset":"Encodage de caractère","cssClasses":"Classes de feuilles de style","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Informations sur le lien","langCode":"Sens d'écriture","langDir":"Sens d'écriture","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","menu":"Modifier le lien","name":"Nom","noAnchors":"(Pas d'ancre disponible dans le document)","noEmail":"Veuillez saisir l'adresse e-mail","noUrl":"Veuillez saisir l'URL","other":"<other>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Caractéristiques de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position à partir de la gauche","popupLocationBar":"Barre d'adresses","popupMenuBar":"Barre de menu","popupResizable":"Resizable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre d'état","popupToolbar":"Barre d'outils","popupTop":"Position à partir du haut","rel":"Relationship","selectAnchor":"Sélectionner une ancre","styles":"Style","tabIndex":"Ordre de tabulation","target":"Destination","targetFrame":"<Cadre>","targetFrameName":"Nom du cadre de destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Propriétés du lien","toAnchor":"Ancre dans cette page","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insérer/modifier le lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Télécharger"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Coller comme texte","title":"Coller comme texte"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Coller en tant que Word (formaté)","toolbar":"Coller en tant que Word (formaté)"},"removeformat":{"toolbar":"Supprimer le formatage"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Insérer un caractère spécial","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Style","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Taille de la bordure","caption":"Titre","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer des cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Scinder la cellule horizontalement","splitVertical":"Scinder la cellule verticalement","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Contour","cellSpace":"Espacement","column":{"menu":"Colonne","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer des colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer des lignes"},"rows":"Lignes","summary":"Résumé","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"pourcentage","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Refaire","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Changer en","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?","manyChanges":"Vérification d'orthographe terminée: %1 mots modifiés","noChanges":"Vérification d'orthographe terminée: Pas de modifications","noMispell":"Vérification d'orthographe terminée: pas d'erreur trouvée","noSuggestions":"- Pas de suggestion -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Pas dans le dictionnaire","oneChange":"Vérification d'orthographe terminée: Un mot modifié","progress":"Vérification d'orthographe en cours...","title":"Spell Check","toolbar":"Orthographe"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/fr.js b/mod/ckeditor/vendors/ckeditor/lang/fr.js
new file mode 100644
index 000000000..bf0222d89
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/fr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr']={"dir":"ltr","editor":"Éditeur de Texte Enrichi","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<non défini>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"Gauche à droite (LTR)","langDirRtl":"Droite à gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Déplacer pour modifier la taille","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieure (_top)","targetSelf":"Même fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"Gauche à Droite (LTR)","langDirRTL":"Droite à Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Invalid value.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px or %).","invalidInlineStyle":"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, Indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, veuillez visiter notre site web:","title":"À propos de CKEditor","userGuide":"Guide de l'utilisateur CKEditor en anglais"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.","title":"Coller"},"contextmenu":{"options":"Options du menu contextuel"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/Défaire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 éléments"},"list":{"bulletedlist":"Insérer/Supprimer la liste à puces","numberedlist":"Insérer/Supprimer la liste numérotée"},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Ligne horizontale"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sélectionné en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"Propriétés de l'image","resetSize":"Taille d'origine","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit être un entier.","validateHSpace":"HSpace doit être un entier.","validateVSpace":"VSpace doit être un entier."},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'élément","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"Gauche à droite","langDirRTL":"Droite à gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Options de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"Sélectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"<cadre>","targetFrameName":"Nom du Cadre destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Transformer le lien en ancre dans le texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Agrandir","minimize":"Minimiser"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"pastefromword":{"confirmCleanup":"Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne.","title":"Coller depuis Word","toolbar":"Coller depuis Word"},"removeformat":{"toolbar":"Supprimer la mise en forme"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Options des caractères spéciaux","title":"Sélectionnez un caractère","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"A propos de SCAYT","aboutTab":"À propos de","addWord":"Ajouter le mot","allCaps":"Ignorer les mots entièrement en majuscules","dic_create":"Créer","dic_delete":"Effacer","dic_field_name":"Nom du dictionnaire","dic_info":"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.","dic_rename":"Renommer","dic_restore":"Restaurer","dictionariesTab":"Dictionnaires","disable":"Désactiver SCAYT","emptyDic":"Le nom du dictionnaire ne devrait pas être vide.","enable":"Activer SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Tout","ignoreDomainNames":"Ignorer les noms de domaines","langs":"Langues","languagesTab":"Langues","mixedCase":"Ignorer les mots à casse multiple","mixedWithDigits":"Ignorer les mots contenant des chiffres","moreSuggestions":"Plus de suggestions","opera_title":"Non supporté par Opera","options":"Options","optionsTab":"Options","title":"Vérification de l'Orthographe en Cours de Frappe (SCAYT)","toggle":"Activer/Désactiver SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Styles de mise en page","panelTitle1":"Styles de blocs","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Césure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"Données","header":"Entête","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit être un nombre.","invalidHeight":"La Hauteur de Cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-Têtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit être un nombre.","invalidCellPadding":"La marge intérieure des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"Résumé (description)","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unité de largeur"},"undo":{"redo":"Rétablir","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Modifier pour","errorLoading":"Erreur du chargement du service depuis l'hôte : %s.","ieSpellDownload":"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?","manyChanges":"Vérification de l'orthographe terminée : %1 mots corrigés.","noChanges":"Vérification de l'orthographe terminée : Aucun mot corrigé.","noMispell":"Vérification de l'orthographe terminée : aucune erreur trouvée.","noSuggestions":"- Aucune suggestion -","notAvailable":"Désolé, le service est indisponible actuellement.","notInDic":"N'existe pas dans le dictionnaire.","oneChange":"Vérification de l'orthographe terminée : Un seul mot corrigé.","progress":"Vérification de l'orthographe en cours...","title":"Vérifier l'orthographe","toolbar":"Vérifier l'orthographe"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/gl.js b/mod/ckeditor/vendors/ckeditor/lang/gl.js
new file mode 100644
index 000000000..20cef6439
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/gl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gl']={"dir":"ltr","editor":"Editor de texto enriquecido","common":{"editorHelp":"Prema ALT 0 para obter axuda","browseServer":"Ver servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar ao servidor","image":"Imaxe","flash":"Flash","form":"Formulario","checkbox":"Campo de verificación","radio":"Botón de radio","textField":"Campo de texto","textarea":"Ãrea de texto","hiddenField":"Campo oculto","button":"Botón","select":"Campo de selección","imageButton":"Botón de imaxe","notSet":"<non definido>","id":"Id","name":"Nome","langDir":"Orientación do idioma","langDirLtr":"Esquerda a dereita (LTR)","langDirRtl":"Dereita a esquerda (RTL)","langCode":"Código do idioma","longDescr":"Descrición completa da URL","cssClass":"Clases da folla de estilos","advisoryTitle":"Título","cssStyle":"Estilo","ok":"OK","cancel":"Cancelar","close":"Pechar","preview":"Previsualizar","resize":"Redimensionar","generalTab":"Xeral","advancedTab":"Advanzado","validateNumberFailed":"Este valor non é un número.","confirmNewPage":"Calquera cambio que non gardara neste contido perderase.\r\nEstá seguro que quere cargar a nova páxina?","confirmCancel":"Algunhas das opcións foron cambiadas.\r\nEsta seguro que quere pechar o diálogo??","options":"Opcións","target":"Obxectivo","targetNew":"Nova xaneal (_blank)","targetTop":"Xanela principal (_top)","targetSelf":"Mesma xanela (_self)","targetParent":"Xanela superior (_parent)","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","styles":"Estilo","cssClasses":"Clases da folla de estilos","width":"Ancho","height":"Alto","align":"Aliñamento","alignLeft":"Esquerda","alignRight":"Dereita","alignCenter":"Centro","alignTop":"Arriba","alignMiddle":"Centro","alignBottom":"Pé","invalidValue":"Invalid value.","invalidHeight":"O alto debe ser un número.","invalidWidth":"O ancho debe ser un número.","invalidCssLength":"O valor especificado para o campo \"%1\" debe ser un número positivo con ou sen unha unidade medida CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"O valor especificado para o campo \"%1\" debe ser un número positivo con ou sen unha unidade de medida HTML válidoa (px or %).","invalidInlineStyle":"O valor especificado no estilo en liña debe consistir nunha ou máis tuplas co formato \"nome : valor\", separadas por punto e coma.","cssLengthTooltip":"Escriba un número para o valor en píxeles ou un número con unha unidade CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, non dispoñíbel</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Sub-raiado"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copiar","copyError":"Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de copia. Por favor, use o teclado para iso (Ctrl/Cmd+C).","cut":"Cortar","cutError":"Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de corte. Por favor, use o teclado para iso (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Paste Area","pasteMsg":"Por favor, pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e pulse <STRONG>OK</STRONG>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Pegar"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Marcas","numberedlist":"Lista Numerada"},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Enderezo","tag_div":"Paragraph (DIV)","tag_h1":"Enacabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Formateado"},"horizontalrule":{"toolbar":"Inserir Liña Horizontal"},"image":{"alertUrl":"Por favor, escriba a URL da imaxe","alt":"Texto Alternativo","border":"Límite","btnUpload":"Enviar ó Servidor","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Esp. Horiz.","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Información da Imaxe","linkTab":"Ligazón","lockRatio":"Proporcional","menu":"Propriedades da Imaxe","resetSize":"Tamaño Orixinal","title":"Propriedades da Imaxe","titleButton":"Propriedades do Botón de Imaxe","upload":"Carregar","urlMissing":"Image source URL is missing.","vSpace":"Esp. Vert.","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Chave de Acceso","advanced":"Advanzado","advisoryContentType":"Tipo de Contido","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Referencia","menu":"Propriedades da Referencia","title":"Propriedades da Referencia","name":"Nome da Referencia","errorName":"Por favor, escriba o nome da referencia","remove":"Remove Anchor"},"anchorId":"Por Element Id","anchorName":"Por Nome de Referencia","charset":"Fonte de Caracteres Vinculado","cssClasses":"Clases da Folla de Estilos","emailAddress":"Enderezo de E-Mail","emailBody":"Corpo do Mensaxe","emailSubject":"Asunto do Mensaxe","id":"Id","info":"Información da Ligazón","langCode":"Orientación do Idioma","langDir":"Orientación do Idioma","langDirLTR":"Esquerda a Dereita (LTR)","langDirRTL":"Dereita a Esquerda (RTL)","menu":"Editar Ligazón","name":"Nome","noAnchors":"(Non hai referencias disponibles no documento)","noEmail":"Por favor, escriba o enderezo de e-mail","noUrl":"Por favor, escriba a ligazón URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características da Xanela Emerxente","popupFullScreen":"A Toda Pantalla (IE)","popupLeft":"Posición Esquerda","popupLocationBar":"Barra de Localización","popupMenuBar":"Barra de Menú","popupResizable":"Resizable","popupScrollBars":"Barras de Desplazamento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Ferramentas","popupTop":"Posición dende Arriba","rel":"Relationship","selectAnchor":"Seleccionar unha Referencia","styles":"Estilo","tabIndex":"Ãndice de Tabulación","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Marco Destino","targetPopup":"<Xanela Emerxente>","targetPopupName":"Nome da Xanela Emerxente","title":"Ligazón","toAnchor":"Referencia nesta páxina","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Ligazón","type":"Tipo de Ligazón","unlink":"Eliminar Ligazón","upload":"Carregar"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Pegar como texto plano","title":"Pegar como texto plano"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Pegar dende Word","toolbar":"Pegar dende Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Código Fonte"},"specialchar":{"options":"Special Character Options","title":"Seleccione Caracter Especial","toolbar":"Inserir Carácter Especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Tamaño do Borde","caption":"Título","cell":{"menu":"Cela","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Borrar Cela","merge":"Unir Celas","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Marxe interior","cellSpace":"Marxe entre Celas","column":{"menu":"Columna","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Borrar Columnas"},"columns":"Columnas","deleteTable":"Borrar Táboa","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Propiedades da Táboa","row":{"menu":"Fila","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Borrar Filas"},"rows":"Filas","summary":"Sumario","title":"Propiedades da Táboa","toolbar":"Tabla","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Refacer","undo":"Desfacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todas","btnReplace":"Substituir","btnReplaceAll":"Substituir Todas","btnUndo":"Desfacer","changeTo":"Cambiar a","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"O corrector ortográfico non está instalado. ¿Quere descargalo agora?","manyChanges":"Corrección ortográfica rematada: %1 verbas substituidas","noChanges":"Corrección ortográfica rematada: Non se substituiu nengunha verba","noMispell":"Corrección ortográfica rematada: Non se atoparon erros","noSuggestions":"- Sen candidatos -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Non está no diccionario","oneChange":"Corrección ortográfica rematada: Unha verba substituida","progress":"Corrección ortográfica en progreso...","title":"Spell Check","toolbar":"Corrección Ortográfica"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/gu.js b/mod/ckeditor/vendors/ckeditor/lang/gu.js
new file mode 100644
index 000000000..623abef02
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/gu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gu']={"dir":"ltr","editor":"રીચ ટેકà«àª·à«àª¤à« àªàª¡à«€àªŸàª°","common":{"editorHelp":"પà«àª°à«‡àª¸ ALT 0 મદદ માટ","browseServer":"સરà«àªµàª° બà«àª°àª¾àª‰àª કરો","url":"URL","protocol":"પà«àª°à«‹àªŸà«‹àª•ૉલ","upload":"અપલોડ","uploadSubmit":"આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚","image":"ચિતà«àª°","flash":"ફà«àª²à«…શ","form":"ફૉરà«àª®/પતà«àª°àª•","checkbox":"ચેક બોકà«àª¸","radio":"રેડિઓ બટન","textField":"ટેકà«àª¸à«àªŸ ફીલà«àª¡, શબà«àª¦ કà«àª·à«‡àª¤à«àª°","textarea":"ટેકà«àª¸à«àªŸ àªàª°àª¿àª†, શબà«àª¦ વિસà«àª¤àª¾àª°","hiddenField":"ગà«àªªà«àª¤ કà«àª·à«‡àª¤à«àª°","button":"બટન","select":"પસંદગી કà«àª·à«‡àª¤à«àª°","imageButton":"ચિતà«àª° બટન","notSet":"<સેટ નથી>","id":"Id","name":"નામ","langDir":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDirLtr":"ડાબે થી જમણે (LTR)","langDirRtl":"જમણે થી ડાબે (RTL)","langCode":"ભાષા કોડ","longDescr":"વધારે માહિતી માટે URL","cssClass":"સà«àªŸàª¾àª‡àª²-શીટ કà«àª²àª¾àª¸","advisoryTitle":"મà«àª–à«àª¯ મથાળà«àª‚","cssStyle":"સà«àªŸàª¾àª‡àª²","ok":"ઠીક છે","cancel":"રદ કરવà«àª‚","close":"બંધ કરવà«àª‚","preview":"જોવà«àª‚","resize":"ખેંચી ને યોગà«àª¯ કરવà«àª‚","generalTab":"જનરલ","advancedTab":"અડà«àªµàª¾àª¨à«àª¸àª¡","validateNumberFailed":"આ રકમ આકડો નથી.","confirmNewPage":"સવે કારà«àª¯ વગરનà«àª‚ ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવà«àª‚ પાનà«àª‚ ખોલવà«àª‚ છે?","confirmCancel":"ઘણા વિકલà«àªªà«‹ બદલાયા છે. તમારે આ બોકà«àª·à« બંધ કરવà«àª‚ છે?","options":"વિકલà«àªªà«‹","target":"લકà«àª·à«àª¯","targetNew":"નવી વિનà«àª¡à«‹ (_blank)","targetTop":"ઉપરની વિનà«àª¡à«‹ (_top)","targetSelf":"àªàªœ વિનà«àª¡à«‹ (_self)","targetParent":"પેરનટ વિનà«àª¡à«‹ (_parent)","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","styles":"શૈલી","cssClasses":"શૈલી કલાસીસ","width":"પહોળાઈ","height":"ઊંચાઈ","align":"લાઇનદોરીમાં ગોઠવવà«àª‚","alignLeft":"ડાબી બાજૠગોઠવવà«àª‚","alignRight":"જમણી","alignCenter":"મધà«àª¯ સેનà«àªŸàª°","alignTop":"ઉપર","alignMiddle":"વચà«àªšà«‡","alignBottom":"નીચે","invalidValue":"Invalid value.","invalidHeight":"ઉંચાઈ àªàª• આંકડો હોવો જોઈàª.","invalidWidth":"પોહળ ઈ àªàª• આંકડો હોવો જોઈàª.","invalidCssLength":"\"%1\" ની વેલà«àª¯à« àªàª• પોસીટીવ આંકડો હોવો જોઈઠઅથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.","invalidHtmlLength":"\"%1\" ની વેલà«àª¯à« àªàª• પોસીટીવ આંકડો હોવો જોઈઠઅથવા HTML measurement unit (px or %) વગર.","invalidInlineStyle":"ઈનલાઈન સà«àªŸàª¾àªˆàª² ની વેલà«àª¯à« \"name : value\" ના ફોરà«àª®à«‡àªŸ માં હોવી જોઈàª, વચà«àªšà«‡ સેમી-કોલોન જોઈàª.","cssLengthTooltip":"પિકà«àª·à«àª²à« નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.","unavailable":"%1<span class=\"cke_accessibility\">, નથી મળતà«àª‚</span>"},"about":{"copy":"કોપીરાઈટ &copy; $1. ઓલ રાઈટà«àª¸ ","dlgTitle":"CKEditor વિષે","help":"મદદ માટે $1 તપાસો","moreInfo":"લાયસનસની માહિતી માટે અમારી વેબ સાઈટ","title":"CKEditor વિષે","userGuide":"CKEditor યà«àªàª°à«àª¸ ગાઈડ"},"basicstyles":{"bold":"બોલà«àª¡/સà«àªªàª·à«àªŸ","italic":"ઇટેલિક, તà«àª°àª¾àª‚સા","strike":"છેકી નાખવà«àª‚","subscript":"àªàª• ચિહà«àª¨àª¨à«€ નીચે કરેલà«àª‚ બીજà«àª‚ ચિહà«àª¨","superscript":"àªàª• ચિહà«àª¨ ઉપર કરેલà«àª‚ બીજà«àª‚ ચિહà«àª¨.","underline":"અનà«àª¡àª°à«àª²àª¾àª‡àª¨, નીચે લીટી"},"blockquote":{"toolbar":"બà«àª²à«‰àª•-કોટ, અવતરણચિહà«àª¨à«‹"},"clipboard":{"copy":"નકલ","copyError":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का पà¥à¤°à¤¯à¥‹à¤— करें।","cut":"કાપવà«àª‚","cutError":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.","paste":"પેસà«àªŸ","pasteArea":"પેસà«àªŸ કરવાની જગà«àª¯àª¾","pasteMsg":"Ctrl/Cmd+V નો પà«àª°àª¯à«‹àª— કરી પેસà«àªŸ કરો","securityMsg":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસના કારણે,àªàª¡àª¿àªŸàª° તમારા કિલà«àªªàª¬à«‹àª°à«àª¡ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિનà«àª¡à«‹àª®àª¾àª‚ ફરીથી પેસà«àªŸ કરવà«àª‚ પડશે.","title":"પેસà«àªŸ"},"contextmenu":{"options":"કોનà«àª¤à«‡àª•à«àª·à«àª¤à« મેનà«àª¨àª¾ વિકલà«àªªà«‹"},"toolbar":{"toolbarCollapse":"ટૂલબાર નાનà«àª‚ કરવà«àª‚","toolbarExpand":"ટૂલબાર મોટà«àª‚ કરવà«àª‚","toolbarGroups":{"document":"દસà«àª¤àª¾àªµà«‡àªœ","clipboard":"કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡/અન","editing":"àªàª¡à«€àªŸ કરવà«àª‚","forms":"ફોરà«àª®","basicstyles":"બેસિકૠસà«àªŸàª¾àª‡àª²","paragraph":"ફકરો","links":"લીંક","insert":"ઉમેરવà«àª‚","styles":"સà«àªŸàª¾àª‡àª²","colors":"રંગ","tools":"ટૂલà«àª¸"},"toolbars":"àªàª¡à«€àªŸàª° ટૂલ બાર"},"elementspath":{"eleLabel":"àªàª²à«€àª®à«‡àª¨à«àªŸà«àª¸ નો ","eleTitle":"àªàª²à«€àª®à«‡àª¨à«àªŸ %1"},"list":{"bulletedlist":"બà«àª²à«‡àªŸ સૂચિ","numberedlist":"સંખà«àª¯àª¾àª‚કન સૂચિ"},"indent":{"indent":"ઇનà«àª¡à«‡àª¨à«àªŸ, લીટીના આરંભમાં જગà«àª¯àª¾ વધારવી","outdent":"ઇનà«àª¡à«‡àª¨à«àªŸ લીટીના આરંભમાં જગà«àª¯àª¾ ઘટાડવી"},"format":{"label":"ફૉનà«àªŸ ફૉરà«àª®àªŸ, રચનાની શૈલી","panelTitle":"ફૉનà«àªŸ ફૉરà«àª®àªŸ, રચનાની શૈલી","tag_address":"સરનામà«àª‚","tag_div":"શીરà«àª·àª• (DIV)","tag_h1":"શીરà«àª·àª• 1","tag_h2":"શીરà«àª·àª• 2","tag_h3":"શીરà«àª·àª• 3","tag_h4":"શીરà«àª·àª• 4","tag_h5":"શીરà«àª·àª• 5","tag_h6":"શીરà«àª·àª• 6","tag_p":"સામાનà«àª¯","tag_pre":"ફૉરà«àª®àªŸà«‡àª¡"},"horizontalrule":{"toolbar":"સમસà«àª¤àª°à«€àª¯ રેખા ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી"},"image":{"alertUrl":"ચિતà«àª°àª¨à«€ URL ટાઇપ કરો","alt":"ઑલà«àªŸàª°à«àª¨àªŸ ટેકà«àª¸à«àªŸ","border":"બોરà«àª¡àª°","btnUpload":"આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚","button2Img":"તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવà«àª‚ છે.","hSpace":"સમસà«àª¤àª°à«€àª¯ જગà«àª¯àª¾","img2Button":"તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવà«àª‚ છે.","infoTab":"ચિતà«àª° ની જાણકારી","linkTab":"લિંક","lockRatio":"લૉક ગà«àª£à«‹àª¤à«àª¤àª°","menu":"ચિતà«àª°àª¨àª¾ ગà«àª£","resetSize":"રીસેટ સાઇàª","title":"ચિતà«àª°àª¨àª¾ ગà«àª£","titleButton":"ચિતà«àª° બટનના ગà«àª£","upload":"અપલોડ","urlMissing":"ઈમેજની મૂળ URL છે નહી.","vSpace":"લંબરૂપ જગà«àª¯àª¾","validateBorder":"બોરà«àª¡à«‡àª° આંકડો હોવો જોઈàª.","validateHSpace":"HSpaceઆંકડો હોવો જોઈàª.","validateVSpace":"VSpace આંકડો હોવો જોઈàª. "},"fakeobjects":{"anchor":"અનકર","flash":"ફà«àª²à«‡àª¶ ","hiddenfield":"હિડન ","iframe":"IFrame","unknown":"અનનોન ઓબà«àªœà«‡àª•à«àªŸ"},"link":{"acccessKey":"àªàª•à«àª¸à«‡àª¸ કી","advanced":"અડà«àªµàª¾àª¨à«àª¸àª¡","advisoryContentType":"મà«àª–à«àª¯ કનà«àªŸà«‡àª¨à«àªŸ પà«àª°àª•ાર","advisoryTitle":"મà«àª–à«àª¯ મથાળà«àª‚","anchor":{"toolbar":"àªàª‚કર ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી","menu":"àªàª‚કરના ગà«àª£","title":"àªàª‚કરના ગà«àª£","name":"àªàª‚કરનà«àª‚ નામ","errorName":"àªàª‚કરનà«àª‚ નામ ટાઈપ કરો","remove":"સà«àª¥àª¿àª° નકરવà«àª‚"},"anchorId":"àªàª‚કર àªàª²àª¿àª®àª¨à«àªŸ Id થી પસંદ કરો","anchorName":"àªàª‚કર નામથી પસંદ કરો","charset":"લિંક રિસૉરà«àª¸ કૅરિકà«àªŸàª° સેટ","cssClasses":"સà«àªŸàª¾àª‡àª²-શીટ કà«àª²àª¾àª¸","emailAddress":"ઈ-મેલ સરનામà«àª‚","emailBody":"સંદેશ","emailSubject":"ઈ-મેલ વિષય","id":"Id","info":"લિંક ઇનà«àª«à«‰ ટૅબ","langCode":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDir":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","menu":" લિંક àªàª¡àª¿àªŸ/માં ફેરફાર કરવો","name":"નામ","noAnchors":"(ડૉકà«àª¯à«àª®àª¨à«àªŸàª®àª¾àª‚ àªàª‚કરની સંખà«àª¯àª¾)","noEmail":"ઈ-મેલ સરનામà«àª‚ ટાઇપ કરો","noUrl":"લિંક URL ટાઇપ કરો","other":"<other> <અનà«àª¯>","popupDependent":"ડિપેનà«àª¡àª¨à«àªŸ (Netscape)","popupFeatures":"પૉપ-અપ વિનà«àª¡à«‹ ફીચરસૅ","popupFullScreen":"ફà«àª² સà«àª•à«àª°à«€àª¨ (IE)","popupLeft":"ડાબી બાજà«","popupLocationBar":"લોકેશન બાર","popupMenuBar":"મેનà«àª¯à«‚ બાર","popupResizable":"રીસાઈàªàªàª¬àª²","popupScrollBars":"સà«àª•à«àª°à«‹àª² બાર","popupStatusBar":"સà«àªŸà«…ટસ બાર","popupToolbar":"ટૂલ બાર","popupTop":"જમણી બાજà«","rel":"સંબંધની સà«àª¥àª¿àª¤àª¿","selectAnchor":"àªàª‚કર પસંદ કરો","styles":"સà«àªŸàª¾àª‡àª²","tabIndex":"ટૅબ ઇનà«àª¡à«‡àª•à«àª¸","target":"ટારà«àª—ેટ/લકà«àª·à«àª¯","targetFrame":"<ફà«àª°à«‡àª®>","targetFrameName":"ટારà«àª—ેટ ફà«àª°à«‡àª® નà«àª‚ નામ","targetPopup":"<પૉપ-અપ વિનà«àª¡à«‹>","targetPopupName":"પૉપ-અપ વિનà«àª¡à«‹ નà«àª‚ નામ","title":"લિંક","toAnchor":"આ પેજનો àªàª‚કર","toEmail":"ઈ-મેલ","toUrl":"URL","toolbar":"લિંક ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી","type":"લિંક પà«àª°àª•ાર","unlink":"લિંક કાઢવી","upload":"અપલોડ"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"મોટà«àª‚ કરવà«àª‚","minimize":"નાનà«àª‚ કરવà«àª‚"},"pastetext":{"button":"પેસà«àªŸ (ટેકà«àª¸à«àªŸ)","title":"પેસà«àªŸ (ટેકà«àª¸à«àªŸ)"},"pastefromword":{"confirmCleanup":"તમે જે ટેકà«àª·à«àª¤à« કોપી કરી રહà«àª¯àª¾ છો ટે વરà«àª¡ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?","error":"પેસà«àªŸ કરેલો ડેટા ઇનà«àªŸàª°àª¨àª² àªàª°àª° ના લીથે સાફ કરી શકાયો નથી.","title":"પેસà«àªŸ (વડૅ ટેકà«àª¸à«àªŸ)","toolbar":"પેસà«àªŸ (વડૅ ટેકà«àª¸à«àªŸ)"},"removeformat":{"toolbar":"ફૉરà«àª®àªŸ કાઢવà«àª‚"},"sourcearea":{"toolbar":"મૂળ કે પà«àª°àª¾àª¥àª®àª¿àª• દસà«àª¤àª¾àªµà«‡àªœ"},"specialchar":{"options":"સà«àªªà«‡àª¶àª¿àª…લ કરેકà«àªŸàª°àª¨àª¾ વિકલà«àªªà«‹","title":"સà«àªªà«‡àª¶àª¿àª…લ વિશિષà«àªŸ અકà«àª·àª° પસંદ કરો","toolbar":"વિશિષà«àªŸ અકà«àª·àª° ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚"},"scayt":{"about":"SCAYT વિષે","aboutTab":"વિષે","addWord":"શબà«àª¦ ઉમેરવો","allCaps":"ઓલ-કેપà«àª¸ વરà«àª¡ છોડી દો.","dic_create":"બનાવવà«àª‚","dic_delete":"કાઢી નાખવà«àª‚","dic_field_name":"શબà«àª¦àª•ોશ નામ","dic_info":"પેહલા User Dictionary, Cookie તરીકે સà«àªŸà«‹àª° થાય છે. પણ Cookie ની સમતા ઓછી છે. જયારે User Dictionary, Cookie તરીકે સà«àªŸà«‹àª° ના કરી શકાય, તà«àª¯àª¾àª°à«‡ તે અમારા સરà«àªµàª° પર સà«àªŸà«‹àª° થાય છે. તમારી વà«àª¯àª¤àª¿àª—ત ડીકસà«àª¨àª°à«€ ને સરà«àªµàª° પર સà«àªŸà«‹àª° કરવા માટે તમારે તેનà«àª‚ નામ આપવà«àª‚ પડશે. જો તમે તમારી ડીકસà«àª¨àª°à«€ નà«àª‚ નામ આપેલà«àª‚ હોય તો તમે રિસà«àªŸà«‹àª° બટન કà«àª²à«€àª• કરી શકો.","dic_rename":"નવà«àª‚ નામ આપવà«àª‚","dic_restore":"પાછà«àª‚ ","dictionariesTab":"શબà«àª¦àª•ોશ","disable":"SCAYT ડિસેબલ કરવà«àª‚","emptyDic":"ડિકà«àª¸àª¨àª°à«€àª¨à«àª‚ નામ ખાલી ના હોય.","enable":"SCAYT àªàª¨à«‡àª¬àª² કરવà«àª‚","ignore":"ઇગà«àª¨à«‹àª°","ignoreAll":"બધા ઇગà«àª¨à«‹àª° ","ignoreDomainNames":"ડોમેન નામ છોડી દો.","langs":"ભાષાઓ","languagesTab":"ભાષા","mixedCase":"મિકà«àª¸ કેસ વરà«àª¡ છોડી દો.","mixedWithDigits":"આંકડા વાળા શબà«àª¦ છોડી દો.","moreSuggestions":"વધારે વિકલà«àªªà«‹","opera_title":"ઓપેરામાં સપોરà«àªŸ નથી","options":"વિકલà«àªªà«‹","optionsTab":"વિકલà«àªªà«‹","title":"ટાઈપ કરતા સà«àªªà«‡àª² તપાસો","toggle":"SCAYT ટોગલ","noSuggestions":"No suggestion"},"stylescombo":{"label":"શૈલી/રીત","panelTitle":"ફોરà«àª®à«‡àªŸ ","panelTitle1":"બà«àª²à«‹àª• ","panelTitle2":"ઈનલાઈન ","panelTitle3":"ઓબà«àªœà«‡àª•à«àªŸ પદà«àª§àª¤àª¿"},"table":{"border":"કોઠાની બાજà«(બોરà«àª¡àª°) સાઇàª","caption":"મથાળà«àª‚/કૅપà«àª¶àª¨ ","cell":{"menu":"કોષના ખાના","insertBefore":"પહેલાં કોષ ઉમેરવો","insertAfter":"પછી કોષ ઉમેરવો","deleteCell":"કોષ ડિલીટ/કાઢી નાખવો","merge":"કોષ ભેગા કરવા","mergeRight":"જમણી બાજૠભેગા કરવા","mergeDown":"નીચે ભેગા કરવા","splitHorizontal":"કોષને સમસà«àª¤àª°à«€àª¯ વિભાજન કરવà«àª‚","splitVertical":"કોષને સીધà«àª‚ ને ઊભà«àª‚ વિભાજન કરવà«àª‚","title":"સેલના ગà«àª£","cellType":"સેલનો પà«àª°àª•ાર","rowSpan":"આડી કટારની જગà«àª¯àª¾","colSpan":"ઊભી કતારની જગà«àª¯àª¾","wordWrap":"વરà«àª¡ રેપ","hAlign":"સપાટ લાઈનદોરી","vAlign":"ઊભી લાઈનદોરી","alignBaseline":"બસે લાઈન","bgColor":"પાછાળનો રંગ","borderColor":"બોરà«àª¡à«‡àª° રંગ","data":"સà«àªµà«€àª•ૃત માહિતી","header":"મથાળà«àª‚","yes":"હા","no":"ના","invalidWidth":"સેલની પોહલાઈ આંકડો હોવો જોઈàª.","invalidHeight":"સેલની ઊંચાઈ આંકડો હોવો જોઈàª.","invalidRowSpan":"રો સà«àªªàª¾àª¨ આંકડો હોવો જોઈàª.","invalidColSpan":"કોલમ સà«àªªàª¾àª¨ આંકડો હોવો જોઈàª.","chooseColor":"પસંદ કરવà«àª‚"},"cellPad":"સેલ પૅડિંગ","cellSpace":"સેલ અંતર","column":{"menu":"કૉલમ/ઊભી કટાર","insertBefore":"પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી","insertAfter":"પછી કૉલમ/ઊભી કટાર ઉમેરવી","deleteColumn":"કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી"},"columns":"કૉલમ/ઊભી કટાર","deleteTable":"કોઠો ડિલીટ/કાઢી નાખવà«àª‚","headers":"મથાળા","headersBoth":"બેવà«àª‚","headersColumn":"પહેલી ઊભી કટાર","headersNone":"નથી ","headersRow":"પહેલી કટાર","invalidBorder":"બોરà«àª¡àª° àªàª• આંકડો હોવો જોઈàª","invalidCellPadding":"સેલની અંદરની જગà«àª¯àª¾ સà«àª¨à«àª¯ કરતા વધારે હોવી જોઈàª.","invalidCellSpacing":"સેલ વચà«àªšà«‡àª¨à«€ જગà«àª¯àª¾ સà«àª¨à«àª¯ કરતા વધારે હોવી જોઈàª.","invalidCols":"ઉભી કટાર, 0 કરતા વધારે હોવી જોઈàª.","invalidHeight":"ટેબલની ઊંચાઈ આંકડો હોવો જોઈàª.","invalidRows":"આડી કટાર, 0 કરતા વધારે હોવી જોઈàª.","invalidWidth":"ટેબલની પોહલાઈ આંકડો હોવો જોઈàª.","menu":"ટેબલ, કોઠાનà«àª‚ મથાળà«àª‚","row":{"menu":"પંકà«àª¤àª¿àª¨àª¾ ખાના","insertBefore":"પહેલાં પંકà«àª¤àª¿ ઉમેરવી","insertAfter":"પછી પંકà«àª¤àª¿ ઉમેરવી","deleteRow":"પંકà«àª¤àª¿àª“ ડિલીટ/કાઢી નાખવી"},"rows":"પંકà«àª¤àª¿àª¨àª¾ ખાના","summary":"ટૂંકો àªàª¹à«‡àªµàª¾àª²","title":"ટેબલ, કોઠાનà«àª‚ મથાળà«àª‚","toolbar":"ટેબલ, કોઠો","widthPc":"પà«àª°àª¤àª¿àª¶àª¤","widthPx":"પિકસલ","widthUnit":"પોહાલાઈ àªàª•મ"},"undo":{"redo":"રિડૂ; પછી હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી","undo":"રદ કરવà«àª‚; પહેલાં હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી"},"wsc":{"btnIgnore":"ઇગà«àª¨à«‹àª°/અવગણના કરવી","btnIgnoreAll":"બધાની ઇગà«àª¨à«‹àª°/અવગણના કરવી","btnReplace":"બદલવà«àª‚","btnReplaceAll":"બધા બદલી કરો","btnUndo":"અનà«àª¡à«‚","changeTo":"આનાથી બદલવà«àª‚","errorLoading":"સરà«àªµàª¿àª¸ àªàªªà«àª²à«€àª•ેશન લોડ નથી થ: %s.","ieSpellDownload":"સà«àªªà«‡àª²-ચેકર ઇનà«àª¸à«àªŸà«‹àª² નથી. શà«àª‚ તમે ડાઉનલોડ કરવા માંગો છો?","manyChanges":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: %1 શબà«àª¦ બદલયા છે","noChanges":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: àªàª•પણ શબà«àª¦ બદલયો નથી","noMispell":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: ખોટી જોડણી મળી નથી","noSuggestions":"- કઇ સજેશન નથી -","notAvailable":"માફ કરશો, આ સà«àªµàª¿àª§àª¾ ઉપલબà«àª§ નથી","notInDic":"શબà«àª¦àª•ોશમાં નથી","oneChange":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: àªàª• શબà«àª¦ બદલયો છે","progress":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક ચાલૠછે...","title":"સà«àªªà«‡àª² ","toolbar":"જોડણી (સà«àªªà«‡àª²àª¿àª‚ગ) તપાસવી"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/he.js b/mod/ckeditor/vendors/ckeditor/lang/he.js
new file mode 100644
index 000000000..eb5c31342
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/he.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['he']={"dir":"rtl","editor":"עורך טקסט עשיר","common":{"editorHelp":"לחץ ×לט ALT + 0 לעזרה","browseServer":"סייר השרת","url":"כתובת (URL)","protocol":"פרוטוקול","upload":"העל××”","uploadSubmit":"שליחה לשרת","image":"תמונה","flash":"פל×ש","form":"טופס","checkbox":"תיבת סימון","radio":"לחצן ×פשרויות","textField":"שדה טקסט","textarea":"×יזור טקסט","hiddenField":"שדה חבוי","button":"כפתור","select":"שדה בחירה","imageButton":"כפתור תמונה","notSet":"<×œ× × ×§×‘×¢>","id":"זיהוי (ID)","name":"ש×","langDir":"כיוון שפה","langDirLtr":"שמ×ל לימין (LTR)","langDirRtl":"ימין לשמ×ל (RTL)","langCode":"קוד שפה","longDescr":"קישור לתי×ור מפורט","cssClass":"מחלקת עיצוב (CSS Class)","advisoryTitle":"כותרת מוצעת","cssStyle":"סגנון","ok":"×ישור","cancel":"ביטול","close":"סגירה","preview":"תצוגה מקדימה","resize":"יש לגרור בכדי לשנות ×ת הגודל","generalTab":"כללי","advancedTab":"×פשרויות מתקדמות","validateNumberFailed":"הערך חייב להיות מספרי.","confirmNewPage":"כל ×”×©×™× ×•×™×™× ×©×œ× × ×©×ž×¨×• ×™×בדו. ×”×× ×œ×”×¢×œ×•×ª דף חדש?","confirmCancel":"חלק מה×פשרויות שונו, ×”×× ×œ×¡×’×•×¨ ×ת הדי×לוג?","options":"×פשרויות","target":"מטרה","targetNew":"חלון חדש (_blank)","targetTop":"החלון העליון ביותר (_top)","targetSelf":"×ותו חלון (_self)","targetParent":"חלון ×”×ב (_parent)","langDirLTR":"שמ×ל לימין (LTR)","langDirRTL":"ימין לשמ×ל (RTL)","styles":"סגנון","cssClasses":"מחלקות גליונות סגנון","width":"רוחב","height":"גובה","align":"יישור","alignLeft":"לשמ×ל","alignRight":"לימין","alignCenter":"מרכז","alignTop":"למעלה","alignMiddle":"ל×מצע","alignBottom":"לתחתית","invalidValue":"ערך ×œ× ×—×•×§×™.","invalidHeight":"הגובה חייב להיות מספר.","invalidWidth":"הרוחב חייב להיות מספר.","invalidCssLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי ×¢× ×ו ×œ×œ× ×™×—×™×“×ª מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, ×ו pc).","invalidHtmlLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי ×¢× ×ו ×œ×œ× ×™×—×™×“×ª מידה חוקית של HTML (px ×ו %).","invalidInlineStyle":"הערך שצויין לשדה הסגנון חייב להכיל זוג ×¢×¨×›×™× ×חד ×ו יותר בפורמט \"×©× : ערך\", ×ž×•×¤×¨×“×™× ×¢×œ ידי נקודה-פסיק.","cssLengthTooltip":"יש להכניס מספר המייצג ×¤×™×§×¡×œ×™× ×ו מספר ×¢× ×™×—×™×“×ª גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, ×œ× ×–×ž×™×Ÿ</span>"},"about":{"copy":"Copyright &copy; $1. כל הזכויות שמורות.","dlgTitle":"×ודות CKEditor","help":"היכנסו ל$1 לעזרה.","moreInfo":"למידע נוסף בקרו ב×תרנו:","title":"×ודות CKEditor","userGuide":"מדריך המשתמש של CKEditor"},"basicstyles":{"bold":"מודגש","italic":"נטוי","strike":"כתיב מחוק","subscript":"כתיב תחתון","superscript":"כתיב עליון","underline":"קו תחתון"},"blockquote":{"toolbar":"בלוק ציטוט"},"clipboard":{"copy":"העתקה","copyError":"הגדרות ×”×בטחה בדפדפן שלך ×œ× ×ž×פשרות לעורך לבצע פעולות העתקה ×וטומטיות. יש להשתמש במקלדת ×œ×©× ×›×š (Ctrl/Cmd+C).","cut":"גזירה","cutError":"הגדרות ×”×בטחה בדפדפן שלך ×œ× ×ž×פשרות לעורך לבצע פעולות גזירה ×וטומטיות. יש להשתמש במקלדת ×œ×©× ×›×š (Ctrl/Cmd+X).","paste":"הדבקה","pasteArea":"×יזור הדבקה","pasteMsg":"× × ×œ×”×“×‘×™×§ בתוך הקופסה ב×מצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>×ישור</b>.","securityMsg":"עקב הגדרות ×בטחה בדפדפן, ×œ× × ×™×ª×Ÿ לגשת ×ל לוח ×”×’×–×™×¨×™× (Clipboard) בצורה ישירה. × × ×œ×”×“×‘×™×§ שוב בחלון ×–×”.","title":"הדבקה"},"contextmenu":{"options":"×פשרויות תפריט ההקשר"},"toolbar":{"toolbarCollapse":"מזעור סרגל כלי×","toolbarExpand":"הרחבת סרגל כלי×","toolbarGroups":{"document":"מסמך","clipboard":"לוח ×”×’×–×™×¨×™× (Clipboard)/צעד ×חרון","editing":"עריכה","forms":"טפסי×","basicstyles":"עיצוב בסיסי","paragraph":"פסקה","links":"קישורי×","insert":"הכנסה","styles":"עיצוב","colors":"צבעי×","tools":"כלי×"},"toolbars":"סרגלי ×›×œ×™× ×©×œ העורך"},"elementspath":{"eleLabel":"×¢×¥ ×”×למנטי×","eleTitle":"%1 ×למנט"},"list":{"bulletedlist":"רשימת נקודות","numberedlist":"רשימה ממוספרת"},"indent":{"indent":"הגדלת ×”×–×—×”","outdent":"הקטנת ×”×–×—×”"},"format":{"label":"עיצוב","panelTitle":"עיצוב","tag_address":"כתובת","tag_div":"נורמלי (DIV)","tag_h1":"כותרת","tag_h2":"כותרת 2","tag_h3":"כותרת 3","tag_h4":"כותרת 4","tag_h5":"כותרת 5","tag_h6":"כותרת 6","tag_p":"נורמלי","tag_pre":"קוד"},"horizontalrule":{"toolbar":"הוספת קו ×ופקי"},"image":{"alertUrl":"יש להקליד ×ת כתובת התמונה","alt":"טקסט חלופי","border":"מסגרת","btnUpload":"שליחה לשרת","button2Img":"×”×× ×œ×”×¤×•×š ×ת תמונת הכפתור לתמונה פשוטה?","hSpace":"מרווח ×ופקי","img2Button":"×”×× ×œ×”×¤×•×š ×ת התמונה לכפתור תמונה?","infoTab":"מידע על התמונה","linkTab":"קישור","lockRatio":"נעילת היחס","menu":"תכונות התמונה","resetSize":"×יפוס הגודל","title":"מ×פייני התמונה","titleButton":"מ×פיני כפתור תמונה","upload":"העל××”","urlMissing":"כתובת התמונה חסרה.","vSpace":"מרווח ×× ×›×™","validateBorder":"שדה המסגרת חייב להיות מספר של×.","validateHSpace":"שדה המרווח ×”×ופקי חייב להיות מספר של×.","validateVSpace":"שדה המרווח ×”×× ×›×™ חייב להיות מספר של×."},"fakeobjects":{"anchor":"עוגן","flash":"סרטון פל×ש","hiddenfield":"שדה חבוי","iframe":"חלון פנימי (iframe)","unknown":"×ובייקט ×œ× ×™×“×•×¢"},"link":{"acccessKey":"מקש גישה","advanced":"×פשרויות מתקדמות","advisoryContentType":"Content Type מוצע","advisoryTitle":"כותרת מוצעת","anchor":{"toolbar":"הוספת/עריכת נקודת עיגון","menu":"מ×פייני נקודת עיגון","title":"מ×פייני נקודת עיגון","name":"×©× ×œ× ×§×•×“×ª עיגון","errorName":"יש להקליד ×©× ×œ× ×§×•×“×ª עיגון","remove":"מחיקת נקודת עיגון"},"anchorId":"עפ\"×™ זיהוי (ID) ×”×למנט","anchorName":"עפ\"×™ ×©× ×”×¢×•×’×Ÿ","charset":"קידוד המש×ב המקושר","cssClasses":"גיליונות עיצוב קבוצות","emailAddress":"כתובת הדו×\"ל","emailBody":"גוף ההודעה","emailSubject":"× ×•×©× ×”×”×•×“×¢×”","id":"זיהוי (ID)","info":"מידע על הקישור","langCode":"קוד שפה","langDir":"כיוון שפה","langDirLTR":"שמ×ל לימין (LTR)","langDirRTL":"ימין לשמ×ל (RTL)","menu":"מ×פייני קישור","name":"ש×","noAnchors":"(×ין ×¢×•×’× ×™× ×–×ž×™× ×™× ×‘×“×£)","noEmail":"יש להקליד ×ת כתובת הדו×\"ל","noUrl":"יש להקליד ×ת כתובת הקישור (URL)","other":"<×חר>","popupDependent":"תלוי (Netscape)","popupFeatures":"תכונות החלון הקופץ","popupFullScreen":"מסך ×ž×œ× (IE)","popupLeft":"×ž×™×§×•× ×¦×“ שמ×ל","popupLocationBar":"סרגל כתובת","popupMenuBar":"סרגל תפריט","popupResizable":"שינוי גודל","popupScrollBars":"ניתן לגלילה","popupStatusBar":"סרגל חיווי","popupToolbar":"סרגל הכלי×","popupTop":"×ž×™×§×•× ×¦×“ עליון","rel":"קשר גומלין","selectAnchor":"בחירת עוגן","styles":"סגנון","tabIndex":"מספר ט×ב","target":"מטרה","targetFrame":"<מסגרת>","targetFrameName":"×©× ×ž×¡×’×¨×ª היעד","targetPopup":"<חלון קופץ>","targetPopupName":"×©× ×”×—×œ×•×Ÿ הקופץ","title":"קישור","toAnchor":"עוגן בעמוד ×–×”","toEmail":"דו×\"ל","toUrl":"כתובת (URL)","toolbar":"הוספת/עריכת קישור","type":"סוג קישור","unlink":"הסרת הקישור","upload":"העל××”"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"הגדלה למקסימו×","minimize":"הקטנה למינימו×"},"pastetext":{"button":"הדבקה כטקסט פשוט","title":"הדבקה כטקסט פשוט"},"pastefromword":{"confirmCleanup":"נר××” הטקסט שבכוונתך להדביק מקורו בקובץ וורד. ×”×× ×‘×¨×¦×•× ×š לנקות ×ותו ×˜×¨× ×”×”×“×‘×§×”?","error":"×œ× × ×™×ª×Ÿ ×”×™×” לנקות ×ת המידע בשל תקלה פנימית.","title":"הדבקה מ-Word","toolbar":"הדבקה מ-Word"},"removeformat":{"toolbar":"הסרת העיצוב"},"sourcearea":{"toolbar":"מקור"},"specialchar":{"options":"×פשרויות ×ª×•×•×™× ×ž×™×•×—×“×™×","title":"בחירת תו מיוחד","toolbar":"הוספת תו מיוחד"},"scayt":{"about":"×ודות SCAYT","aboutTab":"×ודות","addWord":"הוספת מילה","allCaps":"×”×ª×¢×œ× ×ž×ž×™×œ×™× ×©×›×œ ×ותיותיהן גדולות","dic_create":"יצירה","dic_delete":"מחיקה","dic_field_name":"×©× ×”×ž×™×œ×•×Ÿ","dic_info":"בהתחלה מילון המשתמש מ×וחסן בעוגיה, ×ך עוגיות מוגבלות במקו×. ×›×שר המילון מגיע לגודל בו ×”×•× ×ינו יכול להת×כסן בעוגיה, המילון צריך להת×כסן בשרתנו. ×œ×©× ×›×š עליך לתת ×©× ×œ×ž×™×œ×•×Ÿ. ×× ×›×‘×¨ יש לך מילון מ×וחסן, יש להכניס ×ת שמו וללחוץ על כפתור השחזור.","dic_rename":"שינוי ש×","dic_restore":"שחזור","dictionariesTab":"מילון","disable":"בטל SCAYT","emptyDic":"יש לבחור מילון.","enable":"×פשר SCAYT","ignore":"התעלמות","ignoreAll":"התעלמות מהכל","ignoreDomainNames":"×”×ª×¢×œ× ×ž×©×ž×•×ª מתח×","langs":"שפות","languagesTab":"שפות","mixedCase":"×”×ª×¢×œ× ×ž×ž×™×œ×™× ×¢× ×ותיות גדולות וקטנות ביחד","mixedWithDigits":"×”×ª×¢×œ× ×ž×ž×™×œ×™× ×¢× ×ž×¡×¤×¨×™×","moreSuggestions":"הצעות נוספות","opera_title":"×œ× ×–×ž×™×Ÿ בדפדפן ×ופרה","options":"×פשרויות","optionsTab":"×פשרויות","title":"בדיקת ×יות בזמן כתיבה (SCAYT)","toggle":"שינוי SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"סגנון","panelTitle":"סגנונות פורמט","panelTitle1":"סגנונות בלוק","panelTitle2":"סגנונות רצף","panelTitle3":"סגנונות ×ובייקט"},"table":{"border":"גודל מסגרת","caption":"כיתוב","cell":{"menu":"מ×פייני ת×","insertBefore":"הוספת ×ª× ×œ×¤× ×™","insertAfter":"הוספת ×ª× ×חרי","deleteCell":"מחיקת ת××™×","merge":"מיזוג ת××™×","mergeRight":"מזג ימינה","mergeDown":"מזג למטה","splitHorizontal":"פיצול ×ª× ×ופקית","splitVertical":"פיצול ×ª× ×נכית","title":"תכונות הת×","cellType":"סוג הת×","rowSpan":"מתיחת השורות","colSpan":"מתיחת הת××™×","wordWrap":"מניעת גלישת שורות","hAlign":"יישור ×ופקי","vAlign":"יישור ×× ×›×™","alignBaseline":"שורת בסיס","bgColor":"צבע רקע","borderColor":"צבע מסגרת","data":"מידע","header":"כותרת","yes":"כן","no":"ל×","invalidWidth":"שדה רוחב ×”×ª× ×—×™×™×‘ להיות מספר.","invalidHeight":"שדה גובה ×”×ª× ×—×™×™×‘ להיות מספר.","invalidRowSpan":"שדה מתיחת השורות חייב להיות מספר של×.","invalidColSpan":"שדה מתיחת העמודות חייב להיות מספר של×.","chooseColor":"בחר"},"cellPad":"ריפוד ת×","cellSpace":"מרווח ת×","column":{"menu":"עמודה","insertBefore":"הוספת עמודה לפני","insertAfter":"הוספת עמודה ×חרי","deleteColumn":"מחיקת עמודות"},"columns":"עמודות","deleteTable":"מחק טבלה","headers":"כותרות","headersBoth":"שניה×","headersColumn":"עמודה ר×שונה","headersNone":"×ין","headersRow":"שורה ר×שונה","invalidBorder":"שדה גודל המסגרת חייב להיות מספר.","invalidCellPadding":"שדה ריפוד הת××™× ×—×™×™×‘ להיות מספר חיובי.","invalidCellSpacing":"שדה ריווח הת××™× ×—×™×™×‘ להיות מספר חיובי.","invalidCols":"שדה מספר העמודות חייב להיות מספר גדול מ 0.","invalidHeight":"שדה גובה הטבלה חייב להיות מספר.","invalidRows":"שדה מספר השורות חייב להיות מספר גדול מ 0.","invalidWidth":"שדה רוחב הטבלה חייב להיות מספר.","menu":"מ×פייני טבלה","row":{"menu":"שורה","insertBefore":"הוספת שורה לפני","insertAfter":"הוספת שורה ×חרי","deleteRow":"מחיקת שורות"},"rows":"שורות","summary":"תקציר","title":"מ×פייני טבלה","toolbar":"טבלה","widthPc":"×חוז","widthPx":"פיקסלי×","widthUnit":"יחידת רוחב"},"undo":{"redo":"חזרה על צעד ×חרון","undo":"ביטול צעד ×חרון"},"wsc":{"btnIgnore":"התעלמות","btnIgnoreAll":"התעלמות מהכל","btnReplace":"החלפה","btnReplaceAll":"החלפת הכל","btnUndo":"החזרה","changeTo":"שינוי ל","errorLoading":"שגי××” בהעל×ת השירות: %s.","ieSpellDownload":"בודק ×”×יות ×œ× ×ž×•×ª×§×Ÿ, ×”×× ×œ×”×•×¨×™×“×•?","manyChanges":"בדיקות ×יות הסתיימה: %1 ×ž×™×œ×™× ×©×•× ×•","noChanges":"בדיקות ×יות הסתיימה: ×œ× ×©×•× ×ª×” ××£ מילה","noMispell":"בדיקות ×יות הסתיימה: ×œ× × ×ž×¦×ו שגי×ות כתיב","noSuggestions":"- ×ין הצעות -","notAvailable":"×œ× × ×ž×¦× ×©×™×¨×•×ª זמין.","notInDic":"×œ× × ×ž×¦× ×‘×ž×™×œ×•×Ÿ","oneChange":"בדיקות ×יות הסתיימה: שונתה מילה ×חת","progress":"בודק ×”×יות בתהליך בדיקה....","title":"בדיקת ×יות","toolbar":"בדיקת ×יות"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/hi.js b/mod/ckeditor/vendors/ckeditor/lang/hi.js
new file mode 100644
index 000000000..27e92df09
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/hi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hi']={"dir":"ltr","editor":"रिच टेकà¥à¤¸à¥à¤Ÿ à¤à¤¡à¤¿à¤Ÿà¤°","common":{"editorHelp":"मदद के लिये ALT 0 दबाà¤","browseServer":"सरà¥à¤µà¤° बà¥à¤°à¤¾à¤‰à¥› करें","url":"URL","protocol":"पà¥à¤°à¥‹à¤Ÿà¥‹à¤•ॉल","upload":"अपलोड","uploadSubmit":"इसे सरà¥à¤µà¤° को भेजें","image":"तसà¥à¤µà¥€à¤°","flash":"फ़à¥à¤²à¥ˆà¤¶","form":"फ़ॉरà¥à¤®","checkbox":"चॅक बॉकà¥à¤¸","radio":"रेडिओ बटन","textField":"टेकà¥à¤¸à¥à¤Ÿ फ़ीलà¥à¤¡","textarea":"टेकà¥à¤¸à¥à¤Ÿ à¤à¤°à¤¿à¤¯à¤¾","hiddenField":"गà¥à¤ªà¥à¤¤ फ़ीलà¥à¤¡","button":"बटन","select":"चà¥à¤¨à¤¾à¤µ फ़ीलà¥à¤¡","imageButton":"तसà¥à¤µà¥€à¤° बटन","notSet":"<सॅट नहीं>","id":"Id","name":"नाम","langDir":"भाषा लिखने की दिशा","langDirLtr":"बायें से दायें (LTR)","langDirRtl":"दायें से बायें (RTL)","langCode":"भाषा कोड","longDescr":"अधिक विवरण के लिठURL","cssClass":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","advisoryTitle":"परामरà¥à¤¶ शीरà¥à¤¶à¤•","cssStyle":"सà¥à¤Ÿà¤¾à¤‡à¤²","ok":"ठीक है","cancel":"रदà¥à¤¦ करें","close":"Close","preview":"पà¥à¤°à¥€à¤µà¥à¤¯à¥‚","resize":"Resize","generalTab":"सामानà¥à¤¯","advancedTab":"à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"टारà¥à¤—ेट","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","styles":"सà¥à¤Ÿà¤¾à¤‡à¤²","cssClasses":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","width":"चौड़ाई","height":"ऊà¤à¤šà¤¾à¤ˆ","align":"à¤à¤²à¤¾à¤‡à¤¨","alignLeft":"दायें","alignRight":"दायें","alignCenter":"बीच में","alignTop":"ऊपर","alignMiddle":"मधà¥à¤¯","alignBottom":"नीचे","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"बोलà¥à¤¡","italic":"इटैलिक","strike":"सà¥à¤Ÿà¥à¤°à¤¾à¤‡à¤• थà¥à¤°à¥‚","subscript":"अधोलेख","superscript":"अभिलेख","underline":"रेखांकण"},"blockquote":{"toolbar":"बà¥à¤²à¥‰à¤•-कोट"},"clipboard":{"copy":"कॉपी","copyError":"आपके बà¥à¤°à¤¾à¤†à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कॉपी करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl/Cmd+C) का पà¥à¤°à¤¯à¥‹à¤— करें।","cut":"कट","cutError":"आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कट करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl/Cmd+X) का पà¥à¤°à¤¯à¥‹à¤— करें।","paste":"पेसà¥à¤Ÿ","pasteArea":"Paste Area","pasteMsg":"Ctrl/Cmd+V का पà¥à¤°à¤¯à¥‹à¤— करके पेसà¥à¤Ÿ करें और ठीक है करें.","securityMsg":"आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°Kश सैटिंग के कारण, à¤à¤¡à¤¿à¤Ÿà¤° आपके कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ डेटा को नहीं पा सकता है. आपको उसे इस विनà¥à¤¡à¥‹ में दोबारा पेसà¥à¤Ÿ करना होगा.","title":"पेसà¥à¤Ÿ"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"à¤à¤¡à¤¿à¤Ÿà¤° टूलबार"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"बà¥à¤²à¥…ट सूची","numberedlist":"अंकीय सूची"},"indent":{"indent":"इनà¥à¤¡à¥…नà¥à¤Ÿ बà¥à¤¾à¤¯à¥‡à¤‚","outdent":"इनà¥à¤¡à¥…नà¥à¤Ÿ कम करें"},"format":{"label":"फ़ॉरà¥à¤®à¥ˆà¤Ÿ","panelTitle":"फ़ॉरà¥à¤®à¥ˆà¤Ÿ","tag_address":"पता","tag_div":"शीरà¥à¤·à¤• (DIV)","tag_h1":"शीरà¥à¤·à¤• 1","tag_h2":"शीरà¥à¤·à¤• 2","tag_h3":"शीरà¥à¤·à¤• 3","tag_h4":"शीरà¥à¤·à¤• 4","tag_h5":"शीरà¥à¤·à¤• 5","tag_h6":"शीरà¥à¤·à¤• 6","tag_p":"साधारण","tag_pre":"फ़ॉरà¥à¤®à¥ˆà¤Ÿà¥…ड"},"horizontalrule":{"toolbar":"हॉरिज़ॉनà¥à¤Ÿà¤² रेखा इनà¥à¤¸à¤°à¥à¤Ÿ करें"},"image":{"alertUrl":"तसà¥à¤µà¥€à¤° का URL टाइप करें ","alt":"वैकलà¥à¤ªà¤¿à¤• टेकà¥à¤¸à¥à¤Ÿ","border":"बॉरà¥à¤¡à¤°","btnUpload":"इसे सरà¥à¤µà¤° को भेजें","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"हॉरिज़ॉनà¥à¤Ÿà¤² सà¥à¤ªà¥‡à¤¸","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"तसà¥à¤µà¥€à¤° की जानकारी","linkTab":"लिंक","lockRatio":"लॉक अनà¥à¤ªà¤¾à¤¤","menu":"तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","resetSize":"रीसॅट साइज़","title":"तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","titleButton":"तसà¥à¤µà¥€à¤° बटन पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","upload":"अपलोड","urlMissing":"Image source URL is missing.","vSpace":"वरà¥à¤Ÿà¤¿à¤•ल सà¥à¤ªà¥‡à¤¸","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"à¤à¤‚कर इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","flash":"Flash Animation","hiddenfield":"गà¥à¤ªà¥à¤¤ फ़ीलà¥à¤¡","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"à¤à¤•à¥à¤¸à¥…स की","advanced":"à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡","advisoryContentType":"परामरà¥à¤¶ कनà¥à¤Ÿà¥…नà¥à¤Ÿ पà¥à¤°à¤•ार","advisoryTitle":"परामरà¥à¤¶ शीरà¥à¤¶à¤•","anchor":{"toolbar":"à¤à¤‚कर इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","menu":"à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","title":"à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","name":"à¤à¤‚कर का नाम","errorName":"à¤à¤‚कर का नाम टाइप करें","remove":"Remove Anchor"},"anchorId":"à¤à¤²à¥€à¤®à¥…नà¥à¤Ÿ Id से","anchorName":"à¤à¤‚कर नाम से","charset":"लिंक रिसोरà¥à¤¸ करॅकà¥à¤Ÿà¤° सॅट","cssClasses":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","emailAddress":"ई-मेल पता","emailBody":"संदेश","emailSubject":"संदेश विषय","id":"Id","info":"लिंक ","langCode":"भाषा लिखने की दिशा","langDir":"भाषा लिखने की दिशा","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","menu":"लिंक संपादन","name":"नाम","noAnchors":"(डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ में à¤à¤‚करà¥à¤¸ की संखà¥à¤¯à¤¾)","noEmail":"ई-मेल पता टाइप करें","noUrl":"लिंक URL टाइप करें","other":"<अनà¥à¤¯>","popupDependent":"डिपेनà¥à¤¡à¥…नà¥à¤Ÿ (Netscape)","popupFeatures":"पॉप-अप विनà¥à¤¡à¥‹ फ़ीचरà¥à¤¸","popupFullScreen":"फ़à¥à¤² सà¥à¤•à¥à¤°à¥€à¤¨ (IE)","popupLeft":"बायीं तरफ","popupLocationBar":"लोकेशन बार","popupMenuBar":"मॅनà¥à¤¯à¥‚ बार","popupResizable":"Resizable","popupScrollBars":"सà¥à¤•à¥à¤°à¥‰à¤² बार","popupStatusBar":"सà¥à¤Ÿà¥‡à¤Ÿà¤¸ बार","popupToolbar":"टूल बार","popupTop":"दायीं तरफ","rel":"Relationship","selectAnchor":"à¤à¤‚कर चà¥à¤¨à¥‡à¤‚","styles":"सà¥à¤Ÿà¤¾à¤‡à¤²","tabIndex":"टैब इनà¥à¤¡à¥…कà¥à¤¸","target":"टारà¥à¤—ेट","targetFrame":"<फ़à¥à¤°à¥‡à¤®>","targetFrameName":"टारà¥à¤—ेट फ़à¥à¤°à¥‡à¤® का नाम","targetPopup":"<पॉप-अप विनà¥à¤¡à¥‹>","targetPopupName":"पॉप-अप विनà¥à¤¡à¥‹ का नाम","title":"लिंक","toAnchor":"इस पेज का à¤à¤‚कर","toEmail":"ई-मेल","toUrl":"URL","toolbar":"लिंक इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","type":"लिंक पà¥à¤°à¤•ार","unlink":"लिंक हटायें","upload":"अपलोड"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"मेकà¥à¤¸à¤¿à¤®à¤¾à¤ˆà¤œà¤¼","minimize":"मिनिमाईज़"},"pastetext":{"button":"पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)","title":"पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"पेसà¥à¤Ÿ (वरà¥à¤¡ से)","toolbar":"पेसà¥à¤Ÿ (वरà¥à¤¡ से)"},"removeformat":{"toolbar":"फ़ॉरà¥à¤®à¥ˆà¤Ÿ हटायें"},"sourcearea":{"toolbar":"सोरà¥à¤¸"},"specialchar":{"options":"Special Character Options","title":"विशेष करॅकà¥à¤Ÿà¤° चà¥à¤¨à¥‡à¤‚","toolbar":"विशेष करॅकà¥à¤Ÿà¤° इनà¥à¤¸à¤°à¥à¤Ÿ करें"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"सà¥à¤Ÿà¤¾à¤‡à¤²","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"बॉरà¥à¤¡à¤° साइज़","caption":"शीरà¥à¤·à¤•","cell":{"menu":"खाना","insertBefore":"पहले सैल डालें","insertAfter":"बाद में सैल डालें","deleteCell":"सैल डिलीट करें","merge":"सैल मिलायें","mergeRight":"बाà¤à¤¯à¤¾ विलय","mergeDown":"नीचे विलय करें","splitHorizontal":"सैल को कà¥à¤·à¥ˆà¤¤à¤¿à¤œ सà¥à¤¥à¤¿à¤¤à¤¿ में विभाजित करें","splitVertical":"सैल को लमà¥à¤¬à¤¾à¤•ार में विभाजित करें","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"सैल पैडिंग","cellSpace":"सैल अंतर","column":{"menu":"कालम","insertBefore":"पहले कालम डालें","insertAfter":"बाद में कालम डालें","deleteColumn":"कालम डिलीट करें"},"columns":"कालम","deleteTable":"टेबल डिलीट करें","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","row":{"menu":"पंकà¥à¤¤à¤¿","insertBefore":"पहले पंकà¥à¤¤à¤¿ डालें","insertAfter":"बाद में पंकà¥à¤¤à¤¿ डालें","deleteRow":"पंकà¥à¤¤à¤¿à¤¯à¤¾à¤ डिलीट करें"},"rows":"पंकà¥à¤¤à¤¿à¤¯à¤¾à¤","summary":"सारांश","title":"टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","toolbar":"टेबल","widthPc":"पà¥à¤°à¤¤à¤¿à¤¶à¤¤","widthPx":"पिकà¥à¤¸à¥ˆà¤²","widthUnit":"width unit"},"undo":{"redo":"रीडू","undo":"अनà¥à¤¡à¥‚"},"wsc":{"btnIgnore":"इगà¥à¤¨à¥‹à¤°","btnIgnoreAll":"सभी इगà¥à¤¨à¥‹à¤° करें","btnReplace":"रिपà¥à¤²à¥‡à¤¸","btnReplaceAll":"सभी रिपà¥à¤²à¥‡à¤¸ करें","btnUndo":"अनà¥à¤¡à¥‚","changeTo":"इसमें बदलें","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"सà¥à¤ªà¥…ल-चॅकर इनà¥à¤¸à¥à¤Ÿà¤¾à¤² नहीं किया गया है। कà¥à¤¯à¤¾ आप इसे डाउनलोड करना चाहेंगे?","manyChanges":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : %1 शबà¥à¤¦ बदले गये","noChanges":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š :कोई शबà¥à¤¦ नहीं बदला गया","noMispell":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : कोई गलत वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥…लिंग) नहीं पाई गई","noSuggestions":"- कोई सà¥à¤à¤¾à¤µ नहीं -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"शबà¥à¤¦à¤•ोश में नहीं","oneChange":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : à¤à¤• शबà¥à¤¦ बदला गया","progress":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š (सà¥à¤ªà¥…ल-चॅक) जारी है...","title":"Spell Check","toolbar":"वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥‡à¤²à¤¿à¤‚ग) जाà¤à¤š"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/hr.js b/mod/ckeditor/vendors/ckeditor/lang/hr.js
new file mode 100644
index 000000000..ef58fc198
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/hr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hr']={"dir":"ltr","editor":"Bogati ureÄ‘ivaÄ teksta","common":{"editorHelp":"Pritisni ALT 0 za pomoć","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"PoÅ¡alji","uploadSubmit":"PoÅ¡alji na server","image":"Slika","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smjer jezika","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Kôd jezika","longDescr":"DugaÄki opis URL","cssClass":"Stylesheet klase","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"PoniÅ¡ti","close":"Zatvori","preview":"Pregledaj","resize":"Povuci za promjenu veliÄine","generalTab":"Općenito","advancedTab":"Napredno","validateNumberFailed":"Ova vrijednost nije broj.","confirmNewPage":"Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite uÄitati novu stranicu?","confirmCancel":"Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?","options":"Opcije","target":"OdrediÅ¡te","targetNew":"Novi prozor (_blank)","targetTop":"VrÅ¡ni prozor (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Roditeljski prozor (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase stilova","width":"Å irina","height":"Visina","align":"Poravnaj","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"SrediÅ¡nje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dolje","invalidValue":"Invalid value.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Å irina mora biti broj.","invalidCssLength":"Vrijednost odreÄ‘ena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).","invalidHtmlLength":"Vrijednost odreÄ‘ena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).","invalidInlineStyle":"Vrijednost za linijski stil mora sadržavati jednu ili viÅ¡e definicija s formatom \"naziv:vrijednost\", odvojenih toÄka-zarezom.","cssLengthTooltip":"Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupno</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O CKEditoru","help":"Provjeri $1 za pomoć.","moreInfo":"Za informacije o licencama posjetite naÅ¡u web stranicu:","title":"O CKEditoru","userGuide":"VodiÄ za CKEditor korisnike"},"basicstyles":{"bold":"Podebljaj","italic":"Ukosi","strike":"Precrtano","subscript":"Subscript","superscript":"Superscript","underline":"Potcrtano"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Prostor za ljepljenje","pasteMsg":"Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki VaÅ¡eg pretraživaÄa, editor nema direktan pristup VaÅ¡em meÄ‘uspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.","title":"Zalijepi"},"contextmenu":{"options":"Opcije izbornika"},"toolbar":{"toolbarCollapse":"Smanji alatnu traku","toolbarExpand":"ProÅ¡iri alatnu traku","toolbarGroups":{"document":"Dokument","clipboard":"MeÄ‘uspremnik/PoniÅ¡ti","editing":"UreÄ‘ivanje","forms":"Forme","basicstyles":"Osnovni stilovi","paragraph":"Paragraf","links":"Veze","insert":"Umetni","styles":"Stilovi","colors":"Boje","tools":"Alatke"},"toolbars":"Alatne trake ureÄ‘ivaÄa teksta"},"elementspath":{"eleLabel":"Putanja elemenata","eleTitle":"%1 element"},"list":{"bulletedlist":"ObiÄna lista","numberedlist":"BrojÄana lista"},"indent":{"indent":"Pomakni udesno","outdent":"Pomakni ulijevo"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Ubaci vodoravnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"PoÅ¡alji na server","button2Img":"Želite li promijeniti odabrani gumb u jednostavnu sliku?","hSpace":"HSpace","img2Button":"Želite li promijeniti odabranu sliku u gumb?","infoTab":"Info slike","linkTab":"Link","lockRatio":"ZakljuÄaj odnos","menu":"Svojstva slika","resetSize":"ObriÅ¡i veliÄinu","title":"Svojstva slika","titleButton":"Image Button svojstva","upload":"PoÅ¡alji","urlMissing":"Nedostaje URL slike.","vSpace":"VSpace","validateBorder":"Okvir mora biti cijeli broj.","validateHSpace":"HSpace mora biti cijeli broj","validateVSpace":"VSpace mora biti cijeli broj."},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Sakriveno polje","iframe":"IFrame","unknown":"Nepoznati objekt"},"link":{"acccessKey":"Pristupna tipka","advanced":"Napredno","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Ubaci/promijeni sidro","menu":"Svojstva sidra","title":"Svojstva sidra","name":"Ime sidra","errorName":"Molimo unesite ime sidra","remove":"Ukloni sidro"},"anchorId":"Po Id elementa","anchorName":"Po nazivu sidra","charset":"Kodna stranica povezanih resursa","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smjer jezika","langDir":"Smjer jezika","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Promijeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Molimo upiÅ¡ite e-mail adresu","noUrl":"Molimo upiÅ¡ite URL link","other":"<drugi>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Promjenjiva veliÄina","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka s alatima","popupTop":"Gornja pozicija","rel":"Veza","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab Indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Ime ciljnog okvira","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/promijeni link","type":"Link vrsta","unlink":"Ukloni link","upload":"PoÅ¡alji"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Povećaj","minimize":"Smanji"},"pastetext":{"button":"Zalijepi kao Äisti tekst","title":"Zalijepi kao Äisti tekst"},"pastefromword":{"confirmCleanup":"Tekst koji želite zalijepiti Äini se da je kopiran iz Worda. Želite li prije oÄistiti tekst?","error":"Nije moguće oÄistiti podatke za ljepljenje zbog interne greÅ¡ke","title":"Zalijepi iz Worda","toolbar":"Zalijepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Opcije specijalnih znakova","title":"Odaberite posebni karakter","toolbar":"Ubaci posebne znakove"},"scayt":{"about":"O SCAYT","aboutTab":"O SCAYT","addWord":"Dodaj rijeÄ","allCaps":"Ignoriraj rijeÄi s velikim slovima","dic_create":"Napravi","dic_delete":"ObriÅ¡i","dic_field_name":"Naziv rijeÄnika","dic_info":"Na poÄetku se korisniÄki RijeÄnik sprema u Cookie. Nažalost, veliÄina im je ograniÄena. Kada korisniÄki RijeÄnik naraste preko te veliÄine, RijeÄnik će biti smjeÅ¡ten na naÅ¡ server. Kako bi se korisniÄki RijeÄnik spremio na naÅ¡ server morate odabrati naziv VaÅ¡eg RijeÄnika. Ukoliko ste već prije spremali RijeÄnik na naÅ¡e servere, unesite naziv RijeÄnika i pritisnite na Povrati.","dic_rename":"Promijeni naziv","dic_restore":"Povrati","dictionariesTab":"RjeÄnici","disable":"Onemogući SCAYT","emptyDic":"Naziv rjeÄnika ne smije biti prazno.","enable":"Omogući SCAYT","ignore":"Zanemari","ignoreAll":"Zanemari sve","ignoreDomainNames":"Ignoriraj nazive domena","langs":"Jezici","languagesTab":"Jezici","mixedCase":"Ignoriraj rijeÄi s mijeÅ¡anim slovima","mixedWithDigits":"Ignoriraj rijeÄi s brojevima","moreSuggestions":"ViÅ¡e prijedloga","opera_title":"Nije podržano u Operi","options":"Opcije","optionsTab":"Opcije","title":"Provjeri pravopis tijekom tipkanja (SCAYT)","toggle":"Omoguću/Onemogući SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilovi formatiranja","panelTitle1":"Block stilovi","panelTitle2":"Inline stilovi","panelTitle3":"Object stilovi"},"table":{"border":"VeliÄina okvira","caption":"Naslov","cell":{"menu":"Ćelija","insertBefore":"Ubaci ćeliju prije","insertAfter":"Ubaci ćeliju poslije","deleteCell":"IzbriÅ¡i ćelije","merge":"Spoji ćelije","mergeRight":"Spoji desno","mergeDown":"Spoji dolje","splitHorizontal":"Podijeli ćeliju vodoravno","splitVertical":"Podijeli ćeliju okomito","title":"Svojstva ćelije","cellType":"Vrsta ćelije","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Prelazak u novi red","hAlign":"Vodoravno poravnanje","vAlign":"Okomito poravnanje","alignBaseline":"Osnovna linija","bgColor":"Boja pozadine","borderColor":"Boja ruba","data":"Podatak","header":"Zaglavlje","yes":"Da","no":"ne","invalidWidth":"Å irina ćelije mora biti broj.","invalidHeight":"Visina ćelije mora biti broj.","invalidRowSpan":"Rows span mora biti cijeli broj.","invalidColSpan":"Columns span mora biti cijeli broj.","chooseColor":"Odaberi"},"cellPad":"Razmak ćelija","cellSpace":"Prostornost ćelija","column":{"menu":"Kolona","insertBefore":"Ubaci kolonu prije","insertAfter":"Ubaci kolonu poslije","deleteColumn":"IzbriÅ¡i kolone"},"columns":"Kolona","deleteTable":"IzbriÅ¡i tablicu","headers":"Zaglavlje","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"NiÅ¡ta","headersRow":"Prvi red","invalidBorder":"Debljina ruba mora biti broj.","invalidCellPadding":"Razmak ćelija mora biti broj.","invalidCellSpacing":"Prostornost ćelija mora biti broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tablice mora biti broj.","invalidRows":"Broj redova mora biti broj veći od 0.","invalidWidth":"Å irina tablice mora biti broj.","menu":"Svojstva tablice","row":{"menu":"Red","insertBefore":"Ubaci red prije","insertAfter":"Ubaci red poslije","deleteRow":"IzbriÅ¡i redove"},"rows":"Redova","summary":"Sažetak","title":"Svojstva tablice","toolbar":"Tablica","widthPc":"postotaka","widthPx":"piksela","widthUnit":"jedinica Å¡irine"},"undo":{"redo":"Ponovi","undo":"PoniÅ¡ti"},"wsc":{"btnIgnore":"Zanemari","btnIgnoreAll":"Zanemari sve","btnReplace":"Zamijeni","btnReplaceAll":"Zamijeni sve","btnUndo":"Vrati","changeTo":"Promijeni u","errorLoading":"GreÅ¡ka uÄitavanja aplikacije: %s.","ieSpellDownload":"Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?","manyChanges":"Provjera zavrÅ¡ena: Promijenjeno %1 rijeÄi","noChanges":"Provjera zavrÅ¡ena: Nije napravljena promjena","noMispell":"Provjera zavrÅ¡ena: Nema greÅ¡aka","noSuggestions":"-Nema preporuke-","notAvailable":"Žao nam je, ali usluga trenutno nije dostupna.","notInDic":"Nije u rjeÄniku","oneChange":"Provjera zavrÅ¡ena: Jedna rijeÄ promjenjena","progress":"Provjera u tijeku...","title":"Provjera pravopisa","toolbar":"Provjeri pravopis"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/hu.js b/mod/ckeditor/vendors/ckeditor/lang/hu.js
new file mode 100644
index 000000000..623149a81
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/hu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hu']={"dir":"ltr","editor":"HTML szerkesztÅ‘","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Böngészés a szerveren","url":"Hivatkozás","protocol":"Protokoll","upload":"Feltöltés","uploadSubmit":"Küldés a szerverre","image":"Kép","flash":"Flash","form":"Űrlap","checkbox":"JelölÅ‘négyzet","radio":"Választógomb","textField":"SzövegmezÅ‘","textarea":"Szövegterület","hiddenField":"RejtettmezÅ‘","button":"Gomb","select":"LegördülÅ‘ lista","imageButton":"Képgomb","notSet":"<nincs beállítva>","id":"Azonosító","name":"Név","langDir":"Ãrás iránya","langDirLtr":"Balról jobbra","langDirRtl":"Jobbról balra","langCode":"Nyelv kódja","longDescr":"Részletes leírás webcíme","cssClass":"Stíluskészlet","advisoryTitle":"Súgócimke","cssStyle":"Stílus","ok":"Rendben","cancel":"Mégsem","close":"Bezárás","preview":"ElÅ‘nézet","resize":"Húzza az átméretezéshez","generalTab":"Ãltalános","advancedTab":"További opciók","validateNumberFailed":"A mezÅ‘be csak számokat írhat.","confirmNewPage":"Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?","confirmCancel":"Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?","options":"Beállítások","target":"Cél","targetNew":"Új ablak (_blank)","targetTop":"LegfelsÅ‘ ablak (_top)","targetSelf":"Aktuális ablakban (_self)","targetParent":"SzülÅ‘ ablak (_parent)","langDirLTR":"Balról jobbra (LTR)","langDirRTL":"Jobbról balra (RTL)","styles":"Stílus","cssClasses":"Stíluslap osztály","width":"Szélesség","height":"Magasság","align":"Igazítás","alignLeft":"Bal","alignRight":"Jobbra","alignCenter":"Középre","alignTop":"Tetejére","alignMiddle":"Középre","alignBottom":"Aljára","invalidValue":"Invalid value.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","invalidCssLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).","invalidHtmlLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nem elérhetÅ‘</span>"},"about":{"copy":"Copyright &copy; $1. Minden jog fenntartva.","dlgTitle":"CKEditor névjegy","help":"Itt találsz segítséget: $1","moreInfo":"Licenszelési információkért kérjük látogassa meg weboldalunkat:","title":"CKEditor névjegy","userGuide":"CKEditor Felhasználói útmutató"},"basicstyles":{"bold":"Félkövér","italic":"DÅ‘lt","strike":"Ãthúzott","subscript":"Alsó index","superscript":"FelsÅ‘ index","underline":"Aláhúzott"},"blockquote":{"toolbar":"Idézet blokk"},"clipboard":{"copy":"Másolás","copyError":"A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","cut":"Kivágás","cutError":"A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","paste":"Beillesztés","pasteArea":"Beszúrás mezÅ‘","pasteMsg":"Másolja be az alábbi mezÅ‘be a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.","securityMsg":"A böngészÅ‘ biztonsági beállításai miatt a szerkesztÅ‘ nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.","title":"Beillesztés"},"contextmenu":{"options":"Helyi menü opciók"},"toolbar":{"toolbarCollapse":"Eszköztár összecsukása","toolbarExpand":"Eszköztár szétnyitása","toolbarGroups":{"document":"Dokumentum","clipboard":"Vágólap/Visszavonás","editing":"Szerkesztés","forms":"Űrlapok","basicstyles":"Alapstílusok","paragraph":"Bekezdés","links":"Hivatkozások","insert":"Beszúrás","styles":"Stílusok","colors":"Színek","tools":"Eszközök"},"toolbars":"SzerkesztÅ‘ Eszköztár"},"elementspath":{"eleLabel":"Elem utak","eleTitle":"%1 elem"},"list":{"bulletedlist":"Felsorolás","numberedlist":"Számozás"},"indent":{"indent":"Behúzás növelése","outdent":"Behúzás csökkentése"},"format":{"label":"Formátum","panelTitle":"Formátum","tag_address":"Címsor","tag_div":"Bekezdés (DIV)","tag_h1":"Fejléc 1","tag_h2":"Fejléc 2","tag_h3":"Fejléc 3","tag_h4":"Fejléc 4","tag_h5":"Fejléc 5","tag_h6":"Fejléc 6","tag_p":"Normál","tag_pre":"Formázott"},"horizontalrule":{"toolbar":"Elválasztóvonal beillesztése"},"image":{"alertUrl":"Töltse ki a kép webcímét","alt":"Buborék szöveg","border":"Keret","btnUpload":"Küldés a szerverre","button2Img":"A kiválasztott képgombból sima képet szeretne csinálni?","hSpace":"Vízsz. táv","img2Button":"A kiválasztott képbÅ‘l képgombot szeretne csinálni?","infoTab":"Alaptulajdonságok","linkTab":"Hivatkozás","lockRatio":"Arány megtartása","menu":"Kép tulajdonságai","resetSize":"Eredeti méret","title":"Kép tulajdonságai","titleButton":"Képgomb tulajdonságai","upload":"Feltöltés","urlMissing":"Hiányzik a kép URL-je","vSpace":"Függ. táv","validateBorder":"A keret méretének egész számot kell beírni!","validateHSpace":"Vízszintes távolságnak egész számot kell beírni!","validateVSpace":"FüggÅ‘leges távolságnak egész számot kell beírni!"},"fakeobjects":{"anchor":"Horgony","flash":"Flash animáció","hiddenfield":"Rejtett mezõ","iframe":"IFrame","unknown":"Ismeretlen objektum"},"link":{"acccessKey":"Billentyűkombináció","advanced":"További opciók","advisoryContentType":"Súgó tartalomtípusa","advisoryTitle":"Súgócimke","anchor":{"toolbar":"Horgony beillesztése/szerkesztése","menu":"Horgony tulajdonságai","title":"Horgony tulajdonságai","name":"Horgony neve","errorName":"Kérem adja meg a horgony nevét","remove":"Horgony eltávolítása"},"anchorId":"Azonosító szerint","anchorName":"Horgony név szerint","charset":"Hivatkozott tartalom kódlapja","cssClasses":"Stíluskészlet","emailAddress":"E-Mail cím","emailBody":"Üzenet","emailSubject":"Üzenet tárgya","id":"Id","info":"Alaptulajdonságok","langCode":"Ãrás iránya","langDir":"Ãrás iránya","langDirLTR":"Balról jobbra","langDirRTL":"Jobbról balra","menu":"Hivatkozás módosítása","name":"Név","noAnchors":"(Nincs horgony a dokumentumban)","noEmail":"Adja meg az E-Mail címet","noUrl":"Adja meg a hivatkozás webcímét","other":"<más>","popupDependent":"SzülÅ‘höz kapcsolt (csak Netscape)","popupFeatures":"Felugró ablak jellemzÅ‘i","popupFullScreen":"Teljes képernyÅ‘ (csak IE)","popupLeft":"Bal pozíció","popupLocationBar":"Címsor","popupMenuBar":"Menü sor","popupResizable":"Ãtméretezés","popupScrollBars":"GördítÅ‘sáv","popupStatusBar":"Ãllapotsor","popupToolbar":"Eszköztár","popupTop":"FelsÅ‘ pozíció","rel":"Kapcsolat típusa","selectAnchor":"Horgony választása","styles":"Stílus","tabIndex":"Tabulátor index","target":"Tartalom megjelenítése","targetFrame":"<keretben>","targetFrameName":"Keret neve","targetPopup":"<felugró ablakban>","targetPopupName":"Felugró ablak neve","title":"Hivatkozás tulajdonságai","toAnchor":"Horgony az oldalon","toEmail":"E-Mail","toUrl":"URL","toolbar":"Hivatkozás beillesztése/módosítása","type":"Hivatkozás típusa","unlink":"Hivatkozás törlése","upload":"Feltöltés"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Teljes méret","minimize":"Kis méret"},"pastetext":{"button":"Beillesztés formázatlan szövegként","title":"Beillesztés formázatlan szövegként"},"pastefromword":{"confirmCleanup":"Úgy tűnik a beillesztett szöveget Word-bÅ‘l másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)","error":"Egy belsÅ‘ hiba miatt nem sikerült megtisztítani a szöveget","title":"Beillesztés Word-bÅ‘l","toolbar":"Beillesztés Word-bÅ‘l"},"removeformat":{"toolbar":"Formázás eltávolítása"},"sourcearea":{"toolbar":"Forráskód"},"specialchar":{"options":"Speciális karakter opciók","title":"Speciális karakter választása","toolbar":"Speciális karakter beillesztése"},"scayt":{"about":"SCAYT névjegy","aboutTab":"Névjegy","addWord":"Szó hozzáadása","allCaps":"Nagybetűs szavak kihagyása","dic_create":"Létrehozás","dic_delete":"Törlés","dic_field_name":"Szótár neve","dic_info":"Kezdetben a felhasználói szótár böngészÅ‘ sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.","dic_rename":"Ãtnevezés","dic_restore":"Visszaállítás","dictionariesTab":"Szótár","disable":"SCAYT letiltása","emptyDic":"A szótár nevét meg kell adni.","enable":"SCAYT engedélyezése","ignore":"Kihagy","ignoreAll":"Összes kihagyása","ignoreDomainNames":"Domain nevek kihagyása","langs":"Nyelvek","languagesTab":"Nyelvek","mixedCase":"Kis és nagybetűt is tartalmazó szavak kihagyása","mixedWithDigits":"Számokat tartalmazó szavak kihagyása","moreSuggestions":"További javaslatok","opera_title":"Az Opera nem támogatja","options":"Beállítások","optionsTab":"Beállítások","title":"Helyesírás ellenÅ‘rzés gépelés közben","toggle":"SCAYT kapcsolása","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílus","panelTitle":"Formázási stílusok","panelTitle1":"Blokk stílusok","panelTitle2":"Inline stílusok","panelTitle3":"Objektum stílusok"},"table":{"border":"Szegélyméret","caption":"Felirat","cell":{"menu":"Cella","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteCell":"Cellák törlése","merge":"Cellák egyesítése","mergeRight":"Cellák egyesítése jobbra","mergeDown":"Cellák egyesítése lefelé","splitHorizontal":"Cellák szétválasztása vízszintesen","splitVertical":"Cellák szétválasztása függÅ‘legesen","title":"Cella tulajdonságai","cellType":"Cella típusa","rowSpan":"FüggÅ‘leges egyesítés","colSpan":"Vízszintes egyesítés","wordWrap":"Hosszú sorok törése","hAlign":"Vízszintes igazítás","vAlign":"FüggÅ‘leges igazítás","alignBaseline":"Alapvonalra","bgColor":"Háttér színe","borderColor":"Keret színe","data":"Adat","header":"Fejléc","yes":"Igen","no":"Nem","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidRowSpan":"A függÅ‘leges egyesítés mezÅ‘be csak számokat írhat.","invalidColSpan":"A vízszintes egyesítés mezÅ‘be csak számokat írhat.","chooseColor":"Válasszon"},"cellPad":"Cella belsÅ‘ margó","cellSpace":"Cella térköz","column":{"menu":"Oszlop","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteColumn":"Oszlopok törlése"},"columns":"Oszlopok","deleteTable":"Táblázat törlése","headers":"Fejlécek","headersBoth":"MindkettÅ‘","headersColumn":"ElsÅ‘ oszlop","headersNone":"Nincsenek","headersRow":"ElsÅ‘ sor","invalidBorder":"A szegélyméret mezÅ‘be csak számokat írhat.","invalidCellPadding":"A cella belsÅ‘ margó mezÅ‘be csak számokat írhat.","invalidCellSpacing":"A cella térköz mezÅ‘be csak számokat írhat.","invalidCols":"Az oszlopok számának nagyobbnak kell lenni mint 0.","invalidHeight":"A magasság mezÅ‘be csak számokat írhat.","invalidRows":"A sorok számának nagyobbnak kell lenni mint 0.","invalidWidth":"A szélesség mezÅ‘be csak számokat írhat.","menu":"Táblázat tulajdonságai","row":{"menu":"Sor","insertBefore":"Beszúrás fölé","insertAfter":"Beszúrás alá","deleteRow":"Sorok törlése"},"rows":"Sorok","summary":"Leírás","title":"Táblázat tulajdonságai","toolbar":"Táblázat","widthPc":"százalék","widthPx":"képpont","widthUnit":"Szélesség egység"},"undo":{"redo":"Ismétlés","undo":"Visszavonás"},"wsc":{"btnIgnore":"Kihagyja","btnIgnoreAll":"Mindet kihagyja","btnReplace":"Csere","btnReplaceAll":"Összes cseréje","btnUndo":"Visszavonás","changeTo":"Módosítás","errorLoading":"Hiba a szolgáltatás host betöltése közben: %s.","ieSpellDownload":"A helyesírás-ellenÅ‘rzÅ‘ nincs telepítve. Szeretné letölteni most?","manyChanges":"Helyesírás-ellenÅ‘rzés kész: %1 szó cserélve","noChanges":"Helyesírás-ellenÅ‘rzés kész: Nincs változtatott szó","noMispell":"Helyesírás-ellenÅ‘rzés kész: Nem találtam hibát","noSuggestions":"Nincs javaslat","notAvailable":"Sajnálom, de a szolgáltatás jelenleg nem elérhetÅ‘.","notInDic":"Nincs a szótárban","oneChange":"Helyesírás-ellenÅ‘rzés kész: Egy szó cserélve","progress":"Helyesírás-ellenÅ‘rzés folyamatban...","title":"Helyesírás ellenörzÅ‘","toolbar":"Helyesírás-ellenÅ‘rzés"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/is.js b/mod/ckeditor/vendors/ckeditor/lang/is.js
new file mode 100644
index 000000000..7dabfa3a0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/is.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['is']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Fletta í skjalasafni","url":"Vefslóð","protocol":"Samskiptastaðall","upload":"Senda upp","uploadSubmit":"Hlaða upp","image":"Setja inn mynd","flash":"Flash","form":"Setja inn innsláttarform","checkbox":"Setja inn hökunarreit","radio":"Setja inn valhnapp","textField":"Setja inn textareit","textarea":"Setja inn textasvæði","hiddenField":"Setja inn falið svæði","button":"Setja inn hnapp","select":"Setja inn lista","imageButton":"Setja inn myndahnapp","notSet":"<ekkert valið>","id":"Auðkenni","name":"Nafn","langDir":"Lesstefna","langDirLtr":"Frá vinstri til hægri (LTR)","langDirRtl":"Frá hægri til vinstri (RTL)","langCode":"Tungumálakóði","longDescr":"Nánari lýsing","cssClass":"Stílsniðsflokkur","advisoryTitle":"Titill","cssStyle":"Stíll","ok":"à lagi","cancel":"Hætta við","close":"Close","preview":"Forskoða","resize":"Resize","generalTab":"Almennt","advancedTab":"Tæknilegt","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Mark","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","styles":"Stíll","cssClasses":"Stílsniðsflokkur","width":"Breidd","height":"Hæð","align":"Jöfnun","alignLeft":"Vinstri","alignRight":"Hægri","alignCenter":"Miðjað","alignTop":"Efst","alignMiddle":"Miðjuð","alignBottom":"Neðst","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Feitletrað","italic":"Skáletrað","strike":"Yfirstrikað","subscript":"Niðurskrifað","superscript":"Uppskrifað","underline":"Undirstrikað"},"blockquote":{"toolbar":"Inndráttur"},"clipboard":{"copy":"Afrita","copyError":"Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).","cut":"Klippa","cutError":"Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).","paste":"Líma","pasteArea":"Paste Area","pasteMsg":"Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.","securityMsg":"Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.","title":"Líma"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Punktalisti","numberedlist":"Númeraður listi"},"indent":{"indent":"Minnka inndrátt","outdent":"Auka inndrátt"},"format":{"label":"Stílsnið","panelTitle":"Stílsnið","tag_address":"Vistfang","tag_div":"Venjulegt (DIV)","tag_h1":"Fyrirsögn 1","tag_h2":"Fyrirsögn 2","tag_h3":"Fyrirsögn 3","tag_h4":"Fyrirsögn 4","tag_h5":"Fyrirsögn 5","tag_h6":"Fyrirsögn 6","tag_p":"Venjulegt letur","tag_pre":"Forsniðið"},"horizontalrule":{"toolbar":"Lóðrétt lína"},"image":{"alertUrl":"Sláðu inn slóðina að myndinni","alt":"Baklægur texti","border":"Rammi","btnUpload":"Hlaða upp","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Vinstri bil","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Almennt","linkTab":"Stikla","lockRatio":"Festa stærðarhlutfall","menu":"Eigindi myndar","resetSize":"Reikna stærð","title":"Eigindi myndar","titleButton":"Eigindi myndahnapps","upload":"Hlaða upp","urlMissing":"Image source URL is missing.","vSpace":"Hægri bil","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Skammvalshnappur","advanced":"Tæknilegt","advisoryContentType":"Tegund innihalds","advisoryTitle":"Titill","anchor":{"toolbar":"Stofna/breyta kaflamerki","menu":"Eigindi kaflamerkis","title":"Eigindi kaflamerkis","name":"Nafn bókamerkis","errorName":"Sláðu inn nafn bókamerkis!","remove":"Remove Anchor"},"anchorId":"Eftir auðkenni einingar","anchorName":"Eftir akkerisnafni","charset":"Táknróf","cssClasses":"Stílsniðsflokkur","emailAddress":"Netfang","emailBody":"Meginmál","emailSubject":"Efni","id":"Auðkenni","info":"Almennt","langCode":"Lesstefna","langDir":"Lesstefna","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","menu":"Breyta stiklu","name":"Nafn","noAnchors":"<Engin bókamerki á skrá>","noEmail":"Sláðu inn netfang!","noUrl":"Sláðu inn veffang stiklunnar!","other":"<annar>","popupDependent":"Háð venslum (Netscape)","popupFeatures":"Eigindi sprettiglugga","popupFullScreen":"Heilskjár (IE)","popupLeft":"Fjarlægð frá vinstri","popupLocationBar":"Fanglína","popupMenuBar":"Vallína","popupResizable":"Resizable","popupScrollBars":"Skrunstikur","popupStatusBar":"Stöðustika","popupToolbar":"Verkfærastika","popupTop":"Fjarlægð frá efri brún","rel":"Relationship","selectAnchor":"Veldu akkeri","styles":"Stíll","tabIndex":"Raðnúmer innsláttarreits","target":"Mark","targetFrame":"<rammi>","targetFrameName":"Nafn markglugga","targetPopup":"<sprettigluggi>","targetPopupName":"Nafn sprettiglugga","title":"Stikla","toAnchor":"Bókamerki á þessari síðu","toEmail":"Netfang","toUrl":"Vefslóð","toolbar":"Stofna/breyta stiklu","type":"Stikluflokkur","unlink":"Fjarlægja stiklu","upload":"Senda upp"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Líma sem ósniðinn texta","title":"Líma sem ósniðinn texta"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Líma úr Word","toolbar":"Líma úr Word"},"removeformat":{"toolbar":"Fjarlægja snið"},"sourcearea":{"toolbar":"Kóði"},"specialchar":{"options":"Special Character Options","title":"Velja tákn","toolbar":"Setja inn merki"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílflokkur","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Breidd ramma","caption":"Titill","cell":{"menu":"Reitur","insertBefore":"Skjóta inn reiti fyrir aftan","insertAfter":"Skjóta inn reiti fyrir framan","deleteCell":"Fella reit","merge":"Sameina reiti","mergeRight":"Sameina til hægri","mergeDown":"Sameina niður á við","splitHorizontal":"Kljúfa reit lárétt","splitVertical":"Kljúfa reit lóðrétt","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Reitaspássía","cellSpace":"Bil milli reita","column":{"menu":"Dálkur","insertBefore":"Skjóta inn dálki vinstra megin","insertAfter":"Skjóta inn dálki hægra megin","deleteColumn":"Fella dálk"},"columns":"Dálkar","deleteTable":"Fella töflu","headers":"Fyrirsagnir","headersBoth":"Hvort tveggja","headersColumn":"Fyrsti dálkur","headersNone":"Engar","headersRow":"Fyrsta röð","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Eigindi töflu","row":{"menu":"Röð","insertBefore":"Skjóta inn röð fyrir ofan","insertAfter":"Skjóta inn röð fyrir neðan","deleteRow":"Eyða röð"},"rows":"Raðir","summary":"Ãfram","title":"Eigindi töflu","toolbar":"Tafla","widthPc":"prósent","widthPx":"myndeindir","widthUnit":"width unit"},"undo":{"redo":"Hætta við afturköllun","undo":"Afturkalla"},"wsc":{"btnIgnore":"Hunsa","btnIgnoreAll":"Hunsa allt","btnReplace":"Skipta","btnReplaceAll":"Skipta öllu","btnUndo":"Til baka","changeTo":"Tillaga","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Villuleit ekki sett upp.<br>Viltu setja hana upp?","manyChanges":"Villuleit lokið: %1 orðum breytt","noChanges":"Villuleit lokið: Engu orði breytt","noMispell":"Villuleit lokið: Engin villa fannst","noSuggestions":"- engar tillögur -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ekki í orðabókinni","oneChange":"Villuleit lokið: Einu orði breytt","progress":"Villuleit í gangi...","title":"Spell Check","toolbar":"Villuleit"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/it.js b/mod/ckeditor/vendors/ckeditor/lang/it.js
new file mode 100644
index 000000000..435cec9a0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/it.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['it']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"<non impostato>","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, non disponibile</span>"},"about":{"copy":"Copyright &copy; $1. Tutti i diritti riservati.","dlgTitle":"Riguardo CKEditor","help":"Vedi $1 per l'aiuto.","moreInfo":"Per le informazioni sulla licenza si prega di visitare il nostro sito:","title":"Riguardo CKEditor","userGuide":"Guida Utente CKEditor"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"blockquote":{"toolbar":"Citazione"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"contextmenu":{"options":"Opzioni del menù contestuale"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Indietro","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"elementspath":{"eleLabel":"Percorso degli elementi","eleTitle":"%1 elemento"},"list":{"bulletedlist":"Elenco puntato","numberedlist":"Elenco numerato"},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"horizontalrule":{"toolbar":"Inserisci riga orizzontale"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"Proprietà immagine","resetSize":"Reimposta dimensione","title":"Proprietà immagine","titleButton":"Proprietà bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"link":{"acccessKey":"Scorciatoia<br />da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"Proprietà ancora","title":"Proprietà ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"<altro>","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"<riquadro>","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"<finestra popup>","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nella pagina","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserisci/Modifica collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Massimizza","minimize":"Minimizza"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"pastefromword":{"confirmCleanup":"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?","error":"Non è stato possibile eliminarre il testo incollato a causa di un errore interno.","title":"Incolla da Word","toolbar":"Incolla da Word"},"removeformat":{"toolbar":"Elimina formattazione"},"sourcearea":{"toolbar":"Codice Sorgente"},"specialchar":{"options":"Opzioni carattere speciale","title":"Seleziona carattere speciale","toolbar":"Inserisci carattere speciale"},"scayt":{"about":"About COMS","aboutTab":"Info","addWord":"Aggiungi Parola","allCaps":"Ignora Parole in maiuscolo","dic_create":"Crea","dic_delete":"Cancella","dic_field_name":"Nome del dizionario","dic_info":"Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.","dic_rename":"Rinomina","dic_restore":"Ripristina","dictionariesTab":"Dizionari","disable":"Disabilita COMS","emptyDic":"Il nome del dizionario non può essere vuoto.","enable":"Abilita COMS","ignore":"Ignora","ignoreAll":"Ignora tutti","ignoreDomainNames":"Ignora nomi di dominio","langs":"Lingue","languagesTab":"Lingue","mixedCase":"Ignora parole con maiuscole e minuscole","mixedWithDigits":"Ignora parole con numeri","moreSuggestions":"Altri suggerimenti","opera_title":"Non supportato da Opera","options":"Opzioni","optionsTab":"Opzioni","title":"Controllo Ortografico Mentre Scrivi","toggle":"Inverti abilitazione SCOMS","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stile","panelTitle":"Stili di formattazione","panelTitle1":"Stili per blocchi","panelTitle2":"Stili in linea","panelTitle3":"Stili per oggetti"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"Proprietà della cella","cellType":"Tipo di cella","rowSpan":"Su più righe","colSpan":"Su più colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"Proprietà tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"Proprietà tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unità larghezza"},"undo":{"redo":"Ripristina","undo":"Annulla"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora tutto","btnReplace":"Cambia","btnReplaceAll":"Cambia tutto","btnUndo":"Annulla","changeTo":"Cambia in","errorLoading":"Errore nel caricamento dell'host col servizio applicativo: %s.","ieSpellDownload":"Contollo ortografico non installato. Lo vuoi scaricare ora?","manyChanges":"Controllo ortografico completato: %1 parole cambiate","noChanges":"Controllo ortografico completato: nessuna parola cambiata","noMispell":"Controllo ortografico completato: nessun errore trovato","noSuggestions":"- Nessun suggerimento -","notAvailable":"Il servizio non è momentaneamente disponibile.","notInDic":"Non nel dizionario","oneChange":"Controllo ortografico completato: 1 parola cambiata","progress":"Controllo ortografico in corso","title":"Controllo ortografico","toolbar":"Correttore ortografico"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ja.js b/mod/ckeditor/vendors/ckeditor/lang/ja.js
new file mode 100644
index 000000000..98b5f7cd3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ja.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ja']={"dir":"ltr","editor":"リッãƒãƒ†ã‚­ã‚¹ãƒˆã‚¨ãƒ‡ã‚£ã‚¿","common":{"editorHelp":"ヘルプ㯠ALT 0 を押ã—ã¦ãã ã•ã„","browseServer":"サーãƒãƒ¼ãƒ–ラウザー","url":"URL","protocol":"プロトコル","upload":"アップロード","uploadSubmit":"サーãƒãƒ¼ã«é€ä¿¡","image":"イメージ","flash":"Flash","form":"フォーム","checkbox":"ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹","radio":"ラジオボタン","textField":"1行テキスト","textarea":"テキストエリア","hiddenField":"ä¸å¯è¦–フィールド","button":"ボタン","select":"é¸æŠžãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰","imageButton":"ç”»åƒãƒœã‚¿ãƒ³","notSet":"<ãªã—>","id":"Id","name":"Name属性","langDir":"æ–‡å­—è¡¨è¨˜ã®æ–¹å‘","langDirLtr":"å·¦ã‹ã‚‰å³ (LTR)","langDirRtl":"å³ã‹ã‚‰å·¦ (RTL)","langCode":"言語コード","longDescr":"longdesc属性(長文説明)","cssClass":"スタイルシートクラス","advisoryTitle":"Title属性","cssStyle":"スタイルシート","ok":"OK","cancel":"キャンセル","close":"é–‰ã˜ã‚‹","preview":"プレビュー","resize":"ドラッグã—ã¦ãƒªã‚µã‚¤ã‚º","generalTab":"全般","advancedTab":"高度ãªè¨­å®š","validateNumberFailed":"å€¤ãŒæ•°ã§ã¯ã‚りã¾ã›ã‚“","confirmNewPage":"変更内容をä¿å­˜ã›ãšã€ æ–°ã—ã„ページを開ã„ã¦ã‚‚よã‚ã—ã„ã§ã—ょã†ã‹ï¼Ÿ","confirmCancel":"オプション設定を変更ã—ã¾ã—ãŸã€‚ダイアログを閉ã˜ã¦ã‚‚よã‚ã—ã„ã§ã—ょã†ã‹ï¼Ÿ","options":"オプション","target":"ターゲット","targetNew":"æ–°ã—ã„ウィンドウ (_空白)","targetTop":"最上部ウィンドウ (_トップ)","targetSelf":"åŒã˜ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ (_åŒä¸€)","targetParent":"親ウィンドウ (_親)","langDirLTR":"å·¦ã‹ã‚‰å³ (LTR)","langDirRTL":"å³ã‹ã‚‰å·¦ (RTL)","styles":"スタイル","cssClasses":"スタイルシートクラス","width":"å¹…","height":"高ã•","align":"行æƒãˆ","alignLeft":"å·¦","alignRight":"å³","alignCenter":"中央","alignTop":"上","alignMiddle":"中央","alignBottom":"下","invalidValue":"䏿­£ãªå€¤ã§ã™ã€‚","invalidHeight":"高ã•ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidWidth":"å¹…ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"ピクセル数もã—ãã¯CSSã«ã‚»ãƒƒãƒˆã§ãる数値を入力ã—ã¦ãã ã•ã„。(px,%,in,cm,mm,em,ex,pt,or pc)","unavailable":"%1<span class=\"cke_accessibility\">, 利用ä¸å¯èƒ½</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"CKEditorãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±","help":"Check $1 for help.","moreInfo":"ライセンス情報ã®è©³ç´°ã¯ã‚¦ã‚§ãƒ–サイトã«ã¦ç¢ºèªã—ã¦ãã ã•ã„:","title":"CKEditorãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"太字","italic":"斜体","strike":"æ‰“ã¡æ¶ˆã—ç·š","subscript":"æ·»ãˆå­—","superscript":"ä¸Šä»˜ãæ–‡å­—","underline":"下線"},"blockquote":{"toolbar":"ブロック引用"},"clipboard":{"copy":"コピー","copyError":"ブラウザーã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã‚¨ãƒ‡ã‚£ã‚¿ã®ã‚³ãƒ”ーæ“作ãŒè‡ªå‹•ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。実行ã™ã‚‹ã«ã¯æ‰‹å‹•ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®(Ctrl/Cmd+C)を使用ã—ã¦ãã ã•ã„。","cut":"切りå–り","cutError":"ブラウザーã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã‚¨ãƒ‡ã‚£ã‚¿ã®åˆ‡ã‚Šå–りæ“作ãŒè‡ªå‹•ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。実行ã™ã‚‹ã«ã¯æ‰‹å‹•ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®(Ctrl/Cmd+X)を使用ã—ã¦ãã ã•ã„。","paste":"貼り付ã‘","pasteArea":"貼り付ã‘場所","pasteMsg":"キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用ã—ã¦ã€æ¬¡ã®å…¥åŠ›ã‚¨ãƒªã‚¢å†…ã§è²¼ã£ã¦ã€<STRONG>OK</STRONG>を押ã—ã¦ãã ã•ã„。","securityMsg":"ブラウザã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã€ã‚¨ãƒ‡ã‚£ã‚¿ã¯ã‚¯ãƒªãƒƒãƒ—ボード・データã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¯è²¼ã‚Šä»˜ã‘æ“作を行ã†åº¦ã«è¡¨ç¤ºã•れã¾ã™ã€‚","title":"貼り付ã‘"},"contextmenu":{"options":"コンテキストメニューオプション"},"toolbar":{"toolbarCollapse":"ツールãƒãƒ¼ã‚’é–‰ã˜ã‚‹","toolbarExpand":"ツールãƒãƒ¼ã‚’é–‹ã","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"エレメントパス","eleTitle":"%1 エレメント"},"list":{"bulletedlist":"ç®‡æ¡æ›¸ã","numberedlist":"段è½ç•ªå·"},"indent":{"indent":"インデント","outdent":"インデント解除"},"format":{"label":"フォーマット","panelTitle":"フォーマット","tag_address":"アドレス","tag_div":"標準 (DIV)","tag_h1":"見出㗠1","tag_h2":"見出㗠2","tag_h3":"見出㗠3","tag_h4":"見出㗠4","tag_h5":"見出㗠5","tag_h6":"見出㗠6","tag_p":"標準","tag_pre":"書å¼ä»˜ã"},"horizontalrule":{"toolbar":"横罫線"},"image":{"alertUrl":"イメージã®URLを入力ã—ã¦ãã ã•ã„。","alt":"代替テキスト","border":"ボーダー","btnUpload":"サーãƒãƒ¼ã«é€ä¿¡","button2Img":"é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç”»åƒã«ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ","hSpace":"横間隔","img2Button":"é¸æŠžã—ãŸç”»åƒã‚’ボタンã«ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ","infoTab":"イメージ 情報","linkTab":"リンク","lockRatio":"ロック比率","menu":"イメージ プロパティ","resetSize":"サイズリセット","title":"イメージ プロパティ","titleButton":"ç”»åƒãƒœã‚¿ãƒ³ プロパティ","upload":"アップロード","urlMissing":"イメージã®URLを入力ã—ã¦ãã ã•ã„。","vSpace":"縦間隔","validateBorder":"ãƒœãƒ¼ãƒ€ãƒ¼ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","validateHSpace":"æ¨ªé–“éš”ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","validateVSpace":"ç¸¦é–“éš”ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"},"fakeobjects":{"anchor":"アンカー","flash":"Flash Animation","hiddenfield":"ä¸å¯è¦–フィールド","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"アクセスキー","advanced":"高度ãªè¨­å®š","advisoryContentType":"Content Type属性","advisoryTitle":"Title属性","anchor":{"toolbar":"アンカー挿入/編集","menu":"アンカー プロパティ","title":"アンカー プロパティ","name":"アンカーå","errorName":"アンカーåã‚’å¿…ãšå…¥åŠ›ã—ã¦ãã ã•ã„。","remove":"Remove Anchor"},"anchorId":"エレメントID","anchorName":"アンカーå","charset":"リンクcharset属性","cssClasses":"スタイルシートクラス","emailAddress":"E-Mail アドレス","emailBody":"本文","emailSubject":"ä»¶å","id":"Id","info":"ãƒã‚¤ãƒ‘ーリンク 情報","langCode":"言語コード","langDir":"æ–‡å­—è¡¨è¨˜ã®æ–¹å‘","langDirLTR":"å·¦ã‹ã‚‰å³ (LTR)","langDirRTL":"å³ã‹ã‚‰å·¦ (RTL)","menu":"リンク編集","name":"Name属性","noAnchors":"(ドキュメントã«ãŠã„ã¦åˆ©ç”¨å¯èƒ½ãªã‚¢ãƒ³ã‚«ãƒ¼ã¯ã‚りã¾ã›ã‚“。)","noEmail":"メールアドレスを入力ã—ã¦ãã ã•ã„。","noUrl":"リンクURLを入力ã—ã¦ãã ã•ã„。","other":"<ãã®ä»–ã®>","popupDependent":"é–‹ã„ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«é€£å‹•ã—ã¦é–‰ã˜ã‚‹ (Netscape)","popupFeatures":"ãƒãƒƒãƒ—アップウィンドウ特徴","popupFullScreen":"全画é¢ãƒ¢ãƒ¼ãƒ‰(IE)","popupLeft":"左端ã‹ã‚‰ã®åº§æ¨™ã§æŒ‡å®š","popupLocationBar":"ロケーションãƒãƒ¼","popupMenuBar":"メニューãƒãƒ¼","popupResizable":"サイズå¯å¤‰","popupScrollBars":"スクロールãƒãƒ¼","popupStatusBar":"ステータスãƒãƒ¼","popupToolbar":"ツールãƒãƒ¼","popupTop":"上端ã‹ã‚‰ã®åº§æ¨™ã§æŒ‡å®š","rel":"Relationship","selectAnchor":"ã‚¢ãƒ³ã‚«ãƒ¼ã‚’é¸æŠž","styles":"スタイルシート","tabIndex":"タブインデックス","target":"ターゲット","targetFrame":"<フレーム>","targetFrameName":"目的ã®ãƒ•レームå","targetPopup":"<ãƒãƒƒãƒ—アップウィンドウ>","targetPopupName":"ãƒãƒƒãƒ—アップウィンドウå","title":"ãƒã‚¤ãƒ‘ーリンク","toAnchor":"ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚¢ãƒ³ã‚«ãƒ¼","toEmail":"E-Mail","toUrl":"URL","toolbar":"リンク挿入/編集","type":"リンクタイプ","unlink":"リンク削除","upload":"アップロード"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"最大化","minimize":"最å°åŒ–"},"pastetext":{"button":"プレーンテキスト貼り付ã‘","title":"プレーンテキスト貼り付ã‘"},"pastefromword":{"confirmCleanup":"貼り付ã‘を行ã†ãƒ†ã‚­ã‚¹ãƒˆã¯ã€ãƒ¯ãƒ¼ãƒ‰æ–‡ç« ã‹ã‚‰ã‚³ãƒ”ーã•れよã†ã¨ã—ã¦ã„ã¾ã™ã€‚貼り付ã‘ã‚‹å‰ã«ã‚¯ãƒªãƒ¼ãƒ‹ãƒ³ã‚°ã‚’行ã„ã¾ã™ã‹ï¼Ÿ","error":"内部エラーã«ã‚ˆã‚Šè²¼ã‚Šä»˜ã‘ãŸãƒ‡ãƒ¼ã‚¿ãŒã‚¯ãƒªã‚¢ã§ãã¾ã›ã‚“ã§ã—ãŸ","title":"ワード文章ã‹ã‚‰è²¼ã‚Šä»˜ã‘","toolbar":"ワード文章ã‹ã‚‰è²¼ã‚Šä»˜ã‘"},"removeformat":{"toolbar":"フォーマット削除"},"sourcearea":{"toolbar":"ソース"},"specialchar":{"options":"特殊文字オプション","title":"ç‰¹æ®Šæ–‡å­—é¸æŠž","toolbar":"特殊文字挿入"},"scayt":{"about":"SCAYTバージョï¾","aboutTab":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±","addWord":"語å¥è¿½åŠ ","allCaps":"å…¨ã¦å¤§æ–‡å­—ã®å˜èªžã‚’無視","dic_create":"登録","dic_delete":"削除","dic_field_name":"辞書å","dic_info":"å§‹ã‚ユーザーディレクトリã¯ã€Cookieã«ä¿å­˜ã•れã¾ã™ã€‚但㗠Cookie ã¯ã‚µã‚¤ã‚ºã«åˆ¶é™ãŒã‚りã¾ã™ã€‚ユーザーディレクトリãŒCookieã«ä¿å­˜ã§ããªã„サイズã«åˆ°é”ã™ã‚‹ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚µãƒ¼ãƒãƒ¼ä¸Šã«ä¿å­˜ã•れã¾ã™ã€‚個人ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’サーãƒãƒ¼ä¸Šã«ä¿å­˜ã™ã‚‹ã«ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªåを明示ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã‚‚ã—æ—¢ã«ä¿å­˜ã•れãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒã‚ã‚‹å ´åˆã€ãã®åå‰ã‚’入力ã—ã€å…ƒã«æˆ»ã™ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。","dic_rename":"åå‰å¤‰æ›´","dic_restore":"å…ƒã«æˆ»ã™","dictionariesTab":"辞書","disable":"SCAYT無効","emptyDic":"辞書åã¯å¿…ãšå…¥åŠ›ã—ã¦ãã ã•ã„","enable":"SCAYT有効","ignore":"無視","ignoreAll":"ã™ã¹ã¦ç„¡è¦–","ignoreDomainNames":"ドメインåを無視","langs":"言語","languagesTab":"言語","mixedCase":"å¤§æ–‡å­—å°æ–‡å­—混在ã®å˜èªžã‚’無視","mixedWithDigits":"数字付ãå˜èªžã‚’無視","moreSuggestions":"ä»–ã®å€™è£œ","opera_title":"Operaã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“","options":"オプション","optionsTab":"オプション","title":"スペルãƒã‚§ãƒƒã‚¯è¨­å®š(SCAYT)","toggle":"SCAYT切替","noSuggestions":"No suggestion"},"stylescombo":{"label":"スタイル","panelTitle":"スタイル","panelTitle1":"ブロックスタイル","panelTitle2":"インラインスタイル","panelTitle3":"オブジェクトスタイル"},"table":{"border":"ボーダーサイズ","caption":"キャプション","cell":{"menu":"セル","insertBefore":"セルã®å‰ã«æŒ¿å…¥","insertAfter":"セルã®å¾Œã«æŒ¿å…¥","deleteCell":"セル削除","merge":"セルçµåˆ","mergeRight":"å³ã«çµåˆ","mergeDown":"下ã«çµåˆ","splitHorizontal":"セルを水平方å‘分割","splitVertical":"セルを垂直方å‘ã«åˆ†å‰²","title":"セルプロパティ","cellType":"セルタイプ","rowSpan":"縦幅(行数)","colSpan":"横幅(列数)","wordWrap":"折り返ã—","hAlign":"ã‚»ãƒ«æ¨ªã®æ•´åˆ—","vAlign":"ã‚»ãƒ«ç¸¦ã®æ•´åˆ—","alignBaseline":"ベースライン","bgColor":"背景色","borderColor":"ボーダーカラー","data":"テーブルデータ(td)","header":"テーブルヘッダ(th)","yes":"Yes","no":"No","invalidWidth":"ã‚»ãƒ«å¹…ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidHeight":"セル高ã•ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidRowSpan":"縦幅(行数)ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidColSpan":"横幅(列数)ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","chooseColor":"色ã®é¸æŠž"},"cellPad":"セル内間隔","cellSpace":"セル内余白","column":{"menu":"カラム","insertBefore":"カラムã®å‰ã«æŒ¿å…¥","insertAfter":"カラムã®å¾Œã«æŒ¿å…¥","deleteColumn":"列削除"},"columns":"列","deleteTable":"テーブル削除","headers":"テーブルヘッダ(th)","headersBoth":"両方","headersColumn":"åˆã‚ã®åˆ—ã®ã¿","headersNone":"ãªã—","headersRow":"åˆã‚ã®è¡Œã®ã¿","invalidBorder":"ãƒœãƒ¼ãƒ€ãƒ¼ã‚µã‚¤ã‚ºã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidCellPadding":"ã‚»ãƒ«å†…é–“éš”ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidCellSpacing":"ã‚»ãƒ«å†…ä½™ç™½ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidCols":"列ã¯0より大ããªæ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidHeight":"高ã•ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidRows":"行ã¯0より大ããªæ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","invalidWidth":"å¹…ã¯æ•°å€¤ã§å…¥åŠ›ã—ã¦ãã ã•ã„。","menu":"テーブル プロパティ","row":{"menu":"行","insertBefore":"行ã®å‰ã«æŒ¿å…¥","insertAfter":"行ã®å¾Œã«æŒ¿å…¥","deleteRow":"行削除"},"rows":"行","summary":"ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ¦‚è¦","title":"テーブル プロパティ","toolbar":"テーブル","widthPc":"パーセント","widthPx":"ピクセル","widthUnit":"ユニット"},"undo":{"redo":"やり直ã—","undo":"å…ƒã«æˆ»ã™"},"wsc":{"btnIgnore":"無視","btnIgnoreAll":"ã™ã¹ã¦ç„¡è¦–","btnReplace":"ç½®æ›","btnReplaceAll":"ã™ã¹ã¦ç½®æ›","btnUndo":"やり直ã—","changeTo":"変更","errorLoading":"アプリケーションサービスホスト読込ã¿ã‚¨ãƒ©ãƒ¼: %s.","ieSpellDownload":"スペルãƒã‚§ãƒƒã‚«ãƒ¼ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“。今ã™ãダウンロードã—ã¾ã™ã‹?","manyChanges":"スペルãƒã‚§ãƒƒã‚¯å®Œäº†: %1 語å¥å¤‰æ›´ã•れã¾ã—ãŸ","noChanges":"スペルãƒã‚§ãƒƒã‚¯å®Œäº†: 語å¥ã¯å¤‰æ›´ã•れã¾ã›ã‚“ã§ã—ãŸ","noMispell":"スペルãƒã‚§ãƒƒã‚¯å®Œäº†: スペルã®èª¤ã‚Šã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ","noSuggestions":"- 該当ãªã— -","notAvailable":"申ã—訳ã‚りã¾ã›ã‚“ã€ç¾åœ¨ã‚µãƒ¼ãƒ“スを利用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“","notInDic":"辞書ã«ã‚りã¾ã›ã‚“","oneChange":"スペルãƒã‚§ãƒƒã‚¯å®Œäº†: 1語å¥å¤‰æ›´ã•れã¾ã—ãŸ","progress":"スペルãƒã‚§ãƒƒã‚¯å‡¦ç†ä¸­...","title":"スペルãƒã‚§ãƒƒã‚¯","toolbar":"スペルãƒã‚§ãƒƒã‚¯"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ka.js b/mod/ckeditor/vendors/ckeditor/lang/ka.js
new file mode 100644
index 000000000..c324eb535
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ka.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ka']={"dir":"ltr","editor":"ტექსტის რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜","common":{"editorHelp":"დáƒáƒáƒ­áƒ˜áƒ áƒ”თ ALT 0-ს დáƒáƒ®áƒ›áƒáƒ áƒ”ბის მისáƒáƒ¦áƒ”ბáƒáƒ“","browseServer":"სერვერზე დáƒáƒ—ვáƒáƒšáƒ˜áƒ”რებáƒ","url":"URL","protocol":"პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜","upload":"áƒáƒ¢áƒ•ირთვáƒ","uploadSubmit":"სერვერზე გáƒáƒ’ზáƒáƒ•ნáƒ","image":"სურáƒáƒ—ი","flash":"Flash","form":"ფáƒáƒ áƒ›áƒ","checkbox":"მáƒáƒœáƒ˜áƒ¨áƒ•ნის ღილáƒáƒ™áƒ˜","radio":"áƒáƒ›áƒáƒ áƒ©áƒ”ვის ღილáƒáƒ™áƒ˜","textField":"ტექსტური ველი","textarea":"ტექსტური áƒáƒ áƒ”","hiddenField":"მáƒáƒšáƒ£áƒšáƒ˜ ველი","button":"ღილáƒáƒ™áƒ˜","select":"áƒáƒ áƒ©áƒ”ვის ველი","imageButton":"სურáƒáƒ—იáƒáƒœáƒ˜ ღილáƒáƒ™áƒ˜","notSet":"<áƒáƒ áƒáƒ¤áƒ”რი>","id":"Id","name":"სáƒáƒ®áƒ”ლი","langDir":"ენის მიმáƒáƒ áƒ—ულებáƒ","langDirLtr":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•ნივ (LTR)","langDirRtl":"მáƒáƒ áƒ¯áƒ•ნიდáƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","langCode":"ენის კáƒáƒ“ი","longDescr":"დიდი áƒáƒ¦áƒ¬áƒ”რის URL","cssClass":"CSS კლáƒáƒ¡áƒ˜","advisoryTitle":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","cssStyle":"CSS სტილი","ok":"დიáƒáƒ®","cancel":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","close":"დáƒáƒ®áƒ£áƒ áƒ•áƒ","preview":"გáƒáƒ“áƒáƒ®áƒ”დვáƒ","resize":"გáƒáƒ¬áƒ˜áƒ” ზáƒáƒ›áƒ˜áƒ¡ შესáƒáƒªáƒ•ლელáƒáƒ“","generalTab":"ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ","advancedTab":"გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული","validateNumberFailed":"ეს მნიშვნელáƒáƒ‘რáƒáƒ áƒáƒ რიცხვი.","confirmNewPage":"áƒáƒ› დáƒáƒ™áƒ£áƒ›áƒ”ნტში ყველრჩáƒáƒ£áƒ¬áƒ”რელი ცვლილებრდáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ. დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ხáƒáƒ áƒ— რáƒáƒ› áƒáƒ®áƒáƒšáƒ˜ გვერდის ჩáƒáƒ¢áƒ•ირთვრგინდáƒáƒ—?","confirmCancel":"ზáƒáƒ’იერთი პáƒáƒ áƒáƒ›áƒ”ტრი შეცვლილიáƒ, დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბულილ ხáƒáƒ áƒ— რáƒáƒ› ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•რგსურთ?","options":"პáƒáƒ áƒáƒ›áƒ”ტრები","target":"გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ áƒáƒ“გილი","targetNew":"áƒáƒ®áƒáƒšáƒ˜ ფáƒáƒœáƒ¯áƒáƒ áƒ (_blank)","targetTop":"ზედრფáƒáƒœáƒ¯áƒáƒ áƒ (_top)","targetSelf":"იგივე ფáƒáƒœáƒ¯áƒáƒ áƒ (_self)","targetParent":"მშáƒáƒ‘ელი ფáƒáƒœáƒ¯áƒáƒ áƒ (_parent)","langDirLTR":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•ნივ (LTR)","langDirRTL":"მáƒáƒ áƒ¯áƒ•ნიდáƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","styles":"სტილი","cssClasses":"CSS კლáƒáƒ¡áƒ˜","width":"სიგáƒáƒœáƒ”","height":"სიმáƒáƒ¦áƒšáƒ”","align":"სწáƒáƒ áƒ”ბáƒ","alignLeft":"მáƒáƒ áƒªáƒ®áƒ”ნáƒ","alignRight":"მáƒáƒ áƒ¯áƒ•ენáƒ","alignCenter":"შუáƒ","alignTop":"ზემáƒáƒ—áƒ","alignMiddle":"შუáƒ","alignBottom":"ქვემáƒáƒ—áƒ","invalidValue":"Invalid value.","invalidHeight":"სიმáƒáƒ¦áƒšáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidWidth":"სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, მიუწვდáƒáƒ›áƒ”ლიáƒ</span>"},"about":{"copy":"Copyright &copy; $1. ყველრუფლებრდáƒáƒªáƒ£áƒšáƒ˜áƒ.","dlgTitle":"CKEditor-ის შესáƒáƒ®áƒ”ბ","help":"დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის იხილეთ $1.","moreInfo":"ლიცენზიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ეწვიეთ ჩვენს სáƒáƒ˜áƒ¢áƒ¡:","title":"CKEditor-ის შესáƒáƒ®áƒ”ბ","userGuide":"CKEditor-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლმძღვáƒáƒœáƒ”ლáƒ"},"basicstyles":{"bold":"მსხვილი","italic":"დáƒáƒ®áƒ áƒ˜áƒšáƒ˜","strike":"გáƒáƒ“áƒáƒ®áƒáƒ–ული","subscript":"ინდექსი","superscript":"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜","underline":"გáƒáƒ®áƒáƒ–ული"},"blockquote":{"toolbar":"ციტáƒáƒ¢áƒ"},"clipboard":{"copy":"áƒáƒ¡áƒšáƒ˜","copyError":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძლევრáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ áƒáƒ›áƒ˜áƒ¡áƒ—ვის (Ctrl/Cmd+C).","cut":"áƒáƒ›áƒáƒ­áƒ áƒ","cutError":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძლევრáƒáƒ›áƒáƒ­áƒ áƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ áƒáƒ›áƒ˜áƒ¡áƒ—ვის (Ctrl/Cmd+X).","paste":"ჩáƒáƒ¡áƒ›áƒ","pasteArea":"ჩáƒáƒ¡áƒ›áƒ˜áƒ¡ áƒáƒ áƒ”","pasteMsg":"ჩáƒáƒ¡áƒ•ით áƒáƒ› áƒáƒ áƒ˜áƒ¡ შიგნით კლáƒáƒ•იáƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით (<strong>Ctrl/Cmd+V</strong>) დრდáƒáƒáƒ­áƒ˜áƒ áƒ”თ OK-ს","securityMsg":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძლევრclipboard-ის მáƒáƒœáƒáƒªáƒ”მების წვდáƒáƒ›áƒ˜áƒ¡ უფლებáƒáƒ¡. კიდევ უნდრჩáƒáƒ¡áƒ•áƒáƒ— ტექსტი áƒáƒ› ფáƒáƒœáƒ¯áƒáƒ áƒáƒ¨áƒ˜.","title":"ჩáƒáƒ¡áƒ›áƒ"},"contextmenu":{"options":"კáƒáƒœáƒ¢áƒ”ქსტური მენიუს პáƒáƒ áƒáƒ›áƒ”ტრები"},"toolbar":{"toolbarCollapse":"ხელსáƒáƒ¬áƒ§áƒáƒ—რზáƒáƒšáƒ˜áƒ¡ შეწევáƒ","toolbarExpand":"ხელსáƒáƒ¬áƒ§áƒáƒ—რზáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”ვáƒ","toolbarGroups":{"document":"დáƒáƒ™áƒ£áƒ›áƒ”ნტი","clipboard":"Clipboard/გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","editing":"რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","forms":"ფáƒáƒ áƒ›áƒ”ბი","basicstyles":"ძირითáƒáƒ“ი სტილები","paragraph":"áƒáƒ‘ზáƒáƒªáƒ˜","links":"ბმულები","insert":"ჩáƒáƒ¡áƒ›áƒ","styles":"სტილები","colors":"ფერები","tools":"ხელსáƒáƒ¬áƒ§áƒáƒ”ბი"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"ელემეტის გზáƒ","eleTitle":"%1 ელემენტი"},"list":{"bulletedlist":"ღილიáƒáƒœáƒ˜ სიáƒ","numberedlist":"გáƒáƒ“áƒáƒœáƒáƒ›áƒ áƒ˜áƒšáƒ˜ სიáƒ"},"indent":{"indent":"მეტáƒáƒ“ შეწევáƒ","outdent":"ნáƒáƒ™áƒšáƒ”ბáƒáƒ“ შეწევáƒ"},"format":{"label":"ფიáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ","panelTitle":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ","tag_address":"მისáƒáƒ›áƒáƒ áƒ—ი","tag_div":"ჩვეულებრივი (DIV)","tag_h1":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 1","tag_h2":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 2","tag_h3":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 3","tag_h4":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 4","tag_h5":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 5","tag_h6":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 6","tag_p":"ჩვეულებრივი","tag_pre":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბული"},"horizontalrule":{"toolbar":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ ხáƒáƒ–ის ჩáƒáƒ¡áƒ›áƒ"},"image":{"alertUrl":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ სურáƒáƒ—ის URL","alt":"სáƒáƒœáƒáƒªáƒ•ლრტექსტი","border":"ჩáƒáƒ áƒ©áƒ","btnUpload":"სერვერისთვის გáƒáƒ’ზáƒáƒ•ნáƒ","button2Img":"გსურთ áƒáƒ áƒ©áƒ”ული სურáƒáƒ—იáƒáƒœáƒ˜ ღილáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¥áƒªáƒ”ვრჩვეულებრივ ღილáƒáƒ™áƒáƒ“?","hSpace":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ სივრცე","img2Button":"გსურთ áƒáƒ áƒ©áƒ”ული ჩვეულებრივი ღილáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¥áƒªáƒ”ვრსურáƒáƒ—იáƒáƒœ ღილáƒáƒ™áƒáƒ“?","infoTab":"სურáƒáƒ—ის ინფáƒáƒ áƒ›áƒªáƒ˜áƒ","linkTab":"ბმული","lockRatio":"პრáƒáƒžáƒáƒ áƒªáƒ˜áƒ˜áƒ¡ შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბáƒ","menu":"სურáƒáƒ—ის პáƒáƒ áƒáƒ›áƒ”ტრები","resetSize":"ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ‘რუნებáƒ","title":"სურáƒáƒ—ის პáƒáƒ áƒáƒ›áƒ”ტრები","titleButton":"სურáƒáƒ—იáƒáƒœáƒ˜ ღილáƒáƒ™áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები","upload":"áƒáƒ¢áƒ•ირთვáƒ","urlMissing":"სურáƒáƒ—ის URL áƒáƒ áƒáƒ შევსებული.","vSpace":"ვერტიკáƒáƒšáƒ£áƒ áƒ˜ სივრცე","validateBorder":"ჩáƒáƒ áƒ©áƒ მთელი რიცხვი უნდრიყáƒáƒ¡.","validateHSpace":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ სივრცე მთელი რიცხვი უნდრიყáƒáƒ¡.","validateVSpace":"ვერტიკáƒáƒšáƒ£áƒ áƒ˜ სივრცე მთელი რიცხვი უნდრიყáƒáƒ¡."},"fakeobjects":{"anchor":"ღუზáƒ","flash":"Flash áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ","hiddenfield":"მáƒáƒšáƒ£áƒšáƒ˜ ველი","iframe":"IFrame","unknown":"უცნáƒáƒ‘ი áƒáƒ‘იექტი"},"link":{"acccessKey":"წვდáƒáƒ›áƒ˜áƒ¡ ღილáƒáƒ™áƒ˜","advanced":"დáƒáƒ¬áƒ•რილებით","advisoryContentType":"შიგთáƒáƒ•სის ტიპი","advisoryTitle":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","anchor":{"toolbar":"ღუზáƒ","menu":"ღუზის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","title":"ღუზის პáƒáƒ áƒáƒ›áƒ”ტრები","name":"ღუზუს სáƒáƒ®áƒ”ლი","errorName":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ღუზის სáƒáƒ®áƒ”ლი","remove":"Remove Anchor"},"anchorId":"ელემენტის Id-თ","anchorName":"ღუზის სáƒáƒ®áƒ”ლით","charset":"კáƒáƒ“ირებáƒ","cssClasses":"CSS კლáƒáƒ¡áƒ˜","emailAddress":"ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები","emailBody":"წერილის ტექსტი","emailSubject":"წერილის სáƒáƒ—áƒáƒ£áƒ áƒ˜","id":"Id","info":"ბმულის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ","langCode":"ენის კáƒáƒ“ი","langDir":"ენის მიმáƒáƒ áƒ—ულებáƒ","langDirLTR":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•ნივ (LTR)","langDirRTL":"მáƒáƒ áƒ¯áƒ•ნიდáƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","menu":"ბმულის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","name":"სáƒáƒ®áƒ”ლი","noAnchors":"(áƒáƒ› დáƒáƒ™áƒ£áƒ›áƒ”ნტში ღუზრáƒáƒ áƒáƒ)","noEmail":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი","noUrl":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ბმულის URL","other":"<სხვáƒ>","popupDependent":"დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული (Netscape)","popupFeatures":"Popup ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები","popupFullScreen":"მთელი ეკრáƒáƒœáƒ˜ (IE)","popupLeft":"მáƒáƒ áƒªáƒ®áƒ”ნრპáƒáƒ–იციáƒ","popupLocationBar":"ნáƒáƒ•იგáƒáƒªáƒ˜áƒ˜áƒ¡ ზáƒáƒšáƒ˜","popupMenuBar":"მენიუს ზáƒáƒšáƒ˜","popupResizable":"ცვáƒáƒšáƒ”ბáƒáƒ“ი ზáƒáƒ›áƒ˜áƒ—","popupScrollBars":"გáƒáƒ“áƒáƒ®áƒ•ევის ზáƒáƒšáƒ”ბი","popupStatusBar":"სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒšáƒ˜","popupToolbar":"ხელსáƒáƒ¬áƒ§áƒáƒ—რზáƒáƒšáƒ˜","popupTop":"ზედრპáƒáƒ–იციáƒ","rel":"კáƒáƒ•შირი","selectAnchor":"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ღუზáƒ","styles":"CSS სტილი","tabIndex":"Tab-ის ინდექსი","target":"გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ áƒáƒ“გილი","targetFrame":"<frame>","targetFrameName":"Frame-ის სáƒáƒ®áƒ”ლი","targetPopup":"<popup ფáƒáƒœáƒ¯áƒáƒ áƒ>","targetPopupName":"Popup ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი","title":"ბმული","toAnchor":"ბმული ტექსტში ღუზáƒáƒ–ე","toEmail":"ელფáƒáƒ¡áƒ¢áƒ","toUrl":"URL","toolbar":"ბმული","type":"ბმულის ტიპი","unlink":"ბმულის მáƒáƒ®áƒ¡áƒœáƒ","upload":"áƒáƒ¥áƒáƒ©áƒ•áƒ"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"გáƒáƒ“იდებáƒ","minimize":"დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"},"pastetext":{"button":"მხáƒáƒšáƒáƒ“ ტექსტის ჩáƒáƒ¡áƒ›áƒ","title":"მხáƒáƒšáƒáƒ“ ტექსტის ჩáƒáƒ¡áƒ›áƒ"},"pastefromword":{"confirmCleanup":"ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ტექსტი ვáƒáƒ áƒ“იდáƒáƒœ გáƒáƒ“მáƒáƒ¢áƒáƒœáƒ˜áƒšáƒ¡ გáƒáƒ•ს - გინდáƒáƒ— მისი წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ¬áƒ›áƒ”ნდáƒ?","error":"შიდრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ ვერ მáƒáƒ®áƒ”რხდრტექსტის გáƒáƒ¬áƒ›áƒ”ნდáƒ","title":"ვáƒáƒ áƒ“იდáƒáƒœ ჩáƒáƒ¡áƒ›áƒ","toolbar":"ვáƒáƒ áƒ“იდáƒáƒœ ჩáƒáƒ¡áƒ›áƒ"},"removeformat":{"toolbar":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის მáƒáƒ®áƒ¡áƒœáƒ"},"sourcearea":{"toolbar":"კáƒáƒ“ები"},"specialchar":{"options":"სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები","title":"სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ áƒáƒ áƒ©áƒ”ვáƒ","toolbar":"სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ ჩáƒáƒ¡áƒ›áƒ"},"scayt":{"about":"SCAYT-ის შესáƒáƒ®áƒ”ბ","aboutTab":"ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ","addWord":"სიტყვის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ","allCaps":"დიდი áƒáƒ¡áƒáƒ”ბით დáƒáƒ¬áƒ”რილი სიტყვების უგულებელყáƒáƒ¤áƒ","dic_create":"შექმნáƒ","dic_delete":"წáƒáƒ¨áƒšáƒ","dic_field_name":"ლექსიკáƒáƒœáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი","dic_info":"თáƒáƒ•დáƒáƒžáƒ˜áƒ áƒ•ელáƒáƒ“ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლექსიკáƒáƒœáƒ˜ ინáƒáƒ®áƒ”ბრCookie-ში. თუმცრCookie შეზღუდულირზáƒáƒ›áƒáƒ¨áƒ˜. რáƒáƒªáƒ ლექსიკáƒáƒœáƒ˜áƒ¡ ზáƒáƒ›áƒ გáƒáƒ˜áƒ–რდებრსáƒáƒ™áƒ›áƒáƒáƒ“ ის შეიძლებრშევინáƒáƒ®áƒáƒ— ჩვენს სერვერზე. ჩვენს სერვერზე ლექსიკáƒáƒœáƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ უნდრმიუთითáƒáƒ— მისი სáƒáƒ®áƒ”ლი. თუ უკე გáƒáƒ¥áƒ•თ ლექსიკáƒáƒœáƒ˜, áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ მისი სáƒáƒ®áƒ”ლი დრდáƒáƒáƒ­áƒ˜áƒ áƒ”თ \"დáƒáƒ‘რუნების\" ღილáƒáƒ™áƒ¡.","dic_rename":"გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ","dic_restore":"დáƒáƒ‘რუნებáƒ","dictionariesTab":"ლექსიკáƒáƒœáƒ”ბი","disable":"SCAYT-ის გáƒáƒ›áƒáƒ áƒ—ვáƒ","emptyDic":"ლექსიკáƒáƒœáƒ˜áƒ¡ სიტყვრáƒáƒ  უნდრიყáƒáƒ¡ ცáƒáƒ áƒ˜áƒ”ლი.","enable":"SCAYT-ის ჩáƒáƒ áƒ—ვáƒ","ignore":"უგულებელყáƒáƒ¤áƒ","ignoreAll":"ყველáƒáƒ¡ უგულებელყáƒáƒ¤áƒ","ignoreDomainNames":"დáƒáƒ›áƒ”ნური სáƒáƒ®áƒ”ლების უგულებელყáƒáƒ¤áƒ","langs":"ენები","languagesTab":"ენები","mixedCase":"შერეული áƒáƒ¡áƒáƒ”ბáƒáƒœáƒ˜ სიტყვების უგულებელყáƒáƒ¤áƒ","mixedWithDigits":"ციფრებიáƒáƒœáƒ˜ სიტყვების უგულებელყáƒáƒ¤áƒ","moreSuggestions":"მეტი შემáƒáƒ—áƒáƒ•áƒáƒ–ებáƒ","opera_title":"áƒáƒ áƒáƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი Opera-ს მიერ","options":"პáƒáƒ áƒáƒ›áƒ”ტრები","optionsTab":"პáƒáƒ áƒáƒ›áƒ”ტრები","title":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბრკრეფისáƒáƒ¡","toggle":"SCAYT-ის გáƒáƒ“áƒáƒ áƒ—ვáƒ","noSuggestions":"No suggestion"},"stylescombo":{"label":"სტილები","panelTitle":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის სტილები","panelTitle1":"áƒáƒ áƒ˜áƒ¡ სტილები","panelTitle2":"თáƒáƒœáƒ“áƒáƒ áƒ—ული სტილები","panelTitle3":"áƒáƒ‘იექტის სტილები"},"table":{"border":"ჩáƒáƒ áƒ©áƒáƒ¡ ზáƒáƒ›áƒ","caption":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","cell":{"menu":"უჯრáƒ","insertBefore":"უჯრის ჩáƒáƒ¡áƒ›áƒ მáƒáƒœáƒáƒ›áƒ“ე","insertAfter":"უჯრის ჩáƒáƒ¡áƒ›áƒ მერე","deleteCell":"უჯრების წáƒáƒ¨áƒšáƒ","merge":"უჯრების შეერთებáƒ","mergeRight":"შეერთებრმáƒáƒ áƒ¯áƒ•ენáƒáƒ¡áƒ—áƒáƒœ","mergeDown":"შეერთებრქვემáƒáƒ—áƒáƒ¡áƒ—áƒáƒœ","splitHorizontal":"გáƒáƒ§áƒáƒ¤áƒ ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒáƒ“","splitVertical":"გáƒáƒ§áƒáƒ¤áƒ ვერტიკáƒáƒšáƒ£áƒ áƒáƒ“","title":"უჯრის პáƒáƒ áƒáƒ›áƒ”ტრები","cellType":"უჯრის ტიპი","rowSpan":"სტრიქáƒáƒœáƒ”ბის áƒáƒ“ენáƒáƒ‘áƒ","colSpan":"სვეტების áƒáƒ“ენáƒáƒ‘áƒ","wordWrap":"სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ (Word Wrap)","hAlign":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ","vAlign":"ვერტიკáƒáƒšáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ","alignBaseline":"ძირითáƒáƒ“ი ხáƒáƒ–ის გáƒáƒ¡áƒ¬áƒ•რივ","bgColor":"ფáƒáƒœáƒ˜áƒ¡ ფერი","borderColor":"ჩáƒáƒ áƒ©áƒáƒ¡ ფერი","data":"მáƒáƒœáƒáƒªáƒ”მები","header":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","yes":"დიáƒáƒ®","no":"áƒáƒ áƒ","invalidWidth":"უჯრის სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidHeight":"უჯრის სიმáƒáƒ¦áƒšáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidRowSpan":"სტრიქáƒáƒœáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡.","invalidColSpan":"სვეტების რáƒáƒáƒ“ენáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡.","chooseColor":"áƒáƒ áƒ©áƒ”ვáƒ"},"cellPad":"უჯრის კიდე (padding)","cellSpace":"უჯრის სივრცე (spacing)","column":{"menu":"სვეტი","insertBefore":"სვეტის ჩáƒáƒ›áƒáƒ¢áƒ”ბრწინ","insertAfter":"სვეტის ჩáƒáƒ›áƒáƒ¢áƒ”ბრმერე","deleteColumn":"სვეტების წáƒáƒ¨áƒšáƒ"},"columns":"სვეტი","deleteTable":"ცხრილის წáƒáƒ¨áƒšáƒ","headers":"სáƒáƒ—áƒáƒ£áƒ áƒ”ბი","headersBoth":"áƒáƒ áƒ˜áƒ•ე","headersColumn":"პირველი სვეტი","headersNone":"áƒáƒ áƒáƒ¤áƒ”რი","headersRow":"პირველი სტრიქáƒáƒœáƒ˜","invalidBorder":"ჩáƒáƒ áƒ©áƒáƒ¡ ზáƒáƒ›áƒ რიცხვით უდნრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidCellPadding":"უჯრის კიდე (padding) რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidCellSpacing":"უჯრის სივრცე (spacing) რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidCols":"სვეტების რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒ“ებითი რიცხვი უნდრიყáƒáƒ¡.","invalidHeight":"ცხრილის სიმáƒáƒ¦áƒšáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","invalidRows":"სტრიქáƒáƒœáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒ“ებითი რიცხვი უნდრიყáƒáƒ¡.","invalidWidth":"ცხრილის სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენილი.","menu":"ცხრილის პáƒáƒ áƒáƒ›áƒ”ტრები","row":{"menu":"სტრიქáƒáƒœáƒ˜","insertBefore":"სტრიქáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¢áƒ”ბრწინ","insertAfter":"სტრიქáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¢áƒ”ბრმერე","deleteRow":"სტრიქáƒáƒœáƒ”ბის წáƒáƒ¨áƒšáƒ"},"rows":"სტრიქáƒáƒœáƒ˜","summary":"შეჯáƒáƒ›áƒ”ბáƒ","title":"ცხრილის პáƒáƒ áƒáƒ›áƒ”ტრები","toolbar":"ცხრილი","widthPc":"პრáƒáƒªáƒ”ნტი","widthPx":"წერტილი","widthUnit":"სáƒáƒ–áƒáƒ›áƒ˜ ერთეული"},"undo":{"redo":"გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ","undo":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"},"wsc":{"btnIgnore":"უგულებელყáƒáƒ¤áƒ","btnIgnoreAll":"ყველáƒáƒ¡ უგულებელყáƒáƒ¤áƒ","btnReplace":"შეცვლáƒ","btnReplaceAll":"ყველáƒáƒ¡ შეცვლáƒ","btnUndo":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","changeTo":"შეცვლელი","errorLoading":"სერვისის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის შეცდáƒáƒ›áƒ: %s.","ieSpellDownload":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბრáƒáƒ áƒáƒ დáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒšáƒ˜áƒ áƒ”ბული. ჩáƒáƒ›áƒáƒ•ქáƒáƒ©áƒáƒ— ინტერნეტიდáƒáƒœ?","manyChanges":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბáƒ: %1 სიტყვრშეიცვáƒáƒšáƒ","noChanges":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბáƒ: áƒáƒ áƒáƒ¤áƒ”რი შეცვლილáƒ","noMispell":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბáƒ: შეცდáƒáƒ›áƒ áƒáƒ  მáƒáƒ˜áƒ«áƒ”ბნáƒ","noSuggestions":"- áƒáƒ áƒáƒ შემáƒáƒ—áƒáƒ•áƒáƒ–ებრ-","notAvailable":"უკáƒáƒªáƒ áƒáƒ•áƒáƒ“, ეს სერვისი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიუწვდáƒáƒ›áƒ”ლიáƒ.","notInDic":"áƒáƒ áƒáƒ ლექსიკáƒáƒœáƒ¨áƒ˜","oneChange":"მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბáƒ: ერთი სიტყვრშეიცვáƒáƒšáƒ","progress":"მიმდინáƒáƒ áƒ”áƒáƒ‘ს მáƒáƒ áƒ—ლწერის შემáƒáƒ¬áƒ›áƒ”ბáƒ...","title":"მáƒáƒ áƒ—ლწერáƒ","toolbar":"მáƒáƒ áƒ—ლწერáƒ"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/km.js b/mod/ckeditor/vendors/ckeditor/lang/km.js
new file mode 100644
index 000000000..2ba42f9de
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/km.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['km']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"មើល","url":"URL","protocol":"ប្រូážáž¼áž€áž¼áž›","upload":"ទាញយក","uploadSubmit":"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្ážáž›áŸ‹ážŸáŸážœáž¶","image":"រូបភាព","flash":"Flash","form":"បែបបទ","checkbox":"ប្រអប់ជ្រើសរើស","radio":"ប៉ូážáž»áž“រង្វង់មូល","textField":"ជួរសរសáŸážšáž¢ážáŸ’ážáž”áž‘","textarea":"ážáŸ†áž”ន់សរសáŸážšáž¢ážáŸ’ážáž”áž‘","hiddenField":"ជួរលាក់","button":"ប៉ូážáž»áž“","select":"ជួរជ្រើសរើស","imageButton":"ប៉ូážáž»áž“រូបភាព","notSet":"<មិនមែន>","id":"Id","name":"ឈ្មោះ","langDir":"ទិសដៅភាសា","langDirLtr":"ពីឆ្វáŸáž„ទៅស្ážáž¶áŸ†(LTR)","langDirRtl":"ពីស្ážáž¶áŸ†áž‘ៅឆ្វáŸáž„(RTL)","langCode":"áž›áŸážáž€áž¼ážáž—ាសា","longDescr":"អធិប្បាយ URL វែង","cssClass":"Stylesheet Classes","advisoryTitle":"ចំណងជើង ប្រឹក្សា","cssStyle":"ម៉ូáž","ok":"យល់ព្រម","cancel":"មិនយល់ព្រម","close":"Close","preview":"មើលសាកល្បង","resize":"Resize","generalTab":"General","advancedTab":"កំរិážážáŸ’ពស់","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"គោលដៅ","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"ពីឆ្វáŸáž„ទៅស្ážáž¶áŸ†(LTR)","langDirRTL":"ពីស្ážáž¶áŸ†áž‘ៅឆ្វáŸáž„(RTL)","styles":"ម៉ូáž","cssClasses":"Stylesheet Classes","width":"ទទឹង","height":"កំពស់","align":"កំណážáŸ‹áž‘ីážáž¶áŸ†áž„","alignLeft":"ážáž¶áž„ឆ្វង","alignRight":"ážáž¶áž„ស្ážáž¶áŸ†","alignCenter":"កណ្ážáž¶áž›","alignTop":"ážáž¶áž„លើ","alignMiddle":"កណ្ážáž¶áž›","alignBottom":"ážáž¶áž„ក្រោម","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"អក្សរដិážáž’ំ","italic":"អក្សរផ្ážáŸáž€","strike":"ដិážáž”ន្ទាážáŸ‹áž–ាក់កណ្ážáž¶áž›áž¢áž€áŸ’សរ","subscript":"អក្សរážáž¼áž…ក្រោម","superscript":"អក្សរážáž¼áž…លើ","underline":"ដិážáž”ន្ទាážáŸ‹áž–ីក្រោមអក្សរ"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"ចំលងយក","copyError":"ការកំណážáŸ‹ážŸáž»ážœážáŸ’ážáž—ាពរបស់កម្មវិធីរុករករបស់លោកអ្នក áž“áŸáŸ‡â€‹áž˜áž·áž“អាចធ្វើកម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘ ចំលងអážáŸ’ážáž”ទយកដោយស្វáŸáž™áž”្រវážáŸ’ážáž”ានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនáŸáŸ‡ (Ctrl/Cmd+C)។","cut":"កាážáŸ‹áž™áž€","cutError":"ការកំណážáŸ‹ážŸáž»ážœážáŸ’ážáž—ាពរបស់កម្មវិធីរុករករបស់លោកអ្នក áž“áŸáŸ‡â€‹áž˜áž·áž“អាចធ្វើកម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘ កាážáŸ‹áž¢ážáŸ’ážáž”ទយកដោយស្វáŸáž™áž”្រវážáŸ’ážáž”ានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនáŸáŸ‡ (Ctrl/Cmd+X) ។","paste":"ចំលងដាក់","pasteArea":"Paste Area","pasteMsg":"សូមចំលងអážáŸ’ážáž”ទទៅដាក់ក្នុងប្រអប់ដូចážáž¶áž„ក្រោមដោយប្រើប្រាស់ ឃី ​(<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"ចំលងដាក់"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"បញ្ជីជារង្វង់មូល","numberedlist":"បញ្ជីជាអក្សរ"},"indent":{"indent":"បន្ážáŸ‚មការចូលបន្ទាážáŸ‹","outdent":"បន្ážáž™áž€áž¶ážšáž…ូលបន្ទាážáŸ‹"},"format":{"label":"រចនា","panelTitle":"រចនា","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"បន្ážáŸ‚មបន្ទាážáŸ‹áž•្ážáŸáž€"},"image":{"alertUrl":"សូមសរសáŸážšáž„ាសáŸáž™ážŠáŸ’ឋានរបស់រូបភាព","alt":"អážáŸ’ážáž”ទជំនួស","border":"ស៊ុម","btnUpload":"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្ážáž›áŸ‹ážŸáŸážœáž¶","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"គំលាážáž‘ទឹង","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"áž–ážáŸŒáž˜áž¶áž“អំពីរូបភាព","linkTab":"ឈ្នាប់","lockRatio":"អážáŸ’រាឡុក","menu":"ការកំណážáŸ‹ážšáž¼áž”áž—áž¶áž–","resetSize":"កំណážáŸ‹áž‘ំហំឡើងវិញ","title":"ការកំណážáŸ‹ážšáž¼áž”áž—áž¶áž–","titleButton":"ការកំណážáŸ‹áž”៉ូážáž»áž“រូបភាព","upload":"ទាញយក","urlMissing":"Image source URL is missing.","vSpace":"គំលាážáž”ណ្ážáŸ„áž™","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ឃី សំរាប់ចូល","advanced":"កំរិážážáŸ’ពស់","advisoryContentType":"ប្រភáŸáž‘អážáŸ’ážáž”áž‘ ប្រឹក្សា","advisoryTitle":"ចំណងជើង ប្រឹក្សា","anchor":{"toolbar":"បន្ážáŸ‚ម/កែប្រែ យុážáŸ’កា","menu":"ការកំណážáŸ‹áž™áž»ážáŸ’កា","title":"ការកំណážáŸ‹áž™áž»ážáŸ’កា","name":"ឈ្មោះយុទ្ធážáŸ’កា","errorName":"សូមសរសáŸážš ឈ្មោះយុទ្ធážáŸ’កា","remove":"Remove Anchor"},"anchorId":"ážáž¶áž˜ Id","anchorName":"ážáž¶áž˜ážˆáŸ’មោះរបស់យុážáŸ’កា","charset":"áž›áŸážáž€áž¼ážáž¢áž€áŸ’សររបស់ឈ្នាប់","cssClasses":"Stylesheet Classes","emailAddress":"អ៊ីមែល","emailBody":"អážáŸ’ážáž”áž‘","emailSubject":"ចំណងជើងអážáŸ’ážáž”áž‘","id":"Id","info":"áž–ážáŸŒáž˜áž¶áž“អំពីឈ្នាប់","langCode":"ទិសដៅភាសា","langDir":"ទិសដៅភាសា","langDirLTR":"ពីឆ្វáŸáž„ទៅស្ážáž¶áŸ†(LTR)","langDirRTL":"ពីស្ážáž¶áŸ†áž‘ៅឆ្វáŸáž„(RTL)","menu":"កែប្រែឈ្នាប់","name":"ឈ្មោះ","noAnchors":"(No anchors available in the document)","noEmail":"សូមសរសáŸážš អាសáŸáž™ážŠáŸ’ឋាន អ៊ីមែល","noUrl":"សូមសរសáŸážš អាសáŸáž™ážŠáŸ’ឋាន URL","other":"<other>","popupDependent":"អាស្រáŸáž™áž›áž¾ (Netscape)","popupFeatures":"លក្ážážŽáŸ‡ážšáž”ស់វីនដូលលោáž","popupFullScreen":"អáŸáž€áŸ’រុងពáŸáž‰(IE)","popupLeft":"ទីážáž¶áŸ†áž„ážáž¶áž„ឆ្វáŸáž„","popupLocationBar":"របា ទីážáž¶áŸ†áž„","popupMenuBar":"របា មឺនុយ","popupResizable":"Resizable","popupScrollBars":"របា ទាញ","popupStatusBar":"របា áž–ážáŸŒáž˜áž¶áž“","popupToolbar":"របា ឩបករណáŸ","popupTop":"ទីážáž¶áŸ†áž„ážáž¶áž„លើ","rel":"Relationship","selectAnchor":"ជ្រើសរើសយុážáŸ’កា","styles":"ម៉ូáž","tabIndex":"áž›áŸáž Tab","target":"គោលដៅ","targetFrame":"<ហ្វ្រáŸáž˜>","targetFrameName":"ឈ្មោះហ្រ្វáŸáž˜ážŠáŸ‚លជាគោលដៅ","targetPopup":"<វីនដូវ លោáž>","targetPopupName":"ឈ្មោះវីនដូវលោáž","title":"ឈ្នាប់","toAnchor":"យុážáŸ’កានៅក្នុងទំពáŸážšáž“áŸáŸ‡","toEmail":"អ៊ីមែល","toUrl":"URL","toolbar":"បន្ážáŸ‚ម/កែប្រែ ឈ្នាប់","type":"ប្រភáŸáž‘ឈ្នាប់","unlink":"លប់ឈ្នាប់","upload":"ទាញយក"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"ចំលងដាក់អážáŸ’ážáž”ទធម្មážáž¶","title":"ចំលងដាក់អážáŸ’ážáž”ទធម្មážáž¶"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"ចំលងដាក់ពី Word","toolbar":"ចំលងដាក់ពី Word"},"removeformat":{"toolbar":"លប់ចោល ការរចនា"},"sourcearea":{"toolbar":"កូáž"},"specialchar":{"options":"Special Character Options","title":"ážáž¼áž¢áž€áŸ’សរពិសáŸážŸ","toolbar":"បន្ážáŸ‚មអក្សរពិសáŸážŸ"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"ម៉ូáž","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ទំហំស៊ុម","caption":"ចំណងជើង","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"លប់សែល","merge":"បញ្ជូលសែល","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"គែមសែល","cellSpace":"គំលាážážŸáŸ‚áž›","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"លប់ជួរឈរ"},"columns":"ជួរឈរ","deleteTable":"លប់ážáž¶ážšáž¶áž„","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"ការកំណážáŸ‹ ážáž¶ážšáž¶áž„","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"លប់ជួរផ្ážáŸáž€"},"rows":"ជួរផ្ážáŸáž€","summary":"សáŸáž…ក្ážáž¸ážŸáž„្ážáŸáž”","title":"ការកំណážáŸ‹ ážáž¶ážšáž¶áž„","toolbar":"ážáž¶ážšáž¶áž„","widthPc":"ភាគរយ","widthPx":"ភីកសែល","widthUnit":"width unit"},"undo":{"redo":"ធ្វើឡើងវិញ","undo":"សារឡើងវិញ"},"wsc":{"btnIgnore":"មិនផ្លាស់ប្ážáž¼ážš","btnIgnoreAll":"មិនផ្លាស់ប្ážáž¼ážš ទាំងអស់","btnReplace":"ជំនួស","btnReplaceAll":"ជំនួសទាំងអស់","btnUndo":"សារឡើងវិញ","changeTo":"ផ្លាស់ប្ážáž¼ážšáž‘ៅ","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ពុំមានកម្មវិធីពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ ។ ážáž¾áž…ង់ទាញយកពីណា?","manyChanges":"ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្ážáž¼ážš","noChanges":"ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: ពុំមានផ្លាស់ប្ážáž¼ážš","noMispell":"ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: គ្មានកំហុស","noSuggestions":"- គ្មានសំណើរ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"គ្មានក្នុងវចនានុក្រម","oneChange":"ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: ពាក្យមួយážáŸ’រូចបានផ្លាស់ប្ážáž¼ážš","progress":"កំពុងពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ...","title":"Spell Check","toolbar":"ពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ko.js b/mod/ckeditor/vendors/ckeditor/lang/ko.js
new file mode 100644
index 000000000..612873f03
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ko.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ko']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"서버 보기","url":"URL","protocol":"프로토콜","upload":"업로드","uploadSubmit":"서버로 전송","image":"ì´ë¯¸ì§€","flash":"플래쉬","form":"í¼","checkbox":"ì²´í¬ë°•스","radio":"ë¼ë””오버튼","textField":"입력필드","textarea":"ìž…ë ¥ì˜ì—­","hiddenField":"숨김필드","button":"버튼","select":"펼침목ë¡","imageButton":"ì´ë¯¸ì§€ë²„튼","notSet":"<설정ë˜ì§€ 않ìŒ>","id":"ID","name":"Name","langDir":"쓰기 ë°©í–¥","langDirLtr":"왼쪽ì—서 오른쪽 (LTR)","langDirRtl":"오른쪽ì—서 왼쪽 (RTL)","langCode":"언어 코드","longDescr":"URL 설명","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"예","cancel":"아니오","close":"Close","preview":"미리보기","resize":"Resize","generalTab":"General","advancedTab":"ìžì„¸ížˆ","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"타겟","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"왼쪽ì—서 오른쪽 (LTR)","langDirRTL":"오른쪽ì—서 왼쪽 (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"너비","height":"높ì´","align":"ì •ë ¬","alignLeft":"왼쪽","alignRight":"오른쪽","alignCenter":"가운ë°","alignTop":"위","alignMiddle":"중간","alignBottom":"아래","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"진하게","italic":"ì´í…”릭","strike":"취소선","subscript":"아래 첨ìž","superscript":"위 첨ìž","underline":"밑줄"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"복사하기","copyError":"브ë¼ìš°ì €ì˜ ë³´ì•ˆì„¤ì •ë•Œë¬¸ì— ë³µì‚¬í•˜ê¸° ê¸°ëŠ¥ì„ ì‹¤í–‰í•  수 없습니다. 키보드 ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œìš”. (Ctrl/Cmd+C).","cut":"잘ë¼ë‚´ê¸°","cutError":"브ë¼ìš°ì €ì˜ ë³´ì•ˆì„¤ì •ë•Œë¬¸ì— ìž˜ë¼ë‚´ê¸° ê¸°ëŠ¥ì„ ì‹¤í–‰í•  수 없습니다. 키보드 ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œìš”. (Ctrl/Cmd+X).","paste":"붙여넣기","pasteArea":"Paste Area","pasteMsg":"í‚¤ë³´ë“œì˜ (<STRONG>Ctrl/Cmd+V</STRONG>) 를 ì´ìš©í•´ì„œ ìƒìžì•ˆì— 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.","securityMsg":"브러우저 보안 설정으로 ì¸í•´, í´ë¦½ë³´ë“œì˜ ìžë£Œë¥¼ ì§ì ‘ 접근할 수 없습니다. ì´ ì°½ì— ë‹¤ì‹œ 붙여넣기 하십시오.","title":"붙여넣기"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"순서없는 목ë¡","numberedlist":"순서있는 목ë¡"},"indent":{"indent":"들여쓰기","outdent":"내어쓰기"},"format":{"label":"í¬ë§·","panelTitle":"í¬ë§·","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"수í‰ì„  삽입"},"image":{"alertUrl":"ì´ë¯¸ì§€ URLì„ ìž…ë ¥í•˜ì‹­ì‹œìš”","alt":"ì´ë¯¸ì§€ 설명","border":"í…Œë‘리","btnUpload":"서버로 전송","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"수í‰ì—¬ë°±","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ì´ë¯¸ì§€ ì •ë³´","linkTab":"ë§í¬","lockRatio":"비율 유지","menu":"ì´ë¯¸ì§€ 설정","resetSize":"ì›ëž˜ í¬ê¸°ë¡œ","title":"ì´ë¯¸ì§€ 설정","titleButton":"ì´ë¯¸ì§€ë²„튼 ì†ì„±","upload":"업로드","urlMissing":"Image source URL is missing.","vSpace":"수ì§ì—¬ë°±","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"엑세스 키","advanced":"ìžì„¸ížˆ","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"책갈피 삽입/변경","menu":"책갈피 ì†ì„±","title":"책갈피 ì†ì„±","name":"책갈피 ì´ë¦„","errorName":"책갈피 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œìš”.","remove":"Remove Anchor"},"anchorId":"책갈피 ID","anchorName":"책갈피 ì´ë¦„","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"ì´ë©”ì¼ ì£¼ì†Œ","emailBody":"ë‚´ìš©","emailSubject":"제목","id":"ID","info":"ë§í¬ ì •ë³´","langCode":"쓰기 ë°©í–¥","langDir":"쓰기 ë°©í–¥","langDirLTR":"왼쪽ì—서 오른쪽 (LTR)","langDirRTL":"오른쪽ì—서 왼쪽 (RTL)","menu":"ë§í¬ 수정","name":"Name","noAnchors":"(ë¬¸ì„œì— ì±…ê°ˆí”¼ê°€ 없습니다.)","noEmail":"ì´ë©”ì¼ì£¼ì†Œë¥¼ 입력하십시요.","noUrl":"ë§í¬ URLì„ ìž…ë ¥í•˜ì‹­ì‹œìš”.","other":"<기타>","popupDependent":"Dependent (Netscape)","popupFeatures":"íŒì—…ì°½ 설정","popupFullScreen":"전체화면 (IE)","popupLeft":"왼쪽 위치","popupLocationBar":"주소표시줄","popupMenuBar":"메뉴바","popupResizable":"Resizable","popupScrollBars":"스í¬ë¡¤ë°”","popupStatusBar":"ìƒíƒœë°”","popupToolbar":"툴바","popupTop":"윗쪽 위치","rel":"Relationship","selectAnchor":"책갈피 ì„ íƒ","styles":"Style","tabIndex":"탭 순서","target":"타겟","targetFrame":"<프레임>","targetFrameName":"타겟 프레임 ì´ë¦„","targetPopup":"<íŒì—…ì°½>","targetPopupName":"íŒì—…ì°½ ì´ë¦„","title":"ë§í¬","toAnchor":"책갈피","toEmail":"ì´ë©”ì¼","toUrl":"URL","toolbar":"ë§í¬ 삽입/변경","type":"ë§í¬ 종류","unlink":"ë§í¬ ì‚­ì œ","upload":"업로드"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"í…스트로 붙여넣기","title":"í…스트로 붙여넣기"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"MS Word 형ì‹ì—서 붙여넣기","toolbar":"MS Word 형ì‹ì—서 붙여넣기"},"removeformat":{"toolbar":"í¬ë§· 지우기"},"sourcearea":{"toolbar":"소스"},"specialchar":{"options":"Special Character Options","title":"íŠ¹ìˆ˜ë¬¸ìž ì„ íƒ","toolbar":"íŠ¹ìˆ˜ë¬¸ìž ì‚½ìž…"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"스타ì¼","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"í…Œë‘리 í¬ê¸°","caption":"캡션","cell":{"menu":"ì…€/칸(Cell)","insertBefore":"ì•žì— ì…€/칸 삽입","insertAfter":"ë’¤ì— ì…€/칸 삽입","deleteCell":"ì…€ ì‚­ì œ","merge":"ì…€ 합치기","mergeRight":"오른쪽 뭉치기","mergeDown":"왼쪽 뭉치기","splitHorizontal":"ìˆ˜í‰ ë‚˜ëˆ„ê¸°","splitVertical":"ìˆ˜ì§ ë‚˜ëˆ„ê¸°","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"ì…€ 여백","cellSpace":"ì…€ 간격","column":{"menu":"ì—´(Column)","insertBefore":"ì•žì— ì—´ 삽입","insertAfter":"ë’¤ì— ì—´ 삽입","deleteColumn":"세로줄 ì‚­ì œ"},"columns":"세로줄","deleteTable":"표 ì‚­ì œ","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"표 설정","row":{"menu":"í–‰(Row)","insertBefore":"ì•žì— í–‰ 삽입","insertAfter":"ë’¤ì— í–‰ 삽입","deleteRow":"가로줄 ì‚­ì œ"},"rows":"가로줄","summary":"Summary","title":"표 설정","toolbar":"표","widthPc":"í¼ì„¼íЏ","widthPx":"픽셀","widthUnit":"width unit"},"undo":{"redo":"재실행","undo":"취소"},"wsc":{"btnIgnore":"건너뜀","btnIgnoreAll":"ëª¨ë‘ ê±´ë„ˆëœ€","btnReplace":"변경","btnReplaceAll":"ëª¨ë‘ ë³€ê²½","btnUndo":"취소","changeTo":"변경할 단어","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ì² ìž ê²€ì‚¬ê¸°ê°€ 철치ë˜ì§€ 않았습니다. 지금 다운로드하시겠습니까?","manyChanges":"ì² ìžê²€ì‚¬ 완료: %1 단어가 변경ë˜ì—ˆìŠµë‹ˆë‹¤.","noChanges":"ì² ìžê²€ì‚¬ 완료: ë³€ê²½ëœ ë‹¨ì–´ê°€ 없습니다.","noMispell":"ì² ìžê²€ì‚¬ 완료: ìž˜ëª»ëœ ì² ìžê°€ 없습니다.","noSuggestions":"- 추천단어 ì—†ìŒ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ì‚¬ì „ì— ì—†ëŠ” 단어","oneChange":"ì² ìžê²€ì‚¬ 완료: 단어가 변경ë˜ì—ˆìŠµë‹ˆë‹¤.","progress":"ì² ìžê²€ì‚¬ë¥¼ 진행중입니다...","title":"Spell Check","toolbar":"ì² ìžê²€ì‚¬"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ku.js b/mod/ckeditor/vendors/ckeditor/lang/ku.js
new file mode 100644
index 000000000..be2fd50fe
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ku.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ku']={"dir":"rtl","editor":"سەرنووسەی دەقی بەپیت","common":{"editorHelp":"کلیکی ALT لهگهڵ 0 بکه بۆ یارمهتی","browseServer":"هێنانی ڕاژە","url":"ناونیشانی بەستەر","protocol":"پڕۆتۆکۆڵ","upload":"بارکردن","uploadSubmit":"ناردنی بۆ ڕاژە","image":"ÙˆÛŽÙ†Û•","flash":"Ùلاش","form":"داڕشتە","checkbox":"خانەی نیشانکردن","radio":"جێگرەوەی دوگمە","textField":"خانەی دەق","textarea":"ڕووبەری دەق","hiddenField":"شاردنەوی خانە","button":"دوگمە","select":"هەڵبژاردەی خانە","imageButton":"دوگمەی ÙˆÛŽÙ†Û•","notSet":"<هیچ دانەدراوە>","id":"ناسنامە","name":"ناو","langDir":"ئاراستەی زمان","langDirLtr":"Ú†Û•Ù¾ بۆ ڕاست (LTR)","langDirRtl":"ڕاست بۆ Ú†Û•Ù¾ (RTL)","langCode":"هێمای زمان","longDescr":"پێناسەی درێژی بەستەر","cssClass":"شێوازی چینی پهڕە","advisoryTitle":"ڕاوێژکاری سەردێڕ","cssStyle":"شێواز","ok":"باشە","cancel":"هەڵوەشاندن","close":"داخستن","preview":"پێشبینین","resize":"گۆڕینی ئەندازە","generalTab":"گشتی","advancedTab":"پهرهسهندوو","validateNumberFailed":"ئەم نرخە ژمارە نیه، تکایە نرخێکی ژمارە بنووسە.","confirmNewPage":"سەرجەم گۆڕانکاریەکان Ùˆ پێکهاتەکانی ناوەووە لەدەست دەدەی گەر بێتوو پاشکەوتی Ù†Û•Ú©Û•ÛŒ یەکەم جار، تۆ هەر دڵنیایی لەکردنەوەی پەنجەرەکی نوێ؟","confirmCancel":"هەندێك هەڵبژاردە گۆڕدراوە. تۆ دڵنیایی لهداخستنی ئەم دیالۆگە؟","options":"هەڵبژاردە","target":"ئامانج","targetNew":"پەنجەرەیهکی نوێ (_blank)","targetTop":"لووتکەی پەنجەرە (_top)","targetSelf":"لەهەمان پەنجەرە (_self)","targetParent":"پەنجەرەی باوان (_parent)","langDirLTR":"Ú†Û•Ù¾ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ Ú†Û•Ù¾ (RTL)","styles":"شێواز","cssClasses":"شێوازی چینی Ù¾Û•Ú•Û•","width":"پانی","height":"درێژی","align":"ڕێککەرەوە","alignLeft":"Ú†Û•Ù¾","alignRight":"ڕاست","alignCenter":"ناوەڕاست","alignTop":"سەرەوە","alignMiddle":"ناوەند","alignBottom":"ژێرەوە","invalidValue":"نرخێکی نادرووست.","invalidHeight":"درێژی دەبێت ژمارە بێت.","invalidWidth":"پانی دەبێت ژمارە بێت.","invalidCssLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی (px, %, in, cm, mm, em, ex, pt, یان pc).","invalidHtmlLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی HTML (px یان %).","invalidInlineStyle":"دانهی نرخی شێوازی ناوهێڵ دهبێت پێکهاتبێت لهیهك یان زیاتری داڕشته \"ناو : نرخ\", جیاکردنهوهی Ø¨Ù‡ÙØ§Ø±ÛŒØ²Ù‡ÙˆØ®Ø§Úµ","cssLengthTooltip":"ژمارهیهك بنووسه بۆ نرخی piksel یان ئامرازێکی درووستی CSS (px, %, in, cm, mm, em, ex, pt, یان pc).","unavailable":"%1<span class=\"cke_accessibility\">, ئامادە نیە</span>"},"about":{"copy":"ماÙÛŒ لهبهرگرتنهوهی &copy; $1. گشتی پارێزراوه.","dlgTitle":"دهربارهی CKEditor","help":"سهیری $1 بکه بۆ یارمهتی.","moreInfo":"بۆ زانیاری زیاتری مۆڵهت, تکایه سهردانی ماڵپهڕهکهمان بکه:","title":"دهربارهی CKEditor","userGuide":"ڕێپیشاندهری CKEditors"},"basicstyles":{"bold":"Ù‚Û•ÚµÛ•Ùˆ","italic":"لار","strike":"لێدان","subscript":"ژێرنووس","superscript":"سەرنووس","underline":"ژێرهێڵ"},"blockquote":{"toolbar":"بەربەستکردنی وتەی وەرگیراو"},"clipboard":{"copy":"لەبەرگرنتەوه","copyError":"پارێزی وێبگەڕەکەت ڕێگهنادات بەسەرنووسەکە Ù„Û• لکاندنی دەقی خۆکار. تکایە لەبری ئەمە ئەم Ùەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).","cut":"بڕین","cutError":"پارێزی وێبگەڕەکەت ڕێگهنادات بە سەرنووسەکە لهبڕینی خۆکار. تکایە لەبری ئەمە ئەم Ùەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).","paste":"لکاندن","pasteArea":"ناوچهی لکاندن","pasteMsg":"تکایه بیلکێنه لهناوهوهی ئهم سنوقه لهڕێی تهختهکلیلهکهت بهباکارهێنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشه بکه.","securityMsg":"بههۆی شێوهپێدانی پارێزی وێبگهڕهکهت، سهرنووسهکه ناتوانێت دهستبگهیهنێت بهههڵگیراوهکه ڕاستهوخۆ. بۆیه پێویسته دووباره بیلکێنیت لهم پهنجهرهیه.","title":"لکاندن"},"contextmenu":{"options":"هەڵبژاردەی لیستەی کلیکی دەستی ڕاست"},"toolbar":{"toolbarCollapse":"شاردنەوی Ù‡ÛŽÚµÛŒ تووڵامراز","toolbarExpand":"نیشاندانی Ù‡ÛŽÚµÛŒ تووڵامراز","toolbarGroups":{"document":"پهڕه","clipboard":"بڕین/پووچکردنهوه","editing":"چاکسازی","forms":"داڕشته","basicstyles":"شێوازی بنچینهیی","paragraph":"بڕگه","links":"بهستهر","insert":"خستنه ناو","styles":"شێواز","colors":"ڕهنگهکان","tools":"ئامرازهکان"},"toolbars":"تووڵاەرازی دەسکاریکەر"},"elementspath":{"eleLabel":"ڕێڕهوی توخمهکان","eleTitle":"%1 توخم"},"list":{"bulletedlist":"دانان/لابردنی خاڵی لیست","numberedlist":"دانان/لابردنی ژمارەی لیست"},"indent":{"indent":"زیادکردنی بۆشایی","outdent":"کەمکردنەوەی بۆشایی"},"format":{"label":"ڕازاندنهوه","panelTitle":"بهشی ڕازاندنهوه","tag_address":"ناونیشان","tag_div":"(DIV)-ÛŒ ئاسایی","tag_h1":"سهرنووسهی Ù¡","tag_h2":"سهرنووسهی Ù¢","tag_h3":"سهرنووسهی Ù£","tag_h4":"سهرنووسهی Ù¤","tag_h5":"سهرنووسهی Ù¥","tag_h6":"سهرنووسهی Ù¦","tag_p":"ئاسایی","tag_pre":"شێوازکراو"},"horizontalrule":{"toolbar":"دانانی Ù‡ÛŽÙ„ÛŒ ئاسۆیی"},"image":{"alertUrl":"تکایه ناونیشانی بهستهری وێنه بنووسه","alt":"جێگرهوهی دهق","border":"پهراوێز","btnUpload":"ناردنی بۆ ڕاژه","button2Img":"تۆ دهتهوێت دوگمهی وێنهی دیاریکراو بگۆڕیت بۆ وێنهکی ئاسایی؟","hSpace":"بۆشایی ئاسۆیی","img2Button":"تۆ دهتهوێت وێنهی دیاریکراو بگۆڕیت بۆ دوگمهی وێنه؟","infoTab":"زانیاری وێنه","linkTab":"بهستهر","lockRatio":"داخستنی Ú•ÛŽÚ˜Ù‡","menu":"خاسیهتی وێنه","resetSize":"ڕێکخستنهوهی قهباره","title":"خاسیهتی وێنه","titleButton":"خاسیهتی دوگمهی وێنه","upload":"بارکردن","urlMissing":"سهرچاوهی بهستهری وێنه بزره","vSpace":"بۆشایی ئهستونی","validateBorder":"پهراوێز دهبێت بهتهواوی تهنها ژماره بێت.","validateHSpace":"بۆشایی ئاسۆیی دهبێت بهتهواوی تهنها ژماره بێت.","validateVSpace":"بۆشایی ئهستونی دهبێت بهتهواوی تهنها ژماره بێت."},"fakeobjects":{"anchor":"لهنگهر","flash":"Ùلاش","hiddenfield":"شاردنهوهی خانه","iframe":"لهچوارچێوه","unknown":"بهرکارێکی نهناسراو"},"link":{"acccessKey":"کلیلی دهستپێگهیشتن","advanced":"پێشکهوتوو","advisoryContentType":"جۆری ناوهڕۆکی ڕاویژکار","advisoryTitle":"ڕاوێژکاری سهردێڕ","anchor":{"toolbar":"دانان/چاکسازی لهنگهر","menu":"چاکسازی لهنگهر","title":"خاسیهتی لهنگهر","name":"ناوی لهنگهر","errorName":"تکایه ناوی لهنگهر بنووسه","remove":"لابردنی لهنگهر"},"anchorId":"بهپێی ناسنامهی توخم","anchorName":"بهپێی ناوی لهنگهر","charset":"بەستەری سەرچاوەی نووسه","cssClasses":"شێوازی چینی پهڕه","emailAddress":"ناونیشانی ئیمهیل","emailBody":"ناوهڕۆکی نامه","emailSubject":"بابهتی نامه","id":"ناسنامه","info":"زانیاری بەستەر","langCode":"هێمای زمان","langDir":"ئاراستهی زمان","langDirLTR":"چهپ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ چهپ (RTL)","menu":"چاکسازی بەستەر","name":"ناو","noAnchors":"(هیچ جۆرێکی لهنگهر ئاماده نیه لهم پهڕهیه)","noEmail":"تکایه ناونیشانی ئیمهیل بنووسه","noUrl":"تکایه ناونیشانی بهستهر بنووسه","other":"<هیتر>","popupDependent":"پێوهبهستراو (Netscape)","popupFeatures":"خاسیهتی پهنجهرهی سهرههڵدهر","popupFullScreen":"Ù¾Ú• بهپڕی شاشه (IE)","popupLeft":"جێگای چهپ","popupLocationBar":"Ù‡ÛŽÚµÛŒ ناونیشانی بهستهر","popupMenuBar":"Ù‡ÛŽÚµÛŒ لیسته","popupResizable":"توانای گۆڕینی قهباره","popupScrollBars":"Ù‡ÛŽÚµÛŒ هاتووچۆپێکردن","popupStatusBar":"Ù‡ÛŽÚµÛŒ دۆخ","popupToolbar":"Ù‡ÛŽÚµÛŒ تووڵامراز","popupTop":"جێگای سهرهوه","rel":"پهیوهندی (rel)","selectAnchor":"ههڵبژاردنی لهنگهرێك","styles":"شێواز","tabIndex":"بازدهری تابی ئیندێکس","target":"ئامانج","targetFrame":"<چووارچێوه>","targetFrameName":"ناوی ئامانجی چووارچێوه","targetPopup":"<پهنجهرهی سهرههڵدهر>","targetPopupName":"ناوی پهنجهرهی سهرههڵدهر","title":"بەستەر","toAnchor":"بهستهر بۆ لهنگهر له دهق","toEmail":"ئیمهیل","toUrl":"ناونیشانی بهستهر","toolbar":"دانان/ڕێکخستنی بەستەر","type":"جۆری بهستهر","unlink":"لابردنی بەستەر","upload":"بارکردن"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ئەوپهڕی گەورەیی","minimize":"ئەوپەڕی بچووکی"},"pastetext":{"button":"لکاندنی وهك دهقی ڕوون","title":"لکاندنی وهك دهقی ڕوون"},"pastefromword":{"confirmCleanup":"ئهم دهقهی بهتهمای بیلکێنی پێدهچێت له word هێنرابێت. دهتهوێت پاکی بکهیوه Ù¾ÛŽØ´ ئهوهی بیلکێنی؟","error":"هیچ ڕێگهیهك نهبوو لهلکاندنی دهقهکه بههۆی ههڵهکی ناوهخۆیی","title":"لکاندنی لهلایهن Word","toolbar":"لکاندنی لهڕێی Word"},"removeformat":{"toolbar":"لابردنی داڕشتەکە"},"sourcearea":{"toolbar":"سەرچاوە"},"specialchar":{"options":"هەڵبژاردەی نووسەی تایبەتی","title":"هەڵبژاردنی نووسەی تایبەتی","toolbar":"دانانەی نووسەی تایبەتی"},"scayt":{"about":"دهربارهی SCAYT","aboutTab":"دهربارهی","addWord":"زیادکردنی ووشه","allCaps":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهوره","dic_create":"درووستکردن","dic_delete":"سڕینهوه","dic_field_name":"ناوی Ùهرههنگ","dic_info":"لهبنچینهدا Ùهرههنگی بهکارهێنهر کۆگاکردن کراوه له شهکرۆکه Cookie, ههرچۆنێك بێت شهکۆرکه سنووردار کراوه له قهباره کۆگاکردن.کاتێك Ùهرههنگی بهکارهێنهر گهیشته ئهم خاڵهی کهناتوانرێت زیاتر کۆگاکردن بکرێت له شهکرۆکه، ئهوسا Ùهرههنگهکه پێویسته کۆگابکرێت له ڕاژهکهی ئێمه. بۆ کۆگاکردنی زانیاری تایبهتی Ùهرههنگهکه له ڕاژهکهی ئێمه, پێویسته ناوێك ههڵبژێریت بۆ Ùهرههنگهکه. گهر تۆ Ùهرههنگێکی کۆگاکراوت ههیه, تکایه ناوی Ùهرههنگهکه بنووسه وه کلیکی دوگمهی گهڕاندنهوه بکه.","dic_rename":"گۆڕینی ناو","dic_restore":"گهڕاندنهوه","dictionariesTab":"Ùهرههنگهکان","disable":"ناچالاککردنی SCAYT","emptyDic":"ناوی Ùهرههنگ نابێت خاڵی بێت.","enable":"چالاککردنی SCAYT","ignore":"پشتگوێخستن","ignoreAll":"پشتگوێخستنی ههمووی","ignoreDomainNames":"پشتگوێخستنی دۆمهین","langs":"زمانهکان","languagesTab":"زمانهکان","mixedCase":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهورهو بچووك","mixedWithDigits":"پشتگوێخستنی وشانهی پێکهاتووه لهژماره","moreSuggestions":"پێشنیاری زیاتر","opera_title":"پشتیوانی نهکراوه لهلایهن Opera","options":"ههڵبژارده","optionsTab":"ههڵبژارده","title":"پشکنینی نووسه لهکاتی نووسین","toggle":"گۆڕینی SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"شێواز","panelTitle":"شێوازی ڕازاندنهوه","panelTitle1":"شێوازی خشت","panelTitle2":"شێوازی ناوهێڵ","panelTitle3":"شێوازی بهرکار"},"table":{"border":"گهورهیی پهراوێز","caption":"سهردێڕ","cell":{"menu":"خانه","insertBefore":"دانانی خانه لهپێش","insertAfter":"دانانی خانه لهپاش","deleteCell":"سڕینهوهی خانه","merge":"تێکهڵکردنی خانه","mergeRight":"تێکهڵکردنی لهگهڵ ڕاست","mergeDown":"تێکهڵکردنی لهگهڵ خوارهوه","splitHorizontal":"دابهشکردنی خانهی ئاسۆیی","splitVertical":"دابهشکردنی خانهی ئهستونی","title":"خاسیهتی خانه","cellType":"جۆری خانه","rowSpan":"ماوهی نێوان ڕیز","colSpan":"بستی ئهستونی","wordWrap":"پێچانهوهی وشه","hAlign":"ڕیزکردنی ئاسۆیی","vAlign":"ڕیزکردنی ئهستونی","alignBaseline":"هێڵهبنهڕهت","bgColor":"ڕهنگی پاشبنهما","borderColor":"ڕهنگی پهراوێز","data":"داتا","header":"سهرپهڕه","yes":"بهڵێ","no":"نهخێر","invalidWidth":"پانی خانه دهبێت بهتهواوی ژماره بێت.","invalidHeight":"درێژی خانه بهتهواوی دهبێت ژماره بێت.","invalidRowSpan":"ماوهی نێوان ڕیز بهتهواوی دهبێت ژماره بێت.","invalidColSpan":"ماوهی نێوان ئهستونی بهتهواوی دهبێت ژماره بێت.","chooseColor":"ههڵبژاردن"},"cellPad":"بۆشایی ناوپۆش","cellSpace":"بۆشایی خانه","column":{"menu":"ئهستون","insertBefore":"دانانی ئهستون لهپێش","insertAfter":"دانانی ئهستوون لهپاش","deleteColumn":"سڕینهوهی ئهستوون"},"columns":"ستوونهکان","deleteTable":"سڕینهوهی خشته","headers":"سهرپهڕه","headersBoth":"ههردووك","headersColumn":"یهکهم ئهستوون","headersNone":"هیچ","headersRow":"یهکهم ڕیز","invalidBorder":"ژمارهی پهراوێز دهبێت تهنها ژماره بێت.","invalidCellPadding":"ناوپۆشی خانه دهبێت ژمارهکی درووست بێت.","invalidCellSpacing":"بۆشایی خانه دهبێت ژمارهکی درووست بێت.","invalidCols":"ژمارهی ئهستوونی دهبێت گهورهتر بێت لهژمارهی 0.","invalidHeight":"درێژی خشته دهبێت تهنها ژماره بێت.","invalidRows":"ژمارهی ڕیز دهبێت گهورهتر بێت لهژمارهی 0.","invalidWidth":"پانی خشته دهبێت تهنها ژماره بێت.","menu":"خاسیهتی خشته","row":{"menu":"ڕیز","insertBefore":"دانانی ڕیز لهپێش","insertAfter":"دانانی ڕیز لهپاش","deleteRow":"سڕینهوهی ڕیز"},"rows":"ڕیز","summary":"کورته","title":"خاسیهتی خشته","toolbar":"خشته","widthPc":"لهسهدا","widthPx":"وێنهخاڵ - پیکسل","widthUnit":"پانی یهکه"},"undo":{"redo":"هەڵگەڕاندنەوه","undo":"پووچکردنەوه"},"wsc":{"btnIgnore":"پشتگوێ کردن","btnIgnoreAll":"پشتگوێکردنی ههمووی","btnReplace":"لهبریدانن","btnReplaceAll":"لهبریدانانی ههمووی","btnUndo":"پووچکردنهوه","changeTo":"گۆڕینی بۆ","errorLoading":"ههڵه لههێنانی داخوازینامهی خانهخۆێی ڕاژه: %s.","ieSpellDownload":"پشکنینی ڕێنووس دانهمزراوه. دهتهوێت ئێستا دایبگریت?","manyChanges":"پشکنینی ڕێنووس کۆتای هات: لهسهدا %1 ÛŒ وشهکان گۆڕدرا","noChanges":"پشکنینی ڕێنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا","noMispell":"پشکنینی ڕێنووس کۆتای هات: هیچ ههڵهیهکی ڕێنووس نهدۆزراوه","noSuggestions":"- هیچ پێشنیارێك -","notAvailable":"ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.","notInDic":"لهÙهرههنگ دانیه","oneChange":"پشکنینی ڕێنووس کۆتای هات: یهك وشه گۆڕدرا","progress":"پشکنینی ڕێنووس لهبهردهوامبوون دایه...","title":"پشکنینی ڕێنووس","toolbar":"پشکنینی ڕێنووس"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/lt.js b/mod/ckeditor/vendors/ckeditor/lang/lt.js
new file mode 100644
index 000000000..8b1746a2d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/lt.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lt']={"dir":"ltr","editor":"Pilnas redaktorius","common":{"editorHelp":"Spauskite ALT 0 dÄ—l pagalbos","browseServer":"NarÅ¡yti po serverį","url":"URL","protocol":"Protokolas","upload":"Siųsti","uploadSubmit":"Siųsti į serverį","image":"Vaizdas","flash":"Flash","form":"Forma","checkbox":"Žymimasis langelis","radio":"Žymimoji akutÄ—","textField":"Teksto laukas","textarea":"Teksto sritis","hiddenField":"Nerodomas laukas","button":"Mygtukas","select":"Atrankos laukas","imageButton":"Vaizdinis mygtukas","notSet":"<nÄ—ra nustatyta>","id":"Id","name":"Vardas","langDir":"Teksto kryptis","langDirLtr":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRtl":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","langCode":"Kalbos kodas","longDescr":"Ilgas apraÅ¡ymas URL","cssClass":"Stilių lentelÄ—s klasÄ—s","advisoryTitle":"KonsultacinÄ— antraÅ¡tÄ—","cssStyle":"Stilius","ok":"OK","cancel":"Nutraukti","close":"Uždaryti","preview":"PeržiÅ«rÄ—ti","resize":"Pavilkite, kad pakeistumÄ—te dydį","generalTab":"Bendros savybÄ—s","advancedTab":"Papildomas","validateNumberFailed":"Å i reikÅ¡mÄ— nÄ—ra skaiÄius.","confirmNewPage":"Visas neiÅ¡saugotas turinys bus prarastas. Ar tikrai norite įkrauti naujÄ… puslapį?","confirmCancel":"Kai kurie parametrai pasikeitÄ—. Ar tikrai norite užverti langÄ…?","options":"Parametrai","target":"TikslinÄ— nuoroda","targetNew":"Naujas langas (_blank)","targetTop":"VirÅ¡utinis langas (_top)","targetSelf":"Esamas langas (_self)","targetParent":"Paskutinis langas (_parent)","langDirLTR":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRTL":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","styles":"Stilius","cssClasses":"Stilių klasÄ—s","width":"Plotis","height":"AukÅ¡tis","align":"Lygiuoti","alignLeft":"KairÄ™","alignRight":"DeÅ¡inÄ™","alignCenter":"CentrÄ…","alignTop":"ViršūnÄ™","alignMiddle":"Vidurį","alignBottom":"ApaÄiÄ…","invalidValue":"Invalid value.","invalidHeight":"AukÅ¡tis turi bÅ«ti nurodytas skaiÄiais.","invalidWidth":"Plotis turi bÅ«ti nurodytas skaiÄiais.","invalidCssLength":"ReikÅ¡mÄ— nurodyta \"%1\" laukui, turi bÅ«ti teigiamas skaiÄius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).","invalidHtmlLength":"ReikÅ¡mÄ— nurodyta \"%1\" laukui, turi bÅ«ti teigiamas skaiÄius su arba be tinkamo HTML matavimo vieneto (px arba %).","invalidInlineStyle":"ReikÅ¡mÄ— nurodyta vidiniame stiliuje turi bÅ«ti sudaryta iÅ¡ vieno Å¡ių reikÅ¡mių \"vardas : reikÅ¡mÄ—\", atskirta kabliataÅ¡kiais.","cssLengthTooltip":"Ä®veskite reikÅ¡mÄ™ pikseliais arba skaiÄiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).","unavailable":"%1<span class=\"cke_accessibility\">, netinkamas</span>"},"about":{"copy":"Copyright &copy; $1. Visos teiss saugomos.","dlgTitle":"Apie CKEditor","help":"Patikrinkite $1 dÄ—l pagalbos.","moreInfo":"DÄ—l licencijavimo apsilankykite mÅ«sų svetainÄ—je:","title":"Apie CKEditor","userGuide":"CKEditor Vartotojo Gidas"},"basicstyles":{"bold":"Pusjuodis","italic":"Kursyvas","strike":"Perbrauktas","subscript":"Apatinis indeksas","superscript":"VirÅ¡utinis indeksas","underline":"Pabrauktas"},"blockquote":{"toolbar":"Citata"},"clipboard":{"copy":"Kopijuoti","copyError":"JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti kopijavimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl/Cmd+C).","cut":"IÅ¡kirpti","cutError":"JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti iÅ¡kirpimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl/Cmd+X).","paste":"Ä®dÄ—ti","pasteArea":"Ä®kelti dalį","pasteMsg":"Žemiau esanÄiame įvedimo lauke įdÄ—kite tekstÄ…, naudodami klaviatÅ«rÄ… (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtukÄ… <STRONG>OK</STRONG>.","securityMsg":"DÄ—l jÅ«sų narÅ¡yklÄ—s saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartÄ… į šį langÄ….","title":"Ä®dÄ—ti"},"contextmenu":{"options":"Kontekstinio meniu parametrai"},"toolbar":{"toolbarCollapse":"Apjungti įrankių juostÄ…","toolbarExpand":"IÅ¡plÄ—sti įrankių juostÄ…","toolbarGroups":{"document":"Dokumentas","clipboard":"AtmintinÄ—/Atgal","editing":"Redagavimas","forms":"Formos","basicstyles":"Pagrindiniai stiliai","paragraph":"Paragrafas","links":"Nuorodos","insert":"Ä®terpti","styles":"Stiliai","colors":"Spalvos","tools":"Ä®rankiai"},"toolbars":"Redaktoriaus įrankiai"},"elementspath":{"eleLabel":"Elemento kelias","eleTitle":"%1 elementas"},"list":{"bulletedlist":"Suženklintas sÄ…raÅ¡as","numberedlist":"Numeruotas sÄ…raÅ¡as"},"indent":{"indent":"Padidinti įtraukÄ…","outdent":"Sumažinti įtraukÄ…"},"format":{"label":"Å rifto formatas","panelTitle":"Å rifto formatas","tag_address":"Kreipinio","tag_div":"Normalus (DIV)","tag_h1":"AntraÅ¡tinis 1","tag_h2":"AntraÅ¡tinis 2","tag_h3":"AntraÅ¡tinis 3","tag_h4":"AntraÅ¡tinis 4","tag_h5":"AntraÅ¡tinis 5","tag_h6":"AntraÅ¡tinis 6","tag_p":"Normalus","tag_pre":"Formuotas"},"horizontalrule":{"toolbar":"Ä®terpti horizontaliÄ… linijÄ…"},"image":{"alertUrl":"PraÅ¡ome įvesti vaizdo URL","alt":"Alternatyvus Tekstas","border":"RÄ—melis","btnUpload":"Siųsti į serverį","button2Img":"Ar norite mygtukÄ… paversti paprastu paveiksliuku?","hSpace":"Hor.ErdvÄ—","img2Button":"Ar norite paveiksliukÄ… paversti mygtuku?","infoTab":"Vaizdo informacija","linkTab":"Nuoroda","lockRatio":"IÅ¡laikyti proporcijÄ…","menu":"Vaizdo savybÄ—s","resetSize":"Atstatyti dydį","title":"Vaizdo savybÄ—s","titleButton":"Vaizdinio mygtuko savybÄ—s","upload":"Nusiųsti","urlMissing":"Paveiksliuko nuorodos nÄ—ra.","vSpace":"Vert.ErdvÄ—","validateBorder":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius.","validateHSpace":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius.","validateVSpace":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius."},"fakeobjects":{"anchor":"ŽymÄ—","flash":"Flash animacija","hiddenfield":"PaslÄ—ptas laukas","iframe":"IFrame","unknown":"Nežinomas objektas"},"link":{"acccessKey":"Prieigos raktas","advanced":"Papildomas","advisoryContentType":"Konsultacinio turinio tipas","advisoryTitle":"KonsultacinÄ— antraÅ¡tÄ—","anchor":{"toolbar":"Ä®terpti/modifikuoti žymÄ™","menu":"ŽymÄ—s savybÄ—s","title":"ŽymÄ—s savybÄ—s","name":"ŽymÄ—s vardas","errorName":"PraÅ¡ome įvesti žymÄ—s vardÄ…","remove":"PaÅ¡alinti žymÄ™"},"anchorId":"Pagal žymÄ—s Id","anchorName":"Pagal žymÄ—s vardÄ…","charset":"Susietų iÅ¡teklių simbolių lentelÄ—","cssClasses":"Stilių lentelÄ—s klasÄ—s","emailAddress":"El.paÅ¡to adresas","emailBody":"ŽinutÄ—s turinys","emailSubject":"ŽinutÄ—s tema","id":"Id","info":"Nuorodos informacija","langCode":"Teksto kryptis","langDir":"Teksto kryptis","langDirLTR":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRTL":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","menu":"Taisyti nuorodÄ…","name":"Vardas","noAnchors":"(Å iame dokumente žymių nÄ—ra)","noEmail":"PraÅ¡ome įvesti el.paÅ¡to adresÄ…","noUrl":"PraÅ¡ome įvesti nuorodos URL","other":"<kitas>","popupDependent":"Priklausomas (Netscape)","popupFeatures":"IÅ¡skleidžiamo lango savybÄ—s","popupFullScreen":"Visas ekranas (IE)","popupLeft":"KairÄ— pozicija","popupLocationBar":"Adreso juosta","popupMenuBar":"Meniu juosta","popupResizable":"Kintamas dydis","popupScrollBars":"Slinkties juostos","popupStatusBar":"BÅ«senos juosta","popupToolbar":"Mygtukų juosta","popupTop":"VirÅ¡utinÄ— pozicija","rel":"SÄ…sajos","selectAnchor":"Pasirinkite žymÄ™","styles":"Stilius","tabIndex":"Tabuliavimo indeksas","target":"Paskirties vieta","targetFrame":"<kadras>","targetFrameName":"Paskirties kadro vardas","targetPopup":"<iÅ¡skleidžiamas langas>","targetPopupName":"Paskirties lango vardas","title":"Nuoroda","toAnchor":"ŽymÄ— Å¡iame puslapyje","toEmail":"El.paÅ¡tas","toUrl":"Nuoroda","toolbar":"Ä®terpti/taisyti nuorodÄ…","type":"Nuorodos tipas","unlink":"Panaikinti nuorodÄ…","upload":"Siųsti"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"IÅ¡didinti","minimize":"Sumažinti"},"pastetext":{"button":"Ä®dÄ—ti kaip grynÄ… tekstÄ…","title":"Ä®dÄ—ti kaip grynÄ… tekstÄ…"},"pastefromword":{"confirmCleanup":"Tekstas, kurį įkeliate yra kopijuojamas iÅ¡ Word. Ar norite jį iÅ¡valyti prieÅ¡ įkeliant?","error":"DÄ—l vidinių sutrikimų, nepavyko iÅ¡valyti įkeliamo teksto","title":"Ä®dÄ—ti iÅ¡ Word","toolbar":"Ä®dÄ—ti iÅ¡ Word"},"removeformat":{"toolbar":"Panaikinti formatÄ…"},"sourcearea":{"toolbar":"Å altinis"},"specialchar":{"options":"Specialaus simbolio nustatymai","title":"Pasirinkite specialų simbolį","toolbar":"Ä®terpti specialų simbolį"},"scayt":{"about":"Apie SCAYT","aboutTab":"Apie","addWord":"PridÄ—ti žodį","allCaps":"Ignoruoti visas didžiÄ…sias raides","dic_create":"Sukurti","dic_delete":"IÅ¡trinti","dic_field_name":"Žodyno pavadinimas","dic_info":"Paprastai žodynas yra saugojamas sausainÄ—liuose (cookies), kurių dydis, bet kokiu atveju, yra apribotas. Esant sausainÄ—lių apimties perviÅ¡iui, viskas bus saugoma serveryje. Jei norite iÅ¡ kart viskÄ… saugoti serveryje, turite sugalvoti žodynui pavadinimÄ…. Jei jau turite žodynÄ…, įraÅ¡ykite pavadinimÄ… ir nuspauskite Atstatyti mygtukÄ….","dic_rename":"Pervadinti","dic_restore":"Atstatyti","dictionariesTab":"Žodynai","disable":"IÅ¡jungti SCAYT","emptyDic":"Žodyno vardas neturÄ—tų bÅ«ti tuÅ¡Äias.","enable":"Ä®jungti SCAYT","ignore":"Ignoruoti","ignoreAll":"Ignoruoti viskÄ…","ignoreDomainNames":"Ignoruoti domenų vardus","langs":"Kalbos","languagesTab":"Kalbos","mixedCase":"Ignoruoti maiÅ¡yto dydžio raides","mixedWithDigits":"Ignoruoti raides su skaiÄiais","moreSuggestions":"Daugiau patarimų","opera_title":"Nepalaikoma narÅ¡yklÄ—je Opera","options":"Parametrai","optionsTab":"Parametrai","title":"Tikrinti klaidas kai raÅ¡oma","toggle":"Perjungti SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stilius","panelTitle":"Stilių formatavimas","panelTitle1":"Blokų stiliai","panelTitle2":"Vidiniai stiliai","panelTitle3":"Objektų stiliai"},"table":{"border":"RÄ—melio dydis","caption":"AntraÅ¡tÄ—","cell":{"menu":"Langelis","insertBefore":"Ä®terpti langelį prieÅ¡","insertAfter":"Ä®terpti langelį po","deleteCell":"Å alinti langelius","merge":"Sujungti langelius","mergeRight":"Sujungti su deÅ¡ine","mergeDown":"Sujungti su apaÄia","splitHorizontal":"Skaidyti langelį horizontaliai","splitVertical":"Skaidyti langelį vertikaliai","title":"Cell nustatymai","cellType":"Cell rūšis","rowSpan":"EiluÄių Span","colSpan":"Stulpelių Span","wordWrap":"Sutraukti raides","hAlign":"Horizontalus lygiavimas","vAlign":"Vertikalus lygiavimas","alignBaseline":"ApatinÄ— linija","bgColor":"Fono spalva","borderColor":"RÄ—melio spalva","data":"Data","header":"AntraÅ¡tÄ—","yes":"Taip","no":"Ne","invalidWidth":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidHeight":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidRowSpan":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidColSpan":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","chooseColor":"Pasirinkite"},"cellPad":"Trapas nuo langelio rÄ—mo iki teksto","cellSpace":"Tarpas tarp langelių","column":{"menu":"Stulpelis","insertBefore":"Ä®terpti stulpelį prieÅ¡","insertAfter":"Ä®terpti stulpelį po","deleteColumn":"Å alinti stulpelius"},"columns":"Stulpeliai","deleteTable":"Å alinti lentelÄ™","headers":"AntraÅ¡tÄ—s","headersBoth":"Abu","headersColumn":"Pirmas stulpelis","headersNone":"NÄ—ra","headersRow":"Pirma eilutÄ—","invalidBorder":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCellPadding":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCellSpacing":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCols":"SkaiÄius turi bÅ«ti didesnis nei 0.","invalidHeight":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidRows":"SkaiÄius turi bÅ«ti didesnis nei 0.","invalidWidth":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","menu":"LentelÄ—s savybÄ—s","row":{"menu":"EilutÄ—","insertBefore":"Ä®terpti eilutÄ™ prieÅ¡","insertAfter":"Ä®terpti eilutÄ™ po","deleteRow":"Å alinti eilutes"},"rows":"EilutÄ—s","summary":"Santrauka","title":"LentelÄ—s savybÄ—s","toolbar":"LentelÄ—","widthPc":"procentais","widthPx":"taÅ¡kais","widthUnit":"ploÄio vienetas"},"undo":{"redo":"Atstatyti","undo":"AtÅ¡aukti"},"wsc":{"btnIgnore":"Ignoruoti","btnIgnoreAll":"Ignoruoti visus","btnReplace":"Pakeisti","btnReplaceAll":"Pakeisti visus","btnUndo":"AtÅ¡aukti","changeTo":"Pakeisti į","errorLoading":"Klaida įkraunant servisÄ…: %s.","ieSpellDownload":"RaÅ¡ybos tikrinimas neinstaliuotas. Ar JÅ«s norite jį dabar atsisiųsti?","manyChanges":"RaÅ¡ybos tikrinimas baigtas: Pakeista %1 žodžių","noChanges":"RaÅ¡ybos tikrinimas baigtas: NÄ—ra pakeistų žodžių","noMispell":"RaÅ¡ybos tikrinimas baigtas: Nerasta raÅ¡ybos klaidų","noSuggestions":"- NÄ—ra pasiÅ«lymų -","notAvailable":"Atleiskite, Å¡iuo metu servisas neprieinamas.","notInDic":"Žodyne nerastas","oneChange":"RaÅ¡ybos tikrinimas baigtas: Vienas žodis pakeistas","progress":"Vyksta raÅ¡ybos tikrinimas...","title":"Tikrinti klaidas","toolbar":"RaÅ¡ybos tikrinimas"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/lv.js b/mod/ckeditor/vendors/ckeditor/lang/lv.js
new file mode 100644
index 000000000..f672f641b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/lv.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lv']={"dir":"ltr","editor":"BagÄtinÄtÄ teksta redaktors","common":{"editorHelp":"PalÄ«dzÄ«bai, nospiediet ALT 0 ","browseServer":"SkatÄ«t servera saturu","url":"URL","protocol":"Protokols","upload":"AugÅ¡upielÄdÄ“t","uploadSubmit":"NosÅ«tÄ«t serverim","image":"AttÄ“ls","flash":"Flash","form":"Forma","checkbox":"AtzÄ«mēšanas kastÄ«te","radio":"IzvÄ“les poga","textField":"Teksta rinda","textarea":"Teksta laukums","hiddenField":"PaslÄ“pta teksta rinda","button":"Poga","select":"IezÄ«mēšanas lauks","imageButton":"AttÄ“lpoga","notSet":"<nav iestatÄ«ts>","id":"Id","name":"Nosaukums","langDir":"Valodas lasīšanas virziens","langDirLtr":"No kreisÄs uz labo (LTR)","langDirRtl":"No labÄs uz kreiso (RTL)","langCode":"Valodas kods","longDescr":"Gara apraksta Hipersaite","cssClass":"Stilu saraksta klases","advisoryTitle":"KonsultatÄ«vs virsraksts","cssStyle":"Stils","ok":"DarÄ«ts!","cancel":"Atcelt","close":"AizvÄ“rt","preview":"PriekÅ¡skatÄ«jums","resize":"MÄ“rogot","generalTab":"VispÄrÄ«gi","advancedTab":"IzvÄ“rstais","validateNumberFailed":"Å Ä« vÄ“rtÄ«ba nav skaitlis","confirmNewPage":"Jebkuras nesaglabÄtÄs izmaiņas tiks zaudÄ“tas. Vai tieÅ¡Äm vÄ“laties atvÄ“rt jaunu lapu?","confirmCancel":"Daži no uzstÄdÄ«jumiem ir mainÄ«ti. Vai tieÅ¡Äm vÄ“laties aizvÄ“rt Å¡o dialogu?","options":"UzstÄdÄ«jumi","target":"MÄ“rÄ·is","targetNew":"Jauns logs (_blank)","targetTop":"VirsÄ“jais logs (_top)","targetSelf":"Tas pats logs (_self)","targetParent":"Avota logs (_parent)","langDirLTR":"Kreisais uz Labo (LTR)","langDirRTL":"Labais uz Kreiso (RTL)","styles":"Stils","cssClasses":"Stilu klases","width":"Platums","height":"Augstums","align":"NolÄ«dzinÄt","alignLeft":"Pa kreisi","alignRight":"Pa labi","alignCenter":"CentrÄ“ti","alignTop":"AugÅ¡Ä","alignMiddle":"VertikÄli centrÄ“ts","alignBottom":"ApakÅ¡Ä","invalidValue":"Nekorekta vÄ“rtÄ«ba","invalidHeight":"Augstumam jÄbÅ«t skaitlim.","invalidWidth":"Platumam jÄbÅ«t skaitlim","invalidCssLength":"Laukam \"%1\" norÄdÄ«tajai vÄ“rtÄ«bai jÄbÅ«t pozitÄ«vam skaitlim ar vai bez korektÄm CSS mÄ“rvienÄ«bÄm (px, %, in, cm, mm, em, ex, pt, vai pc).","invalidHtmlLength":"Laukam \"%1\" norÄdÄ«tajai vÄ“rtÄ«bai jÄbÅ«t pozitÄ«vam skaitlim ar vai bez korektÄm HTML mÄ“rvienÄ«bÄm (px vai %).","invalidInlineStyle":"IekļautajÄ stilÄ norÄdÄ«tajai vÄ“rtÄ«bai jÄsastÄv no viena vai vairÄkiem pÄriem pÄ“c forma'ta \"nosaukums: vÄ“rtÄ«ba\", atdalÄ«tiem ar semikolu.","cssLengthTooltip":"Ievadiet vÄ“rtÄ«bu pikseļos vai skaitli ar derÄ«gu CSS mÄ“rvienÄ«bu (px, %, in, cm, mm, em, ex, pt, vai pc).","unavailable":"%1<span class=\"cke_accessibility\">, nav pieejams</span>"},"about":{"copy":"Kopēšanas tiesÄ«bas &copy; $1. Visas tiesÄ«bas rezervÄ“tas.","dlgTitle":"Par CKEditor","help":"PÄrbaudiet $1 palÄ«dzÄ«bai.","moreInfo":"InformÄcijai par licenzēšanu apmeklÄ“jiet mÅ«su mÄjas lapu:","title":"Par CKEditor","userGuide":"CKEditor LietotÄja pamÄcÄ«ba"},"basicstyles":{"bold":"TrekninÄts","italic":"KursÄ«vs","strike":"PÄrsvÄ«trots","subscript":"ApakÅ¡rakstÄ","superscript":"AugÅ¡rakstÄ","underline":"PasvÄ«trots"},"blockquote":{"toolbar":"Bloka citÄts"},"clipboard":{"copy":"KopÄ“t","copyError":"JÅ«su pÄrlÅ«kprogrammas drošības iestatÄ«jumi nepieļauj redaktoram automÄtiski veikt kopēšanas darbÄ«bu. LÅ«dzu, izmantojiet (Ctrl/Cmd+C), lai veiktu Å¡o darbÄ«bu.","cut":"Izgriezt","cutError":"JÅ«su pÄrlÅ«kprogrammas drošības iestatÄ«jumi nepieļauj redaktoram automÄtiski veikt izgriezÅ¡anas darbÄ«bu. LÅ«dzu, izmantojiet (Ctrl/Cmd+X), lai veiktu Å¡o darbÄ«bu.","paste":"IelÄ«mÄ“t","pasteArea":"IelÄ«mēšanas zona","pasteMsg":"LÅ«dzu, ievietojiet tekstu Å¡ajÄ laukumÄ, izmantojot klaviatÅ«ru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>DarÄ«ts!</STRONG>.","securityMsg":"JÅ«su pÄrlÅ«ka drošības uzstÄdÄ«jumu dēļ, nav iespÄ“jams tieÅ¡i piekļūt jÅ«su starpliktuvei. Jums jÄielÄ«mÄ“ atkÄrtoti Å¡ajÄ logÄ.","title":"Ievietot"},"contextmenu":{"options":"UznirstoÅ¡Äs izvÄ“lnes uzstÄdÄ«jumi"},"toolbar":{"toolbarCollapse":"AizvÄ“rt rÄ«kjoslu","toolbarExpand":"AtvÄ“rt rÄ«kjoslu","toolbarGroups":{"document":"Dokuments","clipboard":"Starpliktuve/Atcelt","editing":"LaboÅ¡ana","forms":"Formas","basicstyles":"Pamata stili","paragraph":"ParagrÄfs","links":"Saites","insert":"Ievietot","styles":"Stili","colors":"KrÄsas","tools":"RÄ«ki"},"toolbars":"Redaktora rÄ«kjoslas"},"elementspath":{"eleLabel":"Elementa ceļš","eleTitle":"%1 elements"},"list":{"bulletedlist":"Pievienot/Noņemt vienkÄrÅ¡u sarakstu","numberedlist":"NumurÄ“ts saraksts"},"indent":{"indent":"PalielinÄt atkÄpi","outdent":"SamazinÄt atkÄpi"},"format":{"label":"FormÄts","panelTitle":"FormÄts","tag_address":"Adrese","tag_div":"Rindkopa (DIV)","tag_h1":"Virsraksts 1","tag_h2":"Virsraksts 2","tag_h3":"Virsraksts 3","tag_h4":"Virsraksts 4","tag_h5":"Virsraksts 5","tag_h6":"Virsraksts 6","tag_p":"NormÄls teksts","tag_pre":"FormatÄ“ts teksts"},"horizontalrule":{"toolbar":"Ievietot horizontÄlu AtdalÄ«tÄjsvÄ«tru"},"image":{"alertUrl":"LÅ«dzu norÄdÄ«t attÄ“la hipersaiti","alt":"AlternatÄ«vais teksts","border":"RÄmis","btnUpload":"NosÅ«tÄ«t serverim","button2Img":"Vai vÄ“laties pÄrveidot izvÄ“lÄ“to attÄ“la pogu uz attÄ“la?","hSpace":"HorizontÄlÄ telpa","img2Button":"Vai vÄ“laties pÄrveidot izvÄ“lÄ“to attÄ“lu uz attÄ“la pogas?","infoTab":"InformÄcija par attÄ“lu","linkTab":"Hipersaite","lockRatio":"NemainÄ«ga Augstuma/Platuma attiecÄ«ba","menu":"AttÄ“la Ä«pašības","resetSize":"Atjaunot sÄkotnÄ“jo izmÄ“ru","title":"AttÄ“la Ä«pašības","titleButton":"AttÄ“lpogas Ä«pašības","upload":"AugÅ¡upielÄdÄ“t","urlMissing":"TrÅ«kst attÄ“la atraÅ¡anÄs adrese.","vSpace":"VertikÄlÄ telpa","validateBorder":"Apmalei jÄbÅ«t veselam skaitlim","validateHSpace":"HSpace jÄbÅ«t veselam skaitlim","validateVSpace":"VSpace jÄbÅ«t veselam skaitlim"},"fakeobjects":{"anchor":"IezÄ«me","flash":"Flash animÄcija","hiddenfield":"SlÄ“pts lauks","iframe":"Iframe","unknown":"NezinÄms objekts"},"link":{"acccessKey":"Pieejas taustiņš","advanced":"IzvÄ“rstais","advisoryContentType":"KonsultatÄ«vs satura tips","advisoryTitle":"KonsultatÄ«vs virsraksts","anchor":{"toolbar":"Ievietot/Labot iezÄ«mi","menu":"Labot iezÄ«mi","title":"IezÄ«mes uzstÄdÄ«jumi","name":"IezÄ«mes nosaukums","errorName":"LÅ«dzu norÄdiet iezÄ«mes nosaukumu","remove":"Noņemt iezÄ«mi"},"anchorId":"PÄ“c elementa ID","anchorName":"PÄ“c iezÄ«mes nosaukuma","charset":"PievienotÄ resursa kodÄ“jums","cssClasses":"Stilu saraksta klases","emailAddress":"E-pasta adrese","emailBody":"Ziņas saturs","emailSubject":"Ziņas tÄ“ma","id":"ID","info":"Hipersaites informÄcija","langCode":"Valodas kods","langDir":"Valodas lasīšanas virziens","langDirLTR":"No kreisÄs uz labo (LTR)","langDirRTL":"No labÄs uz kreiso (RTL)","menu":"Labot hipersaiti","name":"Nosaukums","noAnchors":"(Å ajÄ dokumentÄ nav iezÄ«mju)","noEmail":"LÅ«dzu norÄdi e-pasta adresi","noUrl":"LÅ«dzu norÄdi hipersaiti","other":"<cits>","popupDependent":"AtkarÄ«gs (Netscape)","popupFeatures":"UznirstoÅ¡Ä loga nosaukums Ä«pašības","popupFullScreen":"PilnÄ ekrÄnÄ (IE)","popupLeft":"KreisÄ koordinÄte","popupLocationBar":"AtraÅ¡anÄs vietas josla","popupMenuBar":"IzvÄ“lnes josla","popupResizable":"MÄ“rogojams","popupScrollBars":"Ritjoslas","popupStatusBar":"Statusa josla","popupToolbar":"RÄ«ku josla","popupTop":"AugšējÄ koordinÄte","rel":"RelÄcija","selectAnchor":"IzvÄ“lÄ“ties iezÄ«mi","styles":"Stils","tabIndex":"Ciļņu indekss","target":"MÄ“rÄ·is","targetFrame":"<ietvars>","targetFrameName":"MÄ“rÄ·a ietvara nosaukums","targetPopup":"<uznirstoÅ¡Ä logÄ>","targetPopupName":"UznirstoÅ¡Ä loga nosaukums","title":"Hipersaite","toAnchor":"IezÄ«me Å¡ajÄ lapÄ","toEmail":"E-pasts","toUrl":"Adrese","toolbar":"Ievietot/Labot hipersaiti","type":"Hipersaites tips","unlink":"Noņemt hipersaiti","upload":"AugÅ¡upielÄdÄ“t"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"MaksimizÄ“t","minimize":"MinimizÄ“t"},"pastetext":{"button":"Ievietot kÄ vienkÄrÅ¡u tekstu","title":"Ievietot kÄ vienkÄrÅ¡u tekstu"},"pastefromword":{"confirmCleanup":"Teksts, kuru vÄ“laties ielÄ«mÄ“t, izskatÄs ir nokopÄ“ts no Word. Vai vÄ“laties to iztÄ«rÄ«t pirms ielÄ«mēšanas?","error":"Iekšējas kļūdas dēļ, neizdevÄs iztÄ«rÄ«t ielÄ«mÄ“tos datus.","title":"Ievietot no Worda","toolbar":"Ievietot no Worda"},"removeformat":{"toolbar":"Noņemt stilus"},"sourcearea":{"toolbar":"HTML kods"},"specialchar":{"options":"SpeciÄlo simbolu uzstÄdÄ«jumi","title":"Ievietot Ä«paÅ¡u simbolu","toolbar":"Ievietot speciÄlo simbolu"},"scayt":{"about":"Par SCAYT","aboutTab":"Par","addWord":"Pievienot vÄrdu","allCaps":"IgnorÄ“t vÄrdus ar lielajiem burtiem","dic_create":"Izveidot","dic_delete":"DzÄ“st","dic_field_name":"VÄrdnÄ«cas nosaukums","dic_info":"SÄkumÄ lietotÄja vÄrdnÄ«ca tiek glabÄta Cookie. Diemžēl, Cookie ir ierobežots izmÄ“rs. Kad vÄrdnÄ«ca sasniegs izmÄ“ru, ka to vairs nevar glabÄt Cookie, tÄ tiks noglabÄta uz servera. Lai saglabÄtu personÄ«go vÄrdnÄ«cu uz jÅ«su servera, jums jÄnorÄda tÄs nosaukums. Ja jÅ«s jau esiet noglabÄjuÅ¡i vÄrdnÄ«cu, lÅ«dzu ierakstiet tÄs nosaukum un nospiediet Atjaunot pogu.","dic_rename":"PÄrsaukt","dic_restore":"Atjaunot","dictionariesTab":"VÄrdnÄ«cas","disable":"AtslÄ“gt SCAYT","emptyDic":"VÄrdnÄ«cas nosaukums nevar bÅ«t tukÅ¡s.","enable":"IeslÄ“gt SCAYT","ignore":"IgnorÄ“t","ignoreAll":"IgnorÄ“t visu","ignoreDomainNames":"IgnorÄ“t domÄ“nu nosaukumus","langs":"Valodas","languagesTab":"Valodas","mixedCase":"IgnorÄ“t vÄrdus ar jauktu reÄ£istru burtiem","mixedWithDigits":"IgnorÄ“t vÄrdus ar skaitļiem","moreSuggestions":"VairÄk ieteikumi","opera_title":"Opera neatbalsta","options":"UzstÄdÄ«jumi","optionsTab":"UzstÄdÄ«jumi","title":"PÄrbaudÄ«t gramatiku rakstot","toggle":"PÄrslÄ“gt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stils","panelTitle":"Formatēšanas stili","panelTitle1":"Bloka stili","panelTitle2":"iekļautie stili","panelTitle3":"Objekta stili"},"table":{"border":"RÄmja izmÄ“rs","caption":"LeÄ£enda","cell":{"menu":"Å Å«na","insertBefore":"Pievienot šūnu pirms","insertAfter":"Pievienot šūnu pÄ“c","deleteCell":"DzÄ“st rÅ«tiņas","merge":"Apvienot rÅ«tiņas","mergeRight":"Apvieno pa labi","mergeDown":"Apvienot uz leju","splitHorizontal":"SadalÄ«t šūnu horizontÄli","splitVertical":"SadalÄ«t šūnu vertikÄli","title":"Å Å«nas uzstÄdÄ«jumi","cellType":"Å Å«nas tips","rowSpan":"Apvienotas rindas","colSpan":"Apvienotas kolonas","wordWrap":"VÄrdu pÄrnese","hAlign":"HorizontÄlais novietojums","vAlign":"VertikÄlais novietojums","alignBaseline":"Pamatrinda","bgColor":"Fona krÄsa","borderColor":"RÄmja krÄsa","data":"Dati","header":"Virsraksts","yes":"JÄ","no":"NÄ“","invalidWidth":"Å Å«nas platumam jÄbÅ«t skaitlim","invalidHeight":"Å Å«nas augstumam jÄbÅ«t skaitlim","invalidRowSpan":"Apvienojamo rindu skaitam jÄbÅ«t veselam skaitlim","invalidColSpan":"Apvienojamo kolonu skaitam jÄbÅ«t veselam skaitlim","chooseColor":"IzvÄ“lÄ“ties"},"cellPad":"RÅ«tiņu nobÄ«de","cellSpace":"RÅ«tiņu atstatums","column":{"menu":"Kolonna","insertBefore":"Ievietot kolonu pirms","insertAfter":"Ievieto kolonu pÄ“c","deleteColumn":"DzÄ“st kolonnas"},"columns":"Kolonnas","deleteTable":"DzÄ“st tabulu","headers":"Virsraksti","headersBoth":"Abi","headersColumn":"PirmÄ kolona","headersNone":"Nekas","headersRow":"PirmÄ rinda","invalidBorder":"RÄmju izmÄ“ram jÄbÅ«t skaitlim","invalidCellPadding":"Å Å«nu atkÄpÄ“m jÄbÅ«t pozitÄ«vam skaitlim","invalidCellSpacing":"Å Å«nu atstarpÄ“m jÄbÅ«t pozitÄ«vam skaitlim","invalidCols":"Kolonu skaitam jÄbÅ«t lielÄkam par 0","invalidHeight":"Tabulas augstumam jÄbÅ«t skaitlim","invalidRows":"Rindu skaitam jÄbÅ«t lielÄkam par 0","invalidWidth":"Tabulas platumam jÄbÅ«t skaitlim","menu":"Tabulas Ä«pašības","row":{"menu":"Rinda","insertBefore":"Ievietot rindu pirms","insertAfter":"Ievietot rindu pÄ“c","deleteRow":"DzÄ“st rindas"},"rows":"Rindas","summary":"AnotÄcija","title":"Tabulas Ä«pašības","toolbar":"Tabula","widthPc":"procentuÄli","widthPx":"pikseļos","widthUnit":"platuma mÄ“rvienÄ«ba"},"undo":{"redo":"AtkÄrtot","undo":"Atcelt"},"wsc":{"btnIgnore":"IgnorÄ“t","btnIgnoreAll":"IgnorÄ“t visu","btnReplace":"Aizvietot","btnReplaceAll":"Aizvietot visu","btnUndo":"Atcelt","changeTo":"NomainÄ«t uz","errorLoading":"Kļūda ielÄdÄ“jot aplikÄcijas servisa adresi: %s.","ieSpellDownload":"PareizrakstÄ«bas pÄrbaudÄ«tÄjs nav pievienots. Vai vÄ“laties to lejupielÄdÄ“t tagad?","manyChanges":"PareizrakstÄ«bas pÄrbaude pabeigta: %1 vÄrdi tika mainÄ«ti","noChanges":"PareizrakstÄ«bas pÄrbaude pabeigta: nekas netika labots","noMispell":"PareizrakstÄ«bas pÄrbaude pabeigta: kļūdas netika atrastas","noSuggestions":"- Nav ieteikumu -","notAvailable":"Atvainojiet, bet serviss Å¡obrÄ«d nav pieejams.","notInDic":"Netika atrasts vÄrdnÄ«cÄ","oneChange":"PareizrakstÄ«bas pÄrbaude pabeigta: 1 vÄrds izmainÄ«ts","progress":"Notiek pareizrakstÄ«bas pÄrbaude...","title":"PÄrbaudÄ«t gramatiku","toolbar":"PareizrakstÄ«bas pÄrbaude"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/mk.js b/mod/ckeditor/vendors/ckeditor/lang/mk.js
new file mode 100644
index 000000000..286f14675
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/mk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mk']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"Општо","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/mn.js b/mod/ckeditor/vendors/ckeditor/lang/mn.js
new file mode 100644
index 000000000..4172180a6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/mn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mn']={"dir":"ltr","editor":"Ð¥ÑлбÑрт бичвÑÑ€ боловÑруулагч","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Сервер харуулах","url":"URL","protocol":"Протокол","upload":"Хуулах","uploadSubmit":"Үүнийг ÑервÑррүү илгÑÑ","image":"Зураг","flash":"Флаш","form":"Форм","checkbox":"ЧекбокÑ","radio":"Радио товч","textField":"Техт талбар","textarea":"Техт орчин","hiddenField":"Ðууц талбар","button":"Товч","select":"Сонгогч талбар","imageButton":"Зурагтай товч","notSet":"<Оноохгүй>","id":"Id","name":"ÐÑÑ€","langDir":"Ð¥Ñлний чиглÑл","langDirLtr":"ЗүүнÑÑÑ Ð±Ð°Ñ€ÑƒÑƒÐ½ (LTR)","langDirRtl":"Ð‘Ð°Ñ€ÑƒÑƒÐ½Ð°Ð°Ñ Ð·Ò¯Ò¯Ð½ (RTL)","langCode":"Ð¥Ñлний код","longDescr":"URL-ын тайлбар","cssClass":"Stylesheet клаÑÑууд","advisoryTitle":"Зөвлөлдөх гарчиг","cssStyle":"Загвар","ok":"OK","cancel":"Болих","close":"Хаах","preview":"Уридчлан харах","resize":"Resize","generalTab":"Ерөнхий","advancedTab":"ÐÑмÑлт","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Сонголт","target":"Бай","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Зүүн Ñ‚Ð°Ð»Ð°Ð°Ñ Ð±Ð°Ñ€ÑƒÑƒÐ½ тийшÑÑ (LTR)","langDirRTL":"Баруун Ñ‚Ð°Ð»Ð°Ð°Ñ Ð·Ò¯Ò¯Ð½ тийшÑÑ (RTL)","styles":"Загвар","cssClasses":"Stylesheet клаÑÑууд","width":"Өргөн","height":"Өндөр","align":"ЭгнÑÑ","alignLeft":"Зүүн","alignRight":"Баруун","alignCenter":"Төвд","alignTop":"ДÑÑд талд","alignMiddle":"Дунд талд","alignBottom":"Доод талд","invalidValue":"Invalid value.","invalidHeight":"Өндөр нь тоо байх Ñ‘Ñтой.","invalidWidth":"Өргөн нь тоо байх Ñ‘Ñтой.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Тод бүдүүн","italic":"Ðалуу","strike":"Дундуур нь зурааÑтай болгох","subscript":"Суурь болгох","superscript":"ЗÑÑ€Ñг болгох","underline":"Доогуур нь зурааÑтай болгох"},"blockquote":{"toolbar":"ИшлÑл Ñ…ÑÑÑг"},"clipboard":{"copy":"Хуулах","copyError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдÑлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хоÑлолыг ашиглана уу.","cut":"Хайчлах","cutError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдÑлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хоÑлолыг ашиглана уу.","paste":"Буулгах","pasteArea":"Paste Area","pasteMsg":"(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste Ñ…Ð¸Ð¹Ð½Ñ Ò¯Ò¯. Мөн <strong>OK</strong> дар.","securityMsg":"Таны үзүүлÑгч/browser/-н хамгаалалтын Ñ‚Ð¾Ñ…Ð¸Ñ€Ð³Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð±Ð¾Ð»Ð¾Ð¾Ð´ editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Ð­Ð½Ñ Ñ†Ð¾Ð½Ñ…Ð¾Ð´ дахин paste хийхийг оролд.","title":"Буулгах"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"ХолбооÑууд","insert":"Оруулах","styles":"Загварууд","colors":"Онгөнүүд","tools":"Ð¥ÑÑ€ÑгÑлүүд"},"toolbars":"БолоÑруулагчийн Ñ…ÑÑ€ÑгÑлийн Ñамбар"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"ЦÑгтÑй жагÑаалт","numberedlist":"ДугаарлагдÑан жагÑаалт"},"indent":{"indent":"Догол мөр хаÑах","outdent":"Догол мөр нÑмÑÑ…"},"format":{"label":"Параргафын загвар","panelTitle":"Параргафын загвар","tag_address":"ХаÑг","tag_div":"Paragraph (DIV)","tag_h1":"Гарчиг 1","tag_h2":"Гарчиг 2","tag_h3":"Гарчиг 3","tag_h4":"Гарчиг 4","tag_h5":"Гарчиг 5","tag_h6":"Гарчиг 6","tag_p":"Ð¥Ñвийн","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Хөндлөн Ð·ÑƒÑ€Ð°Ð°Ñ Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ…"},"image":{"alertUrl":"Зурагны URL-ын төрлийн Ñонгоно уу","alt":"Зургийг орлох бичвÑÑ€","border":"ХүрÑÑ","btnUpload":"Үүнийг ÑервÑррүү илгÑÑ","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хөндлөн зай","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Зурагны мÑдÑÑлÑл","linkTab":"ХолбооÑ","lockRatio":"Радио түгжих","menu":"Зураг","resetSize":"Ñ…ÑмжÑÑ Ð´Ð°Ñ…Ð¸Ð½ оноох","title":"Зураг","titleButton":"Зурган товчны шинж чанар","upload":"Хуулах","urlMissing":"Зургийн ÑÑ… Ñурвалжийн хаÑг (URL) байхгүй байна.","vSpace":"БоÑоо зай","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Зангуу","flash":"Flash Animation","hiddenfield":"Ðууц талбар","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Холбох түлхүүр","advanced":"ÐÑмÑлт","advisoryContentType":"Зөвлөлдөх төрлийн агуулга","advisoryTitle":"Зөвлөлдөх гарчиг","anchor":{"toolbar":"Зангуу","menu":"Зангууг болоÑруулах","title":"Зангуугийн шинж чанар","name":"Зангуугийн нÑÑ€","errorName":"Зангуугийн нÑрийг оруулна уу","remove":"Зангууг уÑтгах"},"anchorId":"ЭлемÑнтйн Id нÑÑ€ÑÑÑ€","anchorName":"Зангуугийн нÑÑ€ÑÑÑ€","charset":"ТÑмдÑгт оноох нөөцөд холбогдÑон","cssClasses":"Stylesheet клаÑÑууд","emailAddress":"Э-шуудангийн хаÑг","emailBody":"ЗурваÑны их бие","emailSubject":"ЗурваÑны гарчиг","id":"Id","info":"ХолбооÑын тухай мÑдÑÑлÑл","langCode":"Ð¥Ñлний код","langDir":"Ð¥Ñлний чиглÑл","langDirLTR":"ЗүүнÑÑÑ Ð±Ð°Ñ€ÑƒÑƒÐ½ (LTR)","langDirRTL":"Ð‘Ð°Ñ€ÑƒÑƒÐ½Ð°Ð°Ñ Ð·Ò¯Ò¯Ð½ (RTL)","menu":"Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð·Ð°Ñварлах","name":"ÐÑÑ€","noAnchors":"(Баримт бичиг зангуугүй байна)","noEmail":"Э-шуудангий хаÑгаа ÑˆÐ¸Ð²Ð½Ñ Ò¯Ò¯","noUrl":"ХолбооÑны URL хаÑгийг ÑˆÐ¸Ð²Ð½Ñ Ò¯Ò¯","other":"<other>","popupDependent":"Хамаатай (Netscape)","popupFeatures":"Popup цонхны онцлог","popupFullScreen":"Цонх дүүргÑÑ… (Internet Explorer)","popupLeft":"Зүүн байрлал","popupLocationBar":"Location Ñ…ÑÑÑг","popupMenuBar":"ЦÑÑний Ñамбар","popupResizable":"Resizable","popupScrollBars":"Скрол Ñ…ÑÑÑгүүд","popupStatusBar":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ…ÑÑÑг","popupToolbar":"Багажны Ñамбар","popupTop":"ДÑÑд байрлал","rel":"Relationship","selectAnchor":"ÐÑг зангууг Ñонгоно уу","styles":"Загвар","tabIndex":"Tab индекÑ","target":"Байрлал","targetFrame":"<Ðгуулах хүрÑÑ>","targetFrameName":"Очих фремын нÑÑ€","targetPopup":"<popup цонх>","targetPopupName":"Popup цонхны нÑÑ€","title":"ХолбооÑ","toAnchor":"Ð­Ð½Ñ Ð±Ð¸Ñ‡Ð²ÑÑ€ дÑÑ… зангуу руу очих холбооÑ","toEmail":"Э-захиа","toUrl":"цахим хуудаÑны хаÑг (URL)","toolbar":"ХолбооÑ","type":"Линкийн төрөл","unlink":"Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð°Ð²Ñ‡ хаÑÑ…","upload":"Хуулах"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ДÑлгÑц дүүргÑÑ…","minimize":"Цонхыг багÑгаж харуулах"},"pastetext":{"button":"Энгийн бичвÑÑ€ÑÑÑ€ буулгах","title":"Энгийн бичвÑÑ€ÑÑÑ€ буулгах"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Word-Ð¾Ð¾Ñ Ð±ÑƒÑƒÐ»Ð³Ð°Ñ…","toolbar":"Word-Ð¾Ð¾Ñ Ð±ÑƒÑƒÐ»Ð³Ð°Ñ…"},"removeformat":{"toolbar":"Параргафын загварыг авч хаÑÑ…"},"sourcearea":{"toolbar":"Код"},"specialchar":{"options":"Special Character Options","title":"Онцгой Ñ‚ÑмдÑгт Ñонгох","toolbar":"Онцгой Ñ‚ÑмдÑгт оруулах"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Бий болгох","dic_delete":"УÑтгах","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"ÐÑрийг Ñолих","dic_restore":"Restore","dictionariesTab":"Толь бичгүүд","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Ð¥Ñлүүд","languagesTab":"Ð¥Ñлүүд","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Сонголт","optionsTab":"Сонголт","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Загвар","panelTitle":"Загвар Ñ…ÑлбÑржүүлÑÑ…","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ХүрÑÑний Ñ…ÑмжÑÑ","caption":"Тайлбар","cell":{"menu":"Ðүх/зай","insertBefore":"Ðүх/зай өмнө нь оруулах","insertAfter":"Ðүх/зай дараа нь оруулах","deleteCell":"Ðүх уÑтгах","merge":"Ðүх нÑгтÑÑ…","mergeRight":"Баруун тийш нÑгтгÑÑ…","mergeDown":"Доош нÑгтгÑÑ…","splitHorizontal":"Ðүх/зайг боÑоогоор нь туÑгаарлах","splitVertical":"Ðүх/зайг хөндлөнгөөр нь туÑгаарлах","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Ð¥ÑвтÑÑд Ñ‚ÑгшлÑÑ… арга","vAlign":"БоÑоод Ñ‚ÑгшлÑÑ… арга","alignBaseline":"Baseline","bgColor":"ДÑвÑгÑÑ€ өнгө","borderColor":"ХүрÑÑний өнгө","data":"Data","header":"Header","yes":"Тийм","no":"Үгүй","invalidWidth":"Ðүдний өргөн нь тоо байх Ñ‘Ñтой.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Сонгох"},"cellPad":"Ðүх доторлох(padding)","cellSpace":"Ðүх хоорондын зай (spacing)","column":{"menu":"Багана","insertBefore":"Багана өмнө нь оруулах","insertAfter":"Багана дараа нь оруулах","deleteColumn":"Багана уÑтгах"},"columns":"Багана","deleteTable":"Ð¥Ò¯ÑнÑгт уÑтгах","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Ð¥Ò¯ÑнÑгтийн өргөн нь тоо байх Ñ‘Ñтой.","menu":"Ð¥Ò¯ÑнÑгт","row":{"menu":"Мөр","insertBefore":"Мөр өмнө нь оруулах","insertAfter":"Мөр дараа нь оруулах","deleteRow":"Мөр уÑтгах"},"rows":"Мөр","summary":"Тайлбар","title":"Ð¥Ò¯ÑнÑгт","toolbar":"Ð¥Ò¯ÑнÑгт","widthPc":"хувь","widthPx":"цÑг","widthUnit":"өргөний нÑгж"},"undo":{"redo":"Өмнөх үйлдлÑÑ ÑÑргÑÑÑ…","undo":"Хүчингүй болгох"},"wsc":{"btnIgnore":"Зөвшөөрөх","btnIgnoreAll":"Бүгдийг зөвшөөрөх","btnReplace":"Солих","btnReplaceAll":"Бүгдийг Дарж бичих","btnUndo":"Буцаах","changeTo":"Өөрчлөх","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ДүрÑм шалгагч Ñуугаагүй байна. Татаж авахыг Ñ…Ò¯Ñч байна уу?","manyChanges":"ДүрÑм шалгаад дууÑÑан: %1 үг өөрчлөгдÑөн","noChanges":"ДүрÑм шалгаад дууÑÑан: үг өөрчлөгдөөгүй","noMispell":"ДүрÑм шалгаад дууÑÑан: Ðлдаа олдÑонгүй","noSuggestions":"- Тайлбаргүй -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Толь бичиггүй","oneChange":"ДүрÑм шалгаад дууÑÑан: 1 үг өөрчлөгдÑөн","progress":"ДүрÑм шалгаж байгаа үйл Ñвц...","title":"Spell Check","toolbar":"Үгийн дүрÑÑ… шалгах"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ms.js b/mod/ckeditor/vendors/ckeditor/lang/ms.js
new file mode 100644
index 000000000..174c44d5d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ms.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ms']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Muat Naik","uploadSubmit":"Hantar ke Server","image":"Gambar","flash":"Flash","form":"Borang","checkbox":"Checkbox","radio":"Butang Radio","textField":"Text Field","textarea":"Textarea","hiddenField":"Field Tersembunyi","button":"Butang","select":"Field Pilihan","imageButton":"Butang Bergambar","notSet":"<tidak di set>","id":"Id","name":"Nama","langDir":"Arah Tulisan","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri (RTL)","langCode":"Kod Bahasa","longDescr":"Butiran Panjang URL","cssClass":"Kelas-kelas Stylesheet","advisoryTitle":"Tajuk Makluman","cssStyle":"Stail","ok":"OK","cancel":"Batal","close":"Close","preview":"Prebiu","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Sasaran","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Stail","cssClasses":"Kelas-kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Jajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignTop":"Atas","alignMiddle":"Pertengahan","alignBottom":"Bawah","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Salin","copyError":"Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).","cut":"Potong","cutError":"Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).","paste":"Tampal","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tampal"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Senarai tidak bernombor","numberedlist":"Senarai bernombor"},"indent":{"indent":"Tambahkan Inden","outdent":"Kurangkan Inden"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Alamat","tag_div":"Perenggan (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Telah Diformat"},"horizontalrule":{"toolbar":"Masukkan Garisan Membujur"},"image":{"alertUrl":"Sila taip URL untuk fail gambar","alt":"Text Alternatif","border":"Border","btnUpload":"Hantar ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Ruang Melintang","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Imej","linkTab":"Sambungan","lockRatio":"Tetapkan Nisbah","menu":"Ciri-ciri Imej","resetSize":"Saiz Set Semula","title":"Ciri-ciri Imej","titleButton":"Ciri-ciri Butang Bergambar","upload":"Muat Naik","urlMissing":"Image source URL is missing.","vSpace":"Ruang Menegak","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Kunci Akses","advanced":"Advanced","advisoryContentType":"Jenis Kandungan Makluman","advisoryTitle":"Tajuk Makluman","anchor":{"toolbar":"Masukkan/Sunting Pautan","menu":"Ciri-ciri Pautan","title":"Ciri-ciri Pautan","name":"Nama Pautan","errorName":"Sila taip nama pautan","remove":"Remove Anchor"},"anchorId":"dengan menggunakan ID elemen","anchorName":"dengan menggunakan nama pautan","charset":"Linked Resource Charset","cssClasses":"Kelas-kelas Stylesheet","emailAddress":"Alamat E-Mail","emailBody":"Isi Kandungan Mesej","emailSubject":"Subjek Mesej","id":"Id","info":"Butiran Sambungan","langCode":"Arah Tulisan","langDir":"Arah Tulisan","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Sunting Sambungan","name":"Nama","noAnchors":"(Tiada pautan terdapat dalam dokumen ini)","noEmail":"Sila taip alamat e-mail","noUrl":"Sila taip sambungan URL","other":"<lain>","popupDependent":"Bergantungan (Netscape)","popupFeatures":"Ciri Tetingkap Popup","popupFullScreen":"Skrin Penuh (IE)","popupLeft":"Posisi Kiri","popupLocationBar":"Bar Lokasi","popupMenuBar":"Bar Menu","popupResizable":"Resizable","popupScrollBars":"Bar-bar skrol","popupStatusBar":"Bar Status","popupToolbar":"Toolbar","popupTop":"Posisi Atas","rel":"Relationship","selectAnchor":"Sila pilih pautan","styles":"Stail","tabIndex":"Indeks Tab ","target":"Sasaran","targetFrame":"<bingkai>","targetFrameName":"Nama Bingkai Sasaran","targetPopup":"<tetingkap popup>","targetPopupName":"Nama Tetingkap Popup","title":"Sambungan","toAnchor":"Pautan dalam muka surat ini","toEmail":"E-Mail","toUrl":"URL","toolbar":"Masukkan/Sunting Sambungan","type":"Jenis Sambungan","unlink":"Buang Sambungan","upload":"Muat Naik"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Tampal sebagai text biasa","title":"Tampal sebagai text biasa"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Tampal dari Word","toolbar":"Tampal dari Word"},"removeformat":{"toolbar":"Buang Format"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Special Character Options","title":"Sila pilih huruf istimewa","toolbar":"Masukkan Huruf Istimewa"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stail","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Saiz Border","caption":"Keterangan","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Buangkan Sel-sel","merge":"Cantumkan Sel-sel","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Tambahan Ruang Sel","cellSpace":"Ruangan Antara Sel","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Buangkan Lajur"},"columns":"Jaluran","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Ciri-ciri Jadual","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Buangkan Baris"},"rows":"Barisan","summary":"Summary","title":"Ciri-ciri Jadual","toolbar":"Jadual","widthPc":"peratus","widthPx":"piksel-piksel","widthUnit":"width unit"},"undo":{"redo":"Ulangkan","undo":"Batalkan"},"wsc":{"btnIgnore":"Biar","btnIgnoreAll":"Biarkan semua","btnReplace":"Ganti","btnReplaceAll":"Gantikan Semua","btnUndo":"Batalkan","changeTo":"Tukarkan kepada","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?","manyChanges":"Pemeriksaan ejaan siap: %1 perkataan diubah","noChanges":"Pemeriksaan ejaan siap: Tiada perkataan diubah","noMispell":"Pemeriksaan ejaan siap: Tiada salah ejaan","noSuggestions":"- Tiada cadangan -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Tidak terdapat didalam kamus","oneChange":"Pemeriksaan ejaan siap: Satu perkataan telah diubah","progress":"Pemeriksaan ejaan sedang diproses...","title":"Spell Check","toolbar":"Semak Ejaan"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/nb.js b/mod/ckeditor/vendors/ckeditor/lang/nb.js
new file mode 100644
index 000000000..21dbf7d9a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/nb.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nb']={"dir":"ltr","editor":"Rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Sitatblokk"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/nl.js b/mod/ckeditor/vendors/ckeditor/lang/nl.js
new file mode 100644
index 000000000..7eaa8ad88
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/nl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nl']={"dir":"ltr","editor":"Tekstverwerker","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Aanvinkvakje","radio":"Selectievakje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"<niet ingevuld>","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, niet beschikbaar</span>"},"about":{"copy":"Copyright &copy; $1. Alle rechten voorbehouden.","dlgTitle":"Over CKEditor","help":"Bekijk de $1 voor hulp.","moreInfo":"Voor licentie informatie, bezoek onze website:","title":"Over CKEditor","userGuide":"CKEditor gebruiksaanwijzing"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstreept"},"blockquote":{"toolbar":"Citaatblok"},"clipboard":{"copy":"Kopiëren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"contextmenu":{"options":"Contextmenu opties"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"elementspath":{"eleLabel":"Elementenpad","eleTitle":"%1 element"},"list":{"bulletedlist":"Opsomming","numberedlist":"Genummerde lijst"},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"horizontalrule":{"toolbar":"Horizontale lijn invoegen"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"<ander>","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"<frame>","targetFrameName":"Naam doelframe","targetPopup":"<popupvenster>","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximaliseren","minimize":"Minimaliseren"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"pastefromword":{"confirmCleanup":"De tekst die u plakte lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?","error":"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout","title":"Plakken als Word-gegevens","toolbar":"Plakken als Word-gegevens"},"removeformat":{"toolbar":"Opmaak verwijderen"},"sourcearea":{"toolbar":"Code"},"specialchar":{"options":"Speciale tekens opties","title":"Selecteer speciaal teken","toolbar":"Speciaal teken invoegen"},"scayt":{"about":"Over SCAYT","aboutTab":"Over","addWord":"Woord toevoegen","allCaps":"Negeer woorden helemaal in hoofdletters","dic_create":"Aanmaken","dic_delete":"Verwijderen","dic_field_name":"Naam woordenboek","dic_info":"Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.","dic_rename":"Hernoemen","dic_restore":"Terugzetten","dictionariesTab":"Woordenboeken","disable":"SCAYT uitschakelen","emptyDic":"De naam van het woordenboek mag niet leeg zijn.","enable":"SCAYT inschakelen","ignore":"Negeren","ignoreAll":"Alles negeren","ignoreDomainNames":"Negeer domeinnamen","langs":"Talen","languagesTab":"Talen","mixedCase":"Negeer woorden met hoofd- en kleine letters","mixedWithDigits":"Negeer woorden met cijfers","moreSuggestions":"Meer suggesties","opera_title":"Niet ondersteund door Opera","options":"Opties","optionsTab":"Opties","title":"Controleer de spelling tijdens het typen","toggle":"SCAYT in/uitschakelen","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stijl","panelTitle":"Opmaakstijlen","panelTitle1":"Blok stijlen","panelTitle2":"Inline stijlen","panelTitle3":"Object stijlen"},"table":{"border":"Breedte rand","caption":"Naam","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in achter","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cellen horizontaal","splitVertical":"Splits cellen verticaal","title":"Cel eigenschappen","cellType":"Cel type","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Basislijn","bgColor":"Achtergrondkleur","borderColor":"Kleur rand","data":"Inhoud","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Ruimte in de cel","cellSpace":"Afstand tussen cellen","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in achter","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De rand breedte moet een getal zijn.","invalidCellPadding":"Ruimte in de cel moet een getal zijn.","invalidCellSpacing":"Afstand tussen cellen moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Eigenschappen tabel","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in achter","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Eigenschappen tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"wsc":{"btnIgnore":"Negeren","btnIgnoreAll":"Alles negeren","btnReplace":"Vervangen","btnReplaceAll":"Alles vervangen","btnUndo":"Ongedaan maken","changeTo":"Wijzig in","errorLoading":"Er is een fout opgetreden bij het laden van de dienst: %s.","ieSpellDownload":"De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?","manyChanges":"Klaar met spellingscontrole: %1 woorden aangepast","noChanges":"Klaar met spellingscontrole: geen woorden aangepast","noMispell":"Klaar met spellingscontrole: geen fouten gevonden","noSuggestions":"- Geen suggesties -","notAvailable":"Excuses, deze dienst is momenteel niet beschikbaar.","notInDic":"Niet in het woordenboek","oneChange":"Klaar met spellingscontrole: één woord aangepast","progress":"Bezig met spellingscontrole...","title":"Spellingscontrole","toolbar":"Spellingscontrole"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/no.js b/mod/ckeditor/vendors/ckeditor/lang/no.js
new file mode 100644
index 000000000..4d7999cdb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/no.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['no']={"dir":"ltr","editor":"Rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Sitatblokk"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/pl.js b/mod/ckeditor/vendors/ckeditor/lang/pl.js
new file mode 100644
index 000000000..0f0477703
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/pl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pl']={"dir":"ltr","editor":"Edytor tekstu sformatowanego","common":{"editorHelp":"W celu uzyskania pomocy naciśnij ALT 0","browseServer":"Przeglądaj","url":"Adres URL","protocol":"Protokół","upload":"Wyślij","uploadSubmit":"Wyślij","image":"Obrazek","flash":"Flash","form":"Formularz","checkbox":"Pole wyboru (checkbox)","radio":"Przycisk opcji (radio)","textField":"Pole tekstowe","textarea":"Obszar tekstowy","hiddenField":"Pole ukryte","button":"Przycisk","select":"Lista wyboru","imageButton":"Przycisk graficzny","notSet":"<nie ustawiono>","id":"Id","name":"Nazwa","langDir":"Kierunek tekstu","langDirLtr":"Od lewej do prawej (LTR)","langDirRtl":"Od prawej do lewej (RTL)","langCode":"Kod języka","longDescr":"Adres URL długiego opisu","cssClass":"Nazwa klasy CSS","advisoryTitle":"Opis obiektu docelowego","cssStyle":"Styl","ok":"OK","cancel":"Anuluj","close":"Zamknij","preview":"Podgląd","resize":"Przeciągnij, aby zmienić rozmiar","generalTab":"Ogólne","advancedTab":"Zaawansowane","validateNumberFailed":"Ta wartość nie jest liczbą.","confirmNewPage":"Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?","confirmCancel":"Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?","options":"Opcje","target":"Obiekt docelowy","targetNew":"Nowe okno (_blank)","targetTop":"Okno najwyżej w hierarchii (_top)","targetSelf":"To samo okno (_self)","targetParent":"Okno nadrzędne (_parent)","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","styles":"Style","cssClasses":"Klasy arkusza stylów","width":"Szerokość","height":"Wysokość","align":"Wyrównaj","alignLeft":"Do lewej","alignRight":"Do prawej","alignCenter":"Do środka","alignTop":"Do góry","alignMiddle":"Do środka","alignBottom":"Do dołu","invalidValue":"Nieprawidłowa wartość.","invalidHeight":"Wysokość musi być liczbą.","invalidWidth":"Szerokość musi być liczbą.","invalidCssLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","invalidHtmlLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).","invalidInlineStyle":"Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie \"nazwa : wartość\", rozdzielonych średnikami.","cssLengthTooltip":"Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","unavailable":"%1<span class=\"cke_accessibility\">, niedostępne</span>"},"about":{"copy":"Copyright &copy; $1. Wszelkie prawa zastrzeżone.","dlgTitle":"Informacje o programie CKEditor","help":"Pomoc znajdziesz w $1.","moreInfo":"Informacje na temat licencji można znaleźć na naszej stronie:","title":"Informacje o programie CKEditor","userGuide":"podręczniku użytkownika programu CKEditor"},"basicstyles":{"bold":"Pogrubienie","italic":"Kursywa","strike":"Przekreślenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"Podkreślenie"},"blockquote":{"toolbar":"Cytat"},"clipboard":{"copy":"Kopiuj","copyError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.","cut":"Wytnij","cutError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.","paste":"Wklej","pasteArea":"Obszar wklejania","pasteMsg":"Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.","securityMsg":"Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.","title":"Wklej"},"contextmenu":{"options":"Opcje menu kontekstowego"},"toolbar":{"toolbarCollapse":"Zwiń pasek narzędzi","toolbarExpand":"Rozwiń pasek narzędzi","toolbarGroups":{"document":"Dokument","clipboard":"Schowek/Wstecz","editing":"Edycja","forms":"Formularze","basicstyles":"Style podstawowe","paragraph":"Akapit","links":"Hiperłącza","insert":"Wstawianie","styles":"Style","colors":"Kolory","tools":"Narzędzia"},"toolbars":"Paski narzędzi edytora"},"elementspath":{"eleLabel":"Ścieżka elementów","eleTitle":"element %1"},"list":{"bulletedlist":"Lista wypunktowana","numberedlist":"Lista numerowana"},"indent":{"indent":"Zwiększ wcięcie","outdent":"Zmniejsz wcięcie"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adres","tag_div":"Normalny (DIV)","tag_h1":"Nagłówek 1","tag_h2":"Nagłówek 2","tag_h3":"Nagłówek 3","tag_h4":"Nagłówek 4","tag_h5":"Nagłówek 5","tag_h6":"Nagłówek 6","tag_p":"Normalny","tag_pre":"Tekst sformatowany"},"horizontalrule":{"toolbar":"Wstaw poziomą linię"},"image":{"alertUrl":"Podaj adres obrazka.","alt":"Tekst zastępczy","border":"Obramowanie","btnUpload":"Wyślij","button2Img":"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?","hSpace":"Odstęp poziomy","img2Button":"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?","infoTab":"Informacje o obrazku","linkTab":"Hiperłącze","lockRatio":"Zablokuj proporcje","menu":"Właściwości obrazka","resetSize":"Przywróć rozmiar","title":"Właściwości obrazka","titleButton":"Właściwości przycisku graficznego","upload":"Wyślij","urlMissing":"Podaj adres URL obrazka.","vSpace":"Odstęp pionowy","validateBorder":"Wartość obramowania musi być liczbą całkowitą.","validateHSpace":"Wartość odstępu poziomego musi być liczbą całkowitą.","validateVSpace":"Wartość odstępu pionowego musi być liczbą całkowitą."},"fakeobjects":{"anchor":"Kotwica","flash":"Animacja Flash","hiddenfield":"Pole ukryte","iframe":"IFrame","unknown":"Nieznany obiekt"},"link":{"acccessKey":"Klawisz dostępu","advanced":"Zaawansowane","advisoryContentType":"Typ MIME obiektu docelowego","advisoryTitle":"Opis obiektu docelowego","anchor":{"toolbar":"Wstaw/edytuj kotwicę","menu":"Właściwości kotwicy","title":"Właściwości kotwicy","name":"Nazwa kotwicy","errorName":"Wpisz nazwę kotwicy","remove":"Usuń kotwicę"},"anchorId":"Wg identyfikatora","anchorName":"Wg nazwy","charset":"Kodowanie znaków obiektu docelowego","cssClasses":"Nazwa klasy CSS","emailAddress":"Adres e-mail","emailBody":"Treść","emailSubject":"Temat","id":"Id","info":"Informacje ","langCode":"Kod języka","langDir":"Kierunek tekstu","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","menu":"Edytuj odnośnik","name":"Nazwa","noAnchors":"(W dokumencie nie zdefiniowano żadnych kotwic)","noEmail":"Podaj adres e-mail","noUrl":"Podaj adres URL","other":"<inny>","popupDependent":"Okno zależne (Netscape)","popupFeatures":"Właściwości wyskakującego okna","popupFullScreen":"Pełny ekran (IE)","popupLeft":"Pozycja w poziomie","popupLocationBar":"Pasek adresu","popupMenuBar":"Pasek menu","popupResizable":"Skalowalny","popupScrollBars":"Paski przewijania","popupStatusBar":"Pasek statusu","popupToolbar":"Pasek narzędzi","popupTop":"Pozycja w pionie","rel":"Relacja","selectAnchor":"Wybierz kotwicę","styles":"Styl","tabIndex":"Indeks kolejności","target":"Obiekt docelowy","targetFrame":"<ramka>","targetFrameName":"Nazwa ramki docelowej","targetPopup":"<wyskakujące okno>","targetPopupName":"Nazwa wyskakującego okna","title":"Odnośnik","toAnchor":"Odnośnik wewnątrz strony (kotwica)","toEmail":"Adres e-mail","toUrl":"Adres URL","toolbar":"Wstaw/edytuj odnośnik","type":"Typ odnośnika","unlink":"Usuń odnośnik","upload":"Wyślij"},"magicline":{"title":"Wstaw nowy paragraf"},"maximize":{"maximize":"Maksymalizuj","minimize":"Minimalizuj"},"pastetext":{"button":"Wklej jako czysty tekst","title":"Wklej jako czysty tekst"},"pastefromword":{"confirmCleanup":"Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?","error":"Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.","title":"Wklej z programu MS Word","toolbar":"Wklej z programu MS Word"},"removeformat":{"toolbar":"Usuń formatowanie"},"sourcearea":{"toolbar":"Źródło dokumentu"},"specialchar":{"options":"Opcje znaków specjalnych","title":"Wybierz znak specjalny","toolbar":"Wstaw znak specjalny"},"scayt":{"about":"Informacje o SCAYT","aboutTab":"Informacje o SCAYT","addWord":"Dodaj słowo","allCaps":"Ignoruj wyrazy pisane dużymi literami","dic_create":"Utwórz","dic_delete":"Usuń","dic_field_name":"Nazwa słownika","dic_info":"Początkowo słownik użytkownika przechowywany jest w cookie. Pliki cookie mają jednak ograniczoną pojemność. Jeśli słownik użytkownika przekroczy wielkość dopuszczalną dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania słownika na serwerze niezbędne jest nadanie mu nazwy. Jeśli słownik został już zapisany na serwerze, wystarczy podać jego nazwę i nacisnąć przycisk Przywróć.","dic_rename":"Zmień nazwę","dic_restore":"Przywróć","dictionariesTab":"Słowniki","disable":"Wyłącz SCAYT","emptyDic":"Nazwa słownika nie może być pusta.","enable":"Włącz SCAYT","ignore":"Ignoruj","ignoreAll":"Ignoruj wszystkie","ignoreDomainNames":"Ignoruj nazwy domen","langs":"Języki","languagesTab":"Języki","mixedCase":"Ignoruj wyrazy pisane dużymi i małymi literami","mixedWithDigits":"Ignoruj wyrazy zawierające cyfry","moreSuggestions":"Więcej sugestii","opera_title":"Funkcja nie jest obsługiwana przez przeglądarkę Opera","options":"Opcje","optionsTab":"Opcje","title":"Sprawdź pisownię podczas pisania (SCAYT)","toggle":"Przełącz SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Style formatujące","panelTitle1":"Style blokowe","panelTitle2":"Style liniowe","panelTitle3":"Style obiektowe"},"table":{"border":"Grubość obramowania","caption":"Tytuł","cell":{"menu":"Komórka","insertBefore":"Wstaw komórkę z lewej","insertAfter":"Wstaw komórkę z prawej","deleteCell":"Usuń komórki","merge":"Połącz komórki","mergeRight":"Połącz z komórką z prawej","mergeDown":"Połącz z komórką poniżej","splitHorizontal":"Podziel komórkę poziomo","splitVertical":"Podziel komórkę pionowo","title":"Właściwości komórki","cellType":"Typ komórki","rowSpan":"Scalenie wierszy","colSpan":"Scalenie komórek","wordWrap":"Zawijanie słów","hAlign":"Wyrównanie poziome","vAlign":"Wyrównanie pionowe","alignBaseline":"Linia bazowa","bgColor":"Kolor tła","borderColor":"Kolor obramowania","data":"Dane","header":"Nagłówek","yes":"Tak","no":"Nie","invalidWidth":"Szerokość komórki musi być liczbą.","invalidHeight":"Wysokość komórki musi być liczbą.","invalidRowSpan":"Scalenie wierszy musi być liczbą całkowitą.","invalidColSpan":"Scalenie komórek musi być liczbą całkowitą.","chooseColor":"Wybierz"},"cellPad":"Dopełnienie komórek","cellSpace":"Odstęp pomiędzy komórkami","column":{"menu":"Kolumna","insertBefore":"Wstaw kolumnę z lewej","insertAfter":"Wstaw kolumnę z prawej","deleteColumn":"Usuń kolumny"},"columns":"Liczba kolumn","deleteTable":"Usuń tabelę","headers":"Nagłówki","headersBoth":"Oba","headersColumn":"Pierwsza kolumna","headersNone":"Brak","headersRow":"Pierwszy wiersz","invalidBorder":"Wartość obramowania musi być liczbą.","invalidCellPadding":"Dopełnienie komórek musi być liczbą dodatnią.","invalidCellSpacing":"Odstęp pomiędzy komórkami musi być liczbą dodatnią.","invalidCols":"Liczba kolumn musi być większa niż 0.","invalidHeight":"Wysokość tabeli musi być liczbą.","invalidRows":"Liczba wierszy musi być większa niż 0.","invalidWidth":"Szerokość tabeli musi być liczbą.","menu":"Właściwości tabeli","row":{"menu":"Wiersz","insertBefore":"Wstaw wiersz powyżej","insertAfter":"Wstaw wiersz poniżej","deleteRow":"Usuń wiersze"},"rows":"Liczba wierszy","summary":"Podsumowanie","title":"Właściwości tabeli","toolbar":"Tabela","widthPc":"%","widthPx":"piksele","widthUnit":"jednostka szerokości"},"undo":{"redo":"Ponów","undo":"Cofnij"},"wsc":{"btnIgnore":"Ignoruj","btnIgnoreAll":"Ignoruj wszystkie","btnReplace":"Zmień","btnReplaceAll":"Zmień wszystkie","btnUndo":"Cofnij","changeTo":"Zmień na","errorLoading":"Błąd wczytywania hosta aplikacji usługi: %s.","ieSpellDownload":"Słownik nie jest zainstalowany. Czy chcesz go pobrać?","manyChanges":"Sprawdzanie zakończone: zmieniono %l słów","noChanges":"Sprawdzanie zakończone: nie zmieniono żadnego słowa","noMispell":"Sprawdzanie zakończone: nie znaleziono błędów","noSuggestions":"- Brak sugestii -","notAvailable":"Przepraszamy, ale usługa jest obecnie niedostępna.","notInDic":"Słowa nie ma w słowniku","oneChange":"Sprawdzanie zakończone: zmieniono jedno słowo","progress":"Trwa sprawdzanie...","title":"Sprawdź pisownię","toolbar":"Sprawdź pisownię"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/pt-br.js b/mod/ckeditor/vendors/ckeditor/lang/pt-br.js
new file mode 100644
index 000000000..983be967e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/pt-br.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt-br']={"dir":"ltr","editor":"Editor de Texto","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Caixa de Texto","textarea":"Ãrea de Texto","hiddenField":"Campo Oculto","button":"Botão","select":"Caixa de Listagem","imageButton":"Botão de Imagem","notSet":"<não ajustado>","id":"Id","name":"Nome","langDir":"Direção do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"Descrição da URL","cssClass":"Classe de CSS","advisoryTitle":"Título","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um número.","confirmNewPage":"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","invalidValue":"Valor inválido.","invalidHeight":"A altura tem que ser um número","invalidWidth":"A largura tem que ser um número.","invalidCssLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px or %).","invalidInlineStyle":"O valor válido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"about":{"copy":"Copyright &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Verifique o $1 para obter ajuda.","moreInfo":"Para informações sobre a licença por favor visite o nosso site:","title":"Sobre o CKEditor","userGuide":"Guia do Usuário do CKEditor"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"blockquote":{"toolbar":"Citação"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Ãrea para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.","securityMsg":"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.","title":"Colar"},"contextmenu":{"options":"Opções Menu de Contexto"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"Edição","forms":"Formulários","basicstyles":"Estilos Básicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"elementspath":{"eleLabel":"Caminho dos Elementos","eleTitle":"Elemento %1"},"list":{"bulletedlist":"Lista sem números","numberedlist":"Lista numerada"},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"format":{"label":"Formatação","panelTitle":"Formatação","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botão de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar Botão de Imagem","upload":"Enviar","urlMissing":"URL da imagem está faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um número inteiro.","validateHSpace":"O HSpace deve ser um número inteiro.","validateVSpace":"O VSpace deve ser um número inteiro."},"fakeobjects":{"anchor":"Âncora","flash":"Animação em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Âncora","menu":"Formatar Âncora","title":"Formatar Âncora","name":"Nome da Âncora","errorName":"Por favor, digite o nome da âncora","remove":"Remover Âncora"},"anchorId":"Id da âncora","anchorName":"Nome da âncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"Direção do idioma","langDir":"Direção do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(Não há âncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"Redimensionável","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de Relação","selectAnchor":"Selecione uma âncora","styles":"Estilos","tabIndex":"Ãndice de Tabulação","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Frame de Destino","targetPopup":"<janela popup>","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Âncora nesta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximizar","minimize":"Minimize"},"pastetext":{"button":"Colar como Texto sem Formatação","title":"Colar como Texto sem Formatação"},"pastefromword":{"confirmCleanup":"O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?","error":"Não foi possível limpar os dados colados devido a um erro interno","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Remover Formatação"},"sourcearea":{"toolbar":"Código-Fonte"},"specialchar":{"options":"Opções de Caractere Especial","title":"Selecione um Caractere Especial","toolbar":"Inserir Caractere Especial"},"scayt":{"about":"Sobre a correção ortográfica durante a digitação","aboutTab":"Sobre","addWord":"Adicionar palavra","allCaps":"Ignorar palavras maiúsculas","dic_create":"Criar","dic_delete":"Excluir","dic_field_name":"Nome do Dicionário","dic_info":"Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.","dic_rename":"Renomear","dic_restore":"Restaurar","dictionariesTab":"Dicionários","disable":"Desabilitar correção ortográfica durante a digitação","emptyDic":"O nome do dicionário não deveria estar vazio.","enable":"Habilitar correção ortográfica durante a digitação","ignore":"Ignorar","ignoreAll":"Ignorar todas","ignoreDomainNames":"Ignorar nomes de domínio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palavras com maiúsculas e minúsculas misturadas","mixedWithDigits":"Ignorar palavras com números","moreSuggestions":"Mais sugestões","opera_title":"Não suportado no Opera","options":"Opções","optionsTab":"Opções","title":"Correção ortográfica durante a digitação","toggle":"Ativar/desativar correção ortográfica durante a digitação","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de texto corrido","panelTitle3":"Estilos de objeto"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"Célula","insertBefore":"Inserir célula a esquerda","insertAfter":"Inserir célula a direita","deleteCell":"Remover Células","merge":"Mesclar Células","mergeRight":"Mesclar com célula a direita","mergeDown":"Mesclar com célula abaixo","splitHorizontal":"Dividir célula horizontalmente","splitVertical":"Dividir célula verticalmente","title":"Propriedades da célula","cellType":"Tipo de célula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula tem que ser um número.","invalidHeight":"A altura da célula tem que ser um número.","invalidRowSpan":"Linhas cobertas tem que ser um número inteiro.","invalidColSpan":"Colunas cobertas tem que ser um número inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um número.","invalidCellPadding":"A margem interna das células tem que ser um número.","invalidCellSpacing":"O espaçamento das células tem que ser um número.","invalidCols":"O número de colunas tem que ser um número maior que 0.","invalidHeight":"A altura da tabela tem que ser um número.","invalidRows":"O número de linhas tem que ser um número maior que 0.","invalidWidth":"A largura da tabela tem que ser um número.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"undo":{"redo":"Refazer","undo":"Desfazer"},"wsc":{"btnIgnore":"Ignorar uma vez","btnIgnoreAll":"Ignorar Todas","btnReplace":"Alterar","btnReplaceAll":"Alterar Todas","btnUndo":"Desfazer","changeTo":"Alterar para","errorLoading":"Erro carregando servidor de aplicação: %s.","ieSpellDownload":"A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?","manyChanges":"Verificação ortográfica encerrada: %1 palavras foram alteradas","noChanges":"Verificação ortográfica encerrada: Não houve alterações","noMispell":"Verificação encerrada: Não foram encontrados erros de ortografia","noSuggestions":"-sem sugestões de ortografia-","notAvailable":"Desculpe, o serviço não está disponível no momento.","notInDic":"Não encontrada","oneChange":"Verificação ortográfica encerrada: Uma palavra foi alterada","progress":"Verificação ortográfica em andamento...","title":"Corretor Ortográfico","toolbar":"Verificar Ortografia"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/pt.js b/mod/ckeditor/vendors/ckeditor/lang/pt.js
new file mode 100644
index 000000000..5d9ff9f38
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/pt.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt']={"dir":"ltr","editor":"Editor de texto enriquecido","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Navegar no Servidor","url":"URL","protocol":"Protocolo","upload":"Carregar","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Verificação","radio":"Botão de Opção","textField":"Campo de Texto","textarea":"Ãrea de Texto","hiddenField":"Campo Escondido","button":"Botão","select":"Caixa de Combinação","imageButton":"Botão de Imagem","notSet":"<Não definido>","id":"Id","name":"Nome","langDir":"Orientação de idioma","langDirLtr":"Esquerda à Direita (LTR)","langDirRtl":"Direita a Esquerda (RTL)","langCode":"Código de Idioma","longDescr":"Descrição Completa do URL","cssClass":"Classes de Estilo de Folhas Classes","advisoryTitle":"Título","cssStyle":"Estilo","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Pré-visualização","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Opções","target":"Alvo","targetNew":"Nova Janela (_blank)","targetTop":"Janela superior (_top)","targetSelf":"Mesma janela (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Esquerda à Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes de Estilo de Folhas Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centrado","alignTop":"Topo","alignMiddle":"Centro","alignBottom":"Fundo","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Rasurado","subscript":"Superior à Linha","superscript":"Inferior à Linha","underline":"Sublinhado"},"blockquote":{"toolbar":"Bloco de citação"},"clipboard":{"copy":"Copiar","copyError":"A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Paste Area","pasteMsg":"Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Colar"},"contextmenu":{"options":"Menu de opções de contexto"},"toolbar":{"toolbarCollapse":"Colapsar Barra","toolbarExpand":"Expandir Barra","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barras de ferramentas"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Marcas","numberedlist":"Numeração"},"indent":{"indent":"Aumentar Avanço","outdent":"Diminuir Avanço"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor introduza o URL da imagem","alt":"Texto Alternativo","border":"Limite","btnUpload":"Enviar para o Servidor","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Esp.Horiz","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Informação da Imagem","linkTab":"Hiperligação","lockRatio":"Proporcional","menu":"Propriedades da Imagem","resetSize":"Tamanho Original","title":"Propriedades da Imagem","titleButton":"Propriedades do Botão de imagens","upload":"Carregar","urlMissing":"Image source URL is missing.","vSpace":"Esp.Vert","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":" Inserir/Editar Âncora","flash":"Flash Animation","hiddenfield":"Campo Escondido","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":" Inserir/Editar Âncora","menu":"Propriedades da Âncora","title":"Propriedades da Âncora","name":"Nome da Âncora","errorName":"Por favor, introduza o nome da âncora","remove":"Remove Anchor"},"anchorId":"Por ID de elemento","anchorName":"Por Nome de Referência","charset":"Fonte de caracteres vinculado","cssClasses":"Classes de Estilo de Folhas Classes","emailAddress":"Endereço de E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Título de Mensagem","id":"ID","info":"Informação de Hiperligação","langCode":"Orientação de idioma","langDir":"Orientação de idioma","langDirLTR":"Esquerda à Direita (LTR)","langDirRTL":"Direita a Esquerda (RTL)","menu":"Editar Hiperligação","name":"Nome","noAnchors":"(Não há referências disponíveis no documento)","noEmail":"Por favor introduza o endereço de e-mail","noUrl":"Por favor introduza a hiperligação URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características de Janela de Popup","popupFullScreen":"Janela Completa (IE)","popupLeft":"Posição Esquerda","popupLocationBar":"Barra de localização","popupMenuBar":"Barra de Menu","popupResizable":"Redimensionável","popupScrollBars":"Barras de deslocamento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Ferramentas","popupTop":"Posição Direita","rel":"Relação","selectAnchor":"Seleccionar una referência","styles":"Estilo","tabIndex":"Ãndice de Tubulação","target":"Destino","targetFrame":"<Frame>","targetFrameName":"Nome do Frame Destino","targetPopup":"<Janela de popup>","targetPopupName":"Nome da Janela de Popup","title":"Hiperligação","toAnchor":"Referência a esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Hiperligação","type":"Tipo de Hiperligação","unlink":"Eliminar Hiperligação","upload":"Carregar"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Colar como Texto Simples","title":"Colar como Texto Simples"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fonte"},"specialchar":{"options":"Special Character Options","title":"Seleccione um caracter especial","toolbar":"Inserir Caracter Especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Tamanho do Limite","caption":"Título","cell":{"menu":"Célula","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Eliminar Célula","merge":"Unir Células","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Esp. interior","cellSpace":"Esp. e/células","column":{"menu":"Coluna","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Eliminar Coluna"},"columns":"Colunas","deleteTable":"Eliminar Tabela","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"Nenhum","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Propriedades da Tabela","row":{"menu":"Linha","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Eliminar Linhas"},"rows":"Linhas","summary":"Sumário","title":"Propriedades da Tabela","toolbar":"Tabela","widthPc":"percentagem","widthPx":"pixeis","widthUnit":"width unit"},"undo":{"redo":"Repetir","undo":"Anular"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Tudo","btnReplace":"Substituir","btnReplaceAll":"Substituir Tudo","btnUndo":"Anular","changeTo":"Mudar para","errorLoading":"Error loading application service host: %s.","ieSpellDownload":" Verificação ortográfica não instalada. Quer descarregar agora?","manyChanges":"Verificação ortográfica completa: %1 palavras alteradas","noChanges":"Verificação ortográfica completa: não houve alteração de palavras","noMispell":"Verificação ortográfica completa: não foram encontrados erros","noSuggestions":"- Sem sugestões -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Não está num directório","oneChange":"Verificação ortográfica completa: uma palavra alterada","progress":"Verificação ortográfica em progresso…","title":"Spell Check","toolbar":"Verificação Ortográfica"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ro.js b/mod/ckeditor/vendors/ckeditor/lang/ro.js
new file mode 100644
index 000000000..57597bd2d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ro.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ro']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Apasă ALT 0 pentru ajutor","browseServer":"Răsfoieşte server","url":"URL","protocol":"Protocol","upload":"Încarcă","uploadSubmit":"Trimite la server","image":"Imagine","flash":"Flash","form":"Formular (Form)","checkbox":"Bifă (Checkbox)","radio":"Buton radio (RadioButton)","textField":"Câmp text (TextField)","textarea":"Suprafaţă text (Textarea)","hiddenField":"Câmp ascuns (HiddenField)","button":"Buton","select":"Câmp selecţie (SelectionField)","imageButton":"Buton imagine (ImageButton)","notSet":"<nesetat>","id":"Id","name":"Nume","langDir":"Direcţia cuvintelor","langDirLtr":"stânga-dreapta (LTR)","langDirRtl":"dreapta-stânga (RTL)","langCode":"Codul limbii","longDescr":"Descrierea lungă URL","cssClass":"Clasele cu stilul paginii (CSS)","advisoryTitle":"Titlul consultativ","cssStyle":"Stil","ok":"OK","cancel":"Anulare","close":"Închide","preview":"Previzualizare","resize":"Trage pentru a redimensiona","generalTab":"General","advancedTab":"Avansat","validateNumberFailed":"Această valoare nu este un număr.","confirmNewPage":"Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?","confirmCancel":"Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?","options":"Opțiuni","target":"Țintă","targetNew":"Fereastră nouă (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"În aceeași fereastră (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Stânga spre Dreapta (LTR)","langDirRTL":"Dreapta spre Stânga (RTL)","styles":"Stil","cssClasses":"Stylesheet Classes","width":"Lăţime","height":"Înălţime","align":"Aliniere","alignLeft":"Mărește Bara","alignRight":"Dreapta","alignCenter":"Centru","alignTop":"Sus","alignMiddle":"Mijloc","alignBottom":"Jos","invalidValue":"Invalid value.","invalidHeight":"Înălțimea trebuie să fie un număr.","invalidWidth":"Lățimea trebuie să fie un număr.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Îngroşat (bold)","italic":"Înclinat (italic)","strike":"Tăiat (strike through)","subscript":"Indice (subscript)","superscript":"Putere (superscript)","underline":"Subliniat (underline)"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Copiază","copyError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).","cut":"Taie","cutError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).","paste":"Adaugă","pasteArea":"Suprafața de adăugare","pasteMsg":"Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK","securityMsg":"Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.","title":"Adaugă"},"contextmenu":{"options":"Opțiuni Meniu Contextual"},"toolbar":{"toolbarCollapse":"Micșorează Bara","toolbarExpand":"Mărește Bara","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editează bara de unelte"},"elementspath":{"eleLabel":"Calea elementelor","eleTitle":"%1 element"},"list":{"bulletedlist":"Inserează / Elimină Listă cu puncte","numberedlist":"Inserează / Elimină Listă numerotată"},"indent":{"indent":"Creşte indentarea","outdent":"Scade indentarea"},"format":{"label":"Formatare","panelTitle":"Formatare","tag_address":"Adresă","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatat"},"horizontalrule":{"toolbar":"Inserează linie orizontală"},"image":{"alertUrl":"Vă rugăm să scrieţi URL-ul imaginii","alt":"Text alternativ","border":"Margine","btnUpload":"Trimite la server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Informaţii despre imagine","linkTab":"Link (Legătură web)","lockRatio":"Păstrează proporţiile","menu":"Proprietăţile imaginii","resetSize":"Resetează mărimea","title":"Proprietăţile imaginii","titleButton":"Proprietăţi buton imagine (Image Button)","upload":"Încarcă","urlMissing":"Sursa URL a imaginii lipsește.","vSpace":"VSpace","validateBorder":"Bordura trebuie să fie un număr întreg.","validateHSpace":"Hspace trebuie să fie un număr întreg.","validateVSpace":"Vspace trebuie să fie un număr întreg."},"fakeobjects":{"anchor":"Inserează/Editează ancoră","flash":"Flash Animation","hiddenfield":"Câmp ascuns (HiddenField)","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Tasta de acces","advanced":"Avansat","advisoryContentType":"Tipul consultativ al titlului","advisoryTitle":"Titlul consultativ","anchor":{"toolbar":"Inserează/Editează ancoră","menu":"Proprietăţi ancoră","title":"Proprietăţi ancoră","name":"Numele ancorei","errorName":"Vă rugăm scrieţi numele ancorei","remove":"Elimină ancora"},"anchorId":"după Id-ul elementului","anchorName":"după numele ancorei","charset":"Setul de caractere al resursei legate","cssClasses":"Clasele cu stilul paginii (CSS)","emailAddress":"Adresă de e-mail","emailBody":"Opțiuni Meniu Contextual","emailSubject":"Subiectul mesajului","id":"Id","info":"Informaţii despre link (Legătură web)","langCode":"Direcţia cuvintelor","langDir":"Direcţia cuvintelor","langDirLTR":"stânga-dreapta (LTR)","langDirRTL":"dreapta-stânga (RTL)","menu":"Editează Link","name":"Nume","noAnchors":"(Nicio ancoră disponibilă în document)","noEmail":"Vă rugăm să scrieţi adresa de e-mail","noUrl":"Vă rugăm să scrieţi URL-ul","other":"<alt>","popupDependent":"Dependent (Netscape)","popupFeatures":"Proprietăţile ferestrei popup","popupFullScreen":"Tot ecranul (Full Screen)(IE)","popupLeft":"Poziţia la stânga","popupLocationBar":"Bara de locaţie","popupMenuBar":"Bara de meniu","popupResizable":"Redimensionabil","popupScrollBars":"Bare de derulare","popupStatusBar":"Bara de status","popupToolbar":"Bara de opţiuni","popupTop":"Poziţia la dreapta","rel":"Relație","selectAnchor":"Selectaţi o ancoră","styles":"Stil","tabIndex":"Indexul tabului","target":"Ţintă (Target)","targetFrame":"<frame>","targetFrameName":"Numele frameului ţintă","targetPopup":"<fereastra popup>","targetPopupName":"Numele ferestrei popup","title":"Link (Legătură web)","toAnchor":"Ancoră în această pagină","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserează/Editează link (legătură web)","type":"Tipul link-ului (al legăturii web)","unlink":"Înlătură link (legătură web)","upload":"Încarcă"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Mărește","minimize":"Micșorează"},"pastetext":{"button":"Adaugă ca text simplu (Plain Text)","title":"Adaugă ca text simplu (Plain Text)"},"pastefromword":{"confirmCleanup":"Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?","error":"Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne","title":"Adaugă din Word","toolbar":"Adaugă din Word"},"removeformat":{"toolbar":"Înlătură formatarea"},"sourcearea":{"toolbar":"Sursa"},"specialchar":{"options":"Opțiuni caractere speciale","title":"Selectează caracter special","toolbar":"Inserează caracter special"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatarea stilurilor","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Mărimea marginii","caption":"Titlu (Caption)","cell":{"menu":"Celulă","insertBefore":"Inserează celulă înainte","insertAfter":"Inserează celulă după","deleteCell":"Şterge celule","merge":"Uneşte celule","mergeRight":"Uneşte la dreapta","mergeDown":"Uneşte jos","splitHorizontal":"Împarte celula pe orizontală","splitVertical":"Împarte celula pe verticală","title":"Proprietăți celulă","cellType":"Tipul celulei","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Aliniament orizontal","vAlign":"Aliniament vertical","alignBaseline":"Baseline","bgColor":"Culoare fundal","borderColor":"Culoare bordură","data":"Data","header":"Antet","yes":"Da","no":"Nu","invalidWidth":"Lățimea celulei trebuie să fie un număr.","invalidHeight":"Înălțimea celulei trebuie să fie un număr.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Alege"},"cellPad":"Spaţiu în cadrul celulei","cellSpace":"Spaţiu între celule","column":{"menu":"Coloană","insertBefore":"Inserează coloană înainte","insertAfter":"Inserează coloană după","deleteColumn":"Şterge celule"},"columns":"Coloane","deleteTable":"Şterge tabel","headers":"Antente","headersBoth":"Ambele","headersColumn":"Prima coloană","headersNone":"Nimic","headersRow":"Primul rând","invalidBorder":"Dimensiunea bordurii trebuie să aibe un număr.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Spațierea celului trebuie să fie un număr pozitiv.","invalidCols":"Numărul coloanelor trebuie să fie mai mare decât 0.","invalidHeight":"Table height must be a number.","invalidRows":"Numărul rândurilor trebuie să fie mai mare decât 0.","invalidWidth":"Lățimea tabelului trebuie să fie un număr.","menu":"Proprietăţile tabelului","row":{"menu":"Rând","insertBefore":"Inserează rând înainte","insertAfter":"Inserează rând după","deleteRow":"Şterge rânduri"},"rows":"Rânduri","summary":"Rezumat","title":"Proprietăţile tabelului","toolbar":"Tabel","widthPc":"procente","widthPx":"pixeli","widthUnit":"unitate lățime"},"undo":{"redo":"Starea ulterioară (redo)","undo":"Starea anterioară (undo)"},"wsc":{"btnIgnore":"Ignoră","btnIgnoreAll":"Ignoră toate","btnReplace":"Înlocuieşte","btnReplaceAll":"Înlocuieşte tot","btnUndo":"Starea anterioară (undo)","changeTo":"Schimbă în","errorLoading":"Eroare în lansarea aplicației service host %s.","ieSpellDownload":"Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?","manyChanges":"Verificarea textului terminată: 1% cuvinte modificate","noChanges":"Verificarea textului terminată: Niciun cuvânt modificat","noMispell":"Verificarea textului terminată: Nicio greşeală găsită","noSuggestions":"- Fără sugestii -","notAvailable":"Scuzați, dar serviciul nu este disponibil momentan.","notInDic":"Nu e în dicţionar","oneChange":"Verificarea textului terminată: Un cuvânt modificat","progress":"Verificarea textului în desfăşurare...","title":"Spell Check","toolbar":"Verifică scrierea textului"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ru.js b/mod/ckeditor/vendors/ckeditor/lang/ru.js
new file mode 100644
index 000000000..c3e923709
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ru.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ru']={"dir":"ltr","editor":"Визуальный редактор текÑта","common":{"editorHelp":"нажмите ALT-0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñправки","browseServer":"Выбор на Ñервере","url":"СÑылка","protocol":"Протокол","upload":"Загрузка","uploadSubmit":"Загрузить на Ñервер","image":"Изображение","flash":"Flash","form":"Форма","checkbox":"Ð¤Ð»Ð°Ð³Ð¾Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°","radio":"Кнопка выбора","textField":"ТекÑтовое поле","textarea":"МногоÑтрочное текÑтовое поле","hiddenField":"Скрытое поле","button":"Кнопка","select":"СпиÑок выбора","imageButton":"Изображение-кнопка","notSet":"<не указано>","id":"Идентификатор","name":"ИмÑ","langDir":"Ðаправление текÑта","langDirLtr":"Слева направо (LTR)","langDirRtl":"Справа налево (RTL)","langCode":"Код Ñзыка","longDescr":"Длинное опиÑание ÑÑылки","cssClass":"КлаÑÑ CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль","ok":"ОК","cancel":"Отмена","close":"Закрыть","preview":"ПредпроÑмотр","resize":"Перетащите Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð°","generalTab":"ОÑновное","advancedTab":"Дополнительно","validateNumberFailed":"Это значение не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом.","confirmNewPage":"ÐеÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ потерÑны! Ð’Ñ‹ дейÑтвительно желаете перейти на другую Ñтраницу?","confirmCancel":"Ðекоторые параметры были изменены. Ð’Ñ‹ уверены, что желаете закрыть без ÑохранениÑ?","options":"Параметры","target":"Цель","targetNew":"Ðовое окно (_blank)","targetTop":"Главное окно (_top)","targetSelf":"Текущее окно (_self)","targetParent":"РодительÑкое окно (_parent)","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","styles":"Стиль","cssClasses":"КлаÑÑÑ‹ CSS","width":"Ширина","height":"Ð’Ñ‹Ñота","align":"Выравнивание","alignLeft":"По левому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"По верху","alignMiddle":"По Ñередине","alignBottom":"По низу","invalidValue":"ÐедопуÑтимое значение.","invalidHeight":"Ð’Ñ‹Ñота задаетÑÑ Ñ‡Ð¸Ñлом.","invalidWidth":"Ширина задаетÑÑ Ñ‡Ð¸Ñлом.","invalidCssLength":"Значение, указанное в поле \"%1\", должно быть положительным целым чиÑлом. ДопуÑкаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Значение, указанное в поле \"%1\", должно быть положительным целым чиÑлом. ДопуÑкаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ единиц меры HTML (px или %).","invalidInlineStyle":"Значение, указанное Ð´Ð»Ñ ÑÑ‚Ð¸Ð»Ñ Ñлемента, должно ÑоÑтоÑть из одной или неÑкольких пар данных в формате \"параметр : значение\", разделённых точкой Ñ Ð·Ð°Ð¿Ñтой.","cssLengthTooltip":"Введите значение в пикÑелÑÑ…, либо чиÑло Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недоÑтупно</span>"},"about":{"copy":"Copyright &copy; $1. Ð’Ñе права защищены.","dlgTitle":"О CKEditor","help":"$1 Ñодержит подробную Ñправку по иÑпользованию.","moreInfo":"Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о лицензии, пожалуйÑта, перейдите на наш Ñайт:","title":"О CKEditor","userGuide":"РуководÑтво Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ CKEditor"},"basicstyles":{"bold":"Полужирный","italic":"КурÑив","strike":"Зачеркнутый","subscript":"ПодÑтрочный индекÑ","superscript":"ÐадÑтрочный индекÑ","underline":"Подчеркнутый"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копировать","copyError":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору выполнÑть операции по копированию текÑта. ПожалуйÑта, иÑпользуйте Ð´Ð»Ñ Ñтого клавиатуру (Ctrl/Cmd+C).","cut":"Вырезать","cutError":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору выполнÑть операции по вырезке текÑта. ПожалуйÑта, иÑпользуйте Ð´Ð»Ñ Ñтого клавиатуру (Ctrl/Cmd+X).","paste":"Ð’Ñтавить","pasteArea":"Зона Ð´Ð»Ñ Ð²Ñтавки","pasteMsg":"ПожалуйÑта, вÑтавьте текÑÑ‚ в зону ниже, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñƒ (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку \"OK\".","securityMsg":"ÐаÑтройки безопаÑноÑти вашего браузера не разрешают редактору напрÑмую обращатьÑÑ Ðº буферу обмена. Ð’Ñ‹ должны вÑтавить текÑÑ‚ Ñнова в Ñто окно.","title":"Ð’Ñтавить"},"contextmenu":{"options":"Параметры контекÑтного меню"},"toolbar":{"toolbarCollapse":"Свернуть панель инÑтрументов","toolbarExpand":"Развернуть панель инÑтрументов","toolbarGroups":{"document":"Документ","clipboard":"Буфер обмена / Отмена дейÑтвий","editing":"Корректировка","forms":"Формы","basicstyles":"ПроÑтые Ñтили","paragraph":"Ðбзац","links":"СÑылки","insert":"Ð’Ñтавка","styles":"Стили","colors":"Цвета","tools":"ИнÑтрументы"},"toolbars":"Панели инÑтрументов редактора"},"elementspath":{"eleLabel":"Путь Ñлементов","eleTitle":"Элемент %1"},"list":{"bulletedlist":"Ð’Ñтавить / удалить маркированный ÑпиÑок","numberedlist":"Ð’Ñтавить / удалить нумерованный ÑпиÑок"},"indent":{"indent":"Увеличить отÑтуп","outdent":"Уменьшить отÑтуп"},"format":{"label":"Форматирование","panelTitle":"Форматирование","tag_address":"ÐдреÑ","tag_div":"Обычное (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Обычное","tag_pre":"Моноширинное"},"horizontalrule":{"toolbar":"Ð’Ñтавить горизонтальную линию"},"image":{"alertUrl":"ПожалуйÑта, введите ÑÑылку на изображение","alt":"Ðльтернативный текÑÑ‚","border":"Граница","btnUpload":"Загрузить на Ñервер","button2Img":"Ð’Ñ‹ желаете преобразовать Ñто изображение-кнопку в обычное изображение?","hSpace":"Гориз. отÑтуп","img2Button":"Ð’Ñ‹ желаете преобразовать Ñто обычное изображение в изображение-кнопку?","infoTab":"Данные об изображении","linkTab":"СÑылка","lockRatio":"СохранÑть пропорции","menu":"СвойÑтва изображениÑ","resetSize":"Вернуть обычные размеры","title":"СвойÑтва изображениÑ","titleButton":"СвойÑтва изображениÑ-кнопки","upload":"Загрузить","urlMissing":"Ðе указана ÑÑылка на изображение.","vSpace":"Вертик. отÑтуп","validateBorder":"Размер границ должен быть задан чиÑлом.","validateHSpace":"Горизонтальный отÑтуп должен быть задан чиÑлом.","validateVSpace":"Вертикальный отÑтуп должен быть задан чиÑлом."},"fakeobjects":{"anchor":"Якорь","flash":"Flash анимациÑ","hiddenfield":"Скрытое поле","iframe":"iFrame","unknown":"ÐеизвеÑтный объект"},"link":{"acccessKey":"Клавиша доÑтупа","advanced":"Дополнительно","advisoryContentType":"Тип Ñодержимого","advisoryTitle":"Заголовок","anchor":{"toolbar":"Ð’Ñтавить / редактировать Ñкорь","menu":"Изменить Ñкорь","title":"СвойÑтва ÑкорÑ","name":"Ð˜Ð¼Ñ ÑкорÑ","errorName":"ПожалуйÑта, введите Ð¸Ð¼Ñ ÑкорÑ","remove":"Удалить Ñкорь"},"anchorId":"По идентификатору","anchorName":"По имени","charset":"Кодировка реÑурÑа","cssClasses":"КлаÑÑÑ‹ CSS","emailAddress":"Email адреÑ","emailBody":"ТекÑÑ‚ ÑообщениÑ","emailSubject":"Тема ÑообщениÑ","id":"Идентификатор","info":"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑÑылке","langCode":"Код Ñзыка","langDir":"Ðаправление текÑта","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","menu":"Редактировать ÑÑылку","name":"ИмÑ","noAnchors":"(Ð’ документе нет ни одного ÑкорÑ)","noEmail":"ПожалуйÑта, введите email адреÑ","noUrl":"ПожалуйÑта, введите ÑÑылку","other":"<другой>","popupDependent":"ЗавиÑимое (Netscape)","popupFeatures":"Параметры вÑплывающего окна","popupFullScreen":"ПолноÑкранное (IE)","popupLeft":"ОтÑтуп Ñлева","popupLocationBar":"Панель адреÑа","popupMenuBar":"Панель меню","popupResizable":"ИзменÑемый размер","popupScrollBars":"ПолоÑÑ‹ прокрутки","popupStatusBar":"Строка ÑоÑтоÑниÑ","popupToolbar":"Панель инÑтрументов","popupTop":"ОтÑтуп Ñверху","rel":"Отношение","selectAnchor":"Выберите Ñкорь","styles":"Стиль","tabIndex":"ПоÑледовательноÑть перехода","target":"Цель","targetFrame":"<фрейм>","targetFrameName":"Ð˜Ð¼Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ фрейма","targetPopup":"<вÑплывающее окно>","targetPopupName":"Ð˜Ð¼Ñ Ð²Ñплывающего окна","title":"СÑылка","toAnchor":"СÑылка на Ñкорь в текÑте","toEmail":"Email","toUrl":"СÑылка","toolbar":"Ð’Ñтавить/Редактировать ÑÑылку","type":"Тип ÑÑылки","unlink":"Убрать ÑÑылку","upload":"Загрузка"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Развернуть","minimize":"Свернуть"},"pastetext":{"button":"Ð’Ñтавить только текÑÑ‚","title":"Ð’Ñтавить только текÑÑ‚"},"pastefromword":{"confirmCleanup":"ТекÑÑ‚, который вы желаете вÑтавить, по вÑей видимоÑти, был Ñкопирован из Word. Следует ли очиÑтить его перед вÑтавкой?","error":"Ðевозможно очиÑтить вÑтавленные данные из-за внутренней ошибки","title":"Ð’Ñтавить из Word","toolbar":"Ð’Ñтавить из Word"},"removeformat":{"toolbar":"Убрать форматирование"},"sourcearea":{"toolbar":"ИÑточник"},"specialchar":{"options":"Выбор Ñпециального Ñимвола","title":"Выберите Ñпециальный Ñимвол","toolbar":"Ð’Ñтавить Ñпециальный Ñимвол"},"scayt":{"about":"О SCAYT","aboutTab":"О SCAYT","addWord":"Добавить Ñлово","allCaps":"Игнорировать Ñлова из заглавных букв","dic_create":"Создать","dic_delete":"Удалить","dic_field_name":"Ðазвание ÑловарÑ","dic_info":"Изначально, пользовательÑкий Ñловарь хранитÑÑ Ð² cookie, которые ограничены в размере. Когда Ñловарь Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ñ€Ð°Ñтает до размеров, что его невозможно хранить в cookie, он переноÑитÑÑ Ð½Ð° хранение на наш Ñервер. Чтобы Ñохранить ваш Ñловарь на нашем Ñервере, вам Ñледует указать название вашего ÑловарÑ. ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ был Ñловарь, который вы ÑохранÑли на нашем Ñервере, то укажите здеÑÑŒ его название и нажмите кнопку ВоÑÑтановить.","dic_rename":"Переименовать","dic_restore":"ВоÑÑтановить","dictionariesTab":"Словари","disable":"Отключить SCAYT","emptyDic":"Ð’Ñ‹ должны указать название ÑловарÑ.","enable":"Включить SCAYT","ignore":"ПропуÑтить","ignoreAll":"ПропуÑтить вÑÑ‘","ignoreDomainNames":"Игнорировать доменные имена","langs":"Языки","languagesTab":"Языки","mixedCase":"Игнорировать Ñлова из букв в разном региÑтре","mixedWithDigits":"Игнорировать Ñлова, Ñодержащие цифры","moreSuggestions":"Ещё варианты","opera_title":"Ðе поддерживаетÑÑ Opera","options":"ÐаÑтройки","optionsTab":"Параметры","title":"Проверка орфографии по мере ввода (SCAYT)","toggle":"Переключить SCAYT","noSuggestions":"Ðет вариантов"},"stylescombo":{"label":"Стили","panelTitle":"Стили форматированиÑ","panelTitle1":"Стили блока","panelTitle2":"Стили Ñлемента","panelTitle3":"Стили объекта"},"table":{"border":"Размер границ","caption":"Заголовок","cell":{"menu":"Ячейка","insertBefore":"Ð’Ñтавить Ñчейку Ñлева","insertAfter":"Ð’Ñтавить Ñчейку Ñправа","deleteCell":"Удалить Ñчейки","merge":"Объединить Ñчейки","mergeRight":"Объединить Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹","mergeDown":"Объединить Ñ Ð½Ð¸Ð¶Ð½ÐµÐ¹","splitHorizontal":"Разделить Ñчейку по горизонтали","splitVertical":"Разделить Ñчейку по вертикали","title":"СвойÑтва Ñчейки","cellType":"Тип Ñчейки","rowSpan":"ОбъединÑет Ñтрок","colSpan":"ОбъединÑет колонок","wordWrap":"ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð¿Ð¾ Ñловам","hAlign":"Горизонтальное выравнивание","vAlign":"Вертикальное выравнивание","alignBaseline":"По базовой линии","bgColor":"Цвет фона","borderColor":"Цвет границ","data":"Данные","header":"Заголовок","yes":"Да","no":"Ðет","invalidWidth":"Ширина Ñчейки должна быть чиÑлом.","invalidHeight":"Ð’Ñ‹Ñота Ñчейки должна быть чиÑлом.","invalidRowSpan":"КоличеÑтво объединÑемых Ñтрок должно быть задано чиÑлом.","invalidColSpan":"КоличеÑтво объединÑемых колонок должно быть задано чиÑлом.","chooseColor":"Выберите"},"cellPad":"Внутренний отÑтуп Ñчеек","cellSpace":"Внешний отÑтуп Ñчеек","column":{"menu":"Колонка","insertBefore":"Ð’Ñтавить колонку Ñлева","insertAfter":"Ð’Ñтавить колонку Ñправа","deleteColumn":"Удалить колонки"},"columns":"Колонки","deleteTable":"Удалить таблицу","headers":"Заголовки","headersBoth":"Сверху и Ñлева","headersColumn":"Ð›ÐµÐ²Ð°Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°","headersNone":"Без заголовков","headersRow":"ВерхнÑÑ Ñтрока","invalidBorder":"Размер границ должен быть чиÑлом.","invalidCellPadding":"Внутренний отÑтуп Ñчеек (cellpadding) должен быть чиÑлом.","invalidCellSpacing":"Внешний отÑтуп Ñчеек (cellspacing) должен быть чиÑлом.","invalidCols":"КоличеÑтво Ñтолбцов должно быть больше 0.","invalidHeight":"Ð’Ñ‹Ñота таблицы должна быть чиÑлом.","invalidRows":"КоличеÑтво Ñтрок должно быть больше 0.","invalidWidth":"Ширина таблицы должна быть чиÑлом.","menu":"СвойÑтва таблицы","row":{"menu":"Строка","insertBefore":"Ð’Ñтавить Ñтроку Ñверху","insertAfter":"Ð’Ñтавить Ñтроку Ñнизу","deleteRow":"Удалить Ñтроки"},"rows":"Строки","summary":"Итоги","title":"СвойÑтва таблицы","toolbar":"Таблица","widthPc":"процентов","widthPx":"пикÑелей","widthUnit":"единица измерениÑ"},"undo":{"redo":"Повторить","undo":"Отменить"},"wsc":{"btnIgnore":"ПропуÑтить","btnIgnoreAll":"ПропуÑтить вÑÑ‘","btnReplace":"Заменить","btnReplaceAll":"Заменить вÑÑ‘","btnUndo":"Отменить","changeTo":"Изменить на","errorLoading":"Произошла ошибка при подключении к Ñерверу проверки орфографии: %s.","ieSpellDownload":"Модуль проверки орфографии не уÑтановлен. Хотите Ñкачать его?","manyChanges":"Проверка орфографии завершена. Изменено Ñлов: %1","noChanges":"Проверка орфографии завершена. Ðе изменено ни одного Ñлова","noMispell":"Проверка орфографии завершена. Ошибок не найдено","noSuggestions":"- Варианты отÑутÑтвуют -","notAvailable":"Извините, но в данный момент ÑÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен.","notInDic":"ОтÑутÑтвует в Ñловаре","oneChange":"Проверка орфографии завершена. Изменено одно Ñлово","progress":"ÐžÑ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑетÑÑ...","title":"Проверка орфографии","toolbar":"Проверить орфографию"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/sk.js b/mod/ckeditor/vendors/ckeditor/lang/sk.js
new file mode 100644
index 000000000..28ee72be4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/sk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sk']={"dir":"ltr","editor":"Editor formátovaného textu","common":{"editorHelp":"StlaÄte ALT 0 pre nápovedu","browseServer":"PrechádzaÅ¥ server","url":"URL","protocol":"Protokol","upload":"OdoslaÅ¥","uploadSubmit":"OdoslaÅ¥ na server","image":"Obrázok","flash":"Flash","form":"Formulár","checkbox":"ZaÅ¡krtávacie políÄko","radio":"PrepínaÄ","textField":"Textové pole","textarea":"Textová oblasÅ¥","hiddenField":"Skryté pole","button":"TlaÄidlo","select":"Rozbaľovací zoznam","imageButton":"Obrázkové tlaÄidlo","notSet":"<nenastavené>","id":"Id","name":"Meno","langDir":"Orientácia jazyka","langDirLtr":"Zľava doprava (LTR)","langDirRtl":"Sprava doľava (RTL)","langCode":"Kód jazyka","longDescr":"Dlhý popis URL","cssClass":"Trieda Å¡týlu","advisoryTitle":"Pomocný titulok","cssStyle":"Å týl","ok":"OK","cancel":"ZruÅ¡iÅ¥","close":"Zatvorit","preview":"Náhľad","resize":"ZmeniÅ¥ veľkosÅ¥","generalTab":"Hlavné","advancedTab":"Rozšírené","validateNumberFailed":"Hodnota nieje Äíslo.","confirmNewPage":"Prajete si naÄítat novú stránku? VÅ¡etky neuložené zmeny budú stratené. ","confirmCancel":"Niektore možnosti boli zmenené. Naozaj chcete zavrieÅ¥ okno?","options":"Možnosti","target":"Cieľ","targetNew":"Nové okno (_blank)","targetTop":"NajvrchnejÅ¡ie okno (_top)","targetSelf":"To isté okno (_self)","targetParent":"RodiÄovské okno (_parent)","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","styles":"Å týl","cssClasses":"Triedy Å¡týlu","width":"Šírka","height":"Výška","align":"Zarovnanie","alignLeft":"Vľavo","alignRight":"Vpravo","alignCenter":"Na stred","alignTop":"Nahor","alignMiddle":"Na stred","alignBottom":"Dole","invalidValue":"Neplatná hodnota.","invalidHeight":"Výška musí byÅ¥ Äíslo.","invalidWidth":"Šírka musí byÅ¥ Äíslo.","invalidCssLength":"Å pecifikovaná hodnota pre pole \"%1\" musí byÅ¥ kladné Äíslo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).","invalidHtmlLength":"Å pecifikovaná hodnota pre pole \"%1\" musí byÅ¥ kladné Äíslo s alebo bez platnej HTML mernej jednotky (px alebo %).","invalidInlineStyle":"Zadaná hodnota pre inline Å¡týl musí pozostávaÅ¥ s jedného, alebo viac dvojíc formátu \"názov: hodnota\", oddelených bodkoÄiarkou.","cssLengthTooltip":"Vložte Äíslo pre hodnotu v pixeloch alebo Äíslo so správnou CSS jednotou (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupný</span>"},"about":{"copy":"Copyright &copy; $1. VÅ¡etky práva vyhradené.","dlgTitle":"O CKEditor-e","help":"ZaÅ¡krtnite $1 pre pomoc.","moreInfo":"Pre informácie o licenciách, prosíme, navÅ¡tívte naÅ¡u web stránku:","title":"O CKEditor-e","userGuide":"Používateľská príruÄka KCEditor-a"},"basicstyles":{"bold":"TuÄné","italic":"Kurzíva","strike":"PreÄiarknuté","subscript":"Dolný index","superscript":"Horný index","underline":"PodÄiarknuté"},"blockquote":{"toolbar":"Citácia"},"clipboard":{"copy":"KopírovaÅ¥","copyError":"BezpeÄnostné nastavenia Vášho prehliadaÄa nedovoľujú editoru automaticky spustiÅ¥ operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).","cut":"Vystrihnúť","cutError":"BezpeÄnostné nastavenia Vášho prehliadaÄa nedovoľujú editoru automaticky spustiÅ¥ operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).","paste":"VložiÅ¥","pasteArea":"Miesto pre vloženie","pasteMsg":"Prosím, vložte nasledovný rámÄek použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlaÄte OK.","securityMsg":"Kvôli vaÅ¡im bezpeÄnostným nastaveniam prehliadaÄa editor nie je schopný pristupovaÅ¥ k vaÅ¡ej schránke na kopírovanie priamo. Vložte to preto do tohto okna.","title":"VložiÅ¥"},"contextmenu":{"options":"Možnosti kontextového menu"},"toolbar":{"toolbarCollapse":"ZbaliÅ¥ liÅ¡tu nástrojov","toolbarExpand":"RozbaliÅ¥ liÅ¡tu nástrojov","toolbarGroups":{"document":"Dokument","clipboard":"Schránka pre kopírovanie/Späť","editing":"Upravovanie","forms":"Formuláre","basicstyles":"Základné Å¡týly","paragraph":"Odstavec","links":"Odkazy","insert":"VložiÅ¥","styles":"Å týly","colors":"Farby","tools":"Nástroje"},"toolbars":"LiÅ¡ty nástrojov editora"},"elementspath":{"eleLabel":"Cesta prvkov","eleTitle":"%1 prvok"},"list":{"bulletedlist":"VložiÅ¥/OdstrániÅ¥ zoznam s odrážkami","numberedlist":"VložiÅ¥/OdstrániÅ¥ Äíslovaný zoznam"},"indent":{"indent":"ZväÄÅ¡iÅ¥ odsadenie","outdent":"ZmenÅ¡iÅ¥ odsadenie"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normálny (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normálny","tag_pre":"Formátovaný"},"horizontalrule":{"toolbar":"VložiÅ¥ vodorovnú Äiaru"},"image":{"alertUrl":"Zadajte prosím URL obrázka","alt":"Alternatívny text","border":"Rám (border)","btnUpload":"OdoslaÅ¥ to na server","button2Img":"Chcete zmeniÅ¥ vybrané obrázkové tlaÄidlo na jednoduchý obrázok?","hSpace":"H-medzera","img2Button":"Chcete zmeniÅ¥ vybraný obrázok na obrázkové tlaÄidlo?","infoTab":"Informácie o obrázku","linkTab":"Odkaz","lockRatio":"Pomer zámky","menu":"Vlastnosti obrázka","resetSize":"Pôvodná veľkosÅ¥","title":"Vlastnosti obrázka","titleButton":"Vlastnosti obrázkového tlaÄidla","upload":"NahraÅ¥","urlMissing":"Chýba URL zdroja obrázka.","vSpace":"V-medzera","validateBorder":"Rám (border) musí byÅ¥ celé Äíslo.","validateHSpace":"H-medzera musí byÅ¥ celé Äíslo.","validateVSpace":"V-medzera musí byÅ¥ celé Äíslo."},"fakeobjects":{"anchor":"Kotva","flash":"Flash animácia","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámy objekt"},"link":{"acccessKey":"Prístupový kľúÄ","advanced":"Rozšírené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulok","anchor":{"toolbar":"Kotva","menu":"UpraviÅ¥ kotvu","title":"Vlastnosti kotvy","name":"Názov kotvy","errorName":"Zadajte prosím názov kotvy","remove":"OdstrániÅ¥ kotvu"},"anchorId":"Podľa Id objektu","anchorName":"Podľa mena kotvy","charset":"Priradená znaková sada","cssClasses":"Triedy Å¡týlu","emailAddress":"E-Mailová adresa","emailBody":"Telo správy","emailSubject":"Predmet správy","id":"Id","info":"Informácie o odkaze","langCode":"Orientácia jazyka","langDir":"Orientácia jazyka","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","menu":"UpraviÅ¥ odkaz","name":"Názov","noAnchors":"(V dokumente nie sú dostupné žiadne kotvy)","noEmail":"Zadajte prosím e-mailovú adresu","noUrl":"Zadajte prosím URL odkazu","other":"<iný>","popupDependent":"ZávislosÅ¥ (Netscape)","popupFeatures":"Vlastnosti vyskakovacieho okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Ľavý okraj","popupLocationBar":"Panel umiestnenia (location bar)","popupMenuBar":"Panel ponuky (menu bar)","popupResizable":"Meniteľná veľkosÅ¥ (resizable)","popupScrollBars":"Posuvníky (scroll bars)","popupStatusBar":"Stavový riadok (status bar)","popupToolbar":"Panel nástrojov (toolbar)","popupTop":"Horný okraj","rel":"VzÅ¥ah (rel)","selectAnchor":"VybraÅ¥ kotvu","styles":"Å týl","tabIndex":"Poradie prvku (tab index)","target":"Cieľ","targetFrame":"<rámec>","targetFrameName":"Názov rámu cieľa","targetPopup":"<vyskakovacie okno>","targetPopupName":"Názov vyskakovacieho okna","title":"Odkaz","toAnchor":"Odkaz na kotvu v texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"OdstrániÅ¥ odkaz","upload":"NahraÅ¥"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"MaximalizovaÅ¥","minimize":"MinimalizovaÅ¥"},"pastetext":{"button":"VložiÅ¥ ako Äistý text","title":"VložiÅ¥ ako Äistý text"},"pastefromword":{"confirmCleanup":"Vkladaný text vyzerá byÅ¥ skopírovaný z Wordu. Chcete ho automaticky vyÄistiÅ¥ pred vkladaním?","error":"Nebolo možné vyÄistiÅ¥ vložené dáta kvôli internej chybe","title":"VložiÅ¥ z Wordu","toolbar":"VložiÅ¥ z Wordu"},"removeformat":{"toolbar":"OdstrániÅ¥ formátovanie"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Možnosti Å¡peciálneho znaku","title":"Výber Å¡peciálneho znaku","toolbar":"VložiÅ¥ Å¡peciálny znak"},"scayt":{"about":"O KPPP (Kontrola pravopisu poÄas písania)","aboutTab":"O","addWord":"PridaÅ¥ slovo","allCaps":"IgnorovaÅ¥ slová písané veľkými písmenami","dic_create":"VytvoriÅ¥","dic_delete":"VymazaÅ¥","dic_field_name":"Názov slovníka","dic_info":"SpoÄiatku je užívateľský slovník uložený v cookie. Cookie vÅ¡ak majú obmedzenú veľkosÅ¥. KeÄ užívateľský slovník narastie do bodu, kedy nemôže byÅ¥ uložený v cookie, potom musí byÅ¥ slovník uložený na naÅ¡om serveri. Pre uloženie vášho osobného slovníka na náš server by ste mali zadaÅ¥ názov pre váš slovník. Ak už máte uložený slovník, prosíme, napíšte jeho názov a kliknite tlaÄidlo ObnoviÅ¥.","dic_rename":"PremenovaÅ¥","dic_restore":"ObnoviÅ¥","dictionariesTab":"Slovníky","disable":"ZakázaÅ¥ KPPP (Kontrola pravopisu poÄas písania)","emptyDic":"Názov slovníka by nemal byÅ¥ prázdny.","enable":"PovoliÅ¥ KPPP (Kontrola pravopisu poÄas písania)","ignore":"IgnorovaÅ¥","ignoreAll":"IgnorovaÅ¥ vÅ¡etko","ignoreDomainNames":"IznorovaÅ¥ názvy domén","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"IgnorovaÅ¥ slová so smieÅ¡anými veľkými a malými písmenami","mixedWithDigits":"IgnorovaÅ¥ slová s Äíslami","moreSuggestions":"Viac návrhov","opera_title":"Nepodporované Operou","options":"Možnosti","optionsTab":"Možnosti","title":"Kontrola pravopisu poÄas písania","toggle":"Prepnúť KPPP (Kontrola pravopisu poÄas písania)","noSuggestions":"No suggestion"},"stylescombo":{"label":"Å týly","panelTitle":"Formátovanie Å¡týlov","panelTitle1":"Å týly bloku","panelTitle2":"Vnútroriadkové (inline) Å¡týly","panelTitle3":"Å týly objeku"},"table":{"border":"Šírka rámu (border)","caption":"Popis","cell":{"menu":"Bunka","insertBefore":"VložiÅ¥ bunku pred","insertAfter":"VložiÅ¥ bunku za","deleteCell":"VymazaÅ¥ bunky","merge":"ZlúÄiÅ¥ bunky","mergeRight":"ZlúÄiÅ¥ doprava","mergeDown":"ZlúÄiÅ¥ dole","splitHorizontal":"RozdeliÅ¥ bunky horizontálne","splitVertical":"RozdeliÅ¥ bunky vertikálne","title":"Vlastnosti bunky","cellType":"Typ bunky","rowSpan":"Rozsah riadkov","colSpan":"Rozsah stĺpcov","wordWrap":"Zalomovanie riadkov","hAlign":"Horizontálne zarovnanie","vAlign":"Vertikálne zarovnanie","alignBaseline":"Základná Äiara (baseline)","bgColor":"Farba pozadia","borderColor":"Farba rámu","data":"Dáta","header":"HlaviÄka","yes":"Ãno","no":"Nie","invalidWidth":"Šírka bunky musí byÅ¥ Äíslo.","invalidHeight":"Výška bunky musí byÅ¥ Äíslo.","invalidRowSpan":"Rozsah riadkov musí byÅ¥ celé Äíslo.","invalidColSpan":"Rozsah stĺpcov musí byÅ¥ celé Äíslo.","chooseColor":"VybraÅ¥"},"cellPad":"Odsadenie obsahu (cell padding)","cellSpace":"VzdialenosÅ¥ buniek (cell spacing)","column":{"menu":"Stĺpec","insertBefore":"VložiÅ¥ stĺpec pred","insertAfter":"VložiÅ¥ stĺpec po","deleteColumn":"ZmazaÅ¥ stĺpce"},"columns":"Stĺpce","deleteTable":"VymazaÅ¥ tabuľku","headers":"HlaviÄka","headersBoth":"Obe","headersColumn":"Prvý stĺpec","headersNone":"Žiadne","headersRow":"Prvý riadok","invalidBorder":"Å irka rámu musí byÅ¥ Äíslo.","invalidCellPadding":"Odsadenie v bunkách (cell padding) musí byÅ¥ kladné Äíslo.","invalidCellSpacing":"Medzera mädzi bunkami (cell spacing) musí byÅ¥ kladné Äíslo.","invalidCols":"PoÄet stĺpcov musí byÅ¥ Äíslo väÄÅ¡ie ako 0.","invalidHeight":"Výška tabuľky musí byÅ¥ Äíslo.","invalidRows":"PoÄet riadkov musí byÅ¥ Äíslo väÄÅ¡ie ako 0.","invalidWidth":"Å irka tabuľky musí byÅ¥ Äíslo.","menu":"Vlastnosti tabuľky","row":{"menu":"Riadok","insertBefore":"VložiÅ¥ riadok pred","insertAfter":"VložiÅ¥ riadok po","deleteRow":"VymazaÅ¥ riadky"},"rows":"Riadky","summary":"Prehľad","title":"Vlastnosti tabuľky","toolbar":"Tabuľka","widthPc":"percent","widthPx":"pixelov","widthUnit":"jednotka šírky"},"undo":{"redo":"Znovu","undo":"Späť"},"wsc":{"btnIgnore":"IgnorovaÅ¥","btnIgnoreAll":"IgnorovaÅ¥ vÅ¡etko","btnReplace":"Prepísat","btnReplaceAll":"Prepísat vÅ¡etko","btnUndo":"Späť","changeTo":"ZmeniÅ¥ na","errorLoading":"Chyba pri naÄítaní slovníka z adresy: %s.","ieSpellDownload":"Kontrola pravopisu nie je naiÅ¡talovaná. Chcete ju teraz stiahnuÅ¥?","manyChanges":"Kontrola pravopisu dokonÄená: Bolo zmenených %1 slov","noChanges":"Kontrola pravopisu dokonÄená: Neboli zmenené žiadne slová","noMispell":"Kontrola pravopisu dokonÄená: Neboli nájdené žiadne chyby pravopisu","noSuggestions":"- Žiadny návrh -","notAvailable":"PrepáÄte, ale služba je momentálne nedostupná.","notInDic":"Nie je v slovníku","oneChange":"Kontrola pravopisu dokonÄená: Bolo zmenené jedno slovo","progress":"Prebieha kontrola pravopisu...","title":"SkontrolovaÅ¥ pravopis","toolbar":"Kontrola pravopisu"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/sl.js b/mod/ckeditor/vendors/ckeditor/lang/sl.js
new file mode 100644
index 000000000..73cd09d1c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/sl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sl']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Prebrskaj na strežniku","url":"URL","protocol":"Protokol","upload":"Prenesi","uploadSubmit":"PoÅ¡lji na strežnik","image":"Slika","flash":"Flash","form":"Obrazec","checkbox":"Potrditveno polje","radio":"Izbirno polje","textField":"Vnosno polje","textarea":"Vnosno obmoÄje","hiddenField":"Skrito polje","button":"Gumb","select":"Spustni seznam","imageButton":"Gumb s sliko","notSet":"<ni postavljen>","id":"Id","name":"Ime","langDir":"Smer jezika","langDirLtr":"Od leve proti desni (LTR)","langDirRtl":"Od desne proti levi (RTL)","langCode":"Oznaka jezika","longDescr":"Dolg opis URL-ja","cssClass":"Razred stilne predloge","advisoryTitle":"Predlagani naslov","cssStyle":"Slog","ok":"V redu","cancel":"PrekliÄi","close":"Close","preview":"Predogled","resize":"Potegni za spremembo velikosti","generalTab":"SploÅ¡no","advancedTab":"Napredno","validateNumberFailed":"Ta vrednost ni Å¡tevilo.","confirmNewPage":"Vse neshranjene spremembe te vsebine bodo izgubljene. Ali gotovo želiÅ¡ naložiti novo stran?","confirmCancel":"Nekaj možnosti je bilo spremenjenih. Ali gotovo želiÅ¡ zapreti okno?","options":"Možnosti","target":"Cilj","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","styles":"Slog","cssClasses":"Razred stilne predloge","width":"Å irina","height":"ViÅ¡ina","align":"Poravnava","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredinsko","alignTop":"Na vrh","alignMiddle":"V sredino","alignBottom":"Na dno","invalidValue":"Invalid value.","invalidHeight":"ViÅ¡ina mora biti Å¡tevilo.","invalidWidth":"Å irina mora biti Å¡tevilo.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedosegljiv</span>"},"about":{"copy":"Copyright &copy; $1. Vse pravice pridržane.","dlgTitle":"O programu CKEditor","help":"Check $1 for help.","moreInfo":"Za informacijo o licenci prostim obiÅ¡Äite naÅ¡o spletno stran:","title":"O programu CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Krepko","italic":"LežeÄe","strike":"PreÄrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"PodÄrtano"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Kopiraj","copyError":"Varnostne nastavitve brskalnika ne dopuÅ¡Äajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Varnostne nastavitve brskalnika ne dopuÅ¡Äajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).","paste":"Prilepi","pasteArea":"Paste Area","pasteMsg":"Prosim prilepite v sleÄi okvir s pomoÄjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.","securityMsg":"Zaradi varnostnih nastavitev vaÅ¡ega brskalnika urejevalnik ne more neposredno dostopati do odložiÅ¡Äa. Vsebino odložiÅ¡Äa ponovno prilepite v to okno.","title":"Prilepi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"OznaÄen seznam","numberedlist":"OÅ¡tevilÄen seznam"},"indent":{"indent":"PoveÄaj zamik","outdent":"ZmanjÅ¡aj zamik"},"format":{"label":"Oblika","panelTitle":"Oblika","tag_address":"Napis","tag_div":"Navaden (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Navaden","tag_pre":"Oblikovan"},"horizontalrule":{"toolbar":"Vstavi vodoravno Ärto"},"image":{"alertUrl":"Vnesite URL slike","alt":"Nadomestno besedilo","border":"Obroba","btnUpload":"PoÅ¡lji na strežnik","button2Img":"ŽeliÅ¡ pretvoriti izbrani gumb s sliko v preprosto sliko?","hSpace":"Vodoravni razmik","img2Button":"ŽeliÅ¡ pretvoriti izbrano sliko v gumb s sliko?","infoTab":"Podatki o sliki","linkTab":"Povezava","lockRatio":"Zakleni razmerje","menu":"Lastnosti slike","resetSize":"Ponastavi velikost","title":"Lastnosti slike","titleButton":"Lastnosti gumba s sliko","upload":"PoÅ¡lji","urlMissing":"Manjka vir (URL) slike.","vSpace":"NavpiÄni razmik","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Skrito polje","iframe":"IFrame","unknown":"Neznan objekt"},"link":{"acccessKey":"Vstopno geslo","advanced":"Napredno","advisoryContentType":"Predlagani tip vsebine (content-type)","advisoryTitle":"Predlagani naslov","anchor":{"toolbar":"Vstavi/uredi zaznamek","menu":"Lastnosti zaznamka","title":"Lastnosti zaznamka","name":"Ime zaznamka","errorName":"Prosim vnesite ime zaznamka","remove":"Remove Anchor"},"anchorId":"Po ID-ju elementa","anchorName":"Po imenu zaznamka","charset":"Kodna tabela povezanega vira","cssClasses":"Razred stilne predloge","emailAddress":"Elektronski naslov","emailBody":"Vsebina sporoÄila","emailSubject":"Predmet sporoÄila","id":"Id","info":"Podatki o povezavi","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","menu":"Uredi povezavo","name":"Ime","noAnchors":"(V tem dokumentu ni zaznamkov)","noEmail":"Vnesite elektronski naslov","noUrl":"Vnesite URL povezave","other":"<drug>","popupDependent":"Podokno (Netscape)","popupFeatures":"ZnaÄilnosti pojavnega okna","popupFullScreen":"Celozaslonska slika (IE)","popupLeft":"Lega levo","popupLocationBar":"Naslovna vrstica","popupMenuBar":"Menijska vrstica","popupResizable":"Spremenljive velikosti","popupScrollBars":"Drsniki","popupStatusBar":"Vrstica stanja","popupToolbar":"Orodna vrstica","popupTop":"Lega na vrhu","rel":"Relationship","selectAnchor":"Izberi zaznamek","styles":"Slog","tabIndex":"Å tevilka tabulatorja","target":"Cilj","targetFrame":"<okvir>","targetFrameName":"Ime ciljnega okvirja","targetPopup":"<pojavno okno>","targetPopupName":"Ime pojavnega okna","title":"Povezava","toAnchor":"Zaznamek na tej strani","toEmail":"Elektronski naslov","toUrl":"URL","toolbar":"Vstavi/uredi povezavo","type":"Vrsta povezave","unlink":"Odstrani povezavo","upload":"Prenesi"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimiraj","minimize":"Minimiraj"},"pastetext":{"button":"Prilepi kot golo besedilo","title":"Prilepi kot golo besedilo"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Prilepi iz Worda","toolbar":"Prilepi iz Worda"},"removeformat":{"toolbar":"Odstrani oblikovanje"},"sourcearea":{"toolbar":"Izvorna koda"},"specialchar":{"options":"Special Character Options","title":"Izberi posebni znak","toolbar":"Vstavi posebni znak"},"scayt":{"about":"O storitvi SCAYT","aboutTab":"O storitvi","addWord":"Dodaj besedo","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Slovarji","disable":"OnemogoÄi SCAYT","emptyDic":"Ime slovarja ne more biti prazno.","enable":"OmogoÄi SCAYT","ignore":"Prezri","ignoreAll":"Prezri vse","ignoreDomainNames":"Ignore Domain Names","langs":"Jeziki","languagesTab":"Jeziki","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"VeÄ predlogov","opera_title":"Not supported by Opera","options":"Možnosti","optionsTab":"Možnosti","title":"ÄŒrkovanje med tipkanjem","toggle":"Preklopi SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Slog","panelTitle":"Formatting Styles","panelTitle1":"Slogi odstavkov","panelTitle2":"Slogi besedila","panelTitle3":"Slogi objektov"},"table":{"border":"Velikost obrobe","caption":"Naslov","cell":{"menu":"Celica","insertBefore":"Vstavi celico pred","insertAfter":"Vstavi celico za","deleteCell":"IzbriÅ¡i celice","merge":"Združi celice","mergeRight":"Združi desno","mergeDown":"Druži navzdol","splitHorizontal":"Razdeli celico vodoravno","splitVertical":"Razdeli celico navpiÄno","title":"Lastnosti celice","cellType":"Vrsta celice","rowSpan":"Razpon vrstic","colSpan":"Razpon stolpcev","wordWrap":"Prelom besedila","hAlign":"Vodoravna poravnava","vAlign":"NavpiÄna poravnava","alignBaseline":"Osnovnica","bgColor":"Barva ozadja","borderColor":"Barva obrobe","data":"Podatki","header":"Glava","yes":"Da","no":"Ne","invalidWidth":"Å irina celice mora biti Å¡tevilo.","invalidHeight":"ViÅ¡ina celice mora biti Å¡tevilo.","invalidRowSpan":"Razpon vrstic mora biti celo Å¡tevilo.","invalidColSpan":"Razpon stolpcev mora biti celo Å¡tevilo.","chooseColor":"Izberi"},"cellPad":"Polnilo med celicami","cellSpace":"Razmik med celicami","column":{"menu":"Stolpec","insertBefore":"Vstavi stolpec pred","insertAfter":"Vstavi stolpec za","deleteColumn":"IzbriÅ¡i stolpce"},"columns":"Stolpci","deleteTable":"IzbriÅ¡i tabelo","headers":"Glave","headersBoth":"Oboje","headersColumn":"Prvi stolpec","headersNone":"Brez","headersRow":"Prva vrstica","invalidBorder":"Å irina obrobe mora biti Å¡tevilo.","invalidCellPadding":"Zamik celic mora biti Å¡tevilo","invalidCellSpacing":"Razmik med celicami mora biti Å¡tevilo.","invalidCols":"Å tevilo stolpcev mora biti veÄje od 0.","invalidHeight":"ViÅ¡ina tabele mora biti Å¡tevilo.","invalidRows":"Å tevilo vrstic mora biti veÄje od 0.","invalidWidth":"Å irina tabele mora biti Å¡tevilo.","menu":"Lastnosti tabele","row":{"menu":"Vrstica","insertBefore":"Vstavi vrstico pred","insertAfter":"Vstavi vrstico za","deleteRow":"IzbriÅ¡i vrstice"},"rows":"Vrstice","summary":"Povzetek","title":"Lastnosti tabele","toolbar":"Tabela","widthPc":"procentov","widthPx":"pik","widthUnit":"width unit"},"undo":{"redo":"Ponovi","undo":"Razveljavi"},"wsc":{"btnIgnore":"Prezri","btnIgnoreAll":"Prezri vse","btnReplace":"Zamenjaj","btnReplaceAll":"Zamenjaj vse","btnUndo":"Razveljavi","changeTo":"Spremeni v","errorLoading":"Napaka pri nalaganju storitve programa na naslovu %s.","ieSpellDownload":"ÄŒrkovalnik ni nameÅ¡Äen. Ali ga želite prenesti sedaj?","manyChanges":"ÄŒrkovanje je konÄano: Spremenjenih je bilo %1 besed","noChanges":"ÄŒrkovanje je konÄano: Nobena beseda ni bila spremenjena","noMispell":"ÄŒrkovanje je konÄano: Brez napak","noSuggestions":"- Ni predlogov -","notAvailable":"Oprostite, storitev trenutno ni dosegljiva.","notInDic":"Ni v slovarju","oneChange":"ÄŒrkovanje je konÄano: Spremenjena je bila ena beseda","progress":"Preverjanje Ärkovanja se izvaja...","title":"ÄŒrkovalnik","toolbar":"Preveri Ärkovanje"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/sr-latn.js b/mod/ckeditor/vendors/ckeditor/lang/sr-latn.js
new file mode 100644
index 000000000..5e886fe90
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/sr-latn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr-latn']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"PoÅ¡alji","uploadSubmit":"PoÅ¡alji na server","image":"Slika","flash":"FleÅ¡","form":"Forma","checkbox":"Polje za potvrdu","radio":"Radio-dugme","textField":"Tekstualno polje","textarea":"Zona teksta","hiddenField":"Skriveno polje","button":"Dugme","select":"Izborno polje","imageButton":"Dugme sa slikom","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smer jezika","langDirLtr":"S leva na desno (LTR)","langDirRtl":"S desna na levo (RTL)","langCode":"Kôd jezika","longDescr":"Pun opis URL","cssClass":"Stylesheet klase","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Otkaži","close":"Close","preview":"Izgled stranice","resize":"Resize","generalTab":"General","advancedTab":"Napredni tagovi","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Meta","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","styles":"Stil","cssClasses":"Stylesheet klase","width":"Å irina","height":"Visina","align":"Ravnanje","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredina","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dole","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Podebljano","italic":"Kurziv","strike":"Precrtano","subscript":"Indeks","superscript":"Stepen","underline":"PodvuÄeno"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosna podeÅ¡avanja VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite preÄicu sa tastature (Ctrl/Cmd+C).","cut":"Iseci","cutError":"Sigurnosna podeÅ¡avanja VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite preÄicu sa tastature (Ctrl/Cmd+X).","paste":"Zalepi","pasteArea":"Paste Area","pasteMsg":"Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu preÄicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Zalepi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Nenabrojiva lista","numberedlist":"Nabrojiva lista"},"indent":{"indent":"Uvećaj levu marginu","outdent":"Smanji levu marginu"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adresa","tag_div":"Normal (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Unesi horizontalnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"PoÅ¡alji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"ZakljuÄaj odnos","menu":"Osobine slika","resetSize":"Resetuj veliÄinu","title":"Osobine slika","titleButton":"Osobine dugmeta sa slikom","upload":"PoÅ¡alji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupni taster","advanced":"Napredni tagovi","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Unesi/izmeni sidro","menu":"Osobine sidra","title":"Osobine sidra","name":"Ime sidra","errorName":"Unesite ime sidra","remove":"Remove Anchor"},"anchorId":"Po Id-ju elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","menu":"Izmeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Otkucajte adresu elektronske pote","noUrl":"Unesite URL linka","other":"<оÑтало>","popupDependent":"Zavisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Prikaz preko celog ekrana (IE)","popupLeft":"Od leve ivice ekrana (px)","popupLocationBar":"Lokacija","popupMenuBar":"Kontekstni meni","popupResizable":"Resizable","popupScrollBars":"Scroll bar","popupStatusBar":"Statusna linija","popupToolbar":"Toolbar","popupTop":"Od vrha ekrana (px)","rel":"Relationship","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Naziv odrediÅ¡nog frejma","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Unesi/izmeni link","type":"Vrsta linka","unlink":"Ukloni link","upload":"PoÅ¡alji"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalepi kao Äist tekst","title":"Zalepi kao Äist tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalepi iz Worda","toolbar":"Zalepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Special Character Options","title":"Odaberite specijalni karakter","toolbar":"Unesi specijalni karakter"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"VeliÄina okvira","caption":"Naslov tabele","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ObriÅ¡i ćelije","merge":"Spoj celije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Razmak ćelija","cellSpace":"Ćelijski prostor","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ObriÅ¡i kolone"},"columns":"Kolona","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Osobine tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ObriÅ¡i redove"},"rows":"Redova","summary":"Summary","title":"Osobine tabele","toolbar":"Tabela","widthPc":"procenata","widthPx":"piksela","widthUnit":"width unit"},"undo":{"redo":"Ponovi akciju","undo":"Poni�ti akciju"},"wsc":{"btnIgnore":"IgnoriÅ¡i","btnIgnoreAll":"IgnoriÅ¡i sve","btnReplace":"Zameni","btnReplaceAll":"Zameni sve","btnUndo":"Vrati akciju","changeTo":"Izmeni","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?","manyChanges":"Provera spelovanja zavrÅ¡ena: %1 reÄ(i) je izmenjeno","noChanges":"Provera spelovanja zavrÅ¡ena: Nije izmenjena nijedna rec","noMispell":"Provera spelovanja zavrÅ¡ena: greÅ¡ke nisu pronadene","noSuggestions":"- Bez sugestija -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Nije u reÄniku","oneChange":"Provera spelovanja zavrÅ¡ena: Izmenjena je jedna reÄ","progress":"Provera spelovanja u toku...","title":"Spell Check","toolbar":"Proveri spelovanje"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/sr.js b/mod/ckeditor/vendors/ckeditor/lang/sr.js
new file mode 100644
index 000000000..dbfac2485
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/sr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Претражи Ñервер","url":"УРЛ","protocol":"Протокол","upload":"Пошаљи","uploadSubmit":"Пошаљи на Ñервер","image":"Слика","flash":"Флеш елемент","form":"Форма","checkbox":"Поље за потврду","radio":"Радио-дугме","textField":"ТекÑтуално поље","textarea":"Зона текÑта","hiddenField":"Скривено поље","button":"Дугме","select":"Изборно поље","imageButton":"Дугме Ñа Ñликом","notSet":"<није поÑтављено>","id":"Ид","name":"Ðазив","langDir":"Смер језика","langDirLtr":"С лева на деÑно (LTR)","langDirRtl":"С деÑна на лево (RTL)","langCode":"Kôд језика","longDescr":"Пун Ð¾Ð¿Ð¸Ñ Ð£Ð Ð›","cssClass":"Stylesheet клаÑе","advisoryTitle":"Advisory наÑлов","cssStyle":"Стил","ok":"OK","cancel":"Oткажи","close":"Close","preview":"Изглед Ñтранице","resize":"Resize","generalTab":"General","advancedTab":"Ðапредни тагови","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"MeÑ‚a","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"С лева на деÑно (LTR)","langDirRTL":"С деÑна на лево (RTL)","styles":"Стил","cssClasses":"Stylesheet клаÑе","width":"Ширина","height":"ВиÑина","align":"Равнање","alignLeft":"Лево","alignRight":"ДеÑно","alignCenter":"Средина","alignTop":"Врх","alignMiddle":"Средина","alignBottom":"Доле","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Подебљано","italic":"Курзив","strike":"Прецртано","subscript":"ИндекÑ","superscript":"Степен","underline":"Подвучено"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Копирај","copyError":"СигурноÑна подешавања Вашег претраживача не дозвољавају операције аутоматÑког копирања текÑта. Молимо Ð’Ð°Ñ Ð´Ð° кориÑтите пречицу Ñа таÑтатуре (Ctrl/Cmd+C).","cut":"ИÑеци","cutError":"СигурноÑна подешавања Вашег претраживача не дозвољавају операције аутоматÑког иÑецања текÑта. Молимо Ð’Ð°Ñ Ð´Ð° кориÑтите пречицу Ñа таÑтатуре (Ctrl/Cmd+X).","paste":"Залепи","pasteArea":"Paste Area","pasteMsg":"Молимо Ð’Ð°Ñ Ð´Ð° залепите унутар доње површине кориÑтећи таÑтатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиÑнете <STRONG>OK</STRONG>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Залепи"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"Ðенабројива лиÑта","numberedlist":"Ðабројиву лиÑту"},"indent":{"indent":"Увећај леву маргину","outdent":"Смањи леву маргину"},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"Adresa","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"УнеÑи хоризонталну линију"},"image":{"alertUrl":"УнеÑите УРЛ Ñлике","alt":"Ðлтернативни текÑÑ‚","border":"Оквир","btnUpload":"Пошаљи на Ñервер","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Инфо Ñлике","linkTab":"Линк","lockRatio":"Закључај одноÑ","menu":"ОÑобине Ñлика","resetSize":"РеÑетуј величину","title":"ОÑобине Ñлика","titleButton":"ОÑобине дугмета Ñа Ñликом","upload":"Пошаљи","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ПриÑтупни таÑтер","advanced":"Ðапредни тагови","advisoryContentType":"Advisory врÑта Ñадржаја","advisoryTitle":"Advisory наÑлов","anchor":{"toolbar":"УнеÑи/измени Ñидро","menu":"ОÑобине Ñидра","title":"ОÑобине Ñидра","name":"Име Ñидра","errorName":"Молимо Ð’Ð°Ñ Ð´Ð° унеÑете име Ñидра","remove":"Remove Anchor"},"anchorId":"Пo Ид-jу елемента","anchorName":"По називу Ñидра","charset":"Linked Resource Charset","cssClasses":"Stylesheet клаÑе","emailAddress":"ÐдреÑа електронÑке поште","emailBody":"Садржај поруке","emailSubject":"ÐаÑлов","id":"Ид","info":"Линк инфо","langCode":"Смер језика","langDir":"Смер језика","langDirLTR":"С лева на деÑно (LTR)","langDirRTL":"С деÑна на лево (RTL)","menu":"Промени линк","name":"Ðазив","noAnchors":"(Ðема доÑтупних Ñидра)","noEmail":"Откуцајте адреÑу електронÑке поште","noUrl":"УнеÑите УРЛ линка","other":"<other>","popupDependent":"ЗавиÑно (Netscape)","popupFeatures":"МогућноÑти иÑкачућег прозора","popupFullScreen":"Приказ преко целог екрана (ИE)","popupLeft":"Од леве ивице екрана (пикÑела)","popupLocationBar":"Локација","popupMenuBar":"КонтекÑтни мени","popupResizable":"Resizable","popupScrollBars":"Скрол бар","popupStatusBar":"СтатуÑна линија","popupToolbar":"Toolbar","popupTop":"Од врха екрана (пикÑела)","rel":"Relationship","selectAnchor":"Одабери Ñидро","styles":"Стил","tabIndex":"Таб индекÑ","target":"MeÑ‚a","targetFrame":"<оквир>","targetFrameName":"Ðазив одредишног фрејма","targetPopup":"<иÑкачући прозор>","targetPopupName":"Ðазив иÑкачућег прозора","title":"Линк","toAnchor":"Сидро на овој Ñтраници","toEmail":"EлектронÑка пошта","toUrl":"УРЛ","toolbar":"УнеÑи/измени линк","type":"Ð’Ñ€Ñта линка","unlink":"Уклони линк","upload":"Пошаљи"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Залепи као чиÑÑ‚ текÑÑ‚","title":"Залепи као чиÑÑ‚ текÑÑ‚"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Залепи из Worda","toolbar":"Залепи из Worda"},"removeformat":{"toolbar":"Уклони форматирање"},"sourcearea":{"toolbar":"Kôд"},"specialchar":{"options":"Special Character Options","title":"Одаберите Ñпецијални карактер","toolbar":"УнеÑи Ñпецијални карактер"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стил","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Величина оквира","caption":"ÐаÑлов табеле","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Обриши ћелије","merge":"Спој ћелије","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Размак ћелија","cellSpace":"ЋелијÑки проÑтор","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Обриши колоне"},"columns":"Kолона","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"ОÑобине табеле","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Обриши редове"},"rows":"Редова","summary":"Summary","title":"ОÑобине табеле","toolbar":"Табела","widthPc":"процената","widthPx":"пикÑела","widthUnit":"width unit"},"undo":{"redo":"Понови акцију","undo":"Поништи акцију"},"wsc":{"btnIgnore":"Игнориши","btnIgnoreAll":"Игнориши Ñве","btnReplace":"Замени","btnReplaceAll":"Замени Ñве","btnUndo":"Врати акцију","changeTo":"Измени","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Провера Ñпеловања није инÑталирана. Да ли желите да је Ñкинете Ñа Интернета?","manyChanges":"Провера Ñпеловања завршена: %1 реч(и) је измењено","noChanges":"Провера Ñпеловања завршена: Ðије измењена ниједна реч","noMispell":"Провера Ñпеловања завршена: грешке ниÑу пронађене","noSuggestions":"- Без ÑугеÑтија -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ðије у речнику","oneChange":"Провера Ñпеловања завршена: Измењена је једна реч","progress":"Провера Ñпеловања у току...","title":"Spell Check","toolbar":"Провери Ñпеловање"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/sv.js b/mod/ckeditor/vendors/ckeditor/lang/sv.js
new file mode 100644
index 000000000..b666f6612
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/sv.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sv']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Tryck ALT 0 för hjälp","browseServer":"Bläddra på server","url":"URL","protocol":"Protokoll","upload":"Ladda upp","uploadSubmit":"Skicka till server","image":"Bild","flash":"Flash","form":"Formulär","checkbox":"Kryssruta","radio":"Alternativknapp","textField":"Textfält","textarea":"Textruta","hiddenField":"Dolt fält","button":"Knapp","select":"Flervalslista","imageButton":"Bildknapp","notSet":"<ej angivet>","id":"Id","name":"Namn","langDir":"Språkriktning","langDirLtr":"Vänster till Höger (VTH)","langDirRtl":"Höger till Vänster (HTV)","langCode":"Språkkod","longDescr":"URL-beskrivning","cssClass":"Stilmall","advisoryTitle":"Titel","cssStyle":"Stilmall","ok":"OK","cancel":"Avbryt","close":"Stäng","preview":"Förhandsgranska","resize":"Dra för att ändra storlek","generalTab":"Allmänt","advancedTab":"Avancerad","validateNumberFailed":"Värdet är inte ett nummer.","confirmNewPage":"Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?","confirmCancel":"Några av de alternativ har ändrats. Är du säker på att stänga dialogrutan?","options":"Alternativ","target":"Mål","targetNew":"Nytt fönster (_blank)","targetTop":"Översta fönstret (_top)","targetSelf":"Samma fönster (_self)","targetParent":"Föregående fönster (_parent)","langDirLTR":"Vänster till höger (LTR)","langDirRTL":"Höger till vänster (RTL)","styles":"Stil","cssClasses":"Stilmallar","width":"Bredd","height":"Höjd","align":"Justering","alignLeft":"Vänster","alignRight":"Höger","alignCenter":"Centrerad","alignTop":"Överkant","alignMiddle":"Mitten","alignBottom":"Nederkant","invalidValue":"Felaktigt värde.","invalidHeight":"Höjd måste vara ett nummer.","invalidWidth":"Bredd måste vara ett nummer.","invalidCssLength":"Värdet för fältet \"%1\" måste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"rdet för fältet \"%1\" måste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).","invalidInlineStyle":"Det angivna värdet för style måste innehålla en eller flera tupler separerade med semikolon i följande format: \"name : value\"","cssLengthTooltip":"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, Ej tillgänglig</span>"},"about":{"copy":"Copyright &copy; $1. Alla rättigheter reserverade.","dlgTitle":"Om CKEditor","help":"Se $1 för hjälp.","moreInfo":"För information av licenciering besök vår hemsida:","title":"Om CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Genomstruken","subscript":"Nedsänkta tecken","superscript":"Upphöjda tecken","underline":"Understruken"},"blockquote":{"toolbar":"Blockcitat"},"clipboard":{"copy":"Kopiera","copyError":"Säkerhetsinställningar i Er webläsare tillåter inte åtgården Kopiera. Använd (Ctrl/Cmd+C) istället","cut":"Klipp ut","cutError":"Säkerhetsinställningar i Er webläsare tillåter inte åtgården Klipp ut. Använd (Ctrl/Cmd+X) istället.","paste":"Klistra in","pasteArea":"Paste Area","pasteMsg":"Var god och klistra in Er text i rutan nedan genom att använda (<STRONG>Ctrl/Cmd+V</STRONG>) klicka sen på <STRONG>OK</STRONG>.","securityMsg":"På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.","title":"Klistra in"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Dölj verktygsfält","toolbarExpand":"Visa verktygsfält","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Redigera verktygsfält"},"elementspath":{"eleLabel":"Elementets sökväg","eleTitle":"%1 element"},"list":{"bulletedlist":"Punktlista","numberedlist":"Numrerad lista"},"indent":{"indent":"Öka indrag","outdent":"Minska indrag"},"format":{"label":"Teckenformat","panelTitle":"Teckenformat","tag_address":"Adress","tag_div":"Normal (DIV)","tag_h1":"Rubrik 1","tag_h2":"Rubrik 2","tag_h3":"Rubrik 3","tag_h4":"Rubrik 4","tag_h5":"Rubrik 5","tag_h6":"Rubrik 6","tag_p":"Normal","tag_pre":"Formaterad"},"horizontalrule":{"toolbar":"Infoga horisontal linje"},"image":{"alertUrl":"Var god och ange bildens URL","alt":"Alternativ text","border":"Kant","btnUpload":"Skicka till server","button2Img":"Vill du omvandla den valda bildknappen på en enkel bild?","hSpace":"Horis. marginal","img2Button":"Vill du omvandla den valda bildknappen på en enkel bild?","infoTab":"Bildinformation","linkTab":"Länk","lockRatio":"Lås höjd/bredd förhållanden","menu":"Bildegenskaper","resetSize":"Återställ storlek","title":"Bildegenskaper","titleButton":"Egenskaper för bildknapp","upload":"Ladda upp","urlMissing":"Bildkällans URL saknas.","vSpace":"Vert. marginal","validateBorder":"Kantlinje måste vara ett heltal.","validateHSpace":"HSpace måste vara ett heltal.","validateVSpace":"VSpace måste vara ett heltal."},"fakeobjects":{"anchor":"Ankare","flash":"Flashanimation","hiddenfield":"Gömt fält","iframe":"iFrame","unknown":"Okänt objekt"},"link":{"acccessKey":"Behörighetsnyckel","advanced":"Avancerad","advisoryContentType":"Innehållstyp","advisoryTitle":"Titel","anchor":{"toolbar":"Infoga/Redigera ankarlänk","menu":"Egenskaper för ankarlänk","title":"Egenskaper för ankarlänk","name":"Ankarnamn","errorName":"Var god ange ett ankarnamn","remove":"Radera ankare"},"anchorId":"efter objektid","anchorName":"efter ankarnamn","charset":"Teckenuppställning","cssClasses":"Stylesheet class","emailAddress":"E-postadress","emailBody":"Innehåll","emailSubject":"Ämne","id":"Id","info":"Länkinformation","langCode":"Språkriktning","langDir":"Språkriktning","langDirLTR":"Vänster till höger (VTH)","langDirRTL":"Höger till vänster (HTV)","menu":"Redigera länk","name":"Namn","noAnchors":"(Inga ankare kunde hittas)","noEmail":"Var god ange E-postadress","noUrl":"Var god ange länkens URL","other":"<annan>","popupDependent":"Beroende (endast Netscape)","popupFeatures":"Popup-fönstrets egenskaper","popupFullScreen":"Helskärm (endast IE)","popupLeft":"Position från vänster","popupLocationBar":"Adressfält","popupMenuBar":"Menyfält","popupResizable":"Resizable","popupScrollBars":"Scrolllista","popupStatusBar":"Statusfält","popupToolbar":"Verktygsfält","popupTop":"Position från sidans topp","rel":"Förhållande","selectAnchor":"Välj ett ankare","styles":"Stilmall","tabIndex":"Tabindex","target":"Mål","targetFrame":"<ram>","targetFrameName":"Målets ramnamn","targetPopup":"<popup-fönster>","targetPopupName":"Popup-fönstrets namn","title":"Länk","toAnchor":"Ankare i sidan","toEmail":"E-post","toUrl":"URL","toolbar":"Infoga/Redigera länk","type":"Länktyp","unlink":"Radera länk","upload":"Ladda upp"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximera","minimize":"Minimera"},"pastetext":{"button":"Klistra in som vanlig text","title":"Klistra in som vanlig text"},"pastefromword":{"confirmCleanup":"Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa innan du klistrar?","error":"Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel","title":"Klistra in från Word","toolbar":"Klistra in från Word"},"removeformat":{"toolbar":"Radera formatering"},"sourcearea":{"toolbar":"Källa"},"specialchar":{"options":"Special Character Options","title":"Välj utökat tecken","toolbar":"Klistra in utökat tecken"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Lägg till ord","allCaps":"Ignorera alla ord med enbart versaler","dic_create":"Skapa","dic_delete":"Ta bort","dic_field_name":"Ordlistans namn","dic_info":"Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den på vår server. För att lagra din personliga ordlista på vår server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka på knappen Återställ.","dic_rename":"Byt namn","dic_restore":"Återställ","dictionariesTab":"Ordlistor","disable":"Inaktivera SCAYT","emptyDic":"Ordlistans namn får ej vara tomt.","enable":"Aktivera SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alla","ignoreDomainNames":"Ignorera domännamn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ignorera ord med blandat shiftläge","mixedWithDigits":"Ignorera ord med nummer","moreSuggestions":"Fler förslag","opera_title":"Stöds ej av Opera","options":"Inställningar","optionsTab":"Inställningar","title":"Stavningskontroll medan du skriver","toggle":"Växla SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Anpassad stil","panelTitle":"Formatmallar","panelTitle1":"Blockstil","panelTitle2":"Inbäddad stil","panelTitle3":"Objektets stil"},"table":{"border":"Kantstorlek","caption":"Rubrik","cell":{"menu":"Cell","insertBefore":"Lägg till cell före","insertAfter":"Lägg till cell efter","deleteCell":"Radera celler","merge":"Sammanfoga celler","mergeRight":"Sammanfoga höger","mergeDown":"Sammanfoga ner","splitHorizontal":"Dela cell horisontellt","splitVertical":"Dela cell vertikalt","title":"Egenskaper för cell","cellType":"Celltyp","rowSpan":"Rad spann","colSpan":"Kolumnen spann","wordWrap":"Radbrytning","hAlign":"Horisontell justering","vAlign":"Vertikal justering","alignBaseline":"Baslinje","bgColor":"Bakgrundsfärg","borderColor":"Ramfärg","data":"Data","header":"Rubrik","yes":"Ja","no":"Nej","invalidWidth":"Cellens bredd måste vara ett nummer.","invalidHeight":"Cellens höjd måste vara ett nummer.","invalidRowSpan":"Radutvidgning måste vara ett heltal.","invalidColSpan":"Kolumn måste vara ett heltal.","chooseColor":"Välj"},"cellPad":"Cellutfyllnad","cellSpace":"Cellavstånd","column":{"menu":"Kolumn","insertBefore":"Lägg till kolumn före","insertAfter":"Lägg till kolumn efter","deleteColumn":"Radera kolumn"},"columns":"Kolumner","deleteTable":"Radera tabell","headers":"Rubriker","headersBoth":"Båda","headersColumn":"Första kolumnen","headersNone":"Ingen","headersRow":"Första raden","invalidBorder":"Ram måste vara ett nummer.","invalidCellPadding":"Luft i cell måste vara ett nummer.","invalidCellSpacing":"Luft i cell måste vara ett nummer.","invalidCols":"Antal kolumner måste vara ett nummer större än 0.","invalidHeight":"Tabellens höjd måste vara ett nummer.","invalidRows":"Antal rader måste vara större än 0.","invalidWidth":"Tabell måste vara ett nummer.","menu":"Tabellegenskaper","row":{"menu":"Rad","insertBefore":"Lägg till Rad Före","insertAfter":"Lägg till rad efter","deleteRow":"Radera rad"},"rows":"Rader","summary":"Sammanfattning","title":"Tabellegenskaper","toolbar":"Tabell","widthPc":"procent","widthPx":"pixlar","widthUnit":"enhet bredd"},"undo":{"redo":"Gör om","undo":"Ångra"},"wsc":{"btnIgnore":"Ignorera","btnIgnoreAll":"Ignorera alla","btnReplace":"Ersätt","btnReplaceAll":"Ersätt alla","btnUndo":"Ångra","changeTo":"Ändra till","errorLoading":"Tjänsten är ej tillgänglig: %s.","ieSpellDownload":"Stavningskontrollen är ej installerad. Vill du göra det nu?","manyChanges":"Stavningskontroll slutförd: %1 ord rättades.","noChanges":"Stavningskontroll slutförd: Inga ord rättades.","noMispell":"Stavningskontroll slutförd: Inga stavfel påträffades.","noSuggestions":"- Förslag saknas -","notAvailable":"Tyvärr är tjänsten ej tillgänglig nu","notInDic":"Saknas i ordlistan","oneChange":"Stavningskontroll slutförd: Ett ord rättades.","progress":"Stavningskontroll pågår...","title":"Kontrollera stavning","toolbar":"Stavningskontroll"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/th.js b/mod/ckeditor/vendors/ckeditor/lang/th.js
new file mode 100644
index 000000000..c07cd7aa3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/th.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['th']={"dir":"ltr","editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"เปิดหน้าต่างจัดà¸à¸²à¸£à¹„ฟล์อัพโหลด","url":"ที่อยู่อ้างอิง URL","protocol":"โปรโตคอล","upload":"อัพโหลดไฟล์","uploadSubmit":"อัพโหลดไฟล์ไปเà¸à¹‡à¸šà¹„ว้ที่เครื่องà¹à¸¡à¹ˆà¸‚่าย (เซิร์ฟเวอร์)","image":"รูปภาพ","flash":"ไฟล์ Flash","form":"à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡","checkbox":"เช็คบ๊อà¸","radio":"เรดิโอบัตตอน","textField":"เท็à¸à¸‹à¹Œà¸Ÿà¸´à¸¥à¸”์","textarea":"เท็à¸à¸‹à¹Œà¹à¸­à¹€à¸£à¸µà¸¢","hiddenField":"ฮิดเดนฟิลด์","button":"ปุ่ม","select":"à¹à¸–บตัวเลือà¸","imageButton":"ปุ่มà¹à¸šà¸šà¸£à¸¹à¸›à¸ à¸²à¸ž","notSet":"<ไม่ระบุ>","id":"ไอดี","name":"ชื่อ","langDir":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDirLtr":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRtl":"จาà¸à¸‚วามาซ้าย (RTL)","langCode":"รหัสภาษา","longDescr":"คำอธิบายประà¸à¸­à¸š URL","cssClass":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","advisoryTitle":"คำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","cssStyle":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","ok":"ตà¸à¸¥à¸‡","cancel":"ยà¸à¹€à¸¥à¸´à¸","close":"Close","preview":"ดูหน้าเอà¸à¸ªà¸²à¸£à¸•ัวอย่าง","resize":"Resize","generalTab":"General","advancedTab":"ขั้นสูง","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"à¸à¸²à¸£à¹€à¸›à¸´à¸”หน้าลิงค์","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRTL":"จาà¸à¸‚วามาซ้าย (RTL)","styles":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","cssClasses":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","width":"ความà¸à¸§à¹‰à¸²à¸‡","height":"ความสูง","align":"à¸à¸²à¸£à¸ˆà¸±à¸”วาง","alignLeft":"ชิดซ้าย","alignRight":"ชิดขวา","alignCenter":"à¸à¸¶à¹ˆà¸‡à¸à¸¥à¸²à¸‡","alignTop":"บนสุด","alignMiddle":"à¸à¸¶à¹ˆà¸‡à¸à¸¥à¸²à¸‡à¹à¸™à¸§à¸•ั้ง","alignBottom":"ชิดด้านล่าง","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ตัวหนา","italic":"ตัวเอียง","strike":"ตัวขีดเส้นทับ","subscript":"ตัวห้อย","superscript":"ตัวยà¸","underline":"ตัวขีดเส้นใต้"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"สำเนา","copyError":"ไม่สามารถสำเนาข้อความที่เลือà¸à¹„ว้ได้เนื่องจาà¸à¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าระดับความปลอดภัย. à¸à¸£à¸¸à¸“าใช้ปุ่มลัดเพื่อวางข้อความà¹à¸—น (à¸à¸”ปุ่ม Ctrl/Cmd à¹à¸¥à¸°à¸•ัว C พร้อมà¸à¸±à¸™).","cut":"ตัด","cutError":"ไม่สามารถตัดข้อความที่เลือà¸à¹„ว้ได้เนื่องจาà¸à¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าระดับความปลอดภัย. à¸à¸£à¸¸à¸“าใช้ปุ่มลัดเพื่อวางข้อความà¹à¸—น (à¸à¸”ปุ่ม Ctrl/Cmd à¹à¸¥à¸°à¸•ัว X พร้อมà¸à¸±à¸™).","paste":"วาง","pasteArea":"Paste Area","pasteMsg":"à¸à¸£à¸¸à¸“าใช้คีย์บอร์ดเท่านั้น โดยà¸à¸”ปุ๋ม (<strong>Ctrl/Cmd à¹à¸¥à¸° V</strong>)พร้อมๆà¸à¸±à¸™ à¹à¸¥à¸°à¸à¸” <strong>OK</strong>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"วาง"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"list":{"bulletedlist":"ลำดับรายà¸à¸²à¸£à¹à¸šà¸šà¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“์","numberedlist":"ลำดับรายà¸à¸²à¸£à¹à¸šà¸šà¸•ัวเลข"},"indent":{"indent":"เพิ่มระยะย่อหน้า","outdent":"ลดระยะย่อหน้า"},"format":{"label":"รูปà¹à¸šà¸š","panelTitle":"รูปà¹à¸šà¸š","tag_address":"Address","tag_div":"Paragraph (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"à¹à¸—รà¸à¹€à¸ªà¹‰à¸™à¸„ั่นบรรทัด"},"image":{"alertUrl":"à¸à¸£à¸¸à¸“าระบุที่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาพ (URL)","alt":"คำประà¸à¸­à¸šà¸£à¸¹à¸›à¸ à¸²à¸ž","border":"ขนาดขอบรูป","btnUpload":"อัพโหลดไฟล์ไปเà¸à¹‡à¸šà¹„ว้ที่เครื่องà¹à¸¡à¹ˆà¸‚่าย (เซิร์ฟเวอร์)","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"ระยะà¹à¸™à¸§à¸™à¸­à¸™","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ข้อมูลของรูปภาพ","linkTab":"ลิ้งค์","lockRatio":"à¸à¸³à¸«à¸™à¸”อัตราส่วน à¸à¸§à¹‰à¸²à¸‡-สูง à¹à¸šà¸šà¸„งที่","menu":"คุณสมบัติของ รูปภาพ","resetSize":"à¸à¸³à¸«à¸™à¸”รูปเท่าขนาดจริง","title":"คุณสมบัติของ รูปภาพ","titleButton":"คุณสมบัติของ ปุ่มà¹à¸šà¸šà¸£à¸¹à¸›à¸ à¸²à¸ž","upload":"อัพโหลดไฟล์","urlMissing":"Image source URL is missing.","vSpace":"ระยะà¹à¸™à¸§à¸•ั้ง","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข Anchor","flash":"Flash Animation","hiddenfield":"ฮิดเดนฟิลด์","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"à¹à¸­à¸„เซส คีย์","advanced":"ขั้นสูง","advisoryContentType":"ชนิดของคำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","advisoryTitle":"คำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","anchor":{"toolbar":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข Anchor","menu":"รายละเอียด Anchor","title":"รายละเอียด Anchor","name":"ชื่อ Anchor","errorName":"à¸à¸£à¸¸à¸“าระบุชื่อของ Anchor","remove":"Remove Anchor"},"anchorId":"ไอดี","anchorName":"ชื่อ","charset":"ลิงค์เชื่อมโยงไปยังชุดตัวอัà¸à¸©à¸£","cssClasses":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","emailAddress":"อีเมล์ (E-Mail)","emailBody":"ข้อความ","emailSubject":"หัวเรื่อง","id":"ไอดี","info":"รายละเอียด","langCode":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDir":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDirLTR":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRTL":"จาà¸à¸‚วามาซ้าย (RTL)","menu":"à¹à¸à¹‰à¹„ข ลิงค์","name":"ชื่อ","noAnchors":"(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอà¸à¸ªà¸²à¸£à¸™à¸µà¹‰)","noEmail":"à¸à¸£à¸¸à¸“าระบุอีเมล์ (E-mail)","noUrl":"à¸à¸£à¸¸à¸“าระบุที่อยู่อ้างอิงออนไลน์ (URL)","other":"<อื่น ๆ>","popupDependent":"à¹à¸ªà¸”งเต็มหน้าจอ (Netscape)","popupFeatures":"คุณสมบัติของหน้าจอเล็ภ(Pop-up)","popupFullScreen":"à¹à¸ªà¸”งเต็มหน้าจอ (IE5.5++ เท่านั้น)","popupLeft":"พิà¸à¸±à¸”ซ้าย (Left Position)","popupLocationBar":"à¹à¸ªà¸”งที่อยู่ของไฟล์","popupMenuBar":"à¹à¸ªà¸”งà¹à¸–บเมนู","popupResizable":"Resizable","popupScrollBars":"à¹à¸ªà¸”งà¹à¸–บเลื่อน","popupStatusBar":"à¹à¸ªà¸”งà¹à¸–บสถานะ","popupToolbar":"à¹à¸ªà¸”งà¹à¸–บเครื่องมือ","popupTop":"พิà¸à¸±à¸”บน (Top Position)","rel":"Relationship","selectAnchor":"ระบุข้อมูลของจุดเชื่อมโยง (Anchor)","styles":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","tabIndex":"ลำดับของ à¹à¸—็บ","target":"à¸à¸²à¸£à¹€à¸›à¸´à¸”หน้าลิงค์","targetFrame":"<เปิดในเฟรม>","targetFrameName":"ชื่อทาร์เà¸à¹‡à¸•เฟรม","targetPopup":"<เปิดหน้าจอเล็ภ(Pop-up)>","targetPopupName":"ระบุชื่อหน้าจอเล็ภ(Pop-up)","title":"ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ","toAnchor":"จุดเชื่อมโยง (Anchor)","toEmail":"ส่งอีเมล์ (E-Mail)","toUrl":"ที่อยู่อ้างอิง URL","toolbar":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข ลิงค์","type":"ประเภทของลิงค์","unlink":"ลบ ลิงค์","upload":"อัพโหลดไฟล์"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"วางà¹à¸šà¸šà¸•ัวอัà¸à¸©à¸£à¸˜à¸£à¸£à¸¡à¸”า","title":"วางà¹à¸šà¸šà¸•ัวอัà¸à¸©à¸£à¸˜à¸£à¸£à¸¡à¸”า"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"วางสำเนาจาà¸à¸•ัวอัà¸à¸©à¸£à¹€à¸§à¸´à¸£à¹Œà¸”","toolbar":"วางสำเนาจาà¸à¸•ัวอัà¸à¸©à¸£à¹€à¸§à¸´à¸£à¹Œà¸”"},"removeformat":{"toolbar":"ล้างรูปà¹à¸šà¸š"},"sourcearea":{"toolbar":"ดูรหัส HTML"},"specialchar":{"options":"Special Character Options","title":"à¹à¸—รà¸à¸•ัวอัà¸à¸©à¸£à¸žà¸´à¹€à¸¨à¸©","toolbar":"à¹à¸—รà¸à¸•ัวอัà¸à¸©à¸£à¸žà¸´à¹€à¸¨à¸©"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"ลัà¸à¸©à¸“ะ","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ขนาดเส้นขอบ","caption":"หัวเรื่องของตาราง","cell":{"menu":"ช่องตาราง","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ลบช่อง","merge":"ผสานช่อง","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"ระยะà¹à¸™à¸§à¸•ั้ง","cellSpace":"ระยะà¹à¸™à¸§à¸™à¸­à¸™à¸™","column":{"menu":"คอลัมน์","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ลบสดมน์"},"columns":"สดมน์","deleteTable":"ลบตาราง","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"คุณสมบัติของ ตาราง","row":{"menu":"à¹à¸–ว","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ลบà¹à¸–ว"},"rows":"à¹à¸–ว","summary":"สรุปความ","title":"คุณสมบัติของ ตาราง","toolbar":"ตาราง","widthPc":"เปอร์เซ็น","widthPx":"จุดสี","widthUnit":"width unit"},"undo":{"redo":"ทำซ้ำคำสั่ง","undo":"ยà¸à¹€à¸¥à¸´à¸à¸„ำสั่ง"},"wsc":{"btnIgnore":"ยà¸à¹€à¸§à¹‰à¸™","btnIgnoreAll":"ยà¸à¹€à¸§à¹‰à¸™à¸—ั้งหมด","btnReplace":"à¹à¸—นที่","btnReplaceAll":"à¹à¸—นที่ทั้งหมด","btnUndo":"ยà¸à¹€à¸¥à¸´à¸","changeTo":"à¹à¸à¹‰à¹„ขเป็น","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ไม่ได้ติดตั้งระบบตรวจสอบคำสะà¸à¸”. ต้องà¸à¸²à¸£à¸•ิดตั้งไหมครับ?","manyChanges":"ตรวจสอบคำสะà¸à¸”เสร็จสิ้น:: à¹à¸à¹‰à¹„ข %1 คำ","noChanges":"ตรวจสอบคำสะà¸à¸”เสร็จสิ้น: ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¸„ำใดๆ","noMispell":"ตรวจสอบคำสะà¸à¸”เสร็จสิ้น: ไม่พบคำสะà¸à¸”ผิด","noSuggestions":"- ไม่มีคำà¹à¸™à¸°à¸™à¸³à¹ƒà¸”ๆ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ไม่พบในดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µ","oneChange":"ตรวจสอบคำสะà¸à¸”เสร็จสิ้น: à¹à¸à¹‰à¹„ข1คำ","progress":"à¸à¸³à¸¥à¸±à¸‡à¸•รวจสอบคำสะà¸à¸”...","title":"Spell Check","toolbar":"ตรวจà¸à¸²à¸£à¸ªà¸°à¸à¸”คำ"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/tr.js b/mod/ckeditor/vendors/ckeditor/lang/tr.js
new file mode 100644
index 000000000..5682b7fb4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/tr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['tr']={"dir":"ltr","editor":"Zengin Metin Editörü","common":{"editorHelp":"Yardım için ALT 0 tuşuna basın","browseServer":"Sunucuyu Gez","url":"URL","protocol":"Protokol","upload":"Karşıya Yükle","uploadSubmit":"Sunucuya Yolla","image":"Resim","flash":"Flash","form":"Form","checkbox":"Onay Kutusu","radio":"Seçenek Düğmesi","textField":"Metin Girişi","textarea":"Çok Satırlı Metin","hiddenField":"Gizli Veri","button":"Düğme","select":"Seçim Menüsü","imageButton":"Resimli Düğme","notSet":"<tanımlanmamış>","id":"Kimlik","name":"Ad","langDir":"Dil Yönü","langDirLtr":"Soldan Sağa (LTR)","langDirRtl":"Sağdan Sola (RTL)","langCode":"Dil Kodlaması","longDescr":"Uzun Tanımlı URL","cssClass":"Biçem Sayfası Sınıfları","advisoryTitle":"Danışma Başlığı","cssStyle":"Biçem","ok":"Tamam","cancel":"İptal","close":"Kapat","preview":"Ön gösterim","resize":"Boyutlandırmak için sürükle","generalTab":"Genel","advancedTab":"Gelişmiş","validateNumberFailed":"Bu değer sayı değildir.","confirmNewPage":"İceriğiniz kayıt edilmediğinden dolayı kaybolacaktır. Yeni bir sayfa yüklemek istediğinize eminsiniz?","confirmCancel":"Bazı seçenekler değişmiştir. Dialog penceresini kapatmak istediğinize eminmisiniz?","options":"Seçenekler","target":"Hedef","targetNew":"Yeni Pencere (_blank)","targetTop":"Enüst Pencere (_top)","targetSelf":"Aynı Pencere (_self)","targetParent":"Ana Pencere (_parent)","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","styles":"Stil","cssClasses":"Stil sayfası Sınıfı","width":"Genişlik","height":"Yükseklik","align":"Hizalama","alignLeft":"Sol","alignRight":"Sağ","alignCenter":"Merkez","alignTop":"Tepe","alignMiddle":"Orta","alignBottom":"Alt","invalidValue":"Geçersiz değer.","invalidHeight":"Yükseklik sayı olmalıdır.","invalidWidth":"Genişlik bir sayı olmalıdır.","invalidCssLength":"Belirttiğiniz sayı \"%1\" alanı için pozitif bir sayı CSS birim değeri olmalıdır (px, %, in, cm, mm, em, ex, pt, veya pc).","invalidHtmlLength":"Belirttiğiniz sayı \"%1\" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).","invalidInlineStyle":"Noktalı virgülle ayrılmış: \"değer adı,\" inline stil için belirtilen değer biçiminde bir veya daha fazla dizilerden oluşmalıdır.","cssLengthTooltip":"Pikseller için bir numara girin veya geçerli bir CSS numarası (px, %, in, cm, mm, em, ex, pt, veya pc).","unavailable":"%1<span class=\"cke_accessibility\">, hazır değildir</span>"},"about":{"copy":"Copyright &copy; $1. Tüm hakları saklıdır.","dlgTitle":"CKEditor Hakkında","help":"Yardım için $1 kontrol edin.","moreInfo":"Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:","title":"CKEditor Hakkında","userGuide":"CKEditor Kullanıcı Kılavuzu"},"basicstyles":{"bold":"Kalın","italic":"İtalik","strike":"Üstü Çizgili","subscript":"Alt Simge","superscript":"Üst Simge","underline":"Altı Çizgili"},"blockquote":{"toolbar":"Blok Oluştur"},"clipboard":{"copy":"Kopyala","copyError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.","cut":"Kes","cutError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.","paste":"Yapıştır","pasteArea":"Yapıştırma Alanı","pasteMsg":"Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.","securityMsg":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..","title":"Yapıştır"},"contextmenu":{"options":"İçerik Menüsü Seçenekleri"},"toolbar":{"toolbarCollapse":"Araç çubuklarını topla","toolbarExpand":"Araç çubuklarını aç","toolbarGroups":{"document":"Belge","clipboard":"Pano/Geri al","editing":"Düzenleme","forms":"Formlar","basicstyles":"Temel Stiller","paragraph":"Paragraf","links":"Bağlantılar","insert":"Ekle","styles":"Stiller","colors":"Renkler","tools":"Araçlar"},"toolbars":"Araç çubukları Editörü"},"elementspath":{"eleLabel":"Elementlerin yolu","eleTitle":"%1 elementi"},"list":{"bulletedlist":"Simgeli Liste","numberedlist":"Numaralı Liste"},"indent":{"indent":"Sekme Arttır","outdent":"Sekme Azalt"},"format":{"label":"Biçim","panelTitle":"Biçim","tag_address":"Adres","tag_div":"Paragraf (DIV)","tag_h1":"Başlık 1","tag_h2":"Başlık 2","tag_h3":"Başlık 3","tag_h4":"Başlık 4","tag_h5":"Başlık 5","tag_h6":"Başlık 6","tag_p":"Normal","tag_pre":"Biçimli"},"horizontalrule":{"toolbar":"Yatay Satır Ekle"},"image":{"alertUrl":"Lütfen resmin URL'sini yazınız","alt":"Alternatif Yazı","border":"Kenar","btnUpload":"Sunucuya Yolla","button2Img":"Seçili resim butonunu basit resime çevirmek istermisiniz?","hSpace":"Yatay Boşluk","img2Button":"Seçili olan resimi, resimli butona çevirmek istermisiniz?","infoTab":"Resim Bilgisi","linkTab":"Köprü","lockRatio":"Oranı Kilitle","menu":"Resim Özellikleri","resetSize":"Boyutu Başa Döndür","title":"Resim Özellikleri","titleButton":"Resimli Düğme Özellikleri","upload":"Karşıya Yükle","urlMissing":"Resmin URL kaynağı eksiktir.","vSpace":"Dikey Boşluk","validateBorder":"Çerçeve tam sayı olmalıdır.","validateHSpace":"HSpace tam sayı olmalıdır.","validateVSpace":"VSpace tam sayı olmalıdır."},"fakeobjects":{"anchor":"Bağlantı","flash":"Flash Animasyonu","hiddenfield":"Gizli Alan","iframe":"IFrame","unknown":"Bilinmeyen Nesne"},"link":{"acccessKey":"Erişim Tuşu","advanced":"Gelişmiş","advisoryContentType":"Danışma İçerik Türü","advisoryTitle":"Danışma Başlığı","anchor":{"toolbar":"Bağlantı Ekle/Düzenle","menu":"Bağlantı Özellikleri","title":"Bağlantı Özellikleri","name":"Bağlantı Adı","errorName":"Lütfen bağlantı için ad giriniz","remove":"Bağlantıyı Kaldır"},"anchorId":"Eleman Kimlik Numarası ile","anchorName":"Bağlantı Adı ile","charset":"Bağlı Kaynak Karakter Gurubu","cssClasses":"Biçem Sayfası Sınıfları","emailAddress":"E-Posta Adresi","emailBody":"İleti Gövdesi","emailSubject":"İleti Konusu","id":"Id","info":"Link Bilgisi","langCode":"Dil Yönü","langDir":"Dil Yönü","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","menu":"Link Düzenle","name":"Ad","noAnchors":"(Bu belgede hiç çapa yok)","noEmail":"Lütfen E-posta adresini yazın","noUrl":"Lütfen Link URL'sini yazın","other":"<diğer>","popupDependent":"Bağımlı (Netscape)","popupFeatures":"Yeni Açılan Pencere Özellikleri","popupFullScreen":"Tam Ekran (IE)","popupLeft":"Sola Göre Konum","popupLocationBar":"Yer Çubuğu","popupMenuBar":"Menü Çubuğu","popupResizable":"Resizable","popupScrollBars":"Kaydırma Çubukları","popupStatusBar":"Durum Çubuğu","popupToolbar":"Araç Çubuğu","popupTop":"Yukarıya Göre Konum","rel":"İlişki","selectAnchor":"Bağlantı Seç","styles":"Biçem","tabIndex":"Sekme İndeksi","target":"Hedef","targetFrame":"<çerçeve>","targetFrameName":"Hedef Çerçeve Adı","targetPopup":"<yeni açılan pencere>","targetPopupName":"Yeni Açılan Pencere Adı","title":"Link","toAnchor":"Bu sayfada çapa","toEmail":"E-Posta","toUrl":"URL","toolbar":"Link Ekle/Düzenle","type":"Link Türü","unlink":"Köprü Kaldır","upload":"Karşıya Yükle"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Büyült","minimize":"Küçült"},"pastetext":{"button":"Düz Metin Olarak Yapıştır","title":"Düz Metin Olarak Yapıştır"},"pastefromword":{"confirmCleanup":"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?","error":"Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir","title":"Word'den Yapıştır","toolbar":"Word'den Yapıştır"},"removeformat":{"toolbar":"Biçimi Kaldır"},"sourcearea":{"toolbar":"Kaynak"},"specialchar":{"options":"Özel Karakter Seçenekleri","title":"Özel Karakter Seç","toolbar":"Özel Karakter Ekle"},"scayt":{"about":"SCAYT'ı hakkında","aboutTab":"Hakkında","addWord":"Kelime Ekle","allCaps":"Tüm büyük küçük kelimeleri yoksay","dic_create":"Oluştur","dic_delete":"Sil","dic_field_name":"Sözlük adı","dic_info":"Başlangıçta Kullanıcı Sözlüğü bir çerezde saklanır. Ancak, Çerezler boyutu sınırlıdır. Kullanıcı Sözlüğü, çerezin içinde saklanamayacağı bir noktada, bizim sunucularımızın içindeki sözlükte saklanabilir. Bizim sunucu üzerinde kişisel Sözlük saklamanız için, Sözlüğe bir ad belirtmelisiniz. Eğer zaten bir saklı Sözlük varsa, lütfen adını yazın ve Geri Yükle düğmesini tıklayın.","dic_rename":"Yeniden adlandır","dic_restore":"Geri al","dictionariesTab":"Sözlükler","disable":"SCAYT'ı pasifleştir","emptyDic":"Sözlük adı boş olamaz.","enable":"SCAYT'ı etkinleştir","ignore":"Yoksay","ignoreAll":"Tümünü Yoksay","ignoreDomainNames":"Domain adlarını yoksay","langs":"Diller","languagesTab":"Diller","mixedCase":"Karışık büyüklük ile Sözcükler yoksay","mixedWithDigits":"Sayılarla Kelimeler yoksay","moreSuggestions":"Daha fazla öneri","opera_title":"Opera tarafından desteklenmemektedir","options":"Seçenekler","optionsTab":"Seçenekler","title":"Girmiş olduğunuz kelime denetimi","toggle":"SCAYT'ı değiştir","noSuggestions":"No suggestion"},"stylescombo":{"label":"Biçem","panelTitle":"Stilleri Düzenliyor","panelTitle1":"Blok Stilleri","panelTitle2":"Inline Stilleri","panelTitle3":"Nesne Stilleri"},"table":{"border":"Kenar Kalınlığı","caption":"Başlık","cell":{"menu":"Hücre","insertBefore":"Hücre Ekle - Önce","insertAfter":"Hücre Ekle - Sonra","deleteCell":"Hücre Sil","merge":"Hücreleri Birleştir","mergeRight":"Birleştir - Sağdaki İle ","mergeDown":"Birleştir - Aşağıdaki İle ","splitHorizontal":"Hücreyi Yatay Böl","splitVertical":"Hücreyi Dikey Böl","title":"Hücre Özellikleri","cellType":"Hücre Tipi","rowSpan":"Satırlar Mesafesi (Span)","colSpan":"Sütünlar Mesafesi (Span)","wordWrap":"Kelime Kaydırma","hAlign":"Düşey Hizalama","vAlign":"Yataş Hizalama","alignBaseline":"Tabana","bgColor":"Arkaplan Rengi","borderColor":"Çerçeve Rengi","data":"Veri","header":"Başlık","yes":"Evet","no":"Hayır","invalidWidth":"Hücre genişliği sayı olmalıdır.","invalidHeight":"Hücre yüksekliği sayı olmalıdır.","invalidRowSpan":"Satırların mesafesi tam sayı olmalıdır.","invalidColSpan":"Sütünların mesafesi tam sayı olmalıdır.","chooseColor":"Seçiniz"},"cellPad":"Izgara yazı arası","cellSpace":"Izgara kalınlığı","column":{"menu":"Sütun","insertBefore":"Kolon Ekle - Önce","insertAfter":"Kolon Ekle - Sonra","deleteColumn":"Sütun Sil"},"columns":"Sütunlar","deleteTable":"Tabloyu Sil","headers":"Başlıklar","headersBoth":"Her İkisi","headersColumn":"İlk Sütun","headersNone":"Yok","headersRow":"İlk Satır","invalidBorder":"Çerceve büyüklüklüğü sayı olmalıdır.","invalidCellPadding":"Hücre aralığı (padding) sayı olmalıdır.","invalidCellSpacing":"Hücre boşluğu (spacing) sayı olmalıdır.","invalidCols":"Sütün sayısı 0 sayısından büyük olmalıdır.","invalidHeight":"Tablo yüksekliği sayı olmalıdır.","invalidRows":"Satır sayısı 0 sayısından büyük olmalıdır.","invalidWidth":"Tablo genişliği sayı olmalıdır.","menu":"Tablo Özellikleri","row":{"menu":"Satır","insertBefore":"Satır Ekle - Önce","insertAfter":"Satır Ekle - Sonra","deleteRow":"Satır Sil"},"rows":"Satırlar","summary":"Özet","title":"Tablo Özellikleri","toolbar":"Tablo","widthPc":"yüzde","widthPx":"piksel","widthUnit":"genişlik birimi"},"undo":{"redo":"Tekrarla","undo":"Geri Al"},"wsc":{"btnIgnore":"Yoksay","btnIgnoreAll":"Tümünü Yoksay","btnReplace":"Değiştir","btnReplaceAll":"Tümünü Değiştir","btnUndo":"Geri Al","changeTo":"Şuna değiştir:","errorLoading":"Uygulamada yüklerken hata oluştu: %s.","ieSpellDownload":"Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?","manyChanges":"Yazım denetimi tamamlandı: %1 kelime değiştirildi","noChanges":"Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi","noMispell":"Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı","noSuggestions":"- Öneri Yok -","notAvailable":"Üzügünüz, bu servis şuanda hizmet dışıdır.","notInDic":"Sözlükte Yok","oneChange":"Yazım denetimi tamamlandı: Bir kelime değiştirildi","progress":"Yazım denetimi işlemde...","title":"Yazımı Denetle","toolbar":"Yazım Denetimi"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/ug.js b/mod/ckeditor/vendors/ckeditor/lang/ug.js
new file mode 100644
index 000000000..4b166ddca
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/ug.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ug']={"dir":"rtl","editor":"تەھرىرلىگۈچ","common":{"editorHelp":"ALT+0 نى Ø¨ÛØ³Ù‰Ù¾ ياردەمنى كۆرۈڭ","browseServer":"كۆرسىتىش Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±","url":"ئەسلى ھۆججەت","protocol":"ÙƒÛلىشىم","upload":"يۈكلە","uploadSubmit":"Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±ØºØ§ يۈكلە","image":"سۈرەت","flash":"Flash","form":"جەدۋەل","checkbox":"ÙƒÛ†Ù¾ تاللاش رامكىسى","radio":"يەككە تاللاش توپچىسى","textField":"يەككە قۇر تÛكىست","textarea":"ÙƒÛ†Ù¾ قۇر تÛكىست","hiddenField":"يوشۇرۇن دائىرە","button":"توپچا","select":"تىزىم/تىزىملىك","imageButton":"سۈرەت دائىرە","notSet":"‹تەڭشەلمىگەن›","id":"ID","name":"ئات","langDir":"تىل يۆنىلىشى","langDirLtr":"سولدىن ئوڭغا (LTR)","langDirRtl":"ئوڭدىن سولغا (RTL)","langCode":"تىل كودى","longDescr":"تەپسىلىي چۈشەندۈرۈش Ø¦Ø§Ø¯Ø±ÛØ³Ù‰","cssClass":"ئۇسلۇب خىلىنىڭ ئاتى","advisoryTitle":"ماۋزۇ","cssStyle":"قۇر ئىچىدىكى ئۇسلۇبى","ok":"جەزملە","cancel":"ۋاز ÙƒÛ•Ú†","close":"تاقا","preview":"ئالدىن كۆزەت","resize":"چوڭلۇقىنى ئۆزگەرت","generalTab":"ئادەتتىكى","advancedTab":"ئالىي","validateNumberFailed":"سان پىچىمىدا كىرگۈزۈش زۆرۈر","confirmNewPage":"نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، ÙŠÛÚ­Ù‰ پۈتۈك قۇرامسىز؟","confirmCancel":"قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟","options":"تاللانما","target":"نىشان كۆزنەك","targetNew":"ÙŠÛÚ­Ù‰ كۆزنەك (_blank)","targetTop":"پۈتۈن بەت (_top)","targetSelf":"مەزكۇر كۆزنەك (_self)","targetParent":"ئاتا كۆزنەك (_parent)","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","styles":"ئۇسلۇبلار","cssClasses":"ئۇسلۇب خىللىرى","width":"كەڭلىك","height":"ئÛگىزلىك","align":"توغرىلىنىشى","alignLeft":"سول","alignRight":"ئوڭ","alignCenter":"ئوتتۇرا","alignTop":"ئۈستى","alignMiddle":"ئوتتۇرا","alignBottom":"ئاستى","invalidValue":"Invalid value.","invalidHeight":"ئÛگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidWidth":"كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidCssLength":"بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)","invalidHtmlLength":"بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى ÙƒÛØ±Û•Ùƒ. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)","invalidInlineStyle":"ئىچكى باغلانما ئۇسلۇبى چوقۇم Ú†Ûكىتلىك Ù¾Û•Ø´ بىلەن ئايرىلغان بىر ياكى ÙƒÛ†Ù¾ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم","cssLengthTooltip":"بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى ÙƒÛØ±Û•Ùƒ. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)","unavailable":"%1<span class=\\\\\"cke_accessibility\\\\\">ØŒ ئىشلەتكىلى بولمايدۇ</span>"},"about":{"copy":"Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە","dlgTitle":"CKEditor ھەققىدە","help":"$1 نى زىيارەت قىلىپ ياردەمگە Ø¦ÛØ±Ù‰Ø´Ù‰Ú­","moreInfo":"تور تۇرايىمىزنى زىيارەت قىلىپ ÙƒÛلىشىمگە ئائىت ØªÛØ®Ù‰Ù…Û‡ ÙƒÛ†Ù¾ ئۇچۇرغا Ø¦ÛØ±Ù‰Ø´Ù‰Ú­","title":"CKEditor ھەققىدە","userGuide":"CKEditor ئىشلەتكۈچى قوللانمىسى"},"basicstyles":{"bold":"توم","italic":"يانتۇ","strike":"ئۆچۈرۈش سىزىقى","subscript":"تۆۋەن ئىندÛكس","superscript":"يۇقىرى ئىندÛكس","underline":"ئاستى سىزىق"},"blockquote":{"toolbar":"بۆلەك نەقىل"},"clipboard":{"copy":"نەشر ھوقۇقىغا ئىگە بەلگىسى","copyError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا ØªÛØ² كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ","cut":"كەس","cutError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا ØªÛØ² كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ","paste":"چاپلا","pasteArea":"چاپلاش دائىرىسى","pasteMsg":"ھەرپتاختا ØªÛØ² كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى Ø¨ÛØ³Ù‰Ú­","securityMsg":"توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر Ù‚ÛØªÙ‰Ù… چاپلىشىڭىز ÙƒÛØ±Û•Ùƒ.","title":"چاپلا"},"contextmenu":{"options":"قىسقا يول تىزىملىك تاللانمىسى"},"toolbar":{"toolbarCollapse":"قورال بالداقنى قاتلا","toolbarExpand":"قورال بالداقنى ياي","toolbarGroups":{"document":"پۈتۈك","clipboard":"چاپلاش تاختىسى/ÙŠÛنىۋال","editing":"تەھرىر","forms":"جەدۋەل","basicstyles":"ئاساسىي ئۇسلۇب","paragraph":"ئابزاس","links":"ئۇلانما","insert":"قىستۇر","styles":"ئۇسلۇب","colors":"رەڭ","tools":"قورال"},"toolbars":"قورال بالداق"},"elementspath":{"eleLabel":"ئÛÙ„ÛÙ…Ûنت يولى","eleTitle":"%1 ئÛÙ„ÛÙ…Ûنت"},"list":{"bulletedlist":"تۈر بەلگە تىزىمى","numberedlist":"تەرتىپ نومۇر تىزىمى"},"indent":{"indent":"تارايت","outdent":"كەڭەيت"},"format":{"label":"پىچىم","panelTitle":"پىچىم","tag_address":"Ø¦Ø§Ø¯Ø±ÛØ³","tag_div":"ئابزاس (DIV)","tag_h1":"ماۋزۇ 1","tag_h2":"ماۋزۇ 2","tag_h3":"ماۋزۇ 3","tag_h4":"ماۋزۇ 4","tag_h5":"ماۋزۇ 5","tag_h6":"ماۋزۇ 6","tag_p":"ئادەتتىكى","tag_pre":"تىزىلغان پىچىم"},"horizontalrule":{"toolbar":"توغرا سىزىق قىستۇر"},"image":{"alertUrl":"سۈرەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ù†Ù‰ كىرگۈزۈڭ","alt":"تÛكىست ئالماشتۇر","border":"گىرۋەك چوڭلۇقى","btnUpload":"Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±ØºØ§ يۈكلە","button2Img":"نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟","hSpace":"توغرىسىغا ئارىلىقى","img2Button":"نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟","infoTab":"سۈرەت","linkTab":"ئۇلانما","lockRatio":"نىسبەتنى قۇلۇپلا","menu":"سۈرەت خاسلىقى","resetSize":"ئەسلى Ú†ÙˆÚ­Ù„Û‡Ù‚","title":"سۈرەت خاسلىقى","titleButton":"سۈرەت دائىرە خاسلىقى","upload":"يۈكلە","urlMissing":"سۈرەتنىڭ ئەسلى ھۆججەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰ ÙƒÛ•Ù…","vSpace":"بويىغا ئارىلىقى","validateBorder":"گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ","validateHSpace":"توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ","validateVSpace":"بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ"},"fakeobjects":{"anchor":"لەڭگەرلىك نۇقتا","flash":"Flash جانلاندۇرۇم","hiddenfield":"يوشۇرۇن دائىرە","iframe":"IFrame","unknown":"يوچۇن Ù†Û•Ú­"},"link":{"acccessKey":"زىيارەت كۇنۇپكا","advanced":"ئالىي","advisoryContentType":"مەزمۇن تىپى","advisoryTitle":"ماۋزۇ","anchor":{"toolbar":"لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە","menu":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","title":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","name":"لەڭگەرلىك نۇقتا ئاتى","errorName":"لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ","remove":"لەڭگەرلىك نۇقتا ئۆچۈر"},"anchorId":"لەڭگەرلىك نۇقتا ID سى بويىچە","anchorName":"لەڭگەرلىك نۇقتا ئاتى بويىچە","charset":"ھەرپ كودلىنىشى","cssClasses":"ئۇسلۇب خىلى ئاتى","emailAddress":"Ø¦Ø§Ø¯Ø±ÛØ³","emailBody":"مەزمۇن","emailSubject":"ماۋزۇ","id":"ID","info":"ئۇلانما ئۇچۇرى","langCode":"تىل كودى","langDir":"تىل يۆنىلىشى","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","menu":"ئۇلانما تەھرىر","name":"ئات","noAnchors":"(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)","noEmail":"ئÛلخەت Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ù†Ù‰ كىرگۈزۈڭ","noUrl":"ئۇلانما Ø¦Ø§Ø¯Ø±ÛØ³Ù‰Ù†Ù‰ كىرگۈزۈڭ","other":"‹باشقا›","popupDependent":"تەۋە (NS)","popupFeatures":"قاڭقىش كۆزنەك خاسلىقى","popupFullScreen":"پۈتۈن ئÛكران (IE)","popupLeft":"سول","popupLocationBar":"Ø¦Ø§Ø¯Ø±ÛØ³ بالداق","popupMenuBar":"تىزىملىك بالداق","popupResizable":"چوڭلۇقى ئۆزگەرتىشچان","popupScrollBars":"دومىلىما سۈرگۈچ","popupStatusBar":"ھالەت بالداق","popupToolbar":"قورال بالداق","popupTop":"ئوڭ","rel":"باغلىنىش","selectAnchor":"بىر لەڭگەرلىك نۇقتا تاللاڭ","styles":"قۇر ئىچىدىكى ئۇسلۇبى","tabIndex":"Tab تەرتىپى","target":"نىشان","targetFrame":"‹كاندۇك›","targetFrameName":"نىشان كاندۇك ئاتى","targetPopup":"‹قاڭقىش كۆزنەك›","targetPopupName":"قاڭقىش كۆزنەك ئاتى","title":"ئۇلانما","toAnchor":"بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى","toEmail":"ئÛلخەت","toUrl":"Ø¦Ø§Ø¯Ø±ÛØ³","toolbar":"ئۇلانما قىستۇر/تەھرىرلە","type":"ئۇلانما تىپى","unlink":"ئۇلانما بىكار قىل","upload":"يۈكلە"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"چوڭايت","minimize":"كىچىكلەت"},"pastetext":{"button":"پىچىمى يوق تÛكىست سۈپىتىدە چاپلا","title":"پىچىمى يوق تÛكىست سۈپىتىدە چاپلا"},"pastefromword":{"confirmCleanup":"سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن ÙƒÛيىن ئاندىن چاپلامدۇ؟","error":"ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ","title":"MS Word تىن چاپلا","toolbar":"MS Word تىن چاپلا"},"removeformat":{"toolbar":"پىچىمنى چىقىرىۋەت"},"sourcearea":{"toolbar":"مەنبە"},"specialchar":{"options":"ئالاھىدە ھەرپ تاللانمىسى","title":"ئالاھىدە ھەرپ تاللاڭ","toolbar":"ئالاھىدە ھەرپ قىستۇر"},"scayt":{"about":"شۇئان ئىملا تەكشۈرۈش ھەققىدە","aboutTab":"ھەققىدە","addWord":"سۆز قوش","allCaps":"Ú†ÙˆÚ­ ھەرپتە ÙŠÛØ²Ù‰Ù„غان ھەممە سۆزگە پەرۋا قىلما","dic_create":"قۇر","dic_delete":"ئۆچۈر","dic_field_name":"لۇغەت ئاتى","dic_info":"باشلىنىشتا ئىشلەتكۈچى لۇغىتى Cookie غا ساقلىنىدۇ ئەمما Cookie نىڭ سىغىمى چەكلىك بولغاچقا، ئىشلەتكۈچى لۇغىتى كۆپىيىپ Cookie چەكلىمىسىدىن Ø¦ÛØ´Ù‰Ù¾ كەتكەندە ساقلىغىلى بولمايدۇ، بۇ چاغدا لۇغىتىڭىزنى Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±Ù‰Ù…ىزغا ساقلىسىڭىز بولىدۇ. شەخسىي لۇغىتىڭىزنى Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±Ù‰Ù…ىزغا ساقلىماقچى بولسىڭىز لۇغىتىڭىزگە ئاتتىن بىرنى قويۇڭ، ئەگەر Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ØªÛØ±Ù‰Ù…ىزدا سىزنىڭ لۇغىتىڭىزدىن بىرسى بولسا لۇغەت ئاتىنى كىرگۈزۈپ ئەسلىگە قايتۇر توپچىسىنى Ø¨ÛØ³Ù‰Ú­.","dic_rename":"ئات ئۆزگەرت","dic_restore":"ئەسلىگە كەلتۈر","dictionariesTab":"لۇغەت","disable":"شۇئان ئىملا تەكشۈرۈشنى چەكلە","emptyDic":"لۇغەت ئاتى بوش قالمايدۇ","enable":"شۇئان ئىملا تەكشۈرۈشنى قوزغات","ignore":"پەرۋا قىلما","ignoreAll":"ھەممىسىگە پەرۋا قىلما","ignoreDomainNames":"دائىرە ئاتىغا پەرۋا قىلما","langs":"تىل","languagesTab":"تىل","mixedCase":"Ú†ÙˆÚ­ كىچىك ھەرپ بىلەن ئارىلاش ÙŠÛØ²Ù‰Ù„غان سۆزگە پەرۋا قىلما","mixedWithDigits":"سان بار سۆزگە پەرۋا قىلما","moreSuggestions":"ØªÛØ®Ù‰Ù…Û‡ ÙƒÛ†Ù¾ ئىملا تەۋسىيەسى","opera_title":"Opera توركۆرگۈنى قوللىمايدۇ","options":"تاللانما","optionsTab":"تاللانما","title":"شۇئان ئىملا تەكشۈر","toggle":"شۇئان ئىملا تەكشۈرۈشنى ۋاقىتلىق توختات/قوزغات","noSuggestions":"No suggestion"},"stylescombo":{"label":"ئۇسلۇب","panelTitle":"ئۇسلۇب","panelTitle1":"بۆلەك دەرىجىسىدىكى ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى","panelTitle2":"ئىچكى باغلانما ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى","panelTitle3":"Ù†Û•Ú­ (Object) ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى"},"table":{"border":"گىرۋەك","caption":"ماۋزۇ","cell":{"menu":"كاتەكچە","insertBefore":"سولغا كاتەكچە قىستۇر","insertAfter":"ئوڭغا كاتەكچە قىستۇر","deleteCell":"كەتەكچە ئۆچۈر","merge":"كاتەكچە بىرلەشتۈر","mergeRight":"كاتەكچىنى ئوڭغا بىرلەشتۈر","mergeDown":"كاتەكچىنى ئاستىغا بىرلەشتۈر","splitHorizontal":"كاتەكچىنى توغرىسىغا بىرلەشتۈر","splitVertical":"كاتەكچىنى بويىغا بىرلەشتۈر","title":"كاتەكچە خاسلىقى","cellType":"كاتەكچە تىپى","rowSpan":"بويىغا چات ئارىسى قۇر سانى","colSpan":"توغرىسىغا چات ئارىسى ئىستون سانى","wordWrap":"ئۆزلۈكىدىن قۇر قاتلا","hAlign":"توغرىسىغا توغرىلا","vAlign":"بويىغا توغرىلا","alignBaseline":"ئاساسىي سىزىق","bgColor":"تەگلىك رەڭگى","borderColor":"گىرۋەك رەڭگى","data":"سانلىق مەلۇمات","header":"جەدۋەل باشى","yes":"ھەئە","no":"ياق","invalidWidth":"كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ","invalidHeight":"كاتەكچە ئÛگىزلىكى چوقۇم سان بولىدۇ","invalidRowSpan":"قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ","invalidColSpan":"ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ","chooseColor":"تاللاڭ"},"cellPad":"يان ئارىلىق","cellSpace":"ئارىلىق","column":{"menu":"ئىستون","insertBefore":"سولغا ئىستون قىستۇر","insertAfter":"ئوڭغا ئىستون قىستۇر","deleteColumn":"ئىستون ئۆچۈر"},"columns":"ئىستون سانى","deleteTable":"جەدۋەل ئۆچۈر","headers":"ماۋزۇ كاتەكچە","headersBoth":"بىرىنچى ئىستون Û‹Û• بىرىنچى قۇر","headersColumn":"بىرىنچى ئىستون","headersNone":"يوق","headersRow":"بىرىنچى قۇر","invalidBorder":"گىرۋەك توملۇقى چوقۇم سان بولىدۇ","invalidCellPadding":"كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ","invalidCellSpacing":"كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ","invalidCols":"بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن Ú†ÙˆÚ­ بولىدۇ","invalidHeight":"جەدۋەل ئÛگىزلىكى چوقۇم سان بولىدۇ","invalidRows":"بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن Ú†ÙˆÚ­ بولىدۇ","invalidWidth":"جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ","menu":"جەدۋەل خاسلىقى","row":{"menu":"قۇر","insertBefore":"ئۈستىگە قۇر قىستۇر","insertAfter":"ئاستىغا قۇر قىستۇر","deleteRow":"قۇر ئۆچۈر"},"rows":"قۇر سانى","summary":"ئۈزۈندە","title":"جەدۋەل خاسلىقى","toolbar":"جەدۋەل","widthPc":"پىرسەنت","widthPx":"پىكسÛÙ„","widthUnit":"كەڭلىك بىرلىكى"},"undo":{"redo":"قايتىلا ","undo":"ÙŠÛنىۋال"},"wsc":{"btnIgnore":"پەرۋا قىلما","btnIgnoreAll":"ھەممىگە پەرۋا قىلما","btnReplace":"ئالماشتۇر","btnReplaceAll":"ھەممىنى ئالماشتۇر","btnUndo":"ÙŠÛنىۋال","changeTo":"ئۆزگەرت","errorLoading":"لازىملىق Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±Ù†Ù‰ يۈكلىگەندە خاتالىق كۆرۈلدى: %s.","ieSpellDownload":"ئىملا تەكشۈرۈش قىستۇرمىسى ØªÛØ®Ù‰ ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟","manyChanges":"ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى","noChanges":"ئىملا تەكشۈرۈش تامام: Ú¾Ûچقانداق سۆزنى ئۆزگەرتمىدى","noMispell":"ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى","noSuggestions":"-تەكلىپ يوق-","notAvailable":"كەچۈرۈڭ، Ù…Û‡Ù„Ø§Ø²Ù‰Ù…ÛØªÙ‰Ø±Ù†Ù‰ ۋاقتىنچە ئىشلەتكىلى بولمايدۇ","notInDic":"لۇغەتتە يوق","oneChange":"ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى","progress":"ئىملا تەكشۈرۈۋاتىدۇ…","title":"ئىملا تەكشۈر","toolbar":"ئىملا تەكشۈر"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/uk.js b/mod/ckeditor/vendors/ckeditor/lang/uk.js
new file mode 100644
index 000000000..9a9042943
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/uk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['uk']={"dir":"ltr","editor":"ТекÑтовий редактор","common":{"editorHelp":"натиÑніть ALT 0 Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸","browseServer":"ОглÑд","url":"URL","protocol":"Протокол","upload":"ÐадіÑлати","uploadSubmit":"ÐадіÑлати на Ñервер","image":"ЗображеннÑ","flash":"Flash","form":"Форма","checkbox":"Галочка","radio":"Кнопка вибору","textField":"ТекÑтове поле","textarea":"ТекÑтова облаÑть","hiddenField":"Приховане поле","button":"Кнопка","select":"СпиÑок","imageButton":"Кнопка із зображеннÑм","notSet":"<не визначено>","id":"Ідентифікатор","name":"Ім'Ñ","langDir":"ÐапрÑмок мови","langDirLtr":"Зліва направо (LTR)","langDirRtl":"Справа наліво (RTL)","langCode":"Код мови","longDescr":"Довгий Ð¾Ð¿Ð¸Ñ URL","cssClass":"ÐšÐ»Ð°Ñ CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль CSS","ok":"ОК","cancel":"СкаÑувати","close":"Закрити","preview":"Попередній переглÑд","resize":"ПотÑгніть Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ розмірів","generalTab":"ОÑновне","advancedTab":"Додаткове","validateNumberFailed":"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” цілим чиÑлом.","confirmNewPage":"Ð’ÑÑ– незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову Ñторінку?","confirmCancel":"ДеÑкі опції змінено. Закрити вікно без Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½?","options":"Опції","target":"Ціль","targetNew":"Ðове вікно (_blank)","targetTop":"Поточне вікно (_top)","targetSelf":"Поточний фрейм/вікно (_self)","targetParent":"БатьківÑький фрейм/вікно (_parent)","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","styles":"Стиль CSS","cssClasses":"ÐšÐ»Ð°Ñ CSS","width":"Ширина","height":"ВиÑота","align":"ВирівнюваннÑ","alignLeft":"По лівому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"По верхньому краю","alignMiddle":"По Ñередині","alignBottom":"По нижньому краю","invalidValue":"Invalid value.","invalidHeight":"ВиÑота повинна бути цілим чиÑлом.","invalidWidth":"Ширина повинна бути цілим чиÑлом.","invalidCssLength":"ЗначеннÑ, вказане Ð´Ð»Ñ \"%1\" в полі повинно бути позитивним чиÑлом або без дійÑного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"ЗначеннÑ, вказане Ð´Ð»Ñ \"%1\" в полі повинно бути позитивним чиÑлом або без дійÑного виміру HTML блоку (px or %).","invalidInlineStyle":"ЗначеннÑ, вказане Ð´Ð»Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ Ñтилю повинне ÑкладатиÑÑ Ð· одного чи кількох кортежів у форматі \"ім'Ñ : значеннÑ\", розділених крапкою з комою.","cssLengthTooltip":"Введіть номер Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² пікÑелÑÑ… або чиÑло з дійÑною одиниці CSS (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, не доÑтупне</span>"},"about":{"copy":"Copyright &copy; $1. Ð’ÑÑ– права заÑтережено.","dlgTitle":"Про CKEditor","help":"Перевірте $1 Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¸.","moreInfo":"Щодо інформації з Ð»Ñ–Ñ†ÐµÐ½Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ñ–Ñ‚Ð°Ð¹Ñ‚Ðµ на наш Ñайт:","title":"Про CKEditor","userGuide":"ІнÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ ÐšÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ CKEditor"},"basicstyles":{"bold":"Жирний","italic":"КурÑив","strike":"ЗакреÑлений","subscript":"Ðижній індекÑ","superscript":"Верхній індекÑ","underline":"ПідкреÑлений"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копіювати","copyError":"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Вашого браузера не дозволÑють редактору автоматично виконувати операції копіюваннÑ. Будь лаÑка, викориÑтовуйте клавіатуру Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ (Ctrl/Cmd+C).","cut":"Вирізати","cutError":"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Вашого браузера не дозволÑють редактору автоматично виконувати операції вирізуваннÑ. Будь лаÑка, викориÑтовуйте клавіатуру Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ (Ctrl/Cmd+X)","paste":"Ð’Ñтавити","pasteArea":"ОблаÑть вÑтавки","pasteMsg":"Будь лаÑка, вÑтавте інформацію з буфера обміну в цю облаÑть, кориÑтуючиÑÑŒ комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натиÑніть <STRONG>OK</STRONG>.","securityMsg":"Редактор не може отримати прÑмий доÑтуп до буферу обміну у зв'Ñзку з налаштуваннÑми Вашого браузера. Вам потрібно вÑтавити інформацію в це вікно.","title":"Ð’Ñтавити"},"contextmenu":{"options":"Опції контекÑтного меню"},"toolbar":{"toolbarCollapse":"Згорнути панель інÑтрументів","toolbarExpand":"Розгорнути панель інÑтрументів","toolbarGroups":{"document":"Документ","clipboard":"Буфер обміну / СкаÑувати","editing":"РедагуваннÑ","forms":"Форми","basicstyles":"ОÑновний Стиль","paragraph":"Параграф","links":"ПоÑиланнÑ","insert":"Ð’Ñтавити","styles":"Стилі","colors":"Кольори","tools":"ІнÑтрументи"},"toolbars":"Панель інÑтрументів редактора"},"elementspath":{"eleLabel":"ШлÑÑ…","eleTitle":"%1 елемент"},"list":{"bulletedlist":"Маркірований ÑпиÑок","numberedlist":"Ðумерований ÑпиÑок"},"indent":{"indent":"Збільшити відÑтуп","outdent":"Зменшити відÑтуп"},"format":{"label":"ФорматуваннÑ","panelTitle":"Ð¤Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð³Ñ€Ð°Ñ„Ð°","tag_address":"ÐдреÑа","tag_div":"Ðормальний (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Ðормальний","tag_pre":"Форматований"},"horizontalrule":{"toolbar":"Горизонтальна лініÑ"},"image":{"alertUrl":"Будь лаÑка, вкажіть URL зображеннÑ","alt":"Ðльтернативний текÑÑ‚","border":"Рамка","btnUpload":"ÐадіÑлати на Ñервер","button2Img":"Бажаєте перетворити обрану кнопку-Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° проÑте зображеннÑ?","hSpace":"Гориз. відÑтуп","img2Button":"Бажаєте перетворити обране Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° кнопку-зображеннÑ?","infoTab":"Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ зображеннÑ","linkTab":"ПоÑиланнÑ","lockRatio":"Зберегти пропорції","menu":"ВлаÑтивоÑті зображеннÑ","resetSize":"ОчиÑтити Ð¿Ð¾Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñ–Ð²","title":"ВлаÑтивоÑті зображеннÑ","titleButton":"ВлаÑтивоÑті кнопки із зображеннÑм","upload":"ÐадіÑлати","urlMissing":"Вкажіть URL зображеннÑ.","vSpace":"Верт. відÑтуп","validateBorder":"Ширина рамки повинна бути цілим чиÑлом.","validateHSpace":"Гориз. відÑтуп повинен бути цілим чиÑлом.","validateVSpace":"Верт. відÑтуп повинен бути цілим чиÑлом."},"fakeobjects":{"anchor":"Якір","flash":"Flash-анімаціÑ","hiddenfield":"Приховані ПолÑ","iframe":"IFrame","unknown":"Ðевідомий об'єкт"},"link":{"acccessKey":"ГарÑча клавіша","advanced":"Додаткове","advisoryContentType":"Тип вміÑту","advisoryTitle":"Заголовок","anchor":{"toolbar":"Ð’Ñтавити/Редагувати Ñкір","menu":"ВлаÑтивоÑті ÑкорÑ","title":"ВлаÑтивоÑті ÑкорÑ","name":"Ім'Ñ ÑкорÑ","errorName":"Будь лаÑка, вкажіть ім'Ñ ÑкорÑ","remove":"Прибрати Ñкір"},"anchorId":"За ідентифікатором елементу","anchorName":"За ім'Ñм елементу","charset":"КодуваннÑ","cssClasses":"ÐšÐ»Ð°Ñ CSS","emailAddress":"ÐдреÑа ел. пошти","emailBody":"Тіло повідомленнÑ","emailSubject":"Тема лиÑта","id":"Ідентифікатор","info":"Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑиланнÑ","langCode":"Код мови","langDir":"ÐапрÑмок мови","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","menu":"Ð’Ñтавити поÑиланнÑ","name":"Ім'Ñ","noAnchors":"(Ð’ цьому документі немає Ñкорів)","noEmail":"Будь лаÑка, вкажіть Ð°Ð´Ñ€ÐµÑ ÐµÐ». пошти","noUrl":"Будь лаÑка, вкажіть URL поÑиланнÑ","other":"<інший>","popupDependent":"Залежний (Netscape)","popupFeatures":"ВлаÑтивоÑті випливаючого вікна","popupFullScreen":"Повний екран (IE)","popupLeft":"ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ð·Ð»Ñ–Ð²Ð°","popupLocationBar":"Панель локації","popupMenuBar":"Панель меню","popupResizable":"МаÑштабоване","popupScrollBars":"Стрічки прокрутки","popupStatusBar":"РÑдок ÑтатуÑу","popupToolbar":"Панель інÑтрументів","popupTop":"ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ð·Ð²ÐµÑ€Ñ…Ñƒ","rel":"Зв'Ñзок","selectAnchor":"Оберіть Ñкір","styles":"Стиль CSS","tabIndex":"ПоÑлідовніÑть переходу","target":"Ціль","targetFrame":"<фрейм>","targetFrameName":"Ім'Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ фрейму","targetPopup":"<випливаюче вікно>","targetPopupName":"Ім'Ñ Ð²Ð¸Ð¿Ð»Ð¸Ð²Ð°ÑŽÑ‡Ð¾Ð³Ð¾ вікна","title":"ПоÑиланнÑ","toAnchor":"Якір на цю Ñторінку","toEmail":"Ел. пошта","toUrl":"URL","toolbar":"Ð’Ñтавити/Редагувати поÑиланнÑ","type":"Тип поÑиланнÑ","unlink":"Видалити поÑиланнÑ","upload":"ÐадіÑлати"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"МакÑимізувати","minimize":"Мінімізувати"},"pastetext":{"button":"Ð’Ñтавити тільки текÑÑ‚","title":"Ð’Ñтавити тільки текÑÑ‚"},"pastefromword":{"confirmCleanup":"ТекÑÑ‚, що Ви намагаєтеÑÑŒ вÑтавити, Ñхожий на Ñкопійований з Word. Бажаєте очиÑтити його Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ вÑтавлÑннÑм?","error":"Ðеможливо очиÑтити Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· внутрішню помилку.","title":"Ð’Ñтавити з Word","toolbar":"Ð’Ñтавити з Word"},"removeformat":{"toolbar":"ОчиÑтити форматуваннÑ"},"sourcearea":{"toolbar":"Джерело"},"specialchar":{"options":"Опції","title":"Оберіть Ñпеціальний Ñимвол","toolbar":"Спеціальний Ñимвол"},"scayt":{"about":"Про SCAYT","aboutTab":"Про SCAYT","addWord":"Додати Ñлово","allCaps":"ПропуÑтити пропиÑні Ñлова","dic_create":"Створити","dic_delete":"Видалити","dic_field_name":"Ðазва Ñловника","dic_info":"Як правило, кориÑтувацькі Ñловники зберігаютьÑÑ Ñƒ cookie-файлах. Однак, cookie-файли мають Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір. Якщо кориÑтувацький Ñловник зроÑтає в обÑÑзі наÑтільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому Ñервері. Щоб зберегти Ваш перÑональний Ñловник на нашому Ñервері необхідно вказати назву Ñловника. Якщо Ви вже зберігали Ñловник на Ñервері, будь лаÑка, вкажіть назву збереженого Ñловника Ñ– натиÑніть кнопку Відновити.","dic_rename":"Перейменувати","dic_restore":"Відновити","dictionariesTab":"Словники","disable":"Вимкнути SCAYT","emptyDic":"Ðазва Ñловника повинна бути вказана.","enable":"Ввімкнути SCAYT","ignore":"ПропуÑтити","ignoreAll":"ПропуÑтити вÑÑ–","ignoreDomainNames":"ПропуÑтити доменні назви","langs":"Мови","languagesTab":"Мови","mixedCase":"ПропуÑтити Ñлова зі змішаним регіÑтром","mixedWithDigits":"ПропуÑтити Ñлова, що міÑÑ‚Ñть цифри","moreSuggestions":"Більше варіантів","opera_title":"Ðе підтримуєтьÑÑ Ð² Opera","options":"Опції","optionsTab":"Опції","title":"Перефірка орфографії по мірі набору","toggle":"Перемкнути SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стиль","panelTitle":"Стилі форматуваннÑ","panelTitle1":"Блочні Ñтилі","panelTitle2":"РÑдкові Ñтилі","panelTitle3":"Об'єктні Ñтилі"},"table":{"border":"Розмір рамки","caption":"Заголовок таблиці","cell":{"menu":"Комірки","insertBefore":"Ð’Ñтавити комірку перед","insertAfter":"Ð’Ñтавити комірку піÑлÑ","deleteCell":"Видалити комірки","merge":"Об'єднати комірки","mergeRight":"Об'єднати Ñправа","mergeDown":"Об'єднати донизу","splitHorizontal":"Розділити комірку по горизонталі","splitVertical":"Розділити комірку по вертикалі","title":"ВлаÑтивоÑті комірки","cellType":"Тип комірки","rowSpan":"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ€Ñдків","colSpan":"Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñтовпців","wordWrap":"ÐвтоперенеÑÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту","hAlign":"Гориз. вирівнюваннÑ","vAlign":"Верт. вирівнюваннÑ","alignBaseline":"По базовій лінії","bgColor":"Колір фону","borderColor":"Колір рамки","data":"Дані","header":"Заголовок","yes":"Так","no":"ÐÑ–","invalidWidth":"Ширина комірки повинна бути цілим чиÑлом.","invalidHeight":"ВиÑота комірки повинна бути цілим чиÑлом.","invalidRowSpan":"КількіÑть об'єднуваних Ñ€Ñдків повинна бути цілим чиÑлом.","invalidColSpan":"КількіÑть об'єднуваних Ñтовбців повинна бути цілим чиÑлом.","chooseColor":"Обрати"},"cellPad":"Внутр. відÑтуп","cellSpace":"Проміжок","column":{"menu":"Стовбці","insertBefore":"Ð’Ñтавити Ñтовбець перед","insertAfter":"Ð’Ñтавити Ñтовбець піÑлÑ","deleteColumn":"Видалити Ñтовбці"},"columns":"Стовбці","deleteTable":"Видалити таблицю","headers":"Заголовки Ñтовбців/Ñ€Ñдків","headersBoth":"Стовбці Ñ– Ñ€Ñдки","headersColumn":"Стовбці","headersNone":"Без заголовків","headersRow":"РÑдки","invalidBorder":"Розмір рамки повинен бути цілим чиÑлом.","invalidCellPadding":"Внутр. відÑтуп комірки повинен бути цілим чиÑлом.","invalidCellSpacing":"Проміжок між комірками повинен бути цілим чиÑлом.","invalidCols":"КількіÑть Ñтовбців повинна бути більшою 0.","invalidHeight":"ВиÑота таблиці повинна бути цілим чиÑлом.","invalidRows":"КількіÑть Ñ€Ñдків повинна бути більшою 0.","invalidWidth":"Ширина таблиці повинна бути цілим чиÑлом.","menu":"ВлаÑтивоÑті таблиці","row":{"menu":"РÑдки","insertBefore":"Ð’Ñтавити Ñ€Ñдок перед","insertAfter":"Ð’Ñтавити Ñ€Ñдок піÑлÑ","deleteRow":"Видалити Ñ€Ñдки"},"rows":"РÑдки","summary":"Детальний Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑƒ таблиці","title":"ВлаÑтивоÑті таблиці","toolbar":"ТаблицÑ","widthPc":"відÑотків","widthPx":"пікÑелів","widthUnit":"Одиниці вимір."},"undo":{"redo":"Повторити","undo":"Повернути"},"wsc":{"btnIgnore":"ПропуÑтити","btnIgnoreAll":"ПропуÑтити вÑе","btnReplace":"Замінити","btnReplaceAll":"Замінити вÑе","btnUndo":"Ðазад","changeTo":"Замінити на","errorLoading":"Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ : %s.","ieSpellDownload":"Модуль перевірки орфографії не вÑтановлено. Бажаєте завантажити його зараз?","manyChanges":"Перевірку орфографії завершено: 1% Ñлів(ова) змінено","noChanges":"Перевірку орфографії завершено: жодне Ñлово не змінено","noMispell":"Перевірку орфографії завершено: помилок не знайдено","noSuggestions":"- немає варіантів -","notAvailable":"Вибачте, але ÑÐµÑ€Ð²Ñ–Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– недоÑтупний.","notInDic":"Ðемає в Ñловнику","oneChange":"Перевірку орфографії завершено: змінено одне Ñлово","progress":"ВиконуєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° орфографії...","title":"Перевірка орфографії","toolbar":"Перевірити орфографію"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/vi.js b/mod/ckeditor/vendors/ckeditor/lang/vi.js
new file mode 100644
index 000000000..146e1f499
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/vi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['vi']={"dir":"ltr","editor":"Bá»™ soạn thảo","common":{"editorHelp":"Nhấn ALT + 0 để được giúp đỡ","browseServer":"Duyệt trên máy chá»§","url":"URL","protocol":"Giao thức","upload":"Tải lên","uploadSubmit":"Tải lên máy chá»§","image":"Hình ảnh","flash":"Flash","form":"Biểu mẫu","checkbox":"Nút kiểm","radio":"Nút chá»n","textField":"Trưá»ng văn bản","textarea":"Vùng văn bản","hiddenField":"Trưá»ng ẩn","button":"Nút","select":"Ô chá»n","imageButton":"Nút hình ảnh","notSet":"<không thiết lập>","id":"Äịnh danh","name":"Tên","langDir":"Hướng ngôn ngữ","langDirLtr":"Trái sang phải (LTR)","langDirRtl":"Phải sang trái (RTL)","langCode":"Mã ngôn ngữ","longDescr":"Mô tả URL","cssClass":"Lá»›p Stylesheet","advisoryTitle":"Nhan đỠhướng dẫn","cssStyle":"Kiểu (style)","ok":"Äồng ý","cancel":"Bá» qua","close":"Äóng","preview":"Xem trước","resize":"Kéo rê để thay đổi kích cỡ","generalTab":"Tab chung","advancedTab":"Tab mở rá»™ng","validateNumberFailed":"Giá trị này không phải là số.","confirmNewPage":"Má»i thay đổi không được lưu lại, ná»™i dung này sẽ bị mất. Bạn có chắc chắn muốn tải má»™t trang má»›i?","confirmCancel":"Má»™t vài tùy chá»n đã bị thay đổi. Bạn có chắc chắn muốn đóng há»™p thoại?","options":"Tùy chá»n","target":"Äích đến","targetNew":"Cá»­a sổ má»›i (_blank)","targetTop":"Cá»­a sổ trên cùng (_top)","targetSelf":"Tại trang (_self)","targetParent":"Cá»­a sổ cha (_parent)","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","styles":"Kiểu","cssClasses":"Lá»›p CSS","width":"Chiá»u rá»™ng","height":"chiá»u cao","align":"Vị trí","alignLeft":"Trái","alignRight":"Phải","alignCenter":"Giữa","alignTop":"Trên","alignMiddle":"Giữa","alignBottom":"Dưới","invalidValue":"Invalid value.","invalidHeight":"Chiá»u cao phải là số nguyên.","invalidWidth":"Chiá»u rá»™ng phải là số nguyên.","invalidCssLength":"Giá trị quy định cho trưá»ng \"%1\" phải là má»™t số dương có hoặc không có má»™t đơn vị Ä‘o CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","invalidHtmlLength":"Giá trị quy định cho trưá»ng \"%1\" phải là má»™t số dương có hoặc không có má»™t đơn vị Ä‘o HTML hợp lệ (px hoặc %).","invalidInlineStyle":"Giá trị quy định cho kiểu ná»™i tuyến phải bao gồm má»™t hoặc nhiá»u dữ liệu vá»›i định dạng \"tên:giá trị\", cách nhau bằng dấu chấm phẩy.","cssLengthTooltip":"Nhập má»™t giá trị theo pixel hoặc má»™t số vá»›i má»™t đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","unavailable":"%1<span class=\"cke_accessibility\">, không có</span>"},"about":{"copy":"Bản quyá»n &copy; $1. Giữ toàn quyá»n.","dlgTitle":"Thông tin vá» CKEditor","help":"Kiểm tra $1 để được giúp đỡ.","moreInfo":"Vui lòng ghé thăm trang web cá»§a chúng tôi để có thông tin vá» giấy phép:","title":"Thông tin vá» CKEditor","userGuide":"Hướng dẫn sá»­ dụng CKEditor"},"basicstyles":{"bold":"Äậm","italic":"Nghiêng","strike":"Gạch xuyên ngang","subscript":"Chỉ số dưới","superscript":"Chỉ số trên","underline":"Gạch chân"},"blockquote":{"toolbar":"Khối trích dẫn"},"clipboard":{"copy":"Sao chép","copyError":"Các thiết lập bảo mật cá»§a trình duyệt không cho phép trình biên tập tá»± động thá»±c thi lệnh sao chép. Hãy sá»­ dụng bàn phím cho lệnh này (Ctrl/Cmd+C).","cut":"Cắt","cutError":"Các thiết lập bảo mật cá»§a trình duyệt không cho phép trình biên tập tá»± động thá»±c thi lệnh cắt. Hãy sá»­ dụng bàn phím cho lệnh này (Ctrl/Cmd+X).","paste":"Dán","pasteArea":"Khu vá»±c dán","pasteMsg":"Hãy dán ná»™i dung vào trong khung bên dưới, sá»­ dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Äồng ý</STRONG>.","securityMsg":"Do thiết lập bảo mật cá»§a trình duyệt nên trình biên tập không thể truy cập trá»±c tiếp vào ná»™i dung đã sao chép. Bạn cần phải dán lại ná»™i dung vào cá»­a sổ này.","title":"Dán"},"contextmenu":{"options":"Tùy chá»n menu bổ xung"},"toolbar":{"toolbarCollapse":"Thu gá»n thanh công cụ","toolbarExpand":"Mở rá»™ng thnah công cụ","toolbarGroups":{"document":"Tài liệu","clipboard":"Clipboard/Undo","editing":"Chỉnh sá»­a","forms":"Bảng biểu","basicstyles":"Kiểu cÆ¡ bản","paragraph":"Äoạn","links":"Liên kết","insert":"Chèn","styles":"Kiểu","colors":"Màu sắc","tools":"Công cụ"},"toolbars":"Thanh công cụ"},"elementspath":{"eleLabel":"Nhãn thành phần","eleTitle":"%1 thành phần"},"list":{"bulletedlist":"Chèn/Xoá Danh sách không thứ tá»±","numberedlist":"Chèn/Xoá Danh sách có thứ tá»±"},"indent":{"indent":"Dịch vào trong","outdent":"Dịch ra ngoài"},"format":{"label":"Äịnh dạng","panelTitle":"Äịnh dạng","tag_address":"Address","tag_div":"Bình thưá»ng (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Bình thưá»ng (P)","tag_pre":"Äã thiết lập"},"horizontalrule":{"toolbar":"Chèn đưá»ng phân cách ngang"},"image":{"alertUrl":"Hãy đưa vào đưá»ng dẫn cá»§a ảnh","alt":"Chú thích ảnh","border":"ÄÆ°á»ng viá»n","btnUpload":"Tải lên máy chá»§","button2Img":"Bạn có muốn chuyển nút bấm bằng ảnh được chá»n thành ảnh?","hSpace":"Khoảng đệm ngang","img2Button":"Bạn có muốn chuyển đổi ảnh được chá»n thành nút bấm bằng ảnh?","infoTab":"Thông tin cá»§a ảnh","linkTab":"Tab liên kết","lockRatio":"Giữ nguyên tá»· lệ","menu":"Thuá»™c tính cá»§a ảnh","resetSize":"Kích thước gốc","title":"Thuá»™c tính cá»§a ảnh","titleButton":"Thuá»™c tính nút cá»§a ảnh","upload":"Tải lên","urlMissing":"Thiếu đưá»ng dẫn hình ảnh","vSpace":"Khoảng đệm dá»c","validateBorder":"Chiá»u rá»™ng cá»§a đưá»ng viá»n phải là má»™t số nguyên dương","validateHSpace":"Khoảng đệm ngang phải là má»™t số nguyên dương","validateVSpace":"Khoảng đệm dá»c phải là má»™t số nguyên dương"},"fakeobjects":{"anchor":"Äiểm neo","flash":"Flash","hiddenfield":"Trưá»ng ẩn","iframe":"IFrame","unknown":"Äối tượng không rõ ràng"},"link":{"acccessKey":"Phím há»— trợ truy cập","advanced":"Mở rá»™ng","advisoryContentType":"Ná»™i dung hướng dẫn","advisoryTitle":"Nhan đỠhướng dẫn","anchor":{"toolbar":"Chèn/Sá»­a Ä‘iểm neo","menu":"Thuá»™c tính Ä‘iểm neo","title":"Thuá»™c tính Ä‘iểm neo","name":"Tên cá»§a Ä‘iểm neo","errorName":"Hãy nhập vào tên cá»§a Ä‘iểm neo","remove":"Xóa neo"},"anchorId":"Theo định danh thành phần","anchorName":"Theo tên Ä‘iểm neo","charset":"Bảng mã cá»§a tài nguyên được liên kết đến","cssClasses":"Lá»›p Stylesheet","emailAddress":"Thư Ä‘iện tá»­","emailBody":"Ná»™i dung thông Ä‘iệp","emailSubject":"Tiêu đỠthông Ä‘iệp","id":"Äịnh danh","info":"Thông tin liên kết","langCode":"Mã ngôn ngữ","langDir":"Hướng ngôn ngữ","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","menu":"Sá»­a liên kết","name":"Tên","noAnchors":"(Không có Ä‘iểm neo nào trong tài liệu)","noEmail":"Hãy đưa vào địa chỉ thư Ä‘iện tá»­","noUrl":"Hãy đưa vào đưá»ng dẫn liên kết (URL)","other":"<khác>","popupDependent":"Phụ thuá»™c (Netscape)","popupFeatures":"Äặc Ä‘iểm cá»§a cá»­a sổ Popup","popupFullScreen":"Toàn màn hình (IE)","popupLeft":"Vị trí bên trái","popupLocationBar":"Thanh vị trí","popupMenuBar":"Thanh Menu","popupResizable":"Có thể thay đổi kích cỡ","popupScrollBars":"Thanh cuá»™n","popupStatusBar":"Thanh trạng thái","popupToolbar":"Thanh công cụ","popupTop":"Vị trí phía trên","rel":"Quan hệ","selectAnchor":"Chá»n má»™t Ä‘iểm neo","styles":"Kiểu (style)","tabIndex":"Chỉ số cá»§a Tab","target":"Äích","targetFrame":"<khung>","targetFrameName":"Tên khung đích","targetPopup":"<cá»­a sổ popup>","targetPopupName":"Tên cá»­a sổ Popup","title":"Liên kết","toAnchor":"Neo trong trang này","toEmail":"Thư Ä‘iện tá»­","toUrl":"URL","toolbar":"Chèn/Sá»­a liên kết","type":"Kiểu liên kết","unlink":"Xoá liên kết","upload":"Tải lên"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Phóng to tối Ä‘a","minimize":"Thu nhá»"},"pastetext":{"button":"Dán theo định dạng văn bản thuần","title":"Dán theo định dạng văn bản thuần"},"pastefromword":{"confirmCleanup":"Văn bản bạn muốn dán có kèm định dạng cá»§a Word. Bạn có muốn loại bỠđịnh dạng Word trước khi dán?","error":"Không thể để làm sạch các dữ liệu dán do má»™t lá»—i ná»™i bá»™","title":"Dán vá»›i định dạng Word","toolbar":"Dán vá»›i định dạng Word"},"removeformat":{"toolbar":"Xoá định dạng"},"sourcearea":{"toolbar":"Mã HTML"},"specialchar":{"options":"Tùy chá»n các ký tá»± đặc biệt","title":"Hãy chá»n ký tá»± đặc biệt","toolbar":"Chèn ký tá»± đặc biệt"},"scayt":{"about":"Thông tin vá» SCAYT","aboutTab":"Thông tin","addWord":"Thêm từ","allCaps":"Không phân biệt chữ HOA chữ thưá»ng","dic_create":"Tạo","dic_delete":"Xóa","dic_field_name":"Tên từ Ä‘iển","dic_info":"Ban đầu, từ Ä‘iển ngưá»i dùng được lưu trữ trong má»™t cookie. Tuy nhiên, kích thước cookie bị giá»›i hạn. Khi ngưá»i sá»­ dụng từ Ä‘iển phát triển đến Ä‘iểm không thể được lưu trữ trong cookie, từ Ä‘iển sẽ được lưu trữ trên máy chá»§ cá»§a chúng tôi. Äể lưu trữ từ Ä‘iển cá nhân cá»§a bạn trên máy chá»§ cá»§a chúng tôi, bạn nên xác định má»™t tên cho từ Ä‘iển cá»§a bạn. Nếu bạn đã có má»™t cuốn từ Ä‘iển được lưu trữ, xin vui lòng gõ tên cá»§a nó và nhấn vào nút Khôi phục.","dic_rename":"Thay tên","dic_restore":"Phục hồi","dictionariesTab":"Từ Ä‘iển","disable":"Tắt SCAYT","emptyDic":"Tên cá»§a từ Ä‘iển không được để trống.","enable":"Bật SCAYT","ignore":"Bá» qua","ignoreAll":"Bá» qua tất cả","ignoreDomainNames":"Bá» qua tên miá»n","langs":"Ngôn ngữ","languagesTab":"Tab ngôn ngữ","mixedCase":"Không phân biệt loại chữ","mixedWithDigits":"Không phân biệt chữ và số","moreSuggestions":"Äá» xuất thêm","opera_title":"Không há»— trợ trên trình duyệt Opera","options":"Tùy chá»n","optionsTab":"Tùy chá»n","title":"Kiểm tra chính tả ngay khi gõ chữ (SCAYT)","toggle":"Bật tắt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Kiểu","panelTitle":"Phong cách định dạng","panelTitle1":"Kiểu khối","panelTitle2":"Kiểu trá»±c tiếp","panelTitle3":"Kiểu đối tượng"},"table":{"border":"Kích thước đưá»ng viá»n","caption":"Äầu Ä‘á»","cell":{"menu":"Ô","insertBefore":"Chèn ô Phía trước","insertAfter":"Chèn ô Phía sau","deleteCell":"Xoá ô","merge":"Kết hợp ô","mergeRight":"Kết hợp sang phải","mergeDown":"Kết hợp xuống dưới","splitHorizontal":"Phân tách ô theo chiá»u ngang","splitVertical":"Phân tách ô theo chiá»u dá»c","title":"Thuá»™c tính cá»§a ô","cellType":"Kiểu cá»§a ô","rowSpan":"Kết hợp hàng","colSpan":"Kết hợp cá»™t","wordWrap":"Chữ liá»n hàng","hAlign":"Canh lá» ngang","vAlign":"Canh lá» dá»c","alignBaseline":"ÄÆ°á»ng cÆ¡ sở","bgColor":"Màu ná»n","borderColor":"Màu viá»n","data":"Dữ liệu","header":"Äầu Ä‘á»","yes":"Có","no":"Không","invalidWidth":"Chiá»u rá»™ng cá»§a ô phải là má»™t số nguyên.","invalidHeight":"Chiá»u cao cá»§a ô phải là má»™t số nguyên.","invalidRowSpan":"Số hàng kết hợp phải là má»™t số nguyên.","invalidColSpan":"Số cá»™t kết hợp phải là má»™t số nguyên.","chooseColor":"Chá»n màu"},"cellPad":"Khoảng đệm giữ ô và ná»™i dung","cellSpace":"Khoảng cách giữa các ô","column":{"menu":"Cá»™t","insertBefore":"Chèn cá»™t phía trước","insertAfter":"Chèn cá»™t phía sau","deleteColumn":"Xoá cá»™t"},"columns":"Số cá»™t","deleteTable":"Xóa bảng","headers":"Äầu Ä‘á»","headersBoth":"Cả hai","headersColumn":"Cá»™t đầu tiên","headersNone":"Không có","headersRow":"Hàng đầu tiên","invalidBorder":"Kích cỡ cá»§a đưá»ng biên phải là má»™t số nguyên.","invalidCellPadding":"Khoảng đệm giữa ô và ná»™i dung phải là má»™t số nguyên.","invalidCellSpacing":"Khoảng cách giữa các ô phải là má»™t số nguyên.","invalidCols":"Số lượng cá»™t phải là má»™t số lá»›n hÆ¡n 0.","invalidHeight":"Chiá»u cao cá»§a bảng phải là má»™t số nguyên.","invalidRows":"Số lượng hàng phải là má»™t số lá»›n hÆ¡n 0.","invalidWidth":"Chiá»u rá»™ng cá»§a bảng phải là má»™t số nguyên.","menu":"Thuá»™c tính bảng","row":{"menu":"Hàng","insertBefore":"Chèn hàng phía trước","insertAfter":"Chèn hàng phía sau","deleteRow":"Xoá hàng"},"rows":"Số hàng","summary":"Tóm lược","title":"Thuá»™c tính bảng","toolbar":"Bảng","widthPc":"Phần trăm (%)","widthPx":"Äiểm ảnh (px)","widthUnit":"ÄÆ¡n vị"},"undo":{"redo":"Làm lại thao tác","undo":"Khôi phục thao tác"},"wsc":{"btnIgnore":"Bá» qua","btnIgnoreAll":"Bá» qua tất cả","btnReplace":"Thay thế","btnReplaceAll":"Thay thế tất cả","btnUndo":"Phục hồi lại","changeTo":"Chuyển thành","errorLoading":"Lá»—i khi Ä‘ang nạp dịch vụ ứng dụng: %s.","ieSpellDownload":"Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải vá» ngay bây giá»?","manyChanges":"Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi","noChanges":"Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi","noMispell":"Hoàn tất kiểm tra chính tả: Không có lá»—i chính tả","noSuggestions":"- Không đưa ra gợi ý vá» từ -","notAvailable":"Xin lá»—i, dịch vụ này hiện tại không có.","notInDic":"Không có trong từ Ä‘iển","oneChange":"Hoàn tất kiểm tra chính tả: Má»™t từ đã được thay đổi","progress":"Äang tiến hành kiểm tra chính tả...","title":"Kiểm tra chính tả","toolbar":"Kiểm tra chính tả"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/zh-cn.js b/mod/ckeditor/vendors/ckeditor/lang/zh-cn.js
new file mode 100644
index 000000000..6855084fe
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/zh-cn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh-cn']={"dir":"ltr","editor":"所è§å³æ‰€å¾—编辑器","common":{"editorHelp":"按 ALT+0 获得帮助","browseServer":"æµè§ˆæœåС噍","url":"æºæ–‡ä»¶","protocol":"åè®®","upload":"上传","uploadSubmit":"上传到æœåŠ¡å™¨ä¸Š","image":"图象","flash":"Flash","form":"表å•","checkbox":"å¤é€‰æ¡†","radio":"å•选按钮","textField":"å•行文本","textarea":"多行文本","hiddenField":"éšè—域","button":"按钮","select":"列表/èœå•","imageButton":"图åƒåŸŸ","notSet":"<没有设置>","id":"ID","name":"åç§°","langDir":"语言方å‘","langDirLtr":"ä»Žå·¦åˆ°å³ (LTR)","langDirRtl":"从å³åˆ°å·¦ (RTL)","langCode":"语言代ç ","longDescr":"详细说明地å€","cssClass":"æ ·å¼ç±»åç§°","advisoryTitle":"标题","cssStyle":"行内样å¼","ok":"确定","cancel":"å–æ¶ˆ","close":"关闭","preview":"预览","resize":"拖拽以改å˜å°ºå¯¸","generalTab":"常规","advancedTab":"高级","validateNumberFailed":"需è¦è¾“入数字格å¼","confirmNewPage":"当剿–‡æ¡£å†…容未ä¿å­˜,是å¦ç¡®è®¤æ–°å»ºæ–‡æ¡£ï¼Ÿ","confirmCancel":"部分修改尚未ä¿å­˜ï¼Œæ˜¯å¦ç¡®è®¤å…³é—­å¯¹è¯æ¡†ï¼Ÿ","options":"选项","target":"目标窗å£","targetNew":"æ–°çª—å£ (_blank)","targetTop":"整页 (_top)","targetSelf":"æœ¬çª—å£ (_self)","targetParent":"çˆ¶çª—å£ (_parent)","langDirLTR":"ä»Žå·¦åˆ°å³ (LTR)","langDirRTL":"从å³åˆ°å·¦ (RTL)","styles":"æ ·å¼","cssClasses":"æ ·å¼ç±»","width":"宽度","height":"高度","align":"坹齿–¹å¼","alignLeft":"左对é½","alignRight":"å³å¯¹é½","alignCenter":"居中","alignTop":"顶端","alignMiddle":"居中","alignBottom":"底部","invalidValue":"无效的值。","invalidHeight":"高度必须为数字格å¼","invalidWidth":"宽度必须为数字格å¼","invalidCssLength":"该字段必须为åˆå¼çš„CSS长度值,包括å•ä½(px, %, in, cm, mm, em, ex, pt 或 pc)","invalidHtmlLength":"该字段必须为åˆå¼çš„HTML长度值,包括å•ä½(px 或 %)","invalidInlineStyle":"å†…è”æ ·å¼å¿…é¡»ä¸ºæ ¼å¼æ˜¯ä»¥åˆ†å·åˆ†éš”的一个或多个“属性å : 属性值â€","cssLengthTooltip":"该字段必须为åˆå¼çš„CSS长度值,包括å•ä½(px, %, in, cm, mm, em, ex, pt 或 pc)","unavailable":"%1<span class=\"cke_accessibility\">, ä¸å¯ç”¨</span>"},"about":{"copy":"Copyright &copy; $1. ç‰ˆæƒæ‰€æœ‰ã€‚","dlgTitle":"关于CKEditor","help":"请访问 $1 以获å–帮助.","moreInfo":"è®¿é—®æˆ‘ä»¬çš„ç½‘ç«™ä»¥èŽ·å–æ›´å¤šå…³äºŽå议的信æ¯","title":"关于CKEditor","userGuide":"CKEditor 用户å‘导"},"basicstyles":{"bold":"加粗","italic":"倾斜","strike":"删除线","subscript":"下标","superscript":"上标","underline":"下划线"},"blockquote":{"toolbar":"å—引用"},"clipboard":{"copy":"å¤åˆ¶","copyError":"您的æµè§ˆå™¨å®‰å…¨è®¾ç½®ä¸å…许编辑器自动执行å¤åˆ¶æ“作, 请使用键盘快æ·é”®(Ctrl/Cmd+C)æ¥å®Œæˆ","cut":"剪切","cutError":"您的æµè§ˆå™¨å®‰å…¨è®¾ç½®ä¸å…许编辑器自动执行剪切æ“作, 请使用键盘快æ·é”®(Ctrl/Cmd+X)æ¥å®Œæˆ","paste":"粘贴","pasteArea":"粘贴区域","pasteMsg":"请使用键盘快æ·é”®(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下é¢çš„æ–¹æ¡†é‡Œï¼Œå†æŒ‰ <STRONG>确定</STRONG>","securityMsg":"因为您的æµè§ˆå™¨çš„安全设置原因, 本编辑器ä¸èƒ½ç›´æŽ¥è®¿é—®æ‚¨çš„剪贴æ¿å†…容, 你需è¦åœ¨æœ¬çª—å£é‡æ–°ç²˜è´´ä¸€æ¬¡ã€‚","title":"粘贴"},"contextmenu":{"options":"å¿«æ·èœå•选项"},"toolbar":{"toolbarCollapse":"折å å·¥å…·æ ","toolbarExpand":"展开工具æ ","toolbarGroups":{"document":"文档","clipboard":"剪贴æ¿/撤销","editing":"编辑","forms":"表å•","basicstyles":"基本格å¼","paragraph":"段è½","links":"链接","insert":"æ’å…¥","styles":"æ ·å¼","colors":"颜色","tools":"工具"},"toolbars":"工具æ "},"elementspath":{"eleLabel":"元素路径","eleTitle":"%1 元素"},"list":{"bulletedlist":"项目列表","numberedlist":"ç¼–å·åˆ—表"},"indent":{"indent":"增加缩进é‡","outdent":"å‡å°‘缩进é‡"},"format":{"label":"æ ¼å¼","panelTitle":"æ ¼å¼","tag_address":"地å€","tag_div":"段è½(DIV)","tag_h1":"标题 1","tag_h2":"标题 2","tag_h3":"标题 3","tag_h4":"标题 4","tag_h5":"标题 5","tag_h6":"标题 6","tag_p":"普通","tag_pre":"已编排格å¼"},"horizontalrule":{"toolbar":"æ’入水平线"},"image":{"alertUrl":"请输入图象地å€","alt":"æ›¿æ¢æ–‡æœ¬","border":"边框大å°","btnUpload":"上传到æœåŠ¡å™¨ä¸Š","button2Img":"ç¡®å®šè¦æŠŠå½“å‰æŒ‰é’®æ”¹å˜ä¸ºå›¾åƒå—?","hSpace":"水平间è·","img2Button":"ç¡®å®šè¦æŠŠå½“å‰å›¾åƒæ”¹å˜ä¸ºæŒ‰é’®å—?","infoTab":"图象","linkTab":"链接","lockRatio":"é”定比例","menu":"图象属性","resetSize":"原始尺寸","title":"图象属性","titleButton":"图åƒåŸŸå±žæ€§","upload":"上传","urlMissing":"ç¼ºå°‘å›¾åƒæºæ–‡ä»¶åœ°å€","vSpace":"垂直间è·","validateBorder":"边框大å°å¿…须为整数格å¼","validateHSpace":"水平间è·å¿…须为整数格å¼","validateVSpace":"垂直间è·å¿…须为整数格å¼"},"fakeobjects":{"anchor":"锚点","flash":"Flash 动画","hiddenfield":"éšè—域","iframe":"IFrame","unknown":"未知对象"},"link":{"acccessKey":"访问键","advanced":"高级","advisoryContentType":"内容类型","advisoryTitle":"标题","anchor":{"toolbar":"æ’å…¥/编辑锚点链接","menu":"锚点链接属性","title":"锚点链接属性","name":"锚点åç§°","errorName":"请输入锚点åç§°","remove":"删除锚点"},"anchorId":"按锚点 ID","anchorName":"按锚点åç§°","charset":"字符编ç ","cssClasses":"æ ·å¼ç±»åç§°","emailAddress":"地å€","emailBody":"内容","emailSubject":"主题","id":"ID","info":"超链接信æ¯","langCode":"语言代ç ","langDir":"语言方å‘","langDirLTR":"ä»Žå·¦åˆ°å³ (LTR)","langDirRTL":"从å³åˆ°å·¦ (RTL)","menu":"编辑超链接","name":"åç§°","noAnchors":"(此文档没有å¯ç”¨çš„锚点)","noEmail":"请输入电å­é‚®ä»¶åœ°å€","noUrl":"请输入超链接地å€","other":"<å…¶ä»–>","popupDependent":"ä¾é™„ (NS)","popupFeatures":"弹出窗å£å±žæ€§","popupFullScreen":"å…¨å± (IE)","popupLeft":"å·¦","popupLocationBar":"åœ°å€æ ","popupMenuBar":"èœå•æ ","popupResizable":"å¯ç¼©æ”¾","popupScrollBars":"滚动æ¡","popupStatusBar":"çŠ¶æ€æ ","popupToolbar":"工具æ ","popupTop":"å³","rel":"å…³è”","selectAnchor":"选择一个锚点","styles":"行内样å¼","tabIndex":"Tab 键次åº","target":"目标","targetFrame":"<框架>","targetFrameName":"目标框架åç§°","targetPopup":"<弹出窗å£>","targetPopupName":"弹出窗å£åç§°","title":"超链接","toAnchor":"页内锚点链接","toEmail":"电å­é‚®ä»¶","toUrl":"地å€","toolbar":"æ’å…¥/编辑超链接","type":"超链接类型","unlink":"å–æ¶ˆè¶…链接","upload":"上传"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"å…¨å±","minimize":"最å°åŒ–"},"pastetext":{"button":"ç²˜è´´ä¸ºæ— æ ¼å¼æ–‡æœ¬","title":"ç²˜è´´ä¸ºæ— æ ¼å¼æ–‡æœ¬"},"pastefromword":{"confirmCleanup":"您è¦ç²˜è´´çš„å†…å®¹å¥½åƒæ˜¯æ¥è‡ª MS Word, 是å¦è¦æ¸…除 MS Word æ ¼å¼åŽå†ç²˜è´´?","error":"由于内部错误无法清ç†è¦ç²˜è´´çš„æ•°æ®","title":"从 MS Word 粘贴","toolbar":"从 MS Word 粘贴"},"removeformat":{"toolbar":"清除格å¼"},"sourcearea":{"toolbar":"æºç "},"specialchar":{"options":"特殊符å·é€‰é¡¹","title":"选择特殊符å·","toolbar":"æ’入特殊符å·"},"scayt":{"about":"å…³äºŽå³æ—¶æ‹¼å†™æ£€æŸ¥","aboutTab":"关于","addWord":"添加å•è¯","allCaps":"忽略所有大写å•è¯","dic_create":"创建","dic_delete":"删除","dic_field_name":"å­—å…¸åç§°","dic_info":"一开始用户è¯å…¸å‚¨å­˜åœ¨ Cookie 中, 但是 Cookies çš„å®¹é‡æ˜¯æœ‰é™çš„, 当用户è¯å…¸å¢žé•¿åˆ°è¶…出 Cookie é™åˆ¶æ—¶å°±æ— æ³•å†å‚¨å­˜äº†, 这时您å¯ä»¥å°†è¯å…¸å‚¨å­˜åˆ°æˆ‘们的æœåŠ¡å™¨ä¸Š. è¦æŠŠæ‚¨çš„ä¸ªäººè¯å…¸åˆ°å‚¨å­˜åˆ°æˆ‘们的æœåŠ¡å™¨ä¸Šçš„è¯, 需è¦ä¸ºæ‚¨çš„è¯å…¸æŒ‡å®šä¸€ä¸ªåç§°, 如果您在我们的æœåŠ¡å™¨ä¸Šå·²ç»æœ‰å‚¨å­˜æœ‰ä¸€ä¸ªè¯å…¸, 请输入è¯å…¸å称并按还原按钮.","dic_rename":"é‡å‘½å","dic_restore":"还原","dictionariesTab":"å­—å…¸","disable":"ç¦ç”¨å³æ—¶æ‹¼å†™æ£€æŸ¥","emptyDic":"å­—å…¸åä¸åº”为空.","enable":"å¯ç”¨å³æ—¶æ‹¼å†™æ£€æŸ¥","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"忽略域å","langs":"语言","languagesTab":"语言","mixedCase":"忽略大å°å†™æ··åˆçš„å•è¯","mixedWithDigits":"忽略带数字的å•è¯","moreSuggestions":"更多拼写建议","opera_title":"䏿”¯æŒ Opera æµè§ˆå™¨","options":"选项","optionsTab":"选项","title":"峿—¶æ‹¼å†™æ£€æŸ¥","toggle":"æš‚åœ/å¯ç”¨å³æ—¶æ‹¼å†™æ£€æŸ¥","noSuggestions":"No suggestion"},"stylescombo":{"label":"æ ·å¼","panelTitle":"æ ·å¼","panelTitle1":"å—级元素样å¼","panelTitle2":"内è”元素样å¼","panelTitle3":"对象元素样å¼"},"table":{"border":"边框","caption":"标题","cell":{"menu":"å•元格","insertBefore":"在左侧æ’å…¥å•元格","insertAfter":"在å³ä¾§æ’å…¥å•元格","deleteCell":"删除å•元格","merge":"åˆå¹¶å•元格","mergeRight":"å‘å³åˆå¹¶å•元格","mergeDown":"å‘下åˆå¹¶å•元格","splitHorizontal":"水平拆分å•元格","splitVertical":"垂直拆分å•元格","title":"å•元格属性","cellType":"å•元格类型","rowSpan":"纵跨行数","colSpan":"横跨列数","wordWrap":"自动æ¢è¡Œ","hAlign":"水平对é½","vAlign":"垂直对é½","alignBaseline":"基线","bgColor":"背景颜色","borderColor":"边框颜色","data":"æ•°æ®","header":"表头","yes":"是","no":"å¦","invalidWidth":"å•元格宽度必须为数字格å¼","invalidHeight":"å•元格高度必须为数字格å¼","invalidRowSpan":"行跨度必须为整数格å¼","invalidColSpan":"列跨度必须为整数格å¼","chooseColor":"选择"},"cellPad":"è¾¹è·","cellSpace":"é—´è·","column":{"menu":"列","insertBefore":"在左侧æ’入列","insertAfter":"在å³ä¾§æ’入列","deleteColumn":"删除列"},"columns":"列数","deleteTable":"删除表格","headers":"标题å•元格","headersBoth":"第一列和第一行","headersColumn":"第一列","headersNone":"æ— ","headersRow":"第一行","invalidBorder":"边框粗细必须为数字格å¼","invalidCellPadding":"å•元格填充必须为数字格å¼","invalidCellSpacing":"å•元格间è·å¿…须为数字格å¼","invalidCols":"指定的行数必须大于零","invalidHeight":"表格高度必须为数字格å¼","invalidRows":"指定的列数必须大于零","invalidWidth":"表格宽度必须为数字格å¼","menu":"表格属性","row":{"menu":"行","insertBefore":"在上方æ’入行","insertAfter":"在下方æ’入行","deleteRow":"删除行"},"rows":"行数","summary":"摘è¦","title":"表格属性","toolbar":"表格","widthPc":"百分比","widthPx":"åƒç´ ","widthUnit":"宽度å•ä½"},"undo":{"redo":"é‡åš","undo":"撤消"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"替æ¢","btnReplaceAll":"全部替æ¢","btnUndo":"撤消","changeTo":"更改为","errorLoading":"加载应该æœåŠ¡ä¸»æœºæ—¶å‡ºé”™: %s.","ieSpellDownload":"拼写检查æ’件还没安装, æ‚¨æ˜¯å¦æƒ³çŽ°åœ¨å°±ä¸‹è½½?","manyChanges":"拼写检查完æˆ: 更改了 %1 个å•è¯","noChanges":"拼写检查完æˆ: 没有更改任何å•è¯","noMispell":"拼写检查完æˆ: 没有å‘现拼写错误","noSuggestions":"- 没有建议 -","notAvailable":"抱歉, æœåŠ¡ç›®å‰æš‚ä¸å¯ç”¨","notInDic":"没有在字典里","oneChange":"拼写检查完æˆ: 更改了一个å•è¯","progress":"正在进行拼写检查...","title":"拼写检查","toolbar":"拼写检查"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/lang/zh.js b/mod/ckeditor/vendors/ckeditor/lang/zh.js
new file mode 100644
index 000000000..5c95dc115
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/lang/zh.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh']={"dir":"ltr","editor":"富文本編輯器","common":{"editorHelp":"按 ALT+0 以ç²å¾—幫助","browseServer":"ç€è¦½ä¼ºæœå™¨ç«¯","url":"URL","protocol":"通訊å”定","upload":"上傳","uploadSubmit":"上傳至伺æœå™¨","image":"å½±åƒ","flash":"Flash","form":"表單","checkbox":"æ ¸å–æ–¹å¡Š","radio":"é¸é …按鈕","textField":"文字方塊","textarea":"文字å€åŸŸ","hiddenField":"éš±è—æ¬„ä½","button":"按鈕","select":"清單/é¸å–®","imageButton":"å½±åƒæŒ‰éˆ•","notSet":"<尚未設定>","id":"ID","name":"å稱","langDir":"語言方å‘","langDirLtr":"ç”±å·¦è€Œå³ (LTR)","langDirRtl":"ç”±å³è€Œå·¦ (RTL)","langCode":"語言代碼","longDescr":"詳細 URL","cssClass":"樣å¼è¡¨é¡žåˆ¥","advisoryTitle":"標題","cssStyle":"樣å¼","ok":"確定","cancel":"å–æ¶ˆ","close":"关闭","preview":"预览","resize":"拖拽改變大å°","generalTab":"一般","advancedTab":"進階","validateNumberFailed":"需è¦è¼¸å…¥æ•¸å­—æ ¼å¼","confirmNewPage":"ç¾å­˜çš„修改尚未儲存,è¦é–‹æ–°æª”案?","confirmCancel":"部份é¸é …尚未儲存,è¦é—œé–‰å°è©±ç›’?","options":"选项","target":"目标","targetNew":"新窗å£(_blank)","targetTop":"整页(_top)","targetSelf":"本窗å£(_self)","targetParent":"父窗å£(_parent)","langDirLTR":"ç”±å·¦è€Œå³ (LTR)","langDirRTL":"ç”±å³è€Œå·¦ (RTL)","styles":"樣å¼","cssClasses":"樣å¼è¡¨é¡žåˆ¥","width":"寬度","height":"高度","align":"å°é½Š","alignLeft":"é å·¦å°é½Š","alignRight":"é å³å°é½Š","alignCenter":"置中","alignTop":"é ä¸Šå°é½Š","alignMiddle":"置中å°é½Š","alignBottom":"é ä¸‹å°é½Š","invalidValue":"Invalid value.","invalidHeight":"高度必須為數字格å¼","invalidWidth":"寬度必須為數字格å¼","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, 已關閉</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"關於 CKEditor","help":"Check $1 for help.","moreInfo":"è¨ªå•æˆ‘們的網站以ç²å–更多關於å”議的信æ¯","title":"關於 CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ç²—é«”","italic":"斜體","strike":"刪除線","subscript":"下標","superscript":"上標","underline":"底線"},"blockquote":{"toolbar":"引用文字"},"clipboard":{"copy":"複製","copyError":"ç€è¦½å™¨çš„安全性設定ä¸å…許編輯器自動執行複製動作。請使用快æ·éµ (Ctrl/Cmd+C) 複製。","cut":"剪下","cutError":"ç€è¦½å™¨çš„安全性設定ä¸å…許編輯器自動執行剪下動作。請使用快æ·éµ (Ctrl/Cmd+X) 剪下。","paste":"貼上","pasteArea":"Paste Area","pasteMsg":"請使用快æ·éµ (<strong>Ctrl/Cmd+V</strong>) 貼到下方å€åŸŸä¸­ä¸¦æŒ‰ä¸‹ <strong>確定</strong>","securityMsg":"因為ç€è¦½å™¨çš„å®‰å…¨æ€§è¨­å®šï¼Œæœ¬ç·¨è¼¯å™¨ç„¡æ³•ç›´æŽ¥å­˜å–æ‚¨çš„剪貼簿資料,請您自行在本視窗進行貼上動作。","title":"貼上"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"折å å·¥å…·æ ","toolbarExpand":"展开工具æ ","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"編輯器工具欄"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 元素"},"list":{"bulletedlist":"項目清單","numberedlist":"編號清單"},"indent":{"indent":"增加縮排","outdent":"減少縮排"},"format":{"label":"æ ¼å¼","panelTitle":"æ ¼å¼","tag_address":"ä½å€","tag_div":"一般 (DIV)","tag_h1":"標題 1","tag_h2":"標題 2","tag_h3":"標題 3","tag_h4":"標題 4","tag_h5":"標題 5","tag_h6":"標題 6","tag_p":"一般","tag_pre":"已格å¼åŒ–"},"horizontalrule":{"toolbar":"æ’入水平線"},"image":{"alertUrl":"è«‹è¼¸å…¥å½±åƒ URL","alt":"替代文字","border":"邊框","btnUpload":"上傳至伺æœå™¨","button2Img":"è¦æŠŠå½±åƒæŒ‰éˆ•改æˆå½±åƒå—Žï¼Ÿ","hSpace":"æ°´å¹³è·é›¢","img2Button":"è¦æŠŠå½±åƒæ”¹æˆå½±åƒæŒ‰éˆ•嗎?","infoTab":"å½±åƒè³‡è¨Š","linkTab":"超連çµ","lockRatio":"等比例","menu":"å½±åƒå±¬æ€§","resetSize":"é‡è¨­ç‚ºåŽŸå¤§å°","title":"å½±åƒå±¬æ€§","titleButton":"å½±åƒæŒ‰éˆ•屬性","upload":"上傳","urlMissing":"Image source URL is missing.","vSpace":"垂直è·é›¢","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"fakeobjects":{"anchor":"錨點","flash":"Flash å‹•ç•«","hiddenfield":"éš±è—æ¬„ä½","iframe":"IFrame","unknown":"䏿˜Žç‰©ä»¶"},"link":{"acccessKey":"å­˜å–éµ","advanced":"進階","advisoryContentType":"內容類型","advisoryTitle":"標題","anchor":{"toolbar":"æ’å…¥/編輯錨點","menu":"錨點屬性","title":"錨點屬性","name":"錨點å稱","errorName":"請輸入錨點å稱","remove":"Remove Anchor"},"anchorId":"ä¾å…ƒä»¶ ID","anchorName":"ä¾éŒ¨é»žå稱","charset":"連çµè³‡æºä¹‹ç·¨ç¢¼","cssClasses":"樣å¼è¡¨é¡žåˆ¥","emailAddress":"é›»å­éƒµä»¶","emailBody":"郵件內容","emailSubject":"郵件主旨","id":"ID","info":"超連çµè³‡è¨Š","langCode":"語言方å‘","langDir":"語言方å‘","langDirLTR":"ç”±å·¦è€Œå³ (LTR)","langDirRTL":"ç”±å³è€Œå·¦ (RTL)","menu":"編輯超連çµ","name":"å稱","noAnchors":"(本文件尚無å¯ç”¨ä¹‹éŒ¨é»ž)","noEmail":"請輸入電å­éƒµä»¶ä½å€","noUrl":"請輸入欲連çµçš„ URL","other":"<å…¶ä»–>","popupDependent":"從屬 (NS)","popupFeatures":"快顯視窗屬性","popupFullScreen":"全螢幕 (IE)","popupLeft":"å·¦","popupLocationBar":"ç¶²å€åˆ—","popupMenuBar":"é¸å–®åˆ—","popupResizable":"å¯ç¸®æ”¾","popupScrollBars":"æ²è»¸","popupStatusBar":"狀態列","popupToolbar":"工具列","popupTop":"å³","rel":"Relationship","selectAnchor":"è«‹é¸æ“‡éŒ¨é»ž","styles":"樣å¼","tabIndex":"定ä½é †åº","target":"目標","targetFrame":"<框架>","targetFrameName":"目標框架å稱","targetPopup":"<快顯視窗>","targetPopupName":"快顯視窗å稱","title":"超連çµ","toAnchor":"本é éŒ¨é»ž","toEmail":"é›»å­éƒµä»¶","toUrl":"URL","toolbar":"æ’å…¥/編輯超連çµ","type":"超連接類型","unlink":"移除超連çµ","upload":"上傳"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"最大化","minimize":"最å°åŒ–"},"pastetext":{"button":"貼為純文字格å¼","title":"貼為純文字格å¼"},"pastefromword":{"confirmCleanup":"您想貼上的文字似乎是自 Word è¤‡è£½è€Œä¾†ï¼Œè«‹å•æ‚¨æ˜¯å¦è¦å…ˆæ¸…除 Word 的格å¼å¾Œå†è¡Œè²¼ä¸Šï¼Ÿ","error":"It was not possible to clean up the pasted data due to an internal error","title":"自 Word 貼上","toolbar":"自 Word 貼上"},"removeformat":{"toolbar":"清除格å¼"},"sourcearea":{"toolbar":"原始碼"},"specialchar":{"options":"Special Character Options","title":"è«‹é¸æ“‡ç‰¹æ®Šç¬¦è™Ÿ","toolbar":"æ’入特殊符號"},"scayt":{"about":"é—œæ–¼å³æ™‚拼寫檢查","aboutTab":"關於","addWord":"添加單詞","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"å­—å…¸","disable":"é—œé–‰å³æ™‚拼寫檢查","emptyDic":"å­—å…¸å䏿‡‰ç‚ºç©º.","enable":"å•Ÿç”¨å³æ™‚拼寫檢查","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"Ignore Domain Names","langs":"語言","languagesTab":"語言","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"更多拼寫建議","opera_title":"Not supported by Opera","options":"é¸é …","optionsTab":"é¸é …","title":"峿™‚拼寫檢查","toggle":"啟用ï¼é—œé–‰å³æ™‚拼寫檢查","noSuggestions":"No suggestion"},"stylescombo":{"label":"樣å¼","panelTitle":"Formatting Styles","panelTitle1":"塊級元素樣å¼","panelTitle2":"å…§è¯å…ƒç´ æ¨£å¼","panelTitle3":"物件元素樣å¼"},"table":{"border":"邊框","caption":"標題","cell":{"menu":"儲存格","insertBefore":"å‘å·¦æ’入儲存格","insertAfter":"å‘峿’入儲存格","deleteCell":"刪除儲存格","merge":"åˆä½µå„²å­˜æ ¼","mergeRight":"å‘å³åˆä½µå„²å­˜æ ¼","mergeDown":"å‘下åˆä½µå„²å­˜æ ¼","splitHorizontal":"æ©«å‘分割儲存格","splitVertical":"縱å‘分割儲存格","title":"儲存格屬性","cellType":"儲存格類別","rowSpan":"儲存格列數","colSpan":"儲存格欄數","wordWrap":"自動æ›è¡Œ","hAlign":"æ°´å¹³å°é½Š","vAlign":"垂直å°é½Š","alignBaseline":"基線å°é½Š","bgColor":"背景é¡è‰²","borderColor":"邊框é¡è‰²","data":"數據","header":"標題","yes":"是","no":"å¦","invalidWidth":"儲存格寬度必須為數字格å¼","invalidHeight":"儲存格高度必須為數字格å¼","invalidRowSpan":"儲存格列數必須為整數格å¼","invalidColSpan":"儲存格欄數度必須為整數格å¼","chooseColor":"Choose"},"cellPad":"å…§è·","cellSpace":"é–“è·","column":{"menu":"欄","insertBefore":"å‘å·¦æ’入欄","insertAfter":"å‘峿’入欄","deleteColumn":"刪除欄"},"columns":"欄數","deleteTable":"刪除表格","headers":"標題","headersBoth":"第一欄和第一列","headersColumn":"第一欄","headersNone":"無標題","headersRow":"第一列","invalidBorder":"邊框大å°å¿…須為數字格å¼","invalidCellPadding":"儲存格內è·å¿…須為數字格å¼","invalidCellSpacing":"儲存格間è·å¿…須為數字格å¼","invalidCols":"必須有一或更多的欄","invalidHeight":"表格高度必須為數字格å¼","invalidRows":"必須有一或更多的列","invalidWidth":"表格寬度必須為數字格å¼","menu":"表格屬性","row":{"menu":"列","insertBefore":"å‘上æ’入列","insertAfter":"å‘下æ’入列","deleteRow":"刪除列"},"rows":"列數","summary":"摘è¦","title":"表格屬性","toolbar":"表格","widthPc":"百分比","widthPx":"åƒç´ ","widthUnit":"width unit"},"undo":{"redo":"é‡è¤‡","undo":"復原"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"å–代","btnReplaceAll":"全部å–代","btnUndo":"復原","changeTo":"更改為","errorLoading":"無法è¯ç³»ä¾æœå™¨: %s.","ieSpellDownload":"å°šæœªå®‰è£æ‹¼å­—æª¢æŸ¥å…ƒä»¶ã€‚æ‚¨æ˜¯å¦æƒ³è¦ç¾åœ¨ä¸‹è¼‰ï¼Ÿ","manyChanges":"拼字檢查完æˆï¼šæ›´æ”¹äº† %1 個單字","noChanges":"拼字檢查完æˆï¼šæœªæ›´æ”¹ä»»ä½•單字","noMispell":"拼字檢查完æˆï¼šæœªç™¼ç¾æ‹¼å­—錯誤","noSuggestions":"- 無建議值 -","notAvailable":"抱歉,æœå‹™ç›®å‰æš«ä¸å¯ç”¨","notInDic":"ä¸åœ¨å­—典中","oneChange":"拼字檢查完æˆï¼šæ›´æ”¹äº† 1 個單字","progress":"進行拼字檢查中…","title":"拼字檢查","toolbar":"拼字檢查"}}; \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
new file mode 100644
index 000000000..4bf2d3c94
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("a11yHelp",function(j){var l=j.lang.a11yhelp,m=CKEDITOR.tools.getNextId(),d={8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSE",20:"CAPSLOCK",27:"ESCAPE",33:"PAGE UP",34:"PAGE DOWN",35:"END",36:"HOME",37:"LEFT ARROW",38:"UP ARROW",39:"RIGHT ARROW",40:"DOWN ARROW",45:"INSERT",46:"DELETE",91:"LEFT WINDOW KEY",92:"RIGHT WINDOW KEY",93:"SELECT KEY",96:"NUMPAD 0",97:"NUMPAD 1",98:"NUMPAD 2",99:"NUMPAD 3",100:"NUMPAD 4",101:"NUMPAD 5",102:"NUMPAD 6",103:"NUMPAD 7",
+104:"NUMPAD 8",105:"NUMPAD 9",106:"MULTIPLY",107:"ADD",109:"SUBTRACT",110:"DECIMAL POINT",111:"DIVIDE",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUM LOCK",145:"SCROLL LOCK",186:"SEMI-COLON",187:"EQUAL SIGN",188:"COMMA",189:"DASH",190:"PERIOD",191:"FORWARD SLASH",192:"GRAVE ACCENT",219:"OPEN BRACKET",220:"BACK SLASH",221:"CLOSE BRAKET",222:"SINGLE QUOTE"};d[CKEDITOR.ALT]="ALT";d[CKEDITOR.SHIFT]="SHIFT";d[CKEDITOR.CTRL]="CTRL";
+var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL],n=/\$\{(.*?)\}/g,q=function(){var o=j.keystrokeHandler.keystrokes,f={},b;for(b in o)f[o[b]]=b;return function(b,g){var a;if(f[g]){a=f[g];for(var h,i,k=[],c=0;c<e.length;c++)i=e[c],h=a/e[c],1<h&&2>=h&&(a-=i,k.push(d[i]));k.push(d[a]||String.fromCharCode(a));a=k.join("+")}else a=b;return a}}();return{title:l.title,minWidth:600,minHeight:400,contents:[{id:"info",label:j.lang.common.generalTab,expand:!0,elements:[{type:"html",id:"legends",style:"white-space:normal;",
+focus:function(){this.getElement().focus()},html:function(){for(var d='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+m+'_arialbl" tabIndex="-1">%1</div><span id="'+m+'_arialbl" class="cke_voice_label">'+l.contents+" </span>",f=[],b=l.legend,j=b.length,g=0;g<j;g++){for(var a=b[g],h=[],i=a.items,k=i.length,c=0;c<k;c++){var e=i[c],p=e.legend.replace(n,q);p.match(n)||h.push("<dt>%1</dt><dd>%2</dd>".replace("%1",e.name).replace("%2",p))}f.push("<h1>%1</h1><dl>%2</dl>".replace("%1",
+a.name).replace("%2",h.join("")))}return d.replace("%1",f.join(""))}()+'<style type="text/css">.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,.cke_browser_ie6 .cke_accessibility_legend{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}</style>'}]}],
+buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
new file mode 100644
index 000000000..e7c92d0da
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+cs.js Found: 30 Missing: 0
+cy.js Found: 30 Missing: 0
+da.js Found: 12 Missing: 18
+de.js Found: 30 Missing: 0
+el.js Found: 25 Missing: 5
+eo.js Found: 30 Missing: 0
+fa.js Found: 30 Missing: 0
+fi.js Found: 30 Missing: 0
+fr.js Found: 30 Missing: 0
+gu.js Found: 12 Missing: 18
+he.js Found: 30 Missing: 0
+it.js Found: 30 Missing: 0
+mk.js Found: 5 Missing: 25
+nb.js Found: 30 Missing: 0
+nl.js Found: 30 Missing: 0
+no.js Found: 30 Missing: 0
+pt-br.js Found: 30 Missing: 0
+ro.js Found: 6 Missing: 24
+tr.js Found: 30 Missing: 0
+ug.js Found: 27 Missing: 3
+vi.js Found: 6 Missing: 24
+zh-cn.js Found: 30 Missing: 0
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js
new file mode 100644
index 000000000..280f80a33
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ar",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"عام",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js
new file mode 100644
index 000000000..1950e9a49
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","bg",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Общо",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js
new file mode 100644
index 000000000..2e269ef93
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ca",{title:"Instruccions d'Accessibilitat",contents:"Continguts de l'Ajuda. Per tancar aquest quadre de diàleg premi ESC.",legend:[{name:"General",items:[{name:"Editor de barra d'eines",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor de quadre de diàleg",
+legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},{name:"Editor de menú contextual",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},
+{name:"Editor de caixa de llista",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Editor de barra de ruta de l'element",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},
+{name:"Ordres",items:[{name:"Desfer ordre",legend:"Premi ${undo}"},{name:"Refer ordre",legend:"Premi ${redo}"},{name:"Ordre negreta",legend:"Prem ${bold}"},{name:"Ordre cursiva",legend:"Prem ${italic}"},{name:"Ordre subratllat",legend:"Prem ${underline}"},{name:"Ordre enllaç",legend:"Prem ${link}"},{name:"Ordre amagar barra d'eines",legend:"Prem ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Ajuda d'accessibilitat",legend:"Prem ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js
new file mode 100644
index 000000000..e0891be99
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","cs",{title:"Instrukce pro přístupnost",contents:"Obsah nápovÄ›dy. Pro uzavÅ™ení tohoto dialogu stisknÄ›te klávesu ESC.",legend:[{name:"Obecné",items:[{name:"Panel nástrojů editoru",legend:"StisknÄ›te${toolbarFocus} k procházení panelu nástrojů. PÅ™ejdÄ›te na další a pÅ™edchozí skupiny pomocí TAB a SHIFT-TAB. PÅ™echod na další a pÅ™edchozí tlaÄítko panelu nástrojů je pomocí Å IPKA VPRAVO nebo Å IPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlaÄítko aktivujete."},{name:"Dialogové okno editoru",
+legend:"UvnitÅ™ dialogového okna stisknÄ›te TAB pro pÅ™esunutí na další pole, stisknÄ›te SHIFT + TAB pro pÅ™esun na pÅ™edchozí pole, stisknÄ›te ENTER pro odeslání dialogu, stisknÄ›te ESC pro jeho zruÅ¡ení. Pro dialogová okna, která mají mnoho karet stisknÄ›te ALT + F10 pr oprocházení seznamu karet. Pak se pÅ™esuňte na další kartu pomocí TAB nebo Å IPKA VPRAVO. Pro pÅ™esun na pÅ™edchozí stisknÄ›te SHIFT + TAB nebo Å IPKA VLEVO. StisknÄ›te MEZERNÃK nebo ENTER pro vybrání stránky karet."},{name:"Kontextové menu editoru",
+legend:"StisknÄ›te ${contextMenu} nebo klávesu APPLICATION k otevÅ™ení kontextového menu. Pak se pÅ™esuňte na další možnost menu pomocí TAB nebo Å IPKY DOLÅ®. PÅ™esuňte se na pÅ™edchozí možnost pomocí SHIFT+TAB nebo Å IPKY NAHORU. StisknÄ›te MEZERNÃK nebo ENTER pro zvolení možnosti menu. Podmenu souÄasné možnosti otevÅ™ete pomocí MEZERNÃKU nebo ENTER Äi Å IPKY DOLEVA. Kontextové menu uzavÅ™ete stiskem ESC."},{name:"RámeÄek seznamu editoru",legend:"UvnitÅ™ rámeÄku seznamu se pÅ™esunete na další položku menu pomocí TAB nebo Å IPKA DOLÅ®. Na pÅ™edchozí položku se pÅ™esunete SHIFT + TAB nebo Å IPKA NAHORU. StisknÄ›te MEZERNÃK nebo ENTER pro zvolení možnosti seznamu. StisknÄ›te ESC pro uzavÅ™ení seznamu."},
+{name:"LiÅ¡ta cesty prvku v editoru",legend:"StisknÄ›te ${elementsPathFocus} pro procházení liÅ¡ty cesty prvku. Na další tlaÄítko prvku se pÅ™esunete pomocí TAB nebo Å IPKA VPRAVO. Na pÅ™edchozí položku se pÅ™esunete pomocí SHIFT + TAB nebo Å IPKA VLEVO. StisknÄ›te MEZERNÃK nebo ENTER pro vybrání prvku v editoru."}]},{name:"Příkazy",items:[{name:" Příkaz ZpÄ›t",legend:"StisknÄ›te ${undo}"},{name:" Příkaz Znovu",legend:"StisknÄ›te ${redo}"},{name:" Příkaz TuÄné",legend:"StisknÄ›te ${bold}"},{name:" Příkaz Kurzíva",
+legend:"Stiskněte ${italic}"},{name:" Příkaz Podtržení",legend:"Stiskněte ${underline}"},{name:" Příkaz Odkaz",legend:"Stiskněte ${link}"},{name:" Příkaz Skrýt panel nástrojů",legend:"Stiskněte ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",
+legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Nápověda přístupnosti",legend:"Stiskněte ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js
new file mode 100644
index 000000000..547e77c60
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","cy",{title:"Canllawiau Hygyrchedd",contents:"Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.",legend:[{name:"Cyffredinol",items:[{name:"Bar Offer y Golygydd",legend:"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT-TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol."},{name:"Deialog y Golygydd",legend:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd â thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."},
+{name:"Dewislen Cyd-destun y Golygydd",legend:"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT + TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC."},
+{name:"Blwch Rhestr y Golygydd",legend:"Tu mewn rhestr-bocs, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT + TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr."},{name:"Bar Llwybr Elfen y Golygydd",legend:"Pwyswch $ {elementsPathFocus} i fynd i'r elfennau llwybr bar. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT + TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd."}]},
+{name:"Gorchmynion",items:[{name:"Gorchymyn dadwneud",legend:"Pwyswch ${undo}"},{name:"Gorchymyn ailadrodd",legend:"Pwyswch ${redo}"},{name:"Gorchymyn Bras",legend:"Pwyswch ${bold}"},{name:"Gorchymyn italig",legend:"Pwyswch ${italig}"},{name:"Gorchymyn tanlinellu",legend:"Pwyso ${underline}"},{name:"Gorchymyn dolen",legend:"Pwyswch ${link}"},{name:"Gorchymyn Cwympo'r Dewislen",legend:"Pwyswch ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Cymorth Hygyrchedd",legend:"Pwyswch ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/da.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/da.js
new file mode 100644
index 000000000..fa0c807c5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/da.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","da",{title:"Tilgængelighedsinstrukser",contents:"Onlinehjælp. For at lukke dette vindue klik ESC",legend:[{name:"Generelt",items:[{name:"Editor værktøjslinje",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Kommandoer",items:[{name:"Fortryd kommando",legend:"Klik på ${undo}"},{name:"Gentag kommando",legend:"Klik ${redo}"},{name:" Bold command",legend:"Klik ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Klik ${underline}"},{name:" Link command",legend:"Klik ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Kilk ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/de.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/de.js
new file mode 100644
index 000000000..70ecde163
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/de.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","de",{title:"Barrierefreiheitinformationen",contents:"Hilfeinhalt. Um den Dialog zu schliessen die Taste 'ESC' drücken.",legend:[{name:"Allgemein",items:[{name:"Editor Symbolleiste",legend:"Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT-TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren."},
+{name:"Editor Dialog",legend:"Innerhalb des Dialogs drücken Sie TAB um zum nächsten Dialogfeld zu gelangen, drücken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drücken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drücken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. Zurück gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen."},
+{name:"Editor Kontextmenü",legend:"Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste."},{name:"Editor Listen",legend:"Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der Shift-TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs."},
+{name:"Editor Elementpfadleiste",legend:"Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT-TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen."}]},{name:"Befehle",items:[{name:"Wiederholen Befehl",legend:"Drücken Sie ${undo}"},{name:"Rückgängig Befehl",legend:"Drücken Sie ${redo}"},{name:"Fettschrift Befehl",
+legend:"Drücken Sie ${bold}"},{name:"Italic Befehl",legend:"Drücken Sie ${italic}"},{name:"Unterstreichung Befehl",legend:"Drücken Sie ${underline}"},{name:"Link Befehl",legend:"Drücken Sie ${link}"},{name:"Symbolleiste zuammenklappen Befehl",legend:"Drücken Sie ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Eingabehilfen",legend:"Drücken Sie ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/el.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/el.js
new file mode 100644
index 000000000..cbf7e6d4a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/el.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","el",{title:"Οδηγίες ΠÏοσβασιμότητας",contents:"ΠεÏιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.",legend:[{name:"Γενικά",items:[{name:"ΕÏγαλειοθήκη ΕπεξεÏγαστή",legend:"Πατήστε ${toolbarFocus} για να πεÏιηγηθείτε στην γÏαμμή εÏγαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γÏαμμής εÏγαλείων με TAB και Shift-TAB. Μετακινηθείτε ανάμεσα στα κουμπία εÏγαλείων με ΔΕΞΙ και ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΚΕÎΟ ή ENTER για να ενεÏγοποιήσετε το ενεÏγό κουμπί εÏγαλείου."},{name:"ΠαÏάθυÏο Διαλόγου ΕπεξεÏγαστή",
+legend:"Μέσα σε ένα παÏάθυÏο διαλόγου, πατήστε TAB για να μεταβείτε στο επόμενο πεδίο ή SHIFT + TAB για να μεταβείτε στο Ï€ÏοηγοÏμενο. Πατήστε ENTER για να υποβάλετε την φόÏμα. Πατήστε ESC για να ακυÏώσετε την διαδικασία της φόÏμας. Για παÏάθυÏα διαλόγων που έχουν πολλές σελίδες σε καÏτέλες πατήστε ALT + F10 για να μεταβείτε στην λίστα των καÏτέλων. Στην συνέχεια μποÏείτε να μεταβείτε στην επόμενη καÏτέλα πατώντας TAB ή RIGHT ARROW. ΜποÏείτε να μεταβείτε στην Ï€ÏοηγοÏμενη καÏτέλα πατώντας SHIFT + TAB ή LEFT ARROW. Πατήστε SPACE ή ENTER για να επιλέξετε την καÏτέλα για Ï€Ïοβολή."},
+{name:"Αναδυόμενο ÎœÎµÎ½Î¿Ï Î•Ï€ÎµÎ¾ÎµÏγαστή",legend:"Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενοÏ. Μετά μετακινηθείτε στην επόμενη επιλογή του Î¼ÎµÎ½Î¿Ï Î¼Îµ TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην Ï€ÏοηγοÏμενη επιλογή με SHIFT+TAB ή ΠΑÎΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το Ï„Ïέχων στοιχείο. Ανοίξτε το αναδυόμενο Î¼ÎµÎ½Î¿Ï Ï„Î·Ï‚ Ï„Ïέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αÏχικό στοιχείο Î¼ÎµÎ½Î¿Ï Î¼Îµ ESC ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο Î¼ÎµÎ½Î¿Ï Î¼Îµ ESC."},
+{name:"Κουτί Λίστας ΕπεξεÏγαστών",legend:"Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο Ï€ÏοηγοÏμενο στοιχείο με SHIFT + TAB ή ΠΑÎΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας."},{name:"ΜπάÏα ΔιαδÏομών Στοιχείων ΕπεξεÏγαστή",legend:"Πατήστε ${elementsPathFocus} για να πεÏιηγηθείτε στην μπάÏα διαδÏομών στοιχείων του επεξεÏγαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του Ï€ÏοηγοÏμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεÏγαστή."}]},
+{name:"Εντολές",items:[{name:" Εντολή αναίÏεσης",legend:"Πατήστε ${undo}"},{name:" Εντολή επανάληψης",legend:"Πατήστε ${redo}"},{name:" Εντολή έντονης γÏαφής",legend:"Πατήστε ${bold}"},{name:" Εντολή πλάγιας γÏαφής",legend:"Πατήστε ${italic}"},{name:" Εντολή υπογÏάμμισης",legend:"Πατήστε ${underline}"},{name:" Εντολή συνδέσμου",legend:"Πατήστε ${link}"},{name:" Εντολή ΣÏμπτηξης ΕÏγαλειοθήκης",legend:"Πατήστε ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Βοήθεια ΠÏοσβασιμότητας",legend:"Πατήστε ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/en.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
new file mode 100644
index 000000000..0124a3cf8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","en",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js
new file mode 100644
index 000000000..eed389877
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","eo",{title:"Uzindikoj pri atingeblo",contents:"Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.",legend:[{name:"Äœeneralaĵoj",items:[{name:"Ilbreto de la redaktilo",legend:"Premu ${toolbarFocus} por atingi la ilbreton. MoviÄu al la sekva aÅ­ antaÅ­a grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA-TABA. MoviÄu al la sekva aÅ­ antaÅ­a butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aÅ­ la ENENklavon por aktivigi la ilbretbutonon."},
+{name:"Redaktildialogo",legend:"En dialogo, premu la TABAN klavon por navigi al la sekva dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaÅ­a kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaÄoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviÄu al la sekva langeto per la klavo TABA aÅ­ SAGO DEKSTREN. MoviÄu al la antaÅ­a langeto per la klavoj MAJUSKLIGA + TABA aÅ­ SAGO MALDEKSTREN. Premu la SPACETklavon aÅ­ la ENENklavon por selekti la langetretpaÄon."},
+{name:"Kunteksta menuo de la redaktilo",legend:"Premu ${contextMenu} aÅ­ entajpu la KLAVKOMBINAÄ´ON por malfermi la kuntekstan menuon. Poste moviÄu al la sekva opcio de la menuo per la klavoj TABA aÅ­ SAGO SUBEN. MoviÄu al la antaÅ­a opcio per la klavoj MAJUSKLGA + TABA aÅ­ SAGO SUPREN. Premu la SPACETklavon aÅ­ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aÅ­ la ENENklavo aÅ­ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aÅ­ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo."},
+{name:"Fallisto de la redaktilo",legend:"En fallisto, moviÄu al la sekva listelemento per la klavoj TABA aÅ­ SAGO SUBEN. MoviÄu al la antaÅ­a listelemento per la klavoj MAJUSKLIGA + TABA aÅ­ SAGO SUPREN. Premu la SPACETklavon aÅ­ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon."},{name:"Breto indikanta la vojon al la redaktilelementoj",legend:"Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. MoviÄu al la butono de la sekva elemento per la klavoj TABA aÅ­ SAGO DEKSTREN. MoviÄu al la butono de la antaÅ­a elemento per la klavoj MAJUSKLIGA + TABA aÅ­ SAGO MALDEKSTREN. Premu la SPACETklavon aÅ­ ENENklavon por selekti la elementon en la redaktilo."}]},
+{name:"Komandoj",items:[{name:"Komando malfari",legend:"Premu ${undo}"},{name:"Komando refari",legend:"Premu ${redo}"},{name:"Komando grasa",legend:"Premu ${bold}"},{name:"Komando kursiva",legend:"Premu ${italic}"},{name:"Komando substreki",legend:"Premu ${underline}"},{name:"Komando ligilo",legend:"Premu ${link}"},{name:"Komando faldi la ilbreton",legend:"Premu ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Helpilo pri atingeblo",legend:"Premu ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/es.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/es.js
new file mode 100644
index 000000000..877dc8ca8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/es.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","es",{title:"Instrucciones de acceso",contents:"Ayuda. Para cerrar presione ESC.",legend:[{name:"General",items:[{name:"Barra de herramientas del editor",legend:'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY-TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.'},{name:"Editor de diálogo",
+legend:"Dentro de un cuadro de diálogo, presione la tecla TAB para desplazarse al campo siguiente del cuadro de diálogo, pulse SHIFT + TAB para desplazarse al campo anterior, pulse ENTER para presentar cuadro de diálogo, pulse la tecla ESC para cancelar el diálogo. Para los diálogos que tienen varias páginas, presione ALT + F10 para navegar a la pestaña de la lista. Luego pasar a la siguiente pestaña con TAB o FLECHA DERECHA. Para ir a la ficha anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione ESPACIO o ENTRAR para seleccionar la página de ficha."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/et.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/et.js
new file mode 100644
index 000000000..5e95b6adb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/et.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","et",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Üldine",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js
new file mode 100644
index 000000000..4b182de58
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fa",{title:"دستورالعملهای دسترسی",contents:"راهنمای Ùهرست مطالب. برای بستن این کادر محاورهای ESC را ÙØ´Ø§Ø± دهید.",legend:[{name:"عمومی",items:[{name:"نوار ابزار ویرایشگر",legend:"${toolbarFocus} را برای باز کردن نوار ابزار Ø¨ÙØ´Ø§Ø±ÛŒØ¯. با کلید Tab Ùˆ Shif-Tab در مجموعه نوار ابزار بعدی Ùˆ قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی Ùˆ بعدی با کلید جهتنمای راست Ùˆ Ú†Ù¾ جابجا شوید. کلید Space یا Enter را برای ÙØ¹Ø§Ù„ کردن کلید نوار ابزار Ø¨ÙØ´Ø§Ø±ÛŒØ¯."},{name:"پنجره محاورهای ویرایشگر",
+legend:"در داخل یک پنجره محاورهای، کلید Tab را Ø¨ÙØ´Ø§Ø±ÛŒØ¯ تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به Ùیلد قبلی، ÙØ´Ø±Ø¯Ù† Enter برای ثبت اطلاعات پنجره، ÙØ´Ø±Ø¯Ù† Esc برای لغو پنجره محاورهای Ùˆ برای پنجرههایی Ú©Ù‡ چندین برگه دارند، ÙØ´Ø±Ø¯Ù† Alt+F10 جهت Ø±ÙØªÙ† به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای Ú†Ù¾. ÙØ´Ø±Ø¯Ù† Space یا Enter برای انتخاب یک برگه."},{name:"منوی متنی ویرایشگر",legend:"${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را Ø¨ÙØ´Ø§Ø±ÛŒØ¯. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab Ùˆ یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. ÙØ´Ø±Ø¯Ù† Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter Ùˆ یا کلید جهتنمای راست Ùˆ Ú†Ù¾. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای Ú†Ù¾. بستن منوی متن با Esc."},
+{name:"جعبه Ùهرست ویرایشگر",legend:"در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB Ùˆ یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست Ø¨ÙØ´Ø§Ø±ÛŒØ¯. کلید ESC را برای بستن جعبه لیست Ø¨ÙØ´Ø§Ø±ÛŒØ¯."},{name:"ویرایشگر عنصر نوار راه",legend:"برای Ø±ÙØªÙ† به مسیر عناصر ${elementsPathFocus} را Ø¨ÙØ´Ø§Ø±ÛŒØ¯. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهتنمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهتنمای Ú†Ù¾. ÙØ´Ø±Ø¯Ù† Space یا Enter برای انتخاب یک عنصر در ویرایشگر."}]},
+{name:"ÙØ±Ù…انها",items:[{name:"بازگشت ÙØ±Ù…ان",legend:"ÙØ´Ø±Ø¯Ù† ${undo}"},{name:"انجام مجدد ÙØ±Ù…ان",legend:"ÙØ´Ø±Ø¯Ù† ${redo}"},{name:"ÙØ±Ù…ان متن درشت",legend:"ÙØ´Ø±Ø¯Ù† ${bold}"},{name:"ÙØ±Ù…ان متن کج",legend:"ÙØ´Ø±Ø¯Ù† ${italic}"},{name:"ÙØ±Ù…ان متن زیرخطدار",legend:"ÙØ´Ø±Ø¯Ù† ${underline}"},{name:"ÙØ±Ù…ان پیوند",legend:"ÙØ´Ø±Ø¯Ù† ${link}"},{name:"بستن نوار ابزار ÙØ±Ù…ان",legend:"ÙØ´Ø±Ø¯Ù† ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"راهنمای دسترسی",legend:"ÙØ´Ø±Ø¯Ù† ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js
new file mode 100644
index 000000000..e0b75585f
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fi",{title:"Saavutettavuus ohjeet",contents:"Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.",legend:[{name:"Yleinen",items:[{name:"Editorin työkalupalkki",legend:"Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT-TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen."},
+{name:"Editorin dialogi",legend:"Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden."},{name:"Editorin oheisvalikko",
+legend:"Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella."},{name:"Editorin listalaatikko",
+legend:"Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon."},{name:"Editorin elementtipolun palkki",legend:"Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa."}]},
+{name:"Komennot",items:[{name:"Peruuta komento",legend:"Paina ${undo}"},{name:"Tee uudelleen komento",legend:"Paina ${redo}"},{name:"Lihavoi komento",legend:"Paina ${bold}"},{name:"Kursivoi komento",legend:"Paina ${italic}"},{name:"Alleviivaa komento",legend:"Paina ${underline}"},{name:"Linkki komento",legend:"Paina ${link}"},{name:"Pienennä työkalupalkki komento",legend:"Paina ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Saavutettavuus ohjeet",legend:"Paina ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js
new file mode 100644
index 000000000..1d2a58a29
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fr",{title:"Instructions pour l'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche ESC (Echappement).",legend:[{name:"Général",items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."},
+{name:"Dialogue de léditeur",legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},
+{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC."},
+{name:"Zone de liste en menu déroulant de l'éditeur",legend:"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de léditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]},
+{name:"Commandes",items:[{name:" Commande défaire",legend:"Appuyer sur ${undo}"},{name:" Commande refaire",legend:"Appuyer sur ${redo}"},{name:" Commande gras",legend:"Appuyer sur ${bold}"},{name:" Commande italique",legend:"Appuyer sur ${italic}"},{name:" Commande souligné",legend:"Appuyer sur ${underline}"},{name:" Commande lien",legend:"Appuyer sur ${link}"},{name:" Commande enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Aide Accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js
new file mode 100644
index 000000000..23ea2c413
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","gu",{title:"àªàª•à«àª•à«àª·à«‡àª¬àª¿àª²àª¿àªŸà«€ ની વિગતો",contents:"હેલà«àªª. આ બંધ કરવા ESC દબાવો.",legend:[{name:"જનરલ",items:[{name:"àªàª¡àª¿àªŸàª° ટૂલબાર",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"àªàª¡àª¿àªŸàª° ડાયલોગ",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"કમાંડસ",items:[{name:"અનà«àª¡à«àª‚ કમાંડ",legend:"$ દબાવો {undo}"},{name:"ફરી કરો કમાંડ",legend:"$ દબાવો {redo}"},{name:"બોલà«àª¦àª¨à«‹ કમાંડ",legend:"$ દબાવો {bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/he.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/he.js
new file mode 100644
index 000000000..34bceac05
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/he.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","he",{title:"הור×ות נגישות",contents:"הור×ות נגישות. לסגירה לחץ ×סקייפ (ESC).",legend:[{name:"כללי",items:[{name:"סרגל הכלי×",legend:"לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלי×. עבור לכפתור ×”×‘× ×¢× ×ž×§×© הט×ב (TAB) ×ו ×—×¥ שמ×לי. עבור לכפתור ×”×§×•×“× ×¢× ×ž×§×© השיפט (SHIFT) + ט×ב (TAB) ×ו ×—×¥ ימני. לחץ רווח ×ו ×נטר (ENTER) כדי להפעיל ×ת הכפתור הנבחר."},{name:"די××œ×•×’×™× (חלונות תש×ול)",legend:"בתוך די×לוג, לחץ ט×ב (TAB) כדי לנווט לשדה הב×, לחץ שיפט (SHIFT) + ט×ב (TAB) כדי לנווט לשדה הקוד×, לחץ ×נטר (ENTER) כדי לשלוח ×ת הדי×לוג, לחץ ×סקייפ (ESC) כדי לבטל. בתוך די××œ×•×’×™× ×‘×¢×œ×™ מספר ט××‘×™× (לשוניות), לחץ ×לט (ALT) + F10 כדי לנווט לשורת הט×בי×. נווט לט×ב ×”×‘× ×¢× ×˜×ב (TAB) ×ו ×—×¥ שמ×לי. עבור לט×ב ×”×§×•×“× ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) ×ו ×—×¥ שמ×לי. לחץ רווח ×ו ×נטר (ENTER) כדי להיכנס לט×ב."},
+{name:"תפריט ההקשר (Context Menu)",legend:"לחץ ${contextMenu} ×ו APPLICATION KEYכדי לפתוח ×ת תפריט ההקשר. עבור ל×פשרות הב××” ×¢× ×˜×ב (TAB) ×ו ×—×¥ למטה. עבור ל×פשרות הקודמת ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) ×ו ×—×¥ למעלה. לחץ רווח ×ו ×נטר (ENTER) כדי לבחור ×ת ×”×פשרות. פתח ×ת תת התפריט (Sub-menu) של ×”×פשרות הנוכחית ×¢× ×¨×•×•×— ×ו ×נטר (ENTER) ×ו ×—×¥ שמ×לי. חזור לתפריט ×”×ב ×¢× ×סקייפ (ESC) ×ו ×—×¥ שמ×לי. סגור ×ת תפריט ההקשר ×¢× ×סקייפ (ESC)."},{name:"×ª×¤×¨×™×˜×™× ×¦×¤×™× (List boxes)",legend:"בתוך תפריט צף, עבור לפריט ×”×‘× ×¢× ×˜×ב (TAB) ×ו ×—×¥ למטה. עבור לתפריט ×”×§×•×“× ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) or ×—×¥ עליון. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"×¢×¥ ××œ×ž× ×˜×™× (Elements Path)",legend:"לחץ ${elementsPathFocus} כדי לנווט לעץ ×”×למנטי×. עבור לפריט ×”×‘× ×¢× ×˜×ב (TAB) ×ו ×—×¥ ימני. עבור לפריט ×”×§×•×“× ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) ×ו ×—×¥ שמ×לי. לחץ רווח ×ו ×נטר (ENTER) כדי לבחור ×ת ×”×למנט בעורך."}]},{name:"פקודות",items:[{name:" ביטול צעד ×חרון",legend:"לחץ ${undo}"},{name:" חזרה על צעד ×חרון",legend:"לחץ ${redo}"},{name:" הדגשה",legend:"לחץ ${bold}"},{name:" הטייה",legend:"לחץ ${italic}"},{name:" הוספת קו תחתון",legend:"לחץ ${underline}"},{name:" הוספת לינק",
+legend:"לחץ ${link}"},{name:" כיווץ סרגל הכלי×",legend:"לחץ ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" הור×ות נגישות",legend:"לחץ ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js
new file mode 100644
index 000000000..4a8f17928
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hi",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"सामानà¥à¤¯",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js
new file mode 100644
index 000000000..b8ff14a10
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hr",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Općenito",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js
new file mode 100644
index 000000000..f3bd161ed
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hu",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Ãltalános",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/it.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/it.js
new file mode 100644
index 000000000..e734f7dc6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/it.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","it",{title:"Istruzioni di Accessibilità",contents:"Contenuti di Aiuto. Per chiudere questa finestra premi ESC.",legend:[{name:"Generale",items:[{name:"Barra degli strumenti Editor",legend:"Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti."},
+{name:"Finestra Editor",legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."},
+{name:"Menù contestuale Editor",legend:"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC."},
+{name:"Box Lista Editor",legend:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giù. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:"Barra percorso elementi editor",legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere l'elemento nell'editor."}]},
+{name:"Comandi",items:[{name:" Annulla comando",legend:"Premi ${undo}"},{name:" Ripeti comando",legend:"Premi ${redo}"},{name:" Comando Grassetto",legend:"Premi ${bold}"},{name:" Comando Corsivo",legend:"Premi ${italic}"},{name:" Comando Sottolineato",legend:"Premi ${underline}"},{name:" Comando Link",legend:"Premi ${link}"},{name:" Comando riduci barra degli strumenti",legend:"Premi ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Aiuto Accessibilità",legend:"Premi ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js
new file mode 100644
index 000000000..28cd8004d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ja",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"全般",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js
new file mode 100644
index 000000000..c85c6822d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ku",{title:"ڕێنمای لەبەردەستدابوون",contents:"پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.",legend:[{name:"گشتی",items:[{name:"تووڵامرازی ده‌ستكاریكه‌ر",legend:"کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB له‌گه‌ڵ‌ SHIFT-TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز."},{name:"دیالۆگی ده‌ستكاریكه‌ر",
+legend:"لەهەمانکاتدا کەتۆ لەدیالۆگی, کلیکی کلیلی TAB بۆ ڕابەری خانەی دیالۆگێکی تر, داگرتنی کلیلی SHIFT + TAB بۆ گواستنەوەی بۆ خانەی پێشووتر, کلیكی کلیلی ENTER بۆ ڕازیکردنی دیالۆگەکە, کلیكی کلیلی ESC بۆ هەڵوەشاندنەوەی دیالۆگەکە. بۆ دیالۆگی لەبازدەری (تابی) زیاتر, کلیكی کلیلی ALT + F10 بۆ ڕابه‌ری لیستی بازده‌ره‌کان. بۆ چوونه‌ بازده‌ری تابی داهاتوو کلیكی کلیلی TAB یان کلیلی تیری ده‌ستی ڕاست. بۆچوونه‌ بازده‌ری تابی پێشوو داگرتنی کلیلی SHIFT + TAB یان کلیلی تیری ده‌ستی چه‌پ. کلیی کلیلی SPACE یان ENTER بۆ هه‌ڵبژاردنی بازده‌ر (تاب)."},
+{name:"پێڕستی سه‌رنووسه‌ر",legend:"کلیك ${contextMenu} یان دوگمه‌ی لیسته‌(Menu) بۆ کردنه‌وه‌ی لیسته‌ی ده‌ق. بۆ چوونه‌ هه‌ڵبژارده‌یه‌کی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو له‌خواره‌وه‌ بۆ چوون بۆ هه‌ڵبژارده‌ی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سه‌ره‌وه. داگرتنی کلیلی SPACE یان ENTER بۆ هه‌ڵبژاردنی هه‌ڵبژارده‌ی لیسته‌. بۆ کردنه‌وه‌ی لقی ژێر لیسته‌ له‌هه‌ڵبژارده‌ی لیسته‌ کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری ده‌ستی ڕاست. بۆ گه‌ڕانه‌وه بۆ سه‌ره‌وه‌ی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری ده‌ستی چه‌پ. بۆ داخستنی لیسته‌ کلیكی کلیلی ESC بکه."},
+{name:"لیستی سنووقی سه‌رنووسه‌ر",legend:"له‌ناو سنوقی لیست, چۆن بۆ هه‌ڵنبژارده‌ی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو له‌خوار. چوون بۆ هه‌ڵبژارده‌ی لیستی پێشوو کلیکی کلیلی SHIFT + TAB یان کلیلی تیری ڕوو له‌سه‌ره‌وه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هه‌ڵبژارده‌ی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست."},{name:"تووڵامرازی توخم",legend:"کلیك ${elementsPathFocus} بۆ ڕابه‌ری تووڵامرازی توخمه‌کان. چوون بۆ دوگمه‌ی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری ده‌ستی ڕاست. چوون بۆ دوگمه‌ی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری ده‌ستی چه‌پ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمه‌که‌ له‌سه‌رنووسه."}]},
+{name:"Ùه‌رمانه‌کان",items:[{name:"Ùه‌رمانی پووچکردنه‌وه",legend:"کلیك ${undo}"},{name:"Ùه‌رمانی هه‌ڵگه‌ڕانه‌وه",legend:"کلیك ${redo}"},{name:"Ùه‌رمانی ده‌قی قه‌ڵه‌و",legend:"کلیك ${bold}"},{name:"Ùه‌رمانی ده‌قی لار",legend:"کلیك ${italic}"},{name:"Ùه‌رمانی ژێرهێڵ",legend:"کلیك ${underline}"},{name:"Ùه‌رمانی به‌سته‌ر",legend:"کلیك ${link}"},{name:"شارده‌نه‌وه‌ی تووڵامراز",legend:"کلیك ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"ده‌ستپێگه‌یشتنی یارمه‌تی",legend:"کلیك ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js
new file mode 100644
index 000000000..1cbb42857
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","lt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Bendros savybÄ—s",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js
new file mode 100644
index 000000000..d93a754a6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","lv",{title:"PieejamÄ«bas instrukcija",contents:"PalÄ«dzÄ«bas saturs. Lai aizvÄ“rtu ciet Å¡o dialogu nospiediet ESC.",legend:[{name:"Galvenais",items:[{name:"Redaktora rÄ«kjosla",legend:"Nospiediet ${toolbarFocus} lai pÄrvietotos uz rÄ«kjoslu. Lai pÄrvietotos uz nÄkoÅ¡o vai iepriekšējo rÄ«kjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pÄrvietotos uz nÄkoÅ¡o vai iepriekšējo rÄ«kjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizÄ“tu rÄ«kjosla pogu."},
+{name:"Redaktora dialoga logs",legend:"Dialoga logÄ nospiediet pogu TAB lai pÄrvietotos uz nÄkoÅ¡o dialoga loga lauku, nospiediet SHIFT+TAB lai atgrieztos iepriekšējÄ laukÄ, nospiediet ENTER lai apstiprinÄtu dialoga datus, nospiediet ESC lai aizvÄ“rtu Å¡o dialogu. Dialogam kuram ir vairÄkas cilnes, nospiediet ALT+F10 lai pÄrvietotos uz nepiecieÅ¡amo cilni. Lai pÄrvietotos uz nÄkoÅ¡o cilni izmantojiet pogu TAB vai Labo bultiņu. Lai pÄrvietotos uz iepriekšējo cilni nospiediet SHIFT+TAB vai kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvÄ“lÄ“tos lapas cilni."},
+{name:"Redaktora satura izvÄ“le",legend:"Nospiediet ${contextMenu} vai APPLICATION KEY lai atvÄ“rtu satura izvÄ“lni. Lai pÄrvietotos uz nÄkoÅ¡o izvÄ“lnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pÄrvietotos uz iepriekšējo opciju izmantojiet SHIFT+TAB vai pogu Bultiņa uz augÅ¡u. Nospiediet SPACE vai ENTER lai izvelÄ“tos izvÄ“lnes opciju. Atveriet tekoÅ¡ajÄ opcija apakÅ¡izvÄ“lni ar SAPCE vai ENTER ka ari to var izdarÄ«t ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvÄ“lni nospiediet ESC vai Kreiso bultiņu. Lai aizvÄ“rtu ciet izvÄ“lnes saturu nospiediet ESC."},
+{name:"Redaktora saraksta lauks",legend:"Saraksta laukÄ, lai pÄrvietotos uz nÄkoÅ¡o saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pÄrvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augÅ¡u. Nospiediet SPACE vai ENTER lai izvÄ“lÄ“tos saraksta opcijas. Nospiediet ESC lai aizvÄ“rtu saraksta lauku. "},{name:"Redaktora elementa ceļa josla",legend:"Nospiediet ${elementsPathFocus} lai pÄrvietotos uz elementa ceļa joslu. Lai pÄrvietotos uz nÄkoÅ¡o elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pÄrvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT + TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvÄ“lÄ“tos elementu redaktorÄ."}]},
+{name:"Komandas",items:[{name:"Komanda atcelt darbÄ«bu",legend:"Nospiediet ${undo}"},{name:"Komanda atkÄrtot darbÄ«bu",legend:"Nospiediet ${redo}"},{name:"Treknraksta komanda",legend:"Nospiediet ${bold}"},{name:"KursÄ«va komanda",legend:"Nospiediet ${italic}"},{name:"ApakÅ¡svÄ«tras komanda ",legend:"Nospiediet ${underline}"},{name:"Hipersaites komanda",legend:"Nospiediet ${link}"},{name:"RÄ«kjoslas aizvÄ“rÅ¡anas komanda",legend:"Nospiediet ${toolbarCollapse}"},{name:" Access previous focus space command",
+legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Pieejamības palīdzība",legend:"Nospiediet ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js
new file mode 100644
index 000000000..935316163
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","mk",{title:"ИнÑтрукции за приÑтапноÑÑ‚",contents:"Содржина на делот за помош. За да го затворите овој дијалот притиÑнете ESC.",legend:[{name:"Општо",items:[{name:"Мени за едиторот",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Дијалот за едиторот",
+legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},
+{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},
+{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js
new file mode 100644
index 000000000..f9588d609
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","mn",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Ерөнхий",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js
new file mode 100644
index 000000000..7bb3de5ba
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","nb",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor",
+legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."},
+{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]},
+{name:"Kommandoer",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Link",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js
new file mode 100644
index 000000000..524cdfd5b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","nl",{title:"Toegankelijkheidsinstructies",contents:"Help inhoud. Druk op ESC om dit dialoog te sluiten.",legend:[{name:"Algemeen",items:[{name:"Werkbalk tekstverwerker",legend:"Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren."},
+{name:"Dialoog tekstverwerker",legend:"In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren."},
+{name:"Contextmenu tekstverwerker",legend:"Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC."},{name:"Keuzelijst tekstverwerker",legend:"In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten."},
+{name:"Elementenpad werkbalk tekstverwerker",legend:"Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker."}]},{name:"Opdrachten",items:[{name:"Ongedaan maken opdracht",legend:"Druk op ${undo}"},{name:"Opnieuw uitvoeren opdracht",legend:"Druk op ${redo}"},{name:"Vetgedrukt opdracht",
+legend:"Druk up ${bold}"},{name:"Cursief opdracht",legend:"Druk op ${italic}"},{name:"Onderstrepen opdracht",legend:"Druk op ${underline}"},{name:"Link opdracht",legend:"Druk op ${link}"},{name:"Werkbalk inklappen opdracht",legend:"Druk op ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Toegankelijkheidshulp",legend:"Druk op ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/no.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/no.js
new file mode 100644
index 000000000..dfb849378
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/no.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","no",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor",
+legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."},
+{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]},
+{name:"Kommandoer",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Link",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js
new file mode 100644
index 000000000..7bbc9e4b6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pl",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Ogólne",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js
new file mode 100644
index 000000000..cc8d4f408
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pt-br",{title:"Instruções de Acessibilidade",contents:"Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.",legend:[{name:"Geral",items:[{name:"Barra de Ferramentas do Editor",legend:"Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT-TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."},
+{name:"Diálogo do Editor",legend:"Dentro de um diálogo, pressione TAB para navegar para o próximo campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diálogo, pressione ESC para cancelar o diálogo. Para diálogos que tem múltiplas abas, pressione ALT + F10 para navegar para a lista de abas, então mova para a próxima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba."},{name:"Menu de Contexto do Editor",legend:"Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC."},
+{name:"Caixa de Lista do Editor",legend:"Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT + TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista."},{name:"Barra de Caminho do Elementos do Editor",legend:"Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor."}]},
+{name:"Comandos",items:[{name:" Comando Desfazer",legend:"Pressione ${undo}"},{name:" Comando Refazer",legend:"Pressione ${redo}"},{name:" Comando Negrito",legend:"Pressione ${bold}"},{name:" Comando Itálico",legend:"Pressione ${italic}"},{name:" Comando Sublinhado",legend:"Pressione ${underline}"},{name:" Comando Link",legend:"Pressione ${link}"},{name:" Comando Fechar Barra de Ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Ajuda de Acessibilidade",legend:"Pressione ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js
new file mode 100644
index 000000000..08e50f872
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Geral",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js
new file mode 100644
index 000000000..e4794d296
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ro",{title:"Instrucțiuni de accesibilitate",contents:"Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.",legend:[{name:"General",items:[{name:"Editează bara.",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Dialog editor",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor meniu contextual",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js
new file mode 100644
index 000000000..cf0fce565
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ru",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ОÑновное",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js
new file mode 100644
index 000000000..1093ed9ac
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sk",{title:"InÅ¡trukcie prístupnosti",contents:"Pomocný obsah. Pre zatvorenie tohto okna, stlaÄte ESC.",legend:[{name:"VÅ¡eobecne",items:[{name:"LiÅ¡ta nástrojov editora",legend:"StlaÄte ${toolbarFocus} pre navigáciu na liÅ¡tu nástrojov. Medzi ÄalÅ¡ou a predchádzajúcou liÅ¡tou nástrojov sa pohybujete s TAB a SHIFT-TAB. Medzi Äalším a predchádzajúcim tlaÄidlom na liÅ¡te nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. StlaÄte medzerník alebo ENTER pre aktiváciu tlaÄidla liÅ¡ty nástrojov."},
+{name:"Editorový dialóg",legend:"V dialogu, stlaÄte TAB pre navigáciu na ÄalÅ¡ie dialógové pole, stlaÄte STIFT + TAB pre presun na predchádzajúce pole, stlaÄte ENTER pre odoslanie dialógu, stlaÄte ESC pre zruÅ¡enie dialógu. Pre dialógy, ktoré majú viac záložiek, stlaÄte ALT + F10 pre navigácou do zoznamu záložiek. Potom sa posúvajte k ÄalÅ¡ej žáložke pomocou TAB alebo pravou šípkou. Pre presun k predchádzajúcej záložke, stlaÄte SHIFT + TAB alebo ľavú šípku. StlaÄte medzerník alebo ENTER pre vybranie záložky."},
+{name:"Editorové kontextové menu",legend:"StlaÄte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ÄalÅ¡ie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT + TAB alebo hornou šípkou. StlaÄte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodiÄovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC."},
+{name:"Editorov box zoznamu",legend:"V boxe zoznamu, presuňte sa na ÄalÅ¡iu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT + TAB alebo hornou šípkou. StlaÄte medzerník alebo ENTER pre výber možnosti zoznamu. StlaÄte ESC pre zatvorenie boxu zoznamu."},{name:"Editorove pásmo cesty prvku",legend:"StlaÄte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlaÄidlo ÄalÅ¡ieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlaÄidlu s SHIFT + TAB alebo ľavou šípkou. StlaÄte medzerník alebo ENTER pre výber prvku v editore."}]},
+{name:"Príkazy",items:[{name:"VrátiÅ¥ príkazy",legend:"StlaÄte ${undo}"},{name:"Nanovo vrátiÅ¥ príkaz",legend:"StlaÄte ${redo}"},{name:"Príkaz na stuÄnenie",legend:"StlaÄte ${bold}"},{name:"Príkaz na kurzívu",legend:"StlaÄte ${italic}"},{name:"Príkaz na podÄiarknutie",legend:"StlaÄte ${underline}"},{name:"Príkaz na odkaz",legend:"StlaÄte ${link}"},{name:"Príkaz na zbalenie liÅ¡ty nástrojov",legend:"StlaÄte ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Pomoc prístupnosti",legend:"StlaÄte ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js
new file mode 100644
index 000000000..d6ad1c4b3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sl",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Splošno",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js
new file mode 100644
index 000000000..cf50e4b8d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sv",{title:"Hjälpmedelsinstruktioner",contents:"Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.",legend:[{name:"Allmänt",items:[{name:"Editor verktygsfält",legend:"Tryck på $ {toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT-TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck Space eller ENTER för att aktivera knappen i verktygsfältet."},
+{name:"Dialogeditor",legend:"Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan. Du trycker SKIFT + TAB för att flytta till föregående fält. Tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT + F10 navigera till fliklistan. Flytta sedan till nästa flik med HÖGERPIL. Flytta till föregående flik med SHIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja fliken."},{name:"Editor för innehållsmeny",
+legend:"Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC."},{name:"Editor för List Box",legend:"Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT + TAB eller UPPIL. Tryck Space eller ENTER för att välja listan alternativet. Tryck ESC för att stänga listan-boxen."},
+{name:"Editor för elementens sökväg",legend:"Tryck på $ {elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja element i redigeraren."}]},{name:"Kommandon",items:[{name:"Kommandot ångra",legend:"Tryck på ${undo}"},{name:"Kommandot gör om",legend:"Tryck på ${redo}"},{name:"Kommandot fet stil",legend:"Tryck på ${bold}"},
+{name:"Kommandot kursiv",legend:"Tryck på ${italic}"},{name:"Kommandot understruken",legend:"Tryck på ${underline}"},{name:"kommandot länk",legend:"Tryck på ${link}"},{name:"Verktygsfält Dölj kommandot",legend:"Tryck på ${toolbarCollapse}"},{name:"Hjälp om hjälpmedel",legend:"Tryck på $ {a11yHelp}"},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js
new file mode 100644
index 000000000..bef899b6d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","tr",{title:"Erişilebilirlik Talimatları",contents:"Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.",legend:[{name:"Genel",items:[{name:"Araç Çubuğu Editörü",legend:"Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT-TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın."},
+{name:"Dialog Editörü",legend:"Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın."},
+{name:"İçerik Menü Editörü",legend:"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın."},{name:"Liste Kutusu Editörü",legend:"Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT + TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın."},
+{name:"Element Yol Çubuğu Editörü",legend:"Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT + TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın."}]},{name:"Komutlar",items:[{name:"Komutu geri al",legend:"${undo} basın"},{name:" Tekrar komutu uygula",legend:"${redo} basın"},{name:" Kalın komut",legend:"${bold} basın"},{name:" İtalik komutu",legend:"${italic} basın"},
+{name:" Alttan çizgi komutu",legend:"${underline} basın"},{name:" Bağlantı komutu",legend:"${link} basın"},{name:" Araç çubuğu Toplama komutu",legend:"${toolbarCollapse} basın"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:"Erişilebilirlik Yardımı",legend:"${a11yHelp} basın"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js
new file mode 100644
index 000000000..c6c174f2e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ug",{title:"قوشۇمچە چۈشەندۈرۈش",contents:"ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى Ø¨ÛØ³Ù‰Ú­.",legend:[{name:"ئادەتتىكى",items:[{name:"قورال بالداق تەھرىر",legend:"${toolbarFocus} Ø¨ÛØ³Ù‰Ù„سا قورال بالداققا ÙŠÛØªÛ•كلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ."},{name:"تەھرىرلىگۈچ سۆزلەشكۈسى",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"تەھرىرلىگۈچ تىزىمى",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"تەھرىرلىگۈچ ئÛÙ„ÛÙ…Ûنت يول بالداق",legend:"${elementsPathFocus} Ø¨ÛØ³Ù‰Ù„سا ئÛÙ„ÛÙ…Ûنت يول بالداققا ÙŠÛØªÛ•كلەيدۇ، TAB ياكى ئوڭ يا ئوقتا ÙƒÛيىنكى ئÛÙ„ÛÙ…Ûنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئÛÙ„ÛÙ…Ûنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئÛÙ„ÛÙ…Ûنت تاللىنىدۇ."}]},{name:"بۇيرۇق",items:[{name:"بۇيرۇقتىن ÙŠÛنىۋال",legend:"${undo} نى Ø¨ÛØ³Ù‰Ú­"},{name:"قايتىلاش بۇيرۇقى",legend:"${redo} نى Ø¨ÛØ³Ù‰Ú­"},{name:"توملىتىش بۇيرۇقى",legend:"${bold} نى Ø¨ÛØ³Ù‰Ú­"},{name:"يانتۇ بۇيرۇقى",legend:"${italic} نى Ø¨ÛØ³Ù‰Ú­"},
+{name:"ئاستى سىزىق بۇيرۇقى",legend:"${underline} نى Ø¨ÛØ³Ù‰Ú­"},{name:"ئۇلانما بۇيرۇقى",legend:"${link} نى Ø¨ÛØ³Ù‰Ú­"},{name:"قورال بالداق قاتلاش بۇيرۇقى",legend:"${toolbarCollapse} نى Ø¨ÛØ³Ù‰Ú­"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:"توسالغۇسىز لايىھە چۈشەندۈرۈشى",legend:"${a11yHelp} نى Ø¨ÛØ³Ù‰Ú­"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js
new file mode 100644
index 000000000..2451e8ccb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","uk",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ОÑновне",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js
new file mode 100644
index 000000000..e23f1f0ec
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","vi",{title:"Accessibility Instructions",contents:"Ná»™i dung Há»— trợ. Nhấn ESC để đóng há»™p thoại.",legend:[{name:"Chung",items:[{name:"Thanh công cụ soạn th",legend:"Nhấn ${toolbarFocus} để Ä‘iá»u hướng đến thanh công cụ. Nhấn TAB và SHIFT-TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÃI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÃM CÃCH hoặc ENTER để kích hoạt nút trên thanh công c."},{name:"Há»™p thoại Biên t",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Trình đơn Ngữ cảnh cBộ soạn thảo",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
new file mode 100644
index 000000000..ef3a2dbb4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","zh-cn",{title:"辅助说明",contents:"帮助内容。è¦å…³é—­æ­¤å¯¹è¯æ¡†è¯·æŒ‰ ESC 键。",legend:[{name:"常规",items:[{name:"编辑器工具æ ",legend:"按 ${toolbarFocus} 导航到工具æ ï¼Œä½¿ç”¨ TAB 键或 SHIFT+TAB 组åˆé”®é€‰æ‹©å·¥å…·æ ç»„,使用左å³ç®­å¤´é”®é€‰æ‹©æŒ‰é’®ï¼ŒæŒ‰ç©ºæ ¼é”®æˆ–回车键以应用选中的按钮。"},{name:"ç¼–è¾‘å™¨å¯¹è¯æ¡†",legend:"åœ¨å¯¹è¯æ¡†å†…,TAB 键移动到下一个字段,SHIFT + TAB 组åˆé”®ç§»åŠ¨åˆ°ä¸Šä¸€ä¸ªå­—æ®µï¼ŒENTER é”®æäº¤å¯¹è¯æ¡†ï¼ŒESC 键喿¶ˆå¯¹è¯æ¡†ã€‚å¯¹äºŽæœ‰å¤šæ ‡ç­¾çš„å¯¹è¯æ¡†ï¼Œç”¨ALT + F10æ¥ç§»åˆ°æ ‡ç­¾åˆ—表。然åŽç”¨ TAB 键或者å‘å³ç®­å¤´æ¥ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªæ ‡ç­¾ï¼›SHIFT + TAB 组åˆé”®æˆ–者å‘左箭头移动到上一个标签。用 SPACE 键或者 ENTER 键选择标签。"},{name:"编辑器上下文èœå•",legend:"用 ${contextMenu}或者 应用程åºé”® 打开上下文èœå•。然åŽç”¨ TAB 键或者下箭头键æ¥ç§»åŠ¨åˆ°ä¸‹ä¸€ä¸ªèœå•项;SHIFT + TAB 组åˆé”®æˆ–者上箭头键移动到上一个èœå•项。用 SPACE 键或者 ENTER 键选择èœå•项。用 SPACE 键,ENTER 键或者å³ç®­å¤´é”®æ‰“å¼€å­èœå•。返回èœå•用 ESC 键或者左箭头键。用 ESC 键关闭上下文èœå•。"},
+{name:"编辑器列表框",legend:"在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT + TAB 组åˆé”®æˆ–者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。"},{name:"编辑器元素路径æ ",legend:"按 ${elementsPathFocus} 以导航到元素路径æ ï¼Œä½¿ç”¨ TAB 键或å³ç®­å¤´é”®é€‰æ‹©ä¸‹ä¸€ä¸ªå…ƒç´ ï¼Œä½¿ç”¨ SHIFT+TAB 组åˆé”®æˆ–左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。"}]},{name:"命令",items:[{name:" 撤消命令",legend:"按 ${undo}"},{name:" é‡åšå‘½ä»¤",legend:"按 ${redo}"},{name:" 加粗命令",legend:"按 ${bold}"},{name:" 倾斜命令",legend:"按 ${italic}"},{name:" 下划线命令",legend:"按 ${underline}"},{name:" 链接命令",legend:"按 ${link}"},{name:" å·¥å…·æ æŠ˜å å‘½ä»¤",legend:"按 ${toolbarCollapse}"},
+{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" æ— éšœç¢è®¾è®¡è¯´æ˜Ž",legend:"按 ${a11yHelp}"}]}]}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/about.js b/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/about.js
new file mode 100644
index 000000000..3d9156bf7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/about.js
@@ -0,0 +1,6 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("about",function(a){a=a.lang.about;return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+CKEDITOR.plugins.get("about").path+'dialogs/logo_ckeditor.png);background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}</style><div class="cke_about_container"><div class="cke_about_logo"></div><p>CKEditor '+
+CKEDITOR.version+" (revision "+CKEDITOR.revision+')<br><a href="http://ckeditor.com/">http://ckeditor.com</a></p><p>'+a.help.replace("$1",'<a href="http://docs.ckeditor.com/user">'+a.userGuide+"</a>")+"</p><p>"+a.moreInfo+'<br><a href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a></p><p>'+a.copy.replace("$1",'<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+"</p></div>"}]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/logo_ckeditor.png b/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/logo_ckeditor.png
new file mode 100644
index 000000000..ad0190218
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/about/dialogs/logo_ckeditor.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/autogrow/plugin.js b/mod/ckeditor/vendors/ckeditor/plugins/autogrow/plugin.js
new file mode 100644
index 000000000..3ff8d277e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/autogrow/plugin.js
@@ -0,0 +1,178 @@
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+/**
+ * @fileOverview AutoGrow plugin.
+ */
+
+(function() {
+
+ // Actual content height, figured out by appending check the last element's document position.
+ function contentHeight( scrollable ) {
+ var overflowY = scrollable.getStyle( 'overflow-y' );
+
+ var doc = scrollable.getDocument();
+ // Create a temporary marker element.
+ var marker = CKEDITOR.dom.element.createFromHtml( '<span style="margin:0;padding:0;border:0;clear:both;width:1px;height:1px;display:block;">' + ( CKEDITOR.env.webkit ? '&nbsp;' : '' ) + '</span>', doc );
+ doc[ CKEDITOR.env.ie ? 'getBody' : 'getDocumentElement' ]().append( marker );
+
+ var height = marker.getDocumentPosition( doc ).y + marker.$.offsetHeight;
+ marker.remove();
+ scrollable.setStyle( 'overflow-y', overflowY );
+ return height;
+ }
+
+ function getScrollable( editor ) {
+ var doc = editor.document,
+ body = doc.getBody(),
+ htmlElement = doc.getDocumentElement();
+
+ // Quirks mode overflows body, standards overflows document element
+ return doc.$.compatMode == 'BackCompat' ? body : htmlElement;
+ }
+
+ var resizeEditor = function( editor ) {
+ if ( !editor.window )
+ return;
+
+ var maximize = editor.getCommand( 'maximize' );
+ // Disable autogrow when the editor is maximized .(#6339)
+ if( maximize && maximize.state == CKEDITOR.TRISTATE_ON )
+ return;
+
+ var scrollable = getScrollable( editor ),
+ currentHeight = editor.window.getViewPaneSize().height,
+ newHeight = contentHeight( scrollable );
+
+ // Additional space specified by user.
+ newHeight += ( editor.config.autoGrow_bottomSpace || 0 );
+
+ var min = editor.config.autoGrow_minHeight != undefined ? editor.config.autoGrow_minHeight : 200,
+ max = editor.config.autoGrow_maxHeight || Infinity;
+
+ newHeight = Math.max( newHeight, min );
+ newHeight = Math.min( newHeight, max );
+
+ if ( newHeight != currentHeight ) {
+ newHeight = editor.fire( 'autoGrow', { currentHeight: currentHeight, newHeight: newHeight } ).newHeight;
+ editor.resize( editor.container.getStyle( 'width' ), newHeight, true );
+ }
+
+ if ( scrollable.$.scrollHeight > scrollable.$.clientHeight && newHeight < max )
+ scrollable.setStyle( 'overflow-y', 'hidden' );
+ else
+ scrollable.removeStyle( 'overflow-y' );
+
+
+ };
+
+ CKEDITOR.plugins.add( 'autogrow', {
+ init: function( editor ) {
+
+ // This feature is available only for themed ui instance.
+ if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )
+ return;
+
+ editor.on( 'instanceReady', function() {
+
+ var editable = editor.editable();
+
+ // Simply set auto height with div wysiwyg.
+ if ( editable.isInline() )
+ editor.ui.space( 'contents' ).setStyle( 'height', 'auto' );
+ // For framed wysiwyg we need to resize the editor.
+ else
+ {
+ editor.addCommand( 'autogrow', {
+ exec:resizeEditor,
+ modes:{ wysiwyg:1 },
+ readOnly: 1,
+ canUndo: false,
+ editorFocus: false
+ } );
+
+ var eventsList = { contentDom:1,key:1,selectionChange:1,insertElement:1,mode:1 };
+ for ( var eventName in eventsList ) {
+ editor.on( eventName, function( evt ) {
+ // Some time is required for insertHtml, and it gives other events better performance as well.
+ if ( evt.editor.mode == 'wysiwyg' ) {
+ setTimeout( function() {
+ resizeEditor( evt.editor );
+ // Second pass to make correction upon
+ // the first resize, e.g. scrollbar.
+ resizeEditor( evt.editor );
+ }, 100 );
+ }
+ });
+ }
+
+ // Coordinate with the "maximize" plugin. (#9311)
+ editor.on( 'afterCommandExec', function( evt ) {
+ if ( evt.data.name == 'maximize' && evt.editor.mode == 'wysiwyg' ) {
+ if ( evt.data.command.state == CKEDITOR.TRISTATE_ON ) {
+ var scrollable = getScrollable( editor );
+ scrollable.removeStyle( 'overflow' );
+ }
+ else
+ resizeEditor( editor );
+ }
+ });
+
+ editor.config.autoGrow_onStartup && editor.execCommand( 'autogrow' );
+ }
+ });
+ }
+ });
+})();
+
+/**
+ * The minimum height that the editor can reach using the AutoGrow feature.
+ *
+ * config.autoGrow_minHeight = 300;
+ *
+ * @since 3.4
+ * @cfg {Number} [autoGrow_minHeight=200]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * The maximum height that the editor can reach using the AutoGrow feature. Zero means unlimited.
+ *
+ * config.autoGrow_maxHeight = 400;
+ *
+ * @since 3.4
+ * @cfg {Number} [autoGrow_maxHeight=0]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Whether to have the auto grow happen on editor creation.
+ *
+ * config.autoGrow_onStartup = true;
+ *
+ * @since 3.6.2
+ * @cfg {Boolean} [autoGrow_onStartup=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Extra height in pixel to leave between the bottom boundary of content with document size when auto resizing.
+ *
+ * @since 3.6.2
+ * @cfg {Number} [autoGrow_bottomSpace=0]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Fired when the AutoGrow plugin is about to change the size of the editor.
+ *
+ * @event autogrow
+ * @member CKEDITOR.editor
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @param data
+ * @param {Number} data.currentHeight The current height of the editor (before resizing).
+ * @param {Number} data.newHeight The new height of the editor (after resizing). It can be changed
+ * to determine a different height value to be used instead.
+ */
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/autogrow/samples/autogrow.html b/mod/ckeditor/vendors/ckeditor/plugins/autogrow/samples/autogrow.html
new file mode 100644
index 000000000..72cba9032
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/autogrow/samples/autogrow.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>AutoGrow Plugin &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <link rel="stylesheet" href="../../../samples/sample.css">
+ <meta name="ckeditor-sample-name" content="AutoGrow plugin">
+ <meta name="ckeditor-sample-group" content="Plugins">
+ <meta name="ckeditor-sample-description" content="Using the AutoGrow plugin in order to make the editor grow to fit the size of its content.">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Using AutoGrow Plugin
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor instances to use the
+ <strong>AutoGrow</strong> (<code>autogrow</code>) plugin that lets the editor window expand
+ and shrink depending on the amount and size of content entered in the editing area.
+ </p>
+ <p>
+ In its default implementation the <strong>AutoGrow feature</strong> can expand the
+ CKEditor window infinitely in order to avoid introducing scrollbars to the editing area.
+ </p>
+ <p>
+ It is also possible to set a maximum height for the editor window. Once CKEditor
+ editing area reaches the value in pixels specified in the
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-autoGrow_maxHeight">autoGrow_maxHeight</a></code>
+ configuration setting, scrollbars will be added and the editor window will no longer expand.
+ </p>
+ <p>
+ To add a CKEditor instance using the <code>autogrow</code> plugin and its
+ <code>autoGrow_maxHeight</code> attribute, insert the following JavaScript call to your code:
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>extraPlugins: 'autogrow',</strong>
+ autoGrow_maxHeight: 800,
+
+ // Remove the Resize plugin as it does not make sense to use it in conjunction with the AutoGrow plugin.
+ removePlugins: 'resize'
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced with CKEditor. The maximum height should
+ be given in pixels.
+ </p>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ CKEditor using the <code>autogrow</code> plugin with its default configuration:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace( 'editor1', {
+ extraPlugins: 'autogrow',
+ removePlugins: 'resize'
+ });
+
+ </script>
+ </p>
+ <p>
+ <label for="editor2">
+ CKEditor using the <code>autogrow</code> plugin with maximum height set to 400 pixels:
+ </label>
+ <textarea cols="80" id="editor2" name="editor2" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace( 'editor2', {
+ extraPlugins: 'autogrow',
+ autoGrow_maxHeight: 400,
+ removePlugins: 'resize'
+ });
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/clipboard/dialogs/paste.js b/mod/ckeditor/vendors/ckeditor/plugins/clipboard/dialogs/paste.js
new file mode 100644
index 000000000..8f94a715a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/clipboard/dialogs/paste.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("paste",function(c){function g(a){var b=new CKEDITOR.dom.document(a.document),d=b.getBody(),e=b.getById("cke_actscrpt");e&&e.remove();d.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement));
+b.getWindow().getFrame().removeCustomData("pendingFocus")&&d.focus()}var f=c.lang.clipboard,h=CKEDITOR.env.isCustomDomain();c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:f.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||f.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat||
+CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'<div style="white-space:normal;width:340px">'+f.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+f.pasteMsg+"</div>"},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(),
+b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(g,a)+",this);<\/script></body></html>",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0" allowTransparency="true" src="'+
+(CKEDITOR.env.air?"javascript:void(0)":h?"javascript:void((function(){document.open();document.domain='"+document.domain+"';document.close();})())\"":"")+'" role="region" aria-label="'+f.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());CKEDITOR.env.air&&g.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();
+a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var e=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');e.on("focus",function(){d.$.contentWindow.focus()});a.append(e);this.focus=function(){e.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height",d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),
+d=b.getBogus(),c;d&&d.remove();c=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",c)},0)}}]}]}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/dialog/dialogDefinition.js b/mod/ckeditor/vendors/ckeditor/plugins/dialog/dialogDefinition.js
new file mode 100644
index 000000000..2cb5d24b3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/dialog/dialogDefinition.js
@@ -0,0 +1,4 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/fakeobjects/images/spacer.gif b/mod/ckeditor/vendors/ckeditor/plugins/fakeobjects/images/spacer.gif
new file mode 100644
index 000000000..5bfd67a2d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/fakeobjects/images/spacer.gif
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/icons.png b/mod/ckeditor/vendors/ckeditor/plugins/icons.png
new file mode 100644
index 000000000..eae75d2b4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/icons.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/image/dialogs/image.js b/mod/ckeditor/vendors/ckeditor/plugins/image/dialogs/image.js
new file mode 100644
index 000000000..35903de4e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/image/dialogs/image.js
@@ -0,0 +1,41 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/,
+w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a,
+b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!=b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio?
+e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"â– ":"â–£":CKEDITOR.env.ie?"â–¡":"â–¢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d?
+("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement;a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);CKEDITOR.document.getById(m).setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")},
+0,this);this.dontResetSize=this.firstLoad=!1},h=function(){var a=this.originalElement;a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);CKEDITOR.document.getById(m).setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"),
+z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1);CKEDITOR.document.getById(m).setStyle("display","none");t=new CKEDITOR.dom.element("img",a.document);
+this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;var c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==j&&
+this.setupContent(2,d)}if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img");l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display",
+"none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"),this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==
+j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement);this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),
+this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)},onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),
+5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement=!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px",
+"110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display","");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);t.setAttribute("src",b);a.preview.setAttribute("src",t.$.src);g(a)}else a.preview&&
+(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()),b.setAttribute("src",this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",
+id:"browse",style:"display:inline-block;margin-top:10px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},
+{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"40px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("width",CKEDITOR.tools.cssLength(c)):
+b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?c.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"40px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],
+10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("height",CKEDITOR.tools.cssLength(c)):b.removeStyle("height"),!d&&b.removeAttribute("height")):4==a?c.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",type:"html",style:"margin-top:30px;width:40px;height:40px;",
+onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover",function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")},a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info",
+"txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")},b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.resetSize+
+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&
+parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",
+width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,c){var e=parseInt(this.getValue(),
+10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")):(b.setStyle("margin-left",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,
+"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):
+(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",type:"select",widths:["35%","65%"],style:"width:90px",label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,
+"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float");switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",
+id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+
+"</td></tr></table></div></div>"}]}]}]},{id:"Link",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=decodeURI(this.getValue());b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink=
+!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")||
+"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"],
+children:[{type:"text",id:"linkId",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))},commit:function(a,
+b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))},commit:function(a,b){a==f&&(this.getValue()||
+this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",label:c.lang.common.advisoryTitle,"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},
+commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a,b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,
+e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}};CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/image/images/noimage.png b/mod/ckeditor/vendors/ckeditor/plugins/image/images/noimage.png
new file mode 100644
index 000000000..159811305
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/image/images/noimage.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/anchor.js b/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/anchor.js
new file mode 100644
index 000000000..4c5153ce1
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/anchor.js
@@ -0,0 +1,8 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("anchor",function(c){var d=function(a){this._.selectedElement=a;this.setValueOf("info","txtName",a.data("cke-saved-name")||"")};return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=c.document.createElement("a",{attributes:a}),c.createFakeElement(a,"cke_anchor","anchor").replace(this._.selectedElement)):
+this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(CKEDITOR.plugins.link.synAnchorSelector&&(a["class"]="cke_anchor_empty"),CKEDITOR.plugins.link.emptyAnchorFix&&(a.contenteditable="false",a["data-cke-editable"]=1),a=c.document.createElement("a",{attributes:a}),CKEDITOR.plugins.link.fakeAnchor&&(a=c.createFakeElement(a,"cke_anchor","anchor")),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",
+attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement();if(b)CKEDITOR.plugins.link.fakeAnchor?((a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))&&d.call(this,a),this._.selectedElement=b):b.is("a")&&b.hasAttribute("name")&&d.call(this,b);else if(b=CKEDITOR.plugins.link.getSelectedLink(c))d.call(this,b),a.selectElement(b);this.getContentElement("info","txtName").focus()},contents:[{id:"info",
+label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/link.js b/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/link.js
new file mode 100644
index 000000000..33533b568
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/link/dialogs/link.js
@@ -0,0 +1,36 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("link",function(n){var p,q;function r(a){return a.replace(/'/g,"\\$&")}function t(a){var g,c=p,d,e;g=[q,"("];for(var b=0;b<c.length;b++)d=c[b].toLowerCase(),e=a[d],0<b&&g.push(","),g.push("'",e?r(encodeURIComponent(a[d])):"","'");g.push(")");return g.join("")}function u(a){for(var g,c=a.length,d=[],e=0;e<c;e++)g=a.charCodeAt(e),d.push(g);return"String.fromCharCode("+d.join(",")+")"}function v(a){return(a=a.getAttribute("class"))?a.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g,
+""):""}var w=CKEDITOR.plugins.link,s=function(){var a=this.getDialog(),g=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),c=this.getValue();if(g&&a)switch(g=g.getElement(),g.hide(),a.setValue(""),c){case "frame":a.setLabel(n.lang.link.targetFrameName);a.getElement().show();break;case "popup":g.show();a.setLabel(n.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(c),a.getElement().hide()}},x=/^javascript:/,y=/^mailto:([^?]+)(?:\?(.+))?$/,
+z=/subject=([^;?:@&=$,\/]*)/,A=/body=([^;?:@&=$,\/]*)/,B=/^#(.*)$/,C=/^((?:http|https|ftp|news):\/\/)?(.*)$/,D=/^(_(?:self|top|parent|blank))$/,E=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,F=/^javascript:([^(]+)\(([^)]+)\)$/,G=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,H=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,I=function(a,g){var c=g&&(g.data("cke-saved-href")||g.getAttribute("href"))||"",d,e,b=
+{};c.match(x)&&("encode"==o?c=c.replace(E,function(a,c,b){return"mailto:"+String.fromCharCode.apply(String,c.split(","))+(b&&b.replace(/\\'/g,"'"))}):o&&c.replace(F,function(a,c,d){if(c==q){b.type="email";for(var a=b.email={},c=/(^')|('$)/g,d=d.match(/[^,\s]+/g),e=d.length,g,f,h=0;h<e;h++)g=decodeURIComponent,f=d[h].replace(c,"").replace(/\\'/g,"'"),f=g(f),g=p[h].toLowerCase(),a[g]=f;a.address=[a.name,a.domain].join("@")}}));if(!b.type)if(d=c.match(B))b.type="anchor",b.anchor={},b.anchor.name=b.anchor.id=
+d[1];else if(d=c.match(y)){e=c.match(z);c=c.match(A);b.type="email";var f=b.email={};f.address=d[1];e&&(f.subject=decodeURIComponent(e[1]));c&&(f.body=decodeURIComponent(c[1]))}else c&&(e=c.match(C))?(b.type="url",b.url={},b.url.protocol=e[1],b.url.url=e[2]):b.type="url";if(g){d=g.getAttribute("target");b.target={};b.adv={};if(d)d.match(D)?b.target.type=b.target.name=d:(b.target.type="frame",b.target.name=d);else if(d=(d=g.data("cke-pa-onclick")||g.getAttribute("onclick"))&&d.match(G)){b.target.type=
+"popup";for(b.target.name=d[1];c=H.exec(d[2]);)("yes"==c[2]||"1"==c[2])&&!(c[1]in{height:1,width:1,top:1,left:1})?b.target[c[1]]=!0:isFinite(c[2])&&(b.target[c[1]]=c[2])}d=function(a,c){var d=g.getAttribute(c);null!==d&&(b.adv[a]=d||"")};d("advId","id");d("advLangDir","dir");d("advAccessKey","accessKey");b.adv.advName=g.data("cke-saved-name")||g.getAttribute("name")||"";d("advLangCode","lang");d("advTabIndex","tabindex");d("advTitle","title");d("advContentType","type");CKEDITOR.plugins.link.synAnchorSelector?
+b.adv.advCSSClasses=v(g):d("advCSSClasses","class");d("advCharset","charset");d("advStyles","style");d("advRel","rel")}d=b.anchors=[];var h;if(CKEDITOR.plugins.link.emptyAnchorFix){f=a.document.getElementsByTag("a");c=0;for(e=f.count();c<e;c++)if(h=f.getItem(c),h.data("cke-saved-name")||h.hasAttribute("name"))d.push({name:h.data("cke-saved-name")||h.getAttribute("name"),id:h.getAttribute("id")})}else{f=new CKEDITOR.dom.nodeList(a.document.$.anchors);c=0;for(e=f.count();c<e;c++)h=f.getItem(c),d[c]=
+{name:h.getAttribute("name"),id:h.getAttribute("id")}}if(CKEDITOR.plugins.link.fakeAnchor){f=a.document.getElementsByTag("img");c=0;for(e=f.count();c<e;c++)(h=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,f.getItem(c)))&&d.push({name:h.getAttribute("name"),id:h.getAttribute("id")})}this._.selectedElement=g;return b},j=function(a){a.target&&this.setValue(a.target[this.id]||"")},k=function(a){a.adv&&this.setValue(a.adv[this.id]||"")},l=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||
+""},m=function(a){a.adv||(a.adv={});a.adv[this.id]=this.getValue()||""},o=n.config.emailProtection||"";o&&"encode"!=o&&(q=p=void 0,o.replace(/^([^(]+)\(([^)]+)\)$/,function(a,b,c){q=b;p=[];c.replace(/[^,\s]+/g,function(a){p.push(a)})}));var i=n.lang.common,b=n.lang.link;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=
+this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],c=this.getValue(),d=a.definition.getContents("upload"),d=d&&d.hidden;if(c=="url"){n.config.linkShowTargetTab&&a.showPage("target");d||a.showPage("upload")}else{a.hidePage("target");d||a.hidePage("upload")}for(d=0;d<b.length;d++){var e=a.getContentElement("info",b[d]);if(e){e=e.getElement().getParent().getParent();b[d]==c+"Options"?e.show():e.hide()}}a.layout()},setup:function(a){a.type&&this.setValue(a.type)},commit:function(a){a.type=
+this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:i.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){if(!a.url)a.url={};a.url.protocol=this.getValue()}},{type:"text",id:"url",label:i.url,required:!0,onLoad:function(){this.allowOnChange=true},onKeyUp:function(){this.allowOnChange=
+false;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),c=/^((javascript:)|[#\/\.\?])/i,d=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);if(d){this.setValue(b.substr(d[0].length));a.setValue(d[0].toLowerCase())}else c.test(b)&&a.setValue("");this.allowOnChange=true},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();if(a.getContentElement("info","linkType")&&a.getValueOf("info","linkType")!="url")return true;if(/javascript\:/.test(this.getValue())){alert(i.invalidValue);
+return false}return this.getDialog().fakeObj?true:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=false;a.url&&this.setValue(a.url.url);this.allowOnChange=true},commit:function(a){this.onChange();if(!a.url)a.url={};a.url.url=this.getValue();this.allowOnChange=false}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",id:"browse",hidden:"true",filebrowser:"info:url",label:i.browseServer}]},
+{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].name&&this.add(a.anchors[b].name);a.anchor&&
+this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.focus()},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].id&&this.add(a.anchors[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.id=
+this.getValue()}}],setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(a){a.anchors.length<1?this.getElement().show():this.getElement().hide()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",
+id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||a.getValueOf("info","linkType")!="email"?true:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.select()},commit:function(a){if(!a.email)a.email={};a.email.address=this.getValue()}},{type:"text",id:"emailSubject",
+label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){if(!a.email)a.email={};a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){if(!a.email)a.email={};a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",label:b.target,title:b.target,elements:[{type:"hbox",
+widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:i.target,"default":"notSet",style:"width : 100%;",items:[[i.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[i.targetNew,"_blank"],[i.targetTop,"_top"],[i.targetSelf,"_self"],[i.targetParent,"_parent"]],onChange:s,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");s.call(this)},commit:function(a){if(!a.target)a.target={};a.target.type=this.getValue()}},{type:"text",id:"linkTargetName",label:b.targetFrameName,
+"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){if(!a.target)a.target={};a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:j,commit:l},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",
+id:"location",label:b.popupLocationBar,setup:j,commit:l},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:j,commit:l},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:j,commit:l},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:j,commit:l}]},{type:"hbox",children:[{type:"text",
+widths:["50%","50%"],labelLayout:"horizontal",label:i.width,id:"width",setup:j,commit:l},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:j,commit:l}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:i.height,id:"height",setup:j,commit:l},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:j,commit:l}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0,filebrowser:"uploadButton",
+elements:[{type:"file",id:"upload",label:i.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:i.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",label:b.id,setup:k,commit:m},{type:"select",id:"advLangDir",label:b.langDir,"default":"",style:"width:110px",items:[[i.notSet,""],[b.langDirLTR,"ltr"],
+[b.langDirRTL,"rtl"]],setup:k,commit:m},{type:"text",id:"advAccessKey",width:"80px",label:b.acccessKey,maxLength:1,setup:k,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",setup:k,commit:m},{type:"text",label:b.langCode,id:"advLangCode",width:"110px","default":"",setup:k,commit:m},{type:"text",label:b.tabIndex,id:"advTabIndex",width:"80px",maxLength:5,setup:k,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",
+label:b.advisoryTitle,"default":"",id:"advTitle",setup:k,commit:m},{type:"text",label:b.advisoryContentType,"default":"",id:"advContentType",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,"default":"",id:"advCSSClasses",setup:k,commit:m},{type:"text",label:b.charset,"default":"",id:"advCharset",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,"default":"",id:"advRel",setup:k,commit:m},{type:"text",label:b.styles,
+"default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(n.lang.common.invalidInlineStyle),setup:k,commit:m}]}]}]}],onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=w.getSelectedLink(a))&&c.hasAttribute("href")?b.selectElement(c):c=null;this.setupContent(I.apply(this,[a,c]))},onOk:function(){var a={},b=[],c={},d=this.getParentEditor();this.commitContent(c);switch(c.type||"url"){case "url":var e=c.url&&c.url.protocol!=void 0?c.url.protocol:"http://",i=c.url&&
+CKEDITOR.tools.trim(c.url.url)||"";a["data-cke-saved-href"]=i.indexOf("/")===0?i:e+i;break;case "anchor":e=c.anchor&&c.anchor.id;a["data-cke-saved-href"]="#"+(c.anchor&&c.anchor.name||e||"");break;case "email":var f=c.email,e=f.address;switch(o){case "":case "encode":var i=encodeURIComponent(f.subject||""),h=encodeURIComponent(f.body||""),f=[];i&&f.push("subject="+i);h&&f.push("body="+h);f=f.length?"?"+f.join("&"):"";if(o=="encode"){e=["javascript:void(location.href='mailto:'+",u(e)];f&&e.push("+'",
+r(f),"'");e.push(")")}else e=["mailto:",e,f];break;default:e=e.split("@",2);f.name=e[0];f.domain=e[1];e=["javascript:",t(f)]}a["data-cke-saved-href"]=e.join("")}if(c.target)if(c.target.type=="popup"){for(var e=["window.open(this.href, '",c.target.name||"","', '"],j=["resizable","status","location","toolbar","menubar","fullscreen","scrollbars","dependent"],i=j.length,f=function(a){c.target[a]&&j.push(a+"="+c.target[a])},h=0;h<i;h++)j[h]=j[h]+(c.target[j[h]]?"=yes":"=no");f("width");f("left");f("height");
+f("top");e.push(j.join(","),"'); return false;");a["data-cke-pa-onclick"]=e.join("");b.push("target")}else{c.target.type!="notSet"&&c.target.name?a.target=c.target.name:b.push("target");b.push("data-cke-pa-onclick","onclick")}if(c.adv){e=function(d,e){var f=c.adv[d];f?a[e]=f:b.push(e)};e("advId","id");e("advLangDir","dir");e("advAccessKey","accessKey");c.adv.advName?a.name=a["data-cke-saved-name"]=c.adv.advName:b=b.concat(["data-cke-saved-name","name"]);e("advLangCode","lang");e("advTabIndex","tabindex");
+e("advTitle","title");e("advContentType","type");e("advCSSClasses","class");e("advCharset","charset");e("advStyles","style");e("advRel","rel")}e=d.getSelection();a.href=a["data-cke-saved-href"];if(this._.selectedElement){d=this._.selectedElement;i=d.data("cke-saved-href");f=d.getHtml();d.setAttributes(a);d.removeAttributes(b);c.adv&&(c.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)&&d.addClass(d.getChildCount()?"cke_anchor":"cke_anchor_empty");if(i==f||c.type=="email"&&f.indexOf("@")!=-1)d.setHtml(c.type==
+"email"?c.email.address:a["data-cke-saved-href"]);e.selectElement(d);delete this._.selectedElement}else{e=e.getRanges(1)[0];if(e.collapsed){d=new CKEDITOR.dom.text(c.type=="email"?c.email.address:a["data-cke-saved-href"],d.document);e.insertNode(d);e.selectNodeContents(d)}d=new CKEDITOR.style({element:"a",attributes:a});d.type=CKEDITOR.STYLE_INLINE;d.applyToRange(e);e.select()}},onLoad:function(){n.config.linkShowAdvancedTab||this.hidePage("advanced");n.config.linkShowTargetTab||this.hidePage("target")},
+onFocus:function(){var a=this.getContentElement("info","linkType");if(a&&a.getValue()=="url"){a=this.getContentElement("info","url");a.select()}}}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/link/images/anchor.png b/mod/ckeditor/vendors/ckeditor/plugins/link/images/anchor.png
new file mode 100644
index 000000000..5025df58c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/link/images/anchor.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/magicline/images/icon.png b/mod/ckeditor/vendors/ckeditor/plugins/magicline/images/icon.png
new file mode 100644
index 000000000..b5de5ba95
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/magicline/images/icon.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/pastefromword/filter/default.js b/mod/ckeditor/vendors/ckeditor/plugins/pastefromword/filter/default.js
new file mode 100644
index 000000000..769760a84
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/pastefromword/filter/default.js
@@ -0,0 +1,31 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){function z(a){for(var a=a.toUpperCase(),b=A.length,c=0,d=0;d<b;++d)for(var e=A[d],f=e[1].length;a.substr(0,f)==e[1];a=a.substr(f))c+=e[0];return c}function B(a){for(var a=a.toUpperCase(),b=C.length,c=1,d=1;0<a.length;d*=b)c+=C.indexOf(a.charAt(a.length-1))*d,a=a.substr(0,a.length-1);return c}var D=CKEDITOR.htmlParser.fragment.prototype,v=CKEDITOR.htmlParser.element.prototype;D.onlyChild=v.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};v.removeAnyChildWithName=
+function(a){for(var b=this.children,c=[],d,e=0;e<b.length;e++)d=b[e],d.name&&(d.name==a&&(c.push(d),b.splice(e--,1)),c=c.concat(d.removeAnyChildWithName(a)));return c};v.getAncestor=function(a){for(var b=this.parent;b&&(!b.name||!b.name.match(a));)b=b.parent;return b};D.firstChild=v.firstChild=function(a){for(var b,c=0;c<this.children.length;c++)if(b=this.children[c],a(b)||b.name&&(b=b.firstChild(a)))return b;return null};v.addStyle=function(a,b,c){var d="";if("string"==typeof b)d+=a+":"+b+";";else{if("object"==
+typeof a)for(var e in a)a.hasOwnProperty(e)&&(d+=e+":"+a[e]+";");else d+=a;c=b}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(c?[d,a]:[a,d]).join(";");this.attributes.style=a.replace(/^;|;(?=;)/,"")};v.getStyle=function(a){var b=this.attributes.style;if(b)return b=CKEDITOR.tools.parseCssText(b,1),b[a]};CKEDITOR.dtd.parentOf=function(a){var b={},c;for(c in this)-1==c.indexOf("$")&&this[c][a]&&(b[c]=1);return b};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,
+E=/^(?:\b0[^\s]*\s*){1,4}$/,y={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},A=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],C="ABCDEFGHIJKLMNOPQRSTUVWXYZ",w=0,o=null,x,F=CKEDITOR.plugins.pastefromword=
+{utils:{createListBulletMarker:function(a,b){var c=new CKEDITOR.htmlParser.element("cke:listbullet");c.attributes={"cke:listsymbol":a[0]};c.add(new CKEDITOR.htmlParser.text(b));return c},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var b;return(b=a.onlyChild())&&/^(:?\s|&nbsp;)+$/.test(b.value)},resolveList:function(a){var b=a.attributes,c;if((c=a.removeAnyChildWithName("cke:listbullet"))&&c.length&&
+(c=c[0]))return a.name="cke:li",b.style&&(b.style=F.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!w&&(null!==o&&a>o)&&(w=a-o);o=a;b["cke:indent"]=w&&Math.ceil(a/w)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),c=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(c!==x&&(b["cke:reset"]=1),x=c);b["cke:indent"]=a}]])(b.style,a)||""),b["cke:indent"]||(o=0,b["cke:indent"]=
+1),CKEDITOR.tools.extend(b,c.attributes),!0;x=o=w=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(b,c,d){a.setStyle(b,c);for(var b={},c=d.length,e=0;e<c;e++)b[d[e]]=a.getStyle(d[e]);return b}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,b){var b="number"==typeof b?b:1,c=a.attributes,d;switch(c.type){case "a":d=
+"lower-alpha";break;case "1":d="decimal"}for(var e=a.children,f,h=0;h<e.length;h++)if(f=e[h],f.name in CKEDITOR.dtd.$listItem){var g=f.attributes,i=f.children,m=i[i.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--i.length||e.splice(h--,1));f.name="cke:li";c.start&&!h&&(g.value=c.start);F.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(o=CKEDITOR.tools.convertToPx(a[0]))}],1==b?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==x&&
+(g["cke:reset"]=1);x=a}]:null])(g.style);g["cke:indent"]=b;g["cke:listtype"]=a.name;g["cke:list-style-type"]=d}else if(f.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[f,b+1]);e=e.slice(0,h).concat(f.children).concat(e.slice(h+1));a.children=[];f=0;for(i=e.length;f<i;f++)a.add(e[f])}delete a.name;c["cke:list"]=1},assembleList:function(a){for(var b=a.children,c,d,e,f,h,g,a=[],i,m,j,l,k,r,p=0;p<b.length;p++)if(c=b[p],"cke:li"==c.name)if(c.name="li",d=c.attributes,j=(j=d["cke:listsymbol"])&&
+j.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=r=null,d["cke:ignored"])b.splice(p--,1);else{d["cke:reset"]&&(g=f=h=null);e=Number(d["cke:indent"]);e!=f&&(m=i=null);if(j){if(m&&y[m][i].test(j[1]))l=m,k=i;else for(var s in y)for(var t in y[s])if(y[s][t].test(j[1]))if("ol"==s&&/alpha|roman/.test(t)){if(i=/roman/.test(t)?z(j[1]):B(j[1]),!r||i<r)r=i,l=s,k=t}else{l=s;k=t;break}!l&&(l=j[2]?"ol":"ul")}else l=d["cke:listtype"]||"ol",k=d["cke:list-style-type"];m=l;i=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l?
+"decimal":"disc")&&c.addStyle("list-style-type",k);if("ol"==l&&j){switch(k){case "decimal":r=Number(j[1]);break;case "lower-roman":case "upper-roman":r=z(j[1]);break;case "lower-alpha":case "upper-alpha":r=B(j[1])}c.attributes.value=r}if(g){if(e>f)a.push(g=new CKEDITOR.htmlParser.element(l)),g.add(c),h.add(g);else{if(e<f){f-=e;for(var n;f--&&(n=g.parent);)g=n.parent}g.add(c)}b.splice(p--,1)}else a.push(g=new CKEDITOR.htmlParser.element(l)),g.add(c),b[p]=g;h=c;f=e}else g&&(g=f=h=null);for(p=0;p<a.length;p++)if(g=
+a[p],s=g.children,i=i=void 0,t=g.children.length,n=i=void 0,b=/list-style-type:(.*?)(?:;|$)/,f=CKEDITOR.plugins.pastefromword.filters.stylesFilter,i=g.attributes,!b.exec(i.style)){for(h=0;h<t;h++)if(i=s[h],i.attributes.value&&Number(i.attributes.value)==h+1&&delete i.attributes.value,i=b.exec(i.attributes.style))if(i[1]==n||!n)n=i[1];else{n=null;break}if(n){for(h=0;h<t;h++)i=s[h].attributes,i.style&&(i.style=f([["list-style-type"]])(i.style)||"");g.addStyle("list-style-type",n)}}x=o=w=null},falsyFilter:function(){return!1},
+stylesFilter:function(a,b){return function(c,d){var e=[];(c||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(c,g,f){g=g.toLowerCase();"font-family"==g&&(f=f.replace(/["']/g,""));for(var m,j,l,k=0;k<a.length;k++)if(a[k]&&(c=a[k][0],m=a[k][1],j=a[k][2],l=a[k][3],g.match(c)&&(!m||f.match(m)))){g=l||g;b&&(j=j||f);"function"==typeof j&&(j=j(f,d,g));j&&j.push&&(g=j[0],j=j[1]);"string"==typeof j&&e.push([g,j]);return}!b&&e.push([g,f])});for(var f=0;f<e.length;f++)e[f]=
+e[f].join(":");return e.length?e.join(";")+";":!1}},elementMigrateFilter:function(a,b){return a?function(c){var d=b?(new CKEDITOR.style(a,b))._.definition:a;c.name=d.element;CKEDITOR.tools.extend(c.attributes,CKEDITOR.tools.clone(d.attributes));c.addStyle(CKEDITOR.style.getStyleText(d))}:function(){}},styleMigrateFilter:function(a,b){var c=this.elementMigrateFilter;return a?function(d,e){var f=new CKEDITOR.htmlParser.element(null),h={};h[b]=d;c(a,h)(f);f.children=e.children;e.children=[f]}:function(){}},
+bogusAttrFilter:function(a,b){if(-1==b.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a){var b=CKEDITOR.dtd,c=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,a=e.falsyFilter,f=e.stylesFilter,h=e.elementMigrateFilter,g=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,m=e.flattenList,j=e.assembleList,l=this.utils.isListBulletIndicator,k=this.utils.isContainingOnlySpaces,r=this.utils.resolveList,
+p=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},s=this.utils.getStyleComponents,t=this.utils.listDtdParents,n=!1!==d.pasteFromWordRemoveFontStyles,o=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren();j(a)},elements:{"^":function(a){var b;CKEDITOR.env.gecko&&(b=e.applyStyleFilter)&&b(a)},$:function(a){var u=a.name||"",e=a.attributes;u in c&&e.style&&(e.style=f([[/^(:?width|height)$/,null,p]])(e.style)||"");if(u.match(/h\d/)){a.filterChildren();
+if(r(a))return;h(d["format_"+u])(a)}else if(u in b.$inline)a.filterChildren(),k(a)&&delete a.name;else if(-1!=u.indexOf(":")&&-1==u.indexOf("cke")){a.filterChildren();if("v:imagedata"==u){if(u=a.attributes["o:href"])a.attributes.src=u;a.name="img";return}delete a.name}u in t&&(a.filterChildren(),j(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],b={};a&&(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,
+c,d){for(var c=c.split(","),a=c.length,q=0;q<a;q++)CKEDITOR.tools.trim(c[q]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,c,q){c=c||"*";q=q.substring(1,q.length);q.match(/MsoNormal/)||(b[c]||(b[c]={}),q?b[c][q]=d:b[c]=d)})}),e.applyStyleFilter=function(a){var c=b["*"]?"*":a.name,q=a.attributes&&a.attributes["class"];c in b&&(c=b[c],"object"==typeof c&&(c=c[q]),c&&a.addStyle(c,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])||a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==
+CKEDITOR.NODE_TEXT&&!k(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren();r(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):h(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var b=a.onlyChild();if(b&&"table"==b.name){var c=a.attributes;b.attributes=CKEDITOR.tools.extend(b.attributes,c);c.style&&b.addStyle(c.style);b=new CKEDITOR.htmlParser.element("div");b.addStyle("clear","both");a.add(b);delete a.name}},
+td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:m,ul:m,dl:m,font:function(a){if(l(a.parent))delete a.name;else{a.filterChildren();var b=a.attributes,c=b.style,d=a.parent;"font"==d.name?(CKEDITOR.tools.extend(d.attributes,a.attributes),c&&d.addStyle(c),delete a.name):(c=c||"",b.color&&("#000000"!=b.color&&(c+="color:"+b.color+";"),delete b.color),b.face&&(c+="font-family:"+b.face+";",delete b.face),b.size&&(c+="font-size:"+(3<b.size?"large":3>b.size?"small":"medium")+";",delete b.size),a.name=
+"span",a.addStyle(c))}},span:function(a){if(l(a.parent))return!1;a.filterChildren();if(k(a))return delete a.name,null;if(l(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),c=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(c)return b=i(c,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(c=(b=a.attributes)&&b.style)b.style=f([["line-height"],[/^font-family$/,null,!n?g(d.font_style,"family"):
+null],[/^font-size$/,null,!n?g(d.fontSize_style,"size"):null],[/^color$/,null,!n?g(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!n?g(d.colorButton_backStyle,"color"):null]])(c,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:h(d.coreStyles_bold),i:h(d.coreStyles_italic),u:h(d.coreStyles_underline),s:h(d.coreStyles_strike),sup:h(d.coreStyles_superscript),sub:h(d.coreStyles_subscript),a:function(a){var b=a.attributes;b&&!b.href&&b.name?delete a.name:
+CKEDITOR.env.webkit&&(b.href&&b.href.match(/file:\/\/\/[\S]+#/i))&&(b.href=b.href.replace(/file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:f(o?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left":"margin-right";
+if("margin"==c)a=s(c,a,[b])[b];else if(c!=b)return null;if(a&&!E.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,E],["text-indent","0cm"],["page-break-before"],["tab-stops"],
+["display","none"],n?[/font-?/]:null],o),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":a,bgcolor:a,valign:o?a:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],
+(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:a}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),b=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(b,this.dataFilter);return b.getHtml(!0)}};CKEDITOR.cleanWord=function(a,b){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&&
+(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var c=new G,d=c.dataFilter;d.addRules(CKEDITOR.plugins.pastefromword.getRules(b));b.fire("beforeCleanWord",{filter:d});try{a=c.toHtml(a)}catch(e){alert(b.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/scayt/LICENSE.md b/mod/ckeditor/vendors/ckeditor/plugins/scayt/LICENSE.md
new file mode 100644
index 000000000..844ab4de0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/scayt/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor SCAYT Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+* GNU General Public License Version 2 or later (the "GPL"):
+ http://www.gnu.org/licenses/gpl.html
+
+* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+ http://www.gnu.org/licenses/lgpl.html
+
+* Mozilla Public License Version 1.1 or later (the "MPL"):
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/scayt/README.md b/mod/ckeditor/vendors/ckeditor/plugins/scayt/README.md
new file mode 100644
index 000000000..0f519589c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/scayt/README.md
@@ -0,0 +1,25 @@
+CKEditor SCAYT Plugin
+=====================
+
+This plugin brings Spell Check As You Type (SCAYT) into CKEditor.
+
+SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
+2. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
+
+ config.extraPlugins = 'scayt';
+
+That's all. SCAYT will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/options.js b/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/options.js
new file mode 100644
index 000000000..c243e9ff6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/options.js
@@ -0,0 +1,19 @@
+/*
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("scaytcheck",function(j){function w(){return"undefined"!=typeof document.forms["optionsbar_"+a]?document.forms["optionsbar_"+a].options:[]}function x(b,a){if(b){var e=b.length;if(void 0==e)b.checked=b.value==a.toString();else for(var d=0;d<e;d++)b[d].checked=!1,b[d].value==a.toString()&&(b[d].checked=!0)}}function n(b){f.getById("dic_message_"+a).setHtml('<span style="color:red;">'+b+"</span>")}function o(b){f.getById("dic_message_"+a).setHtml('<span style="color:blue;">'+b+"</span>")}
+function p(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="inline"}function q(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="none"}function r(b){f.getById("dic_name_"+a).$.value=b}var s=!0,h,f=CKEDITOR.document,a=j.name,l=CKEDITOR.plugins.scayt.getUiTabs(j),g,t=[],u=0,m=["dic_create_"+a+",dic_restore_"+a,"dic_rename_"+a+",dic_delete_"+a],v=["mixedCase","mixedWithDigits","allCaps","ignoreDomainNames"];g=j.lang.scayt;var z=
+[{id:"options",label:g.optionsTab,elements:[{type:"html",id:"options",html:'<form name="optionsbar_'+a+'"><div class="inner_options">\t<div class="messagebox"></div>\t<div style="display:none;">\t\t<input type="checkbox" name="options" id="allCaps_'+a+'" />\t\t<label for="allCaps" id="label_allCaps_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox" id="ignoreDomainNames_'+a+'" />\t\t<label for="ignoreDomainNames" id="label_ignoreDomainNames_'+a+'"></label>\t</div>\t<div style="display:none;">\t<input name="options" type="checkbox" id="mixedCase_'+
+a+'" />\t\t<label for="mixedCase" id="label_mixedCase_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox" id="mixedWithDigits_'+a+'" />\t\t<label for="mixedWithDigits" id="label_mixedWithDigits_'+a+'"></label>\t</div></div></form>'}]},{id:"langs",label:g.languagesTab,elements:[{type:"html",id:"langs",html:'<form name="languagesbar_'+a+'"><div class="inner_langs">\t<div class="messagebox"></div>\t <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+
+a+'" ></div> <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+a+'"></div></div></form>'}]},{id:"dictionaries",label:g.dictionariesTab,elements:[{type:"html",style:"",id:"dictionaries",html:'<form name="dictionarybar_'+a+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">\t<div style="margin:5px auto; width:80%;white-space:normal; overflow:hidden;" id="dic_message_'+a+'"> </div>\t<div style="margin:5px auto; width:80%;white-space:normal;"> <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>\t\t<span class="cke_dialog_ui_labeled_content" >\t\t\t<div class="cke_dialog_ui_input_text">\t\t\t\t<input id="dic_name_'+
+a+'" type="text" class="cke_dialog_ui_input_text"/>\t\t</div></span></div>\t\t<div style="margin:5px auto; width:80%;white-space:normal;">\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+a+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+a+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+a+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+
+a+'">\t\t\t\t</a>\t\t</div>\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+a+'"></div></div></form>'}]},{id:"about",label:g.aboutTab,elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'<div id="scayt_about_'+a+'"></div>'}]}],B={title:g.title,minWidth:360,minHeight:220,onShow:function(){var b=this;b.data=j.fire("scaytDialog",{});b.options=b.data.scayt_control.option();b.chosed_lang=b.sLang=b.data.scayt_control.sLang;if(!b.data||!b.data.scayt||!b.data.scayt_control)alert("Error loading application service"),
+b.hide();else{var a=0;s?b.data.scayt.getCaption(j.langCode||"en",function(e){0<a++||(h=e,A.apply(b),y.apply(b),s=!1)}):y.apply(b);b.selectPage(b.data.tab)}},onOk:function(){var a=this.data.scayt_control;a.option(this.options);a.setLang(this.chosed_lang);a.refresh()},onCancel:function(){var b=w(),f;for(f in b)b[f].checked=!1;b="undefined"!=typeof document.forms["languagesbar_"+a]?document.forms["languagesbar_"+a].scayt_lang:[];x(b,"")},contents:t};CKEDITOR.plugins.scayt.getScayt(j);for(g=0;g<l.length;g++)1==
+l[g]&&(t[t.length]=z[g]);1==l[2]&&(u=1);var A=function(){function b(b){var c=f.getById("dic_name_"+a).getValue();if(!c)return n(" Dictionary name should not be empty. "),!1;try{var d=b.data.getTarget().getParent(),e=/(dic_\w+)_[\w\d]+/.exec(d.getId())[1];j[e].apply(null,[d,c,m])}catch(C){n(" Dictionary error. ")}return!0}var k=this,e=k.data.scayt.getLangList(),d=["dic_create","dic_delete","dic_rename","dic_restore"],g=[],i=[],c;if(u){for(c=0;c<d.length;c++)g[c]=d[c]+"_"+a,f.getById(g[c]).setHtml('<span class="cke_dialog_ui_button">'+
+h["button_"+d[c]]+"</span>");f.getById("dic_info_"+a).setHtml(h.dic_info)}if(1==l[0])for(c in v)d="label_"+v[c],g=f.getById(d+"_"+a),"undefined"!=typeof g&&("undefined"!=typeof h[d]&&"undefined"!=typeof k.options[v[c]])&&(g.setHtml(h[d]),g.getParent().$.style.display="block");d='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p><p>'+h.version+window.scayt.getAboutInfo().version.toString()+"</p><p>"+h.about_throwt_copy+"</p>";f.getById("scayt_about_"+a).setHtml(d);d=function(a,b){var c=f.createElement("label");
+c.setAttribute("for","cke_option"+a);c.setHtml(b[a]);k.sLang==a&&(k.chosed_lang=a);var d=f.createElement("div"),e=CKEDITOR.dom.element.createFromHtml('<input id="cke_option'+a+'" type="radio" '+(k.sLang==a?'checked="checked"':"")+' value="'+a+'" name="scayt_lang" />');e.on("click",function(){this.$.checked=true;k.chosed_lang=a});d.append(e);d.append(c);return{lang:b[a],code:a,radio:d}};if(1==l[1]){for(c in e.rtl)i[i.length]=d(c,e.ltr);for(c in e.ltr)i[i.length]=d(c,e.ltr);i.sort(function(a,b){return b.lang>
+a.lang?-1:1});e=f.getById("scayt_lcol_"+a);d=f.getById("scayt_rcol_"+a);for(c=0;c<i.length;c++)(c<i.length/2?e:d).append(i[c].radio)}var j={dic_create:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_create,f=h.succ_dic_create;window.scayt.createUserDictionary(b,function(a){q(d);p(c[1]);f=f.replace("%s",a.dname);o(f)},function(a){e=e.replace("%s",a.dname);n(e+"( "+(a.message||"")+")")})},dic_rename:function(a,b){var c=h.err_dic_rename||"",d=h.succ_dic_rename||"";window.scayt.renameUserDictionary(b,
+function(a){d=d.replace("%s",a.dname);r(b);o(d)},function(a){c=c.replace("%s",a.dname);r(b);n(c+"( "+(a.message||"")+" )")})},dic_delete:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_delete,f=h.succ_dic_delete;window.scayt.deleteUserDictionary(function(a){f=f.replace("%s",a.dname);q(d);p(c[0]);r("");o(f)},function(a){e=e.replace("%s",a.dname);n(e)})}};j.dic_restore=k.dic_restore||function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_restore,f=h.succ_dic_restore;window.scayt.restoreUserDictionary(b,function(a){f=
+f.replace("%s",a.dname);q(d);p(c[1]);o(f)},function(a){e=e.replace("%s",a.dname);n(e)})};i=(m[0]+","+m[1]).split(",");c=0;for(e=i.length;c<e;c+=1)if(d=f.getById(i[c]))d.on("click",b,this)},y=function(){var b=this;if(1==l[0])for(var g=w(),e=0,d=g.length;e<d;e++){var h=g[e].id,i=f.getById(h);if(i&&(g[e].checked=!1,1==b.options[h.split("_")[0]]&&(g[e].checked=!0),s))i.on("click",function(){b.options[this.getId().split("_")[0]]=this.$.checked?1:0})}1==l[1]&&(g=f.getById("cke_option"+b.sLang),x(g.$,b.sLang));
+u&&(window.scayt.getNameUserDictionary(function(b){b=b.dname;q(m[0]+","+m[1]);if(b){f.getById("dic_name_"+a).setValue(b);p(m[1])}else p(m[0])},function(){f.getById("dic_name_"+a).setValue("")}),o(""))};return B}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/toolbar.css b/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/toolbar.css
new file mode 100644
index 000000000..ecabdac9d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/scayt/dialogs/toolbar.css
@@ -0,0 +1,71 @@
+a
+{
+ text-decoration:none;
+ padding: 2px 4px 4px 6px;
+ display : block;
+ border-width: 1px;
+ border-style: solid;
+ margin : 0px;
+}
+
+a.cke_scayt_toogle:hover,
+a.cke_scayt_toogle:focus,
+a.cke_scayt_toogle:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+ margin : 0px;
+}
+a.cke_scayt_toogle {
+ color : #316ac5;
+ border-color: #fff;
+}
+.scayt_enabled a.cke_scayt_item {
+ color : #316ac5;
+ border-color: #fff;
+ margin : 0px;
+}
+.scayt_disabled a.cke_scayt_item {
+ color : gray;
+ border-color : #fff;
+}
+.scayt_enabled a.cke_scayt_item:hover,
+.scayt_enabled a.cke_scayt_item:focus,
+.scayt_enabled a.cke_scayt_item:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+}
+.scayt_disabled a.cke_scayt_item:hover,
+.scayt_disabled a.cke_scayt_item:focus,
+.scayt_disabled a.cke_scayt_item:active
+{
+ border-color: gray;
+ background-color: #dff1ff;
+ color : gray;
+ cursor: no-drop;
+}
+.cke_scayt_set_on, .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_on
+{
+ display: none;
+}
+.scayt_disabled .cke_scayt_set_on
+{
+ display: inline;
+}
+.scayt_disabled .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_off
+{
+ display: inline;
+}
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
new file mode 100644
index 000000000..8df716dcb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+cs.js Found: 118 Missing: 0
+cy.js Found: 118 Missing: 0
+de.js Found: 118 Missing: 0
+el.js Found: 16 Missing: 102
+eo.js Found: 118 Missing: 0
+et.js Found: 31 Missing: 87
+fa.js Found: 24 Missing: 94
+fi.js Found: 23 Missing: 95
+fr.js Found: 118 Missing: 0
+hr.js Found: 23 Missing: 95
+it.js Found: 118 Missing: 0
+nb.js Found: 118 Missing: 0
+nl.js Found: 118 Missing: 0
+no.js Found: 118 Missing: 0
+tr.js Found: 118 Missing: 0
+ug.js Found: 39 Missing: 79
+zh-cn.js Found: 118 Missing: 0
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ca.js
new file mode 100644
index 000000000..4704fef76
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ca.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Símbol registrat",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cs.js
new file mode 100644
index 000000000..78856a27e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cs.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"PoÄáteÄní uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"PoÄáteÄní uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlÄka",mdash:"Em pomlÄka",iexcl:"Obrácený vykÅ™iÄník",cent:"Znak centu",pound:"Znak libry",curren:"Znak mÄ›ny",yen:"Znak jenu",brvbar:"PÅ™eruÅ¡ená svislá Äára",sect:"Znak oddílu",uml:"PÅ™ehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo",
+not:"Logistický zápor",reg:"Znak registrace",macr:"PomlÄka nad",deg:"Znak stupnÄ›",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"TeÄka uprostÅ™ed",cedil:"Ocásek vlevo",sup1:"JedniÄka jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"ObyÄejný zlomek jedna Ätvrtina",frac12:"ObyÄejný zlomek jedna polovina",frac34:"ObyÄejný zlomek tÅ™i Ätvrtiny",iquest:"Znak obráceného otazníku",
+Agrave:"Velké písmeno latinky A s Äárkou nad vlevo",Aacute:"Velké písmeno latinky A s Äárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokánÄ›m",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvÄ›ma teÄkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s Äárkou nad vlevo",Eacute:"Velké písmeno latinky E s Äárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokánÄ›m",
+Euml:"Velké písmeno latinky E s dvÄ›ma teÄkami",Igrave:"Velké písmeno latinky I s Äárkou nad vlevo",Iacute:"Velké písmeno latinky I s Äárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokánÄ›m",Iuml:"Velké písmeno latinky I s dvÄ›ma teÄkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s Äárkou nad vlevo",Oacute:"Velké písmeno latinky O s Äárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokánÄ›m",Otilde:"Velké písmeno latinky O s tildou",
+Ouml:"Velké písmeno latinky O s dvÄ›ma teÄkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O pÅ™eÅ¡krtnuté",Ugrave:"Velké písmeno latinky U s Äárkou nad vlevo",Uacute:"Velké písmeno latinky U s Äárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokánÄ›m",Uuml:"Velké písmeno latinky U s dvÄ›ma teÄkami",Yacute:"Velké písmeno latinky Y s Äárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s Äárkou nad vlevo",aacute:"Malé písmeno latinky a s Äárkou nad vpravo",
+acirc:"Malé písmeno latinky a s vokánÄ›m",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvÄ›ma teÄkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s Äárkou nad vlevo",eacute:"Malé písmeno latinky e s Äárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokánÄ›m",euml:"Malé písmeno latinky e s dvÄ›ma teÄkami",igrave:"Malé písmeno latinky i s Äárkou nad vlevo",iacute:"Malé písmeno latinky i s Äárkou nad vpravo",
+icirc:"Malé písmeno latinky i s vokánÄ›m",iuml:"Malé písmeno latinky i s dvÄ›ma teÄkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s Äárkou nad vlevo",oacute:"Malé písmeno latinky o s Äárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokánÄ›m",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvÄ›ma teÄkami",divide:"Znak dÄ›lení",oslash:"Malé písmeno latinky o pÅ™eÅ¡krtnuté",ugrave:"Malé písmeno latinky u s Äárkou nad vlevo",
+uacute:"Malé písmeno latinky u s Äárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokánÄ›m",uuml:"Malé písmeno latinky u s dvÄ›ma teÄkami",yacute:"Malé písmeno latinky y s Äárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvÄ›ma teÄkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokánÄ›m",374:"Velké písmeno latinky Y s vokánÄ›m",373:"Malé písmeno latinky w s vokánÄ›m",375:"Malé písmeno latinky y s vokánÄ›m",sbquo:"Dolní 9 uvozovka jednoduchá",
+8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"TrojteÄkový úvod",trade:"Obchodní znaÄka",9658:"ÄŒerný ukazatel směřující vpravo",bull:"KoleÄko",rarr:"Å ipka vpravo",rArr:"Dvojitá Å¡ipka vpravo",hArr:"Dvojitá Å¡ipka vlevo a vpravo",diams:"ÄŒerné piky",asymp:"Téměř se rovná"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cy.js
new file mode 100644
index 000000000..19b86d637
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/cy.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid",
+reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig",
+Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom",
+Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild",
+Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig",
+aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom",
+euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom",
+otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llyth",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod",
+OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith",
+diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/de.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/de.js
new file mode 100644
index 000000000..6def78bbb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/de.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen",
+reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex",
+Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex",
+Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent",
+Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben",
+aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema",
+eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut",
+ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex",
+sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/el.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/el.js
new file mode 100644
index 000000000..73496fdf5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/el.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","el",{euro:"ΣÏμβολο ΕυÏÏŽ",lsquo:"ΑÏιστεÏός χαÏακτήÏας Î¼Î¿Î½Î¿Ï ÎµÎ¹ÏƒÎ±Î³Ï‰Î³Î¹ÎºÎ¿Ï",rsquo:"Δεξιός χαÏακτήÏας Î¼Î¿Î½Î¿Ï ÎµÎ¹ÏƒÎ±Î³Ï‰Î³Î¹ÎºÎ¿Ï",ldquo:"ΑÏιστεÏός χαÏακτήÏας Î´Î¹Ï€Î»Î¿Ï ÎµÎ¹ÏƒÎ±Î³Ï‰Î³Î¹ÎºÎ¿Ï",rdquo:"Δεξιός χαÏακτήÏας Î´Î¹Ï€Î»Î¿Ï ÎµÎ¹ÏƒÎ±Î³Ï‰Î³Î¹ÎºÎ¿Ï",ndash:"ΠαÏλα en",mdash:"ΠαÏλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"ΣÏμβολο Σεντ",pound:"ΣÏμβολο λίÏας",curren:"ΣÏμβολο συναλλαγματικής μονάδας",yen:"ΣÏμβολο Γιέν",brvbar:"Σπασμένη μπάÏα",sect:"ΣÏμβολο τμήματος",uml:"ΔιαίÏεση",copy:"ΣÏμβολο πνευματικών δικαιωμάτων",
+ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",
+iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",
+Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",
+Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",
+acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",
+icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",
+ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",
+bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/en.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/en.js
new file mode 100644
index 000000000..fdecfd2e5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/en.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/eo.js
new file mode 100644
index 000000000..1a56c0b99
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/eo.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno",
+sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao",
+Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo",
+Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno",
+szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao",
+igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno",
+uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo",
+bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"PreskaÅ­ egala"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/et.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/et.js
new file mode 100644
index 000000000..3a619ccbb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/et.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fa.js
new file mode 100644
index 000000000..493e5806c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fa.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت دوتایی نقل قول چپ",rdquo:"علامت دوتایی نقل قول راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت گذاری به عنوان علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"Diaeresis",copy:"نشان کپی رایت",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",not:"علامت ثبت نشده",
+reg:"علامت ثبت شده",macr:"Macron",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"Pilcrow sign",middot:"نقطه میانی",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
+Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"جهت‌نمای دوتایی چپ به راست",diams:"Black diamond suit",asymp:"تقریبا برابر با"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fi.js
new file mode 100644
index 000000000..cee518abd
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fi.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fr.js
new file mode 100644
index 000000000..0a80c07f0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/fr.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret bas underscore",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant",
+not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron",
+Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu",
+Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron",
+auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu",
+ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe",
+373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/he.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/he.js
new file mode 100644
index 000000000..17ee34f7f
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/he.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/hr.js
new file mode 100644
index 000000000..94f49fc14
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/hr.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskliÄnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana preÄka",sect:"Znak odjeljka",uml:"Diaeresis",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak",
+reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Srednja toÄka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
+Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/it.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/it.js
new file mode 100644
index 000000000..b08b24dfe
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/it.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte",
+not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave",
+Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso",
+Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso",
+Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S",
+agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto",
+ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto",
+ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn",
+yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale",
+trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ku.js
new file mode 100644
index 000000000..235d95238
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ku.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانه‌ی یۆرۆ",lsquo:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ سه‌رووژێری تاکی چه‌پ",rsquo:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ سه‌رووژێری تاکی ڕاست",ldquo:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ سه‌رووژێری دووهێنده‌ی چه‌پ",rdquo:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ سه‌رووژێری دووهێنده‌ی ڕاست",ndash:"ته‌قه‌ڵی کورت",mdash:"ته‌قه‌ڵی درێژ",iexcl:"نیشانه‌ی هه‌ڵه‌وگێڕی سه‌رسوڕمێنه‌ر",cent:"نیشانه‌ی سه‌نت",pound:"نیشانه‌ی پاوه‌ند",curren:"نیشانه‌ی دراو",yen:"نیشانه‌ی یه‌نی ژاپۆنی",brvbar:"شریتی ئه‌ستوونی پچڕاو",sect:"نیشانه‌ی دوو s له‌سه‌ریه‌ك",
+uml:"خاڵ",copy:"نیشانه‌ی ماÙÛŒ چاپ",ordf:"Ù‡ÛŽÚµ له‌سه‌ر پیتی a",laquo:"دوو تیری به‌دووایه‌کی چه‌پ",not:"نیشانه‌ی نه‌خێر",reg:"نیشانه‌ی R له‌ناو بازنه‌دا",macr:"ماکڕوون",deg:"نیشانه‌ی پله",sup2:"سه‌رنووسی دوو",sup3:"سه‌رنووسی سێ",acute:"لاری تیژ",micro:"نیشانه‌ی u لق درێژی چه‌پی خواروو",para:"نیشانه‌یپه‌ڕه‌گراÙ",middot:"ناوه‌ڕاستی خاڵ",cedil:"نیشانه‌ی c ژێر چووکره‌",sup1:"سه‌رنووسی یه‌ك",ordm:"Ù‡ÛŽÚµ له‌ژێر پیتی o",raquo:"دوو تیری به‌دووایه‌کی ڕاست",frac14:"یه‌ك له‌سه‌ر چووار",frac12:"یه‌ك له‌سه‌ر دوو",
+frac34:"سێ له‌سه‌ر چووار",iquest:"هێمای هه‌ڵه‌وگێری پرسیار",Agrave:"پیتی لاتینی A-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری لار",Aacute:"پیتی لاتینی A-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",Acirc:"پیتی لاتینی A-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Atilde:"پیتی لاتینی A-ی گه‌وره‌ له‌گه‌ڵ زه‌ڕه‌",Auml:"پیتی لاتینی A-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Aring:"پیتی لاتینی گه‌وره‌ی Å",AElig:"پیتی لاتینی گه‌وره‌ی Æ",Ccedil:"پیتی لاتینی C-ی گه‌وره‌ له‌گه‌ڵ ژێر چووکره‌",Egrave:"پیتی لاتینی E-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری لار",
+Eacute:"پیتی لاتینی E-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",Ecirc:"پیتی لاتینی E-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Euml:"پیتی لاتینی E-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Igrave:"پیتی لاتینی I-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری لار",Iacute:"پیتی لاتینی I-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",Icirc:"پیتی لاتینی I-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Iuml:"پیتی لاتینی I-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",ETH:"پیتی لاتینی E-ی گه‌وره‌ی",Ntilde:"پیتی لاتینی N-ی گه‌وره‌ له‌گه‌ڵ زه‌ڕه‌",Ograve:"پیتی لاتینی O-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری لار",
+Oacute:"پیتی لاتینی O-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",Ocirc:"پیتی لاتینی O-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Otilde:"پیتی لاتینی O-ی گه‌وره‌ له‌گه‌ڵ زه‌ڕه‌",Ouml:"پیتی لاتینی O-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",times:"نیشانه‌ی لێکدان",Oslash:"پیتی لاتینی گه‌وره‌ی Ø له‌گه‌ڵ هێمای دڵ وه‌ستان",Ugrave:"پیتی لاتینی U-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری لار",Uacute:"پیتی لاتینی U-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",Ucirc:"پیتی لاتینی U-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",Uuml:"پیتی لاتینی U-ی گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",
+Yacute:"پیتی لاتینی Y-ی گه‌وره‌ له‌گه‌ڵ ڕوومه‌تداری تیژ",THORN:"پیتی لاتینی دڕکی گه‌وره",szlig:"پیتی لاتنی نووك تیژی s",agrave:"پیتی لاتینی a-ی بچووك له‌گه‌ڵ ڕوومه‌تداری لار",aacute:"پیتی لاتینی a-ی بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",acirc:"پیتی لاتینی a-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",atilde:"پیتی لاتینی a-ی بچووك له‌گه‌ڵ زه‌ڕه‌",auml:"پیتی لاتینی a-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك له‌گه‌ڵ ژێر چووکره‌",egrave:"پیتی لاتینی e-ی بچووك له‌گه‌ڵ ڕوومه‌تداری لار",
+eacute:"پیتی لاتینی e-ی بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",euml:"پیتی لاتینی e-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",igrave:"پیتی لاتینی i-ی بچووك له‌گه‌ڵ ڕوومه‌تداری لار",iacute:"پیتی لاتینی i-ی بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",icirc:"پیتی لاتینی i-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",iuml:"پیتی لاتینی i-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك له‌گه‌ڵ زه‌ڕه‌",ograve:"پیتی لاتینی o-ی بچووك له‌گه‌ڵ ڕوومه‌تداری لار",
+oacute:"پیتی لاتینی o-ی بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",otilde:"پیتی لاتینی o-ی بچووك له‌گه‌ڵ زه‌ڕه‌",ouml:"پیتی لاتینی o-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",divide:"نیشانه‌ی دابه‌ش",oslash:"پیتی لاتینی گه‌وره‌ی ø له‌گه‌ڵ هێمای دڵ وه‌ستان",ugrave:"پیتی لاتینی u-ی بچووك له‌گه‌ڵ ڕوومه‌تداری لار",uacute:"پیتی لاتینی u-ی بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",uuml:"پیتی لاتینی u-ی بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",
+yacute:"پیتی لاتینی y-ÛŒ بچووك له‌گه‌ڵ ڕوومه‌تداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ÛŒ بچووك له‌گه‌ڵ نیشانه‌ له‌سه‌ری",OElig:"پیتی لاتینی گه‌وره‌ی پێکه‌وه‌نووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکه‌وه‌نووسراوی oe",372:"پیتی لاتینی W-ÛŒ گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",374:"پیتی لاتینی Y-ÛŒ گه‌وره‌ له‌گه‌ڵ نیشانه‌ له‌سه‌ری",373:"پیتی لاتینی w-ÛŒ بچووکی له‌گه‌ڵ نیشانه‌ له‌سه‌ری",375:"پیتی لاتینی y-ÛŒ بچووکی له‌گه‌ڵ نیشانه‌ له‌سه‌ری",sbquo:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ نزم",8219:"نیشانه‌ی ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ به‌رزی پێچه‌وانه",
+bdquo:"دوو ÙØ§Ø±ÛŒØ²Ù‡â€ŒÛŒ ته‌نیش یه‌ك",hellip:"ئاسۆیی بازنه",trade:"نیشانه‌ی بازرگانی",9658:"ئاراسته‌ی ڕه‌شی ده‌ستی ڕاست",bull:"Ùیشه‌ك",rarr:"تیری ده‌ستی ڕاست",rArr:"دووتیری ده‌ستی ڕاست",hArr:"دوو تیری ڕاست Ùˆ چه‌پ",diams:"ڕه‌شی پاقڵاوه‌یی",asymp:"نیشانه‌ی یه‌کسانه"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/lv.js
new file mode 100644
index 000000000..f7a825085
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/lv.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zÄ«me",lsquo:"KreisÄ vienkÄrtÄ«ga pÄ“diņa",rsquo:"LabÄ vienkÄrtÄ«ga pÄ“diņa",ldquo:"KreisÄ dubult pÄ“diņa",rdquo:"LabÄ dubult pÄ“diņa",ndash:"En svÄ«tra",mdash:"Em svÄ«tra",iexcl:"Apgriezta izsaukuma zÄ«me",cent:"Centu naudas zÄ«me",pound:"Sterliņu mÄrciņu naudas zÄ«me",curren:"ValÅ«tas zÄ«me",yen:"Jenu naudas zÄ«me",brvbar:"VertikÄla pÄrrauta lÄ«nija",sect:"ParagrÄfa zÄ«me",uml:"Diakritiska zÄ«me",copy:"AutortiesÄ«bu zÄ«me",ordf:"Sievišķas kÄrtas rÄdÄ«tÄjs",
+laquo:"KreisÄ dubult stÅ«ra pÄ“diņu zÄ«me",not:"NeparakstÄ«ts",reg:"ReÄ£istrÄ“ta zÄ«me",macr:"GarumzÄ«me",deg:"GrÄdu zÄ«me",sup2:"AugÅ¡raksts divi",sup3:"AugÅ¡raksts trÄ«s",acute:"AkÅ«ta uzsvara zÄ«me",micro:"Mikro zÄ«me",para:"Rindkopas zÄ«me ",middot:"VidÄ“js punkts",cedil:"Āķītis zem burta",sup1:"AugÅ¡raksts viens",ordm:"VÄ«rišķīgas kÄrtas rÄdÄ«tÄjs",raquo:"LabÄ dubult stÅ«ra pÄ“diņu zÄ«me",frac14:"VulgÄra frakcija 1/4",frac12:"VulgÄra frakcija 1/2",frac34:"VulgÄra frakcija 3/4",iquest:"Apgriezta jautÄjuma zÄ«me",Agrave:"Lielais latīņu burts A ar uzsvara zÄ«mi",
+Aacute:"Lielais latīņu burts A ar akÅ«tu uzsvara zÄ«mi",Acirc:"Lielais latīņu burts A ar diakritisku zÄ«mi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zÄ«mi",Aring:"Lielais latīņu burts A ar aplÄ«ti augÅ¡Ä",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar ÄÄ·Ä«ti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akÅ«tu uzsvara zÄ«mi",Ecirc:"Lielais latīņu burts E ar diakritisko zÄ«mi",Euml:"Lielais latīņu burts E ar diakritisko zÄ«mi",
+Igrave:"Lielais latīņu burts I ar uzsvaras zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi",
+times:"ReizinÄÅ¡anas zÄ«me ",Oslash:"Lielais latīņu burts O ar iesvÄ«trojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zÄ«mi",Uacute:"Lielais latīņu burts U ar akÅ«to uzsvars zÄ«mi",Ucirc:"Lielais latīņu burts U ar diakritisko zÄ«mi",Uuml:"Lielais latīņu burts U ar diakritisko zÄ«mi",Yacute:"Lielais latīņu burts Y ar akÅ«to uzsvaras zÄ«mi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatÅ«ru",agrave:"Mazs latīņu burts a ar uzsvara zÄ«mi",aacute:"Mazs latīņu burts a ar akÅ«to uzsvara zÄ«mi",
+acirc:"Mazs latīņu burts a ar diakritisko zÄ«mi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zÄ«mi",aring:"Mazs latīņu burts a ar aplÄ«ti augÅ¡Ä",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar ÄÄ·Ä«ti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zÄ«mi ",eacute:"Mazs latīņu burts e ar akÅ«tu uzsvara zÄ«mi",ecirc:"Mazs latīņu burts e ar diakritisko zÄ«mi",euml:"Mazs latīņu burts e ar diakritisko zÄ«mi",igrave:"Mazs latīņu burts i ar uzsvara zÄ«mi ",iacute:"Mazs latīņu burts i ar akÅ«tu uzsvara zÄ«mi",
+icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ",
+uacute:"Mazs latīņu burts u ar akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ",
+sbquo:"Mazas-9 vienkÄrtÄ«gas pÄ“diņas",8219:"Lielas-9 vienkÄrtÄ«gas apgrieztas pÄ“diņas",bdquo:"Mazas-9 dubultas pÄ“diņas",hellip:"HorizontÄli daudzpunkti",trade:"PreÄu zÄ«mes zÄ«me",9658:"Melns pa labi pagriezts radÄ«tÄjs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"GandrÄ«z vienÄds ar"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nb.js
new file mode 100644
index 000000000..2758992af
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nb.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn",
+reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
+Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel",
+times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
+ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
+uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil",
+rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nl.js
new file mode 100644
index 000000000..5838991ff
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/nl.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken",
+reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Mico-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe",
+Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu",
+Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave",
+Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema",
+aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe",
+iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave",
+uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Å’",oelig:"Latijnse kleine letter Å“",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe",
+375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/no.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/no.js
new file mode 100644
index 000000000..dadc22e3b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/no.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn",
+reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
+Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel",
+times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
+ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
+uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil",
+rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
new file mode 100644
index 000000000..98b84092c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada",
+macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema",
+Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo",
+Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema",
+aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo",
+otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo",
+373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sk.js
new file mode 100644
index 000000000..8e3898ab6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sk.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlÄka",mdash:"Em pomlÄka",iexcl:"Obrátený výkriÄník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"PreruÅ¡ená zvislá Äiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor",
+reg:"Znak registrácie",macr:"PomlÄka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"ObyÄajný zlomok jedna Å¡tvrtina",frac12:"ObyÄajný zlomok jedna polovica",frac34:"ObyÄajný zlomok tri Å¡tvrtiny",iquest:"OtoÄený otáznik",Agrave:"Veľké písmeno latinky A s accentom",
+Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkÄeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkÄeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom",
+Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkÄeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkÄeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preÅ¡krtnuté",Ugrave:"Veľké písmeno latinky U s accentom",
+Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkÄeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkÄeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad",
+aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkÄeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkÄeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom",
+oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkÄeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preÅ¡krtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkÄeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami",
+OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkÄeňom",374:"Veľké písmeno latinky Y s mäkÄeňom",373:"Malé písmeno latinky w s mäkÄeňom",375:"Malé písmeno latinky y s mäkÄeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otoÄená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej znaÄky",9658:"ÄŒierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá Å¡ipka vpravo",
+hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sv.js
new file mode 100644
index 000000000..773c31b1d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/sv.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken",
+not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex",
+Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex",
+Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ",
+ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø",
+ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken",
+trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/tr.js
new file mode 100644
index 000000000..5c7951736
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/tr.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti",
+not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi",
+Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi",
+ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi",
+THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi",
+igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi",
+uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti",
+bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ug.js
new file mode 100644
index 000000000..5330accae
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/ug.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ Ù¾Û•Ø´ سول",rsquo:"يالاڭ Ù¾Û•Ø´ ئوڭ",ldquo:"قوش Ù¾Û•Ø´ سول",rdquo:"قوش Ù¾Û•Ø´ ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"Ùوند Ø³ØªÛØ±Ù„Ù‰Ú­",curren:"Ù¾Û‡Ù„ بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگرا٠بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى",
+deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندÛكىس 2",sup3:"يۇقىرى ئىندÛكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا Ú†Ûكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندÛكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",
+Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",
+ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent",
+oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",
+yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",
+rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
new file mode 100644
index 000000000..6452804a2
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符å·",lsquo:"å·¦å•引å·",rsquo:"å³å•引å·",ldquo:"å·¦åŒå¼•å·",rdquo:"å³åŒå¼•å·",ndash:"短划线",mdash:"破折å·",iexcl:"ç«–ç¿»å¹å·",cent:"åˆ†å¸æ ‡è®°",pound:"英镑标记",curren:"è´§å¸æ ‡è®°",yen:"日元标记",brvbar:"é—´æ–­æ¡",sect:"节标记",uml:"分音符",copy:"ç‰ˆæƒæ‰€æœ‰æ ‡è®°",ordf:"é˜´æ€§é¡ºåºæŒ‡ç¤ºç¬¦",laquo:"左指åŒå°–引å·",not:"éžæ ‡è®°",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"é”音符",micro:"微符",para:"æ®µè½æ ‡è®°",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"é˜³æ€§é¡ºåºæŒ‡ç¤ºç¬¦",raquo:"峿Œ‡åŒå°–引å·",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问å·",
+Agrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",Aacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",Acirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",Atilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",Auml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",Aring:"å¸¦ä¸Šåœ†åœˆçš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ A",AElig:"æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ Ae",Ccedil:"å¸¦ä¸‹åŠ ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ C",Egrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ E",Eacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ E",Ecirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ E",Euml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ E",Igrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ I",Iacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ I",Icirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ I",Iuml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ I",ETH:"æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ Eth",Ntilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ N",Ograve:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",Oacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",Ocirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",Otilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",
+Ouml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",times:"乘å·",Oslash:"å¸¦ç²—çº¿çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ O",Ugrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ U",Uacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ U",Ucirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ U",Uuml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ U",Yacute:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ Y",THORN:"æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ Thorn",szlig:"æ‹‰ä¸æ–‡å°å†™å­—æ¯æ¸…音 S",agrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",aacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",acirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",atilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",auml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",aring:"å¸¦ä¸Šåœ†åœˆçš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ A",aelig:"æ‹‰ä¸æ–‡å°å†™å­—æ¯ Ae",ccedil:"å¸¦ä¸‹åŠ ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ C",egrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ E",eacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ E",ecirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ E",euml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ E",igrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ I",
+iacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ I",icirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ I",iuml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ I",eth:"æ‹‰ä¸æ–‡å°å†™å­—æ¯ Eth",ntilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ N",ograve:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",oacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",ocirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",otilde:"å¸¦é¢šåŒ–ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",ouml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",divide:"除å·",oslash:"å¸¦ç²—çº¿çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ O",ugrave:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ U",uacute:"带é”éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ U",ucirc:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ U",uuml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ U",yacute:"å¸¦æŠ‘éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ Y",thorn:"æ‹‰ä¸æ–‡å°å†™å­—æ¯ Thorn",yuml:"å¸¦åˆ†éŸ³ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ Y",OElig:"æ‹‰ä¸æ–‡å¤§å†™è¿žå­— Oe",oelig:"æ‹‰ä¸æ–‡å°å†™è¿žå­— Oe",372:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ W",374:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å¤§å†™å­—æ¯ Y",
+373:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ W",375:"å¸¦æ‰¬æŠ‘ç¬¦çš„æ‹‰ä¸æ–‡å°å†™å­—æ¯ Y",sbquo:"å•下 9 形引å·",8219:"å•高横翻 9 形引å·",bdquo:"åŒä¸‹ 9 形引å·",hellip:"æ°´å¹³çœç•¥å·",trade:"商标标志",9658:"å®žå¿ƒå³æŒ‡æŒ‡é’ˆ",bull:"加é‡å·",rarr:"å‘å³ç®­å¤´",rArr:"å‘å³åŒçº¿ç®­å¤´",hArr:"å·¦å³åŒçº¿ç®­å¤´",diams:"实心方å—纸牌",asymp:"约等于"}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/specialchar.js b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/specialchar.js
new file mode 100644
index 000000000..acaea0c8c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/specialchar/dialogs/specialchar.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j);
+var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml("&nbsp;"),e.getContentElement("info","htmlPreview").getElement().setHtml("&nbsp;"),b.getParent().removeClass("cke_light_background"),
+j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault();
+break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):
+d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=['<table role="listbox" aria-labelledby="'+a+'" style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">'],d=0,g=b.length,h,e;d<g;){f.push('<tr role="presentation">');for(var j=0;j<c;j++,
+d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace("&","").replace(";","").replace("#",""),e=l[e]||h);var k="cke_specialchar_label_"+d+"_"+CKEDITOR.tools.getNextNumber();f.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(d+1)+'"',' aria-setsize="'+g+'"',' aria-labelledby="'+k+'"',' class="cke_specialchar" title="',CKEDITOR.tools.htmlEncode(e),'" onkeydown="CKEDITOR.tools.callFunction( '+n+
+', event, this )" onclick="CKEDITOR.tools.callFunction('+m+', this); return false;" tabindex="-1"><span style="margin: 0 auto;cursor: inherit">'+h+'</span><span class="cke_voice_label" id="'+k+'">'+e+"</span></a>")}else f.push('<td class="cke_dark_background">&nbsp;');f.push("</td>")}f.push("</tr>")}f.push("</tbody></table>",'<span id="'+a+'" class="cke_voice_label">'+l.options+"</span>");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab,
+title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox",
+align:"top",children:[{type:"html",html:"<div></div>"},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"<div>&nbsp;</div>"},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",
+html:"<div>&nbsp;</div>"}]}]}]}]}]}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/table/dialogs/table.js b/mod/ckeditor/vendors/ckeditor/plugins/table/dialogs/table.js
new file mode 100644
index 000000000..01d9e38c2
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/table/dialogs/table.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){function r(a){for(var f=0,l=0,k=0,m,e=a.$.rows.length;k<e;k++){m=a.$.rows[k];for(var d=f=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],f+=c.colSpan;f>l&&(l=f)}return l}function o(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer()(f)&&0<f);f||(alert(a),this.select());return f}}function n(a,f){var l=function(e){return new CKEDITOR.dom.element(e,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?
+310:280,onLoad:function(){var e=this,a=e.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=e.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=e.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var e=a.getSelection(),d=e.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),g=this.getContentElement("info",
+"txtHeight");"tableProperties"==f&&((e=e.getSelectedElement())&&e.is("table")?c=e:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();g&&g.onChange()},onOk:function(){var e=a.getSelection(),d=this._.selectedElement&&e.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b,
+c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),f=parseInt(b.txtRows,10)||0,g=parseInt(b.txtCols,10)||0,i=0;i<f;i++)for(var j=h.append(l("tr")),k=0;k<g;k++){var m=j.append(l("td"));CKEDITOR.env.ie||m.append(l("br"))}f=b.selHeaders;if(!c.$.tHead&&("row"==f||"both"==f)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)g=h.getChild(i),g.type==CKEDITOR.NODE_ELEMENT&&
+!g.data("cke-bookmark")&&(g.renameNode("th"),g.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==f||"both"==f)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)g=h.getChild(i),g.type==CKEDITOR.NODE_ELEMENT&&(g.renameNode("td"),g.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==f||"both"==f))for(j=0;j<c.$.rows.length;j++)g=
+new CKEDITOR.dom.element(c.$.rows[j].cells[0]),g.renameNode("th"),g.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==f||"both"==f))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(g=new CKEDITOR.dom.element(j.$.cells[0]),g.renameNode("td"),g.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{e.selectBookmarks(d)}catch(n){}else a.insertElement(c),
+setTimeout(function(){var e=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(e,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:"info",label:a.lang.table.title,elements:[{type:"hbox",widths:[null,null],styles:["vertical-align:top"],children:[{type:"vbox",padding:0,children:[{type:"text",id:"txtRows","default":3,label:a.lang.table.rows,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidRows),setup:function(e){this.setValue(e.$.rows.length)},
+commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(e){this.setValue(r(e))},commit:k},{type:"html",html:"&nbsp;"},{type:"select",id:"selHeaders","default":"",label:a.lang.table.headers,items:[[a.lang.table.headersNone,""],[a.lang.table.headersRow,"row"],[a.lang.table.headersColumn,"col"],[a.lang.table.headersBoth,"both"]],setup:function(e){var a=this.getDialog();a.hasColumnHeaders=!0;for(var c=
+0;c<e.$.rows.length;c++){var b=e.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){a.hasColumnHeaders=!1;break}}null!==e.$.tHead?this.setValue(a.hasColumnHeaders?"both":"row"):this.setValue(a.hasColumnHeaders?"col":"")},commit:k},{type:"text",id:"txtBorder","default":1,label:a.lang.table.border,controlStyle:"width:3em",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute("border")||"")},commit:function(a,d){this.getValue()?d.setAttribute("border",
+this.getValue()):d.removeAttribute("border")}},{id:"cmbAlign",type:"select","default":"",label:a.lang.common.align,items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"right"]],setup:function(a){this.setValue(a.getAttribute("align")||"")},commit:function(a,d){this.getValue()?d.setAttribute("align",this.getValue()):d.removeAttribute("align")}}]},{type:"vbox",padding:0,children:[{type:"hbox",widths:["5em"],children:[{type:"text",
+id:"txtWidth",controlStyle:"width:5em",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,"default":500>n.getSize("width")?"100%":500,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",
+id:"txtHeight",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:"&nbsp;"},{type:"text",id:"txtCellSpace",
+controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":1,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":1,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||
+"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0<a.count()){var a=a.getItem(0),d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),
+this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),b=d.getElementsByTag("caption");if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute("summary")||
+"")},commit:function(a,d){this.getValue()?d.setAttribute("summary",this.getValue()):d.removeAttribute("summary")}}]}]},m&&m.createAdvancedTab(a)]}}var q=CKEDITOR.tools.cssLength,k=function(a){var f=this.id;a.info||(a.info={});a.info[f]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/tabletools/dialogs/tableCell.js b/mod/ckeditor/vendors/ckeditor/plugins/tabletools/dialogs/tableCell.js
new file mode 100644
index 000000000..2c4e865b4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/tabletools/dialogs/tableCell.js
@@ -0,0 +1,16 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("cellProperties",function(f){var g=f.lang.table,c=g.cell,d=f.lang.common,h=CKEDITOR.dialog.validate,j=/^(\d+(?:\.\d+)?)(px|%)$/,e={type:"html",html:"&nbsp;"},k="rtl"==f.lang.dir,i=f.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0,
+children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:d.width,validate:h.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info","widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},
+commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType");isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",label:f.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[g.widthPx,"px"],[g.widthPc,"%"]],setup:function(a){(a=j.exec(a.getStyle("width")||a.getAttribute("width")))&&this.setValue(a[2])}}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text",
+id:"height",label:d.height,width:"100px","default":"",validate:h.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),
+10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"<br />"+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},
+e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom,
+"bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],
+setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan),
+setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):
+a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b=
+a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info",
+"borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()}}}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/LICENSE.md b/mod/ckeditor/vendors/ckeditor/plugins/wsc/LICENSE.md
new file mode 100644
index 000000000..6096de233
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor WSC Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+* GNU General Public License Version 2 or later (the "GPL"):
+ http://www.gnu.org/licenses/gpl.html
+
+* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+ http://www.gnu.org/licenses/lgpl.html
+
+* Mozilla Public License Version 1.1 or later (the "MPL"):
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/README.md b/mod/ckeditor/vendors/ckeditor/plugins/wsc/README.md
new file mode 100644
index 000000000..346e2ab19
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/README.md
@@ -0,0 +1,25 @@
+CKEditor WebSpellChecker Plugin
+===============================
+
+This plugin brings Web Spell Checker (WSC) into CKEditor.
+
+WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation.
+2. Enable the "wsc" plugin in the CKEditor configuration file (config.js):
+
+ config.extraPlugins = 'wsc';
+
+That's all. WSC will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/ciframe.html b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/ciframe.html
new file mode 100644
index 000000000..292297d70
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/ciframe.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function gup( name )
+{
+ name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
+ var regexS = '[\\?&]' + name + '=([^&#]*)' ;
+ var regex = new RegExp( regexS ) ;
+ var results = regex.exec( window.location.href ) ;
+
+ if ( results )
+ return results[ 1 ] ;
+ else
+ return '' ;
+}
+
+var interval;
+
+function sendData2Master()
+{
+ var destination = window.parent.parent ;
+ try
+ {
+ if ( destination.XDTMaster )
+ {
+ var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
+ window.clearInterval( interval ) ;
+ }
+ }
+ catch (e) {}
+}
+
+function onLoad()
+{
+ interval = window.setInterval( sendData2Master, 100 );
+}
+
+</script>
+</head>
+<body onload="onLoad()"><p></p></body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
new file mode 100644
index 000000000..88e1afe8a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function doLoadScript( url )
+{
+ if ( !url )
+ return false ;
+
+ var s = document.createElement( "script" ) ;
+ s.type = "text/javascript" ;
+ s.src = url ;
+ document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
+
+ return true ;
+}
+
+var opener;
+function tryLoad()
+{
+ opener = window.parent;
+
+ // get access to global parameters
+ var oParams = window.opener.oldFramesetPageParams;
+
+ // make frameset rows string prepare
+ var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
+ document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
+
+ // dynamic including init frames and crossdomain transport code
+ // from config sproxy_js_frameset url
+ var addScriptUrl = oParams.sproxy_js_frameset ;
+ doLoadScript( addScriptUrl ) ;
+}
+
+ </script>
+</head>
+
+<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
+ <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
+</frameset>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.css b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.css
new file mode 100644
index 000000000..e16394846
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.css
@@ -0,0 +1,82 @@
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+html, body
+{
+ background-color: transparent;
+ margin: 0px;
+ padding: 0px;
+}
+
+body
+{
+ padding: 10px;
+}
+
+body, td, input, select, textarea
+{
+ font-size: 11px;
+ font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
+}
+
+.midtext
+{
+ padding:0px;
+ margin:10px;
+}
+
+.midtext p
+{
+ padding:0px;
+ margin:10px;
+}
+
+.Button
+{
+ border: #737357 1px solid;
+ color: #3b3b1f;
+ background-color: #c7c78f;
+}
+
+.PopupTabArea
+{
+ color: #737357;
+ background-color: #e3e3c7;
+}
+
+.PopupTitleBorder
+{
+ border-bottom: #d5d59d 1px solid;
+}
+.PopupTabEmptyArea
+{
+ padding-left: 10px;
+ border-bottom: #d5d59d 1px solid;
+}
+
+.PopupTab, .PopupTabSelected
+{
+ border-right: #d5d59d 1px solid;
+ border-top: #d5d59d 1px solid;
+ border-left: #d5d59d 1px solid;
+ padding: 3px 5px 3px 5px;
+ color: #737357;
+}
+
+.PopupTab
+{
+ margin-top: 1px;
+ border-bottom: #d5d59d 1px solid;
+ cursor: pointer;
+}
+
+.PopupTabSelected
+{
+ font-weight: bold;
+ cursor: default;
+ padding-top: 4px;
+ border-bottom: #f1f1e3 1px solid;
+ background-color: #f1f1e3;
+}
diff --git a/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.js b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.js
new file mode 100644
index 000000000..6b39b0060
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/plugins/wsc/dialogs/wsc.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||
+f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display",
+"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='<textarea style="display: none" id="'+g+'" rows="10" cols="40"> </textarea><div id="'+h+'" style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;"></div><iframe src="" style="width:100%;background-color:#f1f1e3;" frameborder="0" name="'+d+'" id="'+d+'" allowtransparency="1"></iframe>',
+l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"</p>");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display",
+"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",
+{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}});
+CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/samples/ajax.html b/mod/ckeditor/vendors/ckeditor/samples/ajax.html
new file mode 100644
index 000000000..6ebe34e83
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/ajax.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Ajax &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+ <script>
+
+ var editor, html = '';
+
+ function createEditor() {
+ if ( editor )
+ return;
+
+ // Create a new editor inside the <div id="editor">, setting its value to html
+ var config = {};
+ editor = CKEDITOR.appendTo( 'editor', config, html );
+ }
+
+ function removeEditor() {
+ if ( !editor )
+ return;
+
+ // Retrieve the editor contents. In an Ajax application, this data would be
+ // sent to the server or used in any other way.
+ document.getElementById( 'editorcontents' ).innerHTML = html = editor.getData();
+ document.getElementById( 'contents' ).style.display = '';
+
+ // Destroy the editor.
+ editor.destroy();
+ editor = null;
+ }
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Create and Destroy Editor Instances for Ajax Applications
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing
+ area will be displayed in a <code>&lt;div&gt;</code> element.
+ </p>
+ <p>
+ For details of how to create this setup check the source code of this sample page
+ for JavaScript code responsible for the creation and destruction of a CKEditor instance.
+ </p>
+ </div>
+ <p>Click the buttons to create and remove a CKEditor instance.</p>
+ <p>
+ <input onclick="createEditor();" type="button" value="Create Editor">
+ <input onclick="removeEditor();" type="button" value="Remove Editor">
+ </p>
+ <!-- This div will hold the editor. -->
+ <div id="editor">
+ </div>
+ <div id="contents" style="display: none">
+ <p>
+ Edited Contents:
+ </p>
+ <!-- This div will be used to display the editor contents. -->
+ <div id="editorcontents">
+ </div>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/api.html b/mod/ckeditor/vendors/ckeditor/samples/api.html
new file mode 100644
index 000000000..1bc8948f8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/api.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>API Usage &mdash; CKEditor Sample</title>
+ <script src="../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <script>
+
+// The instanceReady event is fired, when an instance of CKEditor has finished
+// its initialization.
+CKEDITOR.on( 'instanceReady', function( ev ) {
+ // Show the editor name and description in the browser status bar.
+ document.getElementById( 'eMessage' ).innerHTML = 'Instance <code>' + ev.editor.name + '<\/code> loaded.';
+
+ // Show this sample buttons.
+ document.getElementById( 'eButtons' ).style.display = 'block';
+});
+
+function InsertHTML() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById( 'htmlArea' ).value;
+
+ // Check the active editing mode.
+ if ( editor.mode == 'wysiwyg' )
+ {
+ // Insert HTML code.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertHtml
+ editor.insertHtml( value );
+ }
+ else
+ alert( 'You must be in WYSIWYG mode!' );
+}
+
+function InsertText() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById( 'txtArea' ).value;
+
+ // Check the active editing mode.
+ if ( editor.mode == 'wysiwyg' )
+ {
+ // Insert as plain text.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText
+ editor.insertText( value );
+ }
+ else
+ alert( 'You must be in WYSIWYG mode!' );
+}
+
+function SetContents() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ var value = document.getElementById( 'htmlArea' ).value;
+
+ // Set editor contents (replace current contents).
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData
+ editor.setData( value );
+}
+
+function GetContents() {
+ // Get the editor instance that you want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+
+ // Get editor contents
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData
+ alert( editor.getData() );
+}
+
+function ExecuteCommand( commandName ) {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+
+ // Check the active editing mode.
+ if ( editor.mode == 'wysiwyg' )
+ {
+ // Execute the command.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand
+ editor.execCommand( commandName );
+ }
+ else
+ alert( 'You must be in WYSIWYG mode!' );
+}
+
+function CheckDirty() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ // Checks whether the current editor contents present changes when compared
+ // to the contents loaded into the editor at startup
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty
+ alert( editor.checkDirty() );
+}
+
+function ResetDirty() {
+ // Get the editor instance that we want to interact with.
+ var editor = CKEDITOR.instances.editor1;
+ // Resets the "dirty state" of the editor (see CheckDirty())
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-resetDirty
+ editor.resetDirty();
+ alert( 'The "IsDirty" status has been reset' );
+}
+
+function Focus() {
+ CKEDITOR.instances.editor1.focus();
+}
+
+function onFocus() {
+ document.getElementById( 'eMessage' ).innerHTML = '<b>' + this.name + ' is focused </b>';
+}
+
+function onBlur() {
+ document.getElementById( 'eMessage' ).innerHTML = this.name + ' lost focus';
+}
+
+ </script>
+
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Using CKEditor JavaScript API
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor">CKEditor JavaScript API</a>
+ to interact with the editor at runtime.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+
+ <!-- This <div> holds alert messages to be display in the sample page. -->
+ <div id="alerts">
+ <noscript>
+ <p>
+ <strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
+ support, like yours, you should still see the contents (HTML data) and you should
+ be able to edit it normally, without a rich editor interface.
+ </p>
+ </noscript>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <textarea cols="100" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+
+ <script>
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace( 'editor1', {
+ on: {
+ focus: onFocus,
+ blur: onBlur,
+
+ // Check for availability of corresponding plugins.
+ pluginsLoaded: function( evt ) {
+ var doc = CKEDITOR.document, ed = evt.editor;
+ if ( !ed.getCommand( 'bold' ) )
+ doc.getById( 'exec-bold' ).hide();
+ if ( !ed.getCommand( 'link' ) )
+ doc.getById( 'exec-link' ).hide();
+ }
+ }
+ });
+ </script>
+
+ <p id="eMessage">
+ </p>
+
+ <div id="eButtons" style="display: none">
+ <input id="exec-bold" onclick="ExecuteCommand('bold');" type="button" value="Execute &quot;bold&quot; Command">
+ <input id="exec-link" onclick="ExecuteCommand('link');" type="button" value="Execute &quot;link&quot; Command">
+ <input onclick="Focus();" type="button" value="Focus">
+ <br><br>
+ <input onclick="InsertHTML();" type="button" value="Insert HTML">
+ <input onclick="SetContents();" type="button" value="Set Editor Contents">
+ <input onclick="GetContents();" type="button" value="Get Editor Contents (XHTML)">
+ <br>
+ <textarea cols="100" id="htmlArea" rows="3">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href="/Test1.html"&gt;sample&lt;/a&gt; HTML code.&lt;/p&gt;</textarea>
+ <br>
+ <br>
+ <input onclick="InsertText();" type="button" value="Insert Text">
+ <br>
+ <textarea cols="100" id="txtArea" rows="3"> First line with some leading whitespaces.
+
+Second line of text preceded by two line breaks.</textarea>
+ <br>
+ <br>
+ <input onclick="CheckDirty();" type="button" value="checkDirty()">
+ <input onclick="ResetDirty();" type="button" value="resetDirty()">
+ </div>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/appendto.html b/mod/ckeditor/vendors/ckeditor/samples/appendto.html
new file mode 100644
index 000000000..3a5fbef42
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/appendto.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>CKEDITOR.appendTo &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Append To Page Element Using JavaScript Code
+ </h1>
+ <div id="section1">
+ <div class="description">
+ <p>
+ <code>CKEDITOR.appendTo</code> is basically to place editors
+ inside existing DOM elements. Unlike <code>CKEDITOR.replace</code>,
+ a target container to be replaced is no longer necessary. A new editor
+ instance is inserted directly wherever it is desired.
+ </p>
+<pre class="samples">CKEDITOR.appendTo( '<em>container_id</em>',
+ { /* Configuration options to be used. */ }
+ 'Editor content to be used.'
+);</pre>
+ </div>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+ CKEDITOR.appendTo( 'section1',
+ null,
+ '<p>This is some <strong>sample text</strong>. You are using <a href="http://ckeditor.com/">CKEditor</a>.</p>'
+ );
+
+ </script>
+ </div>
+ <br>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/inlineall/logo.png b/mod/ckeditor/vendors/ckeditor/samples/assets/inlineall/logo.png
new file mode 100644
index 000000000..334e7ac99
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/inlineall/logo.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/outputxhtml/outputxhtml.css b/mod/ckeditor/vendors/ckeditor/samples/assets/outputxhtml/outputxhtml.css
new file mode 100644
index 000000000..2b15e1c3f
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/outputxhtml/outputxhtml.css
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ *
+ * Styles used by the XHTML 1.1 sample page (xhtml.html).
+ */
+
+/**
+ * Basic definitions for the editing area.
+ */
+body
+{
+ font-family: Arial, Verdana, sans-serif;
+ font-size: 80%;
+ color: #000000;
+ background-color: #ffffff;
+ padding: 5px;
+ margin: 0px;
+}
+
+/**
+ * Core styles.
+ */
+
+.Bold
+{
+ font-weight: bold;
+}
+
+.Italic
+{
+ font-style: italic;
+}
+
+.Underline
+{
+ text-decoration: underline;
+}
+
+.StrikeThrough
+{
+ text-decoration: line-through;
+}
+
+.Subscript
+{
+ vertical-align: sub;
+ font-size: smaller;
+}
+
+.Superscript
+{
+ vertical-align: super;
+ font-size: smaller;
+}
+
+/**
+ * Font faces.
+ */
+
+.FontComic
+{
+ font-family: 'Comic Sans MS';
+}
+
+.FontCourier
+{
+ font-family: 'Courier New';
+}
+
+.FontTimes
+{
+ font-family: 'Times New Roman';
+}
+
+/**
+ * Font sizes.
+ */
+
+.FontSmaller
+{
+ font-size: smaller;
+}
+
+.FontLarger
+{
+ font-size: larger;
+}
+
+.FontSmall
+{
+ font-size: 8pt;
+}
+
+.FontBig
+{
+ font-size: 14pt;
+}
+
+.FontDouble
+{
+ font-size: 200%;
+}
+
+/**
+ * Font colors.
+ */
+.FontColor1
+{
+ color: #ff9900;
+}
+
+.FontColor2
+{
+ color: #0066cc;
+}
+
+.FontColor3
+{
+ color: #ff0000;
+}
+
+.FontColor1BG
+{
+ background-color: #ff9900;
+}
+
+.FontColor2BG
+{
+ background-color: #0066cc;
+}
+
+.FontColor3BG
+{
+ background-color: #ff0000;
+}
+
+/**
+ * Indentation.
+ */
+
+.Indent1
+{
+ margin-left: 40px;
+}
+
+.Indent2
+{
+ margin-left: 80px;
+}
+
+.Indent3
+{
+ margin-left: 120px;
+}
+
+/**
+ * Alignment.
+ */
+
+.JustifyLeft
+{
+ text-align: left;
+}
+
+.JustifyRight
+{
+ text-align: right;
+}
+
+.JustifyCenter
+{
+ text-align: center;
+}
+
+.JustifyFull
+{
+ text-align: justify;
+}
+
+/**
+ * Other.
+ */
+
+code
+{
+ font-family: courier, monospace;
+ background-color: #eeeeee;
+ padding-left: 1px;
+ padding-right: 1px;
+ border: #c0c0c0 1px solid;
+}
+
+kbd
+{
+ padding: 0px 1px 0px 1px;
+ border-width: 1px 2px 2px 1px;
+ border-style: solid;
+}
+
+blockquote
+{
+ color: #808080;
+}
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/posteddata.php b/mod/ckeditor/vendors/ckeditor/samples/assets/posteddata.php
new file mode 100644
index 000000000..bb45656b6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/posteddata.php
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<?php
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+?>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Sample &mdash; CKEditor</title>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ CKEditor &mdash; Posted Data
+ </h1>
+ <table border="1" cellspacing="0" id="outputSample">
+ <colgroup><col width="120"></colgroup>
+ <thead>
+ <tr>
+ <th>Field&nbsp;Name</th>
+ <th>Value</th>
+ </tr>
+ </thead>
+<?php
+
+if (!empty($_POST))
+{
+ foreach ( $_POST as $key => $value )
+ {
+ if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) )
+ continue;
+
+ if ( get_magic_quotes_gpc() )
+ $value = htmlspecialchars( stripslashes((string)$value) );
+ else
+ $value = htmlspecialchars( (string)$value );
+?>
+ <tr>
+ <th style="vertical-align: top"><?php echo htmlspecialchars( (string)$key ); ?></th>
+ <td><pre class="samples"><?php echo $value; ?></pre></td>
+ </tr>
+ <?php
+ }
+}
+?>
+ </table>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/sample.css b/mod/ckeditor/vendors/ckeditor/samples/assets/sample.css
new file mode 100644
index 000000000..64167c258
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/sample.css
@@ -0,0 +1,3 @@
+/**
+ * Required by tests (dom/document.html).
+ */
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/sample.jpg b/mod/ckeditor/vendors/ckeditor/samples/assets/sample.jpg
new file mode 100644
index 000000000..a4a77fae8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/sample.jpg
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/samples/assets/uilanguages/languages.js b/mod/ckeditor/vendors/ckeditor/samples/assets/uilanguages/languages.js
new file mode 100644
index 000000000..1b705f18a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/assets/uilanguages/languages.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",is:"Icelandic",
+it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",sk:"Slovak",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",sv:"Swedish",th:"Thai",tr:"Turkish",uk:"Ukrainian",vi:"Vietnamese",zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,
+name:c[a]||a});b.sort(function(a,b){return a.name<b.name?-1:1});return b}(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/samples/divreplace.html b/mod/ckeditor/vendors/ckeditor/samples/divreplace.html
new file mode 100644
index 000000000..ac5f5f8c7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/divreplace.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Replace DIV &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+
+ div.editable
+ {
+ border: solid 2px Transparent;
+ padding-left: 15px;
+ padding-right: 15px;
+ }
+
+ div.editable:hover
+ {
+ border-color: black;
+ }
+
+ </style>
+ <script>
+
+ // Uncomment the following code to test the "Timeout Loading Method".
+ // CKEDITOR.loadFullCoreTimeout = 5;
+
+ window.onload = function() {
+ // Listen to the double click event.
+ if ( window.addEventListener )
+ document.body.addEventListener( 'dblclick', onDoubleClick, false );
+ else if ( window.attachEvent )
+ document.body.attachEvent( 'ondblclick', onDoubleClick );
+
+ };
+
+ function onDoubleClick( ev ) {
+ // Get the element which fired the event. This is not necessarily the
+ // element to which the event has been attached.
+ var element = ev.target || ev.srcElement;
+
+ // Find out the div that holds this element.
+ var name;
+
+ do {
+ element = element.parentNode;
+ }
+ while ( element && ( name = element.nodeName.toLowerCase() ) &&
+ ( name != 'div' || element.className.indexOf( 'editable' ) == -1 ) && name != 'body' );
+
+ if ( name == 'div' && element.className.indexOf( 'editable' ) != -1 )
+ replaceDiv( element );
+ }
+
+ var editor;
+
+ function replaceDiv( div ) {
+ if ( editor )
+ editor.destroy();
+
+ editor = CKEDITOR.replace( div );
+ }
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace DIV with CKEditor on the Fly
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;div&gt;</code> elements
+ with a CKEditor instance on the fly, following user's doubleclick. The content
+ that was previously placed inside the <code>&lt;div&gt;</code> element will now
+ be moved into CKEditor editing area.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>
+ Double-click any of the following <code>&lt;div&gt;</code> elements to transform them into
+ editor instances.
+ </p>
+ <div class="editable">
+ <h3>
+ Part 1
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ </div>
+ <div class="editable">
+ <h3>
+ Part 2
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ <p>
+ Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus
+ sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum
+ vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate.
+ </p>
+ </div>
+ <div class="editable">
+ <h3>
+ Part 3
+ </h3>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+ semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+ rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+ nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+ eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+ </p>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/index.html b/mod/ckeditor/vendors/ckeditor/samples/index.html
new file mode 100644
index 000000000..1301067ab
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>CKEditor Samples</title>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ CKEditor Samples
+ </h1>
+ <div class="twoColumns">
+ <div class="twoColumnsLeft">
+ <h2 class="samples">
+ Basic Samples
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="replacebyclass.html">Replace textarea elements by class name</a></dt>
+ <dd>Automatic replacement of all textarea elements of a given class with a CKEditor instance.</dd>
+
+ <dt><a class="samples" href="replacebycode.html">Replace textarea elements by code</a></dt>
+ <dd>Replacement of textarea elements with CKEditor instances by using a JavaScript call.</dd>
+ </dl>
+
+ <h2 class="samples">
+ Basic Customization
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="uicolor.html">User Interface color</a></dt>
+ <dd>Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.</dd>
+
+ <dt><a class="samples" href="uilanguages.html">User Interface languages</a></dt>
+ <dd>Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.</dd>
+ </dl>
+
+
+ <h2 class="samples">Plugins</h2>
+<dl class="samples">
+<dt><a class="samples" href="plugins/magicline/magicline.html">Magicline plugin</a><span class="new">New!</span></dt>
+<dd>Using the Magicline plugin to access difficult focus spaces.</dd>
+
+<dt><a class="samples" href="plugins/wysiwygarea/fullpage.html">Full page support</a></dt>
+<dd>CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.</dd>
+</dl>
+ </div>
+ <div class="twoColumnsRight">
+ <h2 class="samples">
+ Inline Editing <span class="new">New!</span>
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="inlineall.html">Massive inline editor creation</a> <span class="new">New!</span></dt>
+ <dd>Turn all elements with <code>contentEditable = true</code> attribute into inline editors.</dd>
+
+ <dt><a class="samples" href="inlinebycode.html">Convert element into an inline editor by code</a> <span class="new">New!</span></dt>
+ <dd>Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.</dd>
+
+
+ </dl>
+
+ <h2 class="samples">
+ Advanced Samples
+ </h2>
+ <dl class="samples">
+ <dt><a class="samples" href="divreplace.html">Replace DIV elements on the fly</a></dt>
+ <dd>Transforming a <code>div</code> element into an instance of CKEditor with a mouse click.</dd>
+
+ <dt><a class="samples" href="appendto.html">Append editor instances</a></dt>
+ <dd>Appending editor instances to existing DOM elements.</dd>
+
+ <dt><a class="samples" href="ajax.html">Create and destroy editor instances for Ajax applications</a></dt>
+ <dd>Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.</dd>
+
+ <dt><a class="samples" href="api.html">Basic usage of the API</a></dt>
+ <dd>Using the CKEditor JavaScript API to interact with the editor at runtime.</dd>
+
+ <dt><a class="samples" href="xhtmlstyle.html">XHTML-compliant style</a></dt>
+ <dd>Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.</dd>
+
+ <dt><a class="samples" href="readonly.html">Read-only mode</a></dt>
+ <dd>Using the readOnly API to block introducing changes to the editor contents.</dd>
+
+ <dt><a class="samples" href="tabindex.html">"Tab" key-based navigation</a> <span class="new">New!</span></dt>
+ <dd>Navigating among editor instances with tab key.</dd>
+
+
+
+<dt><a class="samples" href="plugins/dialog/dialog.html">Using the JavaScript API to customize dialog windows</a></dt>
+<dd>Using the dialog windows API to customize dialog windows without changing the original editor code.</dd>
+
+<dt><a class="samples" href="plugins/enterkey/enterkey.html">Using the &quot;Enter&quot; key in CKEditor</a></dt>
+<dd>Configuring the behavior of <em>Enter</em> and <em>Shift+Enter</em> keys.</dd>
+
+<dt><a class="samples" href="plugins/htmlwriter/outputforflash.html">Output for Flash</a></dt>
+<dd>Configuring CKEditor to produce HTML code that can be used with Adobe Flash.</dd>
+
+<dt><a class="samples" href="plugins/htmlwriter/outputhtml.html">Output HTML</a></dt>
+<dd>Configuring CKEditor to produce legacy HTML 4 code.</dd>
+
+<dt><a class="samples" href="plugins/toolbar/toolbar.html">Toolbar Configurations</a><span class="new">New!</span></dt>
+<dd>Configuring CKEditor to display full or custom toolbar layout.</dd>
+
+ </dl>
+ </div>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/inlineall.html b/mod/ckeditor/vendors/ckeditor/samples/inlineall.html
new file mode 100644
index 000000000..1b74de7b1
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/inlineall.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Massive inline editing &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <script>
+
+ // This code is generally not necessary, but it is here to demonstrate
+ // how to customize specific editor instances on the fly. This fits well
+ // this demo because we have editable elements (like headers) that
+ // require less features.
+
+ // The "instanceCreated" event is fired for every editor instance created.
+ CKEDITOR.on( 'instanceCreated', function( event ) {
+ var editor = event.editor,
+ element = editor.element;
+
+ // Customize editors for headers and tag list.
+ // These editors don't need features like smileys, templates, iframes etc.
+ if ( element.is( 'h1', 'h2', 'h3' ) || element.getAttribute( 'id' ) == 'taglist' ) {
+ // Customize the editor configurations on "configLoaded" event,
+ // which is fired after the configuration file loading and
+ // execution. This makes it possible to change the
+ // configurations before the editor initialization takes place.
+ editor.on( 'configLoaded', function() {
+
+ // Remove unnecessary plugins to make the editor simpler.
+ editor.config.removePlugins = 'colorbutton,find,flash,font,' +
+ 'forms,iframe,image,newpage,removeformat,' +
+ 'smiley,specialchar,stylescombo,templates';
+
+ // Rearrange the layout of the toolbar.
+ editor.config.toolbarGroups = [
+ { name: 'editing', groups: [ 'basicstyles', 'links' ] },
+ { name: 'undo' },
+ { name: 'clipboard', groups: [ 'selection', 'clipboard' ] },
+ { name: 'about' }
+ ];
+ });
+ }
+ });
+
+ </script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+
+ /* The following styles are just to make the page look nice. */
+
+ /* Workaround to show Arial Black in Firefox. */
+ @font-face
+ {
+ font-family: 'arial-black';
+ src: local('Arial Black');
+ }
+
+ *[contenteditable="true"]
+ {
+ padding: 10px;
+ }
+
+ #container
+ {
+ width: 960px;
+ margin: 30px auto 0;
+ }
+
+ #header
+ {
+ overflow: hidden;
+ padding: 0 0 30px;
+ border-bottom: 5px solid #05B2D2;
+ position: relative;
+ }
+
+ #headerLeft,
+ #headerRight
+ {
+ width: 49%;
+ overflow: hidden;
+ }
+
+ #headerLeft
+ {
+ float: left;
+ padding: 10px 1px 1px;
+ }
+
+ #headerLeft h2,
+ #headerLeft h3
+ {
+ text-align: right;
+ margin: 0;
+ overflow: hidden;
+ font-weight: normal;
+ }
+
+ #headerLeft h2
+ {
+ font-family: "Arial Black",arial-black;
+ font-size: 4.6em;
+ line-height: 1.1em;
+ text-transform: uppercase;
+ }
+
+ #headerLeft h3
+ {
+ font-size: 2.3em;
+ line-height: 1.1em;
+ margin: .2em 0 0;
+ color: #666;
+ }
+
+ #headerRight
+ {
+ float: right;
+ padding: 1px;
+ }
+
+ #headerRight p
+ {
+ line-height: 1.8em;
+ text-align: justify;
+ margin: 0;
+ }
+
+ #headerRight p + p
+ {
+ margin-top: 20px;
+ }
+
+ #headerRight > div
+ {
+ padding: 20px;
+ margin: 0 0 0 30px;
+ font-size: 1.4em;
+ color: #666;
+ }
+
+ #columns
+ {
+ color: #333;
+ overflow: hidden;
+ padding: 20px 0;
+ }
+
+ #columns > div
+ {
+ float: left;
+ width: 33.3%;
+ }
+
+ #columns #column1 > div
+ {
+ margin-left: 1px;
+ }
+
+ #columns #column3 > div
+ {
+ margin-right: 1px;
+ }
+
+ #columns > div > div
+ {
+ margin: 0px 10px;
+ padding: 10px 20px;
+ }
+
+ #columns blockquote
+ {
+ margin-left: 15px;
+ }
+
+ #tagLine
+ {
+ border-top: 5px solid #05B2D2;
+ padding-top: 20px;
+ }
+
+ #taglist {
+ display: inline-block;
+ margin-left: 20px;
+ font-weight: bold;
+ margin: 0 0 0 20px;
+ }
+
+ </style>
+</head>
+<body>
+<div>
+ <h1 class="samples"><a href="index.html">CKEditor Samples</a> &raquo; Massive inline editing</h1>
+ <div class="description">
+ <p>This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with <strong>contentEditable</strong> attribute set to value <strong>true</strong>:</p>
+ <pre class="samples">&lt;div <strong>contenteditable="true</strong>" &gt; ... &lt;/div&gt;</pre>
+ <p>Click inside of any element below to start editing.</p>
+ </div>
+</div>
+<div id="container">
+ <div id="header">
+ <div id="headerLeft">
+ <h2 id="sampleTitle" contenteditable="true">
+ CKEditor<br> Goes Inline!
+ </h2>
+ <h3 contenteditable="true">
+ Lorem ipsum dolor sit amet dolor duis blandit vestibulum faucibus a, tortor.
+ </h3>
+ </div>
+ <div id="headerRight">
+ <div contenteditable="true">
+ <p>
+ Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies.
+ </p>
+ <p>
+ Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac.
+ </p>
+ </div>
+ </div>
+ </div>
+ <div id="columns">
+ <div id="column1">
+ <div contenteditable="true">
+ <h3>
+ Fusce vitae porttitor
+ </h3>
+ <p>
+ <strong>
+ Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor.
+ </strong>
+ </p>
+ <p>
+ Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum <a href="http://ckeditor.com/">nisl nulla sem in</a> metus. Maecenas wisi. Donec nec erat volutpat.
+ </p>
+ <blockquote>
+ <p>
+ Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium.
+ Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum
+ </p>
+ </blockquote>
+ <blockquote>
+ <p>
+ Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu.
+ </p>
+ </blockquote>
+ <p>Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.</p>
+ <p><strike>Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.</strike></p>
+ </div>
+ </div>
+ <div id="column2">
+ <div contenteditable="true">
+ <h3>
+ Integer condimentum sit amet
+ </h3>
+ <p>
+ <strong>Aenean nonummy a, mattis varius. Cras aliquet.</strong>
+ Praesent <a href="http://ckeditor.com/">magna non mattis ac, rhoncus nunc</a>, rhoncus eget, cursus pulvinar mollis.</p>
+ <p>Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.</p>
+ <p>Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.</p>
+ </div>
+ <div contenteditable="true">
+ <h3>
+ Praesent wisi accumsan sit amet nibh
+ </h3>
+ <p>Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.</p>
+ <p style="margin-left: 40px; ">Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce <a href="http://ckeditor.com/">gravida, erat vitae augue</a>. Fusce urna fringilla gravida.</p>
+ <p>In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.</p>
+ </div>
+ </div>
+ <div id="column3">
+ <div contenteditable="true">
+ <p>
+ <img src="assets/inlineall/logo.png" alt="CKEditor logo" style="float:left">
+ </p>
+ <p>Quisque justo neque, mattis sed, fermentum ultrices <strong>posuere cubilia Curae</strong>, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.</p>
+ <h3>
+ Nullam laoreet vel consectetuer tellus suscipit
+ </h3>
+ <ul>
+ <li>Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.</li>
+ <li>Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.</li>
+ <li>Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</li>
+ </ul>
+ <p>Quisque justo neque, mattis sed, <a href="http://ckeditor.com/">fermentum ultrices posuere cubilia</a> Curae, Vestibulum elit metus, quis placerat ut, lectus.</p>
+ <p>Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.</p>
+ <p>Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</p>
+ </div>
+ </div>
+ </div>
+ <div id="tagLine">
+ Tags of this article:
+ <p id="taglist" contenteditable="true">
+ inline, editing, floating, CKEditor
+ </p>
+ </div>
+</div>
+<div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">
+ http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+</div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/inlinebycode.html b/mod/ckeditor/vendors/ckeditor/samples/inlinebycode.html
new file mode 100644
index 000000000..2579f6f97
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/inlinebycode.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Inline Editing by Code &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+
+ #editable
+ {
+ padding: 10px;
+ float: left;
+ }
+
+ </style>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Inline Editing by Code
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to create an inline editor instance of CKEditor. It is created
+ with a JavaScript call using the following code:
+ </p>
+<pre class="samples">
+// This property tells CKEditor to not activate every element with contenteditable=true element.
+CKEDITOR.disableAutoInline = true;
+
+var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
+</pre>
+ <p>
+ Note that <code>editable</code> in the code above is the <code>id</code>
+ attribute of the <code>&lt;div&gt;</code> element to be converted into an inline instance.
+ </p>
+ </div>
+ <div id="editable" contenteditable="true">
+ <h1><img alt="Saturn V carrying Apollo 11" class="right" src="assets/sample.jpg" /> Apollo 11</h1>
+
+ <p><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</p>
+
+ <p>Armstrong spent about <strike>three and a half</strike> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)" title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module" title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.</p>
+
+ <h2>Broadcasting and <em>quotes</em> <a id="quotes" name="quotes"></a></h2>
+
+ <p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>
+
+ <blockquote>
+ <p>One small step for [a] man, one giant leap for mankind.</p>
+ </blockquote>
+
+ <p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race" title="Space Race">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F. Kennedy</a> in a speech before the United States Congress:</p>
+
+ <blockquote>
+ <p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p>
+ </blockquote>
+
+ <h2>Technical details <a id="tech-details" name="tech-details"></a></h2>
+
+ <table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse;margin:10px 0 10px 15px;">
+ <caption><strong>Mission crew</strong></caption>
+ <thead>
+ <tr>
+ <th scope="col">Position</th>
+ <th scope="col">Astronaut</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Commander</td>
+ <td>Neil A. Armstrong</td>
+ </tr>
+ <tr>
+ <td>Command Module Pilot</td>
+ <td>Michael Collins</td>
+ </tr>
+ <tr>
+ <td>Lunar Module Pilot</td>
+ <td>Edwin &quot;Buzz&quot; E. Aldrin, Jr.</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p>Launched by a <strong>Saturn V</strong> rocket from <a href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center">Kennedy Space Center</a> in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of <a href="http://en.wikipedia.org/wiki/NASA" title="NASA">NASA</a>&#39;s Apollo program. The Apollo spacecraft had three parts:</p>
+
+ <ol>
+ <li><strong>Command Module</strong> with a cabin for the three astronauts which was the only part which landed back on Earth</li>
+ <li><strong>Service Module</strong> which supported the Command Module with propulsion, electrical power, oxygen and water</li>
+ <li><strong>Lunar Module</strong> for landing on the Moon.</li>
+ </ol>
+
+ <p>After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the <a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis" title="Mare Tranquillitatis">Sea of Tranquility</a>. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the <a href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a> on July 24.</p>
+
+ <hr />
+ <p style="text-align: right;"><small>Source: <a href="http://en.wikipedia.org/wiki/Apollo_11">Wikipedia.org</a></small></p>
+ </div>
+ <script>
+
+ // We need to turn off the automatic editor creation first.
+ CKEDITOR.disableAutoInline = true;
+
+ var editor = CKEDITOR.inline( 'editable' );
+
+ </script>
+ <div id="footer">
+ <hr>
+ <p contenteditable="true">
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">
+ http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/assets/my_dialog.js b/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/assets/my_dialog.js
new file mode 100644
index 000000000..b80cac91e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/assets/my_dialog.js
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+CKEDITOR.dialog.add( 'myDialog', function( editor ) {
+ return {
+ title: 'My Dialog',
+ minWidth: 400,
+ minHeight: 200,
+ contents: [
+ {
+ id: 'tab1',
+ label: 'First Tab',
+ title: 'First Tab',
+ elements: [
+ {
+ id: 'input1',
+ type: 'text',
+ label: 'Text Field'
+ },
+ {
+ id: 'select1',
+ type: 'select',
+ label: 'Select Field',
+ items: [
+ [ 'option1', 'value1' ],
+ [ 'option2', 'value2' ]
+ ]
+ }
+ ]
+ },
+ {
+ id: 'tab2',
+ label: 'Second Tab',
+ title: 'Second Tab',
+ elements: [
+ {
+ id: 'button1',
+ type: 'button',
+ label: 'Button Field'
+ }
+ ]
+ }
+ ]
+ };
+});
+
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/dialog.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/dialog.html
new file mode 100644
index 000000000..002768454
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/dialog/dialog.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Using API to Customize Dialog Windows &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <link rel="stylesheet" href="../../../samples/sample.css">
+ <meta name="ckeditor-sample-name" content="Using the JavaScript API to customize dialog windows">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Using the dialog windows API to customize dialog windows without changing the original editor code.">
+ <style>
+
+ .cke_button__mybutton_icon
+ {
+ display: none !important;
+ }
+
+ .cke_button__mybutton_label
+ {
+ display: inline !important;
+ }
+
+ </style>
+ <script>
+
+ CKEDITOR.on( 'instanceCreated', function( ev ){
+ var editor = ev.editor;
+
+ // Listen for the "pluginsLoaded" event, so we are sure that the
+ // "dialog" plugin has been loaded and we are able to do our
+ // customizations.
+ editor.on( 'pluginsLoaded', function() {
+
+ // If our custom dialog has not been registered, do that now.
+ if ( !CKEDITOR.dialog.exists( 'myDialog' ) ) {
+ // We need to do the following trick to find out the dialog
+ // definition file URL path. In the real world, you would simply
+ // point to an absolute path directly, like "/mydir/mydialog.js".
+ var href = document.location.href.split( '/' );
+ href.pop();
+ href.push( 'assets/my_dialog.js' );
+ href = href.join( '/' );
+
+ // Finally, register the dialog.
+ CKEDITOR.dialog.add( 'myDialog', href );
+ }
+
+ // Register the command used to open the dialog.
+ editor.addCommand( 'myDialogCmd', new CKEDITOR.dialogCommand( 'myDialog' ) );
+
+ // Add the a custom toolbar buttons, which fires the above
+ // command..
+ editor.ui.add( 'MyButton', CKEDITOR.UI_BUTTON, {
+ label: 'My Dialog',
+ command: 'myDialogCmd'
+ });
+ });
+ });
+
+ // When opening a dialog, its "definition" is created for it, for
+ // each editor instance. The "dialogDefinition" event is then
+ // fired. We should use this event to make customizations to the
+ // definition of existing dialogs.
+ CKEDITOR.on( 'dialogDefinition', function( ev ) {
+ // Take the dialog name and its definition from the event data.
+ var dialogName = ev.data.name;
+ var dialogDefinition = ev.data.definition;
+
+ // Check if the definition is from the dialog we're
+ // interested on (the "Link" dialog).
+ if ( dialogName == 'myDialog' && ev.editor.name == 'editor2' ) {
+ // Get a reference to the "Link Info" tab.
+ var infoTab = dialogDefinition.getContents( 'tab1' );
+
+ // Add a new text field to the "tab1" tab page.
+ infoTab.add( {
+ type: 'text',
+ label: 'My Custom Field',
+ id: 'customField',
+ 'default': 'Sample!',
+ validate: function() {
+ if ( ( /\d/ ).test( this.getValue() ) )
+ return 'My Custom Field must not contain digits';
+ }
+ });
+
+ // Remove the "select1" field from the "tab1" tab.
+ infoTab.remove( 'select1' );
+
+ // Set the default value for "input1" field.
+ var input1 = infoTab.get( 'input1' );
+ input1[ 'default' ] = 'www.example.com';
+
+ // Remove the "tab2" tab page.
+ dialogDefinition.removeContents( 'tab2' );
+
+ // Add a new tab to the "Link" dialog.
+ dialogDefinition.addContents( {
+ id: 'customTab',
+ label: 'My Tab',
+ accessKey: 'M',
+ elements: [
+ {
+ id: 'myField1',
+ type: 'text',
+ label: 'My Text Field'
+ },
+ {
+ id: 'myField2',
+ type: 'text',
+ label: 'Another Text Field'
+ }
+ ]
+ });
+
+ // Provide the focus handler to start initial focus in "customField" field.
+ dialogDefinition.onFocus = function() {
+ var urlField = this.getContentElement( 'tab1', 'customField' );
+ urlField.select();
+ };
+ }
+ });
+
+ var config = {
+ extraPlugins: 'dialog',
+ toolbar: [ [ 'MyButton' ] ]
+ };
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Using CKEditor Dialog API
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.dialog">CKEditor Dialog API</a>
+ to customize CKEditor dialog windows without changing the original editor code.
+ The following customizations are being done in the example below:
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>A custom dialog is added to the editors using the <code>pluginsLoaded</code> event, from an external <a target="_blank" href="assets/my_dialog.js">dialog definition file</a>:</p>
+ <ol>
+ <li><strong>Creating a custom dialog window</strong> &ndash; "My Dialog" dialog window opened with the "My Dialog" toolbar button.</li>
+ <li><strong>Creating a custom button</strong> &ndash; Add button to open the dialog with "My Dialog" toolbar button.</li>
+ </ol>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace( 'editor1', config );
+ </script>
+ <p>The below editor modify the dialog definition of the above added dialog using the <code>dialogDefinition</code> event:</p>
+ <ol>
+ <li><strong>Adding dialog tab</strong> &ndash; Add new tab "My Tab" to dialog window.</li>
+ <li><strong>Removing a dialog window tab</strong> &ndash; Remove "Second Tab" page from the dialog window.</li>
+ <li><strong>Adding dialog window fields</strong> &ndash; Add "My Custom Field" to the dialog window.</li>
+ <li><strong>Removing dialog window field</strong> &ndash; Remove "Select Field" selection field from the dialog window.</li>
+ <li><strong>Setting default values for dialog window fields</strong> &ndash; Set default value of "Text Field" text field. </li>
+ <li><strong>Setup initial focus for dialog window</strong> &ndash; Put initial focus on "My Custom Field" text field. </li>
+ </ol>
+ <textarea cols="80" id="editor2" name="editor2" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Replace the <textarea id="editor1"> with an CKEditor instance.
+ CKEDITOR.replace( 'editor2', config );
+
+ </script>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/enterkey/enterkey.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/enterkey/enterkey.html
new file mode 100644
index 000000000..c2b19b5d0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/enterkey/enterkey.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>ENTER Key Configuration &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <link href="../../../samples/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-name" content="Using the &quot;Enter&quot; key in CKEditor">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring the behavior of &lt;em&gt;Enter&lt;/em&gt; and &lt;em&gt;Shift+Enter&lt;/em&gt; keys.">
+ <script>
+
+ var editor;
+
+ function changeEnter() {
+ // If we already have an editor, let's destroy it first.
+ if ( editor )
+ editor.destroy( true );
+
+ // Create the editor again, with the appropriate settings.
+ editor = CKEDITOR.replace( 'editor1', {
+ extraPlugins: 'enterkey',
+ enterMode: Number( document.getElementById( 'xEnter' ).value ),
+ shiftEnterMode: Number( document.getElementById( 'xShiftEnter' ).value )
+ });
+ }
+
+ window.onload = changeEnter;
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; ENTER Key Configuration
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure the <em>Enter</em> and <em>Shift+Enter</em> keys
+ to perform actions specified in the
+ <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode"><code>enterMode</code></a>
+ and <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode"><code>shiftEnterMode</code></a>
+ parameters, respectively.
+ You can choose from the following options:
+ </p>
+ <ul class="samples">
+ <li><strong><code>ENTER_P</code></strong> &ndash; new <code>&lt;p&gt;</code> paragraphs are created;</li>
+ <li><strong><code>ENTER_BR</code></strong> &ndash; lines are broken with <code>&lt;br&gt;</code> elements;</li>
+ <li><strong><code>ENTER_DIV</code></strong> &ndash; new <code>&lt;div&gt;</code> blocks are created.</li>
+ </ul>
+ <p>
+ The sample code below shows how to configure CKEditor to create a <code>&lt;div&gt;</code> block when <em>Enter</em> key is pressed.
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>enterMode: CKEDITOR.ENTER_DIV</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ </div>
+ <div style="float: left; margin-right: 20px">
+ When <em>Enter</em> is pressed:<br>
+ <select id="xEnter" onchange="changeEnter();">
+ <option selected="selected" value="1">Create a new &lt;P&gt; (recommended)</option>
+ <option value="3">Create a new &lt;DIV&gt;</option>
+ <option value="2">Break the line with a &lt;BR&gt;</option>
+ </select>
+ </div>
+ <div style="float: left">
+ When <em>Shift+Enter</em> is pressed:<br>
+ <select id="xShiftEnter" onchange="changeEnter();">
+ <option value="1">Create a new &lt;P&gt;</option>
+ <option value="3">Create a new &lt;DIV&gt;</option>
+ <option selected="selected" value="2">Break the line with a &lt;BR&gt; (recommended)</option>
+ </select>
+ </div>
+ <br style="clear: both">
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <p>
+ <br>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.</textarea>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla
new file mode 100644
index 000000000..27e68ccd1
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf
new file mode 100644
index 000000000..dbe17b6bc
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
new file mode 100644
index 000000000..95fdf0a7a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
@@ -0,0 +1,18 @@
+var swfobject=function(){function u(){if(!s){try{var a=d.getElementsByTagName("body")[0].appendChild(d.createElement("span"));a.parentNode.removeChild(a)}catch(b){return}s=!0;for(var a=x.length,c=0;c<a;c++)x[c]()}}function L(a){s?a():x[x.length]=a}function M(a){if(typeof m.addEventListener!=i)m.addEventListener("load",a,!1);else if(typeof d.addEventListener!=i)d.addEventListener("load",a,!1);else if(typeof m.attachEvent!=i)U(m,"onload",a);else if("function"==typeof m.onload){var b=m.onload;m.onload=
+function(){b();a()}}else m.onload=a}function V(){var a=d.getElementsByTagName("body")[0],b=d.createElement(r);b.setAttribute("type",y);var c=a.appendChild(b);if(c){var f=0;(function(){if(typeof c.GetVariable!=i){var g=c.GetVariable("$version");g&&(g=g.split(" ")[1].split(","),e.pv=[parseInt(g[0],10),parseInt(g[1],10),parseInt(g[2],10)])}else if(10>f){f++;setTimeout(arguments.callee,10);return}a.removeChild(b);c=null;D()})()}else D()}function D(){var a=p.length;if(0<a)for(var b=0;b<a;b++){var c=p[b].id,
+f=p[b].callbackFn,g={success:!1,id:c};if(0<e.pv[0]){var d=n(c);if(d)if(z(p[b].swfVersion)&&!(e.wk&&312>e.wk))t(c,!0),f&&(g.success=!0,g.ref=E(c),f(g));else if(p[b].expressInstall&&F()){g={};g.data=p[b].expressInstall;g.width=d.getAttribute("width")||"0";g.height=d.getAttribute("height")||"0";d.getAttribute("class")&&(g.styleclass=d.getAttribute("class"));d.getAttribute("align")&&(g.align=d.getAttribute("align"));for(var h={},d=d.getElementsByTagName("param"),j=d.length,k=0;k<j;k++)"movie"!=d[k].getAttribute("name").toLowerCase()&&
+(h[d[k].getAttribute("name")]=d[k].getAttribute("value"));G(g,h,c,f)}else W(d),f&&f(g)}else if(t(c,!0),f){if((c=E(c))&&typeof c.SetVariable!=i)g.success=!0,g.ref=c;f(g)}}}function E(a){var b=null;if((a=n(a))&&"OBJECT"==a.nodeName)typeof a.SetVariable!=i?b=a:(a=a.getElementsByTagName(r)[0])&&(b=a);return b}function F(){return!A&&z("6.0.65")&&(e.win||e.mac)&&!(e.wk&&312>e.wk)}function G(a,b,c,f){A=!0;H=f||null;N={success:!1,id:c};var g=n(c);if(g){"OBJECT"==g.nodeName?(w=I(g),B=null):(w=g,B=c);a.id=
+O;if(typeof a.width==i||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width="310";if(typeof a.height==i||!/%$/.test(a.height)&&137>parseInt(a.height,10))a.height="137";d.title=d.title.slice(0,47)+" - Flash Player Installation";f=e.ie&&e.win?"ActiveX":"PlugIn";f="MMredirectURL="+m.location.toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+d.title;b.flashvars=typeof b.flashvars!=i?b.flashvars+("&"+f):f;e.ie&&(e.win&&4!=g.readyState)&&(f=d.createElement("div"),c+="SWFObjectNew",f.setAttribute("id",
+c),g.parentNode.insertBefore(f,g),g.style.display="none",function(){g.readyState==4?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());J(a,b,c)}}function W(a){if(e.ie&&e.win&&4!=a.readyState){var b=d.createElement("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(I(a),b);a.style.display="none";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(I(a),a)}function I(a){var b=d.createElement("div");if(e.win&&
+e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(r)[0])if(a=a.childNodes)for(var c=a.length,f=0;f<c;f++)!(1==a[f].nodeType&&"PARAM"==a[f].nodeName)&&8!=a[f].nodeType&&b.appendChild(a[f].cloneNode(!0));return b}function J(a,b,c){var f,g=n(c);if(e.wk&&312>e.wk)return f;if(g)if(typeof a.id==i&&(a.id=c),e.ie&&e.win){var o="",h;for(h in a)a[h]!=Object.prototype[h]&&("data"==h.toLowerCase()?b.movie=a[h]:"styleclass"==h.toLowerCase()?o+=' class="'+a[h]+'"':"classid"!=h.toLowerCase()&&(o+=" "+
+h+'="'+a[h]+'"'));h="";for(var j in b)b[j]!=Object.prototype[j]&&(h+='<param name="'+j+'" value="'+b[j]+'" />');g.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+o+">"+h+"</object>";C[C.length]=a.id;f=n(a.id)}else{j=d.createElement(r);j.setAttribute("type",y);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(o in b)b[o]!=Object.prototype[o]&&"movie"!=o.toLowerCase()&&
+(a=j,h=o,k=b[o],c=d.createElement("param"),c.setAttribute("name",h),c.setAttribute("value",k),a.appendChild(c));g.parentNode.replaceChild(j,g);f=j}return f}function P(a){var b=n(a);b&&"OBJECT"==b.nodeName&&(e.ie&&e.win?(b.style.display="none",function(){if(4==b.readyState){var c=n(a);if(c){for(var f in c)"function"==typeof c[f]&&(c[f]=null);c.parentNode.removeChild(c)}}else setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function n(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b}
+function U(a,b,c){a.attachEvent(b,c);v[v.length]=[a,b,c]}function z(a){var b=e.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function Q(a,b,c,f){if(!e.ie||!e.mac){var g=d.getElementsByTagName("head")[0];if(g){c=c&&"string"==typeof c?c:"screen";f&&(K=l=null);if(!l||K!=c)f=d.createElement("style"),f.setAttribute("type","text/css"),f.setAttribute("media",c),l=g.appendChild(f),
+e.ie&&(e.win&&typeof d.styleSheets!=i&&0<d.styleSheets.length)&&(l=d.styleSheets[d.styleSheets.length-1]),K=c;e.ie&&e.win?l&&typeof l.addRule==r&&l.addRule(a,b):l&&typeof d.createTextNode!=i&&l.appendChild(d.createTextNode(a+" {"+b+"}"))}}}function t(a,b){if(R){var c=b?"visible":"hidden";s&&n(a)?n(a).style.visibility=c:Q("#"+a,"visibility:"+c)}}function S(a){return null!=/[\\\"<>\.;]/.exec(a)&&typeof encodeURIComponent!=i?encodeURIComponent(a):a}var i="undefined",r="object",y="application/x-shockwave-flash",
+O="SWFObjectExprInst",m=window,d=document,q=navigator,T=!1,x=[function(){T?V():D()}],p=[],C=[],v=[],w,B,H,N,s=!1,A=!1,l,K,R=!0,e=function(){var a=typeof d.getElementById!=i&&typeof d.getElementsByTagName!=i&&typeof d.createElement!=i,b=q.userAgent.toLowerCase(),c=q.platform.toLowerCase(),f=c?/win/.test(c):/win/.test(b),c=c?/mac/.test(c):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,g=!+"\v1",e=[0,0,0],h=null;if(typeof q.plugins!=i&&typeof q.plugins["Shockwave Flash"]==
+r){if((h=q.plugins["Shockwave Flash"].description)&&!(typeof q.mimeTypes!=i&&q.mimeTypes[y]&&!q.mimeTypes[y].enabledPlugin))T=!0,g=!1,h=h.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(h.replace(/^(.*)\..*$/,"$1"),10),e[1]=parseInt(h.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(h)?parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof m.ActiveXObject!=i)try{var j=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(j&&(h=j.GetVariable("$version")))g=!0,h=h.split(" ")[1].split(","),
+e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)]}catch(k){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((typeof d.readyState!=i&&"complete"==d.readyState||typeof d.readyState==i&&(d.getElementsByTagName("body")[0]||d.body))&&u(),s||(typeof d.addEventListener!=i&&d.addEventListener("DOMContentLoaded",u,!1),e.ie&&e.win&&(d.attachEvent("onreadystatechange",function(){"complete"==d.readyState&&(d.detachEvent("onreadystatechange",arguments.callee),u())}),m==top&&function(){if(!s){try{d.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,
+0);return}u()}}()),e.wk&&function(){s||(/loaded|complete/.test(d.readyState)?u():setTimeout(arguments.callee,0))}(),M(u)))})();(function(){e.ie&&e.win&&window.attachEvent("onunload",function(){for(var a=v.length,b=0;b<a;b++)v[b][0].detachEvent(v[b][1],v[b][2]);a=C.length;for(b=0;b<a;b++)P(C[b]);for(var c in e)e[c]=null;e=null;for(var f in swfobject)swfobject[f]=null;swfobject=null})})();return{registerObject:function(a,b,c,f){if(e.w3&&a&&b){var d={};d.id=a;d.swfVersion=b;d.expressInstall=c;d.callbackFn=
+f;p[p.length]=d;t(a,!1)}else f&&f({success:!1,id:a})},getObjectById:function(a){if(e.w3)return E(a)},embedSWF:function(a,b,c,d,g,o,h,j,k,m){var n={success:!1,id:b};e.w3&&!(e.wk&&312>e.wk)&&a&&b&&c&&d&&g?(t(b,!1),L(function(){c+="";d+="";var e={};if(k&&typeof k===r)for(var l in k)e[l]=k[l];e.data=a;e.width=c;e.height=d;l={};if(j&&typeof j===r)for(var p in j)l[p]=j[p];if(h&&typeof h===r)for(var q in h)l.flashvars=typeof l.flashvars!=i?l.flashvars+("&"+q+"="+h[q]):q+"="+h[q];if(z(g))p=J(e,l,b),e.id==
+b&&t(b,!0),n.success=!0,n.ref=p;else{if(o&&F()){e.data=o;G(e,l,b,m);return}t(b,!0)}m&&m(n)})):m&&m(n)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:z,createSWF:function(a,b,c){if(e.w3)return J(a,b,c)},showExpressInstall:function(a,b,c,d){e.w3&&F()&&G(a,b,c,d)},removeSWF:function(a){e.w3&&P(a)},createCSS:function(a,b,c,d){e.w3&&Q(a,b,c,d)},addDomLoadEvent:L,addLoadEvent:M,getQueryParamValue:function(a){var b=
+d.location.search||d.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(null==a)return S(b);for(var b=b.split("&"),c=0;c<b.length;c++)if(b[c].substring(0,b[c].indexOf("="))==a)return S(b[c].substring(b[c].indexOf("=")+1))}return""},expressInstallCallback:function(){if(A){var a=n(O);a&&w&&(a.parentNode.replaceChild(w,a),B&&(t(B,!0),e.ie&&e.win&&(w.style.display="block")),H&&H(N));A=!1}}}}(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputforflash.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputforflash.html
new file mode 100644
index 000000000..987700f09
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputforflash.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Output for Flash &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <script src="assets/outputforflash/swfobject.js"></script>
+ <link href="../../../samples/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Output for Flash">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring CKEditor to produce HTML code that can be used with Adobe Flash.">
+ <style>
+
+ .alert
+ {
+ background: #ffa84c;
+ padding: 10px 15px;
+ font-weight: bold;
+ display: block;
+ margin-bottom: 20px;
+ }
+
+ </style>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output
+ HTML code that can be used with
+ <a class="samples" href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html">
+ Adobe Flash</a>.
+ The code will contain a subset of standard HTML elements like <code>&lt;b&gt;</code>,
+ <code>&lt;i&gt;</code>, and <code>&lt;p&gt;</code> as well as HTML attributes.
+ </p>
+ <p>
+ To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard
+ JavaScript call, and define CKEditor features to use HTML elements and attributes.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <p>
+ To see how it works, create some content in the editing area of CKEditor on the left
+ and send it to the Flash object on the right side of the page by using the
+ <strong>Send to Flash</strong> button.
+ </p>
+ <table style="width: 100%; border-spacing: 0; border-collapse:collapse;">
+ <tr>
+ <td style="width: 100%">
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;&lt;b&gt;&lt;font size=&quot;18&quot; style=&quot;font-size:18px;&quot;&gt;Flash and HTML&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It is possible to have &lt;a href=&quot;http://ckeditor.com&quot;&gt;CKEditor&lt;/a&gt; creating content that will be later loaded inside &lt;b&gt;Flash&lt;/b&gt; objects and animations.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash has a few limitations when dealing with HTML:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has limited support on tags.&lt;/li&gt;&lt;li&gt;There is no margin between block elements, like paragraphs.&lt;/li&gt;&lt;/ul&gt;</textarea>
+ <script>
+
+ if ( document.location.protocol == 'file:' )
+ alert( 'Warning: This samples does not work when loaded from local filesystem' +
+ 'due to security restrictions implemented in Flash.' +
+ '\n\nPlease load the sample from a web server instead.' );
+
+ var editor = CKEDITOR.replace( 'editor1', {
+ /*
+ * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+ */
+ extraPlugins: 'htmlwriter',
+
+ height: 290,
+ width: '100%',
+ toolbar: [
+ [ 'Source', '-', 'Bold', 'Italic', 'Underline', '-', 'BulletedList', '-', 'Link', 'Unlink' ],
+ [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ],
+ '/',
+ [ 'Font', 'FontSize' ],
+ [ 'TextColor', '-', 'About' ]
+ ],
+
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',
+
+ /*
+ * Quirks doctype
+ */
+ docType: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: { element: 'b' },
+ coreStyles_italic: { element: 'i' },
+ coreStyles_underline: { element: 'u' },
+
+ /*
+ * Font face.
+ */
+
+ // Define the way font elements will be applied to the document. The "font"
+ // element will be used.
+ font_style: {
+ element: 'font',
+ attributes: { 'face': '#(family)' }
+ },
+
+ /*
+ * Font sizes.
+ */
+
+ // The CSS part of the font sizes isn't used by Flash, it is there to get the
+ // font rendered correctly in CKEditor.
+ fontSize_sizes: '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',
+ fontSize_style: {
+ element: 'font',
+ attributes: { 'size': '#(size)' },
+ styles: { 'font-size': '#(size)px' }
+ } ,
+
+ /*
+ * Font colors.
+ */
+ colorButton_enableMore: true,
+
+ colorButton_foreStyle: {
+ element: 'font',
+ attributes: { 'color': '#(color)' }
+ },
+
+ colorButton_backStyle: {
+ element: 'font',
+ styles: { 'background-color': '#(color)' }
+ },
+
+ on: { 'instanceReady': configureFlashOutput }
+ });
+
+ /*
+ * Adjust the behavior of the dataProcessor to match the
+ * requirements of Flash
+ */
+ function configureFlashOutput( ev ) {
+ var editor = ev.editor,
+ dataProcessor = editor.dataProcessor,
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+ // Out self closing tags the HTML4 way, like <br>.
+ dataProcessor.writer.selfClosingEnd = '>';
+
+ // Make output formatting match Flash expectations
+ var dtd = CKEDITOR.dtd;
+ for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
+ dataProcessor.writer.setRules( e, {
+ indent: false,
+ breakBeforeOpen: false,
+ breakAfterOpen: false,
+ breakBeforeClose: false,
+ breakAfterClose: false
+ });
+ }
+ dataProcessor.writer.setRules( 'br', {
+ indent: false,
+ breakBeforeOpen: false,
+ breakAfterOpen: false,
+ breakBeforeClose: false,
+ breakAfterClose: false
+ });
+
+ // Output properties as attributes, not styles.
+ htmlFilter.addRules( {
+ elements: {
+ $: function( element ) {
+ var style, match, width, height, align;
+
+ // Output dimensions of images as width and height
+ if ( element.name == 'img' ) {
+ style = element.attributes.style;
+
+ if ( style ) {
+ // Get the width from the style.
+ match = ( /(?:^|\s)width\s*:\s*(\d+)px/i ).exec( style );
+ width = match && match[1];
+
+ // Get the height from the style.
+ match = ( /(?:^|\s)height\s*:\s*(\d+)px/i ).exec( style );
+ height = match && match[1];
+
+ if ( width ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)width\s*:\s*(\d+)px;?/i , '' );
+ element.attributes.width = width;
+ }
+
+ if ( height ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)height\s*:\s*(\d+)px;?/i , '' );
+ element.attributes.height = height;
+ }
+ }
+ }
+
+ // Output alignment of paragraphs using align
+ if ( element.name == 'p' ) {
+ style = element.attributes.style;
+
+ if ( style ) {
+ // Get the align from the style.
+ match = ( /(?:^|\s)text-align\s*:\s*(\w*);?/i ).exec( style );
+ align = match && match[1];
+
+ if ( align ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)text-align\s*:\s*(\w*);?/i , '' );
+ element.attributes.align = align;
+ }
+ }
+ }
+
+ if ( element.attributes.style === '' )
+ delete element.attributes.style;
+
+ return element;
+ }
+ }
+ });
+ }
+
+ function sendToFlash() {
+ var html = CKEDITOR.instances.editor1.getData() ;
+
+ // Quick fix for link color.
+ html = html.replace( /<a /g, '<font color="#0000FF"><u><a ' )
+ html = html.replace( /<\/a>/g, '</a></u></font>' )
+
+ var flash = document.getElementById( 'ckFlashContainer' ) ;
+ flash.setData( html ) ;
+ }
+
+ CKEDITOR.domReady( function() {
+ if ( !swfobject.hasFlashPlayerVersion( '8' ) ) {
+ CKEDITOR.dom.element.createFromHtml( '<span class="alert">' +
+ 'At least Adobe Flash Player 8 is required to run this sample. ' +
+ 'You can download it from <a href="http://get.adobe.com/flashplayer">Adobe\'s website</a>.' +
+ '</span>' ).insertBefore( editor.element );
+ }
+
+ swfobject.embedSWF(
+ 'assets/outputforflash/outputforflash.swf',
+ 'ckFlashContainer',
+ '550',
+ '400',
+ '8',
+ { wmode: 'transparent' }
+ );
+ });
+
+ </script>
+ <p>
+ <input type="button" value="Send to Flash" onclick="sendToFlash();">
+ </p>
+ </td>
+ <td style="vertical-align: top; padding-left: 20px">
+ <div id="ckFlashContainer"></div>
+ </td>
+ </tr>
+ </table>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputhtml.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputhtml.html
new file mode 100644
index 000000000..1dddd0d8b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/htmlwriter/outputhtml.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>HTML Compliant Output &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <link href="../../../samples/sample.css" rel="stylesheet">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Output HTML">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring CKEditor to produce legacy HTML 4 code.">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Producing HTML Compliant Output
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output valid
+ <a class="samples" href="http://www.w3.org/TR/html401/">HTML 4.01</a> code.
+ Traditional HTML elements like <code>&lt;b&gt;</code>,
+ <code>&lt;i&gt;</code>, and <code>&lt;font&gt;</code> are used in place of
+ <code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, and CSS styles.
+ </p>
+ <p>
+ To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard
+ JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.
+ </p>
+ <p>
+ A snippet of the configuration code can be seen below; check the source of this page for
+ full definition:
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ coreStyles_bold: { element: 'b' },
+ coreStyles_italic: { element: 'i' },
+
+ fontSize_style: {
+ element: 'font',
+ attributes: { 'size': '#(size)' }
+ }
+
+ ...
+});</pre>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace( 'editor1', {
+ /*
+ * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+ */
+ extraPlugins: 'htmlwriter',
+
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'body {color:#000; background-color#:FFF;}',
+
+ /*
+ * Simple HTML5 doctype
+ */
+ docType: '<!DOCTYPE HTML>',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: { element: 'b' },
+ coreStyles_italic: { element: 'i' },
+ coreStyles_underline: { element: 'u' },
+ coreStyles_strike: { element: 'strike' },
+
+ /*
+ * Font face.
+ */
+
+ // Define the way font elements will be applied to the document.
+ // The "font" element will be used.
+ font_style: {
+ element: 'font',
+ attributes: { 'face': '#(family)' }
+ },
+
+ /*
+ * Font sizes.
+ */
+ fontSize_sizes: 'xx-small/1;x-small/2;small/3;medium/4;large/5;x-large/6;xx-large/7',
+ fontSize_style: {
+ element: 'font',
+ attributes: { 'size': '#(size)' }
+ } ,
+
+ /*
+ * Font colors.
+ */
+ colorButton_enableMore: true,
+
+ colorButton_foreStyle: {
+ element: 'font',
+ attributes: { 'color': '#(color)' }
+ },
+
+ colorButton_backStyle: {
+ element: 'font',
+ styles: { 'background-color': '#(color)' }
+ },
+
+ /*
+ * Styles combo.
+ */
+ stylesSet: [
+ { name: 'Computer Code', element: 'code' },
+ { name: 'Keyboard Phrase', element: 'kbd' },
+ { name: 'Sample Text', element: 'samp' },
+ { name: 'Variable', element: 'var' },
+ { name: 'Deleted Text', element: 'del' },
+ { name: 'Inserted Text', element: 'ins' },
+ { name: 'Cited Work', element: 'cite' },
+ { name: 'Inline Quotation', element: 'q' }
+ ],
+
+ on: { 'instanceReady': configureHtmlOutput }
+ });
+
+ /*
+ * Adjust the behavior of the dataProcessor to avoid styles
+ * and make it look like FCKeditor HTML output.
+ */
+ function configureHtmlOutput( ev ) {
+ var editor = ev.editor,
+ dataProcessor = editor.dataProcessor,
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+ // Out self closing tags the HTML4 way, like <br>.
+ dataProcessor.writer.selfClosingEnd = '>';
+
+ // Make output formatting behave similar to FCKeditor
+ var dtd = CKEDITOR.dtd;
+ for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
+ dataProcessor.writer.setRules( e, {
+ indent: true,
+ breakBeforeOpen: true,
+ breakAfterOpen: false,
+ breakBeforeClose: !dtd[ e ][ '#' ],
+ breakAfterClose: true
+ });
+ }
+
+ // Output properties as attributes, not styles.
+ htmlFilter.addRules( {
+ elements: {
+ $: function( element ) {
+ // Output dimensions of images as width and height
+ if ( element.name == 'img' ) {
+ var style = element.attributes.style;
+
+ if ( style ) {
+ // Get the width from the style.
+ var match = ( /(?:^|\s)width\s*:\s*(\d+)px/i ).exec( style ),
+ width = match && match[ 1 ];
+
+ // Get the height from the style.
+ match = ( /(?:^|\s)height\s*:\s*(\d+)px/i ).exec( style );
+ var height = match && match[ 1 ];
+
+ if ( width ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)width\s*:\s*(\d+)px;?/i , '' );
+ element.attributes.width = width;
+ }
+
+ if ( height ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)height\s*:\s*(\d+)px;?/i , '' );
+ element.attributes.height = height;
+ }
+ }
+ }
+
+ // Output alignment of paragraphs using align
+ if ( element.name == 'p' ) {
+ style = element.attributes.style;
+
+ if ( style ) {
+ // Get the align from the style.
+ match = ( /(?:^|\s)text-align\s*:\s*(\w*);/i ).exec( style );
+ var align = match && match[ 1 ];
+
+ if ( align ) {
+ element.attributes.style = element.attributes.style.replace( /(?:^|\s)text-align\s*:\s*(\w*);?/i , '' );
+ element.attributes.align = align;
+ }
+ }
+ }
+
+ if ( !element.attributes.style )
+ delete element.attributes.style;
+
+ return element;
+ }
+ },
+
+ attributes: {
+ style: function( value, element ) {
+ // Return #RGB for background and border colors
+ return CKEDITOR.tools.convertRgbToHex( value );
+ }
+ }
+ });
+ }
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/magicline/magicline.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/magicline/magicline.html
new file mode 100644
index 000000000..77e90931a
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/magicline/magicline.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Using Magicline plugin &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <link rel="stylesheet" href="../../../samples/sample.css">
+ <meta name="ckeditor-sample-name" content="Magicline plugin">
+ <meta name="ckeditor-sample-group" content="Plugins">
+ <meta name="ckeditor-sample-description" content="Using the Magicline plugin to access difficult focus spaces.">
+ <meta name="ckeditor-sample-isnew" content="1">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Using Magicline plugin
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows the advantages of <strong>Magicline</strong> plugin
+ which is to enhance the editing process. Thanks to this plugin,
+ a number of difficult focus spaces which are inaccessible due to
+ browser issues can now be focused.
+ </p>
+ <p>
+ <strong>Magicline</strong> plugin shows a red line with a handler
+ which, when clicked, inserts a paragraph and allows typing. To see this,
+ focus an editor and move your mouse above the focus space you want
+ to access. The plugin is enabled by default so no additional
+ configuration is necessary.
+ </p>
+ </div>
+ <div>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <div class="description">
+ <p>
+ This editor uses a default <strong>Magicline</strong> setup.
+ </p>
+ </div>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table&lt;/td&gt;
+ &lt;td&gt;is the&lt;/td&gt;
+ &lt;td&gt;very first&lt;/td&gt;
+ &lt;td&gt;element of the document.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We are still&lt;/td&gt;
+ &lt;td&gt;able to acces&lt;/td&gt;
+ &lt;td&gt;the space before it.&lt;/td&gt;
+ &lt;td&gt;
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+ &lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+
+ &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+ &lt;hr /&gt;
+ &lt;hr /&gt;
+ &lt;ol&gt;
+ &lt;li&gt;This numbered list...&lt;/li&gt;
+ &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+ &lt;li&gt;...and another list.&lt;/li&gt;
+ &lt;/ol&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;We can type between the lists...&lt;/li&gt;
+ &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+ &lt;/ul&gt;
+
+ &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+ &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+ &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+ &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+ &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+ &lt;/div&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ CKEDITOR.replace( 'editor1', {
+ extraPlugins: 'magicline' // Ensure that magicline plugin, which is required for this sample, is loaded.
+ } );
+
+ </script>
+ </div>
+ <br>
+ <div>
+ <label for="editor2">
+ Editor 2:
+ </label>
+ <div class="description">
+ <p>
+ This editor is using a blue line.
+ </p>
+<pre class="samples">
+CKEDITOR.replace( 'editor2', {
+ magicline_color: 'blue'
+});</pre>
+ </div>
+ <textarea cols="80" id="editor2" name="editor2" rows="10">
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table&lt;/td&gt;
+ &lt;td&gt;is the&lt;/td&gt;
+ &lt;td&gt;very first&lt;/td&gt;
+ &lt;td&gt;element of the document.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We are still&lt;/td&gt;
+ &lt;td&gt;able to acces&lt;/td&gt;
+ &lt;td&gt;the space before it.&lt;/td&gt;
+ &lt;td&gt;
+ &lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+ &lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+ &lt;/table&gt;
+
+ &lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+ &lt;hr /&gt;
+ &lt;hr /&gt;
+ &lt;ol&gt;
+ &lt;li&gt;This numbered list...&lt;/li&gt;
+ &lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+ &lt;li&gt;...and another list.&lt;/li&gt;
+ &lt;/ol&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;We can type between the lists...&lt;/li&gt;
+ &lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+ &lt;/ul&gt;
+
+ &lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+ &lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+ &lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+ &lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+ &lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+ &lt;/div&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ CKEDITOR.replace( 'editor2', {
+ extraPlugins: 'magicline', // Ensure that magicline plugin, which is required for this sample, is loaded.
+ magicline_color: 'blue' // Blue line
+ });
+
+ </script>
+ </div>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/toolbar/toolbar.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/toolbar/toolbar.html
new file mode 100644
index 000000000..6f0b044e5
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/toolbar/toolbar.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Toolbar Configuration &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <meta name="ckeditor-sample-name" content="Toolbar Configurations">
+ <meta name="ckeditor-sample-group" content="Advanced Samples">
+ <meta name="ckeditor-sample-description" content="Configuring CKEditor to display full or custom toolbar layout.">
+ <meta name="ckeditor-sample-isnew" content="1">
+ <script src="../../../ckeditor.js"></script>
+ <link href="../../../samples/sample.css" rel="stylesheet">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Toolbar Configuration
+ </h1>
+ <div class="description">
+ <p>
+ This sample page demonstrates editor with loaded <a href="#fullToolbar">full toolbar</a> (all registered buttons) and, if
+ current editor's configuration modifies default settings, also editor with <a href="#currentToolbar">modified toolbar</a>.
+ </p>
+
+ <p>Since CKEditor 4 there are two ways to configure toolbar buttons.</p>
+
+ <h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbar">config.toolbar</a></h2>
+
+ <p>
+ You can explicitly define which buttons are displayed in which groups and in which order.
+ This is the more precise setting, but less flexible. If newly added plugin adds its
+ own button you'll have to add it manually to your <code>config.toolbar</code> setting as well.
+ </p>
+
+ <p>To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:</p>
+
+ <pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+ <strong>toolbar:</strong> [
+ { name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] }, // Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
+ [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ], // Defines toolbar group without name.
+ '/', // Line break - next group will be placed in new line.
+ { name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
+ ]
+});</pre>
+
+ <h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbarGroups">config.toolbarGroups</a></h2>
+
+ <p>
+ You can define which groups of buttons (like e.g. <code>basicstyles</code>, <code>clipboard</code>
+ and <code>forms</code>) are displayed and in which order. Registered buttons are associated
+ with toolbar groups by <code>toolbar</code> property in their definition.
+ This setting's advantage is that you don't have to modify toolbar configuration
+ when adding/removing plugins which register their own buttons.
+ </p>
+
+ <p>To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:</p>
+
+ <pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+ <strong>toolbarGroups:</strong> [
+ { name: 'document', groups: [ 'mode', 'document' ] }, // Displays document group with its two subgroups.
+ { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, // Group's name will be used to create voice label.
+ '/', // Line break - next group will be placed in new line.
+ { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ { name: 'links' }
+ ]
+
+ // NOTE: Remember to leave 'toolbar' property with the default value (null).
+});</pre>
+ </div>
+
+ <div id="currentToolbar" style="display: none">
+ <h2 class="samples">Current toolbar configuration</h2>
+ <p>Below you can see editor with current toolbar definition.</p>
+ <textarea cols="80" id="editorCurrent" name="editorCurrent" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <pre id="editorCurrentCfg" class="samples"></pre>
+ </div>
+
+ <div id="fullToolbar">
+ <h2 class="samples">Full toolbar configuration</h2>
+ <p>Below you can see editor with full toolbar, generated automatically by the editor.</p>
+ <p>
+ <strong>Note</strong>: To create editor instance with full toolbar you don't have to set anything.
+ Just leave <code>toolbar</code> and <code>toolbarGroups</code> with the default, <code>null</code> values.
+ </p>
+ <textarea cols="80" id="editorFull" name="editorFull" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <pre id="editorFullCfg" class="samples"></pre>
+ </div>
+
+ <script>
+
+(function() {
+ 'use strict';
+
+ CKEDITOR.config.extraPlugins = 'toolbar';
+
+ CKEDITOR.on( 'instanceReady', function( evt ) {
+ var editor = evt.editor,
+ editorCurrent = editor.name == 'editorCurrent',
+ defaultToolbar = !( editor.config.toolbar || editor.config.toolbarGroups ),
+ pre = CKEDITOR.document.getById( editor.name + 'Cfg' ),
+ output = '';
+
+ if ( editorCurrent ) {
+ // If default toolbar configuration has been modified, show "current toolbar" section.
+ if ( !defaultToolbar )
+ CKEDITOR.document.getById( 'currentToolbar' ).show();
+ else
+ return;
+ }
+
+ // Toolbar isn't set explicitly, so it was created automatically from toolbarGroups.
+ if ( !editor.config.toolbar ) {
+ output +=
+ '// Toolbar configuration generated automatically by the editor based on config.toolbarGroups.\n' +
+ dumpToolbarConfiguration( editor ) +
+ '\n\n' +
+ '// Toolbar groups configuration.\n' +
+ dumpToolbarConfiguration( editor, true )
+ }
+ // Toolbar groups doesn't count in this case - print only toolbar.
+ else {
+ output += '// Toolbar configuration.\n' +
+ dumpToolbarConfiguration( editor );
+ }
+
+ // Recreate to avoid old IE from loosing whitespaces on filling <pre> content.
+ var preOutput = pre.getOuterHtml().replace( /(?=<\/)/, output );
+ CKEDITOR.dom.element.createFromHtml( preOutput ).replace( pre );
+ } );
+
+
+ CKEDITOR.replace( 'editorCurrent', { height: 100 } );
+ CKEDITOR.replace( 'editorFull', {
+ // Reset toolbar settings, so full toolbar will be generated automatically.
+ toolbar: null,
+ toolbarGroups: null,
+ height: 100
+ } );
+
+ function dumpToolbarConfiguration( editor, printGroups ) {
+ var output = [],
+ toolbar = editor.toolbar;
+
+ for ( var i = 0; i < toolbar.length; ++i ) {
+ var group = dumpToolbarGroup( toolbar[ i ], printGroups );
+ if ( group )
+ output.push( group );
+ }
+
+ return 'config.toolbar' + ( printGroups ? 'Groups' : '' ) + ' = [\n\t' + output.join( ',\n\t' ) + '\n];';
+ }
+
+ function dumpToolbarGroup( group, printGroups ) {
+ var output = [];
+
+ if ( typeof group == 'string' )
+ return '\'' + group + '\'';
+ if ( CKEDITOR.tools.isArray( group ) )
+ return dumpToolbarItems( group );
+ // Skip group when printing entire toolbar configuration and there are no items in this group.
+ if ( !printGroups && !group.items )
+ return;
+
+ if ( group.name )
+ output.push( 'name: \'' + group.name + '\'' );
+
+ if ( group.groups )
+ output.push( 'groups: ' + dumpToolbarItems( group.groups ) );
+
+ if ( !printGroups )
+ output.push( 'items: ' + dumpToolbarItems( group.items ) );
+
+ return '{ ' + output.join( ', ' ) + ' }';
+ }
+
+ function dumpToolbarItems( items ) {
+ if ( typeof items == 'string' )
+ return '\'' + items + '\'';
+ return '[ \'' + items.join( '\', \'' ) + '\' ]';
+ }
+
+})();
+ </script>
+
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/plugins/wysiwygarea/fullpage.html b/mod/ckeditor/vendors/ckeditor/samples/plugins/wysiwygarea/fullpage.html
new file mode 100644
index 000000000..c0da0e9f4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/plugins/wysiwygarea/fullpage.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Full Page Editing &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <link rel="stylesheet" href="../../../samples/sample.css">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <meta name="ckeditor-sample-name" content="Full page support">
+ <meta name="ckeditor-sample-group" content="Plugins">
+ <meta name="ckeditor-sample-description" content="CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Full Page Editing
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to edit entire HTML pages, from the
+ <code>&lt;html&gt;</code> tag to the <code>&lt;/html&gt;</code> tag.
+ </p>
+ <p>
+ The CKEditor instance below is inserted with a JavaScript call using the following code:
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>fullPage: true</strong>
+});
+</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ </div>
+ <form action="../../../samples/sample_posteddata.php" method="post">
+ <label for="editor1">
+ CKEditor output the entire page including content outside of
+ <code>&lt;body&gt;</code> element, so content like meta and title can be changed:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; align=&quot;right&quot; src=&quot;../../../samples/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;strike&gt;three and a half&lt;/strike&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ CKEDITOR.replace( 'editor1', {
+ fullPage: true,
+ extraPlugins: 'wysiwygarea'
+ });
+
+ </script>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/readonly.html b/mod/ckeditor/vendors/ckeditor/samples/readonly.html
new file mode 100644
index 000000000..5fbb60bbf
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/readonly.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Using the CKEditor Read-Only API &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+ <script>
+
+ var editor;
+
+ // The instanceReady event is fired, when an instance of CKEditor has finished
+ // its initialization.
+ CKEDITOR.on( 'instanceReady', function( ev ) {
+ editor = ev.editor;
+
+ // Show this "on" button.
+ document.getElementById( 'readOnlyOn' ).style.display = '';
+
+ // Event fired when the readOnly property changes.
+ editor.on( 'readOnly', function() {
+ document.getElementById( 'readOnlyOn' ).style.display = this.readOnly ? 'none' : '';
+ document.getElementById( 'readOnlyOff' ).style.display = this.readOnly ? '' : 'none';
+ });
+ });
+
+ function toggleReadOnly( isReadOnly ) {
+ // Change the read-only state of the editor.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly
+ editor.setReadOnly( isReadOnly );
+ }
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Using the CKEditor Read-Only API
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly">setReadOnly</a></code>
+ API to put editor into the read-only state that makes it impossible for users to change the editor contents.
+ </p>
+ <p>
+ For details on how to create this setup check the source code of this sample page.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <textarea class="ckeditor" id="editor1" name="editor1" cols="100" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ </p>
+ <p>
+ <input id="readOnlyOn" onclick="toggleReadOnly();" type="button" value="Make it read-only" style="display:none">
+ <input id="readOnlyOff" onclick="toggleReadOnly( false );" type="button" value="Make it editable again" style="display:none">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/replacebyclass.html b/mod/ckeditor/vendors/ckeditor/samples/replacebyclass.html
new file mode 100644
index 000000000..64b916af0
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/replacebyclass.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Replace Textareas by Class Name &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements by Class Name
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace all <code>&lt;textarea&gt;</code> elements
+ of a given class with a CKEditor instance.
+ </p>
+ <p>
+ To replace a <code>&lt;textarea&gt;</code> element, simply assign it the <code>ckeditor</code>
+ class, as in the code below:
+ </p>
+<pre class="samples">
+&lt;textarea <strong>class="ckeditor</strong>" name="editor1"&gt;&lt;/textarea&gt;
+</pre>
+ <p>
+ Note that other <code>&lt;textarea&gt;</code> attributes (like <code>id</code> or <code>name</code>) need to be adjusted to your document.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea class="ckeditor" cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;strike&gt;three and a half&lt;/strike&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/replacebycode.html b/mod/ckeditor/vendors/ckeditor/samples/replacebycode.html
new file mode 100644
index 000000000..d21ef9287
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/replacebycode.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>Replace Textarea by Code &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements Using JavaScript Code
+ </h1>
+ <form action="sample_posteddata.php" method="post">
+ <div class="description">
+ <p>
+ This editor is using an <code>&lt;iframe&gt;</code> element-based editing area, provided by the <strong>Wysiwygarea</strong> plugin.
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>' )
+</pre>
+ </div>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">
+ &lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;strike&gt;three and a half&lt;/strike&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+ </textarea>
+ <script>
+
+ // This call can be placed at any point after the
+ // <textarea>, or inside a <head><script> in a
+ // window.onload event handler.
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+
+ CKEDITOR.replace( 'editor1' );
+
+ </script>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/sample.css b/mod/ckeditor/vendors/ckeditor/samples/sample.css
new file mode 100644
index 000000000..6dad96e21
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/sample.css
@@ -0,0 +1,333 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+html, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre
+{
+ line-height: 1.5em;
+}
+
+body
+{
+ padding: 10px 30px;
+}
+
+input, textarea, select, option, optgroup, button, td, th
+{
+ font-size: 100%;
+}
+
+pre, code, kbd, samp, tt
+{
+ font-family: monospace,monospace;
+ font-size: 1em;
+}
+
+body {
+ width: 960px;
+ margin: 0 auto;
+}
+
+code
+{
+ background: #f3f3f3;
+ border: 1px solid #ddd;
+ padding: 1px 4px;
+
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.new
+{
+ background: #FF7E00;
+ border: 1px solid #DA8028;
+ color: #fff;
+ font-size: 10px;
+ font-weight: bold;
+ padding: 1px 4px;
+ text-shadow: 0 1px 0 #C97626;
+ text-transform: uppercase;
+ margin: 0 0 0 3px;
+
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+
+ -moz-box-shadow: 0 2px 3px 0 #FFA54E inset;
+ -webkit-box-shadow: 0 2px 3px 0 #FFA54E inset;
+ box-shadow: 0 2px 3px 0 #FFA54E inset;
+}
+
+h1.samples
+{
+ color: #0782C1;
+ font-size: 200%;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+h1.samples a
+{
+ color: #0782C1;
+ text-decoration: none;
+ border-bottom: 1px dotted #0782C1;
+}
+
+.samples a:hover
+{
+ border-bottom: 1px dotted #0782C1;
+}
+
+h2.samples
+{
+ color: #000000;
+ font-size: 130%;
+ margin: 15px 0 0 0;
+ padding: 0;
+}
+
+p, blockquote, address, form, pre, dl, h1.samples, h2.samples
+{
+ margin-bottom: 15px;
+}
+
+ul.samples
+{
+ margin-bottom: 15px;
+}
+
+.clear
+{
+ clear: both;
+}
+
+fieldset
+{
+ margin: 0;
+ padding: 10px;
+}
+
+body, input, textarea
+{
+ color: #333333;
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+body
+{
+ font-size: 75%;
+}
+
+a.samples
+{
+ color: #189DE1;
+ text-decoration: none;
+}
+
+form
+{
+ margin: 0;
+ padding: 0;
+}
+
+pre.samples
+{
+ background-color: #F7F7F7;
+ border: 1px solid #D7D7D7;
+ overflow: auto;
+ padding: 0.25em;
+ white-space: pre-wrap; /* CSS 2.1 */
+ word-wrap: break-word; /* IE7 */
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ -webkit-tab-size: 4;
+ tab-size: 4;
+}
+
+#footer
+{
+ clear: both;
+ padding-top: 10px;
+}
+
+#footer hr
+{
+ margin: 10px 0 15px 0;
+ height: 1px;
+ border: solid 1px gray;
+ border-bottom: none;
+}
+
+#footer p
+{
+ margin: 0 10px 10px 10px;
+ float: left;
+}
+
+#footer #copy
+{
+ float: right;
+}
+
+#outputSample
+{
+ width: 100%;
+ table-layout: fixed;
+}
+
+#outputSample thead th
+{
+ color: #dddddd;
+ background-color: #999999;
+ padding: 4px;
+ white-space: nowrap;
+}
+
+#outputSample tbody th
+{
+ vertical-align: top;
+ text-align: left;
+}
+
+#outputSample pre
+{
+ margin: 0;
+ padding: 0;
+}
+
+.description
+{
+ border: 1px dotted #B7B7B7;
+ margin-bottom: 10px;
+ padding: 10px 10px 0;
+ overflow: hidden;
+}
+
+label
+{
+ display: block;
+ margin-bottom: 6px;
+}
+
+/**
+ * CKEditor editables are automatically set with the "cke_editable" class
+ * plus cke_editable_(inline|themed) depending on the editor type.
+ */
+
+/* Style a bit the inline editables. */
+.cke_editable.cke_editable_inline
+{
+ cursor: pointer;
+}
+
+/* Once an editable element gets focused, the "cke_focus" class is
+ added to it, so we can style it differently. */
+.cke_editable.cke_editable_inline.cke_focus
+{
+ box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000;
+ outline: none;
+ background: #eee;
+ cursor: text;
+}
+
+/* Avoid pre-formatted overflows inline editable. */
+.cke_editable_inline pre
+{
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+/**
+ * Samples index styles.
+ */
+
+.twoColumns,
+.twoColumnsLeft,
+.twoColumnsRight
+{
+ overflow: hidden;
+}
+
+.twoColumnsLeft,
+.twoColumnsRight
+{
+ width: 45%;
+}
+
+.twoColumnsLeft
+{
+ float: left;
+}
+
+.twoColumnsRight
+{
+ float: right;
+}
+
+dl.samples
+{
+ padding: 0 0 0 40px;
+}
+dl.samples > dt
+{
+ display: list-item;
+ list-style-type: disc;
+ list-style-position: outside;
+ margin: 0 0 3px;
+}
+dl.samples > dd
+{
+ margin: 0 0 3px;
+}
+.warning
+{
+ color: #ff0000;
+ background-color: #FFCCBA;
+ border: 2px dotted #ff0000;
+ padding: 15px 10px;
+ margin: 10px 0;
+}
+
+/* Used on inline samples */
+
+blockquote
+{
+ font-style: italic;
+ font-family: Georgia, Times, "Times New Roman", serif;
+ padding: 2px 0;
+ border-style: solid;
+ border-color: #ccc;
+ border-width: 0;
+}
+
+.cke_contents_ltr blockquote
+{
+ padding-left: 20px;
+ padding-right: 8px;
+ border-left-width: 5px;
+}
+
+.cke_contents_rtl blockquote
+{
+ padding-left: 8px;
+ padding-right: 20px;
+ border-right-width: 5px;
+}
+
+img.right {
+ border: 1px solid #ccc;
+ float: right;
+ margin-left: 15px;
+ padding: 5px;
+}
+
+img.left {
+ border: 1px solid #ccc;
+ float: left;
+ margin-right: 15px;
+ padding: 5px;
+}
diff --git a/mod/ckeditor/vendors/ckeditor/samples/sample.js b/mod/ckeditor/vendors/ckeditor/samples/sample.js
new file mode 100644
index 000000000..621de3259
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/sample.js
@@ -0,0 +1,5 @@
+/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){CKEDITOR.on("instanceReady",function(b){var b=b.editor,a=CKEDITOR.document.$.getElementsByName("ckeditor-sample-required-plugins"),a=a.length?CKEDITOR.dom.element.get(a[0]).getAttribute("content").split(","):[],c=[];if(a.length){for(var d=0;d<a.length;d++)b.plugins[a[d]]||c.push("<code>"+a[d]+"</code>");c.length&&CKEDITOR.dom.element.createFromHtml('<div class="warning"><span>To fully experience this demo, the '+c.join(", ")+" plugin"+(1<c.length?"s are":" is")+" required.</span></div>").insertBefore(b.container)}})})(); \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/samples/sample_posteddata.php b/mod/ckeditor/vendors/ckeditor/samples/sample_posteddata.php
new file mode 100644
index 000000000..59de8bef3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/sample_posteddata.php
@@ -0,0 +1,16 @@
+<?php /* <body><pre>
+
+-------------------------------------------------------------------------------------------
+ CKEditor - Posted Data
+
+ We are sorry, but your Web server does not support the PHP language used in this script.
+
+ Please note that CKEditor can be used with any other server-side language than just PHP.
+ To save the content created with CKEditor you need to read the POST data on the server
+ side and write it to a file or the database.
+
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or <a href="http://ckeditor.com/license">http://ckeditor.com/license</a>
+-------------------------------------------------------------------------------------------
+
+</pre><div style="display:none"></body> */ include "assets/posteddata.php"; ?>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/tabindex.html b/mod/ckeditor/vendors/ckeditor/samples/tabindex.html
new file mode 100644
index 000000000..24e7d6fb4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/tabindex.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>TAB Key-Based Navigation &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link href="sample.css" rel="stylesheet">
+ <style>
+
+ .cke_focused,
+ .cke_editable.cke_focused
+ {
+ outline: 3px dotted blue !important;
+ *border: 3px dotted blue !important; /* For IE7 */
+ }
+
+ </style>
+ <script>
+
+ CKEDITOR.on( 'instanceReady', function( evt ) {
+ var editor = evt.editor;
+ editor.setData( 'This editor has it\'s tabIndex set to <strong>' + editor.tabIndex + '</strong>' );
+
+ // Apply focus class name.
+ editor.on( 'focus', function() {
+ editor.container.addClass( 'cke_focused' );
+ });
+ editor.on( 'blur', function() {
+ editor.container.removeClass( 'cke_focused' );
+ });
+
+ // Put startup focus on the first editor in tab order.
+ if ( editor.tabIndex == 1 )
+ editor.focus();
+ });
+
+ </script>
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; TAB Key-Based Navigation
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how tab key navigation among editor instances is
+ affected by the <code>tabIndex</code> attribute from
+ the original page element. Use TAB key to move between the editors.
+ </p>
+ </div>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor4" rows="10" tabindex="1"></textarea>
+ </p>
+ <div class="ckeditor" contenteditable="true" id="editor1" tabindex="4"></div>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor2" rows="10" tabindex="2"></textarea>
+ </p>
+ <p>
+ <textarea class="ckeditor" cols="80" id="editor3" rows="10" tabindex="3"></textarea>
+ </p>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/uicolor.html b/mod/ckeditor/vendors/ckeditor/samples/uicolor.html
new file mode 100644
index 000000000..0e0d2e6c1
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/uicolor.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>UI Color Picker &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; UI Color
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+ with a CKEditor instance with an option to change the color of its user interface.<br>
+ <strong>Note:</strong>The UI skin color feature depends on the CKEditor skin
+ compatibility. The Moono and Kama skins are examples of skins that work with it.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ This editor instance has a UI color value defined in configuration to change the skin color,
+ To specify the color of the user interface, set the <code>uiColor</code> property:
+ </p>
+ <pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ <strong>uiColor: '#14B8C4'</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ <p>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+ CKEDITOR.replace( 'editor1', {
+ uiColor: '#14B8C4',
+ toolbar: [
+ [ 'Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
+ [ 'FontSize', 'TextColor', 'BGColor' ]
+ ]
+ });
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/uilanguages.html b/mod/ckeditor/vendors/ckeditor/samples/uilanguages.html
new file mode 100644
index 000000000..ea2134c6b
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/uilanguages.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>User Interface Globalization &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <script src="../ckeditor.js"></script>
+ <script src="assets/uilanguages/languages.js"></script>
+ <link rel="stylesheet" href="sample.css">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; User Interface Languages
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+ with a CKEditor instance with an option to change the language of its user interface.
+ </p>
+ <p>
+ It pulls the language list from CKEditor <code>_languages.js</code> file that contains the list of supported languages and creates
+ a drop-down list that lets the user change the UI language.
+ </p>
+ <p>
+ By default, CKEditor automatically localizes the editor to the language of the user.
+ The UI language can be controlled with two configuration options:
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-language">language</a></code> and
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-defaultLanguage">
+ defaultLanguage</a></code>. The <code>defaultLanguage</code> setting specifies the
+ default CKEditor language to be used when a localization suitable for user's settings is not available.
+ </p>
+ <p>
+ To specify the user interface language that will be used no matter what language is
+ specified in user's browser or operating system, set the <code>language</code> property:
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ // Load the German interface.
+ <strong>language: 'de'</strong>
+});</pre>
+ <p>
+ Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+ the <code>&lt;textarea&gt;</code> element to be replaced.
+ </p>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ Available languages (<span id="count"> </span> languages!):<br>
+ <script>
+
+ document.write( '<select disabled="disabled" id="languages" onchange="createEditor( this.value );">' );
+
+ // Get the language list from the _languages.js file.
+ for ( var i = 0 ; i < window.CKEDITOR_LANGS.length ; i++ ) {
+ document.write(
+ '<option value="' + window.CKEDITOR_LANGS[i].code + '">' +
+ window.CKEDITOR_LANGS[i].name +
+ '</option>' );
+ }
+
+ document.write( '</select>' );
+
+ </script>
+ <br>
+ <span style="color: #888888">
+ (You may see strange characters if your system does not support the selected language)
+ </span>
+ </p>
+ <p>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ // Set the number of languages.
+ document.getElementById( 'count' ).innerHTML = window.CKEDITOR_LANGS.length;
+
+ var editor;
+
+ function createEditor( languageCode ) {
+ if ( editor )
+ editor.destroy();
+
+ // Replace the <textarea id="editor"> with an CKEditor
+ // instance, using default configurations.
+ editor = CKEDITOR.replace( 'editor1', {
+ language: languageCode,
+
+ on: {
+ instanceReady: function() {
+ // Wait for the editor to be ready to set
+ // the language combo.
+ var languages = document.getElementById( 'languages' );
+ languages.value = this.langCode;
+ languages.disabled = false;
+ }
+ }
+ });
+ }
+
+ // At page startup, load the default language:
+ createEditor( '' );
+
+ </script>
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/samples/xhtmlstyle.html b/mod/ckeditor/vendors/ckeditor/samples/xhtmlstyle.html
new file mode 100644
index 000000000..974b88c2d
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/samples/xhtmlstyle.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title>XHTML Compliant Output &mdash; CKEditor Sample</title>
+ <meta charset="utf-8">
+ <meta name="ckeditor-sample-required-plugins" content="sourcearea">
+ <script src="../ckeditor.js"></script>
+ <script src="../samples/sample.js"></script>
+ <link href="sample.css" rel="stylesheet">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="index.html">CKEditor Samples</a> &raquo; Producing XHTML Compliant Output
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to configure CKEditor to output valid
+ <a class="samples" href="http://www.w3.org/TR/xhtml11/">XHTML 1.1</a> code.
+ Deprecated elements (<code>&lt;font&gt;</code>, <code>&lt;u&gt;</code>) or attributes
+ (<code>size</code>, <code>face</code>) will be replaced with XHTML compliant code.
+ </p>
+ <p>
+ To add a CKEditor instance outputting valid XHTML code, load the editor using a standard
+ JavaScript call and define CKEditor features to use the XHTML compliant elements and styles.
+ </p>
+ <p>
+ A snippet of the configuration code can be seen below; check the source of this page for
+ full definition:
+ </p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+ contentsCss: 'assets/outputxhtml.css',
+
+ coreStyles_bold: {
+ element: 'span',
+ attributes: { 'class': 'Bold' }
+ },
+ coreStyles_italic: {
+ element: 'span',
+ attributes: { 'class': 'Italic' }
+ },
+
+ ...
+});</pre>
+ </div>
+ <form action="sample_posteddata.php" method="post">
+ <p>
+ <label for="editor1">
+ Editor 1:
+ </label>
+ <textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;span class="Bold"&gt;sample text&lt;/span&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+ <script>
+
+ CKEDITOR.replace( 'editor1', {
+ /*
+ * Style sheet for the contents
+ */
+ contentsCss: 'assets/outputxhtml/outputxhtml.css',
+
+ /*
+ * Core styles.
+ */
+ coreStyles_bold: {
+ element: 'span',
+ attributes: { 'class': 'Bold' }
+ },
+ coreStyles_italic: {
+ element: 'span',
+ attributes: { 'class': 'Italic' }
+ },
+ coreStyles_underline: {
+ element: 'span',
+ attributes: { 'class': 'Underline' }
+ },
+ coreStyles_strike: {
+ element: 'span',
+ attributes: { 'class': 'StrikeThrough' },
+ overrides: 'strike'
+ },
+ coreStyles_subscript: {
+ element: 'span',
+ attributes: { 'class': 'Subscript' },
+ overrides: 'sub'
+ },
+ coreStyles_superscript: {
+ element: 'span',
+ attributes: { 'class': 'Superscript' },
+ overrides: 'sup'
+ },
+
+ /*
+ * Font face.
+ */
+
+ // List of fonts available in the toolbar combo. Each font definition is
+ // separated by a semi-colon (;). We are using class names here, so each font
+ // is defined by {Combo Label}/{Class Name}.
+ font_names: 'Comic Sans MS/FontComic;Courier New/FontCourier;Times New Roman/FontTimes',
+
+ // Define the way font elements will be applied to the document. The "span"
+ // element will be used. When a font is selected, the font name defined in the
+ // above list is passed to this definition with the name "Font", being it
+ // injected in the "class" attribute.
+ // We must also instruct the editor to replace span elements that are used to
+ // set the font (Overrides).
+ font_style: {
+ element: 'span',
+ attributes: { 'class': '#(family)' },
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^Font(?:Comic|Courier|Times)$/
+ }
+ }
+ ]
+ },
+
+ /*
+ * Font sizes.
+ */
+ fontSize_sizes: 'Smaller/FontSmaller;Larger/FontLarger;8pt/FontSmall;14pt/FontBig;Double Size/FontDouble',
+ fontSize_style: {
+ element: 'span',
+ attributes: { 'class': '#(size)' },
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^Font(?:Smaller|Larger|Small|Big|Double)$/
+ }
+ }
+ ]
+ } ,
+
+ /*
+ * Font colors.
+ */
+ colorButton_enableMore: false,
+
+ colorButton_colors: 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00',
+ colorButton_foreStyle: {
+ element: 'span',
+ attributes: { 'class': '#(color)' },
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^FontColor(?:1|2|3)$/
+ }
+ }
+ ]
+ },
+
+ colorButton_backStyle: {
+ element: 'span',
+ attributes: { 'class': '#(color)BG' },
+ overrides: [
+ {
+ element: 'span',
+ attributes: {
+ 'class': /^FontColor(?:1|2|3)BG$/
+ }
+ }
+ ]
+ },
+
+ /*
+ * Indentation.
+ */
+ indentClasses: [ 'Indent1', 'Indent2', 'Indent3' ],
+
+ /*
+ * Paragraph justification.
+ */
+ justifyClasses: [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull' ],
+
+ /*
+ * Styles combo.
+ */
+ stylesSet: [
+ { name: 'Strong Emphasis', element: 'strong' },
+ { name: 'Emphasis', element: 'em' },
+
+ { name: 'Computer Code', element: 'code' },
+ { name: 'Keyboard Phrase', element: 'kbd' },
+ { name: 'Sample Text', element: 'samp' },
+ { name: 'Variable', element: 'var' },
+
+ { name: 'Deleted Text', element: 'del' },
+ { name: 'Inserted Text', element: 'ins' },
+
+ { name: 'Cited Work', element: 'cite' },
+ { name: 'Inline Quotation', element: 'q' }
+ ]
+ });
+
+ </script>
+ </p>
+ <p>
+ <input type="submit" value="Submit">
+ </p>
+ </form>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog.css
new file mode 100644
index 000000000..f922b6363
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie.css
new file mode 100644
index 000000000..15eb19988
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie7.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie7.css
new file mode 100644
index 000000000..64965e1e1
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie8.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie8.css
new file mode 100644
index 000000000..d34c919ea
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_iequirks.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_iequirks.css
new file mode 100644
index 000000000..8ede95d6f
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_opera.css b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_opera.css
new file mode 100644
index 000000000..34ab2c764
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/dialog_opera.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor.css
new file mode 100644
index 000000000..d2424f758
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor_gecko.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_gecko.css
new file mode 100644
index 000000000..f33f56c75
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_gecko.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie.css
new file mode 100644
index 000000000..461e63d2c
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie7.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie7.css
new file mode 100644
index 000000000..b4c2975f3
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie8.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie8.css
new file mode 100644
index 000000000..41044b4f7
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/editor_iequirks.css b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_iequirks.css
new file mode 100644
index 000000000..e274b5c4e
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/editor_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffaaaaaa',endColorstr='#ffcacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon{background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon{background: url(icons.png) no-repeat 0 -32px !important;}.cke_button__italic_icon{background: url(icons.png) no-repeat 0 -64px !important;}.cke_button__strike_icon{background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__subscript_icon{background: url(icons.png) no-repeat 0 -128px !important;}.cke_button__superscript_icon{background: url(icons.png) no-repeat 0 -160px !important;}.cke_button__underline_icon{background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon{background: url(icons.png) no-repeat 0 -224px !important;}.cke_rtl .cke_button__copy_icon,.cke_mixed_dir_content .cke_rtl .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -256px !important;}.cke_ltr .cke_button__copy_icon{background: url(icons.png) no-repeat 0 -288px !important;}.cke_rtl .cke_button__cut_icon,.cke_mixed_dir_content .cke_rtl .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -320px !important;}.cke_ltr .cke_button__cut_icon{background: url(icons.png) no-repeat 0 -352px !important;}.cke_rtl .cke_button__paste_icon,.cke_mixed_dir_content .cke_rtl .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__paste_icon{background: url(icons.png) no-repeat 0 -416px !important;}.cke_rtl .cke_button__bulletedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -448px !important;}.cke_ltr .cke_button__bulletedlist_icon{background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__numberedlist_icon,.cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -512px !important;}.cke_ltr .cke_button__numberedlist_icon{background: url(icons.png) no-repeat 0 -544px !important;}.cke_rtl .cke_button__indent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__indent_icon{background: url(icons.png) no-repeat 0 -608px !important;}.cke_rtl .cke_button__outdent_icon,.cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -640px !important;}.cke_ltr .cke_button__outdent_icon{background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__horizontalrule_icon{background: url(icons.png) no-repeat 0 -704px !important;}.cke_button__image_icon{background: url(icons.png) no-repeat 0 -736px !important;}.cke_rtl .cke_button__anchor_icon,.cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -768px !important;}.cke_ltr .cke_button__anchor_icon{background: url(icons.png) no-repeat 0 -800px !important;}.cke_button__link_icon{background: url(icons.png) no-repeat 0 -832px !important;}.cke_button__unlink_icon{background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__maximize_icon{background: url(icons.png) no-repeat 0 -896px !important;}.cke_rtl .cke_button__pastetext_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -928px !important;}.cke_ltr .cke_button__pastetext_icon{background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__pastefromword_icon,.cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -992px !important;}.cke_ltr .cke_button__pastefromword_icon{background: url(icons.png) no-repeat 0 -1024px !important;}.cke_button__removeformat_icon{background: url(icons.png) no-repeat 0 -1056px !important;}.cke_rtl .cke_button__source_icon,.cke_mixed_dir_content .cke_rtl .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1088px !important;}.cke_ltr .cke_button__source_icon{background: url(icons.png) no-repeat 0 -1120px !important;}.cke_button__specialchar_icon{background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__scayt_icon{background: url(icons.png) no-repeat 0 -1184px !important;}.cke_button__table_icon{background: url(icons.png) no-repeat 0 -1216px !important;}.cke_rtl .cke_button__redo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1248px !important;}.cke_ltr .cke_button__redo_icon{background: url(icons.png) no-repeat 0 -1280px !important;}.cke_rtl .cke_button__undo_icon,.cke_mixed_dir_content .cke_rtl .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1312px !important;}.cke_ltr .cke_button__undo_icon{background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__spellchecker_icon{background: url(icons.png) no-repeat 0 -1376px !important;} \ No newline at end of file
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/icons.png b/mod/ckeditor/vendors/ckeditor/skins/moono/icons.png
new file mode 100644
index 000000000..eae75d2b4
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/icons.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/images/arrow.png b/mod/ckeditor/vendors/ckeditor/skins/moono/images/arrow.png
new file mode 100644
index 000000000..0d1eb39c6
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/images/arrow.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/images/close.png b/mod/ckeditor/vendors/ckeditor/skins/moono/images/close.png
new file mode 100644
index 000000000..a795fd520
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/images/close.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/images/mini.png b/mod/ckeditor/vendors/ckeditor/skins/moono/images/mini.png
new file mode 100644
index 000000000..3e65bd5b8
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/images/mini.png
Binary files differ
diff --git a/mod/ckeditor/vendors/ckeditor/skins/moono/readme.md b/mod/ckeditor/vendors/ckeditor/skins/moono/readme.md
new file mode 100644
index 000000000..0fa4c1acb
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/skins/moono/readme.md
@@ -0,0 +1,51 @@
+"Moono" Skin
+====================
+
+This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
+[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
+the CKEditor team. "Moono" is maintained by the core developers.
+
+For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
+documentation.
+
+Features
+-------------------
+"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
+It comes with the following features:
+
+- Chameleon feature with brightness,
+- high-contrast compatibility,
+- graphics source provided in SVG.
+
+Directory Structure
+-------------------
+
+CSS parts:
+- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
+- **mainui.css**: the file contains styles of entire editor outline structures,
+- **toolbar.css**: the file contains styles of the editor toolbar space (top),
+- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
+- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
+until the first panel open up,
+- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
+- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
+it's not loaded until the first menu open up,
+- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
+- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
+- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
+- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
+
+Other parts:
+- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
+- **icons/**: contains all skin defined icons,
+- **images/**: contains a fill general used images,
+- **dev/**: contains SVG source of the skin icons.
+
+License
+-------
+
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
diff --git a/mod/ckeditor/vendors/ckeditor/styles.js b/mod/ckeditor/vendors/ckeditor/styles.js
new file mode 100644
index 000000000..e4feb3e80
--- /dev/null
+++ b/mod/ckeditor/vendors/ckeditor/styles.js
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+// This file contains style definitions that can be used by CKEditor plugins.
+//
+// The most common use for it is the "stylescombo" plugin, which shows a combo
+// in the editor toolbar, containing all styles. Other plugins instead, like
+// the div plugin, use a subset of the styles on their feature.
+//
+// If you don't have plugins that depend on this file, you can simply ignore it.
+// Otherwise it is strongly recommended to customize this file to match your
+// website requirements and design properly.
+
+CKEDITOR.stylesSet.add( 'default', [
+ /* Block Styles */
+
+ // These styles are already available in the "Format" combo ("format" plugin),
+ // so they are not needed here by default. You may enable them to avoid
+ // placing the "Format" combo in the toolbar, maintaining the same features.
+ /*
+ { name: 'Paragraph', element: 'p' },
+ { name: 'Heading 1', element: 'h1' },
+ { name: 'Heading 2', element: 'h2' },
+ { name: 'Heading 3', element: 'h3' },
+ { name: 'Heading 4', element: 'h4' },
+ { name: 'Heading 5', element: 'h5' },
+ { name: 'Heading 6', element: 'h6' },
+ { name: 'Preformatted Text',element: 'pre' },
+ { name: 'Address', element: 'address' },
+ */
+
+ { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } },
+ { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },
+ {
+ name: 'Special Container',
+ element: 'div',
+ styles: {
+ padding: '5px 10px',
+ background: '#eee',
+ border: '1px solid #ccc'
+ }
+ },
+
+ /* Inline Styles */
+
+ // These are core styles available as toolbar buttons. You may opt enabling
+ // some of them in the Styles combo, removing them from the toolbar.
+ // (This requires the "stylescombo" plugin)
+ /*
+ { name: 'Strong', element: 'strong', overrides: 'b' },
+ { name: 'Emphasis', element: 'em' , overrides: 'i' },
+ { name: 'Underline', element: 'u' },
+ { name: 'Strikethrough', element: 'strike' },
+ { name: 'Subscript', element: 'sub' },
+ { name: 'Superscript', element: 'sup' },
+ */
+
+ { name: 'Marker: Yellow', element: 'span', styles: { 'background-color': 'Yellow' } },
+ { name: 'Marker: Green', element: 'span', styles: { 'background-color': 'Lime' } },
+
+ { name: 'Big', element: 'big' },
+ { name: 'Small', element: 'small' },
+ { name: 'Typewriter', element: 'tt' },
+
+ { name: 'Computer Code', element: 'code' },
+ { name: 'Keyboard Phrase', element: 'kbd' },
+ { name: 'Sample Text', element: 'samp' },
+ { name: 'Variable', element: 'var' },
+
+ { name: 'Deleted Text', element: 'del' },
+ { name: 'Inserted Text', element: 'ins' },
+
+ { name: 'Cited Work', element: 'cite' },
+ { name: 'Inline Quotation', element: 'q' },
+
+ { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } },
+ { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } },
+
+ /* Object Styles */
+
+ {
+ name: 'Styled image (left)',
+ element: 'img',
+ attributes: { 'class': 'left' }
+ },
+
+ {
+ name: 'Styled image (right)',
+ element: 'img',
+ attributes: { 'class': 'right' }
+ },
+
+ {
+ name: 'Compact table',
+ element: 'table',
+ attributes: {
+ cellpadding: '5',
+ cellspacing: '0',
+ border: '1',
+ bordercolor: '#ccc'
+ },
+ styles: {
+ 'border-collapse': 'collapse'
+ }
+ },
+
+ { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },
+ { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }
+]);
+
diff --git a/mod/ckeditor/views/default/ckeditor/css.php b/mod/ckeditor/views/default/ckeditor/css.php
new file mode 100644
index 000000000..8c8790722
--- /dev/null
+++ b/mod/ckeditor/views/default/ckeditor/css.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * CKEditor CSS
+ *
+ * Overrides on the default CKEditor skin
+ * Gives the textarea and buttons rounded corners
+ *
+ * The rules are extra long in order to have enough
+ * weight to override the CKEditor rules
+ */
+?>
+
+.cke_top {
+ width: 100% !important;
+}
+
+.cke_bottom .cke_wordcount {
+ float: left;
+ padding-top: 1px;
+ padding-left: 5px;
+ font-family: Arial,Helvetica,Tahoma,Verdana,Sans-Serif;
+ font-size: 11px;
+ font-weight: 700;
+ color: #5F5F5F;
+}
+
+.cke_bottom .cke_path {
+ float: right;
+}
+
diff --git a/mod/ckeditor/views/default/ckeditor/embed_custom_insert_js.php b/mod/ckeditor/views/default/ckeditor/embed_custom_insert_js.php
new file mode 100644
index 000000000..2b72e58c6
--- /dev/null
+++ b/mod/ckeditor/views/default/ckeditor/embed_custom_insert_js.php
@@ -0,0 +1,8 @@
+ if (CKEDITOR) {
+ try {
+ CKEDITOR.instances[textAreaId].insertHtml(content, 'html');
+ } catch (e) {
+ // do nothing.
+ }
+ }
+
diff --git a/mod/ckeditor/views/default/ckeditor/init.php b/mod/ckeditor/views/default/ckeditor/init.php
new file mode 100644
index 000000000..f78a5a64d
--- /dev/null
+++ b/mod/ckeditor/views/default/ckeditor/init.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Initialize the CKEditor script
+ */
+
+elgg_load_js('ckeditor');
+elgg_load_js('jquery-ckeditor');
+elgg_load_js('elgg.ckeditor');
diff --git a/mod/ckeditor/views/default/css/wysiwyg.php b/mod/ckeditor/views/default/css/wysiwyg.php
new file mode 100644
index 000000000..f696729ab
--- /dev/null
+++ b/mod/ckeditor/views/default/css/wysiwyg.php
@@ -0,0 +1,36 @@
+/* CSS for CKEditor content iframe */
+
+<?php // The Elgg CSS reset forces the scrollbar which we don't want ?>
+html, body {
+ height: auto;
+ margin: 0;
+}
+
+body {
+ margin: 8px;
+}
+
+dt { font-weight: bold }
+dd { margin: 0 0 1em 1em }
+
+ul, ol {
+ margin: 0 1.5em 1.5em 0;
+ padding-left: 1.5em;
+}
+ul {
+ list-style-type: disc;
+}
+ol {
+ list-style-type: decimal;
+}
+table {
+ border: 1px solid #ccc;
+}
+table td {
+ border: 1px solid #ccc;
+ padding: 3px 5px;
+}
+img {
+ max-width: 100%;
+ height: auto;
+} \ No newline at end of file
diff --git a/mod/ckeditor/views/default/js/ckeditor.php b/mod/ckeditor/views/default/js/ckeditor.php
new file mode 100644
index 000000000..9e02496ac
--- /dev/null
+++ b/mod/ckeditor/views/default/js/ckeditor.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * CKEditor JavaScript
+ */
+
+$css_url = elgg_get_simplecache_url('css', 'wysiwyg');
+
+?>
+elgg.provide('elgg.ckeditor');
+
+/**
+ * Toggles the CKEditor
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ckeditor.toggleEditor = function(event) {
+ event.preventDefault();
+
+ var target = $(this).attr('href').substr(1);
+
+ if (!CKEDITOR.instances[target]) {
+ CKEDITOR.replace($('#'+target)[0], elgg.ckeditor.config).on('key', elgg.ckeditor.wordCount);
+ $(this).html(elgg.echo('ckeditor:remove'));
+ } else {
+ CKEDITOR.instances[target].destroy();
+ $(this).html(elgg.echo('ckeditor:add'));
+ }
+}
+
+/**
+ * Counts the number of words into an editor
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.ckeditor.wordCount = function(evt) {
+ var matches = evt.editor.getData().replace(/<[^<|>]+?>|&nbsp;/gi,' ').match(/\b/g);
+ var words = matches ? matches.length / 2 : 0;
+ var text = elgg.echo('ckeditor:word_count') + words;
+ $('.cke_wordcount', evt.editor.container.$).text(text);
+}
+
+/**
+ * CKEditor configuration
+ *
+ * You can find configuration information here:
+ * http://docs.ckeditor.com/#!/api/CKEDITOR.config
+ */
+elgg.ckeditor.config = {
+ toolbar : [['Bold', 'Italic', 'Underline', '-', 'Strike', 'NumberedList', 'BulletedList', 'Undo', 'Redo', 'Link', 'Unlink', 'Image', 'Blockquote', 'Paste', 'PasteFromWord', 'Maximize']],
+ toolbarCanCollapse : false,
+ baseHref : elgg.config.wwwroot,
+ extraPlugins : 'autogrow',
+ removePlugins : 'contextmenu,showborders,tabletools,resize',
+ uiColor : '#EEEEEE',
+ contentsCss : '<?php echo $css_url; ?>',
+ disableNativeSpellChecker : false,
+ removeDialogTabs: 'image:advanced;image:Link;link:advanced;link:target',
+ autoGrow_maxHeight : 800,
+};
+
+elgg.ckeditor.init = function() {
+
+ elgg.ckeditor.config.language = elgg.get_language();
+
+ $('.ckeditor-toggle-editor').live('click', elgg.ckeditor.toggleEditor);
+ $('.elgg-input-longtext').each(function() {
+ CKEDITOR.replace(this, elgg.ckeditor.config).on('key', elgg.ckeditor.wordCount);
+ });
+ CKEDITOR.on('instanceReady', function(evt) {
+ $('.cke_bottom', evt.editor.container.$).prepend('<div class="cke_wordcount" />');
+ elgg.ckeditor.wordCount(evt);
+ });
+}
+
+elgg.register_hook_handler('init', 'system', elgg.ckeditor.init);
diff --git a/mod/colorbox/COPYING b/mod/colorbox/COPYING
new file mode 100644
index 000000000..dba13ed2d
--- /dev/null
+++ b/mod/colorbox/COPYING
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/mod/colorbox/languages/ca.php b/mod/colorbox/languages/ca.php
new file mode 100644
index 000000000..214d327aa
--- /dev/null
+++ b/mod/colorbox/languages/ca.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Colorbox -- Translation strings for Catalan
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$catalan = array(
+ "js:lightbox:current" => "imatge %s de %s",
+);
+
+add_translation("ca", $catalan);
diff --git a/mod/colorbox/languages/en.php b/mod/colorbox/languages/en.php
new file mode 100644
index 000000000..70bab4e05
--- /dev/null
+++ b/mod/colorbox/languages/en.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Colorbox -- Translation strings for English
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$english = array(
+ "js:lightbox:current" => "image %s of %s",
+);
+
+add_translation("en", $english);
diff --git a/mod/colorbox/languages/es.php b/mod/colorbox/languages/es.php
new file mode 100644
index 000000000..e49d0db47
--- /dev/null
+++ b/mod/colorbox/languages/es.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Colorbox -- Translation strings for Spanish
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$spanish = array(
+ "js:lightbox:current" => "imagen %s de %s",
+);
+
+add_translation("es", $spanish);
diff --git a/mod/colorbox/manifest.xml b/mod/colorbox/manifest.xml
new file mode 100644
index 000000000..ec5f22e90
--- /dev/null
+++ b/mod/colorbox/manifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Colorbox</name>
+ <author>Lorea developers</author>
+ <version>1.8.0</version>
+ <category>lorea</category>
+ <category>enhancement</category>
+ <category>multimedia</category>
+ <description>Elgg lightbox replacement for Fancybox. Colorbox is the default Elgg lightbox in 1.9.</description>
+ <website>https://lorea.org/plugin/colorbox</website>
+ <copyright>Copyright 2012 Lorea Faeries &lt;federation@lorea.org&gt;</copyright>
+ <repository>https://gitorious.org/lorea/colorbox</repository>
+ <donations>https://lorea.org/support</donations>
+ <license>GNU Affero General Public License version 3, or later</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>embed</plugin>
+ </requires>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.9</version>
+ <comparison>lt</comparison>
+ </requires>
+</plugin_manifest>
diff --git a/mod/colorbox/start.php b/mod/colorbox/start.php
new file mode 100644
index 000000000..b19b2efcf
--- /dev/null
+++ b/mod/colorbox/start.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Colorbox -- A lightweight, customizable lightbox plugin for jQuery
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ * @homepage https://lorea.org/plugin/colorbox
+ * @copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ * @license COPYING, http://www.gnu.org/licenses/agpl
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+elgg_register_event_handler('init', 'system', 'colorbox_init');
+
+/**
+ * Initialize the colorbox plugin.
+ *
+ */
+function colorbox_init() {
+
+}
diff --git a/mod/colorbox/vendors/jquery/colorbox/README.md b/mod/colorbox/vendors/jquery/colorbox/README.md
new file mode 100644
index 000000000..2a53feac8
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/README.md
@@ -0,0 +1,318 @@
+## About ColorBox:
+A customizable lightbox plugin for jQuery. See the [project page](http://jacklmoore.com/colorbox/) for documentation and a demonstration, and the [FAQ](http://jacklmoore.com/colorbox/faq/) for solutions and examples to common issues. Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
+
+## Changelog:
+
+### Version 1.3.19 - December 08 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all)
+
+* Fixed bug related to using the 'fixed' property.
+* Optimized the setup procedure to be more efficient.
+* Removed $.colorbox.init() as it will no longer be needed (will self-init when called).
+* Removed use of $.browser.
+
+### Version 1.3.18 - October 07 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 1's controls.png
+
+* Fixed a regression where Flash content displayed in ColorBox would be reloaded if the browser window was resized.
+* Added safety check to make sure that ColorBox's markup is only added to the DOM a single time, even if $.colorbox.init() is called multiple times. This will allow site owners to manually initialize ColorBox if they need it before the DOM has finished loading.
+* Updated the example index.html files to be HTML5 compliant.
+* Changed the slideshow behavior so that it immediately moves to the next slide when the slideshow is started.
+* Minor regex bugfix to allow automatic detection of image URLs that include fragments.
+
+### Version 1.3.17 - May 11 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added properties "top", "bottom", "left" and "right" to specify a position relative to the viewport, rather than using the default centering.
+* Added property "data" to specify GET or POST data when using Ajax. ColorBox's ajax functionality is handled by jQuery's .load() method, so the data property works the same way as it does with .load().
+* Added property "fixed" which can provide fixed positioning for ColorBox, rather than absolute positioning. This will allow ColorBox to remain in a fixed position within the visitors viewport, despite scrolling. IE6 support for this was not added, it will continue to use the default absolute positioning.
+* Fixed ClearType problem with IE7.
+* Minor fixes.
+
+### Version 1.3.16 - March 01 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 4 background png files
+
+* Better IE related transparency workarounds. IE7 and up now uses the same background image sprite as other browsers.
+* Added error handling for broken image links. A message will be displayed telling the user that the image could not be loaded.
+* Added new property: 'fastIframe' and set it to true by default. Setting to fastIframe:false will delay the loading graphic removal and onComplete event until iframe has completely loaded.
+* Ability to redefine $.colorbox.close (or prev, or next) at any time.
+
+### Version 1.3.15 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor fixes for specific cases.
+
+### Version 1.3.14 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* In IE6, closing an iframe when using HTTPS no longer generates a security warning.
+
+### Version 1.3.13 - October 22 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the index.html example files to use YouTube's new embedded link format.
+* By default, ColorBox returns focus to the element it was launched from once it closes. This can now be disabled by setting the 'returnFocus' property to false. Focus was causing problems for some users who had their anchor elements inside animated containers.
+* Minor bug fix involved in using a combination of slideshow and non-slideshow content.
+
+### Version 1.3.12 - October 20 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor bug fix involved in preloading images when using a function as a value for the href property.
+
+### Version 1.3.11 - October 19 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed the slideshow functionality that broke with 1.3.10
+* The slideshow now respects the loop property.
+
+### Version 1.3.10 - October 16 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed compatibility with jQuery 1.4.3
+* The 'open' property now accepts a function as a value, like all of the other properties.
+* Preloading now loads the correct href for images when using a dynamic (function) value for the href property.
+* Fixed bug in Safari 3 for Win where ColorBox centered on the document, rather than the visitor's viewport.
+* May have fixed an issue in Opera 10.6+ where ColorBox would rarely/randomly freeze up while switching between photos in a group.
+* Some functionality better encapsulated & minor performance improvements.
+
+### Version 1.3.9 - July 7 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/ all colorbox.css (the core styles)
+
+* Fixed a problem where iframed youtube videos would cause a security alert in IE.
+* More code is event driven now, making the source easier to grasp.
+* Removed some unnecessary style from the core CSS.
+
+### Version 1.3.8 - June 21 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug in Chrome where it would sometimes render photos at 0 by 0 width and height (behavior introduced in recent update to Chrome).
+* Fixed a bug where the onClosed callback would fire twice (only affected 1.3.7).
+* Fixed a bug in IE7 that existed with some iframed websites that use JS to reposition the viewport caused ColorBox to move out of position.
+* Abstracted the identifiers (HTML ids & classes, and JS plugin name, method, and events) so that the plugin can be easily rebranded.
+* Small changes to improve either code readability or compression.
+
+### Version 1.3.7 - June 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/index.html
+
+* $.colorbox can now be used for direct calls and accessing public methods. Example: $.colorbox.close();
+* Resize now accepts 'width', 'innerWidth', 'height' and 'innerHeight'. Example: $.colorbox.resize({width:"100%"})
+* Added option (loop:false) to disable looping in a group.
+* Added options (escKey:false, arrowKey:false) to disable esc-key and arrow-key bindings.
+* Added method for removing ColorBox from a document: $.colorbox.remove();
+* Fixed a bug where iframed URLs would be truncated if they contained an unencoded apostrophe.
+* Now uses the exact href specified on an anchor, rather than the version returned by 'this.href'. This was causing "#example" to be normalized to "http://domain/#example" which interfered with how some users were setting up links to inline content.
+* Changed example documents over to HTML5.
+
+### Version 1.3.6 - Jan 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Small change to make ColorBox compatible with jQuery 1.4
+
+### Version 1.3.5 - December 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug introduced in 1.3.4 with IE7's display of example 2 and 3, and auto-width in Opera.
+* Fixed a bug introduced in 1.3.4 where colorbox could not be launched by triggering an element's click event through JavaScript.
+* Minor refinements.
+
+### Version 1.3.4 - December 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Event delegation is now used for elements that ColorBox is assigned to, rather than individual click events.
+* Additional callbacks have been added to represent other stages of ColorBox's lifecycle. Available callbacks, in order of their execution: onOpen, onLoad, onComplete, onCleanup, onClosed These take place at the same time as the event hooks, but will be better suited than the hooks for targeting specific instances of ColorBox.
+* Ajax content is now immediately added to the DOM to be more compatible if that content contains script tags.
+* Focus is now returned to the calling element on closing.
+* Fixed a bug where maxHeight and maxWidth did not work for non-photo content.
+* Direct calls no longer need 'open:true', it is assumed. Example: `$.fn.colorbox({html:'<p>Hi</p>'});`
+
+### Version 1.3.3 - November 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed $.fn.colorbox.element() to return a jQuery object rather the DOM element.
+* jQuery.colorbox-min.js is compressed with Google's Closure Compiler rather than YUI Compressor.
+
+### Version 1.3.2 - October 27 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added 'innerWidth' and 'innerHeight' options to allow people to easily set the size dimensions for ColorBox, without having to anticipate the size of the borders and buttons.
+* Renamed 'scrollbars' option to 'scrolling' to be in keeping with the existing HTML attribute. The option now also applies to iframes.
+* Bug fix: In Safari, positioning occassionally incorrect when using '100%' dimensions.
+* Bug fix: In IE6, the background overlay is briefly not full size when first viewing.
+* Bug fix: In Firefox, opening ColorBox causes a split second shift with a small minority of webpage layouts.
+* Simplified code in a few areas.
+
+### Version 1.3.1 - September 16 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css/colorbox-ie.css(removed)
+
+* Removed the IE-only stylesheets and conditional comments for example styles 1 & 4. All CSS is handled by a single CSS file for all examples.
+* Removed user-agent sniffing from the js and replaced it with feature detection. This will allow correct rendering for visitors masking their agent type.
+
+### Version 1.3.0 - September 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css
+
+* Added $.fn.colorbox.resize() method to allow ColorBox to resize it's height if it's contents change.
+* Added 'scrollbars' option to allow users to turn off scrollbars when using the resize() method.
+* Renamed the 'resize' option to be less ambiguous. It's now 'scalePhotos'.
+* Renamed the 'cbox_close' event to be less ambiguous. It's now 'cbox_cleanup'. It is the first thing to happen in the close method while the 'cbox_closed' event is the last to happen.
+* Fixed a bug with the slideshow mouseover graphics that appeared after ColorBox is opened a 2nd time.
+* Fixed a bug where ClearType may not work in IE6&7 if using the fade transition.
+* Minor code optimizations to increase compression.
+
+### Version 1.2.9 - August 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor change to enable use with $.getScript();
+* Minor change to the timing of the 'cbox_load' event so that it is more useful.
+* Added a direct link to a YouTube video to the examples.
+
+### Version 1.2.8 - August 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with the overlay in IE6
+* Fixed a bug where left & right keypress events might be prematurely unbound.
+
+### Version 1.2.7 - July 31 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js, example stylesheets and background images (core styles have not changed and the updates will not affect existing user themes / old example themes)
+
+* Code cleanup and reduction, better organization and documentation in the full source.
+* Added ability to use functions in place of static values for ColorBox's options (thanks Ken!).
+* Added an option for straight HTML. Example: `$.fn.colorbox({html:'<p>Howdy</p>', open:true})`
+* Added an event for the beginning of the closing process. This is in addition to the event that already existed for when ColorBox had completely closed. 'cbox_close' and 'cbox_closed' respectively.
+* Fixed a minor bug in IE6 that would cause a brief content shift in the parent document when opening ColorBox.
+* Fixed a minor bug in IE6 that would reveal select elements that had a hidden visibility after closing ColorBox.
+* The 'esc' key is unbound now when ColorBox is not open, to avoid any potential conflicts.
+* Used background sprites for examples 1 & 4. Put IE-only (non-sprite) background images in a separate folder.
+* Example themes 1, 3, & 4 received slight visual tweaks.
+* Optimized pngs for smaller file size.
+* Added slices, grid, and correct sizing to the Adobe Illustrator file, all theme files are now export ready!
+
+### Version 1.2.6 - July 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with fixed width/height images in Opera 9.64.
+* Fixed a bug with trying to set a value for rel during a direct call to ColorBox. Example: `$.fn.colorbox({rel:'foo', open:true});`
+* Changed how href/rel/title settings are determined to avoid users having to manually update ColorBox settings if they use JavaScript to update any of those attributes, after ColorBox has been defined.
+* Fixed a FF3 bug where the back button was disabled after closing an iframe.
+
+### Version 1.2.5 - June 23 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the point at which iframe srcs are set (to eliminate the need to refresh the iframe once it has been added to the DOM).
+* Removed unnecessary return values for a very slight code reduction.
+
+### Version 1.2.4 - June 9 2009
+Files Changed: jquery.colorbox.js, jquery.colorbox-min.js
+
+* Fixed an issue where ColorBox may not close completely if it is closed during a transition animation.
+* Minor code reduction.
+
+### Version 1.2.3 - June 4 2009
+* Fixed a png transparency stacking issue in IE.
+* More accurate Ajax auto-sizing if the user was depending on the #cboxLoadedContent ID for CSS styling.
+* Added a public function for returning the current html element that ColorBox is associated with. Example use: var that = $.fn.colorbox.element();
+* Added bicubic scaling for resized images in the original IE7.
+* Removed the IE6 stylesheet and png files from Example 3. It now uses the same png file for the controls that the rest of the browsers use (an alpha transparency PNG8). This example now only has 2 graphics files and 1 stylesheet.
+
+### Version 1.2.2 - May 28 2009
+* Fixed an issue with the 'resize' option.
+
+### Version 1.2.1 - May 28 2009
+* Note: If you are upgrading, update your jquery.colorbox.js and colorbox.css files.
+* Added photo resizing.
+* Added a maximum width and maximum height. Example: {height:800, maxHeight:'100%'}, would allow the box to be a maximum potential height of 800px, instead of a fixed height of 800px. With maxHeight of 100% the height of ColorBox cannot exceed the height of the browser window.
+* Added 'rel' setting to add the ability to set an alternative rel for any ColorBox call. This allows the user to group any combination of elements together for a gallery, or to override an existing rel. attribute so those element are not grouped together, without having to alter their rel in the HTML.
+* Added a 'photo' setting to force ColorBox to display a link as a photo. Use this when automatic photo detection fails (such as using a url like 'photo.php' instead of 'photo.jpg', 'photo.jpg#1', or 'photo.jpg?pic=1')
+* Removed the need to ever create disposable elements to call colorbox on. ColorBox can now be called directly, without being associated with any existing element, by using the following format:
+ `$.fn.colorbox({open:true, href:'yourLink.xxx'});`
+* ColorBox settings are now persistent and unique for each element. This allows for extremely flexible options for individual elements. You could use this to create a gallery in which each page in the gallery has different settings. One could be a photo with a fade transition, next could be an inline element with an elastic transition with a set width and height, etc.
+* For user callbacks, 'this' now refers to the element colorbox was opened from.
+* Fixed a minor grouping issue with IE6, when transition type is set to 'none'.
+* Added an Adobe Illustrator file that contains the borders and buttons used in the various examples.
+
+### Version 1.2 - May 13 2009
+* Added a slideshow feature.
+* Added re-positioning on browser resize. If the browser is resized, ColorBox will recenter itself onscreen.
+* Added hooks for key events: cbox_open, cbox_load, cbox_complete, cbox_closed.
+* Fixed an IE transparency-stacking problem, where transparent PNGs would show through to the background overlay.
+* Fixed an IE iframe issue where the ifame might shift up and to the left under certain circumstances.
+* Fixed an IE6 bug where the loading overlay was not at full height.
+* Removed the delay in switching between same-sized gallery content when using transitions.
+* Changed how iframes are loaded to make it more compatible with iframed pages that use DOM dependent JavaScript.
+* Changed how the JS is structured to be better organized and increase compression. Increased documentation.
+* Changed CSS :hover states to a .hover class. This sidesteps a minor IE8 bug with css hover states and allows easier access to hover state user styles from the JavaScript.
+* Changed: elements added to the DOM have new ID's. The naming is more consistent and less likely to cause conflicts with existing website stylesheets. All stylesheets have been updated.
+* Changed the behavior for prev/next links so that ColorBox does not get hung up on broken links. A visitor can now skip through broken or long-loading links by clicking prev/next buttons.
+* Changed the naming of variables in the parameter map to be more concise and intuitive.
+* Removed colorbox.css. Combined the colorbox.css styles with jquery.colorbox.js: the css file was not large enough to warrant being a separate file.
+
+### Version 1.1.6 - April 28 2009
+* Prevented the default action of the next & previous anchors and the left and right keys for gallery mode.
+* Fixed a bug where the title element was being added back to the DOM when closing ColorBox while using inline content.
+* Fixed a bug where IE7 would crash for example 2.
+* Smaller filesize: removed a small amount of unused code and rewrote the HTML injection with less syntax.
+* Added a public method for closing ColorBox: $.fn.colorbox.close(). This will allow iframe users to add an event to close ColorBox without having to create an additional function.
+
+### Version 1.1.5 - April 11 2009
+* Fixed minor issues with exiting ColorBox.
+
+### Version 1.1.4 - April 08 2009
+* Fixed a bug in the fade transition where ColorBox not close completely if instructed to close during the fade-in portion of the transition.
+
+### Version 1.1.3 - April 06 2009
+* Fixed an IE6&7 issue with using ColorBox to display animated GIFs.
+
+### Version 1.1.2 - April 05 2009
+* Added ability to change content when ColorBox is already open.
+* Added vertical photo centering now works for all browsers (this feature previously excluded IE6&7).
+* Added namespacing to the esc-key keydown event for people who want to disable it: "keydown.colorClose"
+* Added 'title' setting to add the ability to set an alternative title for any ColorBox call.
+* Fixed rollover navigation issue with IE8. (Added JS-based rollover state due to a browser-bug.)
+* Fixed an overflow issue for when the fixed width/height is smaller than the size of a photo.
+* Fixed a bug in the fade transition where the border would still come up if ColorBox was closed mid-transition.
+* Switch from JSMin to Yui Compressor for minification. Minified code now under 7KB.
+
+### Version 1.1.1 - March 31 2009
+* More robust image detection regex. Now detects image file types with url fragments and/or query strings.
+* Added 'nofollow' exception to rel grouping.
+* Changed how images are loaded into the DOM to prevent premature size calculation by ColorBox.
+* Added timestamp to iframe name to prevent caching - this was a problem in some browsers if the user had multiple iframes and the visitor left the page and came back, or if they refreshed the page.
+
+### Version 1.1.0 - March 21 2009
+* Animation is now much smoother and less resource intensive.
+* Added support for % sizing.
+* Callback option added.
+* Inline content now preserves JavaScript events, and changes made while ColorBox is open are also preserved.
+* Added 'href' setting to add the ability to set an alternative href for any anchor, or to assign the ColorBox event to non-anchors.
+ Example: $('button').colorbox({'href':'process.php'})
+ Example: $('a[href='http://msn.com']).colorbox({'href':'http://google.com', iframe:true});
+* Photos are now horizontally centered if they are smaller than the lightbox size. Also vertically centered for browsers newer than IE7.
+* Buttons in the examples are now included in the 'protected zone'. The lightbox will never expand it's borders or buttons beyond an accessible area of the screen.
+* Keypress events don't queue up by holding down the arrow keys.
+* Added option to close ColorBox by clicking on the background overlay.
+* Added 'none' transition setting.
+* Changed 'contentIframe' and 'contentInline' to 'inline' and 'iframe'. Removed 'contentAjax' because it is automatically assumed for non-image file types.
+* Changed 'contentWidth' and 'contentHeight' to 'fixedWidth' and 'fixedHeight'. These sizes now reflect the total size of the lightbox, not just the inner content. This is so users can accurately anticipate % sizes without fear of creating scrollbars.
+* Clicking on a photo will now switch to the next photo in a set.
+* Loading.gif is more stable in it's position.
+* Added a minified version.
+* Code passes JSLint.
+
+### Version 1.0.5 - March 11 2009
+* Redo: Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.4 - March 10 2009
+* Added an option to allow users to automatically open the lightbox. Example usage: $(".colorbox").colorbox({open:true});
+* Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.3 - March 09 2009
+* Fixed vertical centering for Safari 3.0.x.
+
+### Version 1.0.2 - March 06 2009
+* Corrected a typo.
+* Changed the content-type check so that it does not assume all links to photos should actually display photos. This allows for Ajax/inline/and iframe calls on anchors linking to picture file types.
+
+### Version 1.0.1 - March 05 2009
+* Fixed keydown events (esc, left arrow, right arrow) for Webkit browsers.
+
+### Version 1.0 - March 03 2009
+* First release
diff --git a/mod/colorbox/vendors/jquery/colorbox/colorbox.ai b/mod/colorbox/vendors/jquery/colorbox/colorbox.ai
new file mode 100644
index 000000000..1b51881af
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/colorbox.ai
@@ -0,0 +1,1811 @@
+%PDF-1.4 %âãÏÓ
+1 0 obj <</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 48282/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.351735, 2008/07/22-18:11:12 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/vnd.adobe.illustrator</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">colorbox</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+ <xmp:CreateDate>2009-05-27T04:22:39-04:00</xmp:CreateDate>
+ <xmp:ModifyDate>2009-07-30T21:43:35-05:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2009-07-30T21:43:35-05:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>208</xmpGImg:width>
+ <xmpGImg:height>256</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXnn5b+fNd85T6us6W9jHpkiRL6KOzOzl9zzagACdMVZt9U1D/lt/5Jr/AFxV&#xA;gf5ZfmZrHmfzJrei39vBGNIaSNbiEODIYpjFUqzNStK4q9JxV2KuxV2KuxV2KuxV2KuxV2KvG/Pf&#xA;5jfmBY/mDL5Z8twpdMyRNb2/pKzktEHf4jTYbmpxVQ/xJ/zkV/1Y1/4G3/6qYqh9G/ND8zYvPml+&#xA;WvMdtHZSXcsXqwtEgYwyEjkjKSCDQioPXFXueKvBB+aX5r6n5k1HSdAtI717OSX4EiT4Y0fiCzOV&#xA;H44qmH+JP+civ+rGv/A2/wD1UxVd5F/Nbzde6/qVh5lMVnHpcEj3aNGIzG0TANyPgBiqbeU/z18v&#xA;eZdcl0izkZZ2kZLEPEw9aONOTS1pRQTUKCa+OKqdh+fvlm882Dy+kzAycYoLkxsFN16jRtbsCOuy&#xA;lWFVNaVr1VRfnv8AN5/Jt9AmpWLvp1zbyPBexFWrcx7iEx1BFV/aO340VR+r/mFqWj+Sl8x6lYGG&#xA;aOOGS808MrPH6jKHVW2VivLbpX2xVMtC8622vaLFq+lzLPaTKxRuJHxLUMpBoQQRirDfIf5y6x5n&#xA;1DSrWaxhtl1HT7i/dkZmKmC7a2CCoHXjyriqH/5x3/vvNf8AzFQ/rmxV7Lirwb8hv/JkedP+M9z/&#xA;ANRhxV7zirsVdirsVdirsVdirsVdirsVeNSf+tKx/wDMKf8AqDOKvZcVeHfmF/60T5T/AOYO0/6i&#xA;7nFXuOKvDvyS/wDJleb/AJN/1EHFXuOKvCPKoB/O/wA3AioLSgg/OPFWbeXvLflPTby/m0e1gjnl&#xA;n5XRjCnhLxHJVP7O1KqPn1OKtQ+W/KaebH1VLaAa4LZVQhVBWIu9XVRtyZmYM3XtiqC8x+VvI2q6&#xA;79Y19I7m7WzkRbe5c+mkBPxyIhPFH/yx8W3XbFVeXQvK8/km20meQyeX1jgQPJI3xRqylQ7k1AOw&#xA;O+2Kp/bWdpb2iWtpEkNsiCOKKIBVVQOICgbAAbDFWE+SPKfkrTL7TZ9Eu7i4ltrCeCzEtaNbPdM8&#xA;jtVE3EzFR0+XfFVH/nHf++81/wDMVD+ubFXsuKvBvyG/8mR50/4z3P8A1GHFXvOKuxV2KuxV2Kux&#xA;V2KuxV2KuxV4tfgH/nISYHcfUl/6h1xV6LwT+Ufdil5J5sAH/OQPlWgp/o1r0/5ibjFD3/FXg/5T&#xA;gHzt5xqK/vk6/wDGWbFXqnBP5R92KXlnlqJJPzo80xNUI8AU8SVNDFCNitCD7jFDLfL3kW10fUZL&#xA;xLiWQh2MKsduDClHH7RB74qttvIVnD5iGrfWZSqfvEj5GplZmJJbrwoR8Pfvttiqt5q8pyeYJ4Vl&#xA;uBDawRuU4oDJ6zbAlj+xtuBT5+CqM1DRrrUPLf6LnlRJ5I40mljWiAggsVTbw2GKo3SNNg0uwgso&#xA;Gd4oBRWkYsx+k/qG2KpD5W8sajpU1k9y0TC3spraT02J+OS5MwIqo24/jiqS/wDOO/8Afea/+YqH&#xA;9c2KvZcVeDfkN/5Mjzp/xnuf+ow4q95xV2KuxV2KuxV2KuxV2KuxV2KvA/OPmPTvL356y6jqJZbM&#xA;W0cUsiKXKc4AAxUbkA9ab4qyL/ldX5a/9XZv+kW7/wCqWKsFm8z6R5m/PLy5qGkO81lALa19Z0aM&#xA;O6yySEqrgNQeqBuBvXtvir6UxV81eTfOmheWPPHmY6zI8EF5MwjnVHkUNFK54ssYZvi57bYqzv8A&#xA;5XV+Wv8A1dm/6Rbv/qlirFfy41m11v8ANXXtVtAwtbqImHmKMVT04wxHblwrir2LFLsVdirsVdir&#xA;sVeef847/wB95r/5iof1zYoey4q8G/Ib/wAmR50/4z3P/UYcVe84q7FXYq7FXYq7FXYq7FXYq7FU&#xA;p1Dyj5X1G6a7v9Ktbq6cAPNNEjuQooKkiuwGKob/AJV95G/6sNh/0jx/0xVVtfJPlC0uY7m10azg&#xA;uIWDxSxworKw6EEDY4qnWKpHN5F8mTSvLLollJLISzu0EZJYmpJNMVWf8q+8jf8AVhsP+keP+mKo&#xA;rT/KfljTpjNYaXa2sxHEyQxIjFT2qoGKph9Utv8AfS/dirvqlt/vpfuxV31S2/30v3Yq76pbf76X&#xA;7sVd9Utv99L92Ku+qW3++l+7FXj/APzjwQLjzUhNGNzCwU9aVl3pir2XFXg35DD/AJCN5zb9lprk&#xA;q3Yj62emKvecVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSyfy1oU2&#xA;5soUbpySNUNPCoGKqH+D9B/5ZhiqN03RdK0xOFhaRWwIofSRUJHvxAxVG4q7FXYq7FXYq7FXYq7F&#xA;XYqg9H1jTdZ0u11XTLhLqwvI1mt54yCrI4qP7R2xVL/OHm6x8qaNca1qNrdTabaL6l3NaRiYxJWh&#xA;ZkDB+I7kKaDc7Yq84/6Gu/Kj0DcV1P0AokMv1GTgELcA3KtKc/hr47Yq9J8pea7PzTo1vrNha3UG&#xA;nXiCW0lu41iMsbfZdU5F+LdQSBUbjbFUdrOs6ZoulXWq6pcJa2FlG01zPIaKqIKn5nwHfFUZirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir8t7NtVW2nltHmS3gCvcNGzKq8mCK&#xA;TQjck0xV9Tf84pyar5v/AC088eUtS1CZ7GaM2dq8hMpgXULeaOXhyPTYNx6Vr44qxf8A6Fe/OhtP&#xA;Hllv0WNHEwYXv1iSgYOT6/GnPdTTjx+iu+Kss/5y2utV8sfl/wCTPLWnX80diA1vcshMbTixgiSI&#xA;vxPT4i3HpX5DFXyrdvqzW0El28z209XgaRmZGKEoSKkioNRir9SMVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVfnX5S85aNpmjNFND6bwAGSJAC0xJA5DkRU+IJxV71/wA4TyrN&#xA;a+dJUHFZLq0dR4BhOR0xV9NYq+ZP+c25FjsvJsjCqpdXbMPYLCcVeC+YvOOiXnl4WyQCea4B9KNw&#xA;AYCCRzPGtG8ADv32xV+iuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhDQ&#xA;P+cTvzc1nSbbU1gsrGO6jWWKC7uCk3BxyUskaScag9CajuMVfSX/ADjl+TmsflroGpx61cwz6nqs&#xA;8ckkVsWeKOOFWVBzZULMeZJ28MVeu4q8h/5yN/JzWfzK0HS49EuoYNS0qeR0iuSyRSRzqqv8aq5D&#xA;LwUjanXFXzb5h/5xQ/NzRdJudTaCzv4rSNpZobOcvNwQcmKo6R8qDsu57DFX3hirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir4I0T/nKf8AOHSNKttMi1CC5htIxFFLc26SS8FF&#xA;FDPsWoNqnfxxV9Mf843fnBrf5j+XtSbXIYk1TSZ445Li3UokscysyEoSeLDgwNNumKvX8VePf85J&#xA;fnDrv5ceX9LbQoIX1LVp5I1uLhS6RRwKrOQgK1di60rt12xV80a7/wA5S/m/rGkXWlzahb28F5G0&#xA;M0ltbpHL6bijBX+LjUbVG/hir74xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV8lfkx+Uv5Sa1+Wlxd6peLeXGprGupX/NIZbF0kST6vGZAwiPNQGcirg7fCcVZD/zhpbW1sfPd&#xA;tauZLaC/t44HJDFo09dVNRQGoHbFX0pir5q/5zNt7e5/wLb3LcLea+uI5nqFojegGNTsNjiqTfnD&#xA;+T/5PaP+U8OoWF/Hp+oaajrpV7zWaTUHaR5DbycKeqxZyA4HwAb/AAjFX1dirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdir8vLF9eSxu7exFx9Sv1WO8jiDmOUROJEDgCh4uoI8M&#xA;VfRv/OPmm+ffKv5QeePN1gq6dLEgvbFb+BnjuYtPhlkn+Csb7g8UcNTlXFV7f85FfnGvkL/GBuNH&#xA;+r8liFl9RufW9RpjHUn1eAi4rX1a0LfB9rFW/wDnI7SPPnmL8qfJPmbUE/SVwVa61L6hAVhthfQx&#xA;yRfADJJxAXizs1OVOlaYq+br+XX3sbS2vvrP1HT1eOyilDiOISyGVwgIoOTsSfHFX6h4q7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhNI0nT9I0y10vToEtrGzjWG3gjAVVRBQA&#xA;AUGKq91bW91bS2tzGs1vOjRTROKq6OOLKw7gg0xV45H/AM4lflEmofWfT1BrblU6cbtvq5Tlz9I/&#xA;D6vDlvTnir2SCCG3gjggRYoYlCRRoAqqqiiqoHQAYqhtY0jTtZ0q70rUoFubC9iaC5gcAqyOKEb/&#xA;AIYqjMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirqitO/hirsVcSBudsVdirSujEhWBI60NaYq3irsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdiq2WP1Inj5MnNSvNDRlqKVB33GKpL5U8sy6DbzwyahPf8ArSM49diQlXZv&#xA;hBrQtyq57nfFVlj5WmtvM9zrbalczJPHwWzd6otWZuO/7CcvgHY1xVT82eU5tdmtJI7sWwtg/JeD&#xA;MJQzI3pycXSsZ4bjFU21vTm1LSLuwWT0muomiEtK8eQpWm3TFVawtTaWUFqZpLgwoqGeU8pH4inJ&#xA;j3JxVJvKflmfQ2vDJOswuW5LxBFP3ssm9f8AjLirIMVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVU7o3ItpTaqj3QRjAkrFIzJT4Q7KHIWvUhT8sVYV+VN9+a93pt8fzEsbOyu0uHFj9&#xA;UapaMyyVDgM6hUHERnqVoWq1TiqjomofnBJ+Z+p2urafYxeREgrYXUTn1i3qSek37RaRlH71DRVH&#xA;EjeoZVT/ADT1L807S90lPI9s1xayrINZcQwStDF6sIEsHrSwhp1Vn4Rn4WFSegxVlPnWbzFD5S1e&#xA;Xy2nq6+lrI2lx0VuVwF/dij/AA7t44qi9Bk1qTRbF9cihg1hoUOoRWrM8KzcfjEbMAeNf9s9cVYT&#xA;+UepfmTevrI86JOoikA0717eO3BT61dL8PppHy/crD1r2Pc4q9FxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQmmkDiOIcpCK09vE4qome+hHO&#xA;ZF9MHcqa0riqMRgyhh3xVvFXYq7FXYq7FXYq7FVOW5ghkhjkfi9w5ihG/wAThGkI/wCAjY4q3PPF&#xA;bwSTzNwiiUvI57KoqTt7YqlekebvLusXLWum3q3M6IZGRVcUQEKT8SgdWGKppJNDEAZHVAenIgV+&#xA;/FWzJGE9QsAlK86ilPGuKujlikFY3VwNiVIIr9GKtLPA7lFkVnFaqCCduu2KpTqnnLyxpdwba/1G&#xA;KG4H2ovidl7/ABBA1PpxVB/8rJ8kf9XWP/gJf+aMVTzTtSsNStVurC4S5t2NBJGaio6g+B9sVS1f&#xA;OnlhtT/Ra36m/wDVNv6HF6+qG4la8adffFU7xV2KuxV2KuxVBqf9ytP+KW/4kuKrtV/4583yH6xi&#xA;qpZ/7zp8hiqtirsVdirsVdirsVdiqFvbH6zc2E3Ph9SnafjSvPlBLDxrUU/vq19sVUfMP/HA1P8A&#xA;5hJ/+TbYq8l/JT/lKrr/AJgZP+T0WKvSPM/6aEMg0uWK3vXdfSmncRp6QQ1XkUk35e21a+2Kooi4&#xA;FoZEAjFWMRk+JFkMYCu1APh9Tlv71xVC6IuuNYn9IzQ3V6FkEklqCE4FgY4+RJ5OFrvXb8SqttDr&#xA;bapcrNc2sun8h+joIUYTxkFd5KmihRy5Cn9MVeIaDpF75m8wpZ+uFuLx3kmuJKt0Bd2I7nFWXa/+&#xA;TtzpmkXWoQamt0bWNpXhaH0qogqxDc33A36Yqj/yMkflrMfI8ALdgvap9QVxVjdt/wCTYP8A22ZP&#xA;+ohsVe9Yq7FVK5mEMTOe2KqKQ3MirJ63HkAeIWvXfrXFVS3lYu8TmrxkAn5iuKqKf8dX/ni3/Elx&#xA;Vdqv/HPm+Q/WMVVbP/eZPkMVVsVdirsVdirsVdirsVQ9zexW81pC4YteSmCIrSgYRSTVapG3GI/T&#xA;iqH8w/8AHA1P/mEn/wCTbYq8l/JT/lKrr/mBk/5PRYq9G83+ZH0Wyku/q0t2ElWJbWBpFkasZcuP&#xA;TSRiB37AVPtlmLHxmrphOXCLR0uozLZSSAPP6aPIFg+KSULEsojj2WrNyoNq5ADemV7IHy55jn1P&#xA;ShffU7mxEglCw3gIb92VHqry+P0zy/a8NttzPJDhNXaISsWssfMc82vX2miwvofqFC19Op+rzfEg&#xA;4KT8PJ/UqnHw+jDLHUQbG6BOzVPGPJ2uxeX/ADJb6hcxNJFDzSaNaBwHUoaVpuK9MqZvQPM35t6B&#xA;eaDfWVjDcPcXcLwL6iKiKJFKsxIZjsDttiqF/Iz+91n/AFbf9cmKsdtv/JsH/tsyf9RDYq96xV2K&#xA;oe+hMtuyDqRiqHi1KKONIpI5A6gKaCo2264qq2il5pZypUSEEA9aAU/hiq1P+Or/AM8W/wCJLiq7&#xA;Vf8AjnzfIfrGKqtn/vMnyGKq2KuxV2KuxV2KuxV2Koe5soria0mcsGs5TPEFpQsYpIaNUHbjKfpx&#xA;VdeWsd3Zz2khIjuI3icrQMFdSppWu++Ksd8r/l5ovlvUJL6xmuZJZIjAyztGy8WZWqOKIa1Qd8VZ&#xA;HJbRSPzNVelOSMVJHgeJFcVd9Vg9IRcfgB5ChIIbx5V5V964q2ltChY0LFxRi5Lkjw+Inb2xVYll&#xA;AjKRyITdFZ2ZR8gSRirFta/Kvytqt9JeuJ7WaYl5hbOqqzHqxV1cAn2xVL/+VKeVf+Wq+/5GQ/8A&#xA;VLFWV+XvLOkeX7RrbTYiiueUsjHlI5HQs3t2HTFUmT8s9Bj8wnXhcXX1v6y15wLx+n6jOXIp6fLj&#xA;U/zYqyWXUbWI0dwDiqn+l7L/AH4MVd+l7L/fgxVb+k9PrXmMVXDVrEdHGKoe0vbe41grGwYiBj9H&#xA;NcVROsMF02dj0AH6xiqrYsGtYyOlBiqvirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqnc&#xA;kiFyOtDiqG0tFayR3UF3LFiRufiIxVF+lF/Iv3DFXelF/Iv3DFXelF/Iv3DFXelF/Iv3DFUPLA0c&#xA;3rwopfiVI6VBNeo+WKqMxuruMwPCscbbOeXKo8OgxVU0tStvw7KSo+QNMVRmKuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KtMoZSD0OKoJrGdaiCZo1JrxFCPxxVr6nf8A/LW/3D+mKu+p3/8A&#xA;y1v9w/pirvqd/wD8tb/cP6Yq76nf/wDLW/3D+mKu+p3/APy1v9w/piraWl6D8VyxHyAxVFwxLEgU&#xA;dsVf/9k=</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+ <xmpMM:RenditionClass>default</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:8BC7D877974ADE11BCECCFF09938C3CC</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:30267148-672c-4d34-8534-e8cce420f815</xmpMM:InstanceID>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+ <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+ <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+ <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+ <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+ <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+ <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:8BC7D877974ADE11BCECCFF09938C3CC</stEvt:instanceID>
+ <stEvt:when>2009-05-27T04:22:07-04:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:32300939-b1c4-8440-b812-b255b7b0d326</stRef:instanceID>
+ <stRef:documentID>xmp.did:F97F1174072068119098B097FDA39BEF</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ <illustrator:Type>Document</illustrator:Type>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>1024.000000</stDim:w>
+ <stDim:h>768.000000</stDim:h>
+ <stDim:unit>Pixels</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=138 G=138 B=138 1</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>138</xmpG:red>
+ <xmpG:green>138</xmpG:green>
+ <xmpG:blue>138</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 9.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+endstream endobj 3 0 obj <</Count 1/Kids[155 0 R]/Type/Pages>> endobj 155 0 obj <</ArtBox[0.0 73.0 508.0 701.0]/BleedBox[0.0 0.0 1024.0 768.0]/Contents 156 0 R/Group 157 0 R/LastModified(D:20090730214335-05'00')/MediaBox[0.0 0.0 1024.0 768.0]/Parent 3 0 R/PieceInfo<</Illustrator 158 0 R>>/Resources<</ColorSpace<</DefaultRGB 159 0 R>>/XObject<</Fm0 160 0 R>>>>/Thumb 161 0 R/TrimBox[0.0 0.0 1024.0 768.0]/Type/Page>> endobj 156 0 obj <</Filter/FlateDecode/Length 130>>stream
+H‰ŒÎ-Ã0 †aîSøõìø' ŸÆ‹v€©°ºûƒµ,$’õ‘<à=±FCáb¸Üï·Á8A¯-‚âFÅ{­(V(Ì\Eñ³Ããµ3>¿°Îüå¨IGIykF½µÝS><H‚朗7)dªÞ5×?úLÿè3ý£Ÿö¯ð`
+endstream endobj 157 0 obj <</CS 162 0 R/I false/K false/S/Transparency>> endobj 161 0 obj <</BitsPerComponent 8/ColorSpace 163 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 79/Length 284/Width 106>>stream
+8;Z\ui<k5l%"j!.(Yn<rGVB89DS9W38A;imV+n")c,d,Cr$jiKcnTe_@#q%%4(.C8
+HN;BSQ0K3*YFS=EP`>nRqnec:hag&4%a](-!f93L:A4D\h\gZ/n@lX;HcTPGfEHCj
+Q%6lr1C^ia9#<W0(GV,aU!d`IC%Y0XNP6><b7'6om5]6K!.0N/D61*)F/P7m\Pl,G
+gpGL0adN#/Z594=1XIk%(grE!EB@RojEgmQOd52KE0$6o\NS1_@3+<#Mt:Yj;B;Fb
+IK^@:(iq@&!<@UeLT(~>
+endstream endobj 163 0 obj [/Indexed/DeviceRGB 255 164 0 R] endobj 164 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream endobj 160 0 obj <</BBox[-103.108 71.3223 103.108 -71.3213]/Length 854/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 165 0 R>>/ExtGState<</GS0 166 0 R>>/Font<</T1_0 154 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream
+BT
+/CS0 cs 0 0 0 scn
+/GS0 gs
+/T1_0 1 Tf
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 12 0 0 -12 -103.0967 -61.2773 Tm
+[(T)7(his is an A)12(dobe\256 I)-10(llustr)5(a)4(t)6(or\256 F)26(ile tha)4(t w)4(as)]TJ
+0 -1.2 TD
+[(sa)8(v)10(ed without PDF C)11(on)4(t)6(en)4(t)3(.)]TJ
+0 -1.2 TD
+[(T)71(o P)5(lac)6(e or open this \037le in other)]TJ
+0 -1.2 TD
+[(applica)4(tions)11(, it should be r)10(e)-28(-sa)8(v)10(ed fr)10(om)]TJ
+0 -1.2 TD
+[(A)12(dobe I)-10(llustr)5(a)4(t)6(or with the ")3(C)3(r)10(ea)4(t)6(e PDF)]TJ
+0 -1.2 TD
+[(C)11(ompa)4(tible F)26(ile" option tur)-4(ned on. )41(T)7(his)]TJ
+T*
+[(option is in the I)-10(llustr)5(a)4(t)6(or Na)4(tiv)10(e F)31(or)-4(ma)4(t)]TJ
+0 -1.2 TD
+[(Options dialog bo)14(x, which appears when)]TJ
+0 -1.2 TD
+[(sa)8(ving an A)12(dobe I)-10(llustr)5(a)4(t)6(or \037le using the)]TJ
+0 -1.2 TD
+[(S)-3(a)8(v)10(e A)6(s c)6(ommand)10(.)]TJ
+ET
+
+endstream endobj 154 0 obj <</BaseFont/OUPLQW+MyriadPro-Regular/Encoding 167 0 R/FirstChar 31/FontDescriptor 168 0 R/LastChar 174/Subtype/Type1/Type/Font/Widths[523 212 0 337 0 0 0 0 0 0 0 0 0 207 307 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612 0 580 666 0 487 0 0 239 0 0 0 0 658 689 532 0 0 493 497 0 0 0 0 0 0 0 0 0 0 0 0 482 569 448 564 501 292 559 555 234 0 0 236 834 555 549 569 0 327 396 331 551 481 736 463 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 419]>> endobj 167 0 obj <</BaseEncoding/WinAnsiEncoding/Differences[31/f_i]/Type/Encoding>> endobj 168 0 obj <</Ascent 952/CapHeight 674/CharSet(/f_i/space/quotedbl/comma/hyphen/period/A/C/D/F/I/N/O/P/S/T/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/x/registered)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 169 0 R/FontName/OUPLQW+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>> endobj 169 0 obj <</Filter/FlateDecode/Length 3130/Subtype/Type1C>>stream
+H‰|TyPwîffz è$ÒÕD§“î#hD”[-±o!b(/˜a¸@e0‚ §E
+D%"‰g”C ¹Ed=€ñ
+1ÆMÜ}?¬l[[•¿¶ªëõ»ú{ï}¯ëá˜ÐÃq|Ž—Ÿ·ÇWþ‹<©U
+ouÔâíÊà˜ð@µ1ÈrŸáÜl!÷ù
+Ù£¬÷ïß{ˆà¹Ïgµ|6cÔð˜O”ìß«ZÍc‡heöË—;Ø¥Ó´tµ•9,]ºtZ:ÉÖ(¢‚”2ŸC­2B#Û)RGG©µJ…lMx¸lB#S+5Ju¬ÑÉ÷¤UÊù¸,èÌÏ·÷ðÙ‘|Î:'g'[çev²ÿv/SidJ•6D©–ò
+å~ŒgÇ0†Í4Á¬0ì ³Á°/1l‰ æ„c§ó!°R ?a6F=1o,ËÇʰÜ—ã øþÖd­I¾É„`³@!º ¿þ!Ú :AÄN"8+¶ï›š›z™^00s6‹2ùÈö£VsQjz÷º çåM‚t!—:é=•J@j£Ð*øV¯$C·(0S9â)bÏ´«o\3eÔÑ’ : ZÁí„ãøÏatØHŸàæä&ª
+… 5X¡°ýqWAÁe¾1×ä>®¶0Ι¿<ȤRên¦vÐðéŸåìÝ»ÏÁD
+xÈÃm·™o‡Kh½Á#ùØv܃:y¾<»žçÖÈ1E[læ!/UXFV #‰çÇm
+óYÉE~ºÂ>¸h¤ ’Ç,Çá<‘r®$­”½¡±-¯(ºÑ.½£m ¾ÂTÊ=Î9Óë}“YË>s1«šžèÜg¿t«¿U¤&óäAV’¤än „ÆY´ Â@×”QšÊþ¸.¼øóÍöÛˆ¨cí*ƒ.wH¯WÜ~Ù^ðh1CÖ—ðû.ŒÜY°‘FŸ:¹Y-îù
+Läì Uå~OéFÿ]^>g/(Irq,÷ú>û Øgià^CÐý©k ÄêºBc!½fvYT p”lä졉ú5ø-Z°Íû°ZΜó/oÈ¿N¿ÉÈsWH“ÄÈ+cÞVd&]ß´á·Þæòêï™,‚LÈÙ&!RÊô×j¤. ÙøMZRjt$H¾•Þ«,mûðÂ_õ¬äž®O˹õBxœÅà8T>#aE&ìÓèC™!‚l<9"Ê$<ªZ£ûhÀÀd Ö€µëïh¦›Ê/œÕÃONÄø”;u:óTVs¯¨µægz¢iÙ—Hà·Ún«M{<›š›–—'•øòÛÇúðêgÎæ ¥S‡&~M/ZÛ Âßï<Á²D]1{®[”¯ÙïO#‡ùG Ñ‚‰`Ýu³0ï<+i×õ+þ×lõ3¸8ÎÓc3@¡½¸:& b5̬"ç Ù¼X
+ˆÐi{~)™$!x63áú”'(&}÷¹ŸÓÜhg¹1Ì…æ‹H ›ÅÁÙ_šrŽ L Ãi œ‘?Ü Ù»bd[Ý! íëäÙÖøõeh1µšíÔ”ýÒ௤½Éhh¢gù¦šZS5™›_œ]®O÷˜Î"5ä‰ë8Â1×x—ïøûQÞo‰ã½ÕebÁ‰¹éCiçhIW‰Û+ºxæìˆÿ;åÉ6ªcs-rñ»veìö}þŠž,ë*ÿLTüõaÉ¡B·SN X’U°›‚± s¸|½IlgÝF.>Þ—×\ä‘SÇ:.¨|do·Õê¢uAL§VÊÈeï [`lÅÂh¾à'M¨8²’±7°2ŒûÙRVA¤ 
+endstream endobj 166 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 165 0 obj [/ICCBased 170 0 R] endobj 170 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
+ 
+V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
+€x¯Íú·¶Ò-
+¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
+N'çÎ)Î].ÂuæJ¸rî
+î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
+n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ߘß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!È¨ÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 159 0 obj [/ICCBased 171 0 R] endobj 171 0 obj <</Length 3144/N 3>>stream
+
+
+
+'
+=
+T
+j
+
+ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý#
+#8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<'<e<¤<ã="=a=¡=à> >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·O
+kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ—
+—u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 158 0 obj <</LastModified(D:20090730214335-05'00')/Private 172 0 R>> endobj 172 0 obj <</AIMetaData 173 0 R/AIPrivateData1 174 0 R/AIPrivateData10 175 0 R/AIPrivateData11 176 0 R/AIPrivateData12 177 0 R/AIPrivateData13 178 0 R/AIPrivateData14 179 0 R/AIPrivateData15 180 0 R/AIPrivateData16 181 0 R/AIPrivateData2 182 0 R/AIPrivateData3 183 0 R/AIPrivateData4 184 0 R/AIPrivateData5 185 0 R/AIPrivateData6 186 0 R/AIPrivateData7 187 0 R/AIPrivateData8 188 0 R/AIPrivateData9 189 0 R/ContainerVersion 9/CreatorVersion 14/NumBlock 16/RoundtripVersion 11>> endobj 173 0 obj <</Length 894>>stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 11.0
+%%AI8_CreatorVersion: 14.0.0
+%%For: (Administrator) ()
+%%Title: (colorbox.ai)
+%%CreationDate: 7/30/2009 9:43 PM
+%%Canvassize: 16383
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 7.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%AI3_TemplateBox: 512.5 383.5 512.5 383.5
+%AI3_TileBox: 116 78 908 690
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 14400 14400
+%AI5_RulerUnits: 6
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: 93.25 700 8 1780 1006 18 0 0 45 111 1 0 1 1 1 0 1
+%AI5_OpenViewLayers: 7
+%%PageOrigin:0 0
+%AI7_GridSettings: 100 4 100 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+
+endstream endobj 174 0 obj <</Length 6746>>stream
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%AI7_Thumbnail: 104 128 8
+%%BeginData: 6616 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDA0FFA8A8A8FFA8FFA8A87DA8A8FD5DFF5227FD06FF7D27A8FD5D
+%FF5252FD06FF52277DFD5DFF5252FD06FF7D27A8FD2AFF7D527D527D527D
+%527D52A8FD04FF7D7D527D527D527D527D7DFFFFFFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFFFFFA8FFA8A8A8FF5252FD06FF5227A8FD2AFF522727522752
+%27522752A8FD04FF7D2752275227522752277DFFA852A8A8FF527DA8FF7D
+%52527DFFA852A8CAFFA8525252A85252FD06FF7D27A8FD2AFF5227A8A8FF
+%A8A8A85227A8FD04FF52277DFFA8FFA8FF7D277DA8F82727A85227F87DA8
+%A827F87DFFA82727A8A8A8275252FF5252FD06FF5227A8FD2AFF5252FD06
+%FF7D27A8FD04FF7D27A8FD06FF277DA87D52A8A8A85252A8FF7D52527DFF
+%FF277DA8FFA8525252FF7D52FD06FF7D27A8FD2AFF5252FD06FF7D27A8FD
+%04FF5227A8FD05FF7D277DFFA8A8A8FFA8A8A8FFA8A8A8FF7DFFA8A8A8FF
+%A8A87DA87DFF5252FD06FF5227A8FD2AFF5252FD06FF7D27A8FD04FF7D27
+%A8FD05FFA8277DFFFFA8FFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFA8FFA8
+%FFA85252FD06FF7D27A8FD2AFF5227FFFFFFA8FFFF7DF8A8FD04FF7D277D
+%FFFFFFA8FF7D277DFFA8A8A8FFA8A87DFFA8A87DA87DFFA8A8A8FFA8FF7D
+%7D7DFF5252A8FD05FF52277DFD2AFF527DA8FFA8FFA8FF7D27A8FD04FF7D
+%27A8FFFFA8FFFFA827A8A87D52A8CAA8527DA8FFA87D52A8A8FF527DA8FF
+%A87D7DA8FF5252FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7DF8A8FD04FF
+%7D27A8FFA8FFA8FFA8277DFF7D7D7DFFA87D7DFFA8A8527D7DFFA87D7DFF
+%A8FF527D7DFF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04
+%FF7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFFD04A8CAFFA8FFA8
+%FFFD05A85252FD06FF7D27A8FD2AFF5252FFA8FFA8FFA87D27A8FD04FF52
+%27A8FFA8FFA8FF7D277DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04FF
+%7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA87D52FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7D27A8FD04
+%FF5252A8FFA8FFA8FFA8527DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF5227A8FD
+%04FF7D277DA8FFA8FFA87D277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FFA85252FD06FF7D27A8FD2AFF52FD0927A8FD04FF52FD09
+%2752FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FF5252A8
+%FD05FF52277DFD2AFF7DA87D7D7DA87D7D7DA8A8FD04FFA87DA87D7D7DA8
+%7D7D7DA8FD19FF5252FD06FF7D27A8FD5DFF5252FD06FF5227A8FD5DFF52
+%52FD06FF7D27A8FD5DFF5252A8FFA8FFFFFF5227A8FD5EFFFD09A8FD62FF
+%A8FFA8FDFCFFFDD3FFA87DA87DA87DA8A8FD5AFF52FD05FFA827F827F8F8
+%27FFFFFFA8FFFF7DA8FD53FFF8F82727277DFF52F85252F87DFFA8FD0427
+%F8FD54FFFD05F827FF7DF827F8F87DFF27FD05F8A8FD53FFFD05F827FFFF
+%7D272752FFFF27FD05F8FD54FFF8F827F8F827A8FD07FFF8F8F827F8F8A8
+%FD53FFF8277D522727FD08FF27F8525252F8FD54FFF852277DF827FD08FF
+%F8F852525227A8FD53FFF8275227F827FD08FF27F8275227F8FD54FFFD05
+%F827FD08FFF8F8F827F8F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD
+%05F827FD08FF27FD05F8A8FD53FFF827525252A8FD09FFFD0452F8FD54FF
+%7DFD05FFA8FD0CFFA8A8FD53FFA8FD12FF7DFD54FFF827275227A8FD08FF
+%A852272727F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD05F827FD08
+%FFFD06F8A8FD53FFF8F852F8F827FD08FF27F82752F8F8FD54FFF87DFF7D
+%F827FD08FFF8277DFF52F8A8FD53FF52FFFFFF52F8FD08FF2727FFFFFF52
+%FD54FFF87DA8A8F827A8FD07FFF8277DFF5227A8FD53FFF8F852F8F827FD
+%08FF27F82752F8F8FD54FFFD05F8277D525252275252A8FD05F827A8FD53
+%FFFD05F827FF27F85252F852FF27FD05F8FD54FFF8272727F8A8FF76F87D
+%52F87DFF7D27F827F8F8A8FD53FF7DFD06FFA827F8F8F8FD07FF52FD5CFF
+%A87D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC
+%FFFDFCFFFDFCFFFDFCFFFD80FFA8FD07FFA8FD53FF7DA8FFFFFF7DA8FFFF
+%FF7D7DFFFFFF7DA8FFFFFFA87DFD52FF52A8FFFFA87D7DFFFFFF7D7DFFFF
+%FF7D7DFFFFFF7D7DFD67FFA8FDFCFFFD26FF277DFFFFA82752FFFFFF2752
+%FFFFFF7D7DFFFFFF2752A8FD50FFA8F827FFFFA8F852FFFFFF2727FFFFFF
+%277DFFFFFF5227FD52FFA8FD09FFA8A8A8FD07FF7DA8FDFCFFFDFCFFFDA2
+%FFA8FFA8FD64FFA8FFA8FFA8FD62FFA8FD05FFA8FD66FFA8FD62FFA8FD04
+%FFA8A8FD60FFA8FD05FFA8FD22FFA8FD04FFA8527D7DFFFFFFA8FFA8FFFF
+%FFA8FFFFFFA8FFA8FFFFA8527D7D7D527D7DFFFFFFA87D52A8FD16FFA8FD
+%05FFA8FD21FFA8FD04FFA87D52A8FFFFA9FD0EFFA8527D527D527D527D7D
+%FFFFA8527DA8FD15FFA8FD05FFA8FD22FFA8FD04FFA852527DFFFFFFA87D
+%A8FFA8FF52A8A8FFA87DA8FF527D527D527D527D527DA8FF7D5252A8FD0C
+%FFA8FFA8FFA8FD05FFA8FD05FFA8FD26FFA87D52A8FFFFFFA97DFFFFFFA8
+%A8A8FFA8FF7DFFA87D527DA8FFFFFF7D7D52FFFFA8527DA8FD0BFFA8FD09
+%FFA8FD05FFA8FD27FFA852527DFFFFFFA8FFA8FFCFFFA8FFFFFFA8FFA8FF
+%52527DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FFFFFFA8FD05FFA8FD04
+%FFA8A8FD26FFA87D52A8FD04FFA8FD09FFA8FFFF7D527DFD04FFA87D7DFF
+%FFA8527DA8FD0BFFA8FD05FFA8FD09FFA8FD27FFA852527DFFFFFFA8FFA8
+%FFA8FD05FFA8FFCFFF527D7DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FD
+%09FFA8FD04FFA8A8FD26FFA87D52A8FFFFCFAF53FFA8FFA85AA8FFFFAF53
+%A9FF7D527D7DA8A8A8527D52FFFFA8527DA8FD0DFFA8FFFFFFA8FFFFFFA8
+%FD05FFA8FD22FF7DFD04FFA852527DFFFFFF847EA8FFA8A953A9A8FFA85A
+%A8FFFD07527D527DA8FF7D5252A8FD0CFFA8A8A8FFA8FD05FFA8FD05FFA8
+%FD21FFA8FD04FFA85252A8FD0AFFA8FD06FFA8527D527D527D527D7DFFFF
+%A8527DA8FD15FFA8FD05FFA8FD22FFA8FD05FF7DA8A8FD13FF7DA87DA87D
+%A8A8FFFFFFA8A87DFD17FFA8FD05FFA8FD60FFA8FD05FFA8FD4CFFA8FFA8
+%A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD05A8FD04FFA8A8FD60FFA8FD05FF
+%A8FD4CFFA8FD15FFA8FFFFFFA8FFA8FD62FFA8FFA8FFFFFFA8FD4AFFA8FD
+%19FFA8FFA8FD4CFFA8FD68FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF
+%A8A8A8FFA8A8A8FDD4FFFF
+%%EndData
+
+endstream endobj 175 0 obj <</Filter[/FlateDecode]/Length 15093>>stream
+H‰ìWiw›ÈýþÎyÿoÊxY‹·$Úmy¤Ä±;/{ ZvC“¦QìùõS  ˜VVœ—|˜ã·ºëVUWÝ2ðcië¿ÿYûx$e41;ÇLÅ&Ÿü¼ûºÝzN5,zÿWÓU®S±»ñ`uk
+ñï÷îŒ!à=NV™ (ƒ¿ !Þ 6[ËKˆÏ¯TJ…RrOÈt»~‹T±™a—
+Q¼óÊýÎ $\¥„².ê,BàçTô·³"T½ÁZÕåfÿN¼¼lyM¦n‹“û‘^4 Ê $ô~¸7±æÌ9à¾[öuÚÍÊòAAÉÉ…\Òì
+ YêL‹Fé˜^Iµ`Þ× ¯Ä
+hI* U°býðÔ(ÊäŽýG|= Èù¼RÌfsÿoz`ÿø#¢jÃÆã¸U6À½ã9X&Êt>4„xG™¥‚}òpa”:¬lçˆÀ㎠Uˆt´åáN/Ü´‰‘õÃÃ?Bð
+Á_Í0›/$ÉÓ1¼œI2?:YN"¨Át€n‰™ŠM1ý²HÑDš_p¯3Ôû|¢ 6© 
+ñï÷îiBãd-§l~'•)ÐÕìú-RÅJd†MÍb«ºý§‹zDHGüœŠþvV„ª7XïÄ…——-¯ÉÔMÀbqr?Ò«ÄõõçºÃ`Þ9¸tDˆZ\7ô[P©rÌîI…æHC}g¾Ù™ªŽ!:ö}è±ùÛ6ÖtÇ.°M‰ã¦ü½ï rSQ¤ÚÄD‚bp,©A\1ob&3lc.=Ÿß
+ùü^>ö,I‘zóØùü‚”L³(ݘ0<¨Ã¥£Žu?V‡ #ŽáTljÞ©³ùYÖ\'ÚØ΢â±öÕÆÄ$ŸÍe÷ãÏJl¶%B Ï^Þpå…Ã- –àLÖw:gÈ´-ïK½ƒ“u ’7 w¢+¾p'¦Æïv"x%ï±–ºø–KuЦ¨§ß…”Ô3l!sà –Ω5Ë|FÉíÈ;²ïß”› ‡©ñ%f®º†¯¡ZÜ9bð’!ÔvÝèaíœÑ¾Nðßø.è
+«EUDÜ!`{€h•9CC1kÖXÿwOÞ»WGºy¡†™üÜ¥–ÿc~úñ„P¨Œ l9ÄôñiÌ:+©êf­K¥òäù.fÌEÕo-ʸ‹«v:±¡
+ÿà©î)§ÝvKª õÆíÛ¦&5 ï)#>œb±˜UæEeUõÏœd¤ÔáÐÿ£iy¯l<ñ¤lû¬ýS3êð¹HŒFÐךc]u'Sšˆ''¤
+¢‘>#—Ñ]¯ìÇá0Ž…çܧDƒjJ?¿9µ:ÎÝl.à^œó»æ¾>jº¸ BMz'Ëùiƒ\Ö0÷µ†{SÃý% ³Ój9XÒPYIvÓù(fcK>mt” Í_6xTL¬“û1IH0+~YáëÌâJ,Á,®ÀÌö¾Î,ûufJdK²’CT’ULuÅããÊ+45fVˆK¯Lý6ºýøQm¤F ?èJ75úÅûëƒèa©è?ªiªÄѰôº}3ì¨uwO‹÷2 N¨½gÍ1î°md¹’À'Ñe“î|ëe3x·v¥k|xŠ]! p|ÇBª§h-~WÅ„Dè°E£ÚÒGxf‚£Câ1Ž88 ²â]ãwÛ Ê ´ ù¢ð0Âæ’#—Ìù”ÂÒqØ8Ìb®‡
+®©õå³^äi«Åƒ~ñòåÛwånuç2þV?îð}éø¦ñ¾th­5§‘9Ñúp¯Æ§/œZÿýU±BJäõa¿2äÕañˆÈ§õšª´>—ŽŸm\§íê‡Á
+­®5µæ£Êöþõj¹³½bŽx4®9¸Îlªu5ÿ2Sæ>—×öÖ7+Ï·>m–ª¯Uìüõôòlex¤ªèÆýK߬÷[ÃñÕŠ¼‹ŠL_ýt¨8Ó*díÙÆ6Û|ç”[õÏ.Ç¥£³á\S8º|_*›ê†±ù¤}´[4Þ=Ñ‹Å]û_Ö«t=Y‹^‹Z­Š ‚ *aRQëDkÕ:á\m­ÓýŸ$  íûž>çûþð
+X;¶Ò¤\¼9.¢ yô/ïb
+ðÜÆk­¿Ù÷÷Ƹ³„Mã£äèKvþUÝjĺ—û)9Öî„°iƒÞÝæfÁg­7í–ÕóiÑüìÿîµ›{¹þòÍs-š?êËÒ¹t£Ï­;Òëmxʚǡ¿ÝôzÈzs0îÄÑnu¨nY1žhÛÆÕˆöÝ´–údGJ•ü9d,Õ£cy'6,ßÔ<.`áþZÝ¿t¬õ‚MÓt9Ö÷ê\OþgÄ® ¼. ;ì ç­ã\‹ÿdõ'ÅõébÂs­Òç`t.AÿmýØÃ6ÿfúêjaw¤'×û CêêAF™?ªÌdùväÒÖâMÆ3}Pœ>ªó¸HËÓ©ú…ðÖ@ï¾gÔN§™ŸÇ(o•ï{Šž3áj„4-Æ`ï 7W"âËc%e¾« 5%Ó§ïhØ\¿¦Œ˜|VÊáÏ
+Í¥Š<2ÂHÚÒyŸ»
+µf²¿áŸV¹j¡Ãm{ƒ Ì k„:Ú8jkã&8kAž5ÜBr~ž6eˆ§f¤Û"P†v»«>1BX<ƹ hE•¥ç_w¬<•õ=i‘^ó ›*jî,Ôˆ8¯ÎöTÙ$üWH4¶hl»áAÀ{Æ(V¥ìõî—ýí;ESÎÙýâ¥2LŸ{îÉ×"#îÓÁ‹iˆÐçÃÆ!ÏÆ9÷|õÌ»¯¥ù§ÉñjXºƒñ?¨#Í2Å]lè î,‡[
+‡ê‡k9váMü(2€½à×ñrDgdÂÙ,»¸"š®à#43ӪǾêЃ”ê•ax²ëÛñø1V‹ÿÝh™0ïØLŽM4 Ý…õ¥ð€Ðµ^q0ZLx~Ð[c¿q*æŸaattö1@.Ì>B‡ýA ܆qq ·@¾67Ó­êxêˆCrüAØ“—t[lÞÎH#‚ºÆdÃ,=e9•вC胈˜•>ZëošwÞh€Ÿ€‡+Òé
+‡t#1«BY”P¶‡’éÎêz(·;‚oë3ïÂ
+\;7 ê(u†],gùoÍ€Ô³/Ý„Ýi³ÂJÝ[DŽÉq'À½ñ޾[ä=W÷à"™êÝ2ò“™ÄØlþ¬£ÐfQâeùÊùj¥´ã´úedíî?›ùm
+³"˜É=²[nV@“Œ¸—KŸK¬üŒ
+kx*y¼ò§Ïú³:âcìFŽÎo:wÇÿS
+‘0&‹^Ü–üˆ3ßFšüS'HÖYlHdªÐZ“1™½å˜ù©Å…ÔIÆJH¦Äˆ±{¬›9Eóg'Ä,iáÛAËi°€´8{XNRy‹Æct<Mh„x”Lt“è ­È·Œh®—
+‹IÒé­ß(rGÞ3I5gbÜŒáXDƒ‚*jÃØ‰b2ƒ˜,ºPûðx‘ÝÇKékÔb$”KC1É@ŽarN ý3‡… a³_¾Û"Ø©‰F
+é1Ɖ{çb]„ÝßJÎr¶{É“Ñ,$ËTÍeîs¥JhÝs,´3ð%n,†ªðpKÂQx40Ѓ rü"¡’HYlç/4 tTòœð¡—³"˜ú•nÜ7/ª‘ø™HßXÀòhÏ”K{-O÷Yúšñ9j1Ü&r“ŒëeG"t Š+g‹²%,¡D@oa3 ¥lm¦`èÊl²Ÿ–aÐIª1Ƶ—3ÅLxK&ˆ´ù¸3)yK”Cþ¶ÕŽlÏMìñ=BíðPbúåÙç[ÜH\"‰9]hˆÚi\‹¨ÇG0j¸xÔVåàò²qP
+Ö &0`Ó2е¨O, ¨G ËÓlMB4~b ~à.HÕÐpƒÂ颊òœ’
+—•zmáG‹O§–Y^©=¢©±o;n„çÜ¢Äï,QSÍ4'Ï©øy0ô' È-ЍÈ@õíC-˜„"ÿû"|g¸ÎÞZ¦a™à­b/ÃKR¬ŽÕE™D˜í%ç/Ä[[ÿ_D«\—¹çhíK]Ö¬•8ÿ‹ÇˆDÁ1~ïñr7=âºTŠˆá2omòKg"÷ᒫ†D>âDq Ä2ùBEÎ `q#Ùe½µe¢@É Úã¡oͤéìOü ©š‘ûê¯ÓÐè­·¥ÃýàTüwv÷=KÈžÒagc5êÛ•ªþ±uú?©¯}«5uc^©º;…˱qêÄFšÎZI“Kœ@+OÁMnô¿ Òp¡(âFÐ’sé°‡2¾ƒüõ´Ú@•Ȫèb6Mª‰øZtïÊépáçöª1ô櫵!S"‰æµø‰²vçùRƒÙÆE1Lå6‹°£Æhb Û;ËS%i˜=>ÄõIK4DI…¢â„A\æ¹"/N»¤6pHâ^ û 
+.—‡áìE"ÅTRœh ¨Un2C¿¦XGLüàuÄ½ÊØçÜøñB"ã?6"òh H™«’ºgöÅð—9ç| °v¢d›á\:U©ºsyº‡€xq¾#“ð‹dŒTŽ i¢s& ¦°SÈÌ’§ÜàK½™:Ñ——9Ìs>5(mDÆKƒT†,ýM‡ŠÌE/={ÈÀÍ2U¤w¬/}Þ¨gB§AÜv‹ ºvR+'ÿüH&rè3ƒ‹WwDUwÀ‚;Pÿ¸Ýu‹Ÿà„ÝFŸ©æ}””ͧ§} 9>6£Ó1¤ê¬ ¯³ö?A#­`Rްô â_iÐŽ>RQg4ž¾HFÜ)ðƒÛ÷”óµ)Ò4ro`Šº€økKNX °’b³„³§râî‡Qa¿z  ›©ûÆ£6бKe`I|Ýìó>HÓ
+íJ}³1lè÷üDï¬6¼³ryV¹¨hRç½ý$T.xÌ/*Ç[ízvúÜ|½) ¾^Õ÷ࣼ°hnNy¯Ïÿ×<ÒùûQõ<#CX®/Nö÷ëg'Õ«Ic8ÜqÂacØUÊ‘>oñÜ4 »ñ}ý´mÇü¸x¸v“ý«_æ®Nƒ·Ù¸#ê2wZ“i+{ô“®=7µ¯ýÌòûý.>—ù±Röô|í иñz8OÏKÖã«3™‚òå±=OÐ+9£´Æ¾Ñ—L»[(îÿ<¶=tJ Ùoa8™}*¯—Žw«wx7˾]² }¹¯¶—ÄÖÊÝÁb}¥/ïæ}kKªöÅý’Í:/1e‡£bëEùh«ñÎz²þ…mo#Œ•{c½æ6w¤Íþ÷0w³'¥ë(_«O7•pÖòãSAhVomV^w×…Ÿ‡›úA­ÆZÆòE$ë—Rù±ÆÊ½b¥p~NÃ,¼ß—ZCi X÷÷‚~ÙžÏY{ÛÛ¼ЇüÔfšânCêøSûL_Ú=ÎZ[Mmù¥læî÷ÃY‹¿ÃXÆ&®Þj6q«Lÿ9,~ g½éìn¼W­n+Û0š‚ÍjÎw/ê%½øÎZÎ<fkÚýM+TÓ_™Ý³Ñ®`å4Nj:§A®nlh-‚õñ¥ ¼\ôC}]Xmë-ÿ0
+4ó ß »õ¯gk<È…ý ëõ׿ãœõqÿ¬Wgc¢@ý-6°FÐÄ
+X0–Ø£Æh4ñ4‰(øÿowAAXïò…»¸°ïM{3ã5 ÆÚµMOAåÆþÌÖ—<Uq
+þ¾{ÿ§`qZN‹±ÎúÄðëŒ/êC§8§ÕŸWkiÊðŸ×ë﨎Xœ~ï¶¡Í2a8Õ2m8ižFkóçÿè”äæÓé®wTFÌél
+•F«ð OMz´g¦ß’cB²ÚiVô¥Å# T((NPâ}ý·$OÅ>Í/h厊´ýàßj †ÑƒÛ Ó*ÖdZþð«ªVï Á~ˆ>šéTåƒ&§Ÿ…O€Õ{×X¥÷ûˆìv
+7åùðŸÌ܇V\µ9ОýIºY¦ܸ¡ßꘙif!°GÙÇÀþ˜<ê8ñÍlÙWw ëŠÂîáw1ñ—¯(ÚÌ
+
+q›÷Ʊ!'u°MKáôAî7qÒÚš‰Vø¿]¥rJy_”°œ
+^5µ2Oác±µ-b#…—dWF
+¾;g˜p#ÃÒg¤Åt³Ð 1eÍ! ø÷ ËÜxl,¥³Ö¤?[¿á­UÃ.·í=ßô~`5øãyZÏϘâ<ãt ÙˆósNõž`–×êpyœ~!,k7ÍÐ/ÉØ¯p)¨/Yî6f£€´–%lÓìCÒN'`žS6–åayÁq:I83
+,¬± «á¾<¼·Õ ,ÓW çÒÆ0kÏ8‚³U­C³Vxø×s°p‰e“†Öà –'|ˆ—1U(E·´v¨:ëq`™Ó­¡~‘Ô,Ñû¾ýѵö8²jih„ #Cƒ¹ð 44¿V†f¸tnh07côžeQ‹ªæœÌás3 ïÉmhÞâÞ$/€gx ¨uÌ u­hLåÇЀœnÃû2wϸ‚ÌÓÐ`ê6Êf Î 6H$nõYFŽch`¿âØZÀjâþ‰´ëWAœþvcú¦Ñ±‡…Là›F‰7Í*$gˆå–_V4,Cx:ó¾@’O–dzߌ‡»ñ0ú€gà¯OÖ½!GÞ´x:I›CŽ=Ç“ï}Ä÷„N;€ò_VL¾'Å-Ç~B¾mýŠI|Ù˜B°7ÜäÈŒ%ð È­³¼²Î°ãÑàé4$K/+,¡)<˜ …”úêâk›ÆµûdÈ™å⻀g©?·µ‡VX‚ÇÆ§Áqåóx°„.´“±° x^ mð2L,×α´•ƒä0^Ä#b „$¨É–öW@L4‡¾âÅsa*U¿ò}h
+3‹ç,y`‚J¨™(–ùÿø`£í47ÑØúOåâíéíBzTzíBì·t#¯F¹—\GšÇË¥XíAòMkm)Öî¤#a~§BÜ€ÿ(+ý¡2¹œÅ»bGúw&˜zLÝT®ÂƒH¾p•ªŸƒñù.”×—†_9M\'´ª“oZŠ6•[9ü|+¥Â ¯ÎÔ?#é­#%c·éï
+æŸ>­óÊ%Lâ–-åó-S›¡M™^å]´M 5íäüNzµ¶>çˆ&ÜLgû¦yU1Ã1‚“û·m» ð4-]ñ'³/¶Ñª}#ÁÅuâ³Ø)~+[©nڪ̈́ã'‰»÷M™?†” ë'½÷9óW›—ù‰á`_§žx:{oAÊ·ô´UÀIðÏ Wŧÿÿ*e¶ ¯b¼4|—¢­nXñœ=‰è_5[6r«=™n‡Y“´tíÀãçáÖûu©:ÉcÓ¾.²ÍûF±½é& MÝíhMB§SõÈfÊ•Êlk¯Ó$ðV@¡…‚³±P, ]4„¥¥,ÅfSÉÛ3Huv´•£hÌP¨i aÍ “£`ȉÚ9Rè¡Ù¸Õz€‡·VøŒÝÞƒ;‡V@ŸÃXùÛ—L"Tb"®[p·äU†ã|’ÄéÇ´·ïÄ uƒùwî'~ZúP¬³C73Á·À²ï_àbêp‰iîTªVjšMÆ©.ƒð ÔËÜ@tqâ§Åì7ƒu.Qz¼¬1;WÀf´´û5³î—L9^en¸î— [¥r¹µ.è¸iQ[+ﱂûÒlÔHN<oJu߆>úà
+PB÷–?¤OÛWm¹®‚à™âÅÈ…f Pž]TR½¾,]_VüÛ훨â$ðW¶co ¤ÑG_Õ#ìWe+n2À[ýµ£Ù«^6&j\~^«(;(ÕÝ%hÊn´±æ[¸iœÇ%HîøQZ€ˆfI¹û2ùjAãqÄa$ýÙú -;ðŒ«a|[fGЪ~lØ RH‡¢Î0ÕÒLq;O¯†‡©àž5vÊÆ½Ó
+?Ð<‚U©0³ÃÎ"i«+KßÃß¼àÄö¶ö$ï%ê(+ŠS·Æ $r¤£áÆ&Püàºà3 Pâ( bƒ®
+(ñÚFS1öÝ·n=Zµ÷Û–uNÌ0¹5Ž´@NÃ¥óœöÊ”©5é­2\¿Þ_•‘ØxM^znðÐD ·ùί„áVƒ'Û¢NšB—¸]Ô±)1®€ý”êtÜþ/À
+endstream endobj 176 0 obj <</Filter[/FlateDecode]/Length 17828>>stream
+H‰¬WYWâÌ}¿kÝ„!B2…  ai@Ú¡‘ÿÿUUBÈP_jÙm<óÙ{ŸÁ,Î$¦_Ûh±(£EZ Ñóÿÿ£Õ‹H57ÝÜd/}Õp;µMÚÑÒ
+³1¥ ªu6À˜Âû nÎØ8áF†À VC¥Ñú<€½Ñ{É,YÿèwêeZc¸ž˜›lW´~ÑÅ;ÈëÆX¹ÝÑí6øú¼@Dºÿ–¿ò±NŸ}ÑGƘÈÛÂÒ«º7{ÇK÷Y>(fNŽxËDædõ¯_$Ú4v ‘šÝô@“o\“º½‡½éᣦI«Z£
+¦ÛõŸ¯1P¯ô1øSÀl°îMÄÈŽ€[Cóg3ª¢l@/õ·z-s¡ÓX e³¯Í…Ô!3lÁb1›¬ÆMòVö€{“‡"HQ@Kj±U@¬0®Zò’BX"ÈÐ}à þ÷ý2ÊAÓî L"è¤`Úh!‚°È5iÊôI‚oàI©×šõ‚°hOgŒíö¡ÃcÌŸ¿€j7miÒpp´ö®€{ÚÔëÄ[Æ¡h¬¹hl`Î[Í‹oö” ܘYT£U.¬¬Ux¼A” úlV~ñwΰ‹>+ßã²²‰’¡°K÷V>Èu€|ó ,Ú}Èʦ4uÉÁÊp6pYÙ”¡Z´Ã$Õ :î÷” ¯µ³ëeÁÊ&
+UÙ“•¡I<V6Ù;œ4KVÎ…h[VÖú®§ d4¬œ 1Žý*3‹Ÿ~<þ—ÈÑèQíÍ’adO#éC“G獅½„Jk.ø…{Á®l¾!1.¸a´Ä6šX°z¢¢€sÎiÌ5²¡ ’`Q’?±°ê9{´È…b&´PÜ#¾úŠ4ý¥ C®1ö%@ÕlÙSÚÁ¤ŠKˆQ_ƒ•>QÜpT©®2µ5ßhl¸âU-ð¦×ˆÉ'8Ku­ezÆï¢åTqù#™Ýµõ…$½T[Å
+‡JÎÖ@¿
+ çÀ€”)±IïÆ.±ùÅWÆ5Í4LÝòS÷¢ùÅm
+ÃÙ\¬ænIL§hÙZðîoëÅ5Í&…S´l-ð/™Ÿ¸Z«“Ö
+’´fíûlkº©­…°°†y7ñHëaTi ­'S¾srÝ€jÍÿ{•ûRn>(BM‡’¡ýQ¢ëÏ>äu•üÈ3‹·ÅÀ¹rzÑŒ•sÐt…áF§^G.©ÍЭµ¸û%7ê‰k€‰tú†kã-7ºY‡l¤’ÛöÍskÜÃÕ§ÊiD`]¹fjŒ]9GD#0¢ÿÙ¡`u°zï’Z4Ö\Â:c¤ ëÚ±l0¾û±¢å"ð~S> ‰§×°:
+±­Õ m×NÑæ†ž¿Ö¬ݘç\²èqi7ÜÜ’Sä(DEƒ‡(˜–šm€X°£A¬­¸ý)‘s£k,Ké’›Ä<^k¶†p ÀÊŠÖÝó+y±&+ˆÖN1”ðÎê<4„³çX𸧏…|ãH¯L}c;‘̲™[-žé¾±Ú½ÝÑA¼Á×ç
+¨Sþ;“oßɕ€ÉÝêK^‡›&àКæ FÉF*3aFk£ 24èt°æ€ìL©{¬½_Õ‰y€àb tP:.¹–ØF#W¤ÜûPʵ[çTÎHpFäO|FAø-S”åâ=mW(Ð'Ím÷l®%0Ú?^-Ú~÷ìØà­Ž$ʉ•;P°r“ÿX¯ÖµÄ‘ ú,L@@D”{ @tÅ뀺¢#¼ÿvw’tº“NàO¾™Ý¡ªºêœS§~÷×¹ÔƇj¹t.õ°©ªn}ùNÁtäl^£œ‚ßm§×ÕP̧Y§Ô¢Lé»íœ¹õœE¡´Ï¬“à‘DZæ€ÚQ¨Iåal­ˆ‹ÇZ0QhD¡FZ裨<uq¦#ùLÃáÉ"yÖqÚ¦<z¡¹=-lo4Så§ûäÖ+C„ùwÆWY¤ša
+¥°WË•`ø4rmPSH¶…ÄÛR-Sx»PákhÔõËÛ…J’M¼§¤ä­®ÐNå»Âþx«"±¡P×oKƒBŒ
+F†#ùn( okM5©»oAM&" 
+—••·è(ô,kgÞZ ”ŠQw?¼g/OHC³ö52ŠÛ6GVÌ|Œ£$¦tGŒá5ŽU`tC%/~ß°í]èNV†‚!}¸{-øVÇÙëû­=Ásf<€Àšb$‹À[ 6b‡¾^h5PÎ*ãÅîz
+ihÀm4èí0½ÀÓF€µÅ·vL¡ m
+_㵕aH¿[‹§§qnå|4NÝÊ ÚÀóT°­dêVÎGE×y•ÅÙzLþÇåãè£o¾×t ‹gŠM>*í'ä6^ÊŒ·¥'A¿X/8ÐÃŽyßX8ZGG%I½d’Ó)#gC~s–‘F”5a«NSÎ7“Ã…à¡«E>š ªHƒ#ùñsT0ü—õ¹ô/¡I ,žnÕñº.¡ú~ðUp…Nª:Wj§Í…¬ªËjñ¬ùܶ˜%T§ 5Í™e½×'óUÕÑÔu™]w·
+ëR œ<Êo}9¼ÊýDI¿WÔÛ:·Êý)õL)Ê>_[õ×ãrö$†²zÙfÅ Çm§åÊM|1º·€#¢<;¬€æšÅ|í~l4ƒÿ®üÈ‘£"—={Úw÷•þýÍÄF‰ôåÛVHƒø»yÎK Š ñðʳº,9íÅ =
+OHâí 7ijuÐf
+w7`(Ph½&Þê¸ïFí­s­zc³Ùð8sU¿û»œbÃÈŒ>.Ͻ¢uËVC@Ä¢¥û/÷h`^…”g´,Ç-³› )Ô4kßE†h™?ò³Ç3ÃU†¥iYŽ¿œ}L½¢)bÞ³°\¤9¸þïêų¶K!Zä_úü‰¥i-ž J v¢¸J}Uú•ú_­¨ÚLÝÒyÍÍ$ _B¤ŸApýåïæi~`çbö/ßú-ý,· Ý(`Ñ¥Áÿ½Ë”/Žœþß"Y¹>/\)ýÉã³(U'ïr¢7ˆ7BG÷¢Å˜Mù‚ë¥qÝÛÞ7D§€Ä&ïm¹¯Ê­iˆM‡ÿ¦Ý72Á“ÉŽÝj3dÐ@Q<ˆÖ^ÑpkÒÉ“¬ ²ƒ~‰¯W)2•±;Ävñ‘£ÁP¿¤PºòmÅP˜éÑk\n$óuls˜:HO½@!´·Î a,RÀsøÑî;«á䣘á„p‹‚4[œ·(Žø^gŸ³á.˜Ûž¸Û¹@–êÞ„åU #Å\ø¥L–˜Fd³íj×4×p6ÈZ[NÁñq”t
+J‡•ód@”¬:è\ªzwÖÞWç.37´ÑêMÓ¢YàJíÑ.¢•ÓÇP´´X¤\¦uØ´©ðRw¿‚Ø*¬Kõ‡•B
+ҘѴϬ“ài' ÐåùYËëð‰×ãÚGP;Ò¹7>vˆ‚íúAã>Ø~z+¯uRuˆ7’zÉt™)*¯…€ÃúdÂQ7Hc½Ÿc<ÒÊ ã §º8Ij½Þ4[÷•áÓ%ëY“‰x­ù)ËY“C
+XÇ(K®ø*‹³õ ‰<–Eì^ÂkÓÅ,Llžéý/Ú7Û~~éÙ6=„Îæ%<ÚxG¨&Ì&/Ôæªb6š†~ô;‚@$ÊKøŠ¹Ã†¹%ÍÍ2Å>4g<¤[ƒ¬­÷ƒ¯Ê€+ôÁsÅpåæ+ôÛ¨çzI+úæ9¢ l /빕I»VR Ô<·öU Wu¯é¦Yî: 6À«@£º3{‡ ”ewÓ£áÏ­¼}&ñ­éT¼Ü,Û0¶ÕEÐ?iö4ŒR¾{E­!Íß0r¿L–ÖÆ ”F ñ$R‚¡ ûAL£йÌ0çèCئŠék÷èܯôšî=44Í*D.=tc MsXy]í±‡Pl ÉõC‹"(¸¦¦­‹,W+Ó·.n|…Dë—ªŽ>BÞ-5¶7x0y6M‚U&€±/i0®K˜Æ³U¬V¹Iðɲ9ÂH†Ì{3]ö¯Xï+ê‰ pÀ$X„Ó
+‹b?š´%$tXýl°–C½o` Çí¨(EÐ;r:l²¦YË6uúâ[-qï rCvsíXÒ€2ÊlíÆ½ë‘™xoJ•[Ó‚
+…ˆÐ—gnŽÛH‡Ñ 7W\¨&Íò®‰æƒNk;{ ›ŸËÈ„G±Æ.·¯c¬H§Ý ÷"Vÿs¥”}||[
+ѳHâ/ºÅ¨Ê6›ÐÍã ½ˆ ñ¥f¢Ò~ì=”KÒ×±áÉ?^îÇøhÝ•YЪßb‘=AnúÖn”àƒï˜ >DÍ¿æøâ¦L£‡½Qì†úŽØåñÍkkƒ#¦$nRBË«jVÆw{îÍ- ÂRœa„¨›-“gØ\š4;5ÏìíúæÜ« y nk8"?Î9˜ÜýèÜ §š›¸^Ы‰Ù¼Ú²[e³Í[ÙŸ„S?!BÉÔöc‡H:táÊü¸ý¡‚¾ßlèãþzŠb¥ïǺÛLL¨òot*è³g¹¶Ší—kª –ú£Ýe3Q[˜V÷gpeþkñÝñúÎÏ∗w4wÅö•v}Ó¸ÀŸêáôe¥=hòš‚r%¿¦€¶$­ULˆ ³
+~‘ºœÂhØügÖ) Í}ø‡Þ3¡€Î؆[³ü§à»ˆõBÝØÖÌ4 ü&¹ÌŽÓݰ¹Ù€•£úM„F40H"ÈŒ‚V¨k
+h?ÓÆ \âå³õ¥›
+ ›{"¨rAGÐ&-äR@(š V†óËu›•;–ÌÒ+_P²áæÈ>‹÷O„tÕ ämAÿ +¿-¬|1 ›ÿ`ekà¡X Z»î/XùüMnƒÖþ„•;–¬çf„; ý@BͱòÅP8VÚY.ÍÊG¼íù7¬l˜<°ò…½}¥ý'+Ã=$Ç]ce„°v¤dèæ×¬ }5Ö÷òõŠrã£Ê>êðÑØšìXÖ‰&ß7÷M^³‡ÜÜ1ÙÅþfƒÛ)íb‰ûå×Òý6V͘#é“´Ü xf7+no1ÅùÁ Ó*›
+Ø(Õ³iq¦làÛ*÷Ç?ë²w§¿ÌÄZñö ›_˜\{4TràÙDé­…Á{À§˜®È¡‚×°¼#é¥ÁÅ w䟄d¬Kª*uköÕg&Žï@;™ˆ]žêM¹PCÓ"y'iÐtó IH¹ó-’ê×K«»ºI¹ó-ÊÍPô0&)×j&à+¤{Ø=¯ÖþýÉ/z¼f™ih£Zo'ã }:+oƺ6G“owµÞÏ&TáУª”êÇpht°6ØSxû<…2¥`®8…%ø&•Ï;¨÷Êt¹ì[èµ®õZëîkn´¹ß·»–EÏUÁÖõAC£ã8“÷ó…9צAõ+êÒûùb‡ŒS+…¬éDbÝZÌ”¨Ò÷m}¥Vó¡ÒÎl @±ÅA“W …ÌÓ<·|î±{9øí¾Ñ
+m¿Ò¤?g»ø{¼C.H_J¯7Ç3èf{¬jäþ2½‘<¯£¨®Ó«‚“4L׋í /Õç‰%*[h]ÑB¼Ü¬˜} `x(˜s^Ìct¤˜u±Óˆ
+ iÔ{ ë\y@‘ÅŸ@±õ,€òg·*øl*ßTi¨>w%Ð|¨ ¹öh •rÏ@ÛY°ƒvô„ntýÅë+¾É諹#¥o"ëÆÊº†&“:ƒ\Ñ+0#Ìù1ÏÅË–;$:ø g­ÔKqÛL÷*:ÐzÁÛÅHÈRJ÷Ü®’’Ããùè€AàbÐ _òvŸu=@–\1¯»ŠŒ9¶ù>•Ò¾¨å\ ¶ôÕGÚ
+èü›•6¹”úzָȢÉ~oí“l*¨úsÐ Ç–òwõ”dë™V˜ïå;ONêE:}¹×–sè95W4êŽ\…Ù
+GÁâ½)~ŒJ-a:àc{!{Päzo$0‡Ñž»A$°Ã/ÖÆç¡_*¾Ã’}óœÞ‰+Æ·è¡3vq#Õ•&YûYl&
+’/bßÂy×Ñ4ç]õY%lää*燩šÅÓŠöÆ'¬ ÓK.ú¬PïUñ¤4µ8TbÖ(úk)|½ÆŸ RáBèò—Òq?MÄ‘«n5J ƒéûcÕ±ª6tI”}£ÉTбÃÃpή‰p
+å]ŠLg‘ ÙÂE4bŒÀý@|g …Æ/­d¼ÿ&rlzƒSÕµ±ß?]C}£HOO3qåÄQ %?ŠR©*f¹œ±ù„‰)ˤ8jô6ì 4­B4ƒcCXxÍ-Æ,"«Új=hªNïx‘±áŠô9lË='VÜòß!©i¦(»1wyÿ¯¿ *°K©Ï¥¼?«ÃR¥ÑÎô³iŸ‹™eÙ&÷òIȶ+Ât†»%!S)?9³ò%©lC3-5ÕZ
+1oû¤¡»ñ
+M¶°ûk4«5~–t.Ï„IæSWÚYGÐ%W´$¯V«saÚï“|©¢‘R*U Ã¹´;­ÈÙJHÁ(ǯϠ5˜<E6cÊ{“l\14ÇŸŒÚ¨n®Ù
+3Cº¹êæ™ê—ìa6…ð
+a‚o«¬x$–†¨>òJzžq‡'›SS®ØñÎÕÏ…$/-·!ý»‰øþfü…˜^NäñÊK/€“ü,²€æ}"!ˆŠ>ì@nlO˜µpxiÀí«œæ»çc˜JL˜dÕÜCO ´Þ¸`!Ñ
+w 2Æ×™\š±¯vE°Kd’áqô×>){¾ä³ €~XÚÍŽé¢EÊi§_¬V$f` †«whž¦Y{W½=q èµ²Ÿ¶ÎTjK©QZæz–“„
+ª ƒ0(\äµî¦ûÚ-ZÿB;  íiáþzظ‘&ºë ÉÞ)]ÙoT­¡)Æ&ðš ËÉŸ(z¬Tªaá¦^fÆ<+£j*êdäÊɸ?Šè—±X£¶ÓÙêBÊo m=ÐögŸØó´4Ã)ðœ=™&½U͉ÆCb­[ž­‡aƒÃ}ÕÉâs*\0Í Ýa΢‹Äé#¾Á&OpFÙâ;y§3YÊ„…Ú(©äçj—CƉûpeðÌIŒý K~»uµ¸ŽÖž.Òyašåh]Àž» ~TɨÇ÷b¬\†ø…ÎØ2£«ôGêâ»ú u™>„)¾ÎÙlv¼eЬ¯Å–Z[Ó6tiG›cæ&µ%ô÷ó¬Cg<ø–dKÆ„è$®;€9ëpÓnÆwN „€
+ÜÊw&ÞF^]0ö™}L诼OT˜ ¡E2n´cu¼ Qgª@¯Ã.ä
+Ð73dxK&~8¨Y€ºÖifÕ–6çzݸ…Yr6à´DÀʉ±Î)YyLsóÜÔ–ô£KÃ2tG»dV8£Å7öèFû h·?ƒ;éº:IuèòtnCí‰*½\[ ×jÝ€®¸Q·˜è`58îüÉ“mÉ#=™•£YµåÙwF}s‹qA]ŰUdönöDmi3…\gÔ5Ãþô„Šl|&0ÈØNíÌ-°×zÿb–qÆÊäüÉÂ÷^
+Ùn@úñï¢ðáŒ&¹~R®ž˜>!§Ò}"±êíxi„ƒL‹sºú¦¢ùæØØœÂ¥3¨ˆvò8]Q>*ß«êeê¼y§Â>Xµ«@lé (y°ÏëÊL`¥2 ohï¢7{——%âѪ†´Ã†Ú@€#gœP®«7£Œ^4ŒÚ±D{uDßEN‰{9Å-'4x<’ÖiµùPN(Ì1-Ê8­cÏܹ*BõÝÍ©a~vUôC9!²y$­ŸåÄèÔiø‚”ÿ.ª:wsjsB®óFZØÈR^ÞH‹ýaNæ¡´ɉ;ç„úæOQå°ÜÊIë›cZþöÊ÷z#-þפ
+[½Õ_ŸÈ†TËþúÕ¹ªî†óøªo„åÙÜ´{tÉé0/œûMô‹fœ‘U-¯y
+o³‚ÐëȲ3.v¶ú¹ÍIÿD%f%íPÍC§† ABØ £zÜ'Ì Ô\‰æ] ×d…Æ(’ªoáçÝÑ_KóèM‚`ÍŒ´ºW¸‚0A Eí~ZW¸‚0ø´öA+Ùx’½¼!´žJûù´Q¥Bî ‡ Uìlî@‹S*¼~ÂÕ‰Ól­€÷.´WÐ:âj0ÔEa~¤Ï_@ë
+WÿBÀZa‹Ó·¡E¨Ow)+ aºÓ{ÍZ~ª„aÆÐJ°[ù´|® ‹ŸquÐíô8kݧ¬ Bkg2„žä*£[ÐÒULb†ÕE }}n³#Ÿ+T™Òs…5q+YÍŠÅõ7Xö7{˜¾Ã²'Ší=N±—óÍc­ðmŠí*£ìÁ@Ýð?To¤7ßdY|Ú£ðR,„ù.Ë>J±og\A˜ï²ìo(özĽɲý_@w<ôÇ Ê74‰©+\]VÓû ´ìlkÜ3¤XÄFÐò¹zA±1´FŸߥØ[€þ)´–ª!e¡jþ„µîS
+ó´¤Á¯¡u…«k@ÿ€µèû3‡v(RÏÿwæÐp…Xà -±çqCë õF/lDY Õvá´à‘oB«9W ¡õäþ£½Êše–èûDÌ»]@EqDv÷QlÜm7÷]#¾§ûÛohoã̯ïÌ‹ÑteVåÉsN®^q…jóÃ`ÙéýÁ™ÃÆ•c9Œéß›9ÞAà_Aë—3Ç]ʲ½À;þø$kÙäq—²ò„Š<ô_ž9l\¡Óü6ku.?7†¿VCó·fcþŠ«»€ÆK¿€Vôù´¢§þ=Êz |üj°w %’ùÑ£ò¯ õW7üIhMfÀ\½;Íÿ-—Oîk?¥,#—ˆÝ‡Öd~ü$´>àê. ? -Ëø)e½ôŸgïQ£î@ëž×úÝqöÞ,ûŽÓ>;ΔþµÑ‚0ŸgÏhq{lºDæv¶ÎpçÚ@ÜT¹DTìD
+¨–QqU!Î<Sì·ã‘r3Ö†q ÕÅ©J¥™T]þ'$p1¯\*¸ôë_Ek•ÏôcõH`EûÈHIØäÚÙÌÉÉ7ÒbŽ8Ë¿Ëæ=Ñ#lvåäÖZ«£aõ ÔõÀH.b8¥«C
+@v0„dpœà:„ˆ‚“-]ce‹ìú%+3¯IóøPÏMÙ aØ ÅlÅV·ÓGÕÐtÙCÿTTÆ£ü3€“<K¹ŽðXê‹5{ pœâA
+z³
+[t‡èmÿ9ó\RÂèÒf6’ êèAÈî‘Ñ3#¤jžY›)ŠFKÍžr5uÔì
+O„»"U2[‰4k!Po£|5­Úíe`SLr;ëÇ”‰Ö®8(…¨,ÕÎIJ=~¾±[g-M[Á–li§!bþ†ªDŽn98> ,»„³Þôlëk@b L6OÙ¸£¨1W<…(«BÆ¢å³: 6Ó†KåÚ$èõ¼ý·e¤-ˆ^¹=Ê$…ªdö¹¨Îàñ6ðÿŽªJsº´¿zõ9˜Su>½NQLZ.aFö'‚.l[è?Šv{zt]šÍN®±t¡Ï#œn®Ë¹wMÙÓág3VÙ\/§ñ^É^KŸ1‹ôb´àE»vÄ—ÍÅ®—óäúެéJâu7ŠT{¼oÚ•F¸}’Í6{y‰«hÆàr%/ä”÷!
+ÑSÐJ¾¹â¹ÍZ.âMÕ¨ó6ú8ÜCÅ\ÆU?R•½}8ÈÝ{°…€:ïÓèÒTa=ÞÜV0޹ H+º³3Â÷*¯b¥\ÊáØhÈïq{'ß)àCý àÓüÏfIÕC¨6 œ[Ä­º´XRa`¾Öå-¡"ëMDz‹K7²Á<ŠÆNºÍ9ò,ê½2Û"}ç›@¼b§Ö’inçr(Dµ ÏA½÷t“x¨8¢cc.²BïY 
+a¢ÅèfŽ6ÒèR].LÙ#"€…£»’‹%u¯¯bÛ»§iÆh¾N¥,*³œlµ¿c¬|Xªä¾‚
+‰¾K¦va ÌøìBOÚ ³Vß®úÊÄëGÔ‰|U Χńê7ÄêŇ!ÂÌËÖà„«ž ?è·l‘ë·Äànväu·‹f#è †#y÷IG*
+;{D‚Qä™ÝÁ a@Â:˜P_ïýŽÿŠ ÅZØ*mìŒøþ5’Q_¦VLt_K°m
+—^)ª)æu|nÓ:—Îu¸]c†úñ·B j"ØÂ±œ×ô/RuÂ\)á…FȪbÉj%„¯½Ô­°2¯:¨Ép¨MM‚>ý‡ûú…¦èÔ·d‚N| ×/kóX=.f‹í·à×/Ì×/a¡‰4¶Óz4MÝüç,ïŒËÆÜž¿¥¿……'©PH»©‰þ¥B¸ùÞ~€Ù°T\‹
+üA`ñluÄÑ­9eÌÿ²^ÝÉ*Aø·Ø*b‰b£K좉=¯]1vôÿßÙÅr“¿x”•ÙÙ™§Ð¶þÕÖ©—?8$“§MÞ<»ËS­È²…
+2y¤cR轚‘Ȫñí1P̧MRÌ¡ž·‹ ßþ‘O
+[D»¡ÏŽ6ßcغxÆ3ä-“-_¦ÛqÒü¸Z~;oä9]ÐÿÙJcì,Ÿc+Š:ËçØJ4ž†Îò9¶ÆÐY>ÇV¢0t–ϱ•úx8ËçØJ47†Îò9¶C§‘³|ޭIJÄÈY>ÇV¢0¿ñ³´•¸ÓŒœåsl%Cgù[‰•©‘³|Ž­D mè,Ÿc+1­9ËçØÊGÆñ|Ómå±µB„‚‰K$¢šn®¢z¸µVD]]µ>
+‰ý]ËÆËY0.
+j­ÚÅÆÇµž¢MoÏ!k&W
+º’Xx½V½w*Œ/Á-:1÷&„¹q»ñÉ"3•˜)ÓÑJ¿Zn0ûö?ìvcZØPžøcz`¶Ì.Ú8zj Õ„hͱ²W ­@›$µž]”þ±åE½ïD½lÖE5÷mZùãÿßR7˜ü°JßšN~|ècƒÉ-K©0„¡¸F3/|£1ö®žTÙ¾DRF;ÝÝ;Rbn‹ã8ø½Ö¶®!ìæ´ãNOÙ«´êI5×>Tª”lQ2>Ü‘HreAš™N““ïä©¿bŽM² ™&3`WiÓZxmG,~59p%]uzåYKãÄgr®€ØÕ2$EìL¨h@?îÈ)FÝÑá!:@Ïñ/» ¬rEûg“ÙN¦+Ô£<ºûùCÑñ>ëj8ttCPNÇLO‘ËÏÚd [˜qaW‡9OÖš ‡6¦Ðé¤,Ó¶0(P8˶%(ýu¡5óŒSsŒ¦ße5k’«¬Òt‘;ÔÅÖÈÖ¼<çyy—ùÞ'ç GÁëýüŠ›õ
+Ne;=à¶æd/OY“=ÁwÐ0²µäÒHTlM´«:óÂÄ!€Ø³žl¸1ˆ~ AnFΤ€fTf«³âUµ>`jJ´* ®Q…¼m´'Ûc2ïÃ*NJ,¨Šs'|›‰žYCÖ·Ÿ'ˆAÐ ,žïÕïa™ûdE(•c/êýåï‹/ æCuTäÍ7åMA1FH&ñYêHn{Éÿ  ¤Óæ S\äPQ
+Ìî0|Áì²
+[«Ùrx /€Nä*\Ä&™âªo§ÕVLô”JÚ»2c]´ÇÛøÔd›‹ÃfâYÿZ, `Vý*A§ðëL½b3£?,1SøÕÔ›x½ ¿yýZ
+PlÄŠ"a©Ÿ»žÄ¶
+ø.9á»ùqZ½âÜH‰‹”æa ã§$n@ S±Òû´$}tÖ 9šÄŠ.’‹‘ƒ¬ƒã}Ø›”Ã0P‹³inÚl)/·¾EÍ%Êç)"¾‰wÿY€)¼ë@ßœy=ÅuM˜¬‹îë~ i¡x5Éy¾G Ïܶ„i}cA²·… Õ)×MU[U^/mãNÔ΃º.”{u=¡Àÿ^7¸[×´SØ=¨«~®+†Îï¥õ$âËcZ™ý˘ Þ÷/«ña©pÌ)ëßm²ëœÐxêi²Úã´Ú»ààáuë•xœÓâ µÀ¯Ò:æD—÷¿Êé6?Më9¥2ïkcøND¦ß¡@·wÜ÷·#
+‘ÚIü`
+Žà¹ž2…§Öh7}u§¡ŸB077|l‡­5þck¡M»—MqѾ×_[Öµ{}l£ž‘ïõ¾Ã›M¯$ðèÈo´o³ýh߉q²úiŒó}ÂÜêa¾Œ.L×öÅLÝ\ÍmÄ‚Ày{XÔ`ÅGûâAÄb …^H 
+x³­ÙjË´ç¨^aŽé»?ºÈû?tèLoijàW™xö³/[|¶.«Ô:q@Æu?¨û¼Trý‰¿AÊ3˜Âº¥˜
+ãÝŽ`—ë¼ê[ô |g23s »€0¼úíÕµ¤:¶CßoÕüƒÉÑÆ'B·3±OCC“ih‚ÁM°»fÎË|ûh›Øgέº/ª\¶¼-ioIKKŸ
+¦iT›½N~ÈBÚ±Sz§W†õ½ LMµj<^¡'åEš¤>B ×cÁPeïSrNÔ Ö¢pJó´>Ÿ‡’ÈÙPêšK.D”¤=ñ4éZ\ØBÏŠ%VrkóÐlБm›¨gÖK-ü0ZLñ• ÃK6¢)õÎí†7¦“W H4š[‹h‚ý”òŽHù{ESd¦ÀŽprµÄM¼+$¤zKÙîc8ÒöNÒ[—U6‡\DiÊaNɺ©¡·§”fâÃWØÈ4+óã…‹´ôïóÒWÓ*‹b
+†ÆhH¨~ÝÐéDòá8èÐd#1JæëüH­xœUQ¦ÝýÍ×%ûÁý¢q(û‘ƒ° ›ÒÑ3býÉ‚‚F¼®5?—¹5Ð_ÁFøªVž¢FA/Žï°‡È­?âQv ]¹çʯÞºhá4ÏA>/QfKÔ »0NÆêJ³_"¯7!†o»–1*×—ò«ªôµZ%й¿@±9¿[‘U¿Î‹q< ½þ.Ëp_«lS?
+-±À§ _ОºöÞºRÎùHèóÍAô¡P[Z6ÚºZE¹´ÛÊv$æ®Ýà,—"¥Ñ—>këìC¥}O­;¹™ÜVßMe+„„2QÖ¥üîI=£€…¼5úÊ–T®»©,ækø¥gp™((ªôµL0ÁS³z%AÒxЬvª*/]¶aÄk%‘¬²‘ÈË:>HË "3pTª´ä:äZÚ2ùThzÛ8Ÿ/z+fó»¶²¡z{?G(äascds¥[R•ˆä—¹Èþüøµ©7r–ªºh,xBM$o¿4P*ެžüèeyÕg6ûg)G&
+@o¥jý£‘Œ',©Ú…>Ú]Ò*
+ ¢1åÖ±SBmŠD±IÆŽžž²Và~#ºCMr
+Mr“Pv©hÿ¬­öì´`½Ó*_‡2­áÃP)W^½˜ cUÕS'=ª®GLZ&Ÿ<Þg[®ãùtPÚÎS,BöÀ£ö6¯Ï¢IhSp­à9-œ±z.ò0š±Ò¹Ô“_Ør»NêSΙKsµO)öIAK"·Ë¨âÂ`ü5褿Ðñ/@t» º¹òðáBŸE3Ôò eÛû<‰Vz} ZâÇ$â×VŽÚ&]*vMUòÇ¨ÐÆÔŸ+¹ÝiŸôÁÒ^ê!f‹c¿,Ô.Ç·xÉ€)JýÑÕ÷ˆÅeïŸM­Z°I’—À“¾2⦀ú¶œz3¥q’w¬·Æ|$r¥ÄÀ™k „Ò”mpoð….7AÍB½¸©§ÛfæÁ1Ú“Öys{8d O=¯]†¤DùÌ:Ë*´å¡©©§¾Møé ,íUËj»>1CuóSE½-Ò‹5”–úÆEPý‚qdhév̇NSn5ZZ£øüü³J÷aòß
+w_ ûËb/ØpLb‹?àtUšg ’8ŒEB³¶gXdˆîÂúƒã³7áíóß
+?7ÿ[8.gáùÇ΀àY’F;ƒ=sãß4MŸ7Íe¯;ƒ}
+)ò‡eiž xGÎÓ$AgaõM†<ÊœÈ2w- )”eÀœ(2–
+endstream endobj 177 0 obj <</Filter[/FlateDecode]/Length 8499>>stream
+H‰ÌW]o\·} ÿÀ2PÓüþhž$(lÀ®QE!(’ì:XI… #õ¿ïÉË{÷ÊÒn‚"Q¼¸{–3Ι™kœTÆ;aev*áL”:¦(’T9†0oŽ>½?>zqþúôþá/Ÿ/>ßÝ^Ü&ì;ú8>Êâ䥸ðã£/xŽ2…wYæ’¸)˜NPÆd‘­LQ|·Òz+V*cûwl£Œ>¦m
+à!+œPåïÃéñ‘?-~Á·_C’.ËûSÝ0cVå CLïŽL–:ÇùR“$îbg©?íÒü€§_Ö¯Ç6J“i —ÎÒ6 ² * Ú!‡LÓ^88µn¹â ”„Ð\…7ÒDç& ~|Ñ=aAI•ž<O@Ý­a-È͈i ¥,²B›8‘³Cö›VélVÈzÂ:%Õó’¢=k™¢«Ðþ¯ ¡«©–
+r'Î=¤kaà!¤B:´tqˆ
+Ð70— +ðìŒôê ¨T„P—™YdCJ3o§Hºíšr_GtàˆA7sgƒÔÚ¦ŠÙluÁŒeiµHP5}ö±ìr5å{*óf¶°¨T,X´|°R€ý\Ø+gÿ&)¼¿½½¸¹¾Ÿî/®>_ß>m^‚_­Bò¼R¤%T1hä?Ý-DH‹™=î9 ƒr4h]åÅÄ Î>ajd †–¾Â—˜"‡´,
+ Ú€Œ<») €˜ÎË×# ^ÿíîáíõåÝý"ÿý^‚Bò+½~{}±ýñâáþóÉDœ¼9ýþ¯õØÿxwÿ½d߉“Ó«»Ÿ¯ÏO¿ÏçˆèÝÃ×íõùF[ÆÉ zć«]†Í! snó'±ÈÄ„–ÿZœþ‡ê“–
+Ô£üÇjŒAÒá¸×^•ÇM}Œå±/Z|å…ŸP+Yivo”*›ú.+¥êt÷ûó6ø2ü¯*#^PÎô|‹v†ºˆˆs)3Ð)L):.„ZFˆmk
+rI†4‹äaÙ–ÁH¥x°õ2·eÉ;?"†Ã¨Þ*ˆÚb1l U(ƒÿ =-¨HñÖ®à–Áz®nÛÏŽnò5"‘øœQ”i*ôìm
+ži‹Ò"¶ bØ©ûë! (rlÝ…åUâøé ÅŽO­Ä +Ù„eË ÑŠAŠÅ€@üÆ'1Riî¡Õ0çŨ[h5JÃÔ`‘G%w8“¢Ý5Úøôø5R¡¯´1I
+y*ÅÞí§\8lª¡E”§X·ÕHo7N)Wœ‚­ÅÊsOÏô¾ê,×5Ç$0¼ŸšZýðV8 Ž ã`G¥/³5´º.ÏçÐBë= ïVH –*¸öb8S-õ•5>}i J7Ö
+G½yL„·3"¥]®¥îS³ q¤bäÙeM3x?E’éŠ&>H•lº£Ë¼Ÿ2ÉtE› ¤Î‘°AŸ x…’åŠF>H¥0]Ñ)£)•cÙÑ*é•éÚÑ+Ç(v-½Ÿ3¹ì«ÛçN.£¨ü µ!ë ¼ÙIï’Œ›…“ux>_€ç ´®ÓHh¾q¡u*Âè’ÛY=tFn‡©hç8OÌ.ûÓúÇš]Œ5˜ÑRUZƨ~³
+†±^gõ¬\˜¼÷S±0¥V= BœvzV,ŒÍR¬W
+‚Œ7yªRëÄd6•‰ÁÿT$†0j‰B­%¢ž(ÌJŸÝÆé=¯’Ƶú0^ëà iõa÷BŸÙÑÝoéè¸~e%hòÙ?×÷~“Áoðÿä±*Œ¼4FÓY;=Xdº"†’™îˆ„ÁCdB–+Baø ©éŠX˜Äƒä²vÑ{´Óg‹æ™ít–:y%ëfxT&¥E'¤»p&ØE'VpFËÔ w#y^'܃‘e'ü}$þ¼Žº¿ßµæ{`ÏÕFÆTFz }C7 úTø†ô2.oT¬©v™ªMR{éR:•Êe$0$e
+h”‡ÒFÄëÄÌ0êØôœŠ¼P£tæ6 P¥\…Sê‰FŒQÏÃ`Wœa莦¾ iWCÃÜSðûPQ: 戥TCò¦0pcbŸ‡ñ‘¨@Å5Αè›Ç¦<
+’²Óé· ZŽ€iÍ
+ÛÅW‚ú¼›îeË êP®oBê Ov5æ½lÃ<0—³#`ÕßÑL§À³@?9uœ„md‚¨—¤L‡j$ŽsÝ ëuÖ[Á”žê86]^X“Ib¸à©yP ‹·–1cl-¯z =õF„3tårHÓé»´Hæq4,l_®éó‰ê±ÁU®œÉõMÔÛVϱm²EQQÚ€$åš‹ãg[DŠþŠÆØ`”MÃ*è¶w¤Qp—‹‘:‡´t\ `r
+d¹{¸¥gšHLÎË0 Z½Y†¼X‹P]MÇîw‡Œß>÷­Ç¥ÕÂk|¦Öý_ `7 ÐÚr<8Ï…ÁÓ2BT[Sº|Ú¢
+tœJ
+Ä߯˜VZ?Ƥi´•áÑ´8˜( „®µ÷>gï}î¹3ç^®3œ¥Î|³×Úß^{½¶‹®«œ sO˜Ïe,¦ÿ›  %>³°!C‘çêƒ0Æà#&4ÉÀ:
+Ö°[«ûgÅB>ž‘¼B±øD*DÕ{Dx²F!c¨}5Že5 †¡®®„·…YIð´ƒ„š†±¦AA‡ þµ ÈIT¬}@$.³4DYK'`Mƒú\V79; !>®„ic®‹\¸™Š<P=> |ò¢¨ˆ‰è8TYƒŠ‹°#Í [+‰Í¾8—"m8ÔÜ Ë+„H,}È? R[ƒã3õ
+CmMÂLM4-˜XF*㊣Y+Sjz¸+‰S𡦉¨
+~GRJ[vI¨-;êƒ
+ê•;
+KkŽ*+’Ŷâ8Hl_mZÍkß)7–FRl,դؘ^±Ñgç¡Wj¬‹’JcݘTI*Mý… Â[ ˜^LJÁM2fEm77ˆÜ‚ýöÌ,¹Ù“›ÉOÕíÞ-çªæd‘†[Ê#T­Ë$ ¶’K¨™“Mn)ŸP5'£´[Ê©¼‹n¢{άvvo/¾â¼Ðt/‹°(Ê4^¼(Áži¼vµ×x=ßÙÆ[ϤXãmÂmÙÆÛžbQ¬7o7¯×ÿ”-ž²á0Ro‘*E¨ ŒÔ¥@ÇpÈ¡P=HWbZ…j™q™Pªf`¦@F$䬋HÆEÅS iik0“E*Q¡ÚÑHwe
+uß,3ö„8ÖD ¦P'`-˜”²oºˆ:EìI6%ìlz.«›œÝÚO'`ëü6'ëîê¬ë='`]W9‘éž0žË€µ1ÂôÅ?æQü !Ãèå<ŒÑË¡àqΆ2% B`Ä
+àCÄB5A †Bƒp**â™ÀD½šg³ª®ùgÈZ:L9Š <o`L„@'‚‰€RP9Š1lI4Äq
+–qʃÎ&êÕ<›
+ÇE¡Z/à?›¯V;?=úÒèú
+¥‚ˆþ¾íûnÞɲ }r›Ðh É9ãSœÛ¼Pš™Ø<RjDl¾¡Üž¬øÄ曋•’Uq)Y5%·!¥%«f¤dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\n&2ßD<¹ YÝtd¾¹X)Y—›¾Ì7#·!«›y2ߤòYÍ/±F”æ‘ØÌ”æžX>sÉ­Y>?Ïvq˜G¹Å[èh$ wvv.ÌøCgV Vwuu÷ô6žžî®…®NGgWÏ¢¾»ú–åÉÀÒþ%‹{»A'UXؽhÉÀ=÷¯|pphhh•'
+¨åq;}ŒÏO{Æx:¥ÝNpwYšáNÎëóÑ^·¿Ðá|rŸ¢2Œ ëd¾@Iƒ¢Ûéõ”‹Œ; wSê—¦TM½l©ZIô€²ºTÞËËå•ESòEXL™–âU¦^,_ØR±G®(6B1’Ð]vzð¢Ô¶ ®Ðx¦79”I¦Åøø:µSð
+ïášbŽTªÄsðê÷“|ñ$« '¨#e"œµ<žâ®¤•›+ŠðšÅþƒÈ“ Ò«<9>éíÆHï7é z.9–Êí3‰KI±ø>…A·WIâuù¥ÈÐàRÒ>7CæÁW6
+àTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTè<,rÔAJ<,㨳”À©ÐyþS='Á>ÂQ'‚<šêȃUŒt´Á騂=1Ò3Άžçò)c-O9÷ªC8¬³N§«®8ñˆ ôÖë ÆšC0ôzàRôFQORTC(Ь'LF}™¥ªÚ`ª£[,­mV«µ]ÚZ--TÉP]¥Œ`¨57Y::.–ã8
+ °.Gg‡¥É\k(Ž¢Ó›ÌÍív®»'‰F4D£‘pO7goo6›ô:yc]S»#Ž #£)QL«ÅÔèˆ íMuÆÂ Uze±û…ôäÔÌìÜU s³3S“i¡?h·P&½ì ;¸°01=¿°¸´œÕ°¼´¸0?=!„¹ŽF¢àÐê[:»céékÙ•Õµõ ëk«+ÙkÓéXwgK½AšˆÎHZ=Âä|öúæÖöÎM ;Û[›×³ó“BÃBuÒÄk¨VWxdjaeóÆî^.wKE.··{cseaj$ìj¥jàÔ«ªk¨662:³¸ºµ{{?Ÿ¿£"Ÿß¿½»µº83aÛ¨šê‚£ÁÊES³KkÛ{ûwîi8¸»¿·½¶4›ŠrÖ†r‡8·¼¾“ËÜ áþA>·³¾<'jâÕìÆÍ\þÞíOîÁ½|îæFöª8Pîh÷ ¤¡ãÖJŽ;· #=àiÇìÀìÀìÀìÀìÀìÀìÀìÀŽÿw‡•¡#—¯äÈç Cà¬åލ8·¼¾“ËÜ áþA>·³¾<'F5ŽÔìÒÚöÞþ݃{îîïm¯-ͦÊTY\ÝÚ½½ŸÏßQ‘ÏïßÞÝZ]œ°mTÁ¡«¡Z]á‘©…•Í»{¹Ü-¹ÜÞîÍ•…©‘°«•ªÑÇ1‘´8z„ÉùìõÍ­í›v¶·6¯gç'…‡…4êŽA‡¡¾¥³;–ž¾–]Y][ßа¾¶º’½6Žuw¶Ô$G•žhìàÂÂÄôüÂâÒrVÃòÒâÂüô„æ: }UÁa¢,ö`¿žœš™»ªanvfj2-ôíÊ$;tƺ¦vG0FFS¢˜V!Š©Ñ!:Ú›êŒÒÄÁDô&ss»ëî G¢Ñ Ñh$ÜÓÍÙÛ›Í&½4 8ˆ¡ÖÜdéèt¸XŽã<*€Àº–&s­AÞDƒ©Žjl±´¶Y­Öv@hkµ´4Ru&CuÑ
+¸tÕ'Àéc•¨:„ŠÑ±ÙΊýñLœ$Ã$a õñP^‹_Î$ÆI"J$ÁС·HÂM÷ÂÃ
+ð²E¤{uÀ¯Ó>&Ô6ñBÆ*›C*'I¬äß² ÑLQý3Í%’3Ômàü`
+endstream endobj 178 0 obj <</Filter[/FlateDecode]/Length 15049>>stream
+H‰ì—}lUÀ÷§©6Ì%,_¶4-l»;ß-¨]»v]:0ÛŠe)w]e]·µÛbd ˆ3þá2•1,3Gâã¶ „„@Œòp¢ã5? K`‰Æ@âóœ¯÷¼·wYœÑ¸÷¶ïÇï¾ç¼ÏyÎóÙ1ÖÓÞÖ1ÖÞF‹®ÞéÓ7#›ÚÛöÄ?Rôî‚cMYaXgN ž•TÂ…4\Qü¡ü©ã0Z÷ÙS+QÓ„«BIQ£Tðb‡‡ÂP[B$LZî#„9B“ŽpMhÑ%¯)JD¡«IÍx1ì!A¢U€
+ïTxÁˆ°Šã~\‚hQÎb)‹ì} 1#Ö á$(Í@^†$?0m¹-Ê51ÚzâU
+¡dXKóÇdMÂ\ŽH-XNhÍxcŸè¡Ò5%e#ƒB7Tíî™U~vcàéDp.MjBkZBœ ^ÆX‘Àž£6Î*s"k–éó¤5"•гHjœ
+if) RÔ+(Snwuƒ­Rµ•
+)&ì µà,R·Hδ[ŸeQ/ A¹WƒáIõœ8D¹_´„$`†£ö!Çø$RL,% ¹¬Ï v×@"ʦ‚4B¬ßZx£q„j,,ʆ愩.®‚‚ÖHþÃq¹ív\˜à¨—ÈÁH´N;çõ'ñWëmÝëØåÓª“ðÌI$X 1ùcªt7Êœ›¨¯tUé¿ÉñólRB
+Ê`¢„ÔX6•+$Ä$¨XCô®@>Å|Øóóƒ „@˜åÖD“Àç0ï*Äú Äx¯¥Ü`«vÝw cÇä´¡½mViPŸmmoSE—/û€Ùxë¿~<܆ÉLâ0a)ÖpwAs)‹À›bÁWI\­‚¯Uð}¨
+¾XÕ]òÂ[å]«¼k•w­ò®U޵ʻÿgy×1¶¢wf®r|nrçt}fÑíØÚúìv9r ÷àÁ•}xÚ†§ŽÞ!96095ÑîVNl›œ^WŸ›˜AoÄ6ˆ—£p…¯‡¥H( z‹Æ¨éusˆ?îîË?‹¿øçýŸIO“BÀ—8i:œ(ýõ¹zw!9ooj[pÅŸ«®n6øz²bÑ|Ú9¸~°«vôŽÍî· tÙ{¿yô»÷¯¯ÒåcýôéÓ?|èÎA»ìÚH—ÞùàϽöû³/žüÎ}Û7ÚküøòM~ðÜïþzáí?¾|êØ¡Ý·u:\ ì8ü“WÞºø¯¾óæ‹'ÞûùšÃ‹×ì>òÔ«€ÿñι~|ôÀ(qøš›ïzàøóçþ~áí?¼ô³Çͬ_êßx]Ïø¡ÏŸ=wö…'˜ºã³‹£(+¶:~úÙ3utuY²0 N6ß÷íï½Cãâoº}Ç—öMôÌÓÔ{ë¦5ËækpÁ§8½® ^°ð“k†¯øƒv²jz+Z‰³ôÕÉ–f<€ç*©‚‡—â±èç¹±X†×´X±rçΩ¢kxrzûÄÖF:4ýʼn™¹ÄIä}S“»vMNokäý“³õ-SéùxÕC¿Œ˜úVàèlûÑË×ÀÝ=p·Üam1º™[ÛÁ¹Öý' ÌN‚w‘0uÃð=ÍÚBe…Á&PqˆÔpbTB}€UTäøCùïª^M“ë®òÞÐ@3FEÞáÆ²¬>/I–JˆeñQ6‡¾/
+ Žpæ‹ FüŠ
+ªTqè&TÃN¸íQ {6\©‹‰ó—N™Á’Ý$qó&©„Á^«0¶bIG©]+=„W<ž’ÕÇŒÖ"k„]',ô‘RÅ`¤cÕŽ<ž[m}kª­Ë4¡]
+§'V¤ŒAYhw!Ð{íÇ.C=±lTùÁcjF|éóããÂ`Í‘ÃHá ¥ÆCeHf(šÛ{ˆ?†§EB¬ƒ–rã¬f˜I„0¡ÂV b0Y6;éOcÄÞÀ½ŽKsm´ê¾f¦~ÙžÐVË»¼¶Ó³(u`½Üñ‚àvAnIE¬[e]«¬û–u±v»ä…ÿ¶Š¸V×*âZE\«ˆkqÿ“"®clEïÌ\ÿäøÜäÎéúÌþ¢Û±µõÙíþrä<îÁƒ+îð´ O½Crl`rj¢;Ý­œØ69½®>;71ƒ Þl/Gá
+_V¥%,E¢ŒPaƒ7`à] ÜÝ—ñÏû£IO“BÀ—8i:œ(ýõ¹zw!)°‘¡¶WðùÈG›Ñk»:ͧ«Ö®\2ÚúFºþ+GŽÜÂÒýÂ%ìÓkÆ:~êÔ‰oíètñªÍ3<òÔ¯~ûÆK§¾·C§§ËGö~â™×ÿ|áÂ[¯Ÿytß­78Êêyõü{ï¿ÿÞŸ~yâëã=Ÿ@Jž~åüÅ>¸xþ×O~câ3Nîå›ö ¿ùË»ïþígûòú¥ ‘ÞÐ7ºûkGþò¹7_{æñƒ£KýÛ®ZLoºëОþÅÉGï]^YÅí~øÁ{;«k럛ÞHWܵús}pÁ¢Zíúùšl»zá|ø_|Ð VMoEsp&ýoö«&DÏ«
+w)‘`A\XÞ¶”LH3¹?ï{Rè|iÚ +‰m!ÄÉdˆÓNgÒtÒ´ ]ˆQQWJպЅ `]‚µh»±bAWR7…¶Ë<çÞsî9÷›)¥
+.$ùùæýž¹ï½çžß繯e, ’¯Çñ£ÔD“6°ø~ P%‡;ñÙG–¶·7‡…•­GÖ/ΣË[O¬_Ùi¸a|¶¹qùòÆÖ¥yüØÆã«6Ûú»à¨å| üÀafpúAöcU=…å|¾= ß®AÞŸΞ3ÃÅýPE§ÞK©/F–l§ìGNï\ ‡…¥¥»×Ö®>zj{g÷†ª8CVÌtu/Aò˜Pþý~8;ùA’z !ÿ‘òB›\tÇR…@b‘Ÿ †À8RD¡B„‰ ¨H…Iã´íY»ˆJâ 8fëúeѺ,‘ìrÔÇÀLÌm-q,4¼ID’w¢p4@GCEߨmHߨÓDß³¼ ¾ëYßÈ ÅÏóјí¢NßøˆCÜd`‘~`¡“GœÆó?%üyê‚>:Eûª¥Þ5Ƀ@p´„5óaÑg;уàä‘Û°èq>b=ˆL–h‹ô¬™ˆ°èApt(YôtH=êE=r„=b ‹±–DÜIT\^ÉqËq# ñ¶Ò=B&9½ CDÕVtBújË{U[æj##êî:–}È…W¿ô* ò?/ sYN)^!BáTôWDeæµÊQ¾sT0&ô˲Ÿ&¡¿Îc:&ßÑ_ŒaLÆwôc?N$o™þ«‹Ö›ÜÑßRôÑäŽþºXd6Iè/"Þ;a¿`C‰¶&5cD~Õ>D~kɹ#¿Õ°Âˆ…üÖ+ôÜ·Þµô#á¾Å+£q÷ç1÷·8ïJ‡Ù^9ò®Ü7÷#KÏ«ò{T
+— qhûd`H`å° ž+‰a?ã‘Ô®T¬FåCºÚ"†Ä, Gje„¼P㯗•‘8‘ø@ÊñšrHCbà/y‰A7´Ô„ê…3œÊðZzY-½U­):¯ØÀŧ=Ñj´Ùßê¸]±•»ö„…kºqÒË"nëõV\ï
+gPwx ÒJC*jc Hr&I°P)¡Áš9²g—H)8£n…²„s•|á2ۖшx•òò½Õ…‚JñèMjé£Jv^à‚%/äiÔu-×¾¼E@6GëæÕâ!í—c¦[tßÉg{µwâ©85ÁóÈ¿áÁM˜júþx„yD?ÿ³(¢0mhtädCCk¹ C‚ˆ©"ÖzÏN4‘rd´Ö²!*hb¬N$$HÅÝäE9x®\õD‘´+ -IM` 8W2„^‚"H9ôVáʤšš
+}×
+k¬Äs ba¨dC=¦_cÑ*$—-çÒü(+ ´Ö%µaarA)1ô*†Ðû&›õ2¤VÙ *Å3+`Ó ¿¬Ç! œL8lL…! ˆ¡°Ú‰é7&i„Fþ¬¾Ø@oB}‘¶Š˜ÈµÚꉀÀ=ZZGs¸ŒïmÛ„ÄcÊlÛ¥Q‹5Y?($.cƒ:bÉ4¾=Îè׬Nš<¸Æ¿8ùåU‹¢¨È*œìÄñå»L
+Âî—÷(JLSR}<ÛJŽ<~U‚
+"dìßÿÌ`†3÷ï ÃÂÁáÌCËü|µü3ØpÌp?¸¾E’b’[ rG iàýq0åoOÖ˜R‡ªú@“Ȫ!„h²ÔÐâ¶id·ÜštA0Q+¯ò£?Ç#!TÅ’^Vô”Þ‰x8£îW䙦Ê,âÚšÎk—Ô,¢ k4‹j”e¬,e+ÒŸÚM¨2‰§®“ë5™ë Âz@^$Ù@b‚\±ÂÝcT2d’*ÂzFƒUô¨ª*Òç¡vênÄ"‹š«óJ‰Áwí»ª54Q' I?Þ‡µ¡FrÆ}6õê¶E£IÒ±&[5_iê¶Å_/+)";q"iqÛRûJ œâ%/K«A7´Ô„êE ï‚P†×BÐËj±è­jMÑy¤cjñiO´mö·:nWÔl¥y¢iFYƺR¶bù©]Ñ„*‰ÚsH…¸r,IÜbK°P)¡Áš9²g—H)H­Ó{ú˜«+̱‚UˆW)/ß[](¨Þ¤˜>ª”aç.XòBžF]ׂpíË‹Ô"f<A¨-µæÕâ!í—c¦[tßÉ»±Â ‹þxœïøPÿöƒ‚y. Š"J… ³nÆÌòVS~¸¹‰”EŽË ìI©AXÙÈ‹$€¨r¡D¼§«&§P¿D²¬³Š\gUÓy‚”÷ª^¤0Ökk)Û¼Óô';°IT° ¢ØTj[VY‹Þ©
+­dYé€íä‘{U‘C˜­>Õ¡Z ÿf¿Úb¬¼ªð<“΃IË%üÜ/µ‡ÿÿ÷kê0S˜iÐ6(:ÁÃÌ™8Ì03‘Ø›@iPR[ÓÆ[}­¶IK|mÚ÷Æ'S›X_äÑú }°Ñq­}]ÿ™À1a€3û|ì½öZk{ío•]¯±GBݳýæz´d*´raCÿv¹¦¦"ö†1€Ø?Æ é{œ$sèFӴб&S"å+æ^†<ž’½@kòt” §–yRø ³•ÉÓÇ7]NYGŽQÄÑ0-ôd­xH]q-r?!á~¤…þùÅ5v²1Gñ^Æ<Æ»K_ÉÔ†S¡ÓÜÉ%Sá€éTÀâ]–"pÏ1ë·β
+Ò™>”ñäs¥Ó,“%Ïõ°Ÿ¿8îRÐ\Ä»“j”L)ëÖè){z—(²kõáÅáL½WêB‹Z†J/‡aiŠÀ%×õÑæ"6‡Ñ`èãžé Io›Ñ4-4¬ÉRèk©kÀ¯‚á“ú¯a¡cS¤=D1çZ¨„N‹‚®!K¦BÓw ½ç`QúW7vqfè½o®i+ZÏ´Ð5¨v‡}èd‡ƒÚ¬4¼1‘€t—(FJ”?•4+\²Î7lXax_Èø9ÊPÏ"³¢½È¾¸gzHˆg±MÓBÚL…¾–ºOœRJǤٗÎ3/9ImBBúÓ:JA”h)«çg†“÷[@Þ8! ,¨DG"ŠD®%0P2™
+´;v[ßBôôâÅ$¥›™n{wQ诫^~ì]ó,Ï÷.“Ù¶íÙ¡¯[lssgßÌÜ@§5×™žYÈvYlßèì„ú~žÆ<;à~Å_›û†DsOg²½+~ÛÝ>Ú™zltv®=ƒìbn/G`„Ûã#’{Ö)Ñ@m{2“Áý
+¿à=
+™ZBT/V:熴“Øib—jûP(æ©ÁŒ =æ+KÐ¥2K汪Úr½ˆ5f@3–:hLæ f¤ k%JKIÌ' HÆ"Ü®€!ªh>E¼H]Ö\%‡“Ù§ÓÈá‡!)–¸?x •8£€”ø
+™‚ˆPts'ô5’"Õ@بAÚ6É~lœh ².P¬ÁZF׉ʒÚOH•좇C\Ñ~ŒòƒÕñ#<§Q•§ÿ$ª<™I0îÆYE6ƒøQ M­ai
+N’éÒL'ƒÔ€°’ý¨²RR‰Kég)ÓpJà•˜¤ ×’ØOÉti¦âŠöSìÝyë¯KæM…KÖUÆŠ¬ïä-U²ÅT?±ˆê‘é²›é~ŠEZ%'Ó•^’éuDoÕ}r1ÑË,™¯ÝϱH+¤Ÿp2¹t(k
+D«.k“ö0Aþ
+fr›ÍX†yEK›²ôÏ0¥Áž@õ}KîžÇm<O'ýñ*áoú¶ö&@`‚‚¾(–Ðþq†ýng¹Ï›KþR¨JþÞµ›·n^s×êÁá½j-·>Úl7‡¶âpç¡é3S_kàYxvþ[%eû™çŸn «Ÿ;ç¿Îzâ¹\èhšÉç_¼xœ ­7_|ÎMÐÇ/\>ÌÕÑï^zv\âP´ž¼ðQŽÃòð™'O8|ààÄÌÄãV†oÙ»‡«åÀà€°þÞ³zã–kzoQõî¿£U¯/Û·Z7n¬•‹º·¥QBôú¨¸Ñ ÌŽ»3•%}Õ˜–ðS˜ˆjd ¸bdjÉÛÝ733êÇó¬ïôÜtæØÐùv{{¶óñ¹8¯t,ãÓcí&αÙöÌ™öxóÑöBÓÍšínQ¶õMMOe‚ ú
+çþþl0k”F’>Áü²¡¸Oœ“Ѐ”¦TfG„j–
+û`?‰ÿ˜PÒ8¤ÔÓÆA7T.
+ºÖ4˜Î9µšç
+Ô6L9?ì@Â1]0‘!Pð¶dP­¹áUD
+…ÙÎ@³ µõÁúŠEr§­íi'÷TÆè,…ˆÖBe)A/¤€Dš‚Nuá
+msÙ09ˆ§~·Ðƒ ódáRAA^ÛµR+ X!‰
+0Ît5i ù«T5i%ž²ÐY:JÏ*‹ûë¨í³k ™Ê¹Á{RŠ\ËÊ tˆ†»’Zý]½6À†¼ð×F‚YGW@GkŠT¹’×q%‚dØ®åE)íñê.²x¤J;¼Wd-/ dá…¤@•+¬Ž+,pEh¼MÑ< eW<RåŠ} .¬¸6†ÜÐÕ*BÙ’×±%lQ&‹g_å"ªHBx-‹ê4®ÝwéÊ~‚’ Nm¹3à^Ž1Beb‡arf,&Y KÔ/† |/r[îtÞh‡ð¼d¡všÂ¸ÚiT¡Bí\[A«¬‚(È[F`5s”Š[ ¥ræÎ-z 6¶¤zg9 X–"@JrãBG3ÉBAÅô Ó™O³K`â~÷ [{ð¨\]¹>UÐoÄTA@[à™tH`DXC1††Ã÷Ìö•@\(ŸÁJeã3ÀaBiçsY@²„W+GaJŒ‹Z@Þ´¹6˜0H¯{¥ ù9^…„¸·¬ß­óœ­ç™X‚W¤2ój‹ØDõS×Mÿa¿zc£8®8#RWQuÁ²l0>ÏÌþ›±CZÿÇ–D8€SÇrûdÌÙØç€U5$iMP©ú!ˆ¶!DUš
+¤©´T5(%Š%ªR’(”Ð’mEèŸDH R«*‘úÞÌìÌìú
+UúéîN»³¿›Ý}óæ½÷û=ÙEPŸIðX$aGÁ¸`¹"D9#yœçÇh*ÿ1Œ Pźò1 Ù$áN’
+Ô¥; b;+FW^r6×7v$§Í‰º^"¦3RPÒ&“–‚†µn8Pß*}Ué«J_UúªÒW•¾þŸôU7ÚÜ6Sî,Ž•‹S¥ü̼×"±üìN5Ú€Ç9<HJÃÓžêÚzÃÑîâd¡Å\µ&Š¥MùÙra1x [‡a„¯Ç %¹˜ËlÁªz#Ô*ømÛo:ÿPÓÕ›ÉÄ àK¤-uÒÎ|9ßâ…¾¿bùPïòe·ü¹ãÎJ7ßCšW-Eë{{²`]ÛèìܘȠëÞóƒ#?~r06.ûÕËg~và‘±~e‚6>òô‰WßýÓÅ7Nýè‰[Ä]ürÓÖ}?}õ¿öá_ÞZ<vp÷õöºwúåÛW¯ÿçß½ÿÆ©#3'á5}»Ÿ~à}tùõ_Ù7L$|×½î?þÚå^ûðÏçýÂÁ™ÁFõÆ»[Çž|íâ勯¿thßäÃßX“˜Ò¼íàñ3¯œ}ñ;Ãm1œŒ<ñßyrsvñëÚõ­½…Ö%žª÷oí[¿ÔƒË¾æÓ»+ÀËj¾ú¥Jð-0NºJã%2Î7š0Ôq7d¢¥“ñè5@ê¬õÖã˜zÍíSS“^C±´³0žE{KfÊ' Þ1Yœž.–&²xgq6¿mÒÌo…WõŠQÌÊÁ ˆI©69ÞW;àj¤Ã€7<B¼ñ[›>Oþë§]D?:sû\òsoÈx
+©‚9TiJ]ÿƹ„ "¼Ê$0”Áqi‚(ò4…¹`0y+c\^Ç’!
+ £ e7Âc¡½¶Á¿e¾îÌ
+
+T–`+„v[cM»”¬{ª€ðd7äÊ“æ«? ×Ú-ñ iጟÝN@PÙn§‡é‘T§X8×™ÚÄ+Õ&rò^­_“^ÖV'¤ªSèH_pô*έ1·.O!Çô³Hº<…•ÊS˜”§
+_[ž¨¾fQæV³pˆذ0¸õ‰WªO<©OŒ†jãÔ–¸±ŸÎ·w´:½#Úˆô`U7gö=J™[D›#mdÖp³b§r[,G²Èm"ëcÝ^D™­ûe6­?š¶&y¾m},‡™È1æº]“uĦ@Ó›™þÍfOeÌ
+ÓÓÀƒÓ1òö0ÝXÒ ©E1c,Ý‚BÊû"ºYU‹¸Sr8vµ¡©4•` ÏŽôLp™mzb±‰rLÑ´ÀŠnÍ"êF B1£$öœGAÉTU²ˆR.Ψ*¨Ò6¹÷’G£d!B‚Ö™ÔÙ˜I¾„J2½èä*ˆC˜)UÊ–L¢\ù؆k6ª;*…úM›D‘V|ë2’ÏÐÓ ê[å©*OUyªÊSUžªòÔÂSu£Ím3åÎâX¹8UÊÏÌ{-ÈÏîTá xœÃƒä.<Mà©®­7í.NZÌU{a¢XÚ”Ÿ-fƒ·
+¢Ð3o_¹þÙgׯüþ¥ï¾.ínÚºžð‡¿}üñ?.½ò·k]Ý1¼û»G~óÖå÷ß=÷âÂp£zÛkè½½üùË¿=uôñá¦Ô*ZxöÙ§wôÔ§×Ö2V.m¡Ù7l|°£> .[•ËݳԓËï¬Y
+þ ˆ®Ò8†ƒ è&^µÑÚ™F»ÁäF<z #k½õ8¦^sûÔÔ¤×Ð_,í,ŒgÑÞÒc…™²ÁI‚wL§§‹¥‰,ÞYœÍo›4ó[áU½bÓ/Að€TF µ1ú1§æ1™ûàj\í¸ð†Gˆ7¾’hÓçIô†&?G
+­×<Xž ½†öö¶±±¹]›¦Êyœœ6„èŒ#ڊ̛撟«vCƨŒPŸDTòÒ^C„G,+ PCÙ„Bˆô'É 8f‚ʤo1@j)ª%wG›YБÌÁõÓ¸8ÖRkD‚Œ)Ë$;¤¦Å” ‰ÄBp‰&b‰€m’qÈ?¢¾âx®´Bª!äI
+0§BoÄÃZá£mÛo:ÿPÓÕ‘›ÉZ˜À#Ò–:ivk-^Hê]~+mßm·WBW6Ô­ZŠÖw ´×.AE~÷ä–\|êðá…mÌ\×Ô²ûúF_\<ùÌtwF×tÌìîô›ï]:¿øüüæz…6 í=tâÜ…®]»záìѽ÷¯–(Ë/;û_ö«.ƪ«
+Ï3 ±BJZ¬á€ —ýö 2w  J¥jÑ †;zaœa(CˆVˆDš¦IM µÖøbª­RÒ§R+øL4þµ¶>ˆ!1­JM+®µ×93M%Ô·¹39³ï7û¬½þ×·{íí÷Þ{û/W~ú­ÎÆÛ倾ô›kï¼ÿþ;×~uþ‘±ÍNïu ¯þõúõ7ÿð‹|õþµ·!º¼=täÔ“/þú?ýþòO­õ§}lß4°ïìO~~é…§¾6´®fÅçOŸ;÷̓÷Ü]·mCgz⋼iqïöûÚw7Áž¥­Ö'g{rÁâÛfƒ·ðÁ„Ø:1Šéàz{ÊW@s¶nÇ«ˆ4ÄaóZ|½P#áË‹õ}““ãEï`wâÐØh˜xhlj:á,âíñîáÃ݉M¼¿{tdÿxÚ¿Ž¨†±ü"‚ ¦f?ÖÔ ,æðí |;y¿³ÚËŠÑ…PD»o¦Ð{×Iœ³º’«‹õ÷OO†Eo_ß–NçØWvONàæº",T Z4N:)íѪ
+ïiJI¼âBàLÀÑÃti±F”zŽ…ãBz§‰÷Gf€²*« "Ât˜×¢DFÃuË2æ'šÆþŽm’Ãý”a›ÄY"”ë¹€Çñ3ÇT0ÑZxÂQ¢&ˆ(­MF:þE©mUß]¸. fb™ÎCL,VUY1T‚™–ÕŠ¨€æ‚ØW–:0 £ËÛ4:ÛRQF¤­;‚C³Úºé똢S¦·R€Ó*õGZ_z¦¥@eKSz¾§ªhÌ;In”ÓßXîg¯bFÖ7;á½ÂÐ.¨$c!xµãJmlÝ"d°A^ ´Î c`’ÚiϬUQÊé@Ëฎ-€`d)¼ÙÂpÍ‘ÏæÓT«,™gÇÑÑÀ¿rÜAùp
+«‹2GÓ1¥ÈF$øÁ'
+"Ðü[x«Â¼ Ã.!CECÅÀÂHc=ÂyÅ£Y’Dñ2úP1å1f}B@‚oPV~ Jˆ Ë£ò÷ wÅôq¾‡)] 3
+o_¶²1°Þl…µ¦ŒõÞÁ{/¯|0³âjH\5ð‹ú6éʇJâ:Ì*w {š/&h·Sû^°\þªÐtLi|F‹ÆˆHl†RUõmŒkNE1,Tž 
+UÖ]-ÙVŠ
+ =VÆÜóƒÝp?}VR–¶6<’Ïç(ÝæÒ8K
+¹Ï …ã‹‚ú"ÕNîQ&»LÎÑÛðÑ_k…¶Ö
+}¤#ˆ=¦¬Jå^¤Bf?Ù
+“xt" V¦D‚™¨òÆ
+Vì]¸À½«‹=8¬Šëcî×Q7l:¬ØåH\dj¸ð?ó”mž²ÍS¶yÊ6OÙæ)Û<e›§ló”íÿGÙV ¯ß25ÝßíLw''F¦N¶säè!¿Üó|Ç£qøç
+÷þ矰·LàšýO\~ý­üýÍ?^úöþu\¾ëÄ÷_^ýÝ•‹OŸÜåuX²¹sê©ç.<ÿÌ3ç/<÷ÝSû7ßá¶nðë>~v¦3vò‘ÇûFw`¢Ëú÷M?2¤zzÔБ™©}[ g±¾whh —½;††ÕíNðbS¹Ì¼¬ÜÄ–%>þ‰ÅQÉEKýO"Lˆ­£˜.¥·§Œ4çë6|¸šHؼŸE/TÉêâÓ¸æÅú¾ÉÉñ¢w°;qhl´‰L<465pñöx÷ðáîÄ&Þß=:²<íßG TÃX€ÁrÖ˜å«ê–óøv¾‡¼ßY íeÅèB¨¢Ý7SêAzãêÖ¸¹ihdÐè 47îBiws«˜†žˆ5ÈÒg/ð:ÇB•2§¹ÐLJçÞç2 }’³*ƒˆhôÑÐJ3 ™ßÒöïyP™– M€0ú Ñ,;­k¡I‹ˆ8i@á•°DiÚOe4y× Ý4T~FL––À¨ð £YI|¶<j‘ö\^óÝbµãÕbð‘.&´ð?š‰T‚"޶fbŠª)åíäЋ)R·Óƒ ;=ˆ×"ü¡^~ºLQCÍ\†š( âWY+é»QÈ0"?!üð`#?íJò“í4?ä\ùGlbêùŸ„©g1y(ãiJÖ¸´
+ŒÕ 6U))B<@êé‚'$³¦ÈòóÊN%-»ßfOC”L)(ï4Àn š‰ü„PO'z:ƒÑ®$?ÛÞô[{.g~(™™ k4¶´« #[¢2U½¸2ª–¾š•Фà#Pó^kÞK`ê3Q|îEQ ÚÇ ®•nô1 B¬ ï /­¢òBë;‚µúŽ`2+ŠÏ–G-h›åµ[écÔÎÜÇ€7ëÐëe´S–¡ƒ‡>–ºlØéÁÜÇ¢üÔ‹¨¡f.CsuÉôMˆg¥•‘Fvx°‘LVyéÙn’r®Ü˜ÕÃò?IËbHƒÓ•1ôRµ^BåÐZOõrk^Ž`î1Q~îCÉ¡¤‡e×Óf[% ÷Ìð.ˆµLQù©ù9‚5?'0ÙågÛ›~kÏåÌ[ëa7Ãâx±åp½ß•š!„æ[t¸`nQ¬U1nT$hPU:—Cï—ÈX UJ«ªªà€J¸hâߨ ³—ãÿe¿lv¢(ܵ‰ïÀÆmãŒà€Ë¦iÓÄ0išÆ…iMnúþöþÌŒ?ÐNa ™£Æ{ðÎð1G°„ÞŽ=þPÚÁlRêÇnvsSfx>ÁW߆­4©¢ùiWŠæ?!€'83˜¤~ÍŸÓj×­õ}rvyZŠ`öNÂ뀆Á¬­QÚPÛ…1mE ƒ€Ëþ⫈ÒLJ¡Î­Íïáå…öBÀvøÏ?˜R꥚+½Î‹ LLï˜ Ä„%æ’I½Îàeš³YrîP&1玥ÒQÛÁð·J“Â;æ‚»‚s´à Î fsîÌß8ÇRn‚‘sKùhÖÖ,…ŽJˆ+cÚZä&ÎrÃS.((
+¾_£Χ}¾[éúa÷±/Ìí' CÛótòª„UÉðPÑ[«‘àT›ÏêÏÑs?ÓhßE­1<æ°Ëíïqû½]E©Jät²y™ƒ¼ê®±†IÕ3­;Xw¨]°ý#g×xŽýàÝ Ù'Þ ý㵂ô…×Ò/kÔ„¾ÑN
+„î8+ºkt„¾qªÝÝÝÝÝÝ5.ÂBKòMt­@è®2á  +ña+ýF8È?ðFAè²Ï/dC¼ã
+endstream endobj 179 0 obj <</Filter[/FlateDecode]/Length 5613>>stream
+H‰ì—}LSWǧPÚÞö¶¥-¥€À-Ø®å¥Ð7JyQÞ*¢DEHS+/JZP|¦”eÙÂ6<ËFÍMƒÑ %ã12õq$0§$è24ÆDÍÌþó9÷¶ååT)ƒ{>MÚ{ç{ßs¾ç¾ðò%à=·óréüÃí¹Ó¤ËöÜcò-í-«Ïwåí[]&coéÖ® yû}õv¬›Ç뼉Ò9Þà ÀÚ×hpM¡x9 P1!|…h€Â‹J¥ÑéN£R½€’Ð-.òÀ%4:ƒ‰²Øl€Íf¡LP¡Çb2»ˆJG˜,—Ç|ŸÇå°˜º¨ Q¼hÊæò}ýƒ1
+ †Ê2ómlë¹<0tstl||lôæÐÀåž¶Æ£ó3ä¡À"Õ¹ö`1(4” Q&e›­õg;/ ŒŒÞ™˜|ð`râÎèÈÀ¥Î³õVsv’RÀCÁÄfU`ZRMÚ®âšÓíç¯ Þ½?õèñãGS÷ïŽ];ß~º¦xWšF&6£ZïáEg ‚Ãb3rËŽ5uô^¿yçþÃ'O§§Ÿ>yxÿÎÍë½MÇÊr3bÂlº—cqÂ`:}~yÝ™®+ƒ£SO¦Ÿ=þlúÉÔÄèà•®3uåùz]&`#³*O/„ã+ŠŒÏ4ZN6w÷ M>zúìÏ/þ|öôÑäØp_wóI‹13>RäËAœK?«2+ë[z®ŽŒ?x<ýüÅ_½x>ýøÁøÈÕž–úJ£áݪ–æÐµÕpiå]KÙÅåÊîuíJqùªtéàÒÝÆµ;›«wQ—îØ®=\|¹öÔsñ ëâÓÜÅ7ßR\|#zϵ·¯áßôæ+— XNÄâ-…iæ*3ŠänEq²^c=;Ͷª"+Šd¡H5Š(°äJ‰Æ¶ƒ/y4@¥À^s`ÿäšq è&>¹GPD­Š‘k0…Z¾Ëg›
+yŒ&Z©U*¹J ¤ªXЯVêð¿Ç`°2z¦ùh*bä1jÎ9X¡šw*GSãÐÚ›µSkoÆÊUj] 6{ªQ—(Duu3M\;cÒ>Ø>…™S9šj‡vÎ|¶Ev¡ˆ“ʰÜ=ıØ•l­J+-¨*µT˜­G°8¼/ÿÂ׬Z!ŠÄ8b“ã„ĔˉûTˆÜœaŽdAǬ¤âU>@ŸÕì8–&ë±äê* fߥÿ*’aQ9UÖÒŠXa“&Zö™’õ:Óöý¶"ë¡¢BSfÑ“}”MægŸœ ¯°T`±:e´}vÕøŒñm†o$5±gÄ®!¶dzéEqŽã”¢¥Î
+Ö Ë@‘|ÇVS`*µS(µ˜L;ÓàçÊ-Y|
+°²H…Z«‹OHLÜäFâuZµ"R¶ pY `s¾KÜ$…Æ`ó„A¡²(MÜæÔt}¦!+k»ÉÊ2dêÓS7Çi¢d¡AB›A£Ì· ò¦PÏ/X©ŽOÙš•³'ÏhÚg6ïwfó>“1oONÖÖ”xu¤$ØÇB¨ùü¼é(W,‰Ò&éwäš
+KË+­¶ªêêêCnª²Y+ËK M¹;ôIÚ(I°‹ÒçeŽ/%ÁŠå±)Ûvï+©<ôaíÉ>n8åF>þèd퇇*KöíÞ–+
+8 ó9‹I,%‹ï¡MÉÚ[d9R×ðéÍçZÛÚÿí6ÚÛZÏ5ñiCÝKÑÞ¬mD¨?ŸE,æLàžTÇ7X¦ÚlØ[l;~êóÖ¯:»¿ýîû .\t  Ð÷ß}ÛÝùUëç§ŽÛŠ÷6«dÁ¾ÕÓÃ98åù‡Êã¶î.´Õ~r®ã›‹—ûúøÁõeÆ^eàÇþ¾Ë¿é8÷I­­p÷Ö8y¨?¥ÏFŽް}‚¤êäl“åxck×Å~þùÆ­[ÿʽÌEnݺñóðO?\ìjm<n1e'«¥A>ld6rà.Eè2ö¨ihéìí¼ñËØ¯¿Ý½woÂMÜ»w÷·_Ç~¹1ØßÛÙÒPs`O†.B$Ä#w¸÷!
+Éõ߸Íh©ýìë ýC·Ç'&ÿcjê¡Û˜šúã÷ɉñÛCý¾þ¬ÖbÜ–½ÑŸË¤Q÷"pñPh(oƒD•¼ãì—{P×ÀÇyl²IHBB ! " IH@D@+>‚`1<¤ D ÄgÅ¢¶Nµ•Q±^Ñëè@}Lõvt”ªs¯£Su¬ÓÚ‡Ú©Sø[‹´p-×ëé=»y½ê‘Ìì/3a÷ã|çû³g7gËíw>uñ«[Ýw{~íí½O½½¿öÜíî¼õÕÅS‡wm´—ÿ%-!B.BÁ³è±%› Pë3gW­úpï§g¯Þè¼Ósÿ·þQÆÀ@ÿo÷{îtÞ¸zöÓ½®ªš©W+xìa–JMb–yQãÖ¶ŸýcwO_ÿƒ?ÿMƒƒ<èïëéþñëÏO´mm\dÎJÔ(=-ßð·¸DmÊžW÷ÎöŸ]úö§_zû >üà%•>èïýå§o/}v`û;uó²MÑJ ¸É"§%“”Sl]·ãàé/¾ïºÛ7
+1:Äüö«ðÉù¥K×mo;vöÊõ›·»¨ÿ…ìº}óú•³ÇÚ¶¯[Zš?Wùí!vþ²°Øä좚U›[8{ùÚ77nQ¸Ù ··n|síòÙ‡Z7¯ª)ÊNŽ “ù“»qî="(£ Sf–-mjÞsèø™s¯\½FÍÆÍµu»võÊÅsgŽÚÓÜ´´læC”R"@˜;7â…B®ŠKÉ1WÙ×7·¶9ÞqƵ íMðùó®]ð™ŽãGÚ[›×Û«Ì9)q*9ñJá±  “ëª1¤ç—TÛ›6·ìÞàðªß(Ž>°wËæ&{uI~ºAèÏõx=#&جËUZSfAI•mõúMÍ-;wíÞCåÛٞݻv¶4oZ¿ÚVURiÒªä`«ÎôxÕuN¦T‰'gæ•ÕØV¬iÚðÕoºïmhZ³ÂVSV”Ÿ™ŒG*¥C¦Òù‰ðD2L›Òs ç-XXc]b«o°ÛíË(j¨·-±Ö,\0¯07Ý„«1™ˆ‡x¼B’—L&‡/
+UO0¤däÌ2Ï/]`±”Q†Å² t~±yVANFŠa‚:4HÌçSé¶$'“Áæ
+ÄAJU4nHNÍÈÊΑ——O!yy3r³³2R“ x´J$pÙ Ï©tL&¡ÉÊC#4Úx½1)ybÊ$JI™˜œdÔÇk5¡ò@Ÿ”ôœJç5g°9<a€LŽ…G¨51±ZíJÑjcc4êˆpL. ò8l†ß0I—& AùB±T¬Pb¡aaaáÊ…bJE°L*òQ„5‚¤ó¢û1Ù—'ŠÄ©4 £ ¢šT*‹„a3ý†_nOM“ÅæpQŸ/
+lÕÖ*,†¦N«X\VYš–m*Í/«¯´-«¬(Í­\YêhUålç-š[[1£)>Î1\;1Ä%¡Ž\o8¹âÈå<µº¶2Éyœ^YUmu-n0Y YŠ;—)ŽétF,OÀæcz†ƒË&ö­‘çÎFÎ?F,Xù‰dc°˜±8PUE–$î°$,>N‡À–üIãmžçéøzZyÅFl´U_­Û+÷==xO
+Ü`$©Ô{ Iêõ^HÒ[zÏ/ùšzWÏÁ˜6ô¶Úcƨ¡·¥†CÂ3æ ½­32´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<cËð5”üó ¼m4Úž' _+ÉõÆ„ák"ù ½1aèuÉÿ«7& ½(ùœzÞ’|!=ê%_BJO½Ñ–„w=ÏWëö
+UGUì¥m©·¢Ì¢z%ŒóàÅ3ž3“hòÀÇ qöìDGН¯Ÿ__2óéyDHñc0˜,›„Åb2DæÓòˆBD
+“ÅF8\”G‚r¹›E$úŒ˜Fòe0Ù—Ç÷ŠÅ’€
+©ˆÏa±y~@$)Â5¸qRFN~ásQ‘yNaAîÔTS|Œ*$PÄC˜~žÅˆR 6*”†¨bô)™3fÍ[PñVMmí¢êJKÉ켩“ Úˆ@!Êfx#J±8‰b|¬!5»°¤¢Ö¶|uãÚµo¯¨¯[øæìÜ4£V¥¸,bd)„'
+
+‹6¤æÎ±ÔÚ×lØ´eë¶m[›7¿Û¸¬®Ü<#=1&<XÌC<Š9JùK•ê„I¹s+–¬~wËG{öµ}üqûþ¿ílÞ¸fieÑôɺ(LêïY dQ‰‚Çk“²f—/iÜ´cï£ÇNvtœ<~ôà¾6¯µUÌ™–<a|°ŒÌ# ò%!j]Zþ›uooúkÛÑŽœ¿péÒ…óÿìø{û®—¤ë¢B$|RÑ=,&Ç?04Æ”õ?…§—·O[²a×á“ç.^¾|éü©Ã»7.ÞQ‘áa¥«$!ÈÍó##Ð[<ÂR*v¾qù ¬Û}ôÜÕ›wîÝ»{ëêùc{Ö/œØ˜çgg *- òB'¯ˆŒº‰SPriûŒÛœ»~ïÑÓçÏŸ=¾wãü‘+gv”¥;™¨ËŠðrÂuƒOTNÓÌ5,£ºwþú}§¯Ý{úòÍ»wo_=½íôþ óûª3ÃÝÌ5åDùàÁÒ ymK¨œúIK¶¹pûÉ«w?þôþÕ“Ûl]2©>'ÊÓR[(ºÄt¬¼bò›¦®ØyâÊýçï>}ýöíë§w/î_=±sÅ´æüXokEq$]À€WÔµñ‰+l±j÷©ë^}øòýçÏï_?¼ztýôžÕ3Z‹â|lô%àAÒÅ- ¡¤gë_Ü6kÍÞ37¿ùôíç¯_?¿}zóäæ™}kgµ'øÙê)Ip£ëÒ·õK(阽nÿ¹[Oß~þþë÷ï_ß?¿}zëÜþu³;JýlõÑt"YYßÎ?±´cP×md]·ÏX?§³4ÑßN_Í]’]sÖ8ûÙ»/?~ýùóëÇ—wÏnŸ?°~ngiH—$V]I¥sºî ëºC’®ßþü†êÚ@@WYçÜ Xu•ÑF×Á ¨º.Õ5ªkTר®§ À
+endstream endobj 180 0 obj <</Filter[/FlateDecode]/Length 9111>>stream
+H‰ìW{PTׯ^ Ëû©‚d/÷ž{îËq×RŠŽvUZ`Ôšhú°>ÒšêLŒI´1míÃG:£mª‰:¡N3hš«X1>ZGiê3¢ô;÷µ÷.`Bf2Îpavïýöû}¯s¾ßùn]û†ŽŸ¾p­ûî?~ôÅÝîkN?°cC{]yaÁ˜´¸È°áC‡| ®!C‡‡EÆ¥)(,¯D ¢Qƒ¨AÔ ê:vÊŠ:uì›Aµmر¿OTÛWDõ<~Ü£¡ö?ånÛ°P]fTדP©*jýö}G;»®Þºó çÑ£žwn]íê<¶û†67A¥ZP¡‘±©YSÊú׿¨ófÔùΣû^_ïw—M)ÈJ BÑSf×¶þäµß½ûѹÏnÞ¾ÿ°§çáýÛ7¯œûè½½¯­k]X6…FÙbS2“Kk–­Ýö›Ãž½|ãó»>|pïó—Ïž<òÛmk[jJ'Ó™©±¶
+ ŒKÖÌõ,]µvÓÖí;ßÚ½{×›;^yiÝó˼óJŸÂ¹TJIË@)!F'ŒÈš L-™ãnl{þÇ7mÞ²eóK/®]ÝÞT_=Û%æ™­¨¡4g±ÉécÂÔâʞƖå«V¯Y³ú¹­M‹jªJœžkv¥9‹°Ç§ddçóSfÌ~vþBÏ’ï66~¯Áë^PU6³P Çe¤ÆCV&Wª³0[t|Jú˜<V*œþtyåœêyóªçT>S2sªŒò³3R¢mafWª3ˆ`£2Çå³Â¤§\3f͘6u²ˆ9Yé) 1‘á!WÄÄn³Ç%¥¥gŽËs°/J’(`–ž0>+cDr|tdxèp‹+ÅÙ°ádTL|RÚ¨ÑYÙãsróòòrÇg¡ÒG$'ÄÚm*È‚Òaá‘ö˜øÄä´£Ò3FÎÈ52-%)>ÖÒ¤À
+#ÀôRÝ)Àá!Æ€ôÑpHýªBž€1€Á×—@ú@~5Ä7xegÏhöLwûÝv[õ,»-ÛYÌׂ¤ÂÝê÷¶Ømev[›ÝÆRÎ¥vC•ÃÍÀűÔnÔ¿j7€Xù«^i·aI Aà)–‘iY–©&‹L Y,c
+Kͳ‚
+—EE+&P¢’­2bÊHG¶Æ0\+0µÈn«²Ûd*'—ªž«Üg×8[üÓêý ¾fwËJj"‘M"¤øPvÝ&è€ìZ“U¤¯
+ˆæ9‘"è‰fxX+ı´,’E5Ä)
+ú#¬ÂÍ ›t°Õ¶xQ Š„‡Ê±ŒH,ðV/¼ bDbè «ìeQeÏqÈ4†D9Pâ—ËY_ßÖTá󻉲µ˜yJá”æ§bx C—³"‡ò-q¬hîN.±¯Âܽè›È28 „dàA E¬?˜«§<K4‡”JéX‘Ó°Ú
+iÚ
+!IL:X2™PÌ«#™œX#6küÓzeTª”ž¥¦¿ˆæ\(—!Dˆ¸¡D,¯=˜s•”%F2–©
+Z:N—‰4{”,%Y$NZ„@Ú£–%PŒYó´Äq&3†Àœ­&ƒrÈœÒyºÓˆaÕëÕSã1tô 3ÁyÌU§pÐL·ÇK«Í]ÒàFs0¤[1’¡TŽEh,KÚñH Mh‘‘h Y¸€¥jgÇ:X²+eÊÈ™£·ü@EILƒ˜ªnÒQÆ”C” J’Ù~<%10krè¸ê¿ŽK×@]ªåÔü-"Äåê÷œ0 ¨‚2Ÿ¿Â[ïkñx=*KõW½‚
+¯»q¶nQ£r¦9‹‹ZÜžo³ÿÙE¾–&õ·Ü>ˆ¢Ò¿²Ñ[p­© œ=Ih¤/È–@Þä“lµ@Foét,ð b ó"DÅ‘Ç<!hŽ'T ߌ ËÛÇ:šU(Ó'‚W²Jˆg$Ár£Ó:ˆâÉú]íÔç;¤ÍwpFðÔr;i%ØZ2´¦Á<«òGcŽçÂR‹¡±ÄbUhÀû’Þ¡+‰3*M8T›„̤‰˜ÃB&†]ɱAŽ`¶“9!HˆÖoYð0Ë’Lp-””yZ`§6±°%•¾Yå°QíÄ LŠ26)A²,´ †ae Ò' k¬Q4dEðÂÞ‚>EʤñÊ0‚눬¬¡Á)S  «+S½CpWUs³» zl±Ö2ìx¨ŸÌAUõ½Šaeø¯L_Ä
+Ewp05Àb"žÕ’„#š•Qß&ÈP¡~Á2!1¥% õ"±8î‹Éžì+\†9™ÿ?$3ÆŽ•„¯Ifß#ýð™:+)VÆÊf‡£ÂÒ‡rM“Š€¥•àµI¹V™ÔEu ‰6&LjX€#[aÝT@¢yT€º N"샀)2W!Ò—†G]¢ j`†š¼aªWŽ
+©áÓ’ ÑÒîpÒÌmSmeëêŸêñ:J—â+mCGY¥Bÿ•®Ÿ |©Bý€‹½˜sËZjñ¥¶¡£¬Tp!ì¿C—Üæ¶µÖv¨µ-µÞZGás3ôƼoÙtT(­r•¦£Ú¶ÍUèP«4%>$¨TGI3øjƒé¨­P“³8´
+€¹£:¼’3%>cÉf_×o®£ð»Qƒ]®"Qx
+)½œ“52•”²ÜAHís>½kN‘R7ãëÃïZêvZ
+oD‡¨bˆ~Е'½‚
+áR®n.M Ñ›µzâË­¯1ù¶÷¼K4×yVKá‡g‚¤$üA•¢2-•ZïÒǘb éRuCM‰–fr*oD_(…LN¥š“¾TSNUìÝ81:=±dŠ_ÂÐS ï*~fnµ(¨Â¶]×ÿeU«N×D,óT+;§kd2 *|¶·ŽÍì‰Oõ³O'A•jL_aG{`‚Šðeˆœ±QÝ,FD–Ѱ A…DB¹èÒª R‹ò‚
+ªáÆ?TPI¨iÑŒ|ÁâT±ãMž¡x19¹ŒÃ¢Ô ‚j¸Ùâ-Ô¡Æo@P!»ÊÍ´ êØ© xAE>H
+{zEµžPw'4•œPr! íN'¹äÑK*6:|v¨ÈKªhÄjõ’Jj!ÐBÓß¾TUT)à^Q­ŸÉ,Õ+*ý]€ý‡8sG/¨üN*mK¥·TÁ Û'¨ZL\¤ ª-Ĺ
+j‘&¨Äœ â0à•ëU-p1ã$Jyn¨¯ä¼¦ bŸà‡Ù×õ9U9!PÀi›Vê!‰X ŸÕ6`z
+ƒ§Û)Au›œOïšSôÐÔ¯Ž>„žú°¶å‡!«THáÅÂ[‚ à9 5ðUxÞ%õi¼”†ÒDaàåŒ*zbÄ«†×zñÄ#…ÔÛnzD­:ß½’°[O\Ÿ(óãÉ‹s—PX…‘ðºÔE"aí±OÔmgË#"fîxqÞˆãZ·h0íÆ%ÿ»W1¹±ÞŒÝ«°Uú¾©0²|”üS…±[ô*¬SSô" ?W}ÜœÛðnÓÞL†ÕQôà5cG÷ ¨iVÿ¹5 ›£š/…
+D~ò§#‹Æ”`ìN‚I(ðŒ2òõr °1ÍHd¥¹|jPȘú«0òNùÅaå}ê ÁVjHMMhP,kíw8Em>Y}ð‚²ƒiërRíd>y ’—,<E,Q…“E€5 ¸)¶ó5ì³<Tõ¥µ¡j›Ž5ˆ‚F¢ª¬¶ÖtංƸePx§Æ\ÜÓ¾žPw'$
+Ê|è-³4XNgsÉm®­m]ÿ³CE^}éZ|­ *[­+-Ô(ƒ¥VãÀû:çÂZ+øZA5”ùäæBä¶ÿ]r››×Zó¡Ö¼Ôz[ýå>‘³?ä?þP ‹ªYî§Úp©¡!mÑžˆ:§n a®Y‡º'¢²Ì‡~°0ðìͰÊ,‹C«`%¦ûß§Z³õ˜•1Âìëúuï긧øŽ‘0¥»·õ~ â/ÚjÄEFläN<yúRx" ¾4¥våñèº0•Š: ,uÑiü5'|Jè±ÆËÅXçXÅf³OÙ°SFžÎ¤
+Çä…3Þ]JK7,ÚĆÅm3BíËûp8 „Ìß½³É"]@p8Ì>lñö.:XƒÀ’…¦€‘l븳Ñá°ÏnJp8,>a öY*ÇÝ6Ýáp×Ú¸²mà·Bq˜>Ø9w¿¯'ÔÝ ‹$Òît’KûøcøìP‘Çá8àqÖêpXkUαÊ`©Uq¸â ÷õ3™¥:ÖRaF
+Ñu:2b ]6¦bœá)´\BÛÌ'/FÌ]BØ%kZeÝêÎO›òjËc=ŠÝoN¾|íöÆ UÇî9tV
+±{Ž’AÁs4Y>JîÉÑì=G'À› Ž£S„¢]Êq4
+­~Çèûbtðœ¹iÇ ž£SÞø6MŽÞjãv<Aš,Úý'I³x”æPàQš2òýò,“<“¥;?™ž¥É¢oÀdiv ž¥9ԡƇÓú†c›z°këoýÀؾ$ƒ®_Hîâh;¢¬ æEÍ‘ŸHîÒü³åÇ›1{íÇâzö™Ô¥RߣýŽ5r’1”ç –xrˆÎ—ëÜO¥zô¾-´Þn[ä)¾ ü¬2å\]…fÊf6ú·ãqx[êKÁ»¡Ÿ1l>ò/Û§q$Zü=¾[66CèÜ Ì†#ÛüÂNÙÆÜËñ>yÚzØ·n)ÕùõâJS Ë×ÌcùšÙÕýt^ç׃’%ÇÒÓ­?¾{|v‡Z`½©<þ-káoi´ŽÑEä6Ë>—Ý»6s¶­¢7?«^]¿þç«÷š“¦ªý¿¯_¾u4g–¨i<©Oþö§Ë¿>ÿ¾í~ü9=ûñ/o^_]ã¯?þø» z•ŸÇ@2ºŒOž¾}‹^¼»~1‚Ä‚„`«pñä9>«~¢06‡’üùíËëHq‹?ã2~¾yó/tøáÅ{Üý¿xýÓˆüûwï^ý®^½~óòÝõ8•±ªñgúßûÿýûz–tøóÇo>Œ¿?_;zïG<1!ÆýÒE=ºzûö«®·mc‰¾ð и¡÷ûãÑν¸uá4@ãâæÍ%Vv«H%·iý=Cr—K[Ž©~$2² ¯Ž†Ã™ÙÙ³sVÛz½Ü<ø Á6‹ &ß¾t‚#Òš.·ÓŨĂésIm;­Õv\Sv¦Ï%µÕf3]ŒëÇh{ÉsÇ´× Í~šQõúî–øqDŽÑö r±wõrTbÝA$õä ðkUoO–7‹Õ¨ÄëƒHo²Z¯;Oƒ4¯¦³_¨ÝVóQy¦æ‘è“ûx½®ÿ¿‰õA¤ÇÂìõh~³j¹¼¨>nÏ6ß^¼9•äýGþµO*SEþñª¿LjßÌæÓíôÕ¦šµãþÓ•½_È{!íêÕýB
+;wÁ4ÿ¨†ë,CG7ï¥Ö£TÞÞRuÃÞvjŠ“LR¬ÑQ½xâš–08ïm?¥£¤Þ­£vª¨^tE¥ØxuÉ÷RÜã³:Ò\­ëyUg•eT–QŸ%¹cØqRè]·v–QYFe•eT–QYF=Ö«YFí”QÅÉíÑ V¼ÅGÉðOòâ‹öÿû)t¾àB“þŒ5ËóniUésò"«ûß[ÓŸº{ ÄºÈXÙ³–yb™'²&˼¹²¼Ëò.˻ϑÜ1no@¯&뻬ïHd}—õ]ÖwYß=W}÷œõ“Ü_?i)œÌúé@H7맬Ÿ²~úÉ5úI{+´Íú)ë§Ã™»³~Êú)맬Ÿž­~‚<ºÕO‰hbƒ¥è¥T»|T?õ’èÏé'¡÷ÐOjoý¤™´Leýt ¤;¹Z×óªs}f•uÔÁ¤öÜu”cJ³¬£²Ž:œù;먬£²ŽÊ:êÙê(Vˆ £°lÅýI—"J*ñ'uT¯žPRb/%¥÷WR‚iγ’:ÚÌÖ«m½^n²–ÊZ*k©Ï’ܱrž;a]–RYJО¥T–RYJe)õL¥ÔÝÑ V¼…bb¥²’ZˆR¦H[¥˜7V
+ /iÍ,3pVJh)Ö
+@Ä—ÖJ5¨3œã¬ ÊŒ×7ì6P5Ñ«8¢E Ñ"–Œh‹=Ày\$=€œ}:¢ÅfÉf\ÐÄ ¸QÌÐÄ Sª›@Dÿö#42<&h_ŒkZÓqí
+ÑEÎ
+$¬3Mh+–#ÐV,X ­´Õc‘¶z¨£­¸‡~âF'¼"á­Ø5‹}x«zÞzÐ{ñ–¨‘£CÄs(Csˆ@¼\€ ÷Ó–¦Ä0Í Z(*ÓÒÒÀîYÕl9]%¾:m9¦äÿoý€Òj&hKmD-˜Í´ Qa.;¡vùüŒo¿t±®xN!¶Ì€z$M;?zñ)ãèy;4%‰'íÓvÒ”ø«ŸÖoGÒ¶L!1Ë*ß¼&@ Åâ<p>~8¥Cˆ‰Á;C|‹ÖŽÀë£àa•ê1øA¯B\ò3¬”–ñÞsto‡§ˆ… ÏSLƒ†„- F'Ž¿±8ŠýzGU)7¼Yù¤ª±$çû%zÝœ³§šÇ‡¦Ñˆ”5¡]N,JŒSåÍ~x9—çM¹$m½¶1f"EAo¶Òí­ØšùƒMs[ï $'/õÑŠrØP[êL3^ =nÀ¤”ƒ8°'ˆ#F«|÷dZ“”é 4„%ANŠÖì~=Î÷áXî%ÃE„S£pCâ|£ÓI‘îC°˜½½2­)(£™Ín&jÜG\‰¯“Q?Qà'è”a›¡À=è‹ÖŒ¶¦_ƒóÔ_VÕ—KÖÖ§˜\W7‹ëm—|uðo7óíu‡FÛP,¼"@¡0ÇïßœÿxöoìÖäò£|}ùny3«°úÏ她|YPyÏ8£Êª{†ǧë5œLëjüp­½Ñ
+û[Ÿ¡|“ yŠÏÐ{¾_Ï«}2âg„ññÃrƒWÓ-vÿên[m‚瓺ž>´›]ß,çuµê¬DUø™>¶¿ßV}J~þuº¼ ¿OZÛãwxùj1´£¾é»1qú¥“šÌÖ«m½^n |`›Åˆ“o_:ÁiM—Û‹ébTbÁô¹¤¶Ö‹j;®);Óç’Ú‡j³™.Æõc´=ˆäŽ­‘W8þ FYÔë»[âÇ9FÛƒÈqÄÞÕËQ‰5v‘Ô“7À¯U½=YÞ,V£K¬"½Éj½zì< Ò¼šÎ~¡v[ÍG噚D¢Oîãõºþcü>&Ö‘ ³×£ùͪåò¢ú¸=Û|{ñæ|T’÷ù×>©üMùÇ «þ2©}3›O·ÓW›ª mLeïò^H»zu¿ÂÎD0ÍÄ?ªá:ËÐÑÍ{©õ(•··Tݰ·pãÅÉ-´•#…¤Sa%Ù:O éÜ]Q=RбÂjz7­8–xTéÁ²[±°z\б݂N³]‚N±’þÇ+:»¿¢³ÜZ•ݰÿäj]Ï«šgA—]tŸ%¹ÿ³_.­mA
+7Š”ßF£è‰F•áÇ{TÚÞ£R¢„âQyèveţģģ^åäö‘ŸƒÁcˆQDJDj:ÀE¤D¤D¤D¤Þ¨H9ã]…Ù… ',N›„œ+ p8ä$­Þõ¡V衊“áå*:NØÅresÌ}ñV«ÏÝRz"]ÂCóó©€ï£Ë< òÉ7 Dë8q‚³%±H!$õ¥V–*‚‚PùìE\Õ¢ok¬‚œ®¯-ûÎÆãÚµV
+rå“e¦s¤À‰ë¨\5™JB1†¤Àò„ÐB¸*w°«O˜—aCmÙw>0×Nø¶˜c>FËc~5—}\›÷5ʹwCíß¾Cµr±Îµ:f€S_iÌ»÷¦¾x¾ÃC9/^0¼FyCSÿæúá)};¹¹]tùÑâûÍÝÙåÏ_‹{­x`nöQ«/üÙvâ“©
+endstream endobj 181 0 obj <</Filter[/FlateDecode]/Length 2284>>stream
+H‰ìW}lçoœÄI.$$9>Rœ6±ïÃ_G ­!ép’iÒÜ‹}8û.;_€TíP'1P¡ ›öê6UZ©:ÊH¢Jûø±j+$ªTUê¦B›ðÇP+¦R ¦‚ÂÞ;ßï.çp¡-1Òý"Ìù¹çyî÷¼ïs¯Ÿß#èâ®
+Ì7—,LVÆqWù¦#"YÝÕÃ|“Òg5¿ÄrQšGb³SzðÄŒðyÜæÊç‡àù}q˜G|Ç](ȅ΋¥Pà†E¼‹ŠŠ­%9`µZ”1–"k©md·WêÁ^•—•ƒ9 °¸´Ü¾hiõŠÚºººz€¡®¶fÙ’…P™U)°—U,®^¹¶É…á8îV0¤¹qMmU¥ÍZ(FXŠJ+ªêñ§6µ;;»´èìØÜú´·iղʲâÌC
+,ÖòÅõMëÚzB;v&hšQƒNìê'{ƒUUPIæ!E¥öêÆu!æÅý‡†GŽh1|øÀ¾døÇšj–‰¶E+ñ¶ÐàÁ£o?96®ÁØè‰c¯
+½k–”[„2Š,]ûTsðõñSï˜Ô`âÜ™Óïüáp²÷éÆe5a…ª›6…^<:þÏ?ùlú¢ÓSç?:óÎkûÈÖæš
++_z¥Ä¾ÂÕ¶cÿ§>œúüJ*uMÔ•/¦?:}ì@ÿf¤Ö^"D–Øk±àÎCÇßûäó/¯§Ó7UH§¯ùÅù3'ïêÀê*…Å•uxgbøäÙÏ®\ÿæÖm n}sýÊÔ¹ÑáD'®Ž GÆ&¦Sé[ßÞÑàÛ[éÔôÄØºKÑEŸ¼˜Jß¾£}åîÜN_»89~„QEÔ»»>âÚM½ˆ›b„»ÞŒ0#Ì3ÂŒ0#̈!ýžÏ¡33äš
+Ïr‘ùë%ù`þz‡ ›×ãô¡>?ìEQ'A¸Q8¡´!N°·ìu;q¯Ï{ÆÉ‹‰’! ÙpŸ#|DÖ6ÓëVÚp·è$¥ÎÐl&É#g’mnÒ Ë™ÙLféñ’$’iJ6H®E²ÉÕŠ™³ß±l"í*D; [d#`G#Ü»]¸n¹,× s1†&Ù!xo{’ÿà—,x¤’BrViu¼U®T²UV‰vP•AߪÊ@ç"l,)^;íp`càLÇÅ^ a×6ŽÑQ¸I¨v"L
+´¡®¾$Åî¦"¡-ÔP(ã•lý2U£Àfh؃™ª³=ëwûP?ß¡€=F>Ç•ÍK (áå/ü„Á‰ìE¶‘1m#»Q§{F#g·M¿¹Q¿º¹·WÛÜ8ŠÎèmî¿ßÞ41?¡¦$Q—»kÖŽ"t:IQ¼Âª(_iË€œ¹Àx_‹ hgÅ2蔟µqÕ=–Y D<·ò-†¸×Ë·êAO¸ðà¸OÙb~ù_o çáøøpp‘Po `·Ý‹!Â?Px#P®_ØŸ¬Ñç–_S›bú6)8¨—s.”Ï»¶RdvôS±h?'¾£&Û÷Ä"\¿h¹%ó^ÑäÍš†D“«·#ØÓÞ¯ƒ¡½ø¦Ð¶x,L«ÖPˆ5Âü9ÑŽ"!ÀxI™a×F†IH–"¥<`KšÈ»Úiv$ùLr ÿœN&B‰gÕŒÃköÛ€ÆÞDœÍ$¨¾AŽ’Ž(å¹§ð ÷Çâ–¢¥EYI·ùnh€Ê–4ãön2>(Ýwd|¥3TåG“ É <_‘t¾‹r„šc™x2qU™* ¨ø6ß(‹ŒsÝdÔPa’ëÃRG²QŠ3Ö”¢ëÃRZ‚J&ɨ±~”}ó¢8†"êÃ0÷½Ž”(Ë ð¤"eß¼(ÒÀ²qC… ~yQÔ=vS,ˆÇ¢´¡ÂÞyQžÌV¹^(U™}dxßntÄPJ÷¼(ôžûØÏ°/ßG…w^”‡HÃWÎúÂT<ÞMíåÚ“mÝACEjCšæRÊ÷´"?øÂêÈs;ÔV‡#$G6')š‘•Õ.¤†’^¯Î’´syAFù 5œè)u´ð\¾õøRºøÕ•öVÔ^n‚×H¼à⯀BɃ(¯ÀÝ ìw2
+ÕQ ÝwÒP@:ÍYDá‚`¦ˆÊ“óÖÑǰŠ5%”)¡L õ@Šs¡˜Ûãó{ÔgJ(SBåÏèmJ(SB™Ê”P©„
+nÿÚ=¡V:$‡(¶¹ž¿üÝ,‹S,d‹&ÉÝLÒ4Ñ5
+endstream endobj 182 0 obj <</Filter[/FlateDecode]/Length 16119>>stream
+H‰ìWkoÛÈý.@ÿaú!@ü!ÚrÈáE>Sëİ]‹B`,Æa+“%e7ýõ=w†/Éò#Þ¤M»Ò@5CÞ™{:»x.ê÷Å+wÆÙtòâEÜùºnŽ™™f'ËåfµnhêåùbÆé©ð$˜·OþT4«²®Ž™3nW3zÿe¸¸)«²}ùˆ½<¢¥Ër½,°xU/ëæ}ýÛ,/úm!&É×XV?¸ü‡sÍô±tÙÙ©y$¯>å«Uù/< |7pi2ª7Õ¢¬®£ú·cÆ™r™Ç¦¸ Å¿–çÅêÁ'’újsST볦¾*V«˜Nµ:fñç¼b§ù5Vrö·b¹¬eÑ2¿ú'Þ O¼yV. (y“¯™2*‡'îܼün…· €îͼšŸÜ`ê¢X¯qÈ6¿ŽÆ[ÒÁh¼ü弸¶‹¿µ’/‹›Û%€1*x™y êã:ºïÅÉÌcBøLLCW_wGÔ->•ůÇìM]­Na³¾°ØrG2åíüùfY4ïªr³ûfN[UOëE±ÄãÃûÙ27š!†kûÄeÞ\k˜¤^nÖ†2ïÖÞln~Ì?¾h7y{[T—õOæœÚ9ŒÆYÀ„
+ —sŸ‰Àì!=h+ÌV‚µ¿­X’A:ÙŠÀ?ƒ=Þ6åuYw‡Só×M¹ŒñLvWÚdŒ¾ºû¶'…ÞëuQuGÎ<>œÏN/hß´ZÄõ á¿2Ô…©+°`Y_·«Ã³›ÛV31‡¹Îš²"ÁÓÉ»ÌÏ–,¾nêÍíIõ¡žN^Zß½lò+<ÉÞ¾ÿGqµ†¶ÃÝŦ\pÁÛ£GD-ó*o˜Y8bíäå'¬ä8³ïae˜{ŠØ¤ø
+x Š¢0ÒQ©ÈUe„“FnäD"âa¦aBH…a¨Ã T>h-C7©BriT':Ö‘ÆCZë
+ñ¡¨ê,»–µþ ‡m}cÙÇlk­;Ø7Øcߌlkllì+[ß·Þ¯ŒƒÞÂ] Hwl,FvvMQ0XÛÚ»³t¸eé¤i7þŠÉ}Å£ÛÙgš¾=‚ÄpƱh_Þ±ÍQÚÆ â©g"Pß(:°mËRâhÐfpÓDÑþ6ט‚¿3¾i
+CÃBj ©!¤ì‚3¤¸–™Ð»è£Á(Ä 0‰¶ñÀ2yLL1q‰ß P©@B¡Ô•H÷Ê÷•ÉC‘Ü—ÉÚÚ±+Œ|“­º²ˆ÷¥aÔǪ-Ž%4và~’Âg[Œÿ„@%
+vŽ¿ù’uÓÄĽó8ˆ»ËEÑsq›z\*öíͽ…"568éý 븱Ùnmtß°¶ÍÐÖÀ˜~ÛÚè¾m½ÛÞøöbëNôW«{wuzÿè‹iH$d,:öjqê®^;üþj=ʆª/¾éK˜â
+‰ºÇW·yw%D–âÉŽ>ä‹ÏK–£t‰T‰„Ù§Ëç'˧¥ÊQ¢y:éDZ%F3Òíßì—MnÝH„÷|‡9@‹,Ö’ÅŸ9Io{1÷_LDdV>ROÝm÷èÍ0É$>²22ò ¾Ýo¸^–(½©¹
+<‡ÍSàªóà‰ðLf O†gÃÓa qF<%\8£]§E¼Ø”+WUѹñä„7z¿Î¬ãsáŽo?ó“ú‘jï…;¾ÿt{¯‡§âÍ€ àEŒ`ö"ÿ4Õ®PwàPÑ¢EÃ
+®lÞ< ás8Ò?s"ަ •Nlô{ |_èkðkøk
+ „ï(ì u
+ßAø…Áå†Á‚_,
+.zù‘jR—Š [Ñ.ÙíjªMtçñí:’]òæHì)¸n–óÒ{“ü—5È…/91½øÓ‘ya²äÌUîÜÃÌ"—¦OgyõD)4 ŒëG#Ê·y7Ý›þM¯án_øÄU´pÇûÿןªòUáŽ_ý|ùÁšßë-þ>JÊßFÇþ×F«\±VþÞ ‡œ¿¼Å’ hþΊ¹.þQ×óÇÛ•©ŽÓ¿¦ù£Îóí‰~í}=ÈYKc~yÇ”Ë0óŽ ¬*ów*¸iͼãøƒËŸÓݯºåOF¾ÿç·ß~@ö§Ÿ AË ¯}¼^v®û` ‘IÀ$·X˜+ì¶¹±­,3Õ†zôñ„Ó®²ï˜=¡Q0xýçh¸i…³,. ¬ °Ó©³ie­©K(JHÅ0agñ ¥×_`Ïß¾¾¼#ñÈÐÝ?YO|šã:RW¡w…ÌíY`Ÿ¼Æ¨/ÞèÂÄÛ;? È
+„żª¨·)î5E¾Ýc”KþžÄ󞲌‘Ä2¼ég Õ;Ù[­þf›¿Ý®ÕurÚô–£&Ð>4
+§º³TME7ä)¤*ix’vM³MZ½´XèÔ¦­Ó¡-˜1”gkÅÌ·uÓÅšÕæ¾T´R_)£VJV¦±•²Â¯±q~vå£ ÇÏ 5)[-Ä›7§ã8l5Á•†€*Š øpÜ
+µõe]¦.”=¨ßºÙ¥´Ø ÚêU\yVZP'Uh5Ý"hŠ j5ôR,íu>J‡%ÒÔwëS̉MÉbóqÄd¬þl}*FŸˆOÜŠû?ÙÕï¿>¯)žzßn:§Æ±Ÿ¤ñ1Ô}„®k׳tl]»§+ÖTZſŨ\ÙéüÍ7±9G¬äŦ™À+V•>¹ŒNÊKRÀÆCƒh
+K®ŒG&v“¨É©7ys¢ß>ó¹N©ŸSÕ9•ðƒÉOŠHÒ}àuV¯Óz4ë“þ~^¯4“u^J28«ËÏê~R·SúþM§4¾ŸRœPyœ‹Éé'Ñ"Ï Ëà,Š'™žb”` @É„ã½k$ˆÑ4Sšba`@Ëp{âðÁ}3YÞÃ+ÏhÁ(‡¢3U9Ñ,¢÷Ðuè6¶oÖØ4¶eNŸ›>5xk›ÍMŸšÕ7‰æÅ§Åf…;ã™ï8œ Î…¦½¶-`½¶.«¿Þ[vÖzJõ»s«M4½{çØ7tÆ:çÙúîʶnY§Zt‰Äʽ?ïçiJ Ê4%MÒbÏR–¤˜¢6¥¨½§(ÏPÉ
+Éi¡T#=5§U®ŒË“e¥ìÔºà4\y5Ù÷!Ç»èˆðÐQn9ÉEg¹Xqž5¢mè—Q-¹–>ÊÕ)ÅßáÖ3iœ pwtÒ´_ŒwI¼Ü@KPïª-eìÛÂ}ùr›Wó{ÚuĽuá®ßdöYÉ7œ[2ûî³ÏîŸoOП¢?Éæ[´þq‡]§—íÝÎè¬Ñ+y™…e¯ÙË¡Á·{Ѧg©‰ß¿9á[ùšì/zƇŸ¯ëê¥40ôÓ‹TU<WµHVCd«ÙÓUU¾Rºš/ÏW“'¬b {¡Áyh'RÖ œ5)i-žµ¶Ðú:ÏÒùo®ï‹3,u'W÷âº6URõ办j®®då0éx´,5›†‹˜Áô»G&<•M"”—nk(lÿ¼Q†K€=Ži¤©fÏ»–hñh¸á¡¦_i@‰×DW…·.pÙUŽ»É÷²€(Oz3o§æ•i2pp.ZC•¿7y=Å{j+Òg’veöΪ·xܪÝÑÔaëñÉíÂ]¬N'¹XV¿ÙñU¯ÚP-ú~ÒÙ{tšýOÚl³4°È/×"Y¶¢I]'÷¤±±¼6I“’¨íZ¥•*½˜?6Aäá.)§„‚Æ[%÷ÌÉ…;Ê=ÍAwQsR»ª×(¹îòÑ=ïÞ{ìݵ¾®êéÎ^NøEï!»·‰PØ· =Kê–Í O úuù ÚöùÛoógÓ—uîUg­3ö©ãÌŸ9œN×¶Kß,6o}£h›ø&Éš´¢£áœisÜfÌ' œjÛ¢oбOXlˆ×tÙ|=7Ãs+`¶àææÞgx5=Z¾~üi„ÛvíÞ*W…SvO Ù¸w¾ó¸;ä5ª¦¨9J'îYÞ­§3Ëf–Ër0‘QÑ)¬9UÏ^‹§.¸”2×+oYÎÚšzº*NO³ç©ž¤†ÈOGOMð½-ÒRq®š#¥ž‚"÷ZªM¼E⪑"òbBiˆÀ&ÑnPZ¹ª­©#R Él¬"´R-êZ†Éb&™$·Å4Ì4—¯½Ã™}×dÚ¤V§÷ÕgÚ&|vŽÏÎò=û¤Nõ¢«Á“ÐåhœßkjÚ¬Dl[ß |È~+SHèEð:J^¦¯Á*ö²]”d:²ê»½ïz?Úàþø:?tžÀàŽ“Ô׫ˆ‰ôx¹*­^W§šY@›Æ>5jzä5ß*GM¯ÂÓ­Æ[ ¯2†‹:u< ^ò~µ·Úþ êÙ¯–·‘+º7ààÆÀÌF¨ë5;–HÈÎH6YFºc4’t
+ÌR™ÀÜg/ÈÌ•‰3eÒdÆÊ|å:W±N“«ST&S5d®“1‰>GQµa†²¢éš
+/ð
+øçšÆŽâz²øùò…ÆPKDtt½N/ú(+.Ùî<ßßIþØ€
+C\$lK»í1ÄQ.`9ŒåÑîn0ƒ1šŸA+ÅE?¾÷áÓ-×Ì¿sAá¬,ßcLpzàç<¤1¸°£S)â¡)†ÕeI385${0@Àfs7X¬ì
+V†ˆŸFSc, )ÜÈï§uðüZ¾}Qï§ËBÞ, °ÙÕ +»¢q6q{Ôf"wí
+ÏÈw †å¥‘ú,Òʃ£ø› ^ëU[{tklŒ3}œÇUb#‚a Œ%,KLÜ„ /ñ"Õp±H¼Ð/Ü>`0üa;0\5`xk’¨‡xÁ€Wã…“HWâÅQÆZã›‘Øæ$²E jŒh³ˆÄ
+‹Õ¹¶„XÃV–@µÐ9ÕÈa
+žNˆº†©Ðq• [b‘[@YC—Þ ¬`ì„2_S@<ÃÚ´A\-Ä£s_9ïëE˜ÈKgŒ-gìX˜8ñÆÄÃÓˆ(x¸‚ˆÑˆ :GDéxØ#â(&®!¢à¡!â{˜h¨hìÒø¥ábÝá¢0 ⨰LP¸EƲC†îè8áÃW|ìÑ1W ½ìØGu|\"ÄmprÂÊ1ÀÄ 7{ìL 5g˜¸Ñëÿº¢Þ”©ek] ‰íãaÅKÆ;×D »ò1MŽ+x&𠖉䢂è ]ª»D.™l׈†©+0jEí9‰t@_æ Íc!"
+<Î@e:0À¾ˆµÀ­6J¯àçhÎ@uºPî€v ÔkÍÙB;1 8rÌŽ“â™p1Aø8§ï o˜xÃÄ&þ
+!𳄇Œ¹¿žÁÂõ & ì”ÁRMaó¸
+‰ê™HK¶P5W´Ÿ–/ÎJÖhy£dŽö#…CO!QØsêi¤Ô±Ö,É„?‹0îÚSŠ&6’V0ÍøÛ
+?;É.L/^X;HЉÂⓤæ&f¤ÄY¾Œ–|ăN@œèÕ!IÞI¢Y0tYGD’¶V°4Z¿9·vj§ßºŸâµß§sÕrší„¥°¢Ùû)ßr^9}»éÃéÞØ«^cÅËw•+»ùÄéžÝ=±íž~ËŠ§w_^ÛþÍt?™’]‹f6™‘¼…çÙ:øŸxž­ãÿ¹çÙ:øŸö< yp™ô™tšôšt›ô›tœôœtôtžôžtŸš#JJJJ'J/Š=‘<f)=)])}))½)ݩ氢[ì;Æž±kì;ÇÞ±{ìf=dÙGv’½Ôyô“eOÙUö•eoÙ]ö—fÙeö™F'8Ö$tœ=g×ga³,n—~7 ÓA€ö‰ƒîàåáëT+õнB-ßËõkÙVXÑÔÒ½T+äR§×ÜëX+÷’¯„Þ–n¦ÞÓØ;Ûºë{]ïtë¶í=¯}ÇŠºõ¿”  !aéx˜;*2ò¥Ë…ÔÅàÄ,—Å5·6\ìï`ºF-Æ Ž ïK/zƒÅŠ™ñÒÀw•’¯º[ƒiמ~¥]`Æ£¯yœÛ¬÷jëcâuëƒûgÖG„6ˆì–
+µü¦¶r]j+»ª4ov"t.?v#Wf'n•ü»Pª.FVp²Ã$†àHÙ©§°‘rÊ÷"‚M±¦LGˆó$¢¼R;DнXºIìÍ\±r´q4qbáªyÛZ7±m4mmw ­ D6Wi΀òH}¤@R!)‘Ô˜À72¾–yå0a¤t·‘ãˆóTmÂ0s´˜±eYéC„8à*…Z¨§‘Q¡&ò+gs¹Ëõüµ<Só³%,ŽOT~¦¦}ujµB‚Jènb›„À‚PÕ(¤¤…|¡
+OÁñ"5VD†#f
+Ú@žm*Ìê%½*kt
+[š ‘>åt‡÷’#â[Àƒ.‰õUËJÅ»Œ"óÙ¨Ù-Á6·]3Eê#zFù/¹uQo²Ü« Õ^çSK:µ[:u›òß­ðdÅR ãSu9î’ôJ΋›ŒW^Kw¾æºIrSÝ
+lÑ1
+á £J ”¸­£0HtdVü™Ã€Ñµï¡²Ž{¦Æ—VÜY¨Ëj3»7â/°áO˜p°ÀƆ_3á»y|SÕ7U}SÕ?‡ª"DÄ‹w>ÎäÓ#ïrÜ‹½¢ª¯Y¦ªê ³Õøg ·Qù¶ØŸXëÇ'Ä~´áéœF ‘FPi#Ódª„N­ª¯”: ©¿,Djµâ{ ¹f@x‚Å7‚u•bÆ€$»Íj¡Y'D1H¹P-8M9ƒQ³;ºÍn!mç v¢7AüŽ`×,H¥Ò˜ tÊ
+26f[µAÈ9FþÇ~Ùô¸+Qt߀ÿƒ7f6 Q%qð6¢>³¼Õ[4t#Èbz‘™ÿwXEJ”ew’N0+›H`8±,U{ë¿\P¢#ØÊn×1¼'¥N¬l´ {^ð¸ú fLüêÊLŸ¨ :¨™“‘ž6òsz‚”¡D‘p´§(s”H‚£L’’l" –$Äe𔧍kLu+W^
+™‡:ñ°'"ò°¡<d"¾ÆD¦"»Kö—ÌŲãB† '.}¦ß‘1ïÈ0+mâcOÇ$Σ|lîS­| q'+10±q³ggÈÔ\0ñ“^ÿêMq.—’f„mÚdWÇãŠGÇ»œ‰ÓaÕPžeÕ–#É:é Ó ŒìöiÑXÄÅxíÓŠ±À¨•iç!r‚Dƒú<ÌÍÐfa¬ë 05C’…œ^F¶†
+úíéàÄ„1L®žÑÀ$+Âpæ–30$âú2ËúÂêrz@(ݺ°ŒyU!€[YQÚ5´/²*Œë=HwHÆÉÒû®0Ï/ãü¬þ}q¾wÖ;ê⨎¥Ff¨ÐÑŒ¦F6P½ž¶T2ÆËeV(uF³#ÚP1÷HÕ[jßÐÅW¨ÆFÜ` ;==jéTC¿jºVá#3éã@7{zÚÒÙ†þÖt™{t ¾4Ñ÷@÷= tààÁâe&-ºzèâ¡k‡.ºrè¡ë÷(ë†.²h¤5C— ]1tÁÐõB— ]-X, »ƒríê‰Ú¢¨’£ Ê‚RZTÓÄyTw&îLÜ™¸3ñML4çOዬ¥ÕcÐÖœßx£§>»êlªGj¿þçéáÃÓû¾þŽ¿Û9Æ6ÿ­¥“½•7OÉ_™¶9Wrä{Þ=V®)ö_Ž¿H
+²‡Æ*å:i¥´VR­T/­˜ŽpêvmÔÔ.šó#>€¨uFø®+§†ïÖ<Þô]åú>~R×z5ój7z~üj:Šªª­ë6N‘–‘*°]ëüîJ1]ü?Lu'£§­y—ÛþÆ~Âå~x\9{}\ñ9nËq•G€‘K6Ó'[ ¤‰©Zð;CÊ œ$Ž–äÑ“@’H¤f"—,¸™!©°Á’YxL9.xprŽŒNF†Œùbdt ¡•Ã"Òàhžôvc£apt ŸFÇ”†Gu ­ŒŸ†…-I,›uœô6Ž” C%z …ˆcE 7†KøL D=â áࢌ›8px|,#Ž8x&Òb%q
+qŒ°óË#‘qÆÞ q’©ŽP: Ìc 49C"iM<mªmfbY–y™HAVŒ^'ñ?†ûj^æ™ ;JÜõ)êºsMЏE¼ç—8àïã=|ç€ÞñË€O½ßŒø¾Ã%~añ ÷à%ž g\tx–þÖt™{d‡šéùˆK @Ñ´¸W5dTlT3”Œ¸ÜÐx¨é`Çá–ÉhØ(œqÂ!ò÷–{Ä9[¸k ¯†ÂŠmkÆaGÈ0›N[hmpâv+v¯’Gˆ ›4 åÚ-ÔµµÄDz€ö²ž:YgùzUÝ™¸3qgâÎÄ71Ñœ?<…/ÂFÞGÖý$ï+yÑ×c·Gw ݇t7¢0\Ñ¥­I7(ݦòn%±5n]iÿš¤çcºø ½÷Òÿ^R­€ '$4’®jåAˆX$‰M’ÜÃJFf#Ó‘ùX A¶…~eD)ù&N®‘Bz-HJ”‘’=%{6 ÃrÅ•Œ#%7©€‰IÒ”2±QQp¡ Nýâr/9ì-»½¦H¬[ïú”rÛ‹6)#kÍ¡“e/ÉßÚÏnßS’¸tµè«j?ì:›õ¯{»u7÷—Ÿ.¼ ÷X»|Íb§7G8x~a®ðUOHŽpÕN×]aç — ¬Ñ²;Px˜PÔ#IäõFDÁÄe¯‡bké×Sn8ÛÞ³íB+\Ѧ­)QPp $L”‚ƒ¬îx¸Ó•†yGC/4¨Ò7­g6µg½gÅãe‰ˆ·™ÈTlúW*Ž“‚+^L‹o¥¢¿5)`B=!rQRqËJoÈî'Fø>&Š”pÈ$Í1”Ù &ƒ†TPɬ 4¸C<–\Äyína¤æVfðôÜÑ銮Žt³£‡–œé™§SŽ:3ÑO/]0t V Þ=•57Ô;ª0V;ÖZ]7VY7VWj+•U§J‹ÕÙ+µ<=ÜrÙ]%‡uúæJnµÌõÔšêmÒùI/®ø“__¿bf‚·†ç²<«ã¹;jà©E *ÕYxLC½,usÔ¯£Žžz¨ðBQ õ¶TÝÁ3s.xzèÉDgÊgè“E Ž®uôΣ’€Z&ú¹PfƒŠ,jrtº£ßž®z?¡8(£ Z¸pÐÑÁˆG§b&”»Ð0ƒ’-Švh»Cåµt?á
+_þpOóëóï_>>~yý'}^>}~ÍŸývþ忯¯ÿzy>JMÛÿzz¸þ¹<Ux–îýGÖ”(Ä馯Kñ–¹é(ÈBŽ¥ UŽ“Èñ¶ GYHR¢}’å*Ê€(÷²Ü„¹Isg!OÊúá
+‘n2E¨²ÞYvš$Ôÿs_-¹‘ëHpÿ€>ÈlâŸ\R”tÿ#Mdð#J¥¶Ûváa0J¸,W•©d222¢·jmVi×Ö°¢ÄWC4®´®4¯´¯4°´p`×FF JU$Õ…RRQ©Ç_züÌaHÂýÕ¶ÀV¼¾g)c«œõ$í‘B7’Âå§¿fþôWˆb¬XMF!Ñ—fF7RþFù|Hˆ”¦¤a­hT GA}µÞ"¿=äxäpˆå"Í3íÎÆ1!Ì$ò]kÊx¹Ä"9
+{/£D- UE®„ð–"~%,1ì€á0U½×¼
+x5…ç §39ŵfœî°¢ž,Âü ;Ô|&¶™‹n3Üø +ö{ùÌݾoÇï~Ö ó?Êsfú/ûðwû¼¡ú7+A¬é §s-—vßmFçSÖŸó¸XÌH“é0Ò F›ØšÍ‚±—Ñ5ýãÑM¥1ôÜŽî+h&`=Ñ}j1X5 µ¤ãvC?¯hÙ„ã¢Û-:_ƒ°ÁV(hË žˆà æ°`œ(ไ̲að¯àšB à2
+œ#QÑ‘Ñ#H#âa„áj`ÅŽ#;¡éÄ”ÈR'¾&”k-€µó*#Ö)x`¯²â"G=‡ŽªÂN›8+=Ø¿È;à«(Å¢ÅÐzooX¬‰G£”øP+ëÔ³
+–Ü%²3ü’øÜ €Q?ò7'ð7>à×?†;gÁ
+$¤™`ÚÚ>Sì¤o}'ØZÒƒ6O:š SHhotÏ&vÒ- él‚´§¬þòù¯Ãfx}~%èþüªD2Ãg¦;½¾™ðîtÿžðnTö.Â…¢mÔõIùü/g€ç?çk¯ô£u ¦v°K&°ƒ“]. Í„ó”›
+°6€·Ìàž
+¼…ð‰B1MpÁ‡bÈa  ´àÐMtÑÇSÌq…ÙýîYPb“lò)¤˜rZÓ'v
+cm‘‰[†oá–]“mLu Öt—ö˜~‘€ÎBV#3#Ö
+RÏàÀ&ü/ûå¶£6 EÑ÷‘æ_’‹óhrùÿOêÚÛ± ` }iÕX•*†˜ÄÇ>{­žDmé‹ Û¶b.kâµ"}3Ð=û±£b¸líŠí¹Pĉ.ImuÜïèÀ'úpIÑ•)ðDÊG:u ó{úvK÷n8&[z¡ô=Òá¾§ß·ôý†£Ä3²Ý6ÅD.Dò!ÀÊ‹–ìh8raa»LpI$aIÓ“8-ÉÓp4+ŽÇÂ6šÈ¦HFñŒN¬Žü:‘dµ8‹í<›Ï"‰Ì€™±¹RÛ;±}£ÖoU›Z‡Ãj\o„„ŠoõþýŠSsj½UýãšßTýûëR÷7ªþ¤îÔzWù§uYùí ¡Kæ'9mªN:4(¨Ìph»ô‡zìµò£Û?ÙUöˆìx,²ãS‘ýÝ‹5cÆÇ°Gí¯¿çÁŒwб/ãÑŒÏî9žñ'ßUÛçe/ã9œmw=Õ˜½È$•I8
+ÑËœô¿|¡1u®Œ[ÁªkÌâ˜&­™¬Vް²óÉr#½é6½! 8ö£?™èf0[uµžo;éj­<•'Xx¤<’ž¬=³[΢æc.T+J‹% ’I„¤B“IGlµZ‰*=š~B_OZ´‰Q°I¢©Eœ$2“gÖ%©ÒÉÑ©‹ŽëÆ-Mj·b:’éûË$ÜX¢¤Q)©”dJ:ݼEf‹¥JZu[Õz«g[ê˜Tô¼!´ª–pÙ
+j(VT£‹p6 !º gp6Õ´hžŠd¯tVK­ì©¬©Vó¼KΫ˜ÄrðšY(Y©¬”W( å´)ee©lY‹ÁëpNRÉ»7gÌRIàE€gk‘ÊŽˆ „e$6g‹eÅ‹H-;–2´’Ë™è]õòl—ÆÚQ–˜ŽÍ™ð^Ù¼’Í–b¡›„|$ì'B™VKgÃ&k7ñIò3аÌ+Ç„úhÛ²™:Ê<çG`ƒ<VÊÁ¢j›±xx‹?èªæî‘”ãky{À5Ì8¿5¦Wƒo?;¿=â~0cüÁ>˜ñZã~>†ãÁŒþ²Óûq§žy…óäg̳d½ÌZ¹)åN'-’ì¶©HdÈ,ŽY³,Q,’˜õ0ká¸Ao(:˜E0+`Ñ¿"~Yù²ìeÑËŠP&½+bW¤®è\¹,q£ÁYè<¸mvh!´¤)a´Fe˜Ng žl€ÑX-°Z ®…×l!¶ »1h׊9-ý÷—oœ ÝÂn·Ð[ð-ü€ ÁáÂpxó_2ÿEɼW šrßË ˆ5fâ?¬OÂÜǾåõ,u=ðÙ‘sü™ùþ. éûC ácÿÆÛR¿þJºv¨tÏ]ˆÒ#H¿Q†ÜP8H+G
+äá€õÆsÁ†#y;´±šc,Ôé9Ú#GܨCƒ4èì0g¤Aœ7Ì©
+ètn×u
+endstream endobj 183 0 obj <</Filter[/FlateDecode]/Length 17413>>stream
+H‰ì—mk$ÇÇß/Ìw˜7ß ‹~~0!ÐÝÓclÇä0˜ R„Bn“è΄|ûü«º{wVZ݃ï$ÜÒŽz5=]Õ¿þWUTQG³ÑñOˆ>Ƙð“cÁÏë´K"®I&T2É%›|Š)à'§”JZÒšjYe™u60›}v9ä”éZr͵ˆ"aºØb¦]ñ%ÀbÉ…®¥¬e]Ä¢`f±0¿XZÊB×Z%LW[Mu5ÀR-°ºÊUÃì´[ýêÖ0í~?í~7íÄg¾þ—f1@<¶fŸ1óŒédžÛzÆä³&ÎÛ´«ë3öܵ<c¥fìŸ- ™¸6 \EEXÏôrH!†|pÁtPAáW_ýâ‹Ï>ùèƒ÷Þyë×^yé±b„²ºÅ—]rÑçsÖ§rÒ „´àb³M6XoµÖXm••V °Õ,¦à$»`ü´3ÎXcŒ6ÊH#àª]tÖIG´×N[m´ÖJK-èŠcRTVIE”WNYe”VJI%ä:ípXyˆ{Ñüž°/^°/Í›æÏð¨ùÔ¼j~5ÏØ·iïšÉFøØ¼l~O›¯ÍÛæïð>ÃãæsóZ!ðüà{ó¾ùß"Ðb0¢Àqè‘h±hÑñ@D¦b‚¨p Ì|q•¦Ý/8!—tB´œÅ¥‰œÂ1J9|Ap諨¤õôÏ^Øf5[1 šîå´»¸ú<³å7m]!Ðó1*-"Ýx#T䉤䛨¬¡O)b†nŒ”Þµy¤8]×§ÏFëÊØí‹ô½ªû›o®oîo÷oûH¾½»ß±oæ¯~Þï¯_ßÞÌw}hö/¦Ý¹Q¸¬æ|Ãûq”j)öÔ s`3ˆK"‹"±J,[*©±H ½ 2Ê$3åÀ^åªð×´åØx"€È@c$+€‘€Ç
+’4È¡†²ÄŠå·ö‘ÚF´ŒÜ,R£[‹ˆQÌ=$'qc¸”
+y—¨‘Õ{S! ™ÛжP ÄâѺCÛ³¢XÐOf¤±¤=7?†´"Ü\PÑê"°÷¨©±Ô˜KV±¬˜yÁ2ÞЈ÷:¼Ý`
+«hV+ÖV°Æ„µ¬ØQ[‹æVAX2Y…G~%xࣃ§þ*x &a+bP‰„xïp& Ή¹8Ggªà„%D/¼¯A¼?²‘y_ƒšgÛÈÄieÞÝÈ€²neZ#¢È Ütâȧ³…íÄi@Èq6êipj u8â _˜øÂÄ&>ˆ 3_\ånKÅ¥·HŸ³¸tˆhÐ|#ð6ÜD!A+¸µbÆóôäËiwqõÑæ7ô6*4=õìM3~lû¶|Þ–‘ï/Òwöªîo¾}¸¾¹¿Ý¿í#ùöî~?ƾ™¿úy¿¿~}{3ßõ¡9ªÓîì0û”o8zT˜²çf1Û¿o€íEθ3Ó§†5oÖi™4J¥q¯6¶-«Ú_òl+¡{á{Q¸¸¢ÂŠÊªVTQIõ¸ ¢¡T@–šƒÖ$n
+¨%h "5±—Tµ·£1Œ½°ªTþÕA(?+?b‚F½Î"d†
+¡Q
+å^õ‚ˆ‹",–
+#”ü.Oõ=d,AÎPkAØj]!sX> µÞÊÕïÝ24 "‰Iyuƒª! §W}‡-ï4z
+ÛöyÆò;,ÚAÞ£ŒŸq–pìËoñS «ë²8„qHãÇ!C ‡D‘„L²H™ÄùhRyË!—C0‡dѲ9„“¥ó© b³•€h]ê ¬#CŠQv«31d:§¼á¯xèœ8~–éºdj%£ß>éå½­òa6«¢¡!8# Ÿ2Í'Ëi8/§áKöQNY‚Z_·vÒ,Dî EÔÝ-,G‚û;Þç/¥ÖåA–°Ë†{=ÏÝ^>ô{Š;¾&Nå)“<A PÈø™ß¢ð¨"*‚ŒÊ`!å˜vPwâÌ zpÞsOQUê ýŠ|ðT~?Óõ_›‘’ˆè‰åà ê1‡º *4º2{Á¡¯ÜãJÈ€æN×BHþ%ÓUH‹¡±ØXˆ‰ÂùÆF@h RÓAZ£x¡3 QjI`¤€–
+¿Ý‚­yç< ÆR%Y}\z¥Q3Ñ
+ÒkòÌÁ¹ j&Í}í
+|^jõ¶3|ÑTÐg¤öH„«8ßIf`þéë×l_*Þ:È¥«\Â}«¶wÒ~דÜPLÒÊeÌED:]ˆ@QŸJ8Wÿ {5¤‡'huÂ7‚ý^^ñιM~S.³Ë…Ø'¢;ìB{;øÌ»¾ÅæçÃ-bmÿï YìwøçOÿúÇâúêÛÏŸÿöñãß%}ý)=Ð0Åþüéw?Í?×É÷~÷Œ˜íYˆ ‚M5«c¾¡:
+^<Æ¿®xŒ²b2ÜInÁ“á³Zó']oÚè¨4Í’^‹ý@ºíÙ\gºÌîWg ø¢”W¾wÊS÷B3¼†mª6½6?SÁW
+eš§eƒÑC¯%Çab¿®¦ò°ƒ™ÅªªA@è®IÌ„<s`}æÜŠs[E:cî©á!–`@»½¥µæ ÷‹“ê@Öq7ã/9H9‡½¹·`VœÂm:XJrZN-Š´ð½NΛù¡®Å÷6p’
+bLÊ‘³´L&DÛåΠÙX#nÖa&ÈQË¢[í:é6t¨Ôf Zíó˜nµ÷ðî÷(æíÀ©¬:²À„KÃg9Ì޾,y¥SfË{ã–N
+Õ âEPÕ#gkRp·Xýïf‰BPJó0¦©RÖÀÃÙALã~ÑÊ´R
+J÷Û0[òîǘ
+úè ㉠ÊG{€sì·¨¥Öätén‹¡ñWÕ¡Wà§œ„†„m¤ËŽcy1÷5Øä]*`Α¿1”´¦ï5G)˜‘I1G-G"FªÑˆÃ=ñR s0v¨Ì‘|e×;’È¿ÖØ—ƒº›C‰™­“DcÞyõ<-øWà³À[ ’˜¯µ-4rp¬„±ylæÑÙ‹“jšÎ,˜‹[Ô
+-™MÎÀα¼ J`-zYĔ֯Éþ
+‚˜ÁÐk4›(‡~UÞPïXP|·
+Ï+p,°ÑY¬ºîö6í6æÑÂcú‰£ÛäÿÐ]5i“¦ ìJ*ø·žmÝÿ<„ Uß̦Ÿî´Å‹$!Ûì 1€Wíê`_=JV ‚aaÍéøNkY[4z›®'
+ð/[¯>劰d2ÙÜdn-ÀæÏ L
+ßáü-´$Ó~`Ÿ59e3êÜì¦gw÷ê– ¿ö!ü´ˆ)‚ÀÁÒý*ˆíe7póá}$€µ9wä¼¾x– ” {¯:¨õ¥ ŒÐÇfä ]€\/Ha7 Oy¥ìlõN¥§k¿Æ¢ÛRçhm‚“2û¦^Ç=ÂŒtÍNµ¿µ`ÔGËEø¤M%¦|P8%õ÷Zg€Ïmn"ððC–n·›è<>t]¾×qxçÚèÓ×Nb"Ù6ç?aЊ¸Ôèæ0”[ʆ#"È ž,íБ3`ïÊvï,¹çÂÖ*¡ƒlGKíà‘€±ŒDoÊó§–Xsi~š›`÷}åï6Ä\,ûæïÏkß`xõ>Ìw–}ˆc{þŽ-.Ü{”l„A°tk‰Öú]HË'Êq«SF†.>WiwÕ!r ȶvü~¬íàêe<ÿý=ÒJ6k,$7Õ'±i6Ñoá¢ä\7×\¸P€{S‘´*`'éÚÄòìÈ6ÍÎ×ZJQ4éÍ` ñÁATeC—0-
+·Þé+AÜ•ê%~h±ëÚµªÀ«æ*ô“€™Ṽ!›b@z!(›$ÑÒ~ cm¶ÒQ&îèðc;RîŒ+ÞnÀóO|„=½®6e[œÇËOïMy2ÄÕÜóéf«Ø¡«ÆÝh_¿á·°&ãAÆô¾´¬;{>bTO°ýð!|¥ýʈq3è~mä×`Øôám­KFPÖ&¶°Y©~ûšûX…g]6ÊG䲶ËD¤µxc·JÐìVFÞøOrN*,œ/­Q[ˆs‰}.Û›iÄ’FÏ=[˜3
+é‡A¸¼ôÈܺð=ÖÕ1Àg+ñ¹cÊõbl.qjÞ
+Ðï6‹Ô8¬BÞ¡+³¨ÂújzŸ¡Oê.üZÛ””v=Àž{âmw;Âæ9kËÁ«¸Õ˜ËÀa‘MÒÆ“ÃÚ¤³eÜõíà±-Ä5Ûçu„b Î³àxôàDæŒX5Š&ùØá©Bmáâ Ôêä,5U¨NÞ†Gd¤„0#¬JåU¹Ì;†±¯ûœ` _¶p¾Üx´P7é Ö²þmž…RãkG¶:áέ֋(}PÛ<f„ût:]€Úç:ç~)Ü…Æw.io„Ü_%ˆ‚yòsè¡äˈ!:~$#,©¤¥šW…\už5Sš—ªm<9„’°1k“‡ëb;l·ö­ºô#¼@©Ñ€“,>MÆáéÎÕ°xKûÔíà%•žTV}Ë zëµE„Ò…_æ
+ }eæ$=ÒÚϽÚ&%äB·Ï͘êaÐÁ9)Ûpçq#œö.çú_Nhßó°žÉüÁÛ/ÿMÜÐö›q$ƒc²²Ã¤nFõÒR?·˜º# ¹u >c{„5${]¿ëÃiP¯kU’C‚2¬½n„²•5[ƒÝwÀ2èKÎé£k—»>ÇÛêY3‰‘¢4¶v|7R[#Hâ mä*ZÒã
+ÌׯYehF(õ‰À%Ž{Ì)?Õl."Y–­ ¹Ðy;.ñ/ÝÕ×ãÕqCß‘ø¿—H µdÆ3ž?í>¤ÝªUÓTHU!تîÑ"¾}ŽÇÇsovAHh9Ìúz<öñ9Á”È¡9ùá‰5Cê<'Ïj*§—ž%r«y?(×J&²ójyœó GJã¾h®5¬-Ô¤ +ÇêÞh Ä5.;3>g•Ùw»væ ‡Š2\?}NrcØo1Ì3Å«ŸsÀÔŽøœª»
+€E#¤Â°f“TN¿žS«§&sɬš1i#Kôn96ÆFsñ``‹Aî²³Âóõ8™Ë‰+q#~.v4è¯*‡Æ5ÕE°í
+qzâ«À¥5^zsåÜŽµ(;ÄÕb‹o(F_ý¸v¨ƒ‡42¼Çd#‚«½$‹ß%oÿºV¯äxår%o*Iµ$Ó©Æn]ô Ù™×AQaIådtærŠü[7-yG
+Xæ¢FjA4,™{#Ã0]ÌÙ½.G1Öê–&Ù5#@ _2&•F´U3·‘øÅ:=$nwŽÀY*vlçJ2®m–øÞì”üX©×˜zß} ¤©AŸKr0‚I¡‘3 aë ³£FØBü^nq·ÒB^4û½6O¸ƒË9.°ÃL¢Q2›I s ”ì>Õ@ØÅª-Jéì§XN½ë•öp±›]Þ{}KœS€Ö§›P°„V‚«› 4¡^x óI ¡G‰ƒ{Ø1pÙfWiÞS
+¹%!ØZâ%ROåˆSDÀrô͵;M'Á0k‚…Ú¶5Ài«éØ©#¤ºûl³_…lî1Çáaq²Äcf˜¡ˆP]¯¢Å"
+^-}âQ”`­)^LuåâLPL}Ž8;â÷×£x‡»,mïoœMNà
+¼‹0~÷ŠÆ-_AÖî
+^а÷RxyÊ.|n‰ñ:² ÍSø
+(W-Õ¯¼½Ñ4U½>³L®è1gÖÌÇ´—µôÐøÃtœƒÒ¢ë—nØN# <lªŒM iY?à9²€%Á‘¢øÌÓù”€Cóåù‡xÆT:[r¹Î›ûx5ýÕh«&9•Ïþbà¸vYB<v‘{‡3x{.ût
+{™dãxœ..ŽŽ° æÞê½ÜdDŽχ÷ÕÎaÔÁkõÕ_?ÿx÷Íû7wïÿwûúã§Ëï {ò§§—¯¿»ûøþöÇË“ïÞ½þpýâ¿×·o±KßýýӇ맗߬S/¾xêÛoxæ÷ö—í4{Ü-ŠžOϬjb› Üì-vYÒõoè;l$ü[l—á‡Û,ÙŠjÝ9"\Ž· Üċ߷‹`–_ù…öjG’è¶¹«|‡ íd‹$ø í 8RYpº¡ßÞ ¿Çç*«J£@Ò¨Ó4A°qd,]Ÿ ÚQVÚ-‚3§DýÁ0ÉÀNRð¶Î2ñ`Å\H®”,ßl…EÚ—
+ç$!. C`£Ï´?æf®]]µŽ­6Üÿ —©`X@Ý:I—ÓEÈ·=ý¹qXéAU4–²_Žs>>B@Ó8Õ=%c0\ñ‹ÖAÉA ‡+'¾B ݈‹|ä  ‰, Ç`+-Ò¾t0‘)Á‡A¸¹')sbqѹe€eâ-…?œAd¢(2<´oßðsãÄ6h‰ÈeôuÚ?)ÏÐê{GLÊß½á<ïM)íâtP0…G5¼g>X!Z§óby
+šÂ’m öºíKSûEãÖlð¨8­´mÜdcþ€½el+\Ó˜û8ÚÃøb0ÂÐI5ÛÊ\ÎVvr¦®ït>Æ• ÄS¾h—žè
+曾w¦HëàI!ÌšsÇ´ñõ`…l«˜Æ’‚‚¦±äƒ½²@{« wöÓ{¶â ö‡‚¬s«Â^ós‰¡kæuÔÆ§Ð÷’ƺ&Ü—Xq8¨ES$®}; taïK}½Ÿ‡U@©¯#—qózXè¢uPr°CR³Oí¾Ñâž—L뙃‚¦±$ƒ½´@ûÒÁDƤ¥#$NЧ0Œç^ÒFÈ8OW‡E?#ÙõCÏ®`‹p}‡]K2®Øl41ÿ8ñ¦fU–Mß:(_ÁèÀ–ÛEë äà—@p¥|=h!YK6©$M_I8{iö¥ƒê w•h`áVãb̹†Äܳõô,ÄU7ÁÙO·xvûX‡°½w'Ë »,Œ4Ç
+©ën³AS9MÝ…,{]×­Éh#¸s0ÅÑDC›XXÙÛ-YRPÐD–|c°Wæ¬/Lcvy;l½»wñ.ÒSã"b`»íü'ŒkLM3ººÆŠg¶·YR5˳€íI Ĭ´-¦ÏÑ®`H4Ò¼h”ü” ¯}êàUZ^mÚ•ÂÁLbM×Cc½ÆùáHœÅ×U°†íù[KÉ[_˜òúÈ
+}a&
+ÿiqwSºWý±²ë¬0N6[ò™°)r­’¶rêó]QÖ—Zñ8]œžß·ï;ŒLO!õ6ôß?˜i¬©ÆŽõRó®ÿ+Îß~óŠó o98¦ýϯÿáÿÃÿõç?õ¯¿üõë×î½ôß ÿc»œ‰·—ÒªÔ÷Í‚­,ÛÓ”+¶ÛâÅ·ïœ3bÜåœJòc(¿`„¿—'’ÒŸ‡@yí QlÈñî[AÙ–…àˆF
+O8‡Òœö­ƒL³Oì ÄþHÄc}©ÈGCJuðfMlZ?K%ª«‰f
+†n£¬ö¤  ä`"+ŽldqZ^laíŸ9(h"KÂ1ØKsÚ·Ÿ\A‘ÇêU|ÈZÖÉó9& l‰S+ME†(4‘ñræg0@8³ö¤ àIÁÆ­ç÷`Ýwý¼¨ž‚‚¦±äƒ½2§}©ðÁÜ4²ºé>ŠK¬8†|±vI7½5äšáï“(€RûÜ”ŸÁPˆÖi8§  ä`+²Ü%£…B£Éƒg9((9XÂ1ØK ´/>³‚r¼O{MƒT_Ça_x; e _áSÛà£tÐôÍ25=¸ìnÎOÚ
+ÉV8ºù¶ˆci1øM]d¼BŒª@«¾½‚aÊ‹ÖÁƒŸ“ásÊãä´¬QWƒ&üöÒí¥Ãç÷P~JÖ’“„ºˆD¼ÕºôÎö$Ãk$‰Ø‰¦c^¥ŒÏ:J)/NwFà8šIÛYYB3ЗdëÁº”ö-Âú—ß¹þý7/¤ÿ•èZHiáFWѾ¼Â=u²"ƒœêñÆ«œ ¨â{뼞c¨•{7_Á-ª{®Ñ:øXHŽÉEý0-žýœ3=sPP,áJsÚ·æ3×*Ê;•C[ùú¹ñ
+›&¥á7r“•¤v“×e¬=Ê›9÷g0>ÎóŽZ%apœGòúz°B0¢³ýx
+
+šº’o•ë[…O®£p°2Wy—ø¹qx³•EažG´Ä~ê”GmFPÊã¯zWx岞¬ŽIvDŠóÕ•V5Vˆ†/´g
+
+šÂ’o…9í[….£H#Õ¢‹`×5)À„Vª{ÐV¼¥eÈÚѪI\ªî(4‰k›í
+Æ ¯*±Ñ:xRð!SUâÙ¨}=XyùšrH–‚‚Â`ùÆ`¯,ÐÞ*|r­ÜèS¼œTÐXqÂf0†hœÊ5Ÿ¦qÆïÐ4Îy–+˜ÐXª±Ñ:(9ƒâÜM”v‘~å  ‰¬ ‡`/-оtøà2Z¨ã¼÷‹jw‘/ßsä,"ÒݦBGaJP
+,¼~ÐLüÄÍ‹ÖAÉÁ¯BR‰àJ¾ž¬¨¾RÐ4Ö|C°Wæ¬/>³Šò°Â˜/‹×ÔÕUO+žQ—ps¥û\Âcç
+ ©›J]WpG
+¹\´žL\…ÑNy~=HÙ'ù¾e  Xº1Ø sÖ[ƒîƒ8àœõØvTv­!scƒ•ž¥ )¯Ö:(åáÿè´unö’ڞ؃‘?{X¾öóæ´Pm±Axä  I, Ç`/-оtøàFr‚
+b 0~n˜¾iH\jíG5ʽJyT3Ð$VK‚q¿áCŸ¬Ž| CVûúz’¢RiWšÀšnöºí­Á'÷AÃ-ÊéåÔB++œr‰‰²ÎŽ4uc 
+Åí]-ÃÔáœRØK±HîŒòÏ+á¹^:m“ä“RÚ0¨SÚJ}¯JzðdŸ95IO×ÕÌ^‡S)Ô+ÏDÌq™Ë½K6¸AuêlÅy¬ím£]À¡A §å+m-=nÐ<VÁ®ØZSÚÇ'3 Ø[Š’³ÂÕÍeà E9öF¸SЯ«;P;¼/çQ\;´ÞŒAñ–Iì0Z£¦ »1lbµÐšr„›ÿC ¯w~à HxJΨ(ÎP¹Uÿ}æŽ{ RÁ¸êE¡i
+Ñ8#e)l+U[ã–BØ
+Z»ŸNG2
+ÛÏMŒÿÔ„Y©ÈwŒ[Ÿ|§¹¿.ìº6â7·!›‰‚Ÿ¡aÈm…åœç­Dkµ'ro—j¾d®˜PÜãFk kЯ!8–‚Tî+âhÑFÒ¯)4Y°+¶ÖíáÃqÆ’/˜*E3Yð4vÑÊ&הط[–C%ªÉõšo”+&$°¶ÓÈÔdÁáF›Û®£½†ƒ›„‰©Å"×J­/Çy˜ð`Ú9*9 Œ‹ô¶Ã #åÊbp»ø ʘCwò!nHíÍ<:])îw§¸‘ý7S>vz­¬£ùœ ™»¬Õ•ZWŽtwàɼ!É
+C’gpÁ{¹dÚR´ÑQ;·‡]§;PŽ×·âª¯¿£õà­AlUÀ'*¯•s±]»Õd슭5G{øð`ây;öMpCÌdÃUá®L×b®òÆ`Šƒ¶:¿±Qz>Ý?mçŸqì#±ÌãWç¿_qnÚîw4[Y¤+¶fãÑù3A¼9V ±UƒÞ‚»Ç­á}äC—‹ö$Þ ÷†÷¼÷¶×ϰpî´¼5¨µ‚Ûªçh.¨´Mƒê¯vÅÖš£=|x2èG–ßÙ\<ޱ-¯[«½r~ËYž–8f›êré¿PÜz)­¬A ¯A—1¡ÅósÜ40h.ףط¬´‡Oæ½{Ha¿Z4—¶äÏz õ(É9
+¥EªGØ
+>"\˜çwl°tÙñ™‚¸Û.
+TwÓ|f}ñÈ.)l´²f0A&Qy-´uL¾ÚW 2ƒ
+vÅ®5£=}x.‰Žo]bä§OO“ }b2Fû–)É)º•¨&GÚJ3V©¬@-G·z9RœA ̸þ¾€j0‹uÅ®-#==x0ŒX‡eèrŠ<nKŒlpow²€kËtm,ÁwbP YN±gÜý^6Z§uX`Ø:ÛÂzßó«¬TY¯/¶ÎíîÂsItpÓÕdý¨ÍbÁ1Ü£œv­I¡Ss Z|Å­ïN£Ô@V`T“ÅGHžÚ‹¯ø¸Üëï ȯb}±µåHɤ·‚+pjC\Hâ­á8#”MjàÉco~ÐÜ[Ô¬ãŠ1B¡d£55Øg;]éµÒâôå6 ª¿"Ø[kŽöðáÁLz?–û°Ž˜ËææN–Ã’åb±«“Õe¢­tœ¿¸“È
+Ü Ùc“OJ¼Ó2æöû êï‹XWlm9ÒÃóè­¯Õ&‘­ê2ìq i¦¤(³Ù:,­gj‡5Ë7rŵõ~Ðxk0Å[ã—Îh‡GmT¼[kŽvóáñDzŸ™vqÃþAâµÇKÎõ ƒ #LÎW˜ÏĬ˸&<ߣ÷ÏëŸFvðœËý’_gPÿ^”®÷F{RÒÀgÒèO¥ÑŸ4ýüVá“’»â.|:<ccâèˆ/S{»0vݹ•]zRœŸ¡6L‡\ÖâJŸ]4¼Ñ:p ŸÇDNu2(-ûBZ5È Iûâ䆵О>ènù«b'‹kŽ \èñþ¼í8–»Î0ð4MÇrU{ÍÆ\½½8m-†cX{ÃJë@Ö ö
+>Æq-¬0 ‘±¯TwY¯/¶Î”õtáÉø‰í"&™©#?¼í8v²Øa,·4M»Æ5Û£¢Ùdηb­¬cú‰Wwž>c…iøƒ²JPf½¾Ø3ÚÓ…'Ã'æd’ j3‡N¸9³Åˆ\qÁ’Õ↽Öj1Òe]‹Ç OWZN 6d4•×Â:WãO¯T‹Y¯/¶ÎŒöpáÉô TÏlQê±á|Ds& šåÊqîjêq/¹:P=Æ¢•×b€xh¥u kPÁñ±ƒÐÞKHÝ40È&›`Wl­íéÃäxù9ô”«™,8R …À&·<“ÆWâI†-‘Bs 7xiì°âqIάÐ:5ØU 9ɽËàµðñ\nTE¯+¶ÎŒõpá™:†É6ØBËæ®àxZ±,s”
+‰Ë$î†ÖŠÕ]H [1äõy¦þM{•Iƒ°T&ßGP“ÿw¡
+ȶÍü„Çžb*ÑÜ‹Þô°6ÚúÔÙ¯b~¼/Zc®x“œ¸ÑòÑ>[`LoíZ©Íå84{þ&þSd.©b‹ƒ/t?Öå³èˆNä2Iϰä¢
+ïƒK˜Úé"Kgq#µàÿ@ëÀ-:ÜL™Ñ²CfϺõ
+endstream endobj 184 0 obj <</Filter[/FlateDecode]/Length 5796>>stream
+H‰´WKÏ]GÜ[ò8$[‚“y?`eœ "HI„wÈJ ±Äg,Ë,ü艹éžî3'¡\ޝëvêV×Ìô#çГ?Þ¼}þì75¦ûÑr §w9O;ûrèΚZž`w-˜ûÙRˆüa0ävöˆº·Ó÷^¯´d ‹Ap¼§ãJëÎè|Û408Œ` 6©)íÝ0üíù3w–šjé‡;Swe|¾•ð„9$|ˆ-EORMÙãïâsiŘR*“ܹ +Ü¢÷ì1ÈËt(;±¸§Ücú‚‡„¶³¤’¯œÐ9sBÈÅJ!u …%W .E¬›´”öfÁ²7yܰ‚ðÁ×P !ÎÅT‡ñø“Sv¾†­¡fã¬s)Íßj½%µVðpB\fks-|ù\Ï•A‡“7à27Ÿ¯Á
+Ô†î¨Nô˸ð1Å਄„Š›?êM§‹Nbž
+º‚bËßR\¹†–³•Z7NÇÏ/wÕyÌp’ºÖ·ßgPÝe­l²2ÓãfÀòÖ•˜éJæŽéŽ!ºpo£Yb:
+ô!\W*‰F;ò?_6ÁL‹MáÙÖ—µ¥ƒpÈR"2ÕžùÀi_˜ùÕг—ÁXê\q‘\Ýhd ‹Ap˜ÑÅbay·MƒËbÑ«Á&³Åzwá{ È]2ËQ¡zºã•Kh_ i<ãj/Í·¦'×Ðcc»†Vúíz¥´˜­ŸŠ{zyR„”Êb.›
+²½ÿ OxªÇ•-?ö]ƒê¯—v¸‚mÊ‹öæÃ#AªT1¯U×uYq *¢/fÇól©Yh§Â¤àrõ)ß‚cñm£µàаÇÍ‚êãJÖÞa4»¤Á&XS3´7¹
+Òi'ÙT14uYpHiRˆešG¿õQ4»Ö’—E­¯æ,Á(™qm‚̪+XŠgLhÇ•e´U¿I`py¬Û‡ Ö„íÍ…G.‚¤õœ¯–w]=V<× *àù¥×ÄH ¸2ôÉû{°“=ÎÐ*84(ÃÂ[ªR³”¶—›‚nj±Š]š”!Üøö@¼úøÜ#Úuìv{ÚqLyŒj‘fV/ ȸұâvh N+—ÀŒ[ê6>Å.[ Áéæ¶qs 'åè·_ŸÿÿªSC5ÃyKž/þôü—-‚ Ç{à‡G’ÔYÁ#í
+ß_ Žy%d¹°Ú]èqSÀ ÌrM°¦eho<f%oÉAÛ²V nZ]ÈE`š•ÜpÀÙ€ËÝP{Û‚qýè]i-84è`\çACë‘êÜŒ—¿"Økj†öæÃ#WBkh÷œãfÓBñ@E\z]ðŽ“’’4š–J0àr95ÆÓò­‚¬a1(^üÏ„Í*¤°i`P]fÁ&ئ¼ho><r%åªò+ë®uYð ó@;= †ìQ”{„=(pyTš·àÔrÛhd æœ/EÚ«°R% u“Àà2Yôš`›±°Þ\˜ó6òÅðrâ-£F?‹à¹¹àe¥(§S«UpÙÔÖÔk‚±>”Ö‚$a(\q*Ç•õrÅEƒj4ë½\\ÍlÑî.¬ÝðWýêÕ§Ï_¿ÿáóû~xûéËñ[Â^üñåñÕ·Ÿ?½ÿð÷ãÅ·?½ýøî÷ÿx÷áÇ?¿ýüÓw_>¾{yüzD½úQøšc~Gÿù¯+è÷?ƒ9»“þâ«pÛI;žG”½pÜÒ§ÇÄèÜð¯7¼ä:N cTñTˆQ6±²µnÀq,(Péâ58`”ok´d ¯pm3ÿfÇ“8Ôò–æÏÕZïÚ8µ9šÉEçŽZæc»ÐZÐjûß¾w‰”4Z¥è«Ô1†¢=-CÐw€gôŽb=Óñ4Fy7ÓÖf:˜Ó¸ì A›`Ä o%Ó ![^ÆXJ2æ":çÞgGÈ”cŸ†dJ¿…³LMüo7Ëk)ó´;M‹~úíftªNÏ5¼Ñ×iœ°cAshï³QL°äDæU¿V¸^ ¡ø Ž—ùZJ)¤¡RCÏlOîc%¤3¬nÍÕЕ™ïÕ‘ŽmVÜLˆ¬—äDɾO'µ³éÎ`€ál~Úãɾqa°÷z—)»Q8p¡Õy #8ÁKvý~ø¯ù^P‚aÎ<8g¨—Õ ":ñC`ë|sÿf¿lzÛÖ•0¼?ÀùÞ8‹¦‘»IoVqÜšÔiqw-"¶4©C‘ŽÝ_©'rrMÒ¤\!hcØ#‡gæyË“|ð
+sf.ß+¼Õp!Ý]¾ùûýâ›Ín0©öy–Æ¡HivC}³×v¿g—qxP ;SmÞ‡AÙQã¼£3«›«xV—Ãþa™R3ß7½j.cxä—Ù3Š_)nïý ÏÞ ¬J³oõã{ýaþæÁ; 2­ºkÓý¢Ñ3í;ôK:0.¯€ ËšzßÏM’¹˜™ 6W{äå¼&ÉýþQQÂæú›<ä;v™Óoy9œÖ$íóff|¨Èö›“OG³<IÆFùHž¿;ÌÞ]~eæƒ2#bo¯|7”W?ùû¯‹$ÿÌ÷Чß&g”™¯úû¯ý»×ÙdÚÿïùç Bþz{h=ñÑqïŸÕ‚qóáž9 ¤s­ Íç“™}’<Œ bÊB <è÷ö?quÿaöŸÚŒÀ|Ï{S™Õ %aºŒŠÞĪ&Ž“EfN° |ë4Î- UŒ )ãlÁ`PVŒ•ÛkÂÚÂɧ٠Kb2ó›Qhˆ`É‚lÁˆùwÔHhš3ŽD]ùT˜¢\»¾rªRÜVô[Škš¨´œkãh¾â©Æk¹ûrk@Í(RÍ0"¿ ´&*ï¼a3Μ¤p&á_m‰‘˜ñ¶à¸˜*ª‚ºñTLó¸kÊ
+ŒH@%êvÕ*Î}¨e=:‹D¤õnÁm@Œ…D:² ‡w±˜†ÿa±ß1y¨ãÜbðÝÎÆáÀö™H’Ä4عøŒ ïüLdT]Zk¤Ú8‰¤*^€ÂÔÚ=1®ÍVE)¨Óu){¡ØLè9ÈÈn²•Û^Av3¯z
+›' LB÷ÇõŽM^¦ß&gù3.ê†?ðÞ4Wh ô&ÆÌ¸M µµÐÇàÜÒPÅš2ÎÌÞÁ²Bp¬,2 êk€XÛƒ8ù4;‚$ÀÏ:é©êyˆÑóИ‡@„æ¡9ãHÔÕÐ#ÕûÊ©Jp[ÑÈ©åœ2¾«3)Õ埄Tcndh×kž°$&;à41 ®7!‚¡5Ö2¤ŒÔú®–ÛÊs!“X0qƒRÚÝ’±]¯ùˆ‚¡¯N¼~Ý=4§%Ę‡Ð¢{Àô»óšåï‚h! ^¢Z6ü2ŠR@œ×ÁæŽ$ a‚¦õ-žkLËÝ×;[aî÷:bat¿×1[o[6³ÃÏI
+gþÕÀÌH|o‹‹©¢*ˆ›Ó<îš2À8•­h[pÃf*®—F—(¨j°åÁs­å\3S;Uvpø ê- 3rʸnæ¼öÌáuAÛ}‹ˆ²rt" Z3:OšYÖ§1áØJHÕãGlñ}iæ[=Ÿïñ#–§Í˜¦ #,€«s’´rä,ˆùºÕŽ8¯·ùé=zéo½lÎ_bÖŸM ËÊèþ¨ìÂŒB@¼dFÙÔ¸SÁ„<J$ÜÖ7Ta9ßËæ~w Z³Á!ìMªÂ1,)É΃1l[áÈ®w­Û" ð³nO¨ê
+e q'E˜Ã9ޤX`8ò0[ˆ¾S³Û ‹ u›X"Ô‘GÙ 얬(FÞ‘H!,"­íÜœ9Ü flg ¡Ø¨»?~‘4Â=ˆ·É(R×(¼€°àܼ… »µÅGLz¡Q¨tU‚maIH 0daH]¢¸îB­: Â镈·¯u‚&D§)%|Ä0“ÃAs³w„˜ŠkÌP\[ô;`ÐÄ®è¼AÃ@¼Ä Ù™.£(ÄylîH’@v!hŠ˜
+&äùS"á¶¾¡
+ËùîîBw Z³Á!ìMªÂ1,)É΃1l[á–»~BtšRÂGL#6³_O‚sªi¸g¨†Í\žƒ¼ì[©ßó.Žd‚ü©‰xÕSØ<e
+ò¾?†¨wlò2ý69ËŸqQ²O>ÍÆ”3ŒzÆ²ÔÆù…¸IBª1þvhkÕš
+-˜H’Ä4Øe>Ì«´D$ ‰ˆ­„ÚV!“Ø8Æ›u§k¿]×Þwº†¸‚N×:]ët­ºöQšwºu­[×\–5ÈŠ´SµNÕž§jݲÖ-kªuª¶+ª6!:M)á#¦ålЉâ
+RŽaIIvÄel‡[n¢jº»6z¥6:ìÚq]umô°®è
+Ø#ë™ÿ{{È
+ÐÐë ½fŽ"‹_
+Kø•S…g,£[ªb‰XÄ +Ã] ³—qß«K[…$Ä(ae‹ƒ°[²F HH‘
+c_7‘¶0™™Ã Ê·–qÖª¬ç÷½ž?4ÿ{=óïØ¼6¿Í½fÊü%F^6¶8)!¢FÝò !¢Æ¨ÖªÄÚBkšd²»¿|‘#4Ò=ˆ·E˜&ŒrDâ‚só‚ì>Ô$z¡©­Û­tU‚ma™†`$À…!U´v\oqÝ…Zu „Ó*Oß½•´L…–œ°$&ˆ3¸lN­y½l“UÁa˜uG3ä^”ÚÂ9lfIU8†%%ÙyDÛáV›?‚ ÑiJ ÕgÍm @vëÍ_HÙD’$¦†§êÛ#
+Ä"©ÙM/u]Ÿ·Qj+©#D ̪}jYN7éj¥
+xÍIù1@¤# ²æZ ˜®ÿa±é1y¨ãÜbðÝÎÆá -âÛ’éˆ^ô[5åÖšáH$Uñf…ù£‡$µûÌ¢}ލØÌé9ÈÈ.•ÓW=…ÍP¦
+ÏXF#uƵZ–°Ë:iؾ†»ö?âË aˆ¢Wñ¡Û®·ºñcu`š–’ ÞÞÒjI„Ø¿f×Ńò2ÉÌÅlmjeËL\BBÁL©yÐP™Y¤Œn ©¶º:ƒÆú›Sí–mcviÁÎ9"-åj¹qpþÊ¡žA‹Û7xŠè9e¬–ÚÖôÊÌÖ?Ÿf…M»/^ËP8xªU#Ó³$öEÒ Õ’
+}
+endstream endobj 185 0 obj <</Filter[/FlateDecode]/Length 4444>>stream
+H‰ì—_oܶÅß ô;ø¥@ Ô±×ŽÓ ûd{k#€cØ´÷¾\‘Z1á’
+EúO>ý•´»¶d_ZÇNÝ¡¶z âõ‘—?ÍpÎgåÌ;Qü²õë?ìZËn¶ÞýøÃxëçë…Ò†‹í$“Š[¡kÅÞÖÎ{íî~YýãnrQÿòç™òö—­©³RÏÛ¢K¦üJ%y@£Ùb))¿½U'úóòWÕ™v&2qÒhfï‘9÷ÏcXQxå
+ç·n–Âñ‰¸”¬:@Ô–ÿú}‡=vøÎ“§â”ù¢L…«Ö8ûãEˆ¸Ý$R©éÚŒË4õ…Ø€û“ôfŒºYVÐÇFŽiêÁÓ- 0M˜
+•õa¹Vj*ª¡”¹êFSrž¹R°e€ øà*ÀÀ—¼MY"кµå /ÅfV,Ì%0|R©ðN–2²«yP
+*¹`nݳ†–
+ ²´Þíן׈÷ôt˜Z0
+ñø»§Éow’|“ ï2¤"k%U›½p„*ªN
+ÞMEœ&Õýè6ºn¸ÂÛ´4Ëi™FlË£[5ìï×ys4Ò!¼e}Úc£ëqýÀ»G@§‰m¨Z±0ÁÜÖ´©ð^–2ºní° -„œrdêŠÝ
+á:z ¤IöM.¼ËЬ•¤“¯›H†V»&L%¢âx”E¨ò§ê4
+Ü|j!]pî†1¹°Ì³gçNJ<™ŽÍ"7Exˆ{
+ÊÔ!½û
+n´Û¥ý⢜ƒ—USÜÓ±oÅÂ\¿´8…9¡Šüf¦Ö,’ZFGò`±`CGqºD î̼TQa0uÅn
+@¹0®ãF¥Ü& ÂáûOwýiðŽØ§#2³Ï"qGÆk^žñÈ„zèÁÐû³Ü¸B‹d®¥-#¶ÁèºbYãí,Ÿê|-·œ ¨ÅŠÂ+dÒ¯…d“åÕîA7ÎŒâÄŠ¯¾,$2gîéé6É©“. yT°¨u¥ÈÅl©©àÞvSi¿¸H»„ šbâ|Úó]Ã67lsÃ67ls±à Û\L½Úæ€9ls›°Í¥–•QY ûÜÿ…¡ßç^ë\×9 lÃ:ñ„Ö¹aÖ¹8×¹ƒÍZç œž¬sÛ£ Xè0ˆøWºÿÃç–!“uØç6aŸ[f‚SËòL&qfʇ\«O½‹aôf'V›Âñ‰¸”¬:´±5åÄí”ù¢L…«÷‚Ô‡#æÅ Ý a@R'ŒàôŠ}›4-Dh.õi /Aªkm?TyÆ^f(S¯‹ÇŠ÷ØJUW·£Œ}7S,ù2ÞZ~dr–Hwón÷ä<7J@–Së¨z±ÆÜ€;rôíT×Ë[„6V?\çiÃZê=ˆj«È7WÇrûÿ)G% ^‘ŒÉ…e.XË&Δx¶›En
+¯}2¶B¯’±CX9€äl j¦Ðk$”'w˘…¶ÞåÇ‘«³ððàB5!°ÚChŒ‘çp(ˆµt2ÅP|‹åó€ ûpÛ”l(Çɺ„w[ÊŦ8Ђ¬£ÕRgu2u¾‚N ~WBÒ–Ê5
+¯›h m
+^íÊOÃŒF¶µ á:FqðEK
+endstream endobj 186 0 obj <</Filter[/FlateDecode]/Length 17759>>stream
+H‰lWÉŽ7¼?àýCm.p'óÚ=ðÉ€OÆèªiy;H‡Áøÿ'r#‹õlKr+œE&s‰Œ<Fíí %?öVó™j¬°z|<;”Oª$få,¥eÆÒIÔôÛz¶ª‚¡•y@;¥Âx<ãhUŒûÙSL †3×^ ¤ÑÀFgn=ù ãL-³qgNý„ZøØÖÏ
+˜ZËŠ J[>ô¢x93n>L&
+€kñÙ¡XjÛqüÈvb¨Á‘æI@8ࡘxMzW=S!v€“4* ߥ$–Ißg'4ä)4Å+§WA÷`𨆴0ûù*µí¦9”Ú6Fïg.šW 1×P(nŒÕ&¯EI˜«¾+ 0L\\ýÚ HsMífœÏˆ€˜G40#?zu²€·+.w0Xµ¬-bQmÚ
+~l\ÈŠ«ØÑ‚ÞõëúóóñöŸç#úïÛŸÏG<¾ûõÛ·Ï_ûrüñßÏ_þúíÛÿŽXèû# Åÿ—JÌöù,=# Q¾Ö?ßþx>JåðüýGÿ‹æ+¥¡µ9*îûú|üÎ÷¿½=??àw8Ã
+p&¢«Ù¦F4f;>}Þ_Úþ×ñÕÁÐQûjäb—”Qc³Ø'Ï . ‹^=3INŸh4£ ]u4Ë}ÉBMé+ö¨Æ˜ÈðX†•u)V€m”6ë/ô h'Äý~7øQÑyA_€h9f+“›ž€´Nf<ºuQGÕÕ¡ÏJJ„Ü„¥]°wob0L»›–¬O@TH+`ÒnF›T”̰ˆµbÞ‚Gj¶È¤ ã€'w96£GÁðïNd#éÓ_<™Œ†ÇIæ ÂNÒlĵ‹²±’·Ð ³í7lå*0v£TÞç”S‹þ
+Ph'™ÀÁJ>PrÖª4´ÜÅóÆ]
+‡ÈmI8v ½-ù©…dÈŒ¢$?]AØldLßN6Q*g`œÂÓ/é±(z ~H£6î¹ #ë°F¥„Zm0wÜ sp˜.`y0—uS
+±æ<¯' Ò—3†#«^ˆÚ—þ¨Hª lJH
+VÍ\‹2|X-ðœywePy‰
+)åc–x3¹
+ávS=9j‰ ;‹°z?)•· ‹‚(Â4'D0}‘Òì ›%,Š©€9q8,9íÓ Ê ¯~X£ Ê@ó:ñxà¿
+ƒy3i¯.3pÅ(=ùi$§ULËÕäWè– ²†Ý”^º½†Z¢——ï¸nX0$¯*(ÀÔ½D *9•›1º+ªñJ*Ø•Ö_*
+0ó xq%Qf‘¨ZIIú…75Oâ,(—2B]uä’8)±lÅUy2¾J§´I/-Ùeºj›µÛ«ú3pLÏýf<Û«róÞŠŒ1-OÛcµµ 9qsËÚWéìÂôYC[&pPS9
+ ‡8^.eeGßä-"ù~â/‘•#ö—g÷è“LpÝOxí)¡mÁܶ¦wÀ¢ñn¦©÷á¹¾øaðÇ—ÄC‹ÅîÞz•
+¹ æ^Š‹y–¯W*«×Y¾^Óºo¼7@«Ø3‹L¢Ù,8ðL¤²Î›Š¹po@àI){ukÃsBˆ{__AÀš<q=q2Š^/T¹ÑÏÅÕIU—'9Öó…þÒò¾Nþ4ª¼u‘ªf@'öÆÀ+]B×Ùsh‰½»TŽ›m
+HÉTÚG†ÔVëÛlá2„ª¼!®ØÜwS)íTöÑ&}úËÔ¦É7ãÙ]kº®NÜ'ñjÛËØž½m³}ÿ﯊àççã÷çã‡_Ÿü
+G8>}y>ÚñÝ÷ǧÿ3ö·ü
+,/Âñ‹«æDÂðµ$$ñë\HxÉ’‚,1(£¼r-Zº¹Ål`Ö™Œ:ÜÀJÒÐÈ$l†x‹vScùž³åû"”²ª*ä;Ƈª˜B4¼–îÆY„Aó
+¼<dU£cVÒê,üjÙ(-›¥ª±¥4ÓœÕS4U¢1̃Æt"Ô„¸W½ UÝŠ.:èêfíO'–Ž¢ E_ ·(e‚a`Õ¾
+º†¨å?Œ€Ìü-·²ÎDOšqá•C¶¢’s3”ÅA¸õÃÛ¤!>T¬
+•E"”owÙÜtU4Çþ8dOš¤×ÀÃCV¢Ê±'´Ôådû‡ ¢Ò¿dªÎ¨\9#ï^ EçÃyd|9u[´|¯C­EÍ9mÕÜÙu‘]p¡q£‹ŠŽ9€qè^'¤SÛü˜Ó;Hx®Æ¨€îÆ)GÔ¤ÀÅäµ
+‰¥&´ t\ZÖ~pœèLŒË|!˜€Éù™=/?||ùÂ.¯¼¿¿¼»¾Zn/¯n¯ï?-ùd9¥=¢sЧ$j1_ d+ÈÍ.$-äçáwà»1á§žÜ)r; kœZ4“\¤2¶%…•,|NŠË”†¥Ñ&æ ¤… BÏ}½‰–jŸÈ„ê–Ãñï~ëá/kÑ„ÞÌ}éH:¬¯^}x{öøéÝíñÓíÃýåãÓò%ÅÌòö=jøúì½5Ëñáî÷‡?ÿþrùûõr÷pu}²üƒŽ}E?^¾pZF(µ§çUÜÿã[êÿ¼o{ð]üáëû«žî>>üÖ‡ë›Ûûz}¸¼º¹^@=Ëw—÷7×'/ÍrF¯¸ø<Äæwôc~ä7øíWÄ>/aùvùég³\á“ß 5Ââxæýh¸EcÚÈ´A“´p.󇿠pvÅ÷p¦Áàã@€O¾Å©•‘Õ¦'s.ƒ„¿œ88l@ ¯PE¼`±Á+ø¼³ø¤³¸;Zå ««Y•€Žø ÛT
+yžXv©ƒyyEn_
+ãDP>ß ðÎ7u'CéZ“‚}@ú¹‡‚<m{
+‡K¡W›vub˜[&¾ŸÇÎðLþsæð‡E8r~)ÌÜV’3Ƕ•äéO¼²zÑWG×ýY]=÷“SIuÛÿUêŒܸ}ê¯QFcOgT’Á‹ <ŠCAú®îú£8?B6:*‡_ž'gëÊÉ‚ýRCI`g(”LÚ,Ž—iÞ±³§iäïÓö‡ÈÄ*x¢ÇcK5v~Ãì~Aó ¿7ðE1Ùhùú7N7Ð/%`*ýÓÄRçUÈé\\N`3Ðý:È´ÐT’p1„Qä'‹Öb½¤É:=Ïz@[
+ Ϲ-”TWò3lTYy)½1%×qµ‘½q㛌U+ñ•.€†qA²a0H•reI¦-&-(–K Î ì,Ç®5JÖx­e‘®ë¾'h;ù<^˜s/ü§|D)L†xµ_¤ëKÊBШC‡)Nù¨äaa@³¥ÐËñ&Sc·*¨²uŠÂ?ºUè`Š“Ø­e@§z~â†^ÑE†7F‰˜k¬`Á©"D‡ks‡”'d¬DFˆY!Ë-×8>]ŒªeFÈŠ
+«!`è¤Ý̲Ae?a€çàö1@bc–yrÏÅÈ=gÞòÉrŠo)žÔì`ë àf¹ûvçÝ` í̾­¢úËiØð4cލ-ñ
+ñئ»D£ñj%ÌOdUJ±€,A—™Ö[P/Àx%·= kÖSˆì!Äà¼Õ þÛv
+:In 8¼˜•8Ä~ÕþUo¾”Ü® PˆÚ<íÀ5ñþ€®2ÞHɱ÷ïalFVjröÓ‹,¡zŽ
+Ë´LœÈ á|áIEÙ qyzš“:¾Šéj7
+)+”Þ’fH°ˆÂÿÏ©Ñö½-D—|ýÙ®:Óˆð›!L¨’‹cŒ@c\€aî¸ÍÓV"P GxÕŸ3Â5 ]t
+\Έ‘­’Â`ÊúS0ÝÂ@o†™‚Ú‡Ét!%Gnÿ&Óp~ÃwÀ¨ AüêÁ<T½˜ç\µ=»+~„+ȹ?-ÆuÚ2¯á3Á((ÙÎ@ûWЦÝ"ƒ•Ü´b²ÎŠç®`Ì]ûp<éy)œÛ%;Õ`öHß ÝùpWPâ´´TÐP„¼ºñNŽ‚ 5›¶5ND8÷9–VÕ>öFD 1‰?‹Gfß éc3ÁNñ@(¶<—“qó•%ùLÜK-m×ï’„3&¿°Ë²Ž¹6@®'%‰³aSPz³µÔ²›‚B.SeHÙ`ê}ô«×f¦€'XUFñ HÉwÀ/31fïP’…ËÑʈó&3
+½æ£°¬Xg¾Õ‚ ÄÜ;‡´ .ß¾DH^2·[±`¬aTÞ`Ür… ²øŠW«
+§ZÈ$;oiÑK¢Ù"D áDs’(–O"%dŽ^é’7JÍ[èàYëþÛ]rU=÷‹;§Ã6ž' a?ïàx€Û/ì×Úæâx×yÜ)š žÅçøè˜œ¹WoÅ
+Q½AlÓ\» 63l±úãš-±bµÝsxÙ¶=²jñ×l‹lóÂm4"—b2ûÃÑ%/.n´’1©Ç®z”€òš’—Ëø6C¾ý°’$…Ë<oæ§Ý9ü¼aÉ7]î}×^ºîH›ïø°¹óÈ›eT²)ùŽ0›¿ÏÅÁôG2Ú²pÇ(Ñq¤Gæµ)OéL¤©I¸¢œèX‘³íÜ'zw¥Ã§‰ßþýý-?þö2³%Ll›YIÏD¹ú#NeN¾ÕŸË§×bGË“d"×:ªâò|yX+†Öy˜= ÝÆbÉ5\‹Ùj)½,5wƒî7lbýõ3¿¥™ÅOÛ†©â
+” 0ņ@GŠ0èÕØMµ…c¢é„5›ZDÚ*Æ=ËÀ`R…þŒ#€Â.L7‡`߸+ £)’c uõÈEk³:=åè/e[ÜÜVQkOѧ½„iì9”ÎvêŸëÂwJUlm\ >žL§âúOaÞ8¾½gêóq½*Š«(¸v  ö­Õ¶›˜ø#bÖnâäÓˆéÞÄ–6SßsäŽr”5†íáB±ôWÇĵp\6²{éžm`æÓgÅÍ0$Òx.x±ñ\õ†"×Z‹0n»ùÑ¢C à– §iÞ~{jœ±%8 ¶þ؇í~r³{|”³Ažt­èö¾É‘D®k“Zk^·0…<Ù<aÙc^aj¿;ʠץ椗2ùñÖ¢üÒx8±L~ZŸãðš' rk<¯áãaŽñõIÅïzŒ¯Ï4<nß0zÇ~¥`Á†?”%Ò âMÉ,á@Ô‹RöFëÀuRÊ7®Ï¢?ÀQ
+ž8w FÑχÍÚf5¨ê¸Ò aØ×ú+ûô=øÓ¨òxÔMªÚÙôfàÝ.¡ëê=´ÆÄ.S rs©€ŒL_·dÈl º´…ǰQ}–!žØJ÷RíÒni$zÑAM}ZèÚ꺑x+ñ†í!ÛmÓöKþ?^Áïo¿½¿}÷Óûþ¤Gz|þåým<¾ùöñùŸ_¯ý%Û‹ôø‡ JN2O
+‡¤F㬳‘ld:+Í ÁYKMª&»4IüäKÈù¤.…°ÀC$§þš9lê²raÿšu®›®³™:ë즔B0¾­†
+Ü¡¢;”¦ºŽK¤¡—ÀÑ“ƒ¬1ƒA+b¼Q¬­“_bˆåã*Âe7]iYÞ²¸þ¥1B8ïòßWõšô¸b虿%&`þ›‘,䵊ï
+ 2ÊçÒÌd§R]A«¦!r—Û<†-¨´‚>«%ÆiqôRâÜ•¨Ü‹9O•à -âi™ÑŸ ‘ñKXÏ\³ÖˆÇäyÖj‹}BD†©Å/î~Ñ€×Åò¨Z\DVÌ”,W@ýªï€wMÉ"dµ™Øýqzr%IšÿŇLÜpö‡„ª:Nú^40Q§I8(JáçEÝŒðîÅàµzç¶x›‘«Áï@Í•õ8.Ø‹»ÌÓݯÀ•g»Ÿ EŒëqQD«óK'ˆÓdy^œ\—ŽŽ1 ûÀà›?…W¹È©,M²ä
+#éÉÕDœ‹9{£ÐaÞ@ùQ ÀfÅCµ(à°£* ¡“)^åf
+PØ5` (‚µ´UÕHr Èpüï{8$ï̽»rU×6dÍÙY‡CÖõf*"Íw}Wjiyn
+'h<L̨’ 7}æmLÉÀÅ©ϹP’÷2‰zV-ã0‘"Èεn‹ühâ™A&j «ˆèÑK}!gbËØŠWÏF ¸jåû­Åµ³ð AÈÜ*JÞ†èeri2ƒ¯eA
+ÿD`ûUÉÁ9(ÏM¬üÔÍ£.É<¥‡CÔßzs“š²^ñÑF7_0ÚC<X~l~$ze”1‡$!ѪÎT:¥™B†é)‚ƒJÆ­ˆÄ²Þ3niÈä‹Ûø†æ
+Roü”3ƒ!àý¶úIJ9Ÿ ˜Z‹˜PV›¢rñœ#¨§¨$!É&ö óL]0<윢¤ƒv¬ÎpCï@lP¸vÙeÈ\C=hIÀ2}•Í¥$½å@¬ž…’áv°U ¹Tiv†HžÁ„ ²Å„<}̯#BT‘—r¦Qhñ<+{HÉn¡ÏÐÒvó\%)'ovó³=[FÛÌwêŒÖ´TIò4ÖVDPçPAÚsMnú¯ióêô¹©oˆóQ½PƒŽÍR¥òÌPÆC€4²I{Mç'!„¶j ˆa””j X'`{ÒEÛ¼M£ -pÍ“k 5Ñæë–ÒƒzË<… :% àhZæ'»”?Éñ8Ô-Ø$›­ËrZµ7€ ±XL+ Yu5kß7Z]ØL-BÜe-@•ƒj˜Ž>å×e;ND-Ѭí1²m
+Cß°üLÙ‰À”„‡Í®èœ§»)+mzó°é&I™`GÓ%x’åTF%¢“"/‚&¼ÓѰ1*w{Ræ \KÏaP ³>¨ÞX¯-¸+MÛc³³Ìå¤á!g©«§gÙ>ð4šHD럯K·[‰:ˆÔÚú@KsÚV-¸bds޵ˆ…àÚ³ª¡ãðµÙ‚ñÓIËFiYcÓ2JÉr”7‚,BÊëÝÙzÊX;ìæty¬íÍö‡X¶¿˜/Àpêi‘[¿û||Ï7?¿xywÿêêüþêÃíîîóôGÂþD?NžTÝøÍˬùù»Û‹7ŸoÞ¸V`³¿¼ºUèéf÷Û/ûûg'fzIg½ûÔ’öÛô¯${ ^Ô@7†Vðíã(@§ÕXé øò޾`Îÿˆßþ ìÓ¦Ÿ¦¿ÿÃL8ëÝk¦ˆZÓDm@’š$5A8ÔåHO'ó‰K™
+% õ¬÷Ê~)‡œ%‹´2ÅÏf½ì}XIÑñ¼3G ˜Í ¾‰e{êY Q#¨x÷3öú;·d_áw<“$xŪãGÖœ¢¡ãf £h±V¹b|VúEldì\u£Mõ [í1›vuþV—ÀÏ¡ùž­q¨6—ã´8 wl›Ž)Ø…_bÜŽ™ k¶ÇCÆÅ'˜mdîXs€ûÅ1£iœs„0ù&Ù83#Aüz«;fÓ­Îßê÷^sÀû­ûaC|ºcË`öKŒ›ã1³qíÃöxÈæ`–ÅlÊ:˜Ü/ÐrÛí*4'ñÆ1˜ÅCŰ>ë[Ý1›nu>;Üáe0¼ßº6ħ;¶ f¿Ä¸93×>l‡lfM§Ñ¹ƒ2à~ñJV²[D˜‘c0k@sOe¹Õ³éWçÏÚAàe0¼ßº6ħ;¶ f¿Ä¸93›Ö>l‡Œƒùí[M#PIScØ¢é‰yÖ⢠F®Y™ó¤TP–á–@,štÊF¢]`rt°èx ®<êu³ªÁÎ\òÁ‘HJÔ²ª¤l› É{ŸçQ K¢ÚŒ[ ´l2ûâûÚòç¬Ú¶ˆµ›Ò 5U6X†ŒmÛÔ]ÏuæKÉÞë,6¹z J¹ÚÞ
+Ñ0pô…¶Z a¼°4<¨_Ûäæ"b˜„ÚþfÅÛŽûæ[#VL›yšk<¤á]Náà~¡\2µÖ° À1|²ô Kyx†³š_j°ÜŸsŽÍ,¼8[ëGÜËB¬h†Óœ—å –ú0hÍHxÆMaw‘ª¨Y¿L8u°°UudbkÍ4ë@æ¨jòB$8”l›GSÉåÑB2x•d4ói2©¹ž ‡¼Æ‰&™áîYüœó
+´hˆœg ÛU”pÕê! ΔÏU‚ÄF:H©BÙ}4ÎÛ…BC\ߨC)ê;e>Å9´&ð¡ÁðÔ¥þÇpµs+
+®ÈÒUfƒ ®Z…æÓ<×,!ùÕf‰‹kv0ÛÁ…œíf‡KFà|¦âÇ7½ø#ÜS þ¯»ûûýÝíw¿ÿúáîþoŸÝ?›þ@{ÌôbóáÃõrÓíîýõþûWûßd›=4õSÌo÷w;:r0ˆÉ+”‰ªÍ£ ÛxZ¦
+YWžÑ$9xŒWжsÉÉ+ðÏÍåɇi-¢ƒÐú¹.ZÝÒ‘P²{s#L±Ù´%úÛxØ>Åå"ü‡Q°¦-~(2dö4šXÀ¼ø¨bªÓ»ÝZíŠøØ·¡—™»IYˆ³š\×=¤iPZÅD”VÅVt=˜nJí%5ÓA÷æFݯ‡”Z&ÔÒÇn‹ï É´L%úîŸ{ïc´jš{^iÒ˧t˜ç,‹óB£Á+¯ZŽuLš’D£?ÑöÄîcLı¨x¥à•8¥&š»ó½¶‹[žlÚ¨àâäIRÊ9†}ìéÆ$r)!–8Ôó„áh~Ü`eˆBƒÆYKäW 6Ø%Ø:C=ª3„äˆ%냋ýØŸn¶]9,ð™¦}$­2ZˆyÞÚê`Šêï1Cý‚Ã-
+ËØ-@ä‰N"ÚV0i«}R&Áµº
+½®BŸ° ¶:ÓÁ†ÒcþÄVE_Zíà|³Í7ëPulta¿¦iáÖcæ% ÷|þB»á`°­;Ë”9ˆrÑlÉBië Ñg5 £þ€gŸƒ•èÞÄŒyÏÑ¿kM6é“ö¡ÏŠ
+ÄP9½»é߯O°ÿ/_NW5Ì}þÿ½ùŠ£#Ý#·£ç¦ñ…¢×ž¤Ê`µ£þü”yA•VºÕpv^÷ún3hËVmì 1ï[‘`*ÆÌ%ŸŠúâØ/·Ý6Ž$ ¿Êܰ/4ÛçÃ¥i{
+×€ d“k9IA(~ûý»§O53$%Ã’„7‚¦Ø]}¨êªÿËßIâÉÎ9g
+N=jÛ¬œŸ1}ÁdãÃãKæÇ[ÞíÞœdèN"¥d
+ÅI3í\(WÌ;&}®I™!×缩 åÑø]ï×Û5„s_Ãq†›ä^E[‰sãXd ñ5|7ùE³‹î±úÎ2‹æÕ¨lfšl…`iª®B¨e²âéðQ% $t'àM.4ïjFµûѼfy¨uãBœÑ„d´®›Ê.¼ïšs½&§$u{®ÞÎæ\L¨²~V m½ŸÕÐ# ½CAOtv÷L:¨É•EB+Ë¥Ý'¡%
+€`VÝZ
+"™ãìŸ
+àšÔùãV]<~U„C
+ÿt¤¨sÜ…E˜» ùPãÛÚYcW½³#O@Wn:¾Í“Ø¿*Ç¡8Lƃn„ÊùÜÚQÍÚõœ=Ÿw|®ÆÞÒE9_T$åžê¾²}f¿ÍúIļžÞk{À4“ï^ú!÷=k§û™µF˜”“ì)æ±¾ÿ–óïíõýùõr†bŽ óã@F¸—a@¯Pƒ™Š
+1ªÆ-K¥–*¶;®¸>ŽžlÚ³½“uõ§ØÒ^z¨`vâ â„;0Û0H Ç'¥æ‘kÿ µÃ•jëø¨ÖDuê$÷Ìbž‘ð(¦hÿ±–ó M™¡VCÊjá£låºÕd‘ê‚Ì1âJg1®WÓ0§¡Ø“Ó[§.¨Äï:ý®ƒzήÚÀý™{˜[zäb½
+°]T ̰ÌzóPª«éßË·?èSL1÷í_WÛëÛpñüÛí%´9ÿx¹úùîËru“†ñ©«30ïÍíuÜYãp¼»ŸBaùãífùîëúãö2˜½É¦‹»ËËÕmwÒ®þwû°û*Ü݇ûZdÞ™K;â/øïOØî;ÕýÚýö;ë–˜þálÄ†ëŒ ‰jMÚD¾•8³¥›¾•[ù»¡Úê52Eś¨ pz]‘"Qmž‘‚xM–*¹tßÊîü]wÞxM§Ë SöQï#ÕS–îrq1_[9j+*ª:oøOh¦BÃAçä\7©°
+/Rj¿OòÇ C˜ºéQct¬j¥.e’AÁc
+½.hE®q˜¨¤8w±9 Š“fÚ¹P®˜wLú\“2H®3A$Ø S
+¥ñ»Þ¯!·kì6¾†ã 7+È½Šª¸ìƱÈâkønò‹fÝcõ5œ!eÍ«QÙÌHÙªÁ ®’¨e²2êðQu $ˆ'êM.4ïjFµûѼfy¨uãB¦Ñg´®›Ê.¼ïšs½&§$u{®ÞΨæ\L¨¼~V!m½ŸÒ#½CFOTtv÷L*:¨É•EG+˥ݧ£%
+€`VâZp
+Zõ‰ôxˆ´Í9Â,&¯Gvë{¡J.4vÄ™ØÕœÝ„lÈ95oÇj1u32ûýf¼¶32Ð#>5™4¼dàìñiS¬ûq¶œ•öȇ×M]¥¡À Ôæ™›i7‰ év˜Ç÷®vÄc´Á=öƒ¤ò„ räpÊÙ—ÏGP9‚ÊTŽ r•#¨üAÅ¡ÊÚ˜z R2"PbPT-M4fÂ$—vÊ<Æö•¦lu(•ÉŸVD>ïXAî œvÿ\Ð\=V&ë.¾aÝ'†D†‰ÜVLè" Z’¡”ªÈîÆÜ† Ù75û!9WgÍ„u/c;;`'Zz|Úë:Všõ‰?Ï
+Äì²îHÏ_]2SîAP2ÉèÉP
++³ö#¬ü`Xyu$•#©IåH*GR9’Ê?‘TP4½Óƒ†TVš¬§ŠÝÊÞòš—²JMíPW8FÖÇLȪ¤2ŽŽ×/÷Ùó~Nwìó» Æ();y†UÆê?ä B½ž GÛ:0W…weÇÀò¨e'Àò€e¹ùD¼BÏ$áaí`oj€tu|kÇ ÚÕœ aE›(VåD™µS?ÄÞ¬ë$paÆîCbi1ÝçähŸ$¿[+ŠJ]q1=YÖŽó‰z¾z¯»ìÔÁ.fnu²Ë=öƒô"{®8êÿÐËc]ÿ½èåöv»A;éþs}¾ù¼ša˜oÆ«Ñ×C/ò¥#X %&£àÏvêPQbÚ¡B£M’¢1…÷&•êˆG‡ôf0–å³q þ™à=f&Dò×:â$H÷d¹ÆøÞ«m7Žãˆ~Aþa^ HA´ê{w%O"ã8Nd ü`À zE8 xh:6ÿ>§º«o3»+S±Ô왞ªêºžªf P7Ø/:¨¯àùo˜K:…ÂfL$œ¬lFyj0½0„¾œð
+MðyM…Ø=9®oÊÊ“‘}¯)Ÿ©VZ”ƒ[ý6 ¼¢H~™$"iª{¦Bì>ž ·û˜¥#ÅIˆgÒ$mê°G¾AÝüAb¿èohgÕ[O\-tzHÖ‹_aè¨\å*ÑPH ¬ºå¯×GÕÎ’?€‹ˆMŒlhÉBzéiÌiƒCˆÖ] ¯è>¨0‚†‹½žX«2ÍHÚ‘Ÿw4‹à6Äa9ùqð8æÑ¹™<YåÙǨô<Ž9ôþ¥­r–ûÊÙë¼·î”Ö)³é2í¹qy…‚ãÆ¥ˆ[Xm\šûg‰®'×púm8ûQtÜâ"b®h„[Þ'.l7+<pŽRÝé”=”I+'ðòÆz‡ŒD9âødÙtªêù_ˆù4ÄÎa4YÍaC¾uNçó´TÚ­AÿÓëÛv:× ô¿„mc™„ׯ ¿¥ëa…
+Ôù› ¶~Å­UŽtÑØ©[ƒº©ƒ°|ŸA~Ÿo½ð+¸šš×«Ù¨\8JÖ9«½‹Ìw"x¤¡™ï(1ˆ‹(`û:ÿÁ¯=wš¨ÚÓuŸ}”nøm‡µÕ2¦ÖsMq i&¯
+,ñ-O<VØGulyâ°o,“8\Ư3eçäÊÎä,&Û¿åj0­jDÅ
+iGQ×ÉÍ&p«ƒ±>àeǰ–dQ1Õ™4ñ]ANˆhHuV†Áõ¬YU„Û¡(õ¦Lö«2ɹ騕‰‘ªsÔ[j¶^°u©¼.–&a]Ž6å²_•K7=ƒ…7·;2¦“Š+wð&À}&×EAM•›œ| Rç9/ŽL|š x%Þ
+¨|¦KJ|ejÃÒ7à
+‡Õ~&G±Ê 3g+â%66d@¯ÕBˆÕŽŒs`ëZÄkªŠ™¢Í[e+,5©šh¾LG&œcü¾óÀ ÷3}ºÎ³ÑÉ.„»ô!œÐ­` jÇ&g¸SMÞæ‡ˆ"ÊœšÙnæÆÞPî/X…ÚM´®c1QQÕ9Ö®ÖamGaŠ¼Š˜ #ÂnÚ{²Á×’l8ä©`«dÔFõFÄ ¼çõgß½|uÿðç«ýÃÕÝíÅýãòGÆž½
+\$8‡²uA8!ÙX5޹iÄ8‰…8Šúò±Öƒ¥…ßò§:šéZ¬$GðÄ 7Þ"ÊÝìZuUÖÏAÀ*ˆÌ
+H:ó`€6®Ö3-¸Âßœ¨+í2o«²õ(áð!é–¡®ä]Ð š%Éð©v©ìF;g4IŠDç3×q ¨i•öž¿ •-¡¨÷TS>ìñèsád±6 ØK/Û Eí†RÍæ¾®8õ|-³&í&pÉkoOødv- Ƭ"¶M®ó#IwšJmåfyù%xÎ34lû‹‡‡ËûÛÏywÿðõãûK™jyyvww=º½øþúò‹Ÿ®Þ]þ(ÇôVÔL€îóÀ‚ScgM šþ·‹C?3ilœ‰¹¿|syqýÕf×/üÅ$•Þ^_í/ßî/®1ؾ¸¿z÷÷ËÇ#ãìWM¦¿^^¿_O¥ÿÓHò‹FíÁÔ= ºŸû›EªxiI«Ü±â"ý÷µèDý-RÓÆD£„¨4« ®l_ºC¡ç2M<ÆT™ äòáÔx4ÍhEwÓå]ÀWÙÚfw¶ZËå‹vyÛî;Hè®™”9[k§6€ý
+[ßîZŠ•@IY´/Oâv®çÈ}Ôó¨”b™R¶-õ›¤ê÷€†«©½% !2fÁ-msÐW<¯såÜÐBa˜@ÉC™LY‚ÉÞYâú¦Ž¤6a¶õL1Õ÷|Ÿ¨ÛÛ~éAD÷ЬÏQƒqì×8àã}ëP¬ëH( œŠ·É›jÊ8®fu ã+•¹ÄĘdX7P"‚1 C®†KÀBT11¿¨2NoAÍ©¢Í—DseÓ‹§-ºSI1˜IF}òa­ª >ñL/nÒ;ÞÕ^WØ
+¥²Å«…¶$b?NËøÆä°Uø_»œÆ
+Å”™Ö%ûyá‘Ãy¿÷ÄÂ4*(Ḫ¡Õa<ªìKÎ „Ò£¨Šµ¸qóNäõÓ†+øR"”(È 5ÚÐ
+DL¼ª—p\I#Ú‚Iu‰2±ô¸(¼:¯¯Êê*¿Ø0¼÷`EKñŒ$!.£0 Åí¹Ì{c]s£)L8|n| ¢ãœpbVÀ¨TæßŒŠª¸¦òEH£/uÎwwå0xžŸ!ðÁÐéÉ„ƒ9 ña7Ø`ìAœçL^S­‘°!
+ü`
+endstream endobj 187 0 obj <</Filter[/FlateDecode]/Length 14501>>stream
+H‰ÌWÛnÇ}'Àè¤aû^Ýö—r&’2L ˆåîŠÙ€äë,þ}Nõe¦g–ŽhƒbÒÌٞ꺞ª"ïLgIjùNjåĻÃò6vd¤cÜtÊû
+ÛNûÈpQÑ0þñð@Š7éwª8Òg ö±‹1}VàwØSú<cçt¿Sì´4ªàª”h»@1|Ð||~Ï¢lð×?àÿ¯nN϶»7ëÅn½yœoŸÄ·Œiqzñ¸GgÊü}¾Û­¶ßþe³Ý}xúeu,¾á3RœÎ6›ûñ¡Çùíýêí§õrõk9¦öE]®îÖ¿î¶s¾²¨¨3ÞYát'£WÂRGNz¡\•BâÏéåj~ÿ~¾Û®?ó'#±ñê~½X]-æ÷ëÇ»·Ûõòo«§"ú;þë𠊣cqý3^ð™¼ùþqyõôp»¹¯À Š=VèèÇí­8³ûO«ãC)Î8G®;<øtx ÄÙ/üú#?ª¤~{bè¯xú7°ß„ïÅ?þ)Å__æäcK„ÂwÚS²«Áu§-‚Ź%;ÒÄq6‘ß)æÇEÎê4éþWRp2b$¢Ë}éãw¸7b$1•Tpý¥õ=ß<èÕœ,h$î› ³[vSþ3û;ðè§ÇÇùÃj)î¶óåz…d1渜€{;euȯvR‰¥Œï,¨ùÐy mfw‡ÆÀ,íÓÙb/H£ŠIz æg¥èg³ß+Ó§?lv—«Åf»„ž9[_¦×^žŸ]¼-v~ø¸Ù>äßjž"¡—›ÛÕÍÙE¼RW»§ûÕÍ É8Ù=×Ë}—ê/¹´ü›ÎßU7øZŸÒÿ²äx›Þ5!XI^—ìEâ(émƒsŠ©.˜œb± ´3 T¨´ªùØã®‚­X¯q}6–·>C4¾=ƒ+Ÿ’®‘5€£‹|ÐrÚØ3¶û|ßï^–Ùʇcq";)•µ™c`¼±ŽÎª@a/8Æv
+ÿ央/év°¤Õ¹ AjœÔˆà×Å.X2
+y
+ñZáARÐЕÜ&8‘¿L¹\ÚÊk¯ç½‰ìZWÛ êðU0{Ðæ¹/ã¬î>¯î.8Ü­M,ÑËd_=vwzÏ#œ¥<:Ç™ãBM³"±G×7x£k/¶7i0Ÿý…ãø¦q†²^“µq*$*è3'š ÁÒ‹V¢ÃFŽ(ïç[?>×ð q
+,5Ò¡‚Y‡Aáæpcò vß/l˜ÊþzGÚSáüXu¬…N#öà…qŒðEpŠ¿ˆª3ÒR­ƒ˜¸]vMiÆϨ3h:ï½kÀ"×iirØçÑb$µÇª‹J ‡1‹‘ÔÈœÕX…
+ ½¾íáÁàFìž^#BœÆf‡ŸÔ—ªoo°£q²:’RÀ¼¡ ÈãaŠƒé´­Q‘:²•Þ`qÈUƒ­IΫ`ïÔ`£Ÿh’*LÄ`Ñ¡HèqBÁ[ëÄH,éÎÅèÇ:T°KQ¸=ܛ֊ÝóÃk„Åb±²”N}éõ­—9»¬…ÖåÍwÆèa‰¬0&gíRŒQAÙdI2õD²¨Óœ½ÌWxôˆÉat>ˆ˜ˆÀ¬Â¢2j…c?§÷R½D‡Œ&ŒTèÁ"¡êÛn,Äîyá5b‚²öʸ“úRÔÕ’†Ë&|6c]çtêµÄ©uÓÀÇ ƒ˜#¥Ôh$„|ö‚×Ìä0L™â±˜UBÜÃQ‰±T¡ò‚بPÀ"aз9ÜÜ‹záUÚ “°”æ†S^ªºZÕËÌ^Õ
+•cG¸•á°Çâô
+ß?Þ‰£Ùìl±øôp¹ÙÍùt•ȱÁJ\/sBê?šS
+ËÞóâèX\ÿœˆèÌ»4»¼YbBØ\ª^äq©3H]LÛ—è Šr9a ¯D•ò4s^%›¨à²Œ·hï1–Æ*&UtãyvQ¹1D_n#“Ë ESLédÛ)˜b„ÓÃü†Ã”f*äv–Dbà³ä:¤.¹ÏóÒ’ÉŠ©Ö×µGvšœÍx’œA :ªd¥ê.äU0Àžó:1Y2>ã2L‡P‡tWÕ“HüYZBΡɦŒ‡Ñéß´èACv9⦡»CI\É_…ÌNŠàH8ì5ìÒYЦCÂÊ%µ.•ò$›âåx¾Oôä±î ™¡h04îTÚ=#@i”8Å„‘;±Ž2E“¸‘›OxîãçnO<ƒÆI+ØXæŸý–›¡K݇ÙʺÂQ/Õ<É—š è#˜W¡©?®ÿ[)$+Ê\ÿ¿°Ù*på¥Ý ¬MiÙ*b•C÷b£ˆK\C’ç$rŸ/…NÒ"º201o©LÓ\¦=±è5Ï@eƒ–UªT†28ì޲¤)ߦcb6Œ­^™¤.žHå$„U¼‹TøYÕGB`<3Ï2ü]b°4•AN%½<71WÉŠ§>Ìc˜b2* k™@ƒª  6ƒiÂüóU×bÉmDAþC¿²†¹H*I%=îŽHpXH0,„`l¯q<›`0&ÿ>§>Ô­î{Ù½ã¹c&ñÜZu©T§Îq2‰µj5\²îwŽªÈVšñÆ‹•xZáµÖöĺ uqAÊ´áÙ9
+0ò FƒÙ”n:ˆxˆrsःŠ#ƒ²ba†uÞ›p_dO*v°kàœ)™dEp¿Nµ§Œ]
+S4v„çwÕ\8) ‰×eCªhê;ZÛ°Põ“*Je톚IÈZ“¾€ì£èÑÖyuùº1©Ì„T-º
+Í–Ö7Œv5‡ëR1*…d“%#„
+Çõº¦$u…¨UF¤D
+8œ@Gˆ
++çg…¤€
+ˆ–‡
+•³zgÊ¢(EFÖ
+©æq°®œYúá FpqMNtrwlAÅtØõ …âÄŠ\\{„¶š ‡‹Q°¬dFêa
+ñN¤^ºc‹®Ú.LXž¦º ?5욊zJg`¦¡}‰¤Š3NFgÛÙÈ—!,)3[ pO.Ù@g
+Ë]'j¦Q/~.4Ø‹!dPLÐ6^„à@!¨T]Í\w» 
+l ŸBâ" T’yñ[!«Ü%çÐp ÿîÒíÊÐåû„>µ}™”•Ý„=²VσJè%Š)”—
+È’$œ“ U—Ø›p„ˆ|J· ¨~ {†ú\„!¹•é'60+„ºÑb!éµ:L¡XX@e_Å45°ÑóSÆqˆRtUÇ´”ˤ“DÔˆp¿ôé¥{c0Ä -‚mÄ ~/}YQ\Ü,%
+'È(é/ÿWF}fsçb6ú}úñdÇ¢Õ ¿óˆ]“±×KÇoÇŒ5®éÜö‚Éãùs3‚§ìÍ?/ãÑ+?ôb@°÷¬­S‘Š
+¢áå ø8_Æö”î!4«Öd,Yº;Y¸M/#ŽnÓúÄq»2®ßjÞæ”^š½]J?¹þ~¾°û´DÐ1(ÏÃhÂjžìÒ\µ8?jªµf#’bŠ£W»pìØê2»­àa¼ö¡ÿZ»°uªóW(ÄÞ×fÜ]<Ù·(7§Ó{öï¾?OÅ—×õtLíÕ¢"æ,òðxŒ›`aŽ RäXʧˆÿY;&RA
+#\[rM Ì ¬z
+?AÞá¿!-ïó!¹’<!8Ì$`gˆ ã‘ÁÁ¶‚ñ0ñÛç«Ãßj©;“–-}ánUïCí:¬ZË8’¡fþjÆs5ü¬»<¬Šc0í`-+²É$AUá–Í^²‹#“Ú Ü¥Æ4Û4£R3×•é ¯ ´™cÜ>­Öc6’¾ˆ×³¶ýD\¼VBm6š¥B¢*È{4æH…+ÕG5ShÂêö2Õì-˜Ãsi¾¸à±ãè¾2·¾¦e¡v¹.Iä¡h0ê¤
+h5íĨ ÓÉ$c?ôf¸dÕoÕ­ã3ñhÅk­ìs×­­È©ä¥
+Ï.QР÷i¢´ZP± /…›C€‡6jðÅMä§4-‡t±vüpö+XQŠdaÈ5µdieIØþþÔf*F!c \”7JÏg^…»ÌÓT«L–£n¼‰ÌÎ.˜OèKníàV²BV1èŠÁÜÑŽ«x]¶7¡Ö㞀êΙzœBEò¾˜Š{ 5²r†YŒÁ8¥BÎÄ Ô¥_1ñ•“B`¡‚ÈÛ°Q(¢j?_·§!öÚÄX^fì}nR•jdÖ® CUtaðØ!?ÑÈw)ÒÔ&¦h4‰çO- VÆV­‡›1™o;j Xºb#Vé»Ágʪˆú/¯HI‘Õz@­Na7La„³E7"»¡k󬕲ëu©§"ع*¦ 3±–ƒ¹ø|­7²Êôe1ÐâÓ­”>·çÎ9NQ¨Ã@jÒæšLmÑBnN#3@ª
+Ùõ¼&)¨[¥Fʨ
+MYxq:t¯2i-N…·œ‰ç5ù"¥V` Ò"”î^$ß]³ô`D*·
+=VQNp¾(€5 «1W8c)ÕŒUçñW2ò&§¶æ>”–ÊikŠB‘‚P+^!ÜŸQì:ªšU¥f¢”l±@d‰.+G0>5½Ôtå6䍿šMíz–g¾87ãS”m
+ÝW*.Zfô×µ £Ïµ»ÂÄ›gb/sñÔ©$âE±qŠ÷*k#P›’¨X@¼ ‚~æâ"/£R\„E¢½–$§umM”®¥¯ˆ‡|¤ÚLÁXÓ†q!LŠ„‹ÂÿÆþn*@ž
+¡þ‡qb…£”  $/3}Ô½FxZÁ¥@àì$’šµY3„ í±&z´”mÖ…Áº¶t·ä<Ñ3ôüUp%Ó*»hì†Þ×
+®u£Ô £Y§ÒÿÒ>Í„U^y£¥–]Á‰½J¦Í>£¯U²¬6‘6¶˜‘y]ض̆¬síà E¸¸E§;e:´±R«¿¡æ¸ËLkÃ{DSJ³0rzU‚•-›1‹ð´¤SñIì%˜
+MÍÍ5Íq· ª`ƒ‚
+¿‰ ©óà^¡¬}JÌ‘r©ÄUÁéºìO!5—I™Ù½ð£;æêaP‰ZÊȈú5€R’÷ß”p à)MÉŽˆõÝŠ1)e
+BÛ¶h5QPB(’B„P,¦àJ† 7µË„s[¨Ò²¨ÁÙÓz@Iѽ€ Ž1L(t¢¹bŽsB6 fÊjä¹L/ 9få[×þ
+å×b+8™Õ]ƒFâÀh^2nØubû‹LË3æ9|1S}_ <]@_ïÑŒI¤©'Óa· ‡eâÑR«F§#í~"¾€+M¢¬š A-þ2—¡µ°$”)”–8‡p„Ø›V IMœ¤ÙKe† CH"91ä>œ"o4Wļ5G)rÅü!CÐUºi0Fö6§ÂrS¦ †)7¾”ÅAê#Š¿Äþ¨kahaàfau@ãÀ¾Fb‹¦…ðN*áüXoU/Ž”4Ï‚§¥ßUº{n˜dþ¶ó×
+ ôG´Í ÂÂÓÈd‚äÁ<Í™”0ŒÌÁo@7\YŸÊ$Iÿ€ÂD@JrSÄCþ¤!C YÙq]µ’.á@žò<í¹üÊv"29@ÑùÉç_~~çËG1Õe&Ü Å8&ÄÒ½Göä~YüŸFüAÎÙmAý|usÅÜù~8rîÞvá7gOcxñ‡÷¯žz÷ãÕÛÕpþú§7ïWÓɳçÏý&,gréÅ/
+
+ÁAá/JdkHQê®iÞCJÂifˆPwúåm ËŸøö/l¿,eù~ùû?ÂòŠ‹.žY;„Cç9Ð[
+ÞW‹%¢diÿo¶N©n~Þ]ˆöÁެáâ)÷'rý,èŽ[1úî÷üè{îxò›éõpÁW:çütu}µòœË0&þð¹å/!·$Üâ:EzóÍBœØÅà&3z©1bˆsÖ4-ÆÖ
+å̬;Ø) I’/:¥bFñìÕ(X–FÒÚgdåÐLs5öÁiÈ:/Ò•sKzö[pœuuìÙâŒÔ@PcNv0¼9näKí·(³N¬†Z±4x>#Eªº¦jC½†¤¡Æ§@”m‡¼ö¨n±C/ úº¾‘Q÷BeVcþ.©ñ×y¬d'ýÑeÇ–@Š}ÝnyŒ’ÔÅÑ
+åá ó3kf!zÌ*#˜ËPçi¨¶ÔDq\SwöÊ Ôu#Nˆ =Ý8â¾’ÒÆ³R¶¡¨€À…“¡j¬—@¨! CÂb€!MdÉN±%,Õ¨‹“sn•ä“ú±ë,íb¯qboÌ‹XBÌÑé1pÑÖ”&q_&Éé‘ä12ýáÕGèô»‰<“¯ß¯~| ¼z½ún³ùi»ýpùâúV¹rN~‡šù—D¾€1tÎý©f”ìÈ4úãÑ÷öìfu²zvsöûþuRø¦ÿÑt-‘v‘ 5‰ùm}H§OË«Q´PŽ
+*Ï;V¯³¨L«aœ]ÑŠ–
+ Ô³S_XQ5q7Q/…ùR”ÊÜïmŒLŽœiÿRÅ`~ìÙ aÚüj™'ÿmÞh3}uuuv¹;_½¾9;»Cvx´U”"š0º½M–A Ž…ÔŠ&šƒíïæõ7ñpY öý¤1¥‚â²u
+5Ym.µ’ð³Íص1abJ•ŽY•½tl&rúnçk%¬W´p8ÏaÚDS÷9 ¥~˜4h½—CókL݃°û . eŒƒ²£Ù]M=Òßµ£…! &‘HR *ÚÁå!¥Ç vh\^‹æ t&2½jÌ µhj§Á"H ¯³xZÀ°Ž’Êæ|)
+s[]E`ÃÙågG‡³’Ó£c0%ßÅ}éó¦Á‡t7¿Šðp¤ˆ)~ŽÆŒ
+ar2êîë®°"°fu Òù{ 
+?b
+Òð•uùÏ¥ü4pgË «ø©¸½€f‹ #ð­6ÛO~ëæ¾oEÿ*Y9µV3VÉ[‡®q”’܈6nµ½¾|wýáê|õþÍÙ»Ýêòú|7‡¿‡ ÷e±‡½¥~™l÷
+‹øyñzª"Dñqèʇº¹@W¦ÃÐ5Ø ]¹ÃË}˜+~6æ
+d.Þ;ö§!W=‚\uátA.ïž¹ò£‹ï\ùQÈÅO\ÇðÊ=^ÑŽWü¼Bj«²<€±Ò1–?ÌXîs2În´'=±””vPý÷`,š0ÖÃߺ¹ï[ÿ\Œõ‰¸óvûßÏ‹ÝùÓáN
+Z{ÑŽA $3hG<4óãé³÷¥,"U_ƒ@>±5ТÒR
+òr°ï'ý‹8=¯ñ'Š;¥AC`g õ¡³®ŠíeóR䃃SÈ>8Ç\ì †IxK°¬$ŸCœ—Ä,÷’HVöƒÕÜî{]*SSîþ !nkXÉB"÷¸Ö’Z½+c‰|‹ °7Žl=v/.±‚0S3Î8ÄOÒÖ¥2Y#é{È '¦~Á0¹ê°Óè‰ÓNL“ÐŒ†ZLÂj’ÍÉvVcÿ>¾šìlì ­¦¿Ž ¾íŠÝaÈbê®Õ½ó¹'ˆQl¬ïãÄÞŒ”S7–ÑèóÄ8„;'×h 8Ù§¤šp+[g¤¡ü‹ÄHžhü>fÎÌ+’€¬ün^|z:óðÇYê_Íàê«v~AÚ™’AW!{‘ÎBÞ©0bf=Ø—Î
+±¤á ¥D:‹†$ (I>Ä\ÁøôU5¿ªæŸZ5%Ô.è –FL² MÌ8%Ó¡1²YÔ}¥–…QvÛ¶Ï…˜IæKeôJžÛ0ŒŒ0Ør0IEÊ‹ 5Å’K´Å:bÊ®õá‚íÚ‹ Ö»eÛ3ŽEv†er Ëä:úlfœª~3%¬ – óW…h /¡
+Ô|·Ô¤I•`ÄÌd;`q‰lqt±®fÞ”mÇN4÷üö®‘4 ×àçIôH]þ\{ª~É¡ÖAtî$ˆÇä8MŽx›Œ‹Á™úÔn­R™,˘u&Åc•é°@%óáŸæ€XVé&™âË:~ê[7÷|kµ9)÷RײÇþHzÇ8yx&› g-©SOSátˆ¹j‘­ÌIuíŠj–Ð~¬MÄŽÀ±Ç5•Ú”áCûÓZŸÙS•õ b÷ìUvJA¿²ÍË`‰K&×¼NÁ¥^0°ç¢š‚w¸’Ôa8^.²C‰ÿg¿J{ÛÆµè÷ùü2@L®Z^?Å]Þt^ÛM0(03[MÜ:’!+É´¿þ’¢K^âlÄq“ÊW$/yyî¹çö|ßò¡¨CTã9Ôgó]õ²¥°+§÷ÎN¥ Ýx:– ñ›Û@}ò}W¥©và_pje¬ëgBÂ
+á/Ã
+ÊÓÕ€RJø&Í1×çž2sîœë¤BOë N-qê”[×oe¿ ŸzF§@C‡xšMu-ô‚µ’½]µ/J»r¢Œ¾“Ù¾2à×wA•*6»‹µ—ìiî’CuY!…4TAe| MÒ¶/Æ!Å­hA7º3”
+ØÆá.ʬG5Ïàž=¤™¸>$-n4*,€t1'}ú`>Â]f(ºÝC"3=”sÐ+fj£‡ú¯±°žÏþŠ>A—ÜW†ìAEh']7‡üdÙé‰@ºùËÀÉc jz7èQ<
+†,'Cs Z6ᕊ[ÂZÛsχíR}iŽo¥]7úŠ€ëûñª ®ìúRÚž„«•›qdø¬‰Âh «¨Â^\1â ™V‹è{wð-ÝÕÅÞìÊL¶A2;O&3Ú÷·H<„;úH *$_”PB,Ç¥õ:“fù¥s™´œIˆ9î¯ãWÀkw©K¥ƒáåf/«ÑaÚ%ß6]‹ºJÔÍ!ºjA˜.Ím\¼\¼.´
+jIl¡
+  fÁ‹zdú–eॷzºðÞÔ{-ïÊG½G¶(òŽ%0¿k tK`Á» ½±ÏzÞQèíÀV¡÷jCk…Þç¤UèíЙB盧гn ¬.qç, j¼6ÃWÝ(ίø»Ø‘TJhlèò)f°áÂàQ q>Sôwe
+´ïï~Ú=ÑÑ9yµ˜.j÷æÎ]¥Ý[æxQ»7wîÚíÞ­ôŽÒßO>¦Éa6JòQr¶»[Ø ª¿ÙzñqbÞöÝáøN¿ÆƒBi˜žÆ¤Ÿ]NÏɇ(‰Îâ ¢ig;Ë^ûöU4€‹ÉùhP =NÓñä×$«Ïí¡ e½F}‚Z8¡c¨]ãí8Ê—Nf§ô26ÇÚ5:føóf´Çgaª=÷{FùycíWçQ6H«sb”]£cìqüON^®FûâUíÑ$ΪGy–~‹±·^qû@LóîïGs"¤áRŽù®ã¥ÿQjÍ7›0tñ®×ÜAHëŸëGÐí9ßìÞ|‹Ùà |ÜÑkŸ{qn#¯óÄúVD9òÂsr홯»cÂÆœÝ“s6æ>>7Žù]§HWîêí9N°[Ý#®äÚQ˜@øq¶=bbÇz¼,»·ˆã¼m7èdvsœvïé^wT#ĹÁÊã,!^µ9 -†'}]—)‡4Ò\ú–3u{böNWßû:Àí;í(ÿ>ާ[/öþ—¤×‰ù¦Ëÿö~’&;dï#ŽC~Åë}ˆƒ«¸|¿÷*½˜hD¿qF3È%ıf«ÍöŠ1¿vO;Ê£Á·›O[Å[?šŽ W<‹'qóe|ƒõ:ui„˜¤ù§xB Í[;° i¶#”üާ¯°]I>?ÿ¦d¸…wŸ*)¶÷:þB^’­d»¶ÔŽ^û%1¾ ´Ù;Œ²¼óXýqœ —„bñÌ
+ÍðNPÛyµÂü/>Å«4^Žòy'hN¾#@蛾Mà0´:@c2ß\ÅÉÁphŽo TÅSw©= ëöž§xhüPˆBÐ M!e¡g${hÑ_>|ŽfÝÅÈb³È*7ôÔqõdŽ„9oþ‰—z/ö¥Y¢›ª ~p|=?[–!¯Ò,‰³éމAmÒvãu/M°1[¶0(v[ÜžYeïx”Wà[ô§8BÎeÑpt9]€ç5‹Í3©7âÛG"Î[eÂ{ªXå0÷M(>σ)Ć)ž SX‰åtÔÜûy5µ8*6;^gé„GÃôºµ—ó3£±ÂªyÁ\H'Ñ(›L_Q®#‘êÂ<PιU©žtÁ»m(§ƒ±ÝNÿ.ÉÉö`š vŠmÚô=O³MËUœåÖB©³ £ì›];uÆtÙÅJ.8_fn1ãïtœ [ÿeA¨çQhOm
+ÃÆ;ÐCÖ/”&<O°@ÿÇ™b
+*Ó/ªß‡()s’é]ü“ÿŽ×."õnPCfV.gXg8Ë¿OÔRõ@ªÐÓEàñ„œ!FA÷)n÷3W‰þi…÷V6½Ž 6EmSÔžd·£ÈÙc·1O˜7 olxãIò†¯¨VQ=Ͻ@˜ʹV\!ežtq{
+É8`™€ä¸W,¡ŽÍ+ÍuÎ/ÈLÅîÁ0¢û%«Ã\RÓ‹RSñÕÿ#¡õç ƒ<äâÙÔ,‡$¢tÎÌ-ÈA”Îz•h×;%JK¨MãAZu- À-{x`8¥ƒ srBªb€å~ ^OxæÛ€
+î9ùå
+¦Àªe´b­X°W,
+endstream endobj 188 0 obj <</Filter[/FlateDecode]/Length 6788>>stream
+H‰ìWkOËýŽÄè/‘@ŠÙ~?®ÅÖ/ÝäÚF‡#˺vØËx–Ìvð¯OUõôÌô.ð#ÉÌŠeèé>]}ªêT5ãìÍõögbœýÆûÈ4{ÉÞ¾ãl¾ ïŽðüooMž–§ì1ÛÞb;ÏUuÜ^Wå.ûãöÖc6yº˜µì1¼šMKƒã&Óbµ˜Áª¶lØOÛ[;óåIÉ~®køÿEµü¸ ;s6éfÀЧÍò’Ÿóåǽbq¹ `ÕÕÙ¢†)å«â}I“Æ
+ÉlÕÌhà‘Ü6“óeó)Ö›Ñà‡²‰EÈô½Ä¼h.hˆï¹þŠº¼,"¤…KJ<©®òOªzþC—oÑå·0^\Uí»±4/Þ_Vƒ4Q®EWqI÷K¬WHh%<.¬NÇ?xH¬‰k‡ Mmv¸?ü~}VÏš–Œ_ÑÁ¡__-ëÃ,ê³Gºñi ©vXTeÛ–QtOîoöÎÛ#X¿j›Y~·K}ó IÍ_loÎJàÎßÏmÙ/½'‘E)T¿Í=CPÁ{–mÖ¯9z1eGå|XeEðrl`°F@Že–Žÿ£¬*P§´ÞJgIX†­z¨|ዦ,ë~.(7ÞWH£BÈ—‹aù“ëbXí½²ÖÀ\gƒ°7}”VO««biCàxf„ru£w²Õ/‹3h‹@Ø
+Ή$
+蘢©/#A´:,²Q£Çìà18%RÚ
+Wï(ܤåÖÂÓ Å1ù—áqdÓ ¹æ ‡ÍXp€HèÌO"9¾?tL‘WéþÌBŒ½Ö¤©{²TgLç&颩‚”ÂnšjQ„qƒÌGiy{0ÔâÉc¹@"Q#-nÕÁê˜h©”Cîzgqh¤Õy
+G AT"€£ÜÉZ КHÐÉØX[¤…yŽÂÚHx^b;å’Š )—(•P³磀7’L­]²†ïRzŒ
+=H6˜õ+%Ǽç¡}ƒÛu0†,
+€Úº™2ýKk¢çúüt©,=ä'è"Òéœä7‚{A* ql¹'O3ïcI`xô0R'ÑÉÔAF)õNRȨNV*£•½,ÉÄeà74+ ú†ëµÌjV”}ØÛa¼e%K‘“¤
+µô˜× ZR…AgÍŠKd±ªá–Ãáo yO©4¢
+†¦LtcNI°Ösª26Ž’2i ¯Á?˶PšRÞ¤96/(¤Î<sd3Pé‹kª**+® X\Ñó~„ëLìÏ,ׂpÁCžà ƒ >MõÚ9MÆÐáz4˜ßš³ÖE1õ*?,Ôð¨}mT@,ZI;ʱϰ†
+5
+Ø7­6
+l=¥²V×÷¿)t¸¦n«|ýˆ×†î|LÑ×gó»^²oý¡oH8Ýì0ÞåøB
+ý[.Ml†‡»+Aùßþ¢K-”Æ0€ï!Vc¨C Ð2»ÞöÝ=ntqYçhUs£¦Š Ïx„¶<fS?¢SãàRg"ã}xŶz·Ù÷Šâ
+Fjäÿêiø%¿U~ú8÷¾ý‹…_HZÜÉÇ3%ìÛgξˆ„É„å—ÐçµúÌ/?û(ä£<¤ô>Édþ7~ûD¿“M*ÿ¸©.Á;.’gÎdý²ê=Æ$ä»âÿ¾$ìéjF·4-žæŒÑüNùîÊ»Z+éG!ÈÁüß{yÑ×ò÷››c(yÜõ@4z¿o…ròÃÇÃjÉÓâ§þ‘ÿý;¾*¬Eëâ¿3’=Ñ"7 A|£|È6OYÞ×ÇG%Û¤y*¯úW_“(–µ7ŸøŽÕ^ÜÓïuÅÖµÇYî—vD„µ—ÿæB¿ûU,ó¿
+Â"£̌ùb¶‘’³ü4Ÿx9¬½\eCV¼©kÊ?Wø2aDÕwŠRþxSÿNùn”¿S碌2 žhèWå;tØù99Üè‚äU¬•£¥´Ç3ù‰›U~Ì>™ŸûŸ¾ ô‹«åcÈ„3"Çÿ}¸ÿÌsyúã_®zûUÊrAŸH)’åFÒìæêg%.Ïæßø3oôW ]'i(òŠ”ªáÕ`ž§ªú¸øGÖôøqïŸ,û¶%"ûåæjð˜ÿÕµ[R‹£¸ø {AÈÈJëŽÑdõÇ‹OãŒB²”ò¼ BPš´ôg€Ë„…yÀ.2?3T~V4
+¸{ëx¾§J{ÛE‚oÖÀ¶«´(܈¦t( ¬VdK…ü˜&jx=ÆÙKýTÃ\’à©8n,qšr Ö:Æ\<Ãëh¨Qàå[ÎŒó6ŸÐ4]нœgw‹‡{dó+×Ë×'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(sŽÄRð®mdßbšD1Ì€i)ŠâZÉvI(cØQ‰…«}ô—Zˆ_6 ]×÷’‹
+ÈÕ]2
+÷ ¨=¢±è
+÷ ¨=¢±è
+ _> 5
+¼ã쥆ªa.IðT7‚8M9
+Pkc.žáu4Ô(ðr£2ã¼Í¨è½ržÝ-îAͯ4×ÍV”7ÊÈ»'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(wŽÄRð® °äÄ4‰b˜ÓR3ĵ’í’PÆ °£ Wûè/µÃl8º®/î%!«»d
+žf뻤
+H@w‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Át2ò'#ÇslmWì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼|¬Ì8oó)zÁœgw‹‡{dó+ͽ³å2òz¨]!‘¤ŸQ$³ÍD6B:uVÏ IWE0Ê‚#±¼ëFsûJÓ$ŠaLKQ ÏŽ¶KBƒÈŽJ`Öá_j!ŽÙ°t]_ÝK.B*\Èí]B
+H@{‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Á­7M'Cç”®ÆXì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼ÜxÍ8oó)zÁœgw‹‡{dó+ͽ³å2òî‰=åƒÎj×AH$égT…Él3‘NÕóBÒ•CŒ2‡àH,ïºÑÆÖ… ¦IÃü—–¢!ž}yÛ%¡ŒAdG%
+0ëè/µ¿lº®/î%!CÈÝ]B
+
+šf2àØ8«¤·‚¶æJ±
+qjQ©nÌõ¼˜¿BÝ'ÝÓó$Ê…<ruÇjÈç5µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜaK ï»Ð\Çx„<
+Bl«¤$zˆm$ûˆ|B`ßJ*\§[ÿ—Y˜]߃{)¤Ï%2º¿
+ª…¹dÞ{‘n‰q6å$@q …üÄãØP“ÀË•G!N-*Õyù¢žóW²û¤{užD¹G®îØñ_7µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜéX¢`S ¹×wÍOFSãyò(±m°’’ègŽefûˆ|BhßJdæ“2ƒ˜2"<îƒhíˆ
+endstream endobj 189 0 obj <</Filter[/FlateDecode]/Length 3958>>stream
+H‰ì—Qoã8Ç߸ï0@q@¸Eã4IÛÛ§¹6)\ƒ¦÷vPd: *K$§í·?ÚÓm­Ä‰h4måŒý0ƒ™6"Eþù;¿_ŠXƒüíÛ?ÿþ·ü/úv:‘ö[ç)RÅð{þ‡}^ÁËÏßNgV/åÂ5X3‘ýeÑŠ?@|¥„Òæ·j{ÉÒ¿Ìÿøù×é§ÿùùö¯â_×Kn—J2ýüó?þxóg_8Ï,˜—7œ~ךmÛœ‹çD³ûebGm÷‘QÝLÆc¥SfƒˆÆ2½
+x…Óçܬ·¢òd)€^Žùf1îÅ ¿Bþ­”ØW"šI³bøFþL+Ç!ˆÒèúîPÆÐè^,ƒÀê€ß\¥â5ÄYàw±PziïSp•[ô]oéj%„Zƒž2cAÿ`[Ö®£Ú€®öl7ˬºÍÓFƒ-›7„Pª)~
+­Fbt‚ ìœŒ‹‡rwÓz´ih¬þŒ.%^4Á8Ä$²yc¹Èb¸b«<2"¥ëio0ôS™¥ô5ªl`Ôõê…ç ÎÐ$M@nxêÅ|„y±7ÖÝò Ï?I2³ûâU¤·žNÚò9¦5ÐÝÌè‰qZ‰¼ÚÖ:¢ÝÁW­¹¥à çyÿ¹csARLŸSÑï§Š?@LïÄMá*²U4™‘D[ Ã}dT7“ñXi”^ADc™^€áÞ‚vËþW÷¡ªŸ÷`O®IýhÛ)Œ™å«(‡<Y
+ ×Ÿc~L“*òN*«™4+†oäÏ´òp‚( ¯rÊÝ‹eXð›ë]cØaÔgE€õ„Z•[ô~‘¥•j zÊŒÅe‚ lY$Ų˳!Ü,³ê6O ¶lÞB©¦øi(´‰Ñu‚²s2.ÊÝMëѦ¡±"‰M01m'*™7†‹,†+¶Ê##Rº.AöCß8•YJ_£ÊÖA
+W‘­¢ÉŒ$Úî#£º™ŒÇJ£ô
+"Ëôì ÷´;Xö¿ºõ}ËÅž\“úѶS3ËWQy²@¯?Çü˜&UäTV3iV ßÈŸiåá8Q^å&”14ºË °:à7׻ưè!Ί
+ —¢c~LC+ò-«™4+†oäÏ´q‚(ÿhÆüâ²D\¬ÞŒB'Õ´´íRÖ Ç!ÊÎɸx(—;­G›†ÆJ’+P0N¬Ø²y0‚Òß±[9p
+czamõú{‹ËaO–è¥è˜ÓÔŠ¼SËj&ÍŠáù3­@‡ ŠÃ?›1¿¸C÷7ã†Ð¹ /eßp‚ ìœŒ‹‡r¹Óz´ih¬-)ßV^Šœ,™£(ý»•çóËáYwà]e[9ÐÊV´r •±¶r •“ƒþÙù°×­²kå@+Z9ÐÊV´r •¿„ˆ¢Á`؆çç­hõ@«Z=ÐêV´zà—Õ½þàübpýrz࢕­¨ª ð›k ”ú¬ð»X(½´÷)‰»Ê-zÿpÑJµ=eÇÆ&ðrï:ª èjφp³ÌªÛ<m4زyC[!Ø
+AW~5ao0ôÉ™¥ENH’¬l`Ôíú
+W‘­¢ÉŒ$Úî#£ò®¯ŸŽezv†rí–þ¯nD§Ñå êºçÝKßðr`rMjMÛNaŒ/,®^ou9ìÉR
+¼ý*†iS+C§4g)ÖgÉÒ/Ûüðv¤·NÚò9¦5ÐÝìø™ Z‰¼Ù¶º¢æàÙþà UÿyàsIRL_Sѧ’Z<BFïÄ]árÙrMf¬ÐèpŸÕdš¦Ú ôŠ"š‚›%÷¸· ÝÁ²ÿÝ}蜖ô»Î.ÿ¦7¤Î´íÇô
+Õ–G¾XI W¢g~L3‹gVa¸²kŽ/´òð¢(à;ÚZÝ«eX= ðÌMÓ@ö d¥ °dÛå}Xn-¥Þ€™q[àZÁ%¶,’viòì7/ }W¥[7ï¡Ò3<œj#1úQPöÎR÷QÞnÞŽ6•°)|h’ ÈhÛQͼ3„B–\óu‘Òw‰‚t\…Æ©*súBU·Žõƒz!Ã9ˆsŒ
+ú°Ü2ZJ½3ã¶Àµ‚KlY$íÒäÙn^ú®J ¶nÞB¥gx48ÕFbô¢ ì¥î£¼Ý¼m+a5RøÐ$Ѷ£šyg…,3¸æë*2"¥ïé ¹
+SUæô…ªn ëõB†sçŠ& ßyDÄ|‚¹Û Û€nùDŠ÷¿X”¶ùáíHo;´åsLk¡»Ùñ3´y³muEÍÁ³ýÁ.ªþóÀç’¤˜¾¦¢?N%µx„ŒÞ‰»Âå²åšÌX¡-Ðá>3ªÉ4MµAéE47K(îqoA»ƒeÿ»ûÐù ß%¿ú—Ipvù0½!u¦m§8¦×íŸÉàrouyì‹•z-zæÇ4µXpj†+»æøGñB+Ï!ŠâÏfÌ/nKÄÍê¿qG蔞ÕÖ]ʾá9DAÙ;KÝGyÜy;Ú<6V‚–TX’ bÅÖÍ£Q”áŽ}Ò‡Ò£á þ(=Òš'5ðƒÕÀþw µµ4ºWË(°z$à™ T<Ê—Òø[.µYsð.·(èÃ#Óh)õÌŒ[†·\bËjºªwл=;ÂÍËBßUi£ÁÖÍ;Bx’·'yëËÛ.
+YfpÍ×UdDJß%
+ÒAr§ªÌ]õ‘$uÝ:
+@Öê… ç Î0T³€ü'À
+endstream endobj 162 0 obj [/ICCBased 170 0 R] endobj 190 0 obj <</CreationDate(D:20090527042239-04'00')/Creator(Adobe Illustrator CS4)/ModDate(D:20090730214335-05'00')/Producer(Adobe PDF library 9.00)/Title(colorbox)>> endobj xref
+0 191
+0000000004 65535 f
+0000000016 00000 n
+0000000076 00000 n
+0000048436 00000 n
+0000000005 00000 f
+0000000006 00000 f
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000081 00000 f
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000117 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000051202 00000 n
+0000048489 00000 n
+0000048844 00000 n
+0000049045 00000 n
+0000061445 00000 n
+0000058207 00000 n
+0000050103 00000 n
+0000049109 00000 n
+0000231123 00000 n
+0000049538 00000 n
+0000049588 00000 n
+0000055520 00000 n
+0000055406 00000 n
+0000051720 00000 n
+0000051805 00000 n
+0000052189 00000 n
+0000055557 00000 n
+0000058244 00000 n
+0000061521 00000 n
+0000062006 00000 n
+0000062952 00000 n
+0000069751 00000 n
+0000084919 00000 n
+0000102822 00000 n
+0000111395 00000 n
+0000126519 00000 n
+0000132206 00000 n
+0000141391 00000 n
+0000143749 00000 n
+0000159943 00000 n
+0000177431 00000 n
+0000183301 00000 n
+0000187819 00000 n
+0000205653 00000 n
+0000220229 00000 n
+0000227091 00000 n
+0000231160 00000 n
+trailer
+<</Size 191/Root 1 0 R/Info 190 0 R/ID[<7EB5FF43BD08164184F35B8300F050C9><E617EB833E197F43BC059F7255614CEE>]>>
+startxref
+231333
+%%EOF
diff --git a/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox-min.js b/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox-min.js
new file mode 100644
index 000000000..9db7adf75
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox-min.js
@@ -0,0 +1,4 @@
+// ColorBox v1.3.19.3 - jQuery lightbox plugin
+// (c) 2011 Jack Moore - jacklmoore.com
+// License: http://www.opensource.org/licenses/mit-license.php
+(function(a,b,c){function Z(c,d,e){var g=b.createElement(c);return d&&(g.id=f+d),e&&(g.style.cssText=e),a(g)}function $(a){var b=y.length,c=(Q+a)%b;return c<0?b+c:c}function _(a,b){return Math.round((/%/.test(a)?(b==="x"?z.width():z.height())/100:1)*parseInt(a,10))}function ab(a){return K.photo||/\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(a)}function bb(){var b,c=a.data(P,e);c==null?(K=a.extend({},d),console&&console.log&&console.log("Error: cboxElement missing settings object")):K=a.extend({},c);for(b in K)a.isFunction(K[b])&&b.slice(0,2)!=="on"&&(K[b]=K[b].call(P));K.rel=K.rel||P.rel||"nofollow",K.href=K.href||a(P).attr("href"),K.title=K.title||P.title,typeof K.href=="string"&&(K.href=a.trim(K.href))}function cb(b,c){a.event.trigger(b),c&&c.call(P)}function db(){var a,b=f+"Slideshow_",c="click."+f,d,e,g;K.slideshow&&y[1]?(d=function(){F.text(K.slideshowStop).unbind(c).bind(j,function(){if(K.loop||y[Q+1])a=setTimeout(W.next,K.slideshowSpeed)}).bind(i,function(){clearTimeout(a)}).one(c+" "+k,e),r.removeClass(b+"off").addClass(b+"on"),a=setTimeout(W.next,K.slideshowSpeed)},e=function(){clearTimeout(a),F.text(K.slideshowStart).unbind([j,i,k,c].join(" ")).one(c,function(){W.next(),d()}),r.removeClass(b+"on").addClass(b+"off")},K.slideshowAuto?d():e()):r.removeClass(b+"off "+b+"on")}function eb(b){U||(P=b,bb(),y=a(P),Q=0,K.rel!=="nofollow"&&(y=a("."+g).filter(function(){var b=a.data(this,e),c;return b&&(c=b.rel||this.rel),c===K.rel}),Q=y.index(P),Q===-1&&(y=y.add(P),Q=y.length-1)),S||(S=T=!0,r.show(),K.returnFocus&&a(P).blur().one(l,function(){a(this).focus()}),q.css({opacity:+K.opacity,cursor:K.overlayClose?"pointer":"auto"}).show(),K.w=_(K.initialWidth,"x"),K.h=_(K.initialHeight,"y"),W.position(),o&&z.bind("resize."+p+" scroll."+p,function(){q.css({width:z.width(),height:z.height(),top:z.scrollTop(),left:z.scrollLeft()})}).trigger("resize."+p),cb(h,K.onOpen),J.add(D).hide(),I.html(K.close).show()),W.load(!0))}function fb(){!r&&b.body&&(Y=!1,z=a(c),r=Z(X).attr({id:e,"class":n?f+(o?"IE6":"IE"):""}).hide(),q=Z(X,"Overlay",o?"position:absolute":"").hide(),s=Z(X,"Wrapper"),t=Z(X,"Content").append(A=Z(X,"LoadedContent","width:0; height:0; overflow:hidden"),C=Z(X,"LoadingOverlay").add(Z(X,"LoadingGraphic")),D=Z(X,"Title"),E=Z(X,"Current"),G=Z(X,"Next"),H=Z(X,"Previous"),F=Z(X,"Slideshow").bind(h,db),I=Z(X,"Close")),s.append(Z(X).append(Z(X,"TopLeft"),u=Z(X,"TopCenter"),Z(X,"TopRight")),Z(X,!1,"clear:left").append(v=Z(X,"MiddleLeft"),t,w=Z(X,"MiddleRight")),Z(X,!1,"clear:left").append(Z(X,"BottomLeft"),x=Z(X,"BottomCenter"),Z(X,"BottomRight"))).find("div div").css({"float":"left"}),B=Z(X,!1,"position:absolute; width:9999px; visibility:hidden; display:none"),J=G.add(H).add(E).add(F),a(b.body).append(q,r.append(s,B)))}function gb(){return r?(Y||(Y=!0,L=u.height()+x.height()+t.outerHeight(!0)-t.height(),M=v.width()+w.width()+t.outerWidth(!0)-t.width(),N=A.outerHeight(!0),O=A.outerWidth(!0),r.css({"padding-bottom":L,"padding-right":M}),G.click(function(){W.next()}),H.click(function(){W.prev()}),I.click(function(){W.close()}),q.click(function(){K.overlayClose&&W.close()}),a(b).bind("keydown."+f,function(a){var b=a.keyCode;S&&K.escKey&&b===27&&(a.preventDefault(),W.close()),S&&K.arrowKey&&y[1]&&(b===37?(a.preventDefault(),H.click()):b===39&&(a.preventDefault(),G.click()))}),a("."+g,b).live("click",function(a){a.which>1||a.shiftKey||a.altKey||a.metaKey||(a.preventDefault(),eb(this))})),!0):!1}var d={transition:"elastic",speed:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",open:!1,returnFocus:!0,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:undefined},e="colorbox",f="cbox",g=f+"Element",h=f+"_open",i=f+"_load",j=f+"_complete",k=f+"_cleanup",l=f+"_closed",m=f+"_purge",n=!a.support.opacity&&!a.support.style,o=n&&!c.XMLHttpRequest,p=f+"_IE6",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X="div",Y;if(a.colorbox)return;a(fb),W=a.fn[e]=a[e]=function(b,c){var f=this;b=b||{},fb();if(gb()){if(!f[0]){if(f.selector)return f;f=a("<a/>"),b.open=!0}c&&(b.onComplete=c),f.each(function(){a.data(this,e,a.extend({},a.data(this,e)||d,b))}).addClass(g),(a.isFunction(b.open)&&b.open.call(f)||b.open)&&eb(f[0])}return f},W.position=function(a,b){function i(a){u[0].style.width=x[0].style.width=t[0].style.width=a.style.width,t[0].style.height=v[0].style.height=w[0].style.height=a.style.height}var c=0,d=0,e=r.offset(),g,h;z.unbind("resize."+f),r.css({top:-9e4,left:-9e4}),g=z.scrollTop(),h=z.scrollLeft(),K.fixed&&!o?(e.top-=g,e.left-=h,r.css({position:"fixed"})):(c=g,d=h,r.css({position:"absolute"})),K.right!==!1?d+=Math.max(z.width()-K.w-O-M-_(K.right,"x"),0):K.left!==!1?d+=_(K.left,"x"):d+=Math.round(Math.max(z.width()-K.w-O-M,0)/2),K.bottom!==!1?c+=Math.max(z.height()-K.h-N-L-_(K.bottom,"y"),0):K.top!==!1?c+=_(K.top,"y"):c+=Math.round(Math.max(z.height()-K.h-N-L,0)/2),r.css({top:e.top,left:e.left}),a=r.width()===K.w+O&&r.height()===K.h+N?0:a||0,s[0].style.width=s[0].style.height="9999px",r.dequeue().animate({width:K.w+O,height:K.h+N,top:c,left:d},{duration:a,complete:function(){i(this),T=!1,s[0].style.width=K.w+O+M+"px",s[0].style.height=K.h+N+L+"px",K.reposition&&setTimeout(function(){z.bind("resize."+f,W.position)},1),b&&b()},step:function(){i(this)}})},W.resize=function(a){S&&(a=a||{},a.width&&(K.w=_(a.width,"x")-O-M),a.innerWidth&&(K.w=_(a.innerWidth,"x")),A.css({width:K.w}),a.height&&(K.h=_(a.height,"y")-N-L),a.innerHeight&&(K.h=_(a.innerHeight,"y")),!a.innerHeight&&!a.height&&(A.css({height:"auto"}),K.h=A.height()),A.css({height:K.h}),W.position(K.transition==="none"?0:K.speed))},W.prep=function(b){function g(){return K.w=K.w||A.width(),K.w=K.mw&&K.mw<K.w?K.mw:K.w,K.w}function h(){return K.h=K.h||A.height(),K.h=K.mh&&K.mh<K.h?K.mh:K.h,K.h}if(!S)return;var c,d=K.transition==="none"?0:K.speed;A.remove(),A=Z(X,"LoadedContent").append(b),A.hide().appendTo(B.show()).css({width:g(),overflow:K.scrolling?"auto":"hidden"}).css({height:h()}).prependTo(t),B.hide(),a(R).css({"float":"none"}),o&&a("select").not(r.find("select")).filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one(k,function(){this.style.visibility="inherit"}),c=function(){function s(){n&&r[0].style.removeAttribute("filter")}var b,c,g=y.length,h,i="frameBorder",k="allowTransparency",l,o,p,q;if(!S)return;l=function(){clearTimeout(V),C.hide(),cb(j,K.onComplete)},n&&R&&A.fadeIn(100),D.html(K.title).add(A).show();if(g>1){typeof K.current=="string"&&E.html(K.current.replace("{current}",Q+1).replace("{total}",g)).show(),G[K.loop||Q<g-1?"show":"hide"]().html(K.next),H[K.loop||Q?"show":"hide"]().html(K.previous),K.slideshow&&F.show();if(K.preloading){b=[$(-1),$(1)];while(c=y[b.pop()])q=a.data(c,e),q&&q.href?(o=q.href,a.isFunction(o)&&(o=o.call(c))):o=c.href,ab(o)&&(p=new Image,p.src=o)}}else J.hide();K.iframe?(h=Z("iframe")[0],i in h&&(h[i]=0),k in h&&(h[k]="true"),h.name=f+ +(new Date),K.fastIframe?l():a(h).one("load",l),h.src=K.href,K.scrolling||(h.scrolling="no"),a(h).addClass(f+"Iframe").appendTo(A).one(m,function(){h.src="//about:blank"})):l(),K.transition==="fade"?r.fadeTo(d,1,s):s()},K.transition==="fade"?r.fadeTo(d,0,function(){W.position(0,c)}):W.position(d,c)},W.load=function(b){var c,d,e=W.prep;T=!0,R=!1,P=y[Q],b||bb(),cb(m),cb(i,K.onLoad),K.h=K.height?_(K.height,"y")-N-L:K.innerHeight&&_(K.innerHeight,"y"),K.w=K.width?_(K.width,"x")-O-M:K.innerWidth&&_(K.innerWidth,"x"),K.mw=K.w,K.mh=K.h,K.maxWidth&&(K.mw=_(K.maxWidth,"x")-O-M,K.mw=K.w&&K.w<K.mw?K.w:K.mw),K.maxHeight&&(K.mh=_(K.maxHeight,"y")-N-L,K.mh=K.h&&K.h<K.mh?K.h:K.mh),c=K.href,V=setTimeout(function(){C.show()},100),K.inline?(Z(X).hide().insertBefore(a(c)[0]).one(m,function(){a(this).replaceWith(A.children())}),e(a(c))):K.iframe?e(" "):K.html?e(K.html):ab(c)?(a(R=new Image).addClass(f+"Photo").error(function(){K.title=!1,e(Z(X,"Error").html(K.imgError))}).load(function(){var a;R.onload=null,K.scalePhotos&&(d=function(){R.height-=R.height*a,R.width-=R.width*a},K.mw&&R.width>K.mw&&(a=(R.width-K.mw)/R.width,d()),K.mh&&R.height>K.mh&&(a=(R.height-K.mh)/R.height,d())),K.h&&(R.style.marginTop=Math.max(K.h-R.height,0)/2+"px"),y[1]&&(K.loop||y[Q+1])&&(R.style.cursor="pointer",R.onclick=function(){W.next()}),n&&(R.style.msInterpolationMode="bicubic"),setTimeout(function(){e(R)},1)}),setTimeout(function(){R.src=c},1)):c&&B.load(c,K.data,function(b,c,d){e(c==="error"?Z(X,"Error").html(K.xhrError):a(this).contents())})},W.next=function(){!T&&y[1]&&(K.loop||y[Q+1])&&(Q=$(1),W.load())},W.prev=function(){!T&&y[1]&&(K.loop||Q)&&(Q=$(-1),W.load())},W.close=function(){S&&!U&&(U=!0,S=!1,cb(k,K.onCleanup),z.unbind("."+f+" ."+p),q.fadeTo(200,0),r.stop().fadeTo(300,0,function(){r.add(q).css({opacity:1,cursor:"auto"}).hide(),cb(m),A.remove(),setTimeout(function(){U=!1,cb(l,K.onClosed)},1)}))},W.remove=function(){a([]).add(r).add(q).remove(),r=null,a("."+g).removeData(e).removeClass(g).die()},W.element=function(){return a(P)},W.settings=d})(jQuery,document,this); \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox.js b/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox.js
new file mode 100644
index 000000000..28673a45d
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox.js
@@ -0,0 +1,926 @@
+// ColorBox v1.3.19.3 - jQuery lightbox plugin
+// (c) 2011 Jack Moore - jacklmoore.com
+// License: http://www.opensource.org/licenses/mit-license.php
+(function ($, document, window) {
+ var
+ // Default settings object.
+ // See http://jacklmoore.com/colorbox for details.
+ defaults = {
+ transition: "elastic",
+ speed: 300,
+ width: false,
+ initialWidth: "600",
+ innerWidth: false,
+ maxWidth: false,
+ height: false,
+ initialHeight: "450",
+ innerHeight: false,
+ maxHeight: false,
+ scalePhotos: true,
+ scrolling: true,
+ inline: false,
+ html: false,
+ iframe: false,
+ fastIframe: true,
+ photo: false,
+ href: false,
+ title: false,
+ rel: false,
+ opacity: 0.9,
+ preloading: true,
+
+ current: "image {current} of {total}",
+ previous: "previous",
+ next: "next",
+ close: "close",
+ xhrError: "This content failed to load.",
+ imgError: "This image failed to load.",
+
+ open: false,
+ returnFocus: true,
+ reposition: true,
+ loop: true,
+ slideshow: false,
+ slideshowAuto: true,
+ slideshowSpeed: 2500,
+ slideshowStart: "start slideshow",
+ slideshowStop: "stop slideshow",
+ onOpen: false,
+ onLoad: false,
+ onComplete: false,
+ onCleanup: false,
+ onClosed: false,
+ overlayClose: true,
+ escKey: true,
+ arrowKey: true,
+ top: false,
+ bottom: false,
+ left: false,
+ right: false,
+ fixed: false,
+ data: undefined
+ },
+
+ // Abstracting the HTML and event identifiers for easy rebranding
+ colorbox = 'colorbox',
+ prefix = 'cbox',
+ boxElement = prefix + 'Element',
+
+ // Events
+ event_open = prefix + '_open',
+ event_load = prefix + '_load',
+ event_complete = prefix + '_complete',
+ event_cleanup = prefix + '_cleanup',
+ event_closed = prefix + '_closed',
+ event_purge = prefix + '_purge',
+
+ // Special Handling for IE
+ isIE = !$.support.opacity && !$.support.style, // IE7 & IE8
+ isIE6 = isIE && !window.XMLHttpRequest, // IE6
+ event_ie6 = prefix + '_IE6',
+
+ // Cached jQuery Object Variables
+ $overlay,
+ $box,
+ $wrap,
+ $content,
+ $topBorder,
+ $leftBorder,
+ $rightBorder,
+ $bottomBorder,
+ $related,
+ $window,
+ $loaded,
+ $loadingBay,
+ $loadingOverlay,
+ $title,
+ $current,
+ $slideshow,
+ $next,
+ $prev,
+ $close,
+ $groupControls,
+
+ // Variables for cached values or use across multiple functions
+ settings,
+ interfaceHeight,
+ interfaceWidth,
+ loadedHeight,
+ loadedWidth,
+ element,
+ index,
+ photo,
+ open,
+ active,
+ closing,
+ loadingTimer,
+ publicMethod,
+ div = "div",
+ init;
+
+ // ****************
+ // HELPER FUNCTIONS
+ // ****************
+
+ // Convience function for creating new jQuery objects
+ function $tag(tag, id, css) {
+ var element = document.createElement(tag);
+
+ if (id) {
+ element.id = prefix + id;
+ }
+
+ if (css) {
+ element.style.cssText = css;
+ }
+
+ return $(element);
+ }
+
+ // Determine the next and previous members in a group.
+ function getIndex(increment) {
+ var
+ max = $related.length,
+ newIndex = (index + increment) % max;
+
+ return (newIndex < 0) ? max + newIndex : newIndex;
+ }
+
+ // Convert '%' and 'px' values to integers
+ function setSize(size, dimension) {
+ return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10));
+ }
+
+ // Checks an href to see if it is a photo.
+ // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
+ function isImage(url) {
+ return settings.photo || /\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(url);
+ }
+
+ // Assigns function results to their respective properties
+ function makeSettings() {
+ var i,
+ data = $.data(element, colorbox);
+
+ if (data == null) {
+ settings = $.extend({}, defaults);
+ if (console && console.log) {
+ console.log('Error: cboxElement missing settings object')
+ }
+ } else {
+ settings = $.extend({}, data);
+ }
+
+ for (i in settings) {
+ if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
+ settings[i] = settings[i].call(element);
+ }
+ }
+
+ settings.rel = settings.rel || element.rel || 'nofollow';
+ settings.href = settings.href || $(element).attr('href');
+ settings.title = settings.title || element.title;
+
+ if (typeof settings.href === "string") {
+ settings.href = $.trim(settings.href);
+ }
+ }
+
+ function trigger(event, callback) {
+ $.event.trigger(event);
+ if (callback) {
+ callback.call(element);
+ }
+ }
+
+ // Slideshow functionality
+ function slideshow() {
+ var
+ timeOut,
+ className = prefix + "Slideshow_",
+ click = "click." + prefix,
+ start,
+ stop,
+ clear;
+
+ if (settings.slideshow && $related[1]) {
+ start = function () {
+ $slideshow
+ .text(settings.slideshowStop)
+ .unbind(click)
+ .bind(event_complete, function () {
+ if (settings.loop || $related[index + 1]) {
+ timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
+ }
+ })
+ .bind(event_load, function () {
+ clearTimeout(timeOut);
+ })
+ .one(click + ' ' + event_cleanup, stop);
+ $box.removeClass(className + "off").addClass(className + "on");
+ timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
+ };
+
+ stop = function () {
+ clearTimeout(timeOut);
+ $slideshow
+ .text(settings.slideshowStart)
+ .unbind([event_complete, event_load, event_cleanup, click].join(' '))
+ .one(click, function () {
+ publicMethod.next();
+ start();
+ });
+ $box.removeClass(className + "on").addClass(className + "off");
+ };
+
+ if (settings.slideshowAuto) {
+ start();
+ } else {
+ stop();
+ }
+ } else {
+ $box.removeClass(className + "off " + className + "on");
+ }
+ }
+
+ function launch(target) {
+ if (!closing) {
+
+ element = target;
+
+ makeSettings();
+
+ $related = $(element);
+
+ index = 0;
+
+ if (settings.rel !== 'nofollow') {
+ $related = $('.' + boxElement).filter(function () {
+ var data = $.data(this, colorbox),
+ relRelated;
+
+ if (data) {
+ relRelated = data.rel || this.rel;
+ }
+
+ return (relRelated === settings.rel);
+ });
+ index = $related.index(element);
+
+ // Check direct calls to ColorBox.
+ if (index === -1) {
+ $related = $related.add(element);
+ index = $related.length - 1;
+ }
+ }
+
+ if (!open) {
+ open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
+
+ $box.show();
+
+ if (settings.returnFocus) {
+ $(element).blur().one(event_closed, function () {
+ $(this).focus();
+ });
+ }
+
+ // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5'
+ $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();
+
+ // Opens inital empty ColorBox prior to content being loaded.
+ settings.w = setSize(settings.initialWidth, 'x');
+ settings.h = setSize(settings.initialHeight, 'y');
+ publicMethod.position();
+
+ if (isIE6) {
+ $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
+ $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
+ }).trigger('resize.' + event_ie6);
+ }
+
+ trigger(event_open, settings.onOpen);
+
+ $groupControls.add($title).hide();
+
+ $close.html(settings.close).show();
+ }
+
+ publicMethod.load(true);
+ }
+ }
+
+ // ColorBox's markup needs to be added to the DOM prior to being called
+ // so that the browser will go ahead and load the CSS background images.
+ function appendHTML() {
+ if (!$box && document.body) {
+ init = false;
+
+ $window = $(window);
+ $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
+ $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide();
+ $wrap = $tag(div, "Wrapper");
+ $content = $tag(div, "Content").append(
+ $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'),
+ $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")),
+ $title = $tag(div, "Title"),
+ $current = $tag(div, "Current"),
+ $next = $tag(div, "Next"),
+ $prev = $tag(div, "Previous"),
+ $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow),
+ $close = $tag(div, "Close")
+ );
+
+ $wrap.append( // The 3x3 Grid that makes up ColorBox
+ $tag(div).append(
+ $tag(div, "TopLeft"),
+ $topBorder = $tag(div, "TopCenter"),
+ $tag(div, "TopRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $leftBorder = $tag(div, "MiddleLeft"),
+ $content,
+ $rightBorder = $tag(div, "MiddleRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $tag(div, "BottomLeft"),
+ $bottomBorder = $tag(div, "BottomCenter"),
+ $tag(div, "BottomRight")
+ )
+ ).find('div div').css({'float': 'left'});
+
+ $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');
+
+ $groupControls = $next.add($prev).add($current).add($slideshow);
+
+ $(document.body).append($overlay, $box.append($wrap, $loadingBay));
+ }
+ }
+
+ // Add ColorBox's event bindings
+ function addBindings() {
+ if ($box) {
+ if (!init) {
+ init = true;
+
+ // Cache values needed for size calculations
+ interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
+ interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
+ loadedHeight = $loaded.outerHeight(true);
+ loadedWidth = $loaded.outerWidth(true);
+
+ // Setting padding to remove the need to do size conversions during the animation step.
+ $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth});
+
+ // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
+ $next.click(function () {
+ publicMethod.next();
+ });
+ $prev.click(function () {
+ publicMethod.prev();
+ });
+ $close.click(function () {
+ publicMethod.close();
+ });
+ $overlay.click(function () {
+ if (settings.overlayClose) {
+ publicMethod.close();
+ }
+ });
+
+ // Key Bindings
+ $(document).bind('keydown.' + prefix, function (e) {
+ var key = e.keyCode;
+ if (open && settings.escKey && key === 27) {
+ e.preventDefault();
+ publicMethod.close();
+ }
+ if (open && settings.arrowKey && $related[1]) {
+ if (key === 37) {
+ e.preventDefault();
+ $prev.click();
+ } else if (key === 39) {
+ e.preventDefault();
+ $next.click();
+ }
+ }
+ });
+
+ $('.' + boxElement, document).live('click', function (e) {
+ // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
+ // See: http://jacklmoore.com/notes/click-events/
+ if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) {
+ e.preventDefault();
+ launch(this);
+ }
+ });
+ }
+ return true;
+ }
+ return false;
+ }
+
+ // Don't do anything if ColorBox already exists.
+ if ($.colorbox) {
+ return;
+ }
+
+ // Append the HTML when the DOM loads
+ $(appendHTML);
+
+
+ // ****************
+ // PUBLIC FUNCTIONS
+ // Usage format: $.fn.colorbox.close();
+ // Usage from within an iframe: parent.$.fn.colorbox.close();
+ // ****************
+
+ publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
+ var $this = this;
+
+ options = options || {};
+
+ appendHTML();
+
+ if (addBindings()) {
+ if (!$this[0]) {
+ if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
+ return $this;
+ }
+ // if no selector was given (ie. $.colorbox()), create a temporary element to work with
+ $this = $('<a/>');
+ options.open = true; // assume an immediate open
+ }
+
+ if (callback) {
+ options.onComplete = callback;
+ }
+
+ $this.each(function () {
+ $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
+ }).addClass(boxElement);
+
+ if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
+ launch($this[0]);
+ }
+ }
+
+ return $this;
+ };
+
+ publicMethod.position = function (speed, loadedCallback) {
+ var
+ top = 0,
+ left = 0,
+ offset = $box.offset(),
+ scrollTop,
+ scrollLeft;
+
+ $window.unbind('resize.' + prefix);
+
+ // remove the modal so that it doesn't influence the document width/height
+ $box.css({top: -9e4, left: -9e4});
+
+ scrollTop = $window.scrollTop();
+ scrollLeft = $window.scrollLeft();
+
+ if (settings.fixed && !isIE6) {
+ offset.top -= scrollTop;
+ offset.left -= scrollLeft;
+ $box.css({position: 'fixed'});
+ } else {
+ top = scrollTop;
+ left = scrollLeft;
+ $box.css({position: 'absolute'});
+ }
+
+ // keeps the top and left positions within the browser's viewport.
+ if (settings.right !== false) {
+ left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
+ } else if (settings.left !== false) {
+ left += setSize(settings.left, 'x');
+ } else {
+ left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
+ }
+
+ if (settings.bottom !== false) {
+ top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
+ } else if (settings.top !== false) {
+ top += setSize(settings.top, 'y');
+ } else {
+ top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
+ }
+
+ $box.css({top: offset.top, left: offset.left});
+
+ // setting the speed to 0 to reduce the delay between same-sized content.
+ speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;
+
+ // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
+ // but it has to be shrank down around the size of div#colorbox when it's done. If not,
+ // it can invoke an obscure IE bug when using iframes.
+ $wrap[0].style.width = $wrap[0].style.height = "9999px";
+
+ function modalDimensions(that) {
+ $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
+ $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
+ }
+
+ $box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}, {
+ duration: speed,
+ complete: function () {
+ modalDimensions(this);
+
+ active = false;
+
+ // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
+ $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
+ $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
+
+ if (settings.reposition) {
+ setTimeout(function () { // small delay before binding onresize due to an IE8 bug.
+ $window.bind('resize.' + prefix, publicMethod.position);
+ }, 1);
+ }
+
+ if (loadedCallback) {
+ loadedCallback();
+ }
+ },
+ step: function () {
+ modalDimensions(this);
+ }
+ });
+ };
+
+ publicMethod.resize = function (options) {
+ if (open) {
+ options = options || {};
+
+ if (options.width) {
+ settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
+ }
+ if (options.innerWidth) {
+ settings.w = setSize(options.innerWidth, 'x');
+ }
+ $loaded.css({width: settings.w});
+
+ if (options.height) {
+ settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
+ }
+ if (options.innerHeight) {
+ settings.h = setSize(options.innerHeight, 'y');
+ }
+ if (!options.innerHeight && !options.height) {
+ $loaded.css({height: "auto"});
+ settings.h = $loaded.height();
+ }
+ $loaded.css({height: settings.h});
+
+ publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
+ }
+ };
+
+ publicMethod.prep = function (object) {
+ if (!open) {
+ return;
+ }
+
+ var callback, speed = settings.transition === "none" ? 0 : settings.speed;
+
+ $loaded.remove();
+ $loaded = $tag(div, 'LoadedContent').append(object);
+
+ function getWidth() {
+ settings.w = settings.w || $loaded.width();
+ settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
+ return settings.w;
+ }
+ function getHeight() {
+ settings.h = settings.h || $loaded.height();
+ settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
+ return settings.h;
+ }
+
+ $loaded.hide()
+ .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
+ .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
+ .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
+ .prependTo($content);
+
+ $loadingBay.hide();
+
+ // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
+ //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
+
+ $(photo).css({'float': 'none'});
+
+ // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay.
+ if (isIE6) {
+ $('select').not($box.find('select')).filter(function () {
+ return this.style.visibility !== 'hidden';
+ }).css({'visibility': 'hidden'}).one(event_cleanup, function () {
+ this.style.visibility = 'inherit';
+ });
+ }
+
+ callback = function () {
+ var preload,
+ i,
+ total = $related.length,
+ iframe,
+ frameBorder = 'frameBorder',
+ allowTransparency = 'allowTransparency',
+ complete,
+ src,
+ img,
+ data;
+
+ if (!open) {
+ return;
+ }
+
+ function removeFilter() {
+ if (isIE) {
+ $box[0].style.removeAttribute('filter');
+ }
+ }
+
+ complete = function () {
+ clearTimeout(loadingTimer);
+ $loadingOverlay.hide();
+ trigger(event_complete, settings.onComplete);
+ };
+
+ if (isIE) {
+ //This fadeIn helps the bicubic resampling to kick-in.
+ if (photo) {
+ $loaded.fadeIn(100);
+ }
+ }
+
+ $title.html(settings.title).add($loaded).show();
+
+ if (total > 1) { // handle grouping
+ if (typeof settings.current === "string") {
+ $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
+ }
+
+ $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
+ $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
+
+ if (settings.slideshow) {
+ $slideshow.show();
+ }
+
+ // Preloads images within a rel group
+ if (settings.preloading) {
+ preload = [
+ getIndex(-1),
+ getIndex(1)
+ ];
+ while (i = $related[preload.pop()]) {
+ data = $.data(i, colorbox);
+
+ if (data && data.href) {
+ src = data.href;
+ if ($.isFunction(src)) {
+ src = src.call(i);
+ }
+ } else {
+ src = i.href;
+ }
+
+ if (isImage(src)) {
+ img = new Image();
+ img.src = src;
+ }
+ }
+ }
+ } else {
+ $groupControls.hide();
+ }
+
+ if (settings.iframe) {
+ iframe = $tag('iframe')[0];
+
+ if (frameBorder in iframe) {
+ iframe[frameBorder] = 0;
+ }
+ if (allowTransparency in iframe) {
+ iframe[allowTransparency] = "true";
+ }
+ // give the iframe a unique name to prevent caching
+ iframe.name = prefix + (+new Date());
+ if (settings.fastIframe) {
+ complete();
+ } else {
+ $(iframe).one('load', complete);
+ }
+ iframe.src = settings.href;
+ if (!settings.scrolling) {
+ iframe.scrolling = "no";
+ }
+ $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () {
+ iframe.src = "//about:blank";
+ });
+ } else {
+ complete();
+ }
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 1, removeFilter);
+ } else {
+ removeFilter();
+ }
+ };
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 0, function () {
+ publicMethod.position(0, callback);
+ });
+ } else {
+ publicMethod.position(speed, callback);
+ }
+ };
+
+ publicMethod.load = function (launched) {
+ var href, setResize, prep = publicMethod.prep;
+
+ active = true;
+
+ photo = false;
+
+ element = $related[index];
+
+ if (!launched) {
+ makeSettings();
+ }
+
+ trigger(event_purge);
+
+ trigger(event_load, settings.onLoad);
+
+ settings.h = settings.height ?
+ setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
+ settings.innerHeight && setSize(settings.innerHeight, 'y');
+
+ settings.w = settings.width ?
+ setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
+ settings.innerWidth && setSize(settings.innerWidth, 'x');
+
+ // Sets the minimum dimensions for use in image scaling
+ settings.mw = settings.w;
+ settings.mh = settings.h;
+
+ // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
+ // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
+ if (settings.maxWidth) {
+ settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
+ settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
+ }
+ if (settings.maxHeight) {
+ settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
+ settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
+ }
+
+ href = settings.href;
+
+ loadingTimer = setTimeout(function () {
+ $loadingOverlay.show();
+ }, 100);
+
+ if (settings.inline) {
+ // Inserts an empty placeholder where inline content is being pulled from.
+ // An event is bound to put inline content back when ColorBox closes or loads new content.
+ $tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () {
+ $(this).replaceWith($loaded.children());
+ });
+ prep($(href));
+ } else if (settings.iframe) {
+ // IFrame element won't be added to the DOM until it is ready to be displayed,
+ // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
+ prep(" ");
+ } else if (settings.html) {
+ prep(settings.html);
+ } else if (isImage(href)) {
+ $(photo = new Image())
+ .addClass(prefix + 'Photo')
+ .error(function () {
+ settings.title = false;
+ prep($tag(div, 'Error').html(settings.imgError));
+ })
+ .load(function () {
+ var percent;
+ photo.onload = null; //stops animated gifs from firing the onload repeatedly.
+
+ if (settings.scalePhotos) {
+ setResize = function () {
+ photo.height -= photo.height * percent;
+ photo.width -= photo.width * percent;
+ };
+ if (settings.mw && photo.width > settings.mw) {
+ percent = (photo.width - settings.mw) / photo.width;
+ setResize();
+ }
+ if (settings.mh && photo.height > settings.mh) {
+ percent = (photo.height - settings.mh) / photo.height;
+ setResize();
+ }
+ }
+
+ if (settings.h) {
+ photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px';
+ }
+
+ if ($related[1] && (settings.loop || $related[index + 1])) {
+ photo.style.cursor = 'pointer';
+ photo.onclick = function () {
+ publicMethod.next();
+ };
+ }
+
+ if (isIE) {
+ photo.style.msInterpolationMode = 'bicubic';
+ }
+
+ setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
+ prep(photo);
+ }, 1);
+ });
+
+ setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
+ photo.src = href;
+ }, 1);
+ } else if (href) {
+ $loadingBay.load(href, settings.data, function (data, status, xhr) {
+ prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
+ });
+ }
+ };
+
+ // Navigates to the next page/image in a set.
+ publicMethod.next = function () {
+ if (!active && $related[1] && (settings.loop || $related[index + 1])) {
+ index = getIndex(1);
+ publicMethod.load();
+ }
+ };
+
+ publicMethod.prev = function () {
+ if (!active && $related[1] && (settings.loop || index)) {
+ index = getIndex(-1);
+ publicMethod.load();
+ }
+ };
+
+ // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
+ publicMethod.close = function () {
+ if (open && !closing) {
+
+ closing = true;
+
+ open = false;
+
+ trigger(event_cleanup, settings.onCleanup);
+
+ $window.unbind('.' + prefix + ' .' + event_ie6);
+
+ $overlay.fadeTo(200, 0);
+
+ $box.stop().fadeTo(300, 0, function () {
+
+ $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
+
+ trigger(event_purge);
+
+ $loaded.remove();
+
+ setTimeout(function () {
+ closing = false;
+ trigger(event_closed, settings.onClosed);
+ }, 1);
+ });
+ }
+ };
+
+ // Removes changes ColorBox made to the document, but does not remove the plugin
+ // from jQuery.
+ publicMethod.remove = function () {
+ $([]).add($box).add($overlay).remove();
+ $box = null;
+ $('.' + boxElement)
+ .removeData(colorbox)
+ .removeClass(boxElement)
+ .die();
+ };
+
+ // A method for fetching the current element ColorBox is referencing.
+ // returns a jQuery object.
+ publicMethod.element = function () {
+ return $(element);
+ };
+
+ publicMethod.settings = defaults;
+
+}(jQuery, document, this)); \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/ajax.html b/mod/colorbox/vendors/jquery/colorbox/content/ajax.html
new file mode 100644
index 000000000..e772638ad
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/ajax.html
@@ -0,0 +1,11 @@
+<div id='homer' style="background:url(../content/homer.jpg) right center no-repeat #ececec; height:135px; width:280px; padding:30px 10px;">
+ <strong>Homer</strong><br/>
+ <em>\noun\</em><br/>
+ <strong>1.</strong> American bonehead<br/>
+ <strong>2. Pull a Homer-</strong><br/>
+ to succeed despite<br/>
+ idiocy
+</div>
+<script>
+ $('#homer strong').css({color:'red'});
+</script> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/flash.html b/mod/colorbox/vendors/jquery/colorbox/content/flash.html
new file mode 100644
index 000000000..c83f7c44f
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/flash.html
@@ -0,0 +1,8 @@
+<div style="width:504px; height:412px; overflow:hidden;">
+ <object>
+ <param name="allowfullscreen" value="true" /><param name="wmode" value="opaque" />
+ <param name="allowscriptaccess" value="always" />
+ <param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2285902&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" />
+ <embed src="http://vimeo.com/moogaloop.swf?clip_id=2285902&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" wmode="opaque" allowscriptaccess="always" width="504" height="412"></embed>
+ </object>
+</div> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/homer.jpg b/mod/colorbox/vendors/jquery/colorbox/content/homer.jpg
new file mode 100644
index 000000000..87ec76c99
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/homer.jpg
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/marylou.jpg b/mod/colorbox/vendors/jquery/colorbox/content/marylou.jpg
new file mode 100644
index 000000000..4c717d276
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/marylou.jpg
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/ohoopee1.jpg b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee1.jpg
new file mode 100644
index 000000000..aae19a3e6
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee1.jpg
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/ohoopee2.jpg b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee2.jpg
new file mode 100644
index 000000000..206894489
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee2.jpg
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/content/ohoopee3.jpg b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee3.jpg
new file mode 100644
index 000000000..4d64d2400
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/content/ohoopee3.jpg
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/colorbox.css b/mod/colorbox/vendors/jquery/colorbox/example1/colorbox.css
new file mode 100644
index 000000000..397fe3dca
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/colorbox.css
@@ -0,0 +1,86 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{}
+ #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
+ #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
+ #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
+ #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
+ #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+ #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+ #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+ #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:28px;}
+ #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+ #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+ #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+ #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:-75px -25px;}
+ #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:-50px -25px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:-25px -25px;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/border.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/border.png
new file mode 100644
index 000000000..f463a10d8
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/border.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/controls.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/controls.png
new file mode 100644
index 000000000..dcfd6fb9f
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/controls.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomCenter.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..0d4475edf
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomLeft.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..2775eba89
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomRight.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..f7f51379c
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleLeft.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..a2d63d156
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleRight.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..fd7c3e849
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopCenter.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..2937a9cf9
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopLeft.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..f9d458b5b
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopRight.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..74b8583cf
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/ie6/borderTopRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/loading.gif b/mod/colorbox/vendors/jquery/colorbox/example1/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/loading.gif
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/loading_background.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/loading_background.png
new file mode 100644
index 000000000..6ae83e697
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/loading_background.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/images/overlay.png b/mod/colorbox/vendors/jquery/colorbox/example1/images/overlay.png
new file mode 100644
index 000000000..53ea98f70
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/images/overlay.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example1/index.html b/mod/colorbox/vendors/jquery/colorbox/example1/index.html
new file mode 100644
index 000000000..44fcca860
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example1/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="../colorbox/jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='ajax' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='iframe' href="http://threadless.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/flash.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example2/colorbox.css b/mod/colorbox/vendors/jquery/colorbox/example2/colorbox.css
new file mode 100644
index 000000000..fa42bf2f9
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example2/colorbox.css
@@ -0,0 +1,43 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxContent{margin-top:32px; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{background:#000; padding:1px;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxTitle{position:absolute; top:-22px; left:0; color:#000;}
+ #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+ #cboxSlideshow, #cboxPrevious, #cboxNext, #cboxClose{text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxPrevious{background-position:0px 0px; right:44px;}
+ #cboxPrevious:hover{background-position:0px -25px;}
+ #cboxNext{background-position:-25px 0px; right:22px;}
+ #cboxNext:hover{background-position:-25px -25px;}
+ #cboxClose{background-position:-50px 0px; right:0;}
+ #cboxClose:hover{background-position:-50px -25px;}
+ .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+ .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;}
diff --git a/mod/colorbox/vendors/jquery/colorbox/example2/images/controls.png b/mod/colorbox/vendors/jquery/colorbox/example2/images/controls.png
new file mode 100644
index 000000000..8569b57f1
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example2/images/controls.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example2/images/loading.gif b/mod/colorbox/vendors/jquery/colorbox/example2/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example2/images/loading.gif
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example2/index.html b/mod/colorbox/vendors/jquery/colorbox/example2/index.html
new file mode 100644
index 000000000..44fcca860
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example2/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="../colorbox/jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='ajax' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='iframe' href="http://threadless.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/flash.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example3/colorbox.css b/mod/colorbox/vendors/jquery/colorbox/example3/colorbox.css
new file mode 100644
index 000000000..36cc9ef42
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example3/colorbox.css
@@ -0,0 +1,38 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width: none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxContent{margin-top:20px;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{border:5px solid #000; background:#fff;}
+ #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+ #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+ #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+ #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:bottom left;}
+ #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:bottom right;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:bottom center;} \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example3/images/controls.png b/mod/colorbox/vendors/jquery/colorbox/example3/images/controls.png
new file mode 100644
index 000000000..e1e97982a
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example3/images/controls.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example3/images/loading.gif b/mod/colorbox/vendors/jquery/colorbox/example3/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example3/images/loading.gif
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example3/index.html b/mod/colorbox/vendors/jquery/colorbox/example3/index.html
new file mode 100644
index 000000000..44fcca860
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example3/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="../colorbox/jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='ajax' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='iframe' href="http://threadless.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/flash.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/colorbox.css b/mod/colorbox/vendors/jquery/colorbox/example4/colorbox.css
new file mode 100644
index 000000000..bc5ef3e3d
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/colorbox.css
@@ -0,0 +1,82 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
+ #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
+ #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
+ #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
+ #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
+ #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
+ #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
+ #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:20px;}
+ #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
+ #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
+ #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
+ #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
+ #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
+ #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
+ #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/border1.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/border1.png
new file mode 100644
index 000000000..0ddc70405
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/border1.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/border2.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/border2.png
new file mode 100644
index 000000000..aa62a0b72
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/border2.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomCenter.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..12e0e9ac0
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomLeft.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..b7a474ae0
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomRight.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..6b6cb159b
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleLeft.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..8d0eb739d
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleRight.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..d65509e30
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopCenter.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..35d8da2d0
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopLeft.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..ae9bda040
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopRight.png b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..0d8868399
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/ie6/borderTopRight.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/images/loading.gif b/mod/colorbox/vendors/jquery/colorbox/example4/images/loading.gif
new file mode 100644
index 000000000..602ce3c3a
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/images/loading.gif
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example4/index.html b/mod/colorbox/vendors/jquery/colorbox/example4/index.html
new file mode 100644
index 000000000..44fcca860
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example4/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="../colorbox/jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='ajax' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='iframe' href="http://threadless.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/flash.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/colorbox.css b/mod/colorbox/vendors/jquery/colorbox/example5/colorbox.css
new file mode 100644
index 000000000..91301a9b1
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/colorbox.css
@@ -0,0 +1,52 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+ #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+ #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+ #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+ #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+ #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+ #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+ #cboxContent{background:#fff; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:5px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+ #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+ #cboxPrevious{left:0px; background-position: -51px -25px;}
+ #cboxPrevious:hover{background-position:-51px 0px;}
+ #cboxNext{left:27px; background-position:-75px -25px;}
+ #cboxNext:hover{background-position:-75px 0px;}
+ #cboxClose{right:0; background-position:-100px -25px;}
+ #cboxClose:hover{background-position:-100px 0px;}
+
+ .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/images/border.png b/mod/colorbox/vendors/jquery/colorbox/example5/images/border.png
new file mode 100644
index 000000000..df13bb6da
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/images/border.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/images/controls.png b/mod/colorbox/vendors/jquery/colorbox/example5/images/controls.png
new file mode 100644
index 000000000..65cfd1dc9
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/images/controls.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/images/loading.gif b/mod/colorbox/vendors/jquery/colorbox/example5/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/images/loading.gif
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/images/loading_background.png b/mod/colorbox/vendors/jquery/colorbox/example5/images/loading_background.png
new file mode 100644
index 000000000..9de11f467
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/images/loading_background.png
Binary files differ
diff --git a/mod/colorbox/vendors/jquery/colorbox/example5/index.html b/mod/colorbox/vendors/jquery/colorbox/example5/index.html
new file mode 100644
index 000000000..44fcca860
--- /dev/null
+++ b/mod/colorbox/vendors/jquery/colorbox/example5/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="../colorbox/jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='ajax' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='iframe' href="http://threadless.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/flash.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/colorbox/views/default/css/lightbox.php b/mod/colorbox/views/default/css/lightbox.php
new file mode 100644
index 000000000..e18c02bf8
--- /dev/null
+++ b/mod/colorbox/views/default/css/lightbox.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Colorbox -- Stylesheet
+ *
+ * Used as a view because we need to pass a full URL to AlphaImageLoader.
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$jquery_path = elgg_get_site_url() . 'mod/colorbox/vendors/jquery/';
+?>
+
+/*
+ * ColorBox - jQuery Plugin
+ * A lightweight customizable lightbox plugin for jQuery
+ *
+ */
+
+ /*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+body > #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width: none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+body > #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+body > #colorbox{}
+ #cboxContent{margin-top:20px;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{border:5px solid #000; background:#fff;}
+ #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+ #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+ #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+ #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(<?php echo $jquery_path; ?>colorbox/example3/images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:bottom left;}
+ #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(<?php echo $jquery_path; ?>colorbox/example3/images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:bottom right;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxLoadingGraphic{background:url(<?php echo $jquery_path; ?>colorbox/example3/images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(<?php echo $jquery_path; ?>colorbox/example3/images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:bottom center;}
diff --git a/mod/colorbox/views/default/js/embed/embed.php b/mod/colorbox/views/default/js/embed/embed.php
new file mode 100644
index 000000000..ada6653a8
--- /dev/null
+++ b/mod/colorbox/views/default/js/embed/embed.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Colorbox -- Javascript
+ *
+ * Used as a view because we need to pass a full URL to AlphaImageLoader.
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ * @override mod/embed/views/default/js/embed/embed.php
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+?>
+
+elgg.provide('elgg.embed');
+
+elgg.embed.init = function() {
+
+ // inserts the embed content into the textarea
+ $(".embed-item").live('click', elgg.embed.insert);
+
+ // caches the current textarea id
+ $(".embed-control").live('click', function() {
+ elgg.embed.textAreaId = /embed-control-(\S)+/.exec($(this).attr('class'))[1];
+ });
+
+ // special pagination helper for lightbox
+ $('.embed-wrapper .elgg-pagination a').live('click', elgg.embed.forward);
+
+ $('.embed-section').live('click', elgg.embed.forward);
+
+ $('.elgg-form-embed').live('submit', elgg.embed.submit);
+};
+
+/**
+ * Inserts data attached to an embed list item in textarea
+ *
+ * @todo generalize lightbox closing
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.embed.insert = function(event) {
+ var textAreaId = elgg.embed.textAreaId;
+ var textArea = $('#' + textAreaId);
+
+ // generalize this based on a css class attached to what should be inserted
+ var content = ' ' + $(this).find(".embed-insert").parent().html() + ' ';
+
+ // this is a temporary work-around for #3971
+ if (content.indexOf('thumbnail.php') != -1) {
+ content = content.replace('size=small', 'size=medium');
+ }
+
+ textArea.val(textArea.val() + content);
+ textArea.focus();
+
+<?php
+// See the TinyMCE plugin for an example of this view
+echo elgg_view('embed/custom_insert_js');
+?>
+
+ elgg.ui.lightbox.close();
+
+ event.preventDefault();
+};
+
+/**
+ * Submit an upload form through Ajax
+ *
+ * Requires the jQuery Form Plugin. Because files cannot be uploaded with
+ * XMLHttpRequest, the plugin uses an invisible iframe. This results in the
+ * the X-Requested-With header not being set. To work around this, we are
+ * sending the header as a POST variable and Elgg's code checks for it in
+ * elgg_is_xhr().
+ *
+ * @param {Object} event
+ * @return bool
+ */
+elgg.embed.submit = function(event) {
+ $('.embed-wrapper .elgg-form-file-upload').hide();
+ $('.embed-throbber').show();
+
+ $(this).ajaxSubmit({
+ dataType : 'json',
+ data : { 'X-Requested-With' : 'XMLHttpRequest'},
+ success : function(response) {
+ if (response) {
+ if (response.system_messages) {
+ elgg.register_error(response.system_messages.error);
+ elgg.system_message(response.system_messages.success);
+ }
+ if (response.status >= 0) {
+ var forward = $('input[name=embed_forward]').val();
+ var url = elgg.normalize_url('embed/tab/' + forward);
+ url = elgg.embed.addContainerGUID(url);
+ $('.embed-wrapper').parent().load(url);
+ } else {
+ // incorrect response, presumably an error has been displayed
+ $('.embed-throbber').hide();
+ $('.embed-wrapper .elgg-form-file-upload').show();
+ }
+ }
+
+ // ie 7 and 8 have a null response because of the use of an iFrame
+ // so just show the list after upload.
+ // http://jquery.malsup.com/form/#file-upload claims you can wrap JSON
+ // in a textarea, but a quick test didn't work, and that is fairly
+ // intrusive to the rest of the ajax system.
+ else if (response === undefined && $.browser.msie) {
+ var forward = $('input[name=embed_forward]').val();
+ var url = elgg.normalize_url('embed/tab/' + forward);
+ url = elgg.embed.addContainerGUID(url);
+ $('.embed-wrapper').parent().load(url);
+ }
+ },
+ error : function(xhr, status) {
+ // @todo nothing for now
+ }
+ });
+
+ // this was bubbling up the DOM causing a submission
+ event.preventDefault();
+ event.stopPropagation();
+};
+
+/**
+ * Loads content within the lightbox
+ *
+ * @param {Object} event
+ * @return void
+ */
+elgg.embed.forward = function(event) {
+ // make sure container guid is passed
+ var url = $(this).attr('href');
+ url = elgg.embed.addContainerGUID(url);
+
+ $('.embed-wrapper').parent().load(url);
+ event.preventDefault();
+};
+
+/**
+ * Adds the container guid to a URL
+ *
+ * @param {string} url
+ * @return string
+ */
+elgg.embed.addContainerGUID = function(url) {
+ if (url.indexOf('container_guid=') == -1) {
+ var guid = $('input[name=embed_container_guid]').val();
+ return url + '?container_guid=' + guid;
+ } else {
+ return url;
+ }
+};
+
+elgg.register_hook_handler('init', 'system', elgg.embed.init);
diff --git a/mod/colorbox/views/default/js/lightbox.php b/mod/colorbox/views/default/js/lightbox.php
new file mode 100644
index 000000000..732092e2b
--- /dev/null
+++ b/mod/colorbox/views/default/js/lightbox.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Colorbox -- Stylesheet
+ *
+ * Used as a view because we need to pass a full URL to AlphaImageLoader.
+ *
+ * @package Lorea
+ * @subpackage Colorbox
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Usage
+ * Apply the class elgg-lightbox to links.
+ *
+ * Advanced Usage
+ * Elgg is distributed with the Colorbox jQuery library. Please go to
+ * http://www.jacklmoore.com/colorbox for more information on the options of this lightbox.
+ *
+ * Overriding
+ * In a plugin, override this view and override the registration for the
+ * lightbox JavaScript and CSS (@see elgg_views_boot()).
+ *
+ * @todo add support for passing options: $('#myplugin-lightbox').elgg.ui.lightbox(options);
+ */
+
+?>
+
+/**
+ * Lightbox initialization
+ */
+
+elgg.provide('elgg.ui.lightbox');
+
+elgg.ui.lightbox.init = function() {
+
+ $.extend($.colorbox.settings, {
+ current: elgg.echo('js:lightbox:current', ['{current}', '{total}']),
+ previous: elgg.echo('previous'),
+ next: elgg.echo('next'),
+ close: elgg.echo('close'),
+ xhrError: elgg.echo('error:default'),
+ imgError: elgg.echo('error:default'),
+ });
+
+ $(".elgg-lightbox").colorbox();
+ $(".elgg-lightbox-photo").colorbox({photo: true});
+ var n = 0;
+ $(".elgg-lightbox-gallery").each(function() {
+ $(this).find(".elgg-lightbox, .elgg-lightbox-photo")
+ .addClass("elgg-lightbox-" + n)
+ .colorbox({
+ rel: "elgg-lightbox-" + n++,
+ });
+ });
+}
+
+elgg.ui.lightbox.close = function() {
+ $.colorbox.close();
+}
+
+elgg.register_hook_handler('init', 'system', elgg.ui.lightbox.init);
+
+<?php
+
+$js_path = elgg_get_plugins_path();
+$js_path = "{$js_path}colorbox/vendors/jquery/colorbox/colorbox/jquery.colorbox-min.js";
+include $js_path;
diff --git a/mod/cool_theme/_graphics/ajax_loader.gif b/mod/cool_theme/_graphics/ajax_loader.gif
new file mode 100644
index 000000000..521a291d7
--- /dev/null
+++ b/mod/cool_theme/_graphics/ajax_loader.gif
Binary files differ
diff --git a/mod/cool_theme/_graphics/ajax_loader_bw.gif b/mod/cool_theme/_graphics/ajax_loader_bw.gif
new file mode 100644
index 000000000..521a291d7
--- /dev/null
+++ b/mod/cool_theme/_graphics/ajax_loader_bw.gif
Binary files differ
diff --git a/mod/cool_theme/_graphics/elgg_sprites.png b/mod/cool_theme/_graphics/elgg_sprites.png
new file mode 100644
index 000000000..c87c1b0cd
--- /dev/null
+++ b/mod/cool_theme/_graphics/elgg_sprites.png
Binary files differ
diff --git a/mod/cool_theme/_graphics/favicon.ico b/mod/cool_theme/_graphics/favicon.ico
new file mode 100644
index 000000000..495a0ca5a
--- /dev/null
+++ b/mod/cool_theme/_graphics/favicon.ico
Binary files differ
diff --git a/mod/cool_theme/documentation/documention.html b/mod/cool_theme/documentation/documention.html
new file mode 100644
index 000000000..77538e578
--- /dev/null
+++ b/mod/cool_theme/documentation/documention.html
@@ -0,0 +1,12 @@
+<HTML><HEAD><TITLE>Documentation</TITLE>
+<META NAME="Description" CONTENT="WISB documentation for Elgg developers">
+</HEAD>
+<FRAMESET rows="100%,*" frameborder=no border=0>
+<FRAME SRC="http://developers.wisb.me/elgg/">
+<FRAME SRC="" scrolling="No" noresize>
+</FRAMESET>
+<NOFRAME>
+<BODY>
+</BODY>
+</NOFRAME>
+</HTML> \ No newline at end of file
diff --git a/mod/cool_theme/languages/en.php b/mod/cool_theme/languages/en.php
new file mode 100644
index 000000000..6e25bf14f
--- /dev/null
+++ b/mod/cool_theme/languages/en.php
@@ -0,0 +1,50 @@
+<?php
+add_translation('en', array(
+ 'annotation:group_topic_post:value:placeholder' => 'Leave a reply...',
+ 'annotation:generic_comment:value:placeholder' => 'Leave a comment...',
+
+ 'composer:object:thewire' => "Status",
+ 'composer:object:bookmarks' => "Bookmark",
+ 'composer:object:blog' => "Blog",
+ 'composer:annotation:messageboard' => "Post",
+ 'composer:object:file' => 'File',
+ 'composer:prompt' => 'Share',
+
+ 'file:river:create' => 'uploaded a file',
+ 'files' => 'Files',
+
+ 'friend:user:add' => "Add %s as Friend",
+
+ 'groups:add' => 'Create Group...',
+ 'thanks' => 'Thanks',
+ 'thanks_body' => 'Special thanks to all the Elgg staff!<br /><br/><ul><li><a href="http://community.elgg.org/profile/ewinslow">Evan Winslow</a></li><br /><li><a href="http://community.elgg.org/profile/Beck24">Matt Beckett</a></li><br /></li><a href="http://community.elgg.org">All the Elgg community</a></li><br /><br /><li><a href="../">And you of course because you downloaded my theme :-)</a></li></ul>',
+ 'home' => 'Home',
+ 'WISB:footer_wisb' => 'WISB',
+ 'WISB:footer_developers' => 'Developers',
+ 'WISB:footer_wisblog' => 'WISBlog',
+ 'newsfeed' => 'News Feed',
+
+ 'profile:wall' => "Board",
+ 'profile:info' => "Info",
+ 'profile:activity:none' => "No activity to display",
+
+ 'likes:likethis' => 'Like',
+ 'likes:remove' => 'Unlike',
+
+ 'notifications:personal' => "Notifications",
+
+ 'pages:river:create' => 'created a page',
+
+ 'river:comment:object:thewire' => '',
+ 'river:comments:all' => 'View all %d comments',
+ 'river:messageboard:group:default' => '',
+ 'river:replies:all' => 'View all %d replies',
+ 'river:to' => '%s &#x25B6 %s',
+
+ 'rss:subscribe' => 'Subscribe via RSS',
+
+ 'see:all' => 'See all',
+
+ 'settings:user' => 'Account Settings',
+
+));
diff --git a/mod/cool_theme/languages/es.php b/mod/cool_theme/languages/es.php
new file mode 100644
index 000000000..41960388f
--- /dev/null
+++ b/mod/cool_theme/languages/es.php
@@ -0,0 +1,47 @@
+<?php
+add_translation('es', array(
+ 'annotation:group_topic_post:value:placeholder' => 'Responder...',
+ 'annotation:generic_comment:value:placeholder' => 'Comentar...',
+
+ 'composer:object:thewire' => "Estado",
+ 'composer:object:bookmarks' => "Favoritos",
+ 'composer:object:blog' => "Blog",
+ 'composer:annotation:messageboard' => "Post",
+ 'composer:object:file' => 'Archivo',
+ 'composer:prompt' => 'Accion',
+
+ 'file:river:create' => 'Archivo subido',
+ 'files' => 'Archivos',
+
+ 'friend:user:add' => "Agregar %s como Amigo",
+
+ 'groups:add' => 'Crear Grupo...',
+
+ 'home' => 'Inicio',
+
+ 'newsfeed' => 'Noticias RSS',
+
+ 'profile:wall' => "Muro",
+ 'profile:info' => "Info",
+ 'profile:activity:none' => "No hay actividad para mostrar",
+
+ 'likes:likethis' => 'Me gusta',
+ 'likes:remove' => 'Quitar Me gusta',
+
+ 'notifications:personal' => "Notificaciones",
+
+ 'pages:river:create' => 'Página creada',
+
+ 'river:comment:object:thewire' => '',
+ 'river:comments:all' => 'Ver todos %d los comentarios',
+ 'river:messageboard:group:default' => '',
+ 'river:replies:all' => 'Ver todas %d las respuestas',
+ 'river:to' => '%s &#x25B6 %s',
+
+ 'rss:subscribe' => 'Subscribete via RSS',
+
+ 'see:all' => 'Ver todo',
+
+ 'settings:user' => 'Configuracion de la cuenta',
+
+)); \ No newline at end of file
diff --git a/mod/cool_theme/languages/fr.php b/mod/cool_theme/languages/fr.php
new file mode 100644
index 000000000..a1fd4a173
--- /dev/null
+++ b/mod/cool_theme/languages/fr.php
@@ -0,0 +1,36 @@
+<?php
+add_translation('fr', array(
+ 'annotation:group_topic_post:value:placeholder' => 'Laisser une réponse...',
+ 'annotation:generic_comment:value:placeholder' => 'Laisser un commentaire...',
+ 'composer:object:thewire' => "Statut",
+ 'composer:object:bookmarks' => "Lien",
+ 'composer:object:blog' => "Blog",
+ 'composer:annotation:messageboard' => "Post",
+ 'composer:object:file' => 'Fichier',
+ 'composer:prompt' => 'Partager',
+ 'friend:user:add' => "Ajouter %s à mes amis",
+ 'file:river:create' => 'a envoyé un fichier',
+ 'file:group' => "Fichiers",
+ 'bookmarks:group' => 'Liens',
+ 'blog:group' => "Blog",
+ 'pages:group' => 'Pages',
+ 'questions:group' => "Questions",
+ 'discussion:group' => 'Discussion',
+ 'groups:activity' => "Activité",
+ 'profile:wall' => "Mur",
+ 'profile:info' => "Info",
+ 'pages:river:create' => 'a créé une page',
+ 'composer:prompt' => 'Partager',
+ 'likes:likethis' => "J'aime",
+ 'likes:remove' => "Je n'aime plus",
+ 'river:comments:all' => 'Afficher les %d commentaires',
+ 'pages:river:create' => 'a créé une page',
+ 'newsfeed' => 'Fil d\'actualité',
+ 'friend:user:add' => "Ajouter %s à mes amis",
+ 'river:to' => '%s &#x25B6 %s',
+ 'files' => 'Fichiers',
+ 'river:comment:object:thewire' => '',
+ 'groups:add' => 'Créer un groupe...',
+ 'home' => 'Accueil',
+ 'see:all' => 'Voir tous',
+));
diff --git a/mod/cool_theme/manifest.xml b/mod/cool_theme/manifest.xml
new file mode 100644
index 000000000..32f3ad287
--- /dev/null
+++ b/mod/cool_theme/manifest.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Ultimate Cool Theme</name>
+ <author>Stan Larroque</author>
+ <version>2.1</version>
+ <category>theme</category>
+ <description>
+ I just made my best for this cool theme. Keep an eye on http://github.com/WISB for further stuff.
+ </description>
+ <website>https://developers.wisb.me/elgg/</website>
+ <copyright>(C) 2012 Stan Larroque</copyright>
+ <license>GNU Public License version 2</license>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8.3</version>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>groups</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>messageboard</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>messages</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>profile</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>search</plugin>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>thewire</plugin>
+ </requires>
+
+ <suggests>
+ <type>plugin</type>
+ <name>profile</name>
+ <version>1.8</version>
+ </suggests>
+</plugin_manifest>
diff --git a/mod/cool_theme/pages/credits.php b/mod/cool_theme/pages/credits.php
new file mode 100644
index 000000000..507211f0e
--- /dev/null
+++ b/mod/cool_theme/pages/credits.php
@@ -0,0 +1,15 @@
+<?php
+gatekeeper();
+
+$user = elgg_get_logged_in_user_entity();
+
+elgg_set_page_owner_guid($user->guid);
+
+$title = elgg_echo('thanks');
+elgg_set_page_owner_guid(1);
+$content = elgg_view_layout('two_sidebar', array(
+ 'title' => $title,
+ 'content' => elgg_echo('thanks_body'),
+));
+
+echo elgg_view_page($title, $content); \ No newline at end of file
diff --git a/mod/cool_theme/pages/dashboard.php b/mod/cool_theme/pages/dashboard.php
new file mode 100644
index 000000000..12bfeca64
--- /dev/null
+++ b/mod/cool_theme/pages/dashboard.php
@@ -0,0 +1,29 @@
+<?php
+gatekeeper();
+
+$user = elgg_get_logged_in_user_entity();
+
+elgg_set_page_owner_guid($user->guid);
+
+$title = elgg_echo('newsfeed');
+
+$composer = elgg_view('page/elements/composer', array('entity' => $user));
+
+
+$db_prefix = elgg_get_config('dbprefix');
+$activity = elgg_list_river(array(
+ 'joins' => array("JOIN {$db_prefix}entities object ON object.guid = rv.object_guid"),
+ 'wheres' => array("
+ rv.subject_guid = $user->guid
+ OR rv.subject_guid IN (SELECT guid_two FROM {$db_prefix}entity_relationships WHERE guid_one=$user->guid AND relationship='follower')
+ OR rv.subject_guid IN (SELECT guid_one FROM {$db_prefix}entity_relationships WHERE guid_two=$user->guid AND relationship='friend')
+ "),
+));
+
+elgg_set_page_owner_guid(1);
+$content = elgg_view_layout('two_sidebar', array(
+ 'title' => $title,
+ 'content' => $composer . $activity,
+));
+
+echo elgg_view_page($title, $content); \ No newline at end of file
diff --git a/mod/cool_theme/pages/groups/info.php b/mod/cool_theme/pages/groups/info.php
new file mode 100644
index 000000000..cdf84d052
--- /dev/null
+++ b/mod/cool_theme/pages/groups/info.php
@@ -0,0 +1,27 @@
+<?php
+// turn this into a core function
+global $autofeed;
+$autofeed = true;
+
+$group = elgg_get_page_owner_entity();
+if (!$group instanceof ElggGroup) {
+ forward('groups/all');
+}
+
+elgg_load_library('elgg:groups');
+groups_register_profile_buttons($group);
+
+$content = elgg_view('groups/profile/layout', array('entity' => $group));
+if (group_gatekeeper(false)) {
+ $sidebar = elgg_view('groups/sidebar/members', array('entity' => $group));
+} else {
+ $sidebar = '';
+}
+
+$body = elgg_view_layout('two_sidebar', array(
+ 'content' => $content,
+ 'sidebar_alt' => $sidebar,
+ 'title' => $group->name,
+));
+
+echo elgg_view_page($group->name, $body); \ No newline at end of file
diff --git a/mod/cool_theme/pages/groups/wall.php b/mod/cool_theme/pages/groups/wall.php
new file mode 100644
index 000000000..9a273e262
--- /dev/null
+++ b/mod/cool_theme/pages/groups/wall.php
@@ -0,0 +1,35 @@
+<?php
+
+$group = elgg_get_page_owner_entity();
+
+if (!$group || !elgg_instanceof($group, 'group')) {
+ register_error(elgg_echo('groups:notfound'));
+ forward();
+}
+
+elgg_load_library('elgg:groups');
+groups_register_profile_buttons($group);
+
+$title = $group->name;
+
+$composer = '';
+if (elgg_is_logged_in()) {
+ $composer = elgg_view('page/elements/composer', array('entity' => $group));
+}
+
+$db_prefix = elgg_get_config('dbprefix');
+$activity = elgg_list_river(array(
+ 'joins' => array("JOIN {$db_prefix}entities e ON e.guid = rv.object_guid"),
+ 'wheres' => array("e.container_guid = $group->guid OR rv.object_guid = $group->guid"),
+));
+
+if (!$activity) {
+ $activity = elgg_view('output/longtext', array('value' => elgg_echo('group:activity:none')));
+}
+
+$body = elgg_view_layout('two_sidebar', array(
+ 'title' => $title,
+ 'content' => $composer . $activity,
+));
+
+echo elgg_view_page($title, $body);
diff --git a/mod/cool_theme/pages/profile/info.php b/mod/cool_theme/pages/profile/info.php
new file mode 100644
index 000000000..9dc40c4c7
--- /dev/null
+++ b/mod/cool_theme/pages/profile/info.php
@@ -0,0 +1,9 @@
+<?php
+$user = elgg_get_page_owner_entity();
+
+$body = elgg_view_layout('two_sidebar', array(
+ 'title' => $user->name,
+ 'content' => elgg_view('profile/details'),
+));
+
+echo elgg_view_page($title, $body); \ No newline at end of file
diff --git a/mod/cool_theme/pages/profile/wall.php b/mod/cool_theme/pages/profile/wall.php
new file mode 100644
index 000000000..48d3b8646
--- /dev/null
+++ b/mod/cool_theme/pages/profile/wall.php
@@ -0,0 +1,32 @@
+<?php
+
+$user = elgg_get_page_owner_entity();
+
+if (!$user || !elgg_instanceof($user, 'user')) {
+ register_error(elgg_echo('profile:notfound'));
+ forward();
+}
+
+$title = $user->name;
+
+$composer = '';
+if (elgg_is_logged_in()) {
+ $composer = elgg_view('page/elements/composer', array('entity' => $user));
+}
+
+$db_prefix = elgg_get_config('dbprefix');
+$activity = elgg_list_river(array(
+ 'joins' => array("JOIN {$db_prefix}entities e ON e.guid = rv.object_guid"),
+ 'wheres' => array("e.container_guid = $user->guid OR rv.object_guid = $user->guid")
+));
+
+if (!$activity) {
+ $activity = elgg_view('output/longtext', array('value' => elgg_echo('profile:activity:none')));
+}
+
+$body = elgg_view_layout('two_sidebar', array(
+ 'content' => $composer . $activity,
+ 'title' => $title,
+));
+
+echo elgg_view_page($title, $body);
diff --git a/mod/cool_theme/readme.md b/mod/cool_theme/readme.md
new file mode 100644
index 000000000..2e64f94e5
--- /dev/null
+++ b/mod/cool_theme/readme.md
@@ -0,0 +1,8 @@
+Upgrade from cool_theme 1.0 :
+-------------
+
+1. Deactivate your cool_theme version
+2. Delete it from your server
+3. Upload this version to your mod/ directory
+4. Activate cool_theme...
+Easy :-) \ No newline at end of file
diff --git a/mod/cool_theme/screenshot.png b/mod/cool_theme/screenshot.png
new file mode 100644
index 000000000..efcadc7c7
--- /dev/null
+++ b/mod/cool_theme/screenshot.png
Binary files differ
diff --git a/mod/cool_theme/start.php b/mod/cool_theme/start.php
new file mode 100644
index 000000000..b3876fa0d
--- /dev/null
+++ b/mod/cool_theme/start.php
@@ -0,0 +1,676 @@
+<?php
+
+function cool_theme_init() {
+ /**
+ * Customize pages
+ */
+ elgg_register_plugin_hook_handler('index', 'system', 'facebook_theme_index_handler');
+ elgg_register_page_handler('profile', 'facebook_theme_profile_page_handler');
+ elgg_register_page_handler('dashboard', 'facebook_theme_dashboard_handler');
+ elgg_register_page_handler('thanks', 'cool_theme_credits_handler');
+ elgg_register_event_handler('pagesetup', 'system', 'friends_hack_pagesetup_handler');
+
+
+
+ //What a hack! Overriding groups page handler without blowing away other plugins doing the same
+ global $CONFIG, $facebook_theme_original_groups_page_handler;
+ $facebook_theme_original_groups_page_handler = $CONFIG->pagehandler['groups'];
+ elgg_register_page_handler('groups', 'facebook_theme_groups_page_handler');
+
+ elgg_register_ajax_view('thewire/composer');
+ elgg_register_ajax_view('messageboard/composer');
+ elgg_register_ajax_view('blog/composer');
+ elgg_register_ajax_view('file/composer');
+ elgg_register_ajax_view('bookmarks/composer');
+
+ /**
+ * Customize menus
+ */
+ elgg_unregister_plugin_hook_handler('register', 'menu:river', 'likes_river_menu_setup');
+ elgg_unregister_plugin_hook_handler('register', 'menu:river', 'elgg_river_menu_setup');
+
+ elgg_register_plugin_hook_handler('register', 'menu:river', 'facebook_theme_river_menu_handler');
+ elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'facebook_theme_owner_block_menu_handler', 600);
+ elgg_register_plugin_hook_handler('register', 'menu:composer', 'facebook_theme_composer_menu_handler');
+
+ elgg_register_event_handler('pagesetup', 'system', 'facebook_theme_pagesetup_handler', 1000);
+
+ /**
+ * Customize permissions
+ */
+ elgg_register_plugin_hook_handler('permissions_check:annotate', 'all', 'facebook_theme_annotation_permissions_handler');
+ elgg_register_plugin_hook_handler('container_permissions_check', 'all', 'facebook_theme_container_permissions_handler');
+
+ /**
+ * Miscellaneous customizations
+ */
+ //Small "correction" to groups profile -- brief description makes more sense to come first!
+ elgg_register_plugin_hook_handler('profile:fields', 'group', 'facebook_theme_group_profile_fields', 1);
+
+ //@todo report some of the extra patterns to be included in Elgg core
+ elgg_extend_view('css/elgg', 'cool_theme/css');
+ elgg_extend_view('js/elgg', 'js/topbar');
+
+ //Likes summary bar -- "You, John, and 3 others like this"
+ if (elgg_is_active_plugin('likes')) {
+ elgg_extend_view('river/elements/responses', 'likes/river_footer', 1);
+ }
+
+ elgg_extend_view('river/elements/responses', 'discussion/river_footer');
+
+ //Elgg only includes the search bar in the header by default,
+ //but we usually don't show the header when the user is logged in
+ if (elgg_is_active_plugin('search')) {
+ elgg_extend_view('page/elements/topbar', 'search/search_box');
+ elgg_unextend_view('page/elements/header', 'search/search_box');
+
+ if (!elgg_is_logged_in()) {
+ elgg_unextend_view('page/elements/header', 'search/header');
+ }
+ }
+}
+function friends_hack_pagesetup_handler() {
+elgg_unregister_menu_item('topbar', 'friends');
+
+}
+function facebook_theme_groups_page_handler($segments, $handle) {
+ $pages_dir = dirname(__FILE__) . '/pages';
+
+ switch ($segments[0]) {
+ case 'profile':
+ elgg_set_page_owner_guid($segments[1]);
+ require_once "$pages_dir/groups/wall.php";
+ break;
+
+ case 'info':
+ elgg_set_page_owner_guid($segments[1]);
+ require_once "$pages_dir/groups/info.php";
+ break;
+
+ case 'discussion':
+ elgg_set_page_owner_guid($segments[1]);
+ require_once "$pages_dir/groups/discussion.php";
+ break;
+
+ default:
+ global $facebook_theme_original_groups_page_handler;
+ return call_user_func($facebook_theme_original_groups_page_handler, $segments, $handle);
+ }
+ return true;
+}
+
+function facebook_theme_pagesetup_handler() {
+ $owner = elgg_get_page_owner_entity();
+
+ if (elgg_is_logged_in()) {
+ $user = elgg_get_logged_in_user_entity();
+ elgg_register_menu_item('page', array(
+ 'name' => 'news',
+ 'text' => elgg_view_icon('newsfeed') . elgg_echo('newsfeed'),
+ 'href' => '/dashboard',
+ 'priority' => 100,
+ 'contexts' => array('dashboard'),
+ ));
+ if (elgg_is_active_plugin('message')) {
+ elgg_register_menu_item('page', array(
+ 'name' => 'Inbox',
+ 'text' => elgg_view_icon('messages') . elgg_echo('Inbox'),
+ 'href' => "/messages/",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'friends',
+ 'text' => elgg_view_icon('friends') . elgg_echo('friends'),
+ 'href' => "/friends/$user->username",
+ 'priority' => 500,
+ 'contexts' => array('dashboard'),
+ ));
+
+ if ($owner instanceof ElggUser && $owner->guid != $user->guid) {
+
+ if (check_entity_relationship($user->guid, 'friend', $owner->guid)) {
+ elgg_register_menu_item('extras', array(
+ 'name' => 'removefriend',
+ 'text' => elgg_echo('friend:remove'),
+ 'href' => "/action/friends/remove?friend=$owner->guid",
+ 'is_action' => TRUE,
+ 'contexts' => array('profile'),
+ ));
+ } else {
+ elgg_register_menu_item('title', array(
+ 'name' => 'addfriend',
+ 'text' => elgg_view_icon('addfriend') . elgg_echo('friend:add'),
+ 'href' => "/action/friends/add?friend=$owner->guid",
+ 'is_action' => TRUE,
+ 'link_class' => 'elgg-button elgg-button-special',
+ 'contexts' => array('profile'),
+ 'priority' => 1,
+ ));
+ }
+
+ if (elgg_is_active_plugin('messages')) {
+ elgg_register_menu_item('title', array(
+ 'name' => 'message',
+ 'text' => elgg_view_icon('messages') . elgg_echo('messages:message'),
+ 'href' => "/messages/compose?send_to=$owner->guid",
+ 'link_class' => 'elgg-button elgg-button-action',
+ 'contexts' => array('profile'),
+ ));
+ }
+ }
+
+ if ($owner->guid == $user->guid) {
+ elgg_register_menu_item('title', array(
+ 'name' => 'editprofile',
+ 'href' => "/profile/$user->username/edit",
+ 'text' => elgg_echo('profile:edit'),
+ 'link_class' => 'elgg-button elgg-button-action',
+ 'contexts' => array('profile'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('groups')) {
+ $groups = $user->getGroups('', 4);
+
+ foreach ($groups as $group) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'groups',
+ 'name' => "group-$group->guid",
+ 'text' => elgg_view_icon('users') . $group->name,
+ 'href' => $group->getURL(),
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'groups-add',
+ 'section' => 'groups',
+ 'text' => elgg_view_icon('addgroup') . elgg_echo('groups:add'),
+ 'href' => "/groups/add",
+ 'contexts' => array('dashboard'),
+ 'priority' => 499,
+ ));
+
+ elgg_register_menu_item('page', array(
+ 'section' => 'groups',
+ 'name' => 'groups',
+ 'text' => elgg_echo('see:all'),
+ 'href' => "/groups/member/$user->username",
+ 'contexts' => array('dashboard'),
+ 'priority' => 500,
+ ));
+ }
+
+ if (elgg_is_active_plugin('tidypics')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'photos',
+ 'text' => elgg_view_icon('photo') . elgg_echo("photos"),
+ 'href' => "/photos/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('bookmarks')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'bookmarks',
+ 'text' => elgg_view_icon('push-pin') . elgg_echo('bookmarks'),
+ 'href' => "/bookmarks/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('blog')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'blog',
+ 'text' => elgg_view_icon('speech-bubble-alt') . elgg_echo('blog'),
+ 'href' => "/blog/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('pages')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'pages',
+ 'text' => elgg_view_icon('list') . elgg_echo('pages'),
+ 'href' => "/pages/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('file')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'files',
+ 'text' => elgg_view_icon('clip') . elgg_echo('files'),
+ 'href' => "/file/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ if (elgg_is_active_plugin('thewire')) {
+ elgg_register_menu_item('page', array(
+ 'section' => 'more',
+ 'name' => 'thewire',
+ 'text' => elgg_view_icon('share') . elgg_echo('thewire'),
+ 'href' => "/thewire/friends/$user->username",
+ 'contexts' => array('dashboard'),
+ ));
+ }
+
+ $address = urlencode(current_page_url());
+
+ if (elgg_is_active_plugin('bookmarks')) {
+ elgg_register_menu_item('extras', array(
+ 'name' => 'bookmark',
+ 'text' => elgg_view_icon('link') . elgg_echo('bookmarks:this'),
+ 'href' => "bookmarks/add/$user->guid?address=$address",
+ 'title' => elgg_echo('bookmarks:this'),
+ 'rel' => 'nofollow',
+ ));
+ }
+
+ if (elgg_is_active_plugin('reportedcontent')) {
+ elgg_unregister_menu_item('footer', 'report_this');
+
+ $href = "javascript:elgg.forward('reportedcontent/add'";
+ $href .= "+'?address='+encodeURIComponent(location.href)";
+ $href .= "+'&title='+encodeURIComponent(document.title));";
+
+ elgg_register_menu_item('extras', array(
+ 'name' => 'report_this',
+ 'href' => $href,
+ 'text' => elgg_view_icon('report-this') . elgg_echo('reportedcontent:this'),
+ 'title' => elgg_echo('reportedcontent:this:tooltip'),
+ 'priority' => 500,
+ ));
+ }
+
+ /**
+ * TOPBAR customizations
+ */
+ //Want our logo present, not Elgg's
+ $site = elgg_get_site_entity();
+ elgg_unregister_menu_item('topbar', 'elgg_logo');
+ elgg_register_menu_item('topbar', array(
+ 'href' => '/',
+ 'name' => 'logo',
+ 'priority' => 1,
+ 'text' => "<h1 id=\"facebook-topbar-logo\">$site->name</h1>",
+ ));
+
+ elgg_register_menu_item('topbar', array(
+ 'href' => '/dashboard',
+ 'name' => 'home',
+ 'priority' => 2,
+ 'section' => 'alt',
+ 'text' => elgg_echo('home'),
+ ));
+
+ if (elgg_is_active_plugin('profile')) {
+ elgg_unregister_menu_item('topbar', 'profile');
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'profile',
+ 'section' => 'alt',
+ 'text' => "<img src=\"{$user->getIconURL('topbar')}\" class=\"elgg-icon elgg-inline-block\" alt=\"$user->name\"/>" . $user->name,
+ 'href' => "/profile/$user->username",
+ 'priority' => 1,
+ ));
+ }
+
+ elgg_register_menu_item('topbar', array(
+ 'href' => "#",
+ 'name' => 'account',
+ 'priority' => 1000,
+ 'section' => 'alt',
+ 'text' => '',
+ 'data-toggle' => 'dropdown',
+ ));
+
+ elgg_unregister_menu_item('topbar', 'usersettings');
+ elgg_register_menu_item('topbar', array(
+ 'href' => "/settings/user/$user->username",
+ 'name' => 'usersettings',
+ 'parent_name' => 'account',
+ 'section' => 'alt',
+ 'text' => elgg_echo('settings:user'),
+ ));
+
+ if (elgg_is_active_plugin('notifications')) {
+ elgg_register_menu_item('topbar', array(
+ 'href' => "/notifications/personal",
+ 'name' => 'notifications',
+ 'parent_name' => 'account',
+ 'section' => 'alt',
+ 'text' => elgg_echo('notifications:personal'),
+ ));
+ }
+
+ elgg_unregister_menu_item('topbar', 'logout');
+ elgg_register_menu_item('topbar', array(
+ 'href' => '/action/logout',
+ 'is_action' => TRUE,
+ 'name' => 'logout',
+ 'parent_name' => 'account',
+ 'priority' => 1000, //want this to be at the bottom of the list no matter what
+ 'section' => 'alt',
+ 'text' => elgg_echo('logout'),
+ ));
+ }
+
+}
+
+function facebook_theme_dashboard_handler() {
+ require_once dirname(__FILE__) . '/pages/dashboard.php';
+ return true;
+}
+function cool_theme_credits_handler() {
+ require_once dirname(__FILE__) . '/pages/credits.php';
+ return true;
+}
+function facebook_theme_index_handler() {
+ if (elgg_is_logged_in()) {
+ forward('/dashboard');
+ }
+}
+
+function facebook_theme_container_permissions_handler($hook, $type, $result, $params) {
+ $container = $params['container'];
+ $subtype = $params['subtype'];
+
+ if ($container instanceof ElggGroup) {
+ if ($subtype == 'thewire') {
+ return false;
+ }
+ }
+}
+
+function facebook_theme_annotation_permissions_handler($hook, $type, $result, $params) {
+ $entity = $params['entity'];
+ $user = $params['user'];
+ $annotation_name = $params['annotation_name'];
+
+ //Users should not be able to post on their own message board
+ if ($annotation_name == 'messageboard' && $user->guid == $entity->guid) {
+ return false;
+ }
+
+ //No "commenting" on users, must use messageboard
+ if ($annotation_name == 'generic_comment' && $entity instanceof ElggUser) {
+ return false;
+ }
+
+ //No "commenting" on forum topics, must use special "reply" annotation
+ if ($annotation_name == 'generic_comment' && elgg_instanceof($entity, 'object', 'groupforumtopic')) {
+ return false;
+ }
+
+ //Definitely should be able to "like" a forum topic!
+ if ($annotation_name == 'likes' && elgg_instanceof($entity, 'object', 'groupforumtopic')) {
+ return true;
+ }
+
+ if ($annotation_name == 'group_topic_post' && !elgg_instanceof($entity, 'object', 'groupforumtopic')) {
+ return false;
+ }
+}
+
+/**
+ * Adds menu items to the "composer" at the top of the "wall". Need to also add
+ * the forms that these items point to.
+ *
+ * @todo Get the composer concept integrated into core
+ */
+function facebook_theme_composer_menu_handler($hook, $type, $items, $params) {
+ $entity = $params['entity'];
+
+ $pageowner = elgg_get_page_owner_entity();
+
+ if (elgg_is_active_plugin('thewire') && $entity->canWriteToContainer(0, 'object', 'thewire') && $pageowner->username == $_SESSION['user']->username) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'thewire',
+ 'href' => "/ajax/view/thewire/composer?container_guid=$entity->guid",
+ 'text' => elgg_view_icon('share') . elgg_echo("composer:object:thewire"),
+ 'priority' => 100,
+ ));
+
+
+ //trigger any javascript loads that we might need
+ elgg_view('thewire/composer');
+ }
+
+ if (elgg_is_active_plugin('messageboard') && $entity->canAnnotate(0, 'messageboard')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'messageboard',
+ 'href' => "/ajax/view/messageboard/composer?entity_guid=$entity->guid",
+ 'text' => elgg_view_icon('speech-bubble-alt') . elgg_echo("composer:annotation:messageboard"),
+ 'priority' => 200,
+ ));
+
+ //trigger any javascript loads that we might need
+ elgg_view('messageboard/composer');
+ }
+
+ if (elgg_is_active_plugin('bookmarks') && $entity->canWriteToContainer(0, 'object', 'bookmarks')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'bookmarks',
+ 'href' => "/ajax/view/bookmarks/composer?container_guid=$entity->guid",
+ 'text' => elgg_view_icon('push-pin') . elgg_echo("composer:object:bookmarks"),
+ 'priority' => 300,
+ ));
+
+ //trigger any javascript loads that we might need
+ elgg_view('bookmarks/composer');
+ }
+
+ if (elgg_is_active_plugin('blog') && $entity->canWriteToContainer(0, 'object', 'blog')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'blog',
+ 'href' => "/ajax/view/blog/composer?container_guid=$entity->guid",
+ 'text' => elgg_view_icon('speech-bubble') . elgg_echo("composer:object:blog"),
+ 'priority' => 600,
+ ));
+
+ //trigger any javascript loads that we might need
+ elgg_view('blog/composer');
+ }
+
+ if (elgg_is_active_plugin('file') && $entity->canWriteToContainer(0, 'object', 'file')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'file',
+ 'href' => "/ajax/view/file/composer?container_guid=$entity->guid",
+ 'text' => elgg_view_icon('clip') . elgg_echo("composer:object:file"),
+ 'priority' => 700,
+ ));
+
+ //trigger any javascript loads that we might need
+ elgg_view('file/composer');
+ }
+
+ return $items;
+}
+
+function facebook_theme_group_profile_fields($hook, $type, $fields, $params) {
+ return array(
+ 'briefdescription' => 'text',
+ 'description' => 'longtext',
+ 'interests' => 'tags',
+ );
+}
+
+function facebook_theme_owner_block_menu_handler($hook, $type, $items, $params) {
+ $owner = elgg_get_page_owner_entity();
+
+ if ($owner instanceof ElggGroup) {
+ $items['info'] = ElggMenuItem::factory(array(
+ 'name' => 'info',
+ 'text' => elgg_view_icon('info') . elgg_echo('profile:info'),
+ 'href' => "/groups/info/$owner->guid/" . elgg_get_friendly_title($owner->name),
+ 'priority' => 2,
+ ));
+
+ $items['profile'] = ElggMenuItem::factory(array(
+ 'name' => 'profile',
+ 'text' => elgg_view_icon('userwall') . elgg_echo('profile:wall'),
+ 'href' => "/groups/profile/$owner->guid/" . elgg_get_friendly_title($owner->name),
+ 'priority' => 1,
+ ));
+ }
+
+ if ($owner instanceof ElggUser) {
+ $items['info'] = ElggMenuItem::factory(array(
+ 'name' => 'info',
+ 'text' => elgg_view_icon('info') . elgg_echo('profile:info'),
+ 'href' => "/profile/$owner->username/info",
+ 'priority' => 2,
+ ));
+
+ $items['profile'] = ElggMenuItem::factory(array(
+ 'name' => 'profile',
+ 'text' => elgg_view_icon('userwall') . elgg_echo('profile:wall'),
+ 'href' => "/profile/$owner->username",
+ 'priority' => 1,
+ ));
+
+ $items['friends'] = ElggMenuItem::factory(array(
+ 'name' => 'friends',
+ 'text' => elgg_view_icon('friends') . elgg_echo('friends'),
+ 'href' => "/friends/$owner->username"
+ ));
+ }
+ $top_level_pages = elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => 'page_top',
+ 'container_guid' => $owner->guid,
+ 'limit' => 0,
+ ));
+
+ foreach ($top_level_pages as $page) {
+ $items["pages-$page->guid"] = ElggMenuItem::factory(array(
+ 'name' => "pages-$page->guid",
+ 'href' => $page->getURL(),
+ 'text' => elgg_view_icon('page') . elgg_view('output/text', array('value' => $page->title)),
+ ));
+ }
+
+ return $items;
+
+}
+
+function facebook_theme_river_menu_handler($hook, $type, $items, $params) {
+ $item = $params['item'];
+
+ $object = $item->getObjectEntity();
+ if (!elgg_in_context('widgets') && !$item->annotation_id && $object instanceof ElggEntity) {
+ if (elgg_is_active_plugin('likes') && $object->canAnnotate(0, 'likes')) {
+ if (!elgg_annotation_exists($object->getGUID(), 'likes')) {
+ $options = array(
+ 'name' => 'like',
+ 'href' => "action/likes/add?guid={$object->guid}",
+ 'text' => elgg_echo('likes:likethis'),
+ 'is_action' => true,
+ 'priority' => 100,
+ );
+ } else {
+ $options = array(
+ 'name' => 'like',
+ 'href' => "action/likes/delete?guid={$object->guid}",
+ 'text' => elgg_echo('likes:remove'),
+ 'is_action' => true,
+ 'priority' => 100,
+ );
+ }
+
+ $items[] = ElggMenuItem::factory($options);
+ }
+
+ if ($object->canAnnotate(0, 'generic_comment')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'comment',
+ 'href' => "#comments-add-$object->guid",
+ 'text' => elgg_echo('comment'),
+ 'title' => elgg_echo('comment:this'),
+ 'rel' => "toggle",
+ 'priority' => 50,
+ ));
+ }
+
+ if ($object instanceof ElggUser && !$object->isFriend() && $owner->guid != $user->guid) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'addfriend',
+ 'href' => "/action/friends/add?friend=$object->guid",
+ 'text' => elgg_view_icon('addfriend') . elgg_echo('friend:user:add', array($object->name)),
+ 'is_action' => TRUE,
+ ));
+ }
+ if (elgg_instanceof($object, 'object', 'groupforumtopic')) {
+ $items[] = ElggMenuItem::factory(array(
+ 'name' => 'reply',
+ 'href' => "#groups-reply-$object->guid",
+ 'title' => elgg_echo('reply:this'),
+ 'text' => elgg_echo('reply'),
+ ));
+ }
+ }
+
+ return $items;
+}
+
+/**
+ * Profile page handler
+ *
+ * @param array $page Array of page elements, forwarded by the page handling mechanism
+ */
+function facebook_theme_profile_page_handler($page) {
+ if (isset($page[0])) {
+ $username = $page[0];
+ $user = get_user_by_username($username);
+ elgg_set_page_owner_guid($user->guid);
+ }
+
+ // short circuit if invalid or banned username
+ if (!$user || ($user->isBanned() && !elgg_is_admin_logged_in())) {
+ register_error(elgg_echo('profile:notfound'));
+ forward();
+ }
+
+ $action = NULL;
+ if (isset($page[1])) {
+ $action = $page[1];
+ }
+
+ switch ($action) {
+ case 'edit':
+ // use for the core profile edit page
+ global $CONFIG;
+ global $autofeed;
+ $autofeed = false;
+ require $CONFIG->path . 'pages/profile/edit.php';
+ break;
+
+ case 'info':
+ require dirname(__FILE__) . '/pages/profile/info.php';
+ break;
+
+ case 'wall':
+ require dirname(__FILE__) . '/pages/profile/wall.php';
+ break;
+
+ default:
+ if (elgg_is_logged_in()) {
+ require dirname(__FILE__) . '/pages/profile/wall.php';
+ } else {
+ require dirname(__FILE__) . '/pages/profile/info.php';
+ }
+ break;
+ }
+
+ return true;
+}
+
+elgg_register_event_handler('init', 'system', 'cool_theme_init'); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/annotation/generic_comment.php b/mod/cool_theme/views/default/annotation/generic_comment.php
new file mode 100644
index 000000000..d15ae2325
--- /dev/null
+++ b/mod/cool_theme/views/default/annotation/generic_comment.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Elgg generic comment view
+ *
+ * @uses $vars['annotation'] ElggAnnotation object
+ * @uses $vars['full'] Display fill view or brief view
+ */
+
+if (!isset($vars['annotation'])) {
+ return true;
+}
+
+$full_view = elgg_extract('full', $vars, true);
+
+$comment = $vars['annotation'];
+
+$entity = get_entity($comment->entity_guid);
+$commenter = get_user($comment->owner_guid);
+if (!$entity || !$commenter) {
+ return true;
+}
+
+$friendlytime = elgg_view_friendly_time($comment->time_created);
+
+$commenter_icon = elgg_view_entity_icon($commenter, 'tiny');
+$commenter_link = "<a href=\"{$commenter->getURL()}\" class=\"elgg-river-subject\">$commenter->name</a>";
+
+$entity_title = $entity->title ? $entity->title : elgg_echo('untitled');
+$entity_link = "<a href=\"{$entity->getURL()}\">$entity_title</a>";
+
+if ($full_view) {
+
+ $delete_button = '';
+ if ($comment->canEdit()) {
+ $url = "action/comments/delete?annotation_id=$comment->id";
+ $delete_button = elgg_view("output/confirmlink", array(
+ 'href' => $url,
+ 'class' => 'right',
+ 'text' => elgg_view_icon('delete'),
+ 'confirm' => elgg_echo('deleteconfirm'),
+ 'text_encode' => false,
+ ));
+ }
+
+ $comment_text = elgg_view("output/longtext", array("value" => $comment->value));
+
+ $body = <<<HTML
+$delete_button
+$commenter_link
+$comment_text
+<span class="elgg-subtext">
+ $friendlytime
+</span>
+HTML;
+
+ echo elgg_view_image_block($commenter_icon, $body);
+
+} else {
+ // brief view
+
+ //@todo need link to actual comment!
+
+ $on = elgg_echo('on');
+
+ $body = <<<HTML
+<span class="elgg-subtext">
+ $commenter_link $on $entity_link ($friendlytime)
+</span>
+HTML;
+
+ echo elgg_view_image_block($commenter_icon, $body);
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/blog/composer.php b/mod/cool_theme/views/default/blog/composer.php
new file mode 100644
index 000000000..135e70015
--- /dev/null
+++ b/mod/cool_theme/views/default/blog/composer.php
@@ -0,0 +1,10 @@
+<?php
+elgg_load_library('elgg:blog');
+$body_vars = blog_prepare_form_vars();
+
+//hack! Elgg engine should take care of this, or blog/save form should be coded better
+if (elgg_is_xhr() && isset($vars['container_guid'])) {
+ elgg_set_page_owner_guid($vars['container_guid']);
+}
+
+echo elgg_view_form('blog/save', array(), array_merge($body_vars, $vars)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/bookmarks/composer.php b/mod/cool_theme/views/default/bookmarks/composer.php
new file mode 100644
index 000000000..52dfa69ca
--- /dev/null
+++ b/mod/cool_theme/views/default/bookmarks/composer.php
@@ -0,0 +1,3 @@
+<?php
+elgg_load_library('elgg:bookmarks');
+echo elgg_view_form('bookmarks/save', array(), $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/cool_theme/css.php b/mod/cool_theme/views/default/cool_theme/css.php
new file mode 100644
index 000000000..f0757aa00
--- /dev/null
+++ b/mod/cool_theme/views/default/cool_theme/css.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Fixes/tweaks
+ */
+
+?>
+/* <style>
+/**/
+.elgg-icon{vertical-align:middle;} dl,dt,dd{margin:0;padding:0;}.elgg-profile{display:block;}.elgg-profile > dt{float:left;width:120px;font-weight:700;color:#999;padding:10px 0;}.elgg-profile > dd{padding:10px 0 10px 120px;}.elgg-profile > dd ~ dd{border-top:1px solid #E9E9E9;}.elgg-profile > dd + dd{padding-left:0;margin-left:120px;} img{max-width:100%;}#groups-tools > .elgg-module{width:229px;}#facebook-topbar-logo{margin-top:-4px;font-size:20px;color:#FFF;text-shadow:0 0 1px #AAA;width:100px;text-align:center;}#facebook-header-logo a{color:#FFF;text-decoration:none;font-size:2.5em;}.elgg-form-small input,.elgg-form-small textarea{font-size:11px;}.elgg-image-block-small > .elgg-image{margin-right:5px;}.ui-tabs-hide{display:none;}.elgg-composer{border-top:1px solid #CCC;padding-top:6px;margin-top:7px;}.elgg-composer > h4{height:22px;display:inline-block;vertical-align:baseline;color:gray;}.elgg-composer > .ui-tabs-panel{margin-top:5px;border:1px solid #B4BBCD;padding:10px;}.messageboard-input{margin-bottom:5px;height:60px;}.elgg-attachment-description{margin-top:5px;}#thewire-form-composer #thewire-textarea{margin-top:0;}#facebook-header-login{bottom:25px;position:absolute;right:0;}#facebook-header-login label{color:#FFF;display:block;font-weight:400;padding:2px 2px 4px;}#facebook-header-login .elgg-foot > label{bottom:-16px;color:#98A9CA;cursor:pointer;left:0;position:absolute;}#facebook-header-login div{display:inline-block;margin-bottom:3px;padding-right:10px;}#facebook-header-login .elgg-input-text,#facebook-header-login .elgg-input-password{color:#000;font-size:11px;width:150px;border-color:#1D2A5B;margin:0;padding:3px 3px 4px;}#facebook-header-login .elgg-menu{position:absolute;margin-left:-160px;}#facebook-header-login .elgg-menu > li{display:inline-block;margin-right:10px;}#facebook-header-login .elgg-menu > li > a{color:#98A9CA;display:inline;}#facebook-header-login .elgg-menu > li > a:hover{text-decoration:underline;}#facebook-header-login .elgg-button-submit{position:relative;top:10px;} input[type=checkbox]{vertical-align:bottom;}.label-edit-head{ max-width: 490px;height: 100%;background-color: #eeeeee;background-repeat: repeat-x;background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee));background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 );background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);border: 1px solid #e5e5e5;-webkit-border-radius: 4px;-moz-border-radius: 4px;border-radius: 4px;margin-bottom: 5px;padding: 5px 8px;}
+.ui-autocomplete{background-color: #FFF;border: 1px solid #555;max-width:490px;}
+.elgg-autocomplete-item{border-top: 1px solid #E9E9E9;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/core/account/login_box.php b/mod/cool_theme/views/default/core/account/login_box.php
new file mode 100644
index 000000000..f39113653
--- /dev/null
+++ b/mod/cool_theme/views/default/core/account/login_box.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Elgg login box
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['module'] The module name. Default: aside
+ */
+
+$module = elgg_extract('module', $vars, 'aside');
+
+$login_url = elgg_get_site_url();
+if (elgg_get_config('https_login')) {
+ $login_url = str_replace("http:", "https:", $login_url);
+}
+
+$title = elgg_echo('login');
+$body = elgg_view_form('login', array('action' => "{$login_url}action/login"));
+
+echo elgg_view_module($module, $title, $body);
diff --git a/mod/cool_theme/views/default/core/account/login_dropdown.php b/mod/cool_theme/views/default/core/account/login_dropdown.php
new file mode 100644
index 000000000..e90cbf106
--- /dev/null
+++ b/mod/cool_theme/views/default/core/account/login_dropdown.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Elgg drop-down login form
+ */
+
+if (elgg_is_logged_in()) {
+ return true;
+}
+
+$login_url = elgg_get_site_url();
+if (elgg_get_config('https_login')) {
+ $login_url = str_replace("http:", "https:", elgg_get_site_url());
+}
+
+$body = elgg_view_form('login', array('action' => "{$login_url}action/login"), array('returntoreferer' => TRUE));
+?>
+<div id="login-dropdown">
+ <?php
+ echo elgg_view('output/url', array(
+ 'href' => 'login#login-dropdown-box',
+ 'rel' => 'popup',
+ 'class' => 'elgg-button elgg-button-dropdown',
+ 'text' => elgg_echo('login'),
+ ));
+ echo elgg_view_module('dropdown', '', $body, array('id' => 'login-dropdown-box'));
+ ?>
+</div>
diff --git a/mod/cool_theme/views/default/core/settings/account.php b/mod/cool_theme/views/default/core/settings/account.php
new file mode 100644
index 000000000..0c3792ece
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Account settings form wrapper
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+echo elgg_view_form('usersettings/save', array('class' => 'elgg-form-alt')); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/core/settings/account/default_access.php b/mod/cool_theme/views/default/core/settings/account/default_access.php
new file mode 100644
index 000000000..690f2714a
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/default_access.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Provide a way of setting your default access
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+if (elgg_get_config('allow_user_default_access')) {
+ $user = elgg_get_page_owner_entity();
+
+ if ($user) {
+ if (false === ($default_access = $user->getPrivateSetting('elgg_default_access'))) {
+ $default_access = elgg_get_config('default_access');
+ }
+
+ $title = elgg_echo('default_access:settings');
+ $content = elgg_echo('default_access:label') . ': ';
+ $content .= elgg_view('input/access', array(
+ 'name' => 'default_access',
+ 'value' => $default_access,
+ ));
+
+ echo elgg_view_module('info', $title, $content);
+ }
+}
diff --git a/mod/cool_theme/views/default/core/settings/account/email.php b/mod/cool_theme/views/default/core/settings/account/email.php
new file mode 100644
index 000000000..bb809958d
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/email.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Provide a way of setting your email
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$user = elgg_get_page_owner_entity();
+
+if ($user) {
+ $title = elgg_echo('email:settings');
+ $content = elgg_echo('email:address:label') . ' :<br /> ';
+ $content .= elgg_view('input/email', array(
+ 'name' => 'email',
+ 'value' => $user->email,
+ ));
+ echo elgg_view_module('info', $title, $content);
+}
diff --git a/mod/cool_theme/views/default/core/settings/account/language.php b/mod/cool_theme/views/default/core/settings/account/language.php
new file mode 100644
index 000000000..b36057422
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/language.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Provide a way of setting your language prefs
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$user = elgg_get_page_owner_entity();
+
+if ($user) {
+ $title = elgg_echo('user:set:language');
+ $content = elgg_echo('user:language:label') . ': ';
+ $content .= elgg_view("input/dropdown", array(
+ 'name' => 'language',
+ 'value' => $user->language,
+ 'options_values' => get_installed_translations()
+ ));
+ echo elgg_view_module('info', $title, $content);
+}
diff --git a/mod/cool_theme/views/default/core/settings/account/name.php b/mod/cool_theme/views/default/core/settings/account/name.php
new file mode 100644
index 000000000..af1b9a1a7
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/name.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Provide a way of setting your full name.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$user = elgg_get_page_owner_entity();
+if ($user) {
+ $title = elgg_echo('user:name:label');
+ $content = elgg_echo('name') . ' :<br />';
+ $content .= elgg_view('input/text', array(
+ 'name' => 'name',
+ 'value' => $user->name,
+ ));
+ echo elgg_view_module('info', $title, $content);
+
+ // need the user's guid to make sure the correct user gets updated
+ echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $user->guid));
+}
diff --git a/mod/cool_theme/views/default/core/settings/account/notifications.php b/mod/cool_theme/views/default/core/settings/account/notifications.php
new file mode 100644
index 000000000..c212b3886
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/notifications.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * User settings for notifications.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+global $NOTIFICATION_HANDLERS;
+$notification_settings = get_user_notification_settings(elgg_get_page_owner_guid());
+
+$title = elgg_echo('notifications:usersettings');
+
+$rows = '';
+
+// Loop through options
+foreach ($NOTIFICATION_HANDLERS as $k => $v) {
+
+ if ($notification_settings->$k) {
+ $val = "yes";
+ } else {
+ $val = "no";
+ }
+
+ $radio = elgg_view('input/radio', array(
+ 'name' => "method[$k]",
+ 'value' => $val,
+ 'options' => array(
+ elgg_echo('option:yes') => 'yes',
+ elgg_echo('option:no') => 'no'
+ ),
+ ));
+
+ $cells = '<td class="prm pbl">' . elgg_echo("notification:method:$k") . ': </td>';
+ $cells .= "<td>$radio</td>";
+
+ $rows .= "<tr>$cells</tr>";
+}
+
+
+$content = elgg_echo('notifications:methods');
+$content .= "<table>$rows</table>";
+
+echo elgg_view_module('info', $title, $content);
diff --git a/mod/cool_theme/views/default/core/settings/account/password.php b/mod/cool_theme/views/default/core/settings/account/password.php
new file mode 100644
index 000000000..f17f605c1
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/account/password.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * Provide a way of setting your password
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+$user = elgg_get_page_owner_entity();
+
+if ($user) {
+ $title = elgg_echo('user:set:password');
+
+ // only make the admin user enter current password for changing his own password.
+ $admin = '';
+ if (!elgg_is_admin_logged_in() || elgg_is_admin_logged_in() && $user->guid == elgg_get_logged_in_user_guid()) {
+ $admin .= elgg_echo('user:current_password:label') . ' :<br />';
+ $admin .= elgg_view('input/password', array('name' => 'current_password', 'placeholder' => '&#149;&#149;&#149;&#149;&#149;&#149;'));
+ $admin = "<p>$admin</p>";
+ }
+
+ $password = elgg_echo('user:password:label') . ' :<br />';
+ $password .= elgg_view('input/password', array('name' => 'password', 'placeholder' => '&#149;&#149;&#149;&#149;&#149;&#149;'));
+ $password = "<p>$password</p>";
+
+ $password2 = elgg_echo('user:password2:label') . ' :<br />';
+ $password2 .= elgg_view('input/password', array('name' => 'password2', 'placeholder' => '&#149;&#149;&#149;&#149;&#149;&#149;'));
+ $password2 = "<p>$password2</p>";
+
+ $content = $admin . $password . $password2;
+
+ echo elgg_view_module('info', $title, $content);
+}
diff --git a/mod/cool_theme/views/default/core/settings/statistics.php b/mod/cool_theme/views/default/core/settings/statistics.php
new file mode 100644
index 000000000..1d7a5b052
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/statistics.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * User statitsics
+ *
+ * Blank view that can be extended
+ */
diff --git a/mod/cool_theme/views/default/core/settings/statistics/numentities.php b/mod/cool_theme/views/default/core/settings/statistics/numentities.php
new file mode 100644
index 000000000..ce1705a2e
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/statistics/numentities.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Elgg statistics screen
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+// Get entity statistics
+$entity_stats = get_entity_statistics(elgg_get_logged_in_user_guid());
+
+if ($entity_stats) {
+ $rows = '';
+ foreach ($entity_stats as $k => $entry) {
+ foreach ($entry as $a => $b) {
+
+ // This function controls the alternating class
+ $even_odd = ( 'odd' != $even_odd ) ? 'odd' : 'even';
+
+ if ($a == "__base__") {
+ $a = elgg_echo("item:{$k}");
+ if (empty($a)) {
+ $a = $k;
+ }
+ } else {
+ $a = elgg_echo("item:{$k}:{$a}");
+ if (empty($a)) {
+ $a = "$k $a";
+ }
+ }
+ $rows .= <<< END
+ <tr class="{$even_odd}">
+ <td class="column-one"><b>{$a}:</b></td>
+ <td>{$b}</td>
+ </tr>
+END;
+ }
+ }
+
+ $title = elgg_echo('usersettings:statistics:label:numentities');
+ $content = "<table class=\"elgg-table-alt\">$rows</table>";
+
+ echo elgg_view_module('info', $title, $content);
+}
diff --git a/mod/cool_theme/views/default/core/settings/statistics/online.php b/mod/cool_theme/views/default/core/settings/statistics/online.php
new file mode 100644
index 000000000..ce7ff35fb
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/statistics/online.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Statistics about this user.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$user = elgg_get_logged_in_user_entity();
+
+$logged_in = 0;
+$log = get_system_log($user->guid, "login", "", 'user', '', 1);
+
+if ($log) {
+ $logged_in = $log[0]->time_created;
+}
+
+$label_name = elgg_echo('usersettings:statistics:label:name');
+$label_email = elgg_echo('usersettings:statistics:label:email');
+$label_member_since = elgg_echo('usersettings:statistics:label:membersince');
+$label_last_login = elgg_echo('usersettings:statistics:label:lastlogin');
+
+$time_created = date("r", $user->time_created);
+$last_login = date("r", $logged_in);
+
+$title = elgg_echo('usersettings:statistics:yourdetails');
+
+$content = <<<__HTML
+<table class="elgg-table-alt">
+ <tr class="odd">
+ <td class="column-one">$label_name</td>
+ <td>$user->name</td>
+ </tr>
+ <tr class="even">
+ <td class="column-one">$label_email</td>
+ <td>$user->email</td>
+ </tr>
+ <tr class="odd">
+ <td class="column-one">$label_member_since</td>
+ <td>$time_created</td>
+ </tr>
+ <tr class="even">
+ <td class="column-one">$label_last_login</td>
+ <td>$last_login</td>
+ </tr>
+</table>
+__HTML;
+
+echo elgg_view_module('info', $title, $content);
diff --git a/mod/cool_theme/views/default/core/settings/tools.php b/mod/cool_theme/views/default/core/settings/tools.php
new file mode 100644
index 000000000..195db1d61
--- /dev/null
+++ b/mod/cool_theme/views/default/core/settings/tools.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Elgg plugin specific user settings.
+ *
+ * @uses array $vars['installed_plugins'] An array of plugins as returned by elgg_get_plugins()
+ *
+ * @package Elgg.Core
+ * @subpackage Plugins.Settings
+ */
+
+// Description of what's going on
+echo elgg_view('output/longtext', array(
+ 'value' => elgg_echo("usersettings:plugins:description"),
+ 'class' => 'user-settings mtn mbm',
+));
+
+// Get the installed plugins
+$installed_plugins = $vars['installed_plugins'];
+$count = count($installed_plugins);
+
+
+// Display all plugins' usersettings forms
+foreach ($installed_plugins as $plugin) {
+ $plugin_id = $plugin->getID();
+ if ($plugin->isActive()) {
+ if (elgg_view_exists("usersettings/$plugin_id/edit")
+ || elgg_view_exists("plugins/$plugin_id/usersettings")) {
+
+ $title = $plugin->getManifest()->getName();
+ $body = elgg_view_form('plugins/usersettings/save', array(), array('entity' => $plugin));
+ echo elgg_view_module('info', $title, $body);
+ }
+ }
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/core/walled_garden/login.php b/mod/cool_theme/views/default/core/walled_garden/login.php
new file mode 100644
index 000000000..34126e411
--- /dev/null
+++ b/mod/cool_theme/views/default/core/walled_garden/login.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Walled garden login
+ */
+
+$title = elgg_get_site_entity()->name;
+
+/**
+$welcome = elgg_echo('walled_garden:welcome');
+ */
+$welcome .= $title;
+
+
+$menu = elgg_view_menu('walled_garden', array(
+ 'sort_by' => 'priority',
+ 'class' => 'elgg-menu-general elgg-menu-hz',
+));
+
+$login_box = elgg_view('core/account/login_box', array('module' => 'walledgarden-login'));
+
+$content = <<<HTML
+
+<div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner">
+ <h1 class="elgg-heading-walledgarden">$welcome</h1><br />
+ A message you can edit in cool_theme/views/default/core/walled_garden/login.php :-).<br />
+ </div>
+</div>
+<div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner">$login_box</div>
+</div>
+HTML;
+
+echo elgg_view_module('walledgarden', '', $content, array(
+ 'class' => 'elgg-walledgarden-double',
+ 'header' => ' ',
+ 'footer' => ' ',
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/buttons.php b/mod/cool_theme/views/default/css/elements/buttons.php
new file mode 100644
index 000000000..81f26950e
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/buttons.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * CSS buttons
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* <style>
+/* **************************
+ BUTTONS
+************************** */
+.elgg-button + .elgg-button {margin-left: 4px;}.elgg-button{display: inline-block;*display: inline;*zoom: 1;padding: 4px 10px 4px;margin-bottom: 0;font-size: 13px;line-height: 18px;color: #333333;text-align: center;vertical-align: middle;background-color: #f5f5f5;background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);background-image: linear-gradient(top, #ffffff, #e6e6e6);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color: #e6e6e6 #e6e6e6 #bfbfbf;border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter: progid:dximagetransform.microsoft.gradient(enabled=false);border: 1px solid #cccccc;border-bottom-color: #b3b3b3;-webkit-border-radius: 4px;-moz-border-radius: 4px;border-radius: 4px;-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);cursor: pointer;*margin-left: .3em;width:auto}.elgg-button:hover {color: #333333;text-decoration: none;background-color: #e6e6e6;background-position: 0 -15px;-webkit-transition: background-position 0.1s linear;-moz-transition: background-position 0.1s linear;-ms-transition: background-position 0.1s linear;-o-transition: background-position 0.1s linear;transition: background-position 0.1s linear;}.elgg-button:active{background:#ddd;border-bottom-color:#999;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;}.elgg-button.elgg-state-disabled{background:#F2F2F2;color:#B8B8B8;cursor:default;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;border-color:#C8C8C8;}.elgg-button-submit{ background-color: #0074cc;background-image: -moz-linear-gradient(top, #0088cc, #0055cc);background-image: -ms-linear-gradient(top, #0088cc, #0055cc);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image: -webkit-linear-gradient(top, #0088cc, #0055cc);background-image: -o-linear-gradient(top, #0088cc, #0055cc);background-image: linear-gradient(top, #0088cc, #0055cc);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color: #0055cc #0055cc #003580;border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter: progid:dximagetransform.microsoft.gradient(enabled=false);}.elgg-button-submit:active{background-color: #0055cc;}.elgg-button-submit:hover{background-color: #0055cc;}.elgg-button-submit.elgg-state-disabled{background:#ADBAD4;border-color:#94A2BF;}.elgg-button-delete{color: white;background-color: #da4f49;background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);background-image: linear-gradient(top, #ee5f5b, #bd362f);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color: #bd362f #bd362f #802420;border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter: progid:dximagetransform.microsoft.gradient(enabled=false);}.elgg-button-delete:hover {background-color: #bd362f;}.elgg-button-delete:active {background-color: #942a25 \9;}.elgg-button-delete.elgg-state-disabled{background:#999;border-color:#888;}.elgg-button-special{ background-color: #5bb75b;background-image: -moz-linear-gradient(top, #62c462, #51a351);background-image: -ms-linear-gradient(top, #62c462, #51a351);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image: -webkit-linear-gradient(top, #62c462, #51a351);background-image: -o-linear-gradient(top, #62c462, #51a351);background-image: linear-gradient(top, #62c462, #51a351);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color: #51a351 #51a351 #387038;border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter: progid:dximagetransform.microsoft.gradient(enabled=false);}.elgg-button-special:hover,.elgg-button-special:active,{background-color: #51a351;}.elgg-button-special:active,{background-color: #408140 \9;}.elgg-button-special.elgg-state-disabled{background:#B4D3A7;border-color:#9DB791;}.elgg-button-dropdown{color:#FFF;border:1px solid #71B9F7;}.elgg-button-dropdown:after{content:" \25BC ";font-size:smaller;}.elgg-button-dropdown:hover{background-color:#71B9F7;}.elgg-button-dropdown.elgg-state-active{background:#ccc;color:#333;border:1px solid #ccc;}.elgg-button-large{font-size:13px;line-height:19px;}.elgg-button-submit, .elgg-button-submit:hover, .elgg-button-delete, .elgg-button-delete:hover, .elgg-button-special, .elgg-button-special:hover {text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);color: white;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/chrome.php b/mod/cool_theme/views/default/css/elements/chrome.php
new file mode 100644
index 000000000..be2ea4fc8
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/chrome.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Visual styling
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* <style>
+/**/
+.elgg-quiet {color: #666;}.elgg-loud {color: #0054A7;}
+/* ***************************************
+ BORDERS AND SEPARATORS
+*************************************** */
+.elgg-border-plain {border: 1px solid #eeeeee;}.elgg-divide-top {border-top: 1px solid #CCCCCC;}.elgg-divide-bottom {border-bottom: 1px solid #CCCCCC;}.elgg-divide-left {border-left: 1px solid #CCCCCC;}.elgg-divide-right {border-right: 1px solid #CCCCCC;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/components.php b/mod/cool_theme/views/default/css/elements/components.php
new file mode 100644
index 000000000..5669d3c71
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/components.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Layout Object CSS
+ *
+ * Image blocks, lists, tables, gallery, messages
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+/**
+ * elgg-body fills the space available to it.
+ * It uses hidden text to expand itself. The combination of auto width, overflow
+ * hidden, and the hidden text creates this effect.
+ *
+ * This allows us to float fixed width divs to either side of an .elgg-body div
+ * without having to specify the body div's width.
+ *
+ * @todo check what happens with long <pre> tags or large images
+ * @todo Move this to its own file -- it is very complicated and should not have to be overridden.
+ */
+?>
+/* <style>
+/* ***************************************
+ Image Block
+*************************************** */
+.elgg-image-block .elgg-image {float: left;margin-right: 10px;}.elgg-image-block .elgg-image-alt {float: right;margin-left: 5px;}
+/* ***************************************
+ List
+*************************************** */
+.elgg-list{clear:both;}.elgg-list > li{border-bottom:1px solid #E9E9E9;padding:5px 0;}.elgg-list > li:last-child{border-bottom:0;}.elgg-list-item .elgg-subtext{margin-bottom:5px;}.elgg-list-content{margin:10px 5px;}
+/* ***************************************
+ Gallery
+*************************************** */
+.elgg-gallery {border: none;margin-right: auto;margin-left: auto;}.elgg-gallery td {padding: 5px;}.elgg-gallery-fluid li {float: left;}
+/* ***************************************
+ Tables
+*************************************** */
+.elgg-table td,.elgg-table th{border:1px solid #ccc;padding:4px 8px;}.elgg-table th{background-color:#ddd;}.elgg-table tr:nth-child(odd),.elgg-table tr.odd{background-color:#fff;}.elgg-table tr:nth-child(even),.elgg-table tr.even{background-color:#f0f0f0;}.elgg-table-alt td{border-bottom:1px solid #ccc;padding:2px 4px;}.elgg-table-alt td:first-child{width:200px;}.elgg-table-alt tr:hover{background:#E4E4E4;}.elgg-table,.elgg-table-alt{width:100%;border-top:1px solid #ccc;}
+/* ***************************************
+ Owner Block
+*************************************** */
+.elgg-owner-block {margin-bottom: 20px;}
+/* ***************************************
+ Messages
+*************************************** */
+.elgg-message{color:#FFF;font-weight:700;display:block;cursor:pointer;opacity:0.9;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.45);-moz-box-shadow:0 2px 5px rgba(0,0,0,0.45);box-shadow:0 2px 5px rgba(0,0,0,0.45);-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;padding:3px 10px;}.elgg-state-success{background-color:#000;}.elgg-state-error{background-color:red;}.elgg-state-notice{background-color:#4690D6;}
+/* ***************************************
+ River
+*************************************** */
+.elgg-river > li{border-bottom:1px solid #E9E9E9;padding:10px 35px 10px 0;}.elgg-river-item{padding:7px 0;}.elgg-river-timestamp{color:#888;margin-top:3px;display:inline-block;}.elgg-river-summary{font-weight:400;font-size:11px;color:gray;}.elgg-river-subject,.elgg-river-target{font-weight:700;}.elgg-river-message,.elgg-river-attachments{background-color:#f2f2f2;margin-top:5px;margin-bottom:5px;min-height:10px;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);padding:10px;}.elgg-river-responses{position:relative;padding-top:5px;}.elgg-river-responses:before{width:0;height:0;font-size:0;line-height:0;display:block;clear:both;content:" ";border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #E9E9E9;position:absolute;top:0;left:15px;}.elgg-river-responses > div,.elgg-river-responses > form,.elgg-river-responses > ul > li {background-color: #E9E9E9;border-bottom: 1px solid #E9E9E9;margin-bottom: 2px;padding: 4px;}
+<?php //@todo location-dependent styles ?>
+.elgg-river-layout .elgg-input-dropdown {float: right;margin: 10px 0;}.elgg-river-comments {margin: 0;border-top: none;}.elgg-river-more {background-color: #EEE;-webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;padding: 2px 4px;font-size: 85%;margin-bottom: 2px;}
+/* ***************************************
+ Tags
+*************************************** */
+.elgg-tags {display: inline;font-size: 85%;}.elgg-tags li {display: inline;margin-right: 5px;}.elgg-tags li:after {content: ",";}.elgg-tags li:last-child:after {content: "";}.elgg-tagcloud {text-align: justify;}
+/* MISCELLANEOUS */
+.elgg-photo {border: 1px solid #ccc;padding: 3px;background-color: white;}.elgg-comments {margin-top: 25px;}.elgg-comments > form {margin-top: 15px;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/forms.php b/mod/cool_theme/views/default/css/elements/forms.php
new file mode 100644
index 000000000..8b3967a94
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/forms.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * CSS form/input elements
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* <style>
+/* ***************************************
+ Form Elements
+*************************************** */
+fieldset>div{margin-bottom:15px}fieldset>div:last-child{margin-bottom:0}label{font-weight:bold;}input,textarea{max-width: 490px;font-family:"Lucida Grande",Tahoma,Verdana,Arial,sans-serif;border:1px solid #cacaca;padding:.5em;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition: border linear 0.2s, box-shadow linear 0.2s;-moz-transition: border linear 0.2s, box-shadow linear 0.2s;-ms-transition: border linear 0.2s, box-shadow linear 0.2s;-o-transition: border linear 0.2s, box-shadow linear 0.2s;transition: border linear 0.2s, box-shadow linear 0.2s;}input:focus,textarea:focus {border-color: rgba(82,168,236,.8);-webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);outline: 0;}textarea{height:200px}.elgg-longtext-control{float:right;margin-left:14px;font-size:80%;cursor:pointer}.elgg-input-access{margin:5px 0 0 0}input[type="checkbox"],input[type="radio"]{margin:0 3px 0 0;padding:0;border:0;width:auto}.elgg-input-checkboxes.elgg-horizontal li,.elgg-input-radio.elgg-horizontal li{display:inline;padding-right:10px}.ui-datepicker{background:white;border-bottom:2px solid #293e6c}.ui-datepicker-header{text-align:center;background:#6d84b7;color:white;font-weight:bold;padding:3px 3px 4px;vertical-align:center;border:1px solid #3a589b;border-width:0 1px}.ui-datepicker-next,.ui-datepicker-prev{text-decoration:none;color:white;width:14.2857%}.ui-datepicker-next{padding-right:3px;float:right}.ui-datepicker-prev{padding-left:3px;float:left}.ui-datepicker-calendar{width:100%;border-collapse:separate;border:1px solid #777;border-width:0 1px}.ui-datepicker-calendar th{background:#f2f2f2;border-bottom:1px solid #BBB;font-size:9px;font-weight:bold;padding:3px 2px;text-align:center}.ui-datepicker-calendar td{padding:0}.ui-datepicker-calendar a{display:block;margin:1px;padding:4px;border:1px solid white;color:#666;cursor:pointer;text-align:center;text-decoration:none}.ui-datepicker-calendar .ui-datepicker-current-day>a{font-weight:bold;background:#DDD}.ui-datepicker-calendar .ui-state-hover{color:#3b5998;border-color:#bec8dd;background-color:#dfe4ee}
+/* ***************************************
+ FRIENDS PICKER
+*************************************** */
+.friends-picker-container h3{font-size:4em!important;text-align:left;margin:10px 0 20px!important;color:#999!important;background:none!important;padding:0!important}.friends-picker .friends-picker-container .panel ul{text-align:left;margin:0;padding:0}.friends-picker-wrapper{margin:0;padding:0;position:relative;width:100%}.friends-picker{position:relative;overflow:hidden;margin:0;padding:0;width:730px;height:auto;background-color:#dedede;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px}.friendspicker-savebuttons{background:white;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px;margin:0 10px 10px}.friends-picker .friends-picker-container{position:relative;left:0;top:0;width:100%;list-style-type:none}.friends-picker .friends-picker-container .panel{float:left;height:100%;position:relative;width:730px;margin:0;padding:0}.friends-picker .friends-picker-container .panel .wrapper{margin:0;padding:4px 10px 10px 10px;min-height:230px}.friends-picker-navigation{margin:0 0 10px;padding:0 0 10px;border-bottom:1px solid #ccc}.friends-picker-navigation ul{list-style:none;padding-left:0}.friends-picker-navigation ul li{float:left;margin:0;background:white}.friends-picker-navigation a{font-weight:bold;text-align:center;background:white;color:#999;text-decoration:none;display:block;padding:0;width:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tabHasContent{background:white;color:#333!important}.friends-picker-navigation li a:hover{background:#333;color:white!important}.friends-picker-navigation li a.current{background:#4690d6;color:white!important}.friends-picker-navigation-l,.friends-picker-navigation-r{position:absolute;top:46px;text-indent:-9000em}.friends-picker-navigation-l a,.friends-picker-navigation-r a{display:block;height:40px;width:40px}.friends-picker-navigation-l{right:48px;z-index:1}.friends-picker-navigation-r{right:0;z-index:1}.friends-picker-navigation-l{background:url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat left top}.friends-picker-navigation-r{background:url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat -60px top}.friends-picker-navigation-l:hover{background:url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat left -44px}.friends-picker-navigation-r:hover{background:url("<?php echo elgg_get_site_url(); ?>_graphics/friendspicker.png") no-repeat -60px -44px}.friendspicker-savebuttons .elgg-button-submit,.friendspicker-savebuttons .elgg-button-cancel{margin:5px 20px 5px 5px}.friendspicker-members-table {background: #dedede;-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;margin:10px 0 0;padding:10px 10px 0;}
+/* ***************************************
+ USER PICKER
+*************************************** */
+.user-picker .user-picker-entry {clear:both;height:25px;padding:5px;margin-top:5px;border-bottom:1px solid #cccccc;}.user-picker-entry .elgg-button-delete {margin-right:10px;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/icons.php b/mod/cool_theme/views/default/css/elements/icons.php
new file mode 100644
index 000000000..bbf48696c
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/icons.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Elgg icons
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+
+?>
+/* <style>
+/* ***************************************
+ ICONS
+*************************************** */
+.elgg-icon {background: transparent url(<?php echo elgg_get_site_url(); ?>mod/WISB/_graphics/elgg_sprites.png) no-repeat left;width: 16px;height: 16px;margin: 0 2px;}.elgg-icon-arrow-left{background-position:0 0;}.elgg-icon-arrow-right{background-position:0 -18px;}.elgg-icon-arrow-two-head{background-position:0 -36px;}.elgg-icon-attention{background-position:0 -54px;}.elgg-icon-userwall{background-position:0 -72px;}.elgg-icon-calendar{background-position:0 -90px;}.elgg-icon-cell-phone{background-position:0 -108px;}.elgg-icon-checkmark:hover{background-position:0 -126px;}.elgg-icon-checkmark{background-position:0 -144px;}.elgg-icon-clip:hover{background-position:0 -162px;}.elgg-icon-clip{background-position:0 -180px;}.elgg-icon-cursor-drag-arrow{background-position:0 -198px;}.elgg-icon-delete-alt:hover{background-position:0 -216px;}.elgg-icon-delete-alt{background-position:0 -234px;}.elgg-icon-delete:hover{background-position:0 -252px;}.elgg-icon-delete{background-position:0 -270px;}.elgg-icon-download:hover{background-position:0 -288px;}.elgg-icon-download{background-position:0 -306px;}.elgg-icon-eye{background-position:0 -324px;}.elgg-icon-chat{background-position:0 -342px;}.elgg-icon-grid:hover{background-position:0 -360px;}.elgg-icon-grid{background-position:0 -378px;}.elgg-icon-home:hover{background-position:0 -396px;}.elgg-icon-home{background-position:0 -414px;}.elgg-icon-hover-menu:hover{background-position:0 -432px;}.elgg-icon-hover-menu{background-position:0 -450px;}.elgg-icon-info{background-position:0 -468px;}.elgg-icon-addfriend{background-position:0 -486px;}.elgg-icon-link:hover{background-position:0 -504px;}.elgg-icon-link{background-position:0 -522px;}.elgg-icon-list{background-position:0 -540px;}.elgg-icon-lock-closed{background-position:0 -558px;}.elgg-icon-lock-open{background-position:0 -576px;}.elgg-icon-mail-alt:hover{background-position:0 -594px;}.elgg-icon-mail-alt{background-position:0 -612px;}.elgg-icon-messages{background-position:0 -648px;}.elgg-icon-photo{background-position:0 -666px;}.elgg-icon-print-alt{background-position:0 -684px;}.elgg-icon-print{background-position:0 -702px;}.elgg-icon-push-pin{background-position:0 -720px;}.elgg-icon-newsfeed{background-position:0 -738px;}.elgg-icon-redo{background-position:0 -756px;}.elgg-icon-refresh:hover{background-position:0 -774px;}.elgg-icon-refresh{background-position:0 -792px;}.elgg-icon-round-arrow-left{background-position:0 -810px;}.elgg-icon-round-arrow-right{background-position:0 -828px;}.elgg-icon-round-checkmark{background-position:0 -846px;}.elgg-icon-round-minus{background-position:0 -864px;}.elgg-icon-round-plus{background-position:0 -882px;}.elgg-icon-rss{background-position:0 -900px;}.elgg-icon-search-focus{background-position:0 -918px;}.elgg-icon-search{background-position:0 -936px;}.elgg-icon-settings-alt:hover{background-position:0 -954px;}.elgg-icon-settings-alt{background-position:0 -972px;}.elgg-icon-settings{background-position:0 -990px;}.elgg-icon-share{background-position:0 -1008px;}.elgg-icon-addgroup{background-position:0 -1026px;}.elgg-icon-shop-cart:hover{background-position:0 -1044px;}.elgg-icon-shop-cart{background-position:0 -1062px;}.elgg-icon-speech-bubble-alt:hover{background-position:0 -1080px;}.elgg-icon-speech-bubble-alt{background-position:0 -1098px;}.elgg-icon-speech-bubble:hover{background-position:0 -1116px;}.elgg-icon-speech-bubble{background-position:0 -1134px;}.elgg-icon-star-alt{background-position:0 -1152px;}.elgg-icon-star-empty:hover{background-position:0 -1170px;}.elgg-icon-star-empty{background-position:0 -1188px;}.elgg-icon-star:hover{background-position:0 -1206px;}.elgg-icon-star{background-position:0 -1224px;}.elgg-icon-tag:hover{background-position:0 -1242px;}.elgg-icon-tag{background-position:0 -1260px;}.elgg-icon-thumbs-down-alt:hover{background-position:0 -1278px;}.elgg-icon-thumbs-down:hover,.elgg-icon-thumbs-down-alt{background-position:0 -1296px;}.elgg-icon-thumbs-down{background-position:0 -1314px;}.elgg-icon-thumbs-up-alt:hover{background-position:0 -1332px;}.elgg-icon-thumbs-up:hover,.elgg-icon-thumbs-up-alt{background-position:0 -1350px;}.elgg-icon-thumbs-up{background-position:0 -1368px;}.elgg-icon-trash{background-position:0 -1386px;}.elgg-icon-twitter{background-position:0 -1404px;}.elgg-icon-undo{background-position:0 -1422px;}.elgg-icon-user:hover{background-position:0 -1440px;}.elgg-icon-user{background-position:0 -1458px;}.elgg-icon-users{background-position:0 -1476px;}.elgg-icon-friends{background-position:0 -1494px;}.elgg-icon-video{background-position:0 -1512px;}.elgg-avatar > .elgg-icon-hover-menu{display:none;position:absolute;right:0;bottom:0;cursor:pointer;margin:0;}.elgg-icon-mail:hover,.elgg-icon-mail{background-position:0 -630px;}.elgg-ajax-loader {background: white url(<?php echo elgg_get_site_url(); ?>mod/WISB/_graphics/ajax_loader_bw.gif) no-repeat center center;min-height: 33px;min-width: 33px;}
+/* ***************************************
+ AVATAR ICONS
+*************************************** */
+.elgg-avatar{position:relative;display:inline-block;}.elgg-avatar-tiny > a > img{width:25px;height:25px;}.elgg-avatar-small > a > img{width:40px;height:40px;}.elgg-avatar-medium > a > img{width:100px;height:100px;}.elgg-avatar-large > a > img{width:200px;height:180px;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/layout.php b/mod/cool_theme/views/default/css/elements/layout.php
new file mode 100644
index 000000000..cb9e8caa3
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/layout.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Page Layout
+ *
+ * Contains CSS for the page shell and page layout
+ *
+ * Default layout: 981px wide, centered. Used in default page shell
+ *
+ */
+?>
+/* <style>
+/* ***************************************
+ PAGE LAYOUT
+*************************************** */
+/***** DEFAULT LAYOUT ******/
+.elgg-page-default .elgg-page-header > .elgg-inner {width: 981px;margin: 0 auto;height: 90px;}.elgg-page-default .elgg-page-body > .elgg-inner {width: 981px;margin: 0 auto;}.elgg-page-footer {width: 981px;margin: 0 auto;}.elgg-page-default .elgg-page-footer > .elgg-inner {margin-left: 181px;padding: 8px;}.elgg-page-footer > .elgg-inner:after {display:block;content: '.';clear:both;visibility:hidden;height:0;}
+/***** TOPBAR ******/
+.elgg-page-topbar {position: fixed;right: 0;left: 0;z-index: 1030;margin-bottom: 0;padding-left: 20px;padding-right: 20px;background-color: #2c2c2c;background-image: -moz-linear-gradient(top, #333333, #222222);background-image: -ms-linear-gradient(top, #333333, #222222);background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image: -webkit-linear-gradient(top, #333333, #222222);background-image: -o-linear-gradient(top, #333333, #222222);background-image: linear-gradient(top, #333333, #222222);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);}.elgg-page-topbar > .elgg-inner {padding-top: 6px;width: 981px;margin: 0 auto;position: relative;}.elgg-page-topbar ~ .elgg-page-body {padding-top: 38px;}
+/***** PAGE MESSAGES ******/
+.elgg-system-messages {position: fixed;top: 24px;right: 20px;max-width: 500px;z-index: 1000;}.elgg-system-messages li {margin-top: 10px;}.elgg-system-messages li p {margin: 0;}
+/***** PAGE HEADER ******/
+.elgg-page-header {position: relative;background: #3D3D3D;}.elgg-page-header > .elgg-inner {position: relative;}
+/***** PAGE BODY LAYOUT ******/
+.elgg-layout {min-height: 360px;}.elgg-layout-one-column {padding: 10px 0;}.elgg-sidebar {position: relative;padding: 20px 0;float: left;width: 181px;min-height: 360px;}.elgg-sidebar-alt {position: relative;float: right;width: 244px;margin-left: 20px;min-height: 360px;}.elgg-main {position: relative;min-height: 360px;}.elgg-layout-two-sidebar > .elgg-body,.elgg-layout-one-sidebar > .elgg-body {border: 1px solid #B3B3B3;border-top: 0;padding: 15px 20px;}.elgg-layout > .elgg-body > .elgg-head {padding-bottom: 3px;margin-bottom: 10px;}
+/***** PAGE FOOTER ******/
+.elgg-page-footer {position: relative;color: #999;}.elgg-page-footer a:hover {color: #666;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/modules.php b/mod/cool_theme/views/default/css/elements/modules.php
new file mode 100644
index 000000000..6182083b9
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/modules.php
@@ -0,0 +1,12 @@
+/* <style>
+/* ***************************************
+ Modules
+*************************************** */
+/* Info */
+.elgg-module-info > .elgg-head {max-width: 490px;height: 100%;background-color: #eeeeee;background-repeat: repeat-x;background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee));background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 );background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%);border: 1px solid #e5e5e5;-webkit-border-radius: 4px;-moz-border-radius: 4px;border-radius: 4px;margin-bottom: 5px;padding: 5px 8px;}.elgg-module-aside {margin-bottom: 15px;}.elgg-module-aside > .elgg-head {background-color: #F2F2F2;border-bottom: none;border-top: solid 1px #E2E2E2;padding: 4px 5px 5px;margin-bottom: 5px;}.elgg-module-aside > .elgg-head > h3 {font-size: 1em;}.elgg-module-aside > .elgg-body {padding: 0 5px;}.elgg-module-popup {background-color: white;z-index: 9999;margin-bottom: 0;box-shadow: 0 0 0 5px rgba(82, 82, 82, 0.7);border-radius: 3px;}.elgg-module-popup > .elgg-head, .elgg-module-popup > a > .elgg-head {background: #E9E9E9;border: 1px solid #555;border-bottom: none;font-size: 10px;font-weight: bold;margin: 0;padding: 5px 10px;}.elgg-module-popup > .elgg-head > h3{color: white;}.elgg-module-popup > .elgg-body {background: white;border: 1px solid #555;border-top: 0;padding: 10px;}.elgg-module-popup > .elgg-foot {margin-top: -1px;border: 1px solid #3B5998;border-top-color: #CCC;background: #F2F2F2;padding: 8px 10px;text-align:right;}.elgg-module-dropdown {background-color: white;border: 1px solid #333;border-bottom: 2px solid #293E6A;z-index:100;}.elgg-module-dropdown > .elgg-body {padding: 8px;}.elgg-module-dropdown > .elgg-head {margin: 7px 8px 0;border-bottom: 1px solid #AAA;padding-bottom: .5em;}.elgg-module-dropdown > .elgg-foot {text-align: center;}.elgg-module-featured {background-color: #F2F2F2;border: 1px solid #CCC;padding: 10px;margin-bottom: 20px;}.elgg-module-featured > .elgg-head {margin-bottom: 10px;}
+/* ***************************************
+ Widgets
+*************************************** */
+.elgg-widgets {float: right;min-height: 30px;}.elgg-widget-add-control {text-align: right;margin: 5px 5px 15px;}.elgg-widgets-add-panel {padding: 10px;margin: 0 5px 15px;background: #dedede;border: 2px solid #ccc;}
+<?php //@todo location-dependent style: make an extension of elgg-gallery ?>
+.elgg-widgets-add-panel li {float: left;margin: 2px 10px;width: 200px;padding: 4px;background-color: #ccc;border: 2px solid #b0b0b0;font-weight: bold;}.elgg-widgets-add-panel li a {display: block;}.elgg-widgets-add-panel .elgg-state-available {color: #333;cursor: pointer;}.elgg-widgets-add-panel .elgg-state-available:hover {background-color: #bcbcbc;}.elgg-widgets-add-panel .elgg-state-unavailable {color: #888;}.elgg-module-widget {background-color: #dedede;padding: 2px;margin: 0 5px 15px;position: relative;}.elgg-module-widget:hover {background-color: #ccc;}.elgg-module-widget > .elgg-head {background-color: #dedede;height: 30px;line-height: 30px;overflow: hidden;}.elgg-module-widget > .elgg-head h3 {float: left;padding: 0 45px 0 20px;color: #333;}.elgg-module-widget.elgg-state-draggable > .elgg-head {cursor: move;}.elgg-module-widget > .elgg-head a {position: absolute;top: 5px;display: inline-block;width: 18px;height: 18px;padding: 2px 2px 0 0;border: 1px solid transparent;}a.elgg-widget-collapse-button {left: 5px;background:transparent url(<?php echo elgg_get_site_url(); ?>_graphics/elgg_sprites.png) no-repeat 0px -385px;}a.elgg-widget-collapsed {background-position: 0px -365px;}a.elgg-widget-delete-button {right: 5px;}a.elgg-widget-edit-button {right: 25px;}a.elgg-widget-edit-button:hover, a.elgg-widget-delete-button:hover {border: 1px solid #ccc;}.elgg-module-widget > .elgg-body {background-color: white;width: 100%;overflow: hidden;}.elgg-widget-edit {display: none;width: 96%;padding: 2%;border-bottom: 2px solid #dedede;}.elgg-widget-content {padding: 10px;}.elgg-widget-placeholder {border: 2px dashed #dedede;margin-bottom: 15px;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/navigation.php b/mod/cool_theme/views/default/css/elements/navigation.php
new file mode 100644
index 000000000..0bd90c02a
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/navigation.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Navigation
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* <style>
+/* ***************************************
+ PAGINATION
+*************************************** */
+.elgg-menu > li > a:hover,.elgg-menu > li > a{text-decoration:none;}.elgg-menu-owner-block li > a > .elgg-icon,.elgg-menu-extras li > a > .elgg-icon,.elgg-menu-page li > a > .elgg-icon,.elgg-menu-composer li > a > .elgg-icon{margin-left:-20px;margin-right:4px;}.elgg-pagination{display:block;border:1px solid #CCC;background:#F7F7F7;text-align:center;border-width:1px 0;}.elgg-pagination > li{display:inline-block;}.elgg-pagination > li > a,.elgg-pagination > li > span{font-size:13px;font-weight:700;text-align:center;display:block;margin:3px 11px 0 0;padding:3px 4px 4px;}.elgg-pagination > li > a:hover{background:#3B5998;color:#FFF;text-decoration:none;}.elgg-pagination > .elgg-state-selected > span{border-bottom:2px solid #3B3B3B;}
+/* ***************************************
+ TABS
+*************************************** */
+.elgg-tabs{border-bottom:1px solid #D8DFEA;display:block;width:100%;padding-left:15px;}.elgg-tabs > li{display:inline-block;background:#D8DFEA;border:1px solid #D8DFEA;border-bottom:0;margin:2px 2px -1px 0;}.elgg-tabs > :hover{background:#627AAD;border:1px solid #627AAD;border-bottom:0;}.elgg-tabs > li > a{font-size:13px;font-weight:700;text-align:center;display:block;padding:3px 11px 4px;}.elgg-tabs > :hover > a{color:#FFF;text-decoration:none;}.elgg-tabs > .elgg-state-selected{border:1px solid #D8DFEA;border-bottom:0;margin-top:0;}.elgg-tabs > .elgg-state-selected > a,.elgg-tabs > .elgg-state-selected:hover > a{background:#FFF;color:#333;padding:5px 10px 4px;}
+/* ***************************************
+ BREADCRUMBS
+*************************************** */
+.elgg-breadcrumbs{font-size:80%;font-weight:700;line-height:1.2em;color:#bababa;}.elgg-breadcrumbs > li{display:inline-block;}.elgg-breadcrumbs > li:after{content:"\003E";font-weight:400;padding:0 4px;}.elgg-breadcrumbs > li > a{display:inline-block;color:#999;}.elgg-breadcrumbs > li > a:hover{color:#0054a7;text-decoration:underline;}
+/* ***************************************
+ TOPBAR MENU
+*************************************** */
+.elgg-menu-topbar{float:left;}.elgg-menu-topbar > li{float:left;position:relative;}.elgg-menu-topbar > li > a{color:#FFF;display:block;font-weight:700;height:24px;}.elgg-menu-topbar-default > li > a{margin:0 1px;padding:8px 4px 0;}.elgg-menu-topbar-alt{float:right;margin-right:1px;}.elgg-menu-topbar-alt > li > a{padding:8px 7px 0;}.elgg-menu-topbar .elgg-menu-parent:after{content:" \25BC ";font-size:smaller;}.elgg-menu-topbar .elgg-child-menu{background:#FFF;border:1px solid #333;border-bottom:2px solid #3D3D3D;margin-right:-1px;margin-top:-1px;min-width:200px;position:absolute;right:0;top:100%;display:none;z-index:1;padding:4px 0;}.elgg-menu-topbar .elgg-child-menu.elgg-state-active{display:block;}.elgg-menu-topbar .elgg-child-menu > li > a{border-bottom:1px solid #FFF;border-top:1px solid #FFF;color:#333;display:block;font-weight:400;height:18px;line-height:18px;white-space:nowrap;padding:0 22px;}.elgg-menu-topbar .elgg-child-menu > li > a:hover{background:#5B5B5B;border-bottom:1px solid #3D3D3D;border-top:1px solid #3D3D3D;color:#FFF;text-decoration:none;}.elgg-menu-topbar > li > .elgg-menu-opened,.elgg-menu-topbar > li > .elgg-menu-opened:hover{background:#FFF;border:1px solid #333;border-bottom:0;color:#333;position:relative;z-index:2;margin:-1px -1px 0;}.elgg-menu-topbar-default > li > a:hover,.elgg-menu-topbar-alt > li > a:hover{background:#5B5B5B;}
+/* ***************************************
+ SITE MENU
+*************************************** */
+.elgg-menu-site:after{content:'.';clear:both;display:block;height:0;line-height:0;}.elgg-menu-site{background:#ECEFF5;}.elgg-menu-site > li{float:left;}.elgg-menu-site > li > a{padding:8px 10px;}.elgg-menu-site > li > a:hover{background:#FFF;}
+/* ***************************************
+ TITLE
+*************************************** */
+.elgg-menu-title {float: right;}.elgg-menu-title > li {display: inline-block;margin-left: 4px;}
+/* ***************************************
+ FILTER MENU
+*************************************** */
+.elgg-menu-filter{display:table;;padding-left:10px;}
+.elgg-menu-filter:after{content:'.';display: table;clear:both;visibility:hidden;height:0;line-height:0;}
+.elgg-menu-filter > li{float: left;padding-top: 5px;padding-bottom: 5px;padding-right: 12px;
+padding-left: 12px;
+margin-right: 2px;
+line-height: 14px;}
+.elgg-menu-filter > .elgg-state-selected, .elgg-menu-filter > li > a{padding-top: 5px;padding-bottom: 5px;margin-top: 2px;margin-bottom: 2px;-webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius: 5px;color:#08C;}
+.elgg-menu-filter > .elgg-state-selected{color: white;background-color: #08C;}
+.elgg-menu-filter .elgg-state-selected a{color: white;background-color: #08C;}
+/* ***************************************
+ PAGE MENU
+*************************************** */
+.elgg-menu-page{border-bottom:1px solid #EEE;margin-bottom:7px;padding-bottom:7px;}.elgg-menu-page li > a{display:block;color:#333;margin-bottom:1px;padding:3px 8px 3px 26px;}.elgg-menu-page li > a:hover{background-color:#EEE;}.elgg-menu-page li.elgg-state-selected > a{background-color:#E9E9E9;font-weight:700;}.elgg-menu-page .elgg-child-menu{display:none;margin-left:15px;}.elgg-menu-page .elgg-menu-closed:before,.elgg-menu-page .elgg-menu-opened:before{display:inline-block;padding-right:4px;}.elgg-menu-page .elgg-menu-closed:before{content:"\002B";}.elgg-menu-page .elgg-menu-opened:before{content:"\002D";}
+/* ***************************************
+ HOVER MENU
+*************************************** */
+.elgg-menu-hover{display:none;position:absolute;z-index:10000;width:165px;border:solid 1px;background-color:#FFF;-webkit-box-shadow:2px 2px 6px rgba(0,0,0,0.50);-moz-box-shadow:2px 2px 6px rgba(0,0,0,0.50);box-shadow:2px 2px 6px rgba(0,0,0,0.50);border-color:#E5E5E5 #999 #999 #E5E5E5;}.elgg-menu-hover > li{border-bottom:1px solid #ddd;}.elgg-menu-hover > li:last-child{border-bottom:none;}.elgg-menu-hover .elgg-heading-basic{display:block;}.elgg-menu-hover a{font-size:92%;padding:2px 8px;}.elgg-menu-hover a:hover{background:#ccc;}.elgg-menu-hover-admin a{color:red;}.elgg-menu-hover-admin a:hover{color:#FFF;background-color:red;}
+/* ***************************************
+ FOOTER
+*************************************** */
+.elgg-menu-footer > li,.elgg-menu-footer > li > a {color:#999;display: inline-block;}.elgg-menu-footer > li:after {content: " \00B7 ";padding: 0 4px;}.elgg-menu-footer-default {float:right;}.elgg-menu-footer-alt {float: left;}
+/* ***************************************
+ ENTITY
+*************************************** */
+.elgg-menu-entity{float:right;margin-left:15px;font-size:90%;color:#aaa;}.elgg-menu-entity > li{display:inline-block;margin-left:15px;}.elgg-menu-entity > li > a{color:#aaa;}
+/* ***************************************
+ OWNER BLOCK
+*************************************** */
+.elgg-menu-owner-block li > a{border-bottom:1px solid #D8DFEA;padding:3px 8px 3px 26px;}.elgg-menu-owner-block li > a:hover{background-color:#EEE;color:0;}.elgg-menu-owner-block .elgg-state-selected > a{background-color:#E9E9E9;}.elgg-menu-owner-block .elgg-menu > li > a{padding-left:44px;}
+/* ***************************************
+ LONGTEXT
+*************************************** */
+.elgg-menu-longtext {float: right;}
+/* ***************************************
+ RIVER
+*************************************** */
+.elgg-menu-river{color:#888;display:inline-block;margin:3px 0 0 -3px;}.elgg-menu-river > li{display:inline;}.elgg-menu-river > li:before{content:" \00B7 ";display:inline-block;margin:0 3px;} .elgg-menu-river > li > a{color:#3D3D3D;display:inline;}.elgg-menu-river > li > a:hover{text-decoration:underline;}
+/* ***************************************
+ SIDEBAR EXTRAS (rss, bookmark, etc)
+*************************************** */
+.elgg-menu-extras > li > a {padding: 3px 8px 3px 26px;}.elgg-menu-extras > li > a:hover {text-decoration:underline;}
+/* ***************************************
+ COMPOSER
+*************************************** */
+.elgg-menu-composer{display:inline-block;height:22px;}.elgg-menu-composer > li{font-weight:700;margin-left:10px;}.elgg-menu-composer > li > a{line-height:16px;padding-left:20px;}.elgg-menu-composer > li > a:hover{text-decoration:underline;}.elgg-menu-composer > li.ui-state-active > a{cursor:default;color:#000;text-decoration:none;}.elgg-menu-composer > .ui-state-active > a:before,.elgg-menu-composer > .ui-state-active > a:after{position:absolute;display:block;content:" ";height:0;width:0;left:0;border-style:solid;border-width:8px;}.elgg-menu-composer > .ui-state-active > a:before{top:11px;border-color:transparent transparent #B4BBCD;}.elgg-menu-composer > .ui-state-active > a:after{top:12px;border-color:transparent transparent #FFF;}
+/* ***************************************
+ SCROLLBAR
+*************************************** */
+::-webkit-scrollbar{width:10px;height:10px;}::-webkit-scrollbar-track-piece{background-color:#EEE;-webkit-border-radius:0;-webkit-border-bottom-right-radius:8px;-webkit-border-bottom-left-radius:8px;}::-webkit-scrollbar-thumb:vertical{height:50px;background-color:#999;-webkit-border-radius:8px;}::-webkit-scrollbar-thumb:horizontal{width:50px;background-color:#999;-webkit-border-radius:8px;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/elements/typography.php b/mod/cool_theme/views/default/css/elements/typography.php
new file mode 100644
index 000000000..459b33710
--- /dev/null
+++ b/mod/cool_theme/views/default/css/elements/typography.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * CSS typography
+ *
+ * @package Elgg.Core
+ * @subpackage UI
+ */
+?>
+/* <style>
+/* ***************************************
+ Typography
+*************************************** */
+body{font-size:11px;font-family:"Lucida Grande", Tahoma, Verdana, Arial, sans-serif;color:#3D3D3D;}a{color:#3D3D3D;cursor:pointer;}pre,code{font-family:Monaco, "Courier New", Courier, monospace;font-size:12px;background:#EBF5FF;color:#000;overflow:auto;overflow-x:auto;white-space:pre-wrap;word-wrap:break-word;}blockquote{line-height:1.3em;background:#EBF5FF;border:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0 0 15px;padding:3px 15px;}h1,h2,h3,h4,h5,h6{font-weight:700;color:#3D3D3D;}h1{font-size:1.8em;}h2{font-size:1.5em;line-height:1.1em;padding-bottom:5px;}h3{font-size:1.2em;}h4{font-size:1em;}h5{font-size:.9em;}h6{font-size:.8em;}a:hover{text-decoration:underline;}p{margin-bottom:15px;}p:last-child{margin-bottom:0;}dt{font-weight:700;}dd{margin:0 0 1em 1em;}pre,code {padding: 0 3px 2px;font-family: Menlo, Monaco, "Courier New", monospace;font-size: 12px;color: #333333;-webkit-border-radius: 3px;-moz-border-radius: 3px;border-radius: 3px;}code{padding: 2px 4px;color: #d14;background-color: #f7f7f9;border: 1px solid #e1e1e8;}pre{display: block;padding: 8.5px;margin: 0 0 9px;font-size: 12.025px;line-height: 18px;background-color: #f5f5f5;border: 1px solid #ccc;border: 1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius: 4px;-moz-border-radius: 4px;border-radius: 4px;white-space: pre;white-space: pre-wrap;word-break: break-all;word-wrap: break-word;}.elgg-monospace{font-family:Monaco, "Courier New", Courier, monospace;}.elgg-heading-site,.elgg-heading-site:hover{font-size:2em;line-height:1.4em;color:#FFF;text-shadow:0 0 1px #627AAD;text-decoration:none;}.elgg-heading-main{float:left;max-width:530px;margin-right:10px;}.elgg-heading-basic{color:#0054A7;font-size:1.2em;font-weight:700;}.elgg-subtext{color:#666;}
+/* ***************************************
+ USER INPUT DISPLAY RESET
+*************************************** */
+.elgg-output ul,ol{padding-left:1.5em;margin:0 1.5em 1.5em 0;}.elgg-output ul{list-style-type:disc;}.elgg-output ol{list-style-type:decimal;}.elgg-output table{border:1px solid #ccc;}.elgg-output table td{border:1px solid #ccc;padding:3px 5px;}.elgg-output img{max-width:100%;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/css/walled_garden.php b/mod/cool_theme/views/default/css/walled_garden.php
new file mode 100644
index 000000000..e38d29f7a
--- /dev/null
+++ b/mod/cool_theme/views/default/css/walled_garden.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Walled garden CSS
+ */
+
+$url = elgg_get_site_url();
+
+?>
+.elgg-body-walledgarden {
+ margin: 100px auto 0 auto;
+ position: relative;
+ width: 530px;
+}
+.elgg-module-walledgarden {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.elgg-module-walledgarden > .elgg-head {
+ height: 17px;
+}
+.elgg-module-walledgarden > .elgg-body {
+ padding: 0 10px;
+}
+.elgg-module-walledgarden > .elgg-foot {
+ height: 17px;
+}
+.elgg-walledgarden-double > .elgg-head {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_top.png) no-repeat left top;
+}
+.elgg-walledgarden-double > .elgg-body {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_middle.png) repeat-y left top;
+}
+.elgg-walledgarden-double > .elgg-foot {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/two_column_bottom.png) no-repeat left top;
+}
+.elgg-walledgarden-single > .elgg-head {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_top.png) no-repeat left top;
+}
+.elgg-walledgarden-single > .elgg-body {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_middle.png) repeat-y left top;
+}
+.elgg-walledgarden-single > .elgg-foot {
+ background: url(<?php echo $url; ?>_graphics/walled_garden/one_column_bottom.png) no-repeat left top;
+}
+
+.elgg-col > .elgg-inner {
+ margin: 0 0 0 5px;
+}
+.elgg-col:first-child > .elgg-inner {
+ margin: 0 5px 0 0;
+}
+.elgg-col > .elgg-inner {
+ padding: 0 8px;
+}
+
+.elgg-walledgarden-single > .elgg-body > .elgg-inner {
+ padding: 0 8px;
+}
+
+.elgg-module-walledgarden-login {
+ margin: 0;
+}
+.elgg-body-walledgarden h3 {
+ font-size: 1.5em;
+ line-height: 1.1em;
+ padding-bottom: 5px;
+}
+
+.elgg-heading-walledgarden {
+ color: #666666;
+ margin-top: 20px;
+ line-height: 1.1em;
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/discussion/river_footer.php b/mod/cool_theme/views/default/discussion/river_footer.php
new file mode 100644
index 000000000..65605026b
--- /dev/null
+++ b/mod/cool_theme/views/default/discussion/river_footer.php
@@ -0,0 +1,51 @@
+<?php
+
+$item = $vars['item'];
+
+if ($item->action_type !== 'create') {
+ return true;
+}
+
+$object = $vars['item']->getObjectEntity();
+
+$replies_options = array(
+ 'guid' => $object->getGUID(),
+ 'annotation_name' => 'group_topic_post',
+ 'limit' => 3,
+ 'order_by' => 'n_table.time_created desc'
+);
+
+$replies = elgg_get_annotations($replies_options);
+
+if ($replies) {
+ // why is this reversing it? because we're asking for the 3 latest
+ // replies by sorting desc and limiting by 3, but we want to display
+ // these replies with the latest at the bottom.
+ $replies = array_reverse($replies);
+
+ $replies_options['count'] = TRUE;
+
+ $reply_count = elgg_get_annotations($replies_options);
+
+ // If greater that 3 replies, link to the rest of them
+ if ($reply_count > count($replies)) {
+ $link = elgg_view('output/url', array(
+ 'href' => $object->getURL(),
+ 'text' => elgg_echo('river:replies:all', array($reply_count)),
+ ));
+
+ echo elgg_view_image_block(elgg_view_icon('speech-bubble-alt'), $link, array('class' => 'elgg-river-participation'));
+ }
+
+ // Display the latest
+ echo elgg_view_annotation_list($replies, array('list_class' => 'elgg-river-replies', 'item_class' => 'elgg-river-participation'));
+
+}
+
+
+if ($object->canAnnotate(0, 'group_topic_post')) {
+ // inline reply form
+ $form_vars = array('id' => "groups-reply-{$object->getGUID()}", 'class' => 'elgg-form-small elgg-river-participation');
+ $body_vars = array('entity' => $object, 'inline' => true);
+ echo elgg_view_form('discussion/reply/save', $form_vars, $body_vars);
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/file/composer.php b/mod/cool_theme/views/default/file/composer.php
new file mode 100644
index 000000000..461171fde
--- /dev/null
+++ b/mod/cool_theme/views/default/file/composer.php
@@ -0,0 +1,8 @@
+<?php
+elgg_load_library('elgg:file');
+$form_vars = array(
+ 'enctype' => 'multipart/form-data',
+);
+$body_vars = file_prepare_form_vars();
+
+echo elgg_view_form('file/upload', $form_vars, array_merge($body_vars, $vars)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/forms/comments/add.php b/mod/cool_theme/views/default/forms/comments/add.php
new file mode 100644
index 000000000..55341ea46
--- /dev/null
+++ b/mod/cool_theme/views/default/forms/comments/add.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Elgg comments add form
+ *
+ * @package Elgg
+ *
+ * @uses ElggEntity $vars['entity'] The entity to comment on
+ * @uses bool $vars['inline'] Show a single line version of the form?
+ */
+
+
+if (isset($vars['entity']) && elgg_is_logged_in()) {
+
+ $inline = elgg_extract('inline', $vars, false);
+
+ if ($inline) {
+ echo elgg_view('input/text', array(
+ 'name' => 'generic_comment',
+ 'placeholder' => elgg_echo('annotation:generic_comment:value:placeholder'),
+ ));
+ echo elgg_view('input/submit', array(
+ 'value' => elgg_echo('comment'),
+ 'class' => 'hidden',
+ ));
+ } else {
+?>
+ <div>
+ <label><?php echo elgg_echo("generic_comments:add"); ?></label>
+ <?php echo elgg_view('input/longtext', array('name' => 'generic_comment')); ?>
+ </div>
+<?php
+ echo elgg_view('input/submit', array('value' => elgg_echo("generic_comments:post")));
+ }
+
+ echo elgg_view('input/hidden', array(
+ 'name' => 'entity_guid',
+ 'value' => $vars['entity']->getGUID()
+ ));
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/forms/discussion/reply/save.php b/mod/cool_theme/views/default/forms/discussion/reply/save.php
new file mode 100644
index 000000000..5fb94d488
--- /dev/null
+++ b/mod/cool_theme/views/default/forms/discussion/reply/save.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Discussion topic reply form bofy
+ *
+ * @uses $vars['entity'] A discussion topic object
+ * @uses $vars['inline'] Display a shortened form?
+ */
+
+if (isset($vars['entity']) && elgg_is_logged_in()) {
+ $inline = elgg_extract('inline', $vars, false);
+
+ if ($inline) {
+ echo elgg_view('input/text', array('name' => 'group_topic_post', 'placeholder' => elgg_echo('annotation:group_topic_post:value:placeholder')));
+ echo elgg_view('input/submit', array('value' => elgg_echo('reply'), 'class' => 'hidden'));
+ } else {
+?>
+ <div>
+ <label><?php echo elgg_echo("reply"); ?></label>
+ <?php echo elgg_view('input/longtext', array('name' => 'group_topic_post')); ?>
+ </div>
+<?php
+ echo elgg_view('input/submit', array('value' => elgg_echo('reply')));
+ }
+ echo elgg_view('input/hidden', array(
+ 'name' => 'entity_guid',
+ 'value' => $vars['entity']->getGUID(),
+ ));
+}
diff --git a/mod/cool_theme/views/default/forms/profile/edit.php b/mod/cool_theme/views/default/forms/profile/edit.php
new file mode 100644
index 000000000..46b77a95b
--- /dev/null
+++ b/mod/cool_theme/views/default/forms/profile/edit.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Edit profile form
+ *
+ * @uses vars['entity']
+ */
+
+?>
+
+<div class="elgg-module elgg-module-info"><div class="elgg-head">
+ <h3><?php echo elgg_echo('user:name:label'); ?></h3></div>
+ <?php echo elgg_view('input/text', array('name' => 'name', 'value' => $vars['entity']->name)); ?>
+</div>
+<?php
+
+$profile_fields = elgg_get_config('profile_fields');
+if (is_array($profile_fields) && count($profile_fields) > 0) {
+ foreach ($profile_fields as $shortname => $valtype) {
+ $metadata = elgg_get_metadata(array(
+ 'guid' => $vars['entity']->guid,
+ 'metadata_name' => $shortname
+ ));
+ if ($metadata) {
+ if (is_array($metadata)) {
+ $value = '';
+ foreach ($metadata as $md) {
+ if (!empty($value)) {
+ $value .= ', ';
+ }
+ $value .= $md->value;
+ $access_id = $md->access_id;
+ }
+ } else {
+ $value = $metadata->value;
+ $access_id = $metadata->access_id;
+ }
+ } else {
+ $value = '';
+ $access_id = ACCESS_DEFAULT;
+ }
+
+?>
+<div class="elgg-module elgg-module-info"><div class="elgg-head">
+ <h3><?php echo elgg_echo("profile:{$shortname}") ?></h3>
+ <?php
+ $params = array(
+ 'name' => $shortname,
+ 'value' => $value,
+ );
+ echo elgg_view("input/{$valtype}", $params);
+ $params = array(
+ 'name' => "accesslevel[$shortname]",
+ 'value' => $access_id,
+ );
+ echo elgg_view('input/access', $params);
+ ?>
+</div>
+<?php
+ }
+}
+?>
+<div class="elgg-foot">
+<?php
+ echo elgg_view('input/hidden', array('name' => 'guid', 'value' => $vars['entity']->guid));
+ echo elgg_view('input/submit', array('value' => elgg_echo('save')));
+?>
+</div>
diff --git a/mod/cool_theme/views/default/forms/profile/fields/add.php b/mod/cool_theme/views/default/forms/profile/fields/add.php
new file mode 100644
index 000000000..1ea9c57a9
--- /dev/null
+++ b/mod/cool_theme/views/default/forms/profile/fields/add.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Add a new field to the set of custom profile fields
+ */
+
+$label_text = elgg_echo('profile:label');
+$type_text = elgg_echo('profile:type');
+
+$label_control = elgg_view('input/text', array('name' => 'label'));
+$type_control = elgg_view('input/dropdown', array('name' => 'type', 'options_values' => array(
+ 'text' => elgg_echo('profile:field:text'),
+ 'longtext' => elgg_echo('profile:field:longtext'),
+ 'tags' => elgg_echo('profile:field:tags'),
+ 'url' => elgg_echo('profile:field:url'),
+ 'email' => elgg_echo('profile:field:email'),
+ 'location' => elgg_echo('profile:field:location'),
+ 'date' => elgg_echo('profile:field:date'),
+)));
+
+$submit_control = elgg_view('input/submit', array('name' => elgg_echo('add'), 'value' => elgg_echo('add')));
+
+$formbody = <<< END
+ <div>$label_text: $label_control</div>
+ <div class="elgg-foot">$type_text: $type_control
+ $submit_control</div>
+END;
+
+echo autop(elgg_echo('profile:explainchangefields'));
+echo $formbody;
diff --git a/mod/cool_theme/views/default/forms/profile/fields/reset.php b/mod/cool_theme/views/default/forms/profile/fields/reset.php
new file mode 100644
index 000000000..c0bb1b7f4
--- /dev/null
+++ b/mod/cool_theme/views/default/forms/profile/fields/reset.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Reset profile fields form
+ */
+
+echo '<div class="elgg-foot">';
+$params = array(
+ 'value' => elgg_echo('profile:resetdefault'),
+ 'class' => 'elgg-button-cancel',
+);
+echo elgg_view('input/submit', $params);
+echo '</div>';
diff --git a/mod/cool_theme/views/default/group/default/river.php b/mod/cool_theme/views/default/group/default/river.php
new file mode 100644
index 000000000..e87331fec
--- /dev/null
+++ b/mod/cool_theme/views/default/group/default/river.php
@@ -0,0 +1,23 @@
+<?php
+
+$group = $vars['entity'];
+
+$image = elgg_view_entity_icon($group, 'tiny');
+
+$title = elgg_view('output/url', array(
+ 'href' => $group->getURL(),
+ 'text' => $group->name,
+ 'encode_text' => true,
+));
+
+
+$subtitle = elgg_view('output/text', array('value' => $group->briefdescription));
+
+$description = elgg_get_excerpt($group->description, 350);
+
+echo elgg_view('river/elements/attachment', array(
+ 'icon' => $image,
+ 'title' => $title,
+ 'subtitle' => $subtitle,
+ 'description' => $description,
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/groups/profile/fields.php b/mod/cool_theme/views/default/groups/profile/fields.php
new file mode 100644
index 000000000..6a666cfb7
--- /dev/null
+++ b/mod/cool_theme/views/default/groups/profile/fields.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Group profile fields
+ */
+
+$group = $vars['entity'];
+
+$profile_fields = elgg_get_config('group');
+
+echo "<dl class=\"elgg-profile\">";
+if (is_array($profile_fields) && count($profile_fields) > 0) {
+
+ foreach ($profile_fields as $key => $valtype) {
+ // do not show the name
+ if ($key == 'name') {
+ continue;
+ }
+
+ $value = $group->$key;
+ if (empty($value)) {
+ continue;
+ }
+
+ $options = array('value' => $group->$key);
+ if ($valtype == 'tags') {
+ $options['tag_names'] = $key;
+ }
+
+ echo "<dt>";
+ echo elgg_echo("groups:$key");
+ echo "</dt><dd>";
+ echo elgg_view("output/$valtype", $options);
+ echo "</dd>";
+ }
+}
+echo "</dl>"; \ No newline at end of file
diff --git a/mod/cool_theme/views/default/groups/profile/profile_block.php b/mod/cool_theme/views/default/groups/profile/profile_block.php
new file mode 100644
index 000000000..9dcad2715
--- /dev/null
+++ b/mod/cool_theme/views/default/groups/profile/profile_block.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Group profile
+ *
+ * Icon and profile fields
+ *
+ * @uses $vars['group']
+ */
+
+if (!isset($vars['entity']) || !$vars['entity']) {
+ echo elgg_echo('groups:notfound');
+ return true;
+}
+
+$group = $vars['entity'];
+$owner = $group->getOwnerEntity();
+
+$profile_fields = elgg_get_config('group');
+
+?>
+<div class="groups-profile clearfix">
+ <div class="groups-profile-fields elgg-body">
+ <p>
+ <b><?php echo elgg_echo("groups:owner"); ?>: </b>
+ <?php
+ echo elgg_view('output/url', array(
+ 'text' => $owner->name,
+ 'value' => $owner->getURL(),
+ ));
+ ?>
+ </p>
+ <p>
+ <?php
+ echo elgg_echo('groups:members') . ": " . $group->getMembers(0, 0, TRUE);
+ ?>
+ </p>
+<?php
+if (is_array($profile_fields) && count($profile_fields) > 0) {
+
+ $even_odd = 'odd';
+ foreach ($profile_fields as $key => $valtype) {
+ // do not show the name
+ if ($key == 'name') {
+ continue;
+ }
+
+ $value = $group->$key;
+ if (empty($value)) {
+ continue;
+ }
+
+ $options = array('value' => $group->$key);
+ if ($valtype == 'tags') {
+ $options['tag_names'] = $key;
+ }
+
+ echo "<p class=\"{$even_odd}\">";
+ echo "<b>";
+ echo elgg_echo("groups:$key");
+ echo ": </b>";
+ echo elgg_view("output/$valtype", $options);
+ echo "</p>";
+
+ $even_odd = ($even_odd == 'even') ? 'odd' : 'even';
+ }
+}
+?>
+ </div>
+</div>
diff --git a/mod/cool_theme/views/default/groups/profile/stats.php b/mod/cool_theme/views/default/groups/profile/stats.php
new file mode 100644
index 000000000..9289cbab9
--- /dev/null
+++ b/mod/cool_theme/views/default/groups/profile/stats.php
@@ -0,0 +1,19 @@
+<?php
+
+$group = $vars['entity'];
+$owner = $group->getOwnerEntity();
+
+?>
+<dl class="elgg-profile">
+ <dt><?php echo elgg_echo("groups:owner"); ?></dt>
+ <dd>
+ <?php
+ echo elgg_view('output/url', array(
+ 'text' => $owner->name,
+ 'value' => $owner->getURL(),
+ ));
+ ?>
+ </dd>
+ <dt><?php echo elgg_echo('groups:members'); ?></dt>
+ <dd><?php echo $group->getMembers(0, 0, TRUE); ?></dd>
+</dl> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/groups/profile/summary.php b/mod/cool_theme/views/default/groups/profile/summary.php
new file mode 100644
index 000000000..8b4c0fadf
--- /dev/null
+++ b/mod/cool_theme/views/default/groups/profile/summary.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Group profile summary
+ *
+ * Icon and profile fields
+ *
+ * @uses $vars['group']
+ */
+
+if (!isset($vars['entity']) || !$vars['entity']) {
+ echo elgg_echo('groups:notfound');
+ return true;
+}
+
+echo elgg_view_module('info', 'Info', elgg_view('groups/profile/fields', $vars));
+
+echo elgg_view_module('info', 'Stats', elgg_view('groups/profile/stats', $vars));
diff --git a/mod/cool_theme/views/default/input/access.php b/mod/cool_theme/views/default/input/access.php
new file mode 100644
index 000000000..137eea288
--- /dev/null
+++ b/mod/cool_theme/views/default/input/access.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Elgg access level input
+ * Displays a dropdown input field
+ *
+ * @uses $vars['value'] The current value, if any
+ * @uses $vars['options_values'] Array of value => label pairs (overrides default)
+ * @uses $vars['name'] The name of the input field
+ * @uses $vars['entity'] Optional. The entity for this access control (uses access_id)
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-access {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-access";
+}
+
+$defaults = array(
+ 'disabled' => false,
+ 'value' => get_default_access(),
+ 'options_values' => get_write_access_array(),
+);
+
+if (isset($vars['entity'])) {
+ $defaults['value'] = $vars['entity']->access_id;
+ unset($vars['entity']);
+}
+
+$vars = array_merge($defaults, $vars);
+
+if ($vars['value'] == ACCESS_DEFAULT) {
+ $vars['value'] = get_default_access();
+}
+
+if (is_array($vars['options_values']) && sizeof($vars['options_values']) > 0) {
+ echo elgg_view('input/dropdown', $vars);
+}
diff --git a/mod/cool_theme/views/default/input/autocomplete.php b/mod/cool_theme/views/default/input/autocomplete.php
new file mode 100644
index 000000000..e58eb1ae8
--- /dev/null
+++ b/mod/cool_theme/views/default/input/autocomplete.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Displays an autocomplete text input.
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @todo This currently only works for ONE AUTOCOMPLETE TEXT FIELD on a page.
+ *
+ * @uses $vars['value'] Current value for the text input
+ * @uses $vars['match_on'] Array | str What to match on. all|array(groups|users|friends)
+ * @uses $vars['match_owner'] Bool. Match only entities that are owned by logged in user.
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-autocomplete {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-autocomplete";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+$params = array();
+if (isset($vars['match_on'])) {
+ $params['match_on'] = $vars['match_on'];
+ unset($vars['match_on']);
+}
+if (isset($vars['match_owner'])) {
+ $params['match_owner'] = $vars['match_owner'];
+ unset($vars['match_owner']);
+}
+$ac_url_params = http_build_query($params);
+
+elgg_load_js('elgg.autocomplete');
+elgg_load_js('jquery.ui.autocomplete.html');
+
+?>
+
+<script type="text/javascript">
+elgg.provide('elgg.autocomplete');
+elgg.autocomplete.url = "<?php echo elgg_get_site_url() . 'livesearch?' . $ac_url_params; ?>";
+</script>
+<input type="text" <?php echo elgg_format_attributes($vars); ?> />
diff --git a/mod/cool_theme/views/default/input/button.php b/mod/cool_theme/views/default/input/button.php
new file mode 100644
index 000000000..9957fdc54
--- /dev/null
+++ b/mod/cool_theme/views/default/input/button.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Create a input button
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['src'] Src of an image
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-button {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-button";
+}
+
+$defaults = array(
+ 'type' => 'button',
+);
+
+$vars = array_merge($defaults, $vars);
+
+switch ($vars['type']) {
+ case 'button':
+ case 'reset':
+ case 'submit':
+ case 'image':
+ break;
+ default:
+ $vars['type'] = 'button';
+ break;
+}
+
+// blank src if trying to access an offsite image. @todo why?
+if (isset($vars['src']) && strpos($vars['src'], elgg_get_site_url()) === false) {
+ $vars['src'] = "";
+}
+?>
+<input <?php echo elgg_format_attributes($vars); ?> />
diff --git a/mod/cool_theme/views/default/input/calendar.php b/mod/cool_theme/views/default/input/calendar.php
new file mode 100644
index 000000000..52c84ff82
--- /dev/null
+++ b/mod/cool_theme/views/default/input/calendar.php
@@ -0,0 +1,6 @@
+<?php
+// @deprecated Use input/date instead.
+
+elgg_deprecated_notice('view: input/calendar is deprecated by input/date', 1.8);
+
+echo elgg_view('input/datepicker', $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/captcha.php b/mod/cool_theme/views/default/input/captcha.php
new file mode 100644
index 000000000..1c2e22aaa
--- /dev/null
+++ b/mod/cool_theme/views/default/input/captcha.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * This view provides a hook for third parties to provide a CAPTCHA.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+?> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/checkbox.php b/mod/cool_theme/views/default/input/checkbox.php
new file mode 100644
index 000000000..3dc75c6c3
--- /dev/null
+++ b/mod/cool_theme/views/default/input/checkbox.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Elgg checkbox input
+ * Displays a checkbox input tag
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ *
+ * Pass input tag attributes as key value pairs. For a list of allowable
+ * attributes, see http://www.w3schools.com/tags/tag_input.asp
+ *
+ * @uses $vars['default'] The default value to submit if not checked.
+ * Optional, defaults to 0. Set to false for no default.
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-checkbox {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-checkbox";
+}
+
+$defaults = array(
+ 'default' => 0,
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+$default = $vars['default'];
+unset($vars['default']);
+
+if (isset($vars['name']) && $default !== false) {
+ echo "<input type=\"hidden\" name=\"{$vars['name']}\" value=\"$default\"/>";
+}
+
+?>
+<input type="checkbox" <?php echo elgg_format_attributes($vars); ?> />
diff --git a/mod/cool_theme/views/default/input/checkboxes.php b/mod/cool_theme/views/default/input/checkboxes.php
new file mode 100644
index 000000000..db4b06949
--- /dev/null
+++ b/mod/cool_theme/views/default/input/checkboxes.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Elgg checkbox input
+ * Displays a checkbox input field
+ *
+ * @note This also includes a hidden input with the same name as the checkboxes
+ * to make sure something is sent to the server. The default value is 0.
+ * If using JS, be specific to avoid selecting the hidden default value:
+ * $('input[type=checkbox][name=name]')
+ *
+ * @warning Passing integers as labels does not currently work due to a
+ * deprecated hack that will be removed in Elgg 1.9. To use integer labels,
+ * the labels must be character codes: 1 would be &#0049;
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses string $vars['name'] The name of the input fields
+ * (Forced to an array by appending [])
+ * @uses array $vars['options'] An array of strings representing the
+ * label => option for the each checkbox field
+ * @uses string $vars['default'] The default value to send if nothing is checked.
+ * Optional, defaults to 0. Set to FALSE for no default.
+ * @uses bool $vars['disabled'] Make all input elements disabled. Optional.
+ * @uses string $vars['value'] The current value. Single value or array. Optional.
+ * @uses string $vars['class'] Additional class of the list. Optional.
+ * @uses string $vars['align'] 'horizontal' or 'vertical' Default: 'vertical'
+ *
+ */
+
+$defaults = array(
+ 'align' => 'vertical',
+ 'value' => array(),
+ 'default' => 0,
+ 'disabled' => false,
+ 'options' => array(),
+ 'name' => '',
+);
+
+$vars = array_merge($defaults, $vars);
+
+$class = "elgg-input-checkboxes elgg-{$vars['align']}";
+if (isset($vars['class'])) {
+ $class .= " {$vars['class']}";
+ unset($vars['class']);
+}
+
+$id = '';
+if (isset($vars['id'])) {
+ $id = "id=\"{$vars['id']}\"";
+ unset($vars['id']);
+}
+
+if (is_array($vars['value'])) {
+ $values = array_map('elgg_strtolower', $vars['value']);
+} else {
+ $values = array(elgg_strtolower($vars['value']));
+}
+
+$input_vars = $vars;
+$input_vars['default'] = false;
+if ($vars['name']) {
+ $input_vars['name'] = "{$vars['name']}[]";
+}
+unset($input_vars['align']);
+unset($input_vars['options']);
+
+if (count($vars['options']) > 0) {
+ // include a default value so if nothing is checked 0 will be passed.
+ if ($vars['name'] && $vars['default'] !== false) {
+ echo "<input type=\"hidden\" name=\"{$vars['name']}\" value=\"{$vars['default']}\" />";
+ }
+
+ echo "<ul class=\"$class\" $id>";
+ foreach ($vars['options'] as $label => $value) {
+ // @deprecated 1.8 Remove in 1.9
+ if (is_integer($label)) {
+ elgg_deprecated_notice('$vars[\'options\'] must be an associative array in input/checkboxes', 1.8);
+ $label = $value;
+ }
+
+ $input_vars['checked'] = in_array(elgg_strtolower($value), $values);
+ $input_vars['value'] = $value;
+
+ $input = elgg_view('input/checkbox', $input_vars);
+
+ echo "<li><label>$input$label</label></li>";
+ }
+ echo '</ul>';
+}
diff --git a/mod/cool_theme/views/default/input/date.php b/mod/cool_theme/views/default/input/date.php
new file mode 100644
index 000000000..828ce5520
--- /dev/null
+++ b/mod/cool_theme/views/default/input/date.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Elgg date input
+ * Displays a text field with a popup date picker.
+ *
+ * The elgg.ui JavaScript library initializes the jQueryUI datepicker based
+ * on the CSS class .elgg-input-date. It uses the ISO 8601 standard for date
+ * representation: yyyy-mm-dd.
+ *
+ * Unix timestamps are supported by setting the 'timestamp' parameter to true.
+ * The date is still displayed to the user in a text format but is submitted as
+ * a unix timestamp in seconds.
+ *
+ * @uses $vars['value'] The current value, if any (as a unix timestamp)
+ * @uses $vars['class'] Additional CSS class
+ * @uses $vars['timestamp'] Store as a Unix timestamp in seconds. Default = false
+ * Note: you cannot use an id with the timestamp option.
+ */
+
+//@todo popup_calendar deprecated in 1.8. Remove in 2.0
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-date popup_calendar {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-date popup_calendar";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+ 'timestamp' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+$timestamp = $vars['timestamp'];
+unset($vars['timestamp']);
+
+if ($timestamp) {
+ echo elgg_view('input/hidden', array(
+ 'name' => $vars['name'],
+ 'value' => $vars['value'],
+ ));
+
+ $vars['class'] = "{$vars['class']} elgg-input-timestamp";
+ $vars['id'] = $vars['name'];
+ unset($vars['name']);
+ unset($vars['internalname']);
+}
+
+// convert timestamps to text for display
+if (is_numeric($vars['value'])) {
+ $vars['value'] = gmdate('Y-m-d', $vars['value']);
+}
+
+$attributes = elgg_format_attributes($vars);
+echo "<input type=\"text\" $attributes />";
diff --git a/mod/cool_theme/views/default/input/datepicker.php b/mod/cool_theme/views/default/input/datepicker.php
new file mode 100644
index 000000000..8955e6e53
--- /dev/null
+++ b/mod/cool_theme/views/default/input/datepicker.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * @deprecated use input/date instead
+ */
+elgg_deprecated_notice('input/datepicker was deprecated in favor of input/date', 1.8);
+echo elgg_view('input/date', $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/dropdown.php b/mod/cool_theme/views/default/input/dropdown.php
new file mode 100644
index 000000000..9f07874f1
--- /dev/null
+++ b/mod/cool_theme/views/default/input/dropdown.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Elgg dropdown input
+ * Displays a dropdown (select) input field
+ *
+ * @warning Default values of FALSE or NULL will match '' (empty string) but not 0.
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any
+ * @uses $vars['options'] An array of strings representing the options for the dropdown field
+ * @uses $vars['options_values'] An associative array of "value" => "option"
+ * where "value" is the name and "option" is
+ * the value displayed on the button. Replaces
+ * $vars['options'] when defined.
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-dropdown {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-dropdown";
+}
+
+$defaults = array(
+ 'disabled' => false,
+ 'value' => '',
+ 'options_values' => array(),
+ 'options' => array(),
+);
+
+$vars = array_merge($defaults, $vars);
+
+$options_values = $vars['options_values'];
+unset($vars['options_values']);
+
+$options = $vars['options'];
+unset($vars['options']);
+
+$value = $vars['value'];
+unset($vars['value']);
+
+?>
+<select <?php echo elgg_format_attributes($vars); ?>>
+<?php
+
+if ($options_values) {
+ foreach ($options_values as $opt_value => $option) {
+
+ $option_attrs = elgg_format_attributes(array(
+ 'value' => $opt_value,
+ 'selected' => (string)$opt_value == (string)$value,
+ ));
+
+ echo "<option $option_attrs>$option</option>";
+ }
+} else {
+ if (is_array($options)) {
+ foreach ($options as $option) {
+
+ $option_attrs = elgg_format_attributes(array(
+ 'selected' => (string)$option == (string)$value
+ ));
+
+ echo "<option $option_attrs>$option</option>";
+ }
+ }
+}
+?>
+</select>
diff --git a/mod/cool_theme/views/default/input/email.php b/mod/cool_theme/views/default/input/email.php
new file mode 100644
index 000000000..190fb88c6
--- /dev/null
+++ b/mod/cool_theme/views/default/input/email.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Elgg email input
+ * Displays an email input field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-email {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-email";
+}
+
+$defaults = array(
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+?>
+
+<input type="text" <?php echo elgg_format_attributes($vars); ?> /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/file.php b/mod/cool_theme/views/default/input/file.php
new file mode 100644
index 000000000..452fe72b9
--- /dev/null
+++ b/mod/cool_theme/views/default/input/file.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Elgg file input
+ * Displays a file input field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value if any
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (!empty($vars['value'])) {
+ echo elgg_echo('fileexists') . "<br />";
+}
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-file {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-file";
+}
+
+$defaults = array(
+ 'disabled' => false,
+ 'size' => 30,
+);
+
+$attrs = array_merge($defaults, $vars);
+
+?>
+<input type="file" <?php echo elgg_format_attributes($attrs); ?> />
diff --git a/mod/cool_theme/views/default/input/form.php b/mod/cool_theme/views/default/input/form.php
new file mode 100644
index 000000000..df30133b3
--- /dev/null
+++ b/mod/cool_theme/views/default/input/form.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Create a form for data submission.
+ * Use this view for forms as it provides protection against CSRF attacks.
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['body'] The body of the form (made up of other input/xxx views and html
+ * @uses $vars['action'] The action URL of the form
+ * @uses $vars['method'] The submit method: post (default) or get
+ * @uses $vars['enctype'] Set to 'multipart/form-data' if uploading a file
+ * @uses $vars['disable_security'] turn off CSRF security by setting to true
+ * @uses $vars['class'] Additional class for the form
+ */
+
+$defaults = array(
+ 'method' => "post",
+ 'disable_security' => FALSE,
+);
+
+$vars = array_merge($defaults, $vars);
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-form {$vars['class']}";
+} else {
+ $vars['class'] = 'elgg-form';
+}
+
+$vars['action'] = elgg_normalize_url($vars['action']);
+$vars['method'] = strtolower($vars['method']);
+
+$body = $vars['body'];
+unset($vars['body']);
+
+// Generate a security header
+if (!$vars['disable_security']) {
+ $body = elgg_view('input/securitytoken') . $body;
+}
+unset($vars['disable_security']);
+
+$attributes = elgg_format_attributes($vars);
+
+echo "<form $attributes><fieldset>$body</fieldset></form>";
diff --git a/mod/cool_theme/views/default/input/friendspicker.php b/mod/cool_theme/views/default/input/friendspicker.php
new file mode 100644
index 000000000..40708c890
--- /dev/null
+++ b/mod/cool_theme/views/default/input/friendspicker.php
@@ -0,0 +1,319 @@
+<?php
+/**
+ * Elgg friends picker
+ * Lists the friends picker
+ *
+ * @warning Below is the ugliest code in Elgg. It needs to be rewritten or removed
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['entities'] The array of ElggUser objects
+ * @uses $vars['name']
+ * @uses $vars['value']
+ * @uses $vars['highlight']
+ * @uses $vars['callback']
+ */
+
+elgg_load_js('elgg.friendspicker');
+elgg_load_js('jquery.easing');
+
+
+$chararray = elgg_echo('friendspicker:chararray');
+
+// Initialise name
+if (!isset($vars['name'])) {
+ $name = "friend";
+} else {
+ $name = $vars['name'];
+}
+
+// Are we highlighting default or all?
+if (empty($vars['highlight'])) {
+ $vars['highlight'] = 'default';
+}
+if ($vars['highlight'] != 'all') {
+ $vars['highlight'] = 'default';
+}
+
+// Initialise values
+if (!isset($vars['value'])) {
+ $vars['value'] = array();
+} else {
+ if (!is_array($vars['value'])) {
+ $vars['value'] = (int) $vars['value'];
+ $vars['value'] = array($vars['value']);
+ }
+}
+
+// Initialise whether we're calling back or not
+if (isset($vars['callback'])) {
+ $callback = $vars['callback'];
+} else {
+ $callback = false;
+}
+
+// We need to count the number of friends pickers on the page.
+if (!isset($vars['friendspicker'])) {
+ global $friendspicker;
+ if (!isset($friendspicker)) {
+ $friendspicker = 0;
+ }
+ $friendspicker++;
+} else {
+ $friendspicker = $vars['friendspicker'];
+}
+
+$users = array();
+$activeletters = array();
+
+// Are we displaying form tags and submit buttons?
+// (If we've been given a target, then yes! Otherwise, no.)
+if (isset($vars['formtarget'])) {
+ $formtarget = $vars['formtarget'];
+} else {
+ $formtarget = false;
+}
+
+// Sort users by letter
+if (is_array($vars['entities']) && sizeof($vars['entities'])) {
+ foreach($vars['entities'] as $user) {
+ $letter = elgg_strtoupper(elgg_substr($user->name, 0, 1));
+
+ if (!elgg_substr_count($chararray, $letter)) {
+ $letter = "*";
+ }
+ if (!isset($users[$letter])) {
+ $users[$letter] = array();
+ }
+ $users[$letter][$user->guid] = $user;
+ }
+}
+
+// sort users in letters alphabetically
+foreach ($users as $letter => $letter_users) {
+ usort($letter_users, create_function('$a, $b', '
+ return strcasecmp($a->name, $b->name);
+ '));
+ $users[$letter] = $letter_users;
+}
+
+if (!$callback) {
+ ?>
+
+ <div class="friends-picker-main-wrapper">
+
+ <?php
+
+ if (isset($vars['content'])) {
+ echo $vars['content'];
+ }
+ ?>
+
+ <div id="friends-picker_placeholder<?php echo $friendspicker; ?>">
+
+ <?php
+}
+
+if (!isset($vars['replacement'])) {
+ if ($formtarget) {
+?>
+<?php //@todo JS 1.8: no ?>
+<script language="text/javascript">
+ $(function() { // onload...do
+ $('#collectionMembersForm<?php echo $friendspicker; ?>').submit(function() {
+ var inputs = [];
+ $(':input', this).each(function() {
+ if (this.type != 'checkbox' || (this.type == 'checkbox' && this.checked != false)) {
+ inputs.push(this.name + '=' + escape(this.value));
+ }
+ });
+ jQuery.ajax({
+ type: "POST",
+ data: inputs.join('&'),
+ url: this.action,
+ success: function(){
+ $('a.collectionmembers<?php echo $friendspicker; ?>').click();
+ }
+
+ });
+ return false;
+ })
+ })
+
+ </script>
+
+<!-- Collection members form -->
+<form id="collectionMembersForm<?php echo $friendspicker; ?>" action="<?php echo $formtarget; ?>" method="post"> <!-- action="" method=""> -->
+
+<?php
+ echo elgg_view('input/securitytoken');
+ echo elgg_view('input/hidden', array(
+ 'name' => 'collection_id',
+ 'value' => $vars['collection_id'],
+ ));
+ }
+?>
+
+<div class="friends-picker-wrapper">
+<div id="friends-picker<?php echo $friendspicker; ?>">
+ <div class="friends-picker-container">
+<?php
+
+// Initialise letters
+ $chararray .= "*";
+ $letter = elgg_substr($chararray, 0, 1);
+ $letpos = 0;
+ while (1 == 1) {
+ ?>
+ <div class="panel" title="<?php echo $letter; ?>">
+ <div class="wrapper">
+ <h3><?php echo $letter; ?></h3>
+ <?php
+
+ if (isset($users[$letter])) {
+ ksort($users[$letter]);
+
+ echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
+ $col = 0;
+
+ foreach($users[$letter] as $friend) {
+ if ($col == 0) {
+ echo "<tr>";
+ }
+
+ //echo "<p>" . $user->name . "</p>";
+ $label = elgg_view_entity_icon($friend, 'tiny', array('use_hover' => false));
+ $options[$label] = $friend->getGUID();
+
+ if ($vars['highlight'] == 'all' && !in_array($letter,$activeletters)) {
+ $activeletters[] = $letter;
+ }
+
+
+ if (in_array($friend->getGUID(),$vars['value'])) {
+ $checked = "checked = \"checked\"";
+ if (!in_array($letter,$activeletters) && $vars['highlight'] == 'default') {
+ $activeletters[] = $letter;
+ }
+ } else {
+ $checked = "";
+ }
+ ?>
+
+ <td>
+
+ <input type="checkbox" <?php echo $checked; ?> name="<?php echo $name; ?>[]" value="<?php echo $options[$label]; ?>" />
+
+ </td>
+
+ <td>
+
+ <div style="width: 25px; margin-bottom: 15px;">
+ <?php
+ echo $label;
+ ?>
+ </div>
+ </td>
+ <td style="width: 200px; padding: 5px;">
+ <?php echo $friend->name; ?>
+ </td>
+ <?php
+ $col++;
+ if ($col == 3){
+ echo "</tr>";
+ $col = 0;
+ }
+ }
+ if ($col < 3) {
+ echo "</tr>";
+ }
+
+ echo "</table>";
+ }
+
+?>
+
+ </div>
+ </div>
+<?php
+
+ $substr = elgg_substr($chararray, elgg_strlen($chararray) - 1, 1);
+ if ($letter == $substr) {
+ break;
+ }
+ //$letter++;
+ $letpos++;
+ $letter = elgg_substr($chararray, $letpos, 1);
+ }
+
+?>
+ </div>
+
+<?php
+
+if ($formtarget) {
+
+ if (isset($vars['formcontents']))
+ echo $vars['formcontents'];
+
+?>
+ <div class="clearfix"></div>
+ <div class="friendspicker-savebuttons">
+ <input type="submit" class="elgg-button elgg-button-submit" value="<?php echo elgg_echo('save'); ?>" />
+ <input type="button" class="elgg-button elgg-button-cancel" value="<?php echo elgg_echo('cancel'); ?>" onclick="$('a.collectionmembers<?php echo $friendspicker; ?>').click();" />
+ <br /></div>
+ </form>
+
+<?php
+
+}
+
+?>
+
+</div>
+</div>
+
+<?php
+} else {
+ echo $vars['replacement'];
+}
+if (!$callback) {
+
+?>
+
+</div>
+</div>
+
+
+<?php
+
+}
+
+if (!isset($vars['replacement'])) {
+?>
+<?php //@todo JS 1.8: no ?>
+<script type="text/javascript">
+ // initialise picker
+ $("div#friends-picker<?php echo $friendspicker; ?>").friendsPicker(<?php echo $friendspicker; ?>);
+</script>
+<script type="text/javascript">
+$(document).ready(function () {
+// manually add class to corresponding tab for panels that have content
+<?php
+if (sizeof($activeletters) > 0)
+ //$chararray = elgg_echo('friendspicker:chararray');
+ foreach($activeletters as $letter) {
+ $tab = elgg_strpos($chararray, $letter) + 1;
+?>
+$("div#friends-picker-navigation<?php echo $friendspicker; ?> li.tab<?php echo $tab; ?> a").addClass("tabHasContent");
+<?php
+ }
+
+?>
+});
+</script>
+
+<?php
+
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/hidden.php b/mod/cool_theme/views/default/input/hidden.php
new file mode 100644
index 000000000..9c2fc6c08
--- /dev/null
+++ b/mod/cool_theme/views/default/input/hidden.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * Create a hidden data field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any
+ */
+
+?>
+<input type="hidden" <?php echo elgg_format_attributes($vars); ?> /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/location.php b/mod/cool_theme/views/default/input/location.php
new file mode 100644
index 000000000..4cf05c72a
--- /dev/null
+++ b/mod/cool_theme/views/default/input/location.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Location input field
+ *
+ * @uses $vars['entity'] The ElggEntity that has a location
+ * @uses $vars['value'] The default value for the location
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-location {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-location";
+}
+
+$defaults = array(
+ 'disabled' => false,
+);
+
+if (isset($vars['entity'])) {
+ $defaults['value'] = $vars['entity']->location;
+ unset($vars['entity']);
+}
+
+$vars = array_merge($defaults, $vars);
+
+echo elgg_view('input/tag', $vars);
diff --git a/mod/cool_theme/views/default/input/longtext.php b/mod/cool_theme/views/default/input/longtext.php
new file mode 100644
index 000000000..2b1462635
--- /dev/null
+++ b/mod/cool_theme/views/default/input/longtext.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Elgg long text input
+ * Displays a long text input field that can use WYSIWYG editor
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any - will be html encoded
+ * @uses $vars['disabled'] Is the input field disabled?
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-longtext {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-longtext";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'id' => 'elgg-input-' . rand(), //@todo make this more robust
+);
+
+$vars = array_merge($defaults, $vars);
+
+$value = $vars['value'];
+unset($vars['value']);
+
+echo elgg_view_menu('longtext', array(
+ 'sort_by' => 'priority',
+ 'class' => 'elgg-menu-hz',
+ 'id' => $vars['id'],
+));
+
+?>
+
+<textarea <?php echo elgg_format_attributes($vars); ?>>
+<?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false); ?>
+</textarea>
diff --git a/mod/cool_theme/views/default/input/password.php b/mod/cool_theme/views/default/input/password.php
new file mode 100644
index 000000000..45f2b20a6
--- /dev/null
+++ b/mod/cool_theme/views/default/input/password.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Elgg password input
+ * Displays a password input field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any
+ * @uses $vars['name'] The name of the input field
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-password {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-password";
+}
+
+$defaults = array(
+ 'disabled' => false,
+ 'value' => '',
+);
+
+$attrs = array_merge($defaults, $vars);
+?>
+
+<input type="password" <?php echo elgg_format_attributes($attrs); ?> />
diff --git a/mod/cool_theme/views/default/input/plaintext.php b/mod/cool_theme/views/default/input/plaintext.php
new file mode 100644
index 000000000..cd0aaafcf
--- /dev/null
+++ b/mod/cool_theme/views/default/input/plaintext.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Elgg long text input (plaintext)
+ * Displays a long text input field that should not be overridden by wysiwyg editors.
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any
+ * @uses $vars['name'] The name of the input field
+ * @uses $vars['class'] Additional CSS class
+ * @uses $vars['disabled']
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-plaintext {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-plaintext";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+$value = $vars['value'];
+unset($vars['value']);
+
+?>
+
+<textarea <?php echo elgg_format_attributes($vars); ?>>
+<?php echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false); ?>
+</textarea>
diff --git a/mod/cool_theme/views/default/input/pulldown.php b/mod/cool_theme/views/default/input/pulldown.php
new file mode 100644
index 000000000..705329691
--- /dev/null
+++ b/mod/cool_theme/views/default/input/pulldown.php
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Deprecated pulldown input view - use 'input/dropdown' instead.
+ *
+ * @deprecated 1.8
+ */
+
+elgg_deprecated_notice("input/pulldown was deprecated by input/dropdown", 1.8);
+echo elgg_view('input/dropdown', $vars);
diff --git a/mod/cool_theme/views/default/input/radio.php b/mod/cool_theme/views/default/input/radio.php
new file mode 100644
index 000000000..ef860a773
--- /dev/null
+++ b/mod/cool_theme/views/default/input/radio.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Elgg radio input
+ * Displays a radio input field
+ *
+ * @warning Passing integers as labels does not currently work due to a
+ * deprecated hack that will be removed in Elgg 1.9. To use integer labels,
+ * the labels must be character codes: 1 would be &#0049;
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] The current value, if any
+ * @uses $vars['name'] The name of the input field
+ * @uses $vars['options'] An array of strings representing the options for the
+ * radio field as "label" => option
+ * @uses $vars['class'] Additional class of the list. Optional.
+ * @uses $vars['align'] 'horizontal' or 'vertical' Default: 'vertical'
+ */
+
+$defaults = array(
+ 'align' => 'vertical',
+ 'value' => array(),
+ 'disabled' => false,
+ 'options' => array(),
+ 'name' => '',
+);
+
+$vars = array_merge($defaults, $vars);
+
+$id = '';
+if (isset($vars['id'])) {
+ $id = "id=\"{$vars['id']}\"";
+ unset($vars['id']);
+}
+
+$class = "elgg-input-radios elgg-{$vars['align']}";
+if (isset($vars['class'])) {
+ $class .= " {$vars['class']}";
+ unset($vars['class']);
+}
+unset($vars['align']);
+$vars['class'] = 'elgg-input-radio';
+
+if (is_array($vars['value'])) {
+ $vars['value'] = array_map('elgg_strtolower', $vars['value']);
+} else {
+ $vars['value'] = array(elgg_strtolower($vars['value']));
+}
+
+$options = $vars['options'];
+unset($vars['options']);
+
+$value = $vars['value'];
+unset($vars['value']);
+
+if ($options && count($options) > 0) {
+ echo "<ul class=\"$class\" $id>";
+ foreach ($options as $label => $option) {
+
+ $vars['checked'] = in_array(elgg_strtolower($option), $value);
+ $vars['value'] = $option;
+
+ $attributes = elgg_format_attributes($vars);
+
+ // handle indexed array where label is not specified
+ // @deprecated 1.8 Remove in 1.9
+ if (is_integer($label)) {
+ elgg_deprecated_notice('$vars[\'options\'] must be an associative array in input/radio', 1.8);
+ $label = $option;
+ }
+
+ echo "<li><label><input type=\"radio\" $attributes />$label</label></li>";
+ }
+ echo '</ul>';
+}
diff --git a/mod/cool_theme/views/default/input/reset.php b/mod/cool_theme/views/default/input/reset.php
new file mode 100644
index 000000000..082da8669
--- /dev/null
+++ b/mod/cool_theme/views/default/input/reset.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Create a reset input button
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['class'] CSS class that replaces elgg-button-cancel
+ */
+
+$vars['type'] = 'reset';
+$vars['class'] = elgg_extract('class', $vars, 'elgg-button-cancel');
+
+echo elgg_view('input/button', $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/securitytoken.php b/mod/cool_theme/views/default/input/securitytoken.php
new file mode 100644
index 000000000..75410848a
--- /dev/null
+++ b/mod/cool_theme/views/default/input/securitytoken.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * CSRF security token view for use with secure forms.
+ *
+ * It is still recommended that you use input/form.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+
+$ts = time();
+$token = generate_action_token($ts);
+
+echo elgg_view('input/hidden', array('name' => '__elgg_token', 'value' => $token));
+echo elgg_view('input/hidden', array('name' => '__elgg_ts', 'value' => $ts));
diff --git a/mod/cool_theme/views/default/input/submit.php b/mod/cool_theme/views/default/input/submit.php
new file mode 100644
index 000000000..df369b3b4
--- /dev/null
+++ b/mod/cool_theme/views/default/input/submit.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Create a submit input button
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['class'] CSS class that replaces elgg-button-submit
+ */
+
+$vars['type'] = 'submit';
+$vars['class'] = elgg_extract('class', $vars, 'elgg-button-submit');
+
+echo elgg_view('input/button', $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/tag.php b/mod/cool_theme/views/default/input/tag.php
new file mode 100644
index 000000000..8893a18ff
--- /dev/null
+++ b/mod/cool_theme/views/default/input/tag.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Elgg tag input
+ *
+ * Accepts a single tag value
+ *
+ * @uses $vars['value'] The default value for the tag
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-tag {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-tag";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+?>
+
+<input type="text" <?php echo elgg_format_attributes($vars); ?> /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/tags.php b/mod/cool_theme/views/default/input/tags.php
new file mode 100644
index 000000000..261cf9f97
--- /dev/null
+++ b/mod/cool_theme/views/default/input/tags.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Elgg tag input
+ * Displays a tag input field
+ *
+ * @uses $vars['disabled']
+ * @uses $vars['class'] Additional CSS class
+ * @uses $vars['value'] Array of tags or a string
+ * @uses $vars['entity'] Optional. Entity whose tags are being displayed (metadata ->tags)
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-tags {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-tags";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+if (isset($vars['entity'])) {
+ $defaults['value'] = $vars['entity']->tags;
+ unset($vars['entity']);
+}
+
+$vars = array_merge($defaults, $vars);
+
+if (is_array($vars['value'])) {
+ $tags = array();
+
+ foreach ($vars['value'] as $tag) {
+ if (is_string($tag)) {
+ $tags[] = $tag;
+ } else {
+ $tags[] = $tag->value;
+ }
+ }
+
+ $vars['value'] = implode(", ", $tags);
+}
+
+?>
+<input type="text" <?php echo elgg_format_attributes($vars); ?> /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/text.php b/mod/cool_theme/views/default/input/text.php
new file mode 100644
index 000000000..707a50179
--- /dev/null
+++ b/mod/cool_theme/views/default/input/text.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Elgg text input
+ * Displays a text input field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-text {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-text";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+?>
+
+<input type="text" <?php echo elgg_format_attributes($vars); ?> /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/url.php b/mod/cool_theme/views/default/input/url.php
new file mode 100644
index 000000000..e97a316d8
--- /dev/null
+++ b/mod/cool_theme/views/default/input/url.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Elgg URL input
+ * Displays a URL input field
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['class'] Additional CSS class
+ */
+
+if (isset($vars['class'])) {
+ $vars['class'] = "elgg-input-url {$vars['class']}";
+} else {
+ $vars['class'] = "elgg-input-url";
+}
+
+$defaults = array(
+ 'value' => '',
+ 'disabled' => false,
+);
+
+$vars = array_merge($defaults, $vars);
+
+?>
+
+<input type="text" <?php echo elgg_format_attributes($vars); ?> />
diff --git a/mod/cool_theme/views/default/input/urlshortener.php b/mod/cool_theme/views/default/input/urlshortener.php
new file mode 100644
index 000000000..ecfb02efa
--- /dev/null
+++ b/mod/cool_theme/views/default/input/urlshortener.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * This view provides a hook for third parties to provide a URL shortener.
+ *
+ * @package Elgg
+ * @subpackage Core
+ */
+?> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/input/userpicker.php b/mod/cool_theme/views/default/input/userpicker.php
new file mode 100644
index 000000000..91a397e37
--- /dev/null
+++ b/mod/cool_theme/views/default/input/userpicker.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * User Picker. Sends an array of user guids.
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['value'] Array of user guids for already selected users or null
+ *
+ * The name of the hidden fields is members[]
+ *
+ * @warning Only a single input/userpicker is supported per web page.
+ *
+ * Defaults to lazy load user lists in alphabetical order. User needs
+ * to type two characters before seeing the user popup list.
+ *
+ * As users are selected they move down to a "users" box.
+ * When this happens, a hidden input is created with the
+ * name of members[] and a value of the GUID.
+ */
+
+elgg_load_js('elgg.userpicker');
+elgg_load_js('jquery.ui.autocomplete.html');
+
+function user_picker_add_user($user_id) {
+ $user = get_entity($user_id);
+ if (!$user || !($user instanceof ElggUser)) {
+ return false;
+ }
+
+ $icon = elgg_view_entity_icon($user, 'tiny', array('use_hover' => false));
+
+ // this html must be synced with the userpicker.js library
+ $code = '<li><div class="elgg-image-block">';
+ $code .= "<div class='elgg-image'>$icon</div>";
+ $code .= "<div class='elgg-image-alt'><a href='#' class='elgg-userpicker-remove'>X</a></div>";
+ $code .= "<div class='elgg-body'>" . $user->name . "</div>";
+ $code .= "</div>";
+ $code .= "<input type=\"hidden\" name=\"members[]\" value=\"$user_id\">";
+ $code .= '</li>';
+
+ return $code;
+}
+
+// loop over all values and prepare them so that "in" will work in javascript
+$values = array();
+if (!is_array($vars['value'])) {
+ $vars['value'] = array($vars['value']);
+}
+foreach ($vars['value'] as $value) {
+ $values[$value] = TRUE;
+}
+
+// convert the values to a json-encoded list
+$json_values = json_encode($values);
+
+// create an HTML list of users
+$user_list = '';
+foreach ($vars['value'] as $user_id) {
+ $user_list .= user_picker_add_user($user_id);
+}
+
+?>
+<div class="elgg-user-picker">
+ <input type="text" class="elgg-input-user-picker" size="30"/>
+ <input type="checkbox" name="match_on" value="true" />
+ <label><?php echo elgg_echo('userpicker:only_friends'); ?></label>
+ <ul class="elgg-user-picker-list"><?php echo $user_list; ?></ul>
+</div>
+<script type="text/javascript">
+ // @todo grab the values in the init function rather than using inline JS
+ elgg.userpicker.userList = <?php echo $json_values ?>;
+</script> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/js/tobar2.php b/mod/cool_theme/views/default/js/tobar2.php
new file mode 100644
index 000000000..454a9684b
--- /dev/null
+++ b/mod/cool_theme/views/default/js/tobar2.php
@@ -0,0 +1,100 @@
+/* ============================================================
+ * bootstrap-dropdown.js v2.0.4
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+ * ========================= */
+
+ var toggle = '[data-toggle="dropdown"]'
+ , Dropdown = function (element) {
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
+ $('html').on('click.dropdown.data-api', function () {
+ $el.parent().removeClass('open')
+ })
+ }
+
+ Dropdown.prototype = {
+
+ constructor: Dropdown
+
+ , toggle: function (e) {
+ var $this = $(this)
+ , $parent
+ , selector
+ , isActive
+
+ if ($this.is('.disabled, :disabled')) return
+
+ selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ $parent = $(selector)
+ $parent.length || ($parent = $this.parent())
+
+ isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) $parent.toggleClass('open')
+
+ return false
+ }
+
+ }
+
+ function clearMenus() {
+ $(toggle).parent().removeClass('open')
+ }
+
+
+ /* DROPDOWN PLUGIN DEFINITION
+ * ========================== */
+
+ $.fn.dropdown = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('dropdown')
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
+ * =================================== */
+
+ $(function () {
+ $('html').on('click.dropdown.data-api', clearMenus)
+ $('body')
+ .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/js/topbar.php b/mod/cool_theme/views/default/js/topbar.php
new file mode 100644
index 000000000..763d0fc7a
--- /dev/null
+++ b/mod/cool_theme/views/default/js/topbar.php
@@ -0,0 +1,3 @@
+elgg.provide('elgg.topbar');
+elgg.topbar.init = function() {$('.elgg-menu-topbar .elgg-menu-parent').live('click', function(event) {$(this).toggleClass('elgg-menu-opened elgg-menu-closed').siblings().toggleClass('elgg-state-active');return false;});$('body').live('click', function(event) {$('.elgg-menu-topbar .elgg-child-menu.elgg-state-active').each(function() {if ($(this).has(event.target).length == 0 && !$(this).is(event.target)) {$(this).removeClass('elgg-state-active').siblings().removeClass('elgg-menu-opened').addClass('elgg-menu-closed');}});});};
+elgg.register_hook_handler('init', 'system', elgg.topbar.init); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/likes/river_footer.php b/mod/cool_theme/views/default/likes/river_footer.php
new file mode 100644
index 000000000..84f942692
--- /dev/null
+++ b/mod/cool_theme/views/default/likes/river_footer.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Elgg likes display
+ *
+ * @uses $vars['entity']
+ */
+
+if (!$vars['item'] instanceof ElggRiverItem || $vars['item']->annotation_id) {
+ return true;
+}
+
+$object = $vars['item']->getObjectEntity();
+
+$num_of_likes = $object->countAnnotations('likes');
+
+if ($num_of_likes == 0) {
+ return true;
+}
+
+$guid = $object->guid;
+
+$likes_button = elgg_view_icon('thumbs-up');
+
+// check to see if the user has already liked this
+if (elgg_is_logged_in() && $object->canAnnotate(0, 'likes')) {
+ if (!elgg_annotation_exists($guid, 'likes')) {
+ $likes_button = elgg_view('output/url', array(
+ 'href' => "action/likes/add?guid={$guid}",
+ 'text' => elgg_view_icon('thumbs-up'),
+ 'title' => elgg_echo('likes:likethis'),
+ 'is_action' => true,
+ ));
+ } else {
+ $likes = elgg_get_annotations(array(
+ 'guid' => $guid,
+ 'annotation_name' => 'likes',
+ 'owner_guid' => elgg_get_logged_in_user_guid()
+ ));
+
+ $likes_button = elgg_view('output/url', array(
+ 'href' => "action/likes/delete?annotation_id={$likes[0]->id}",
+ 'text' => elgg_view_icon('thumbs-up-alt'),
+ 'title' => elgg_echo('likes:remove'),
+ 'is_action' => true,
+ ));
+ }
+}
+
+// display the number of likes
+if ($num_of_likes == 1) {
+ $likes_string = elgg_echo('likes:userlikedthis', array($num_of_likes));
+} else {
+ $likes_string = elgg_echo('likes:userslikedthis', array($num_of_likes));
+}
+
+$likes_string = elgg_view('output/url', array(
+ 'text' => $likes_string,
+ 'title' => elgg_echo('likes:see'),
+ 'rel' => 'popup',
+ 'href' => "#likes-$guid"
+));
+
+$likes_list = elgg_list_annotations(array('guid' => $guid, 'annotation_name' => 'likes', 'limit' => 99));
+
+$likes_module = elgg_view_module('popup', 'Likes', $likes_list, array('class' => 'hidden elgg-likes-list', 'id' => "likes-$guid"));
+
+$vars['image'] = $likes_button;
+$vars['body'] = $likes_string . $likes_module;
+$vars['class'] = 'elgg-river-participation';
+
+echo elgg_view('page/components/image_block', $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/messageboard/composer.php b/mod/cool_theme/views/default/messageboard/composer.php
new file mode 100644
index 000000000..49fa91a53
--- /dev/null
+++ b/mod/cool_theme/views/default/messageboard/composer.php
@@ -0,0 +1,6 @@
+<?php
+//hack! Elgg engine should take care of this, or blog/save form should be coded better
+if (elgg_is_xhr() && isset($vars['entity_guid'])) {
+ elgg_set_page_owner_guid($vars['entity_guid']);
+}
+echo elgg_view_form('messageboard/add', array(), $vars); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/object/blog/river.php b/mod/cool_theme/views/default/object/blog/river.php
new file mode 100644
index 000000000..59d5245ea
--- /dev/null
+++ b/mod/cool_theme/views/default/object/blog/river.php
@@ -0,0 +1,17 @@
+<?php
+
+$blog = $vars['entity'];
+
+$title = elgg_view('output/url', array(
+ 'text' => $blog->title,
+ 'href' => $blog->getURL(),
+ 'encode_text' => true,
+));
+
+$description = elgg_get_excerpt($blog->description, 350);
+
+echo elgg_view('river/elements/attachment', array(
+ 'title' => $title,
+ 'description' => $description,
+ 'image' => elgg_view_entity_icon($blog->getOwnerEntity(), 'tiny'),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/object/bookmarks/river.php b/mod/cool_theme/views/default/object/bookmarks/river.php
new file mode 100644
index 000000000..543998446
--- /dev/null
+++ b/mod/cool_theme/views/default/object/bookmarks/river.php
@@ -0,0 +1,19 @@
+<?php
+
+$link = $vars['entity'];
+
+$title = elgg_view('output/url', array(
+ 'text' => $link->title,
+ 'href' => $link->getURL(),
+ 'encode_text' => true,
+));
+
+$subtitle = elgg_view('output/url', array('value' => $link->address));
+
+$description = elgg_get_excerpt($link->description, 350);
+
+echo elgg_view('river/elements/attachment', array(
+ 'title' => $title,
+ 'subtitle' => $subtitle,
+ 'description' => $description,
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/object/file/river.php b/mod/cool_theme/views/default/object/file/river.php
new file mode 100644
index 000000000..e767567d5
--- /dev/null
+++ b/mod/cool_theme/views/default/object/file/river.php
@@ -0,0 +1,17 @@
+<?php
+
+$file = $vars['entity'];
+
+$title = elgg_view('output/url', array(
+ 'text' => $file->title,
+ 'href' => $file->getURL(),
+ 'encode_text' => true,
+));
+
+$description = elgg_get_excerpt($file->description, 350);
+
+echo elgg_view('river/elements/attachment', array(
+ 'image' => elgg_view_entity_icon($file, 'small'),
+ 'title' => $title,
+ 'description' => $description,
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/object/groupforumtopic/river.php b/mod/cool_theme/views/default/object/groupforumtopic/river.php
new file mode 100644
index 000000000..f062793ec
--- /dev/null
+++ b/mod/cool_theme/views/default/object/groupforumtopic/river.php
@@ -0,0 +1,17 @@
+<?php
+
+$groupforumtopic = $vars['entity'];
+
+$title = elgg_view('output/url', array(
+ 'text' => $groupforumtopic->title,
+ 'href' => $groupforumtopic->getURL(),
+ 'encode_text' => true,
+));
+
+$description = elgg_get_excerpt($groupforumtopic->description, 350);
+
+echo elgg_view('river/elements/attachment', array(
+ 'image' => elgg_view_entity_icon($groupforumtopic->getOwnerEntity(), 'tiny'),
+ 'title' => $title,
+ 'description' => $description,
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/object/page/river.php b/mod/cool_theme/views/default/object/page/river.php
new file mode 100644
index 000000000..cfd93d658
--- /dev/null
+++ b/mod/cool_theme/views/default/object/page/river.php
@@ -0,0 +1,15 @@
+<?php
+
+$page = $vars['entity'];
+
+$icon = elgg_view_entity_icon($page, 'tiny');
+
+echo elgg_view('river/elements/attachment', array(
+ 'image' => $icon,
+ 'title' => elgg_view('output/url', array(
+ 'href' => $page->getURL(),
+ 'text' => $page->title,
+ 'encode_text' => true,
+ )),
+ 'description' => elgg_get_excerpt($page->description, 1000),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/components/gallery.php b/mod/cool_theme/views/default/page/components/gallery.php
new file mode 100644
index 000000000..e8b3f477e
--- /dev/null
+++ b/mod/cool_theme/views/default/page/components/gallery.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Gallery view
+ *
+ * Implemented as an unorder list
+ *
+ * @uses $vars['items'] Array of ElggEntity or ElggAnnotation objects
+ * @uses $vars['offset'] Index of the first list item in complete list
+ * @uses $vars['limit'] Number of items per page
+ * @uses $vars['count'] Number of items in the complete list
+ * @uses $vars['pagination'] Show pagination? (default: true)
+ * @uses $vars['position'] Position of the pagination: before, after, or both
+ * @uses $vars['full_view'] Show the full view of the items (default: false)
+ * @uses $vars['gallery_class'] Additional CSS class for the <ul> element
+ * @uses $vars['item_class'] Additional CSS class for the <li> elements
+ */
+
+$items = $vars['items'];
+if (!is_array($items) || sizeof($items) == 0) {
+ return true;
+}
+
+elgg_push_context('gallery');
+
+$offset = $vars['offset'];
+$limit = $vars['limit'];
+$count = $vars['count'];
+$pagination = elgg_extract('pagination', $vars, true);
+$offset_key = elgg_extract('offset_key', $vars, 'offset');
+$position = elgg_extract('position', $vars, 'after');
+
+$gallery_class = 'elgg-gallery';
+if (isset($vars['gallery_class'])) {
+ $gallery_class = "$gallery_class {$vars['gallery_class']}";
+}
+
+$item_class = 'elgg-item';
+if (isset($vars['item_class'])) {
+ $item_class = "$item_class {$vars['item_class']}";
+}
+
+$nav = '';
+if ($pagination && $count) {
+ $nav .= elgg_view('navigation/pagination', array(
+ 'offset' => $offset,
+ 'count' => $count,
+ 'limit' => $limit,
+ 'offset_key' => $offset_key,
+ ));
+}
+
+if ($position == 'before' || $position == 'both') {
+ echo $nav;
+}
+
+?>
+<ul class="<?php echo $gallery_class; ?>">
+ <?php
+ foreach ($items as $item) {
+ if (elgg_instanceof($item)) {
+ $id = "elgg-{$item->getType()}-{$item->getGUID()}";
+ } else {
+ $id = "item-{$item->getType()}-{$item->id}";
+ }
+ echo "<li id=\"$id\" class=\"$item_class\">";
+ echo elgg_view_list_item($item, $vars);
+ echo "</li>";
+ }
+ ?>
+</ul>
+
+<?php
+if ($position == 'after' || $position == 'both') {
+ echo $nav;
+}
+
+elgg_pop_context();
diff --git a/mod/cool_theme/views/default/page/components/image_block.php b/mod/cool_theme/views/default/page/components/image_block.php
new file mode 100644
index 000000000..a7f480aef
--- /dev/null
+++ b/mod/cool_theme/views/default/page/components/image_block.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Elgg image block pattern
+ *
+ * Common pattern where there is an image, icon, media object to the left
+ * and a descriptive block of text to the right.
+ *
+ * ---------------------------------------------------------------
+ * | | | alt |
+ * | image | body | image |
+ * | block | block | block |
+ * | | | (optional)|
+ * ---------------------------------------------------------------
+ *
+ * @uses $vars['body'] HTML content of the body block
+ * @uses $vars['image'] HTML content of the image block
+ * @uses $vars['image_alt'] HTML content of the alternate image block
+ * @uses $vars['class'] Optional additional class for media element
+ * @uses $vars['id'] Optional id for the media element
+ */
+
+$body = elgg_extract('body', $vars, '');
+$image = elgg_extract('image', $vars, '');
+$alt_image = elgg_extract('image_alt', $vars, '');
+
+$class = 'elgg-image-block';
+$additional_class = elgg_extract('class', $vars, '');
+if ($additional_class) {
+ $class = "$class $additional_class";
+}
+
+$id = '';
+if (isset($vars['id'])) {
+ $id = "id=\"{$vars['id']}\"";
+}
+
+
+$body = "<div class=\"elgg-body\">$body</div>";
+
+if ($image) {
+ $image = "<div class=\"elgg-image\">$image</div>";
+}
+
+if ($alt_image) {
+ $alt_image = "<div class=\"elgg-image-alt\">$alt_image</div>";
+}
+
+echo <<<HTML
+<div class="$class clearfix" $id>
+ $image$alt_image$body
+</div>
+HTML;
diff --git a/mod/cool_theme/views/default/page/components/list.php b/mod/cool_theme/views/default/page/components/list.php
new file mode 100644
index 000000000..5ddf82b63
--- /dev/null
+++ b/mod/cool_theme/views/default/page/components/list.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * View a list of items
+ *
+ * @package Elgg
+ *
+ * @uses $vars['items'] Array of ElggEntity or ElggAnnotation objects
+ * @uses $vars['offset'] Index of the first list item in complete list
+ * @uses $vars['limit'] Number of items per page. Only used as input to pagination.
+ * @uses $vars['count'] Number of items in the complete list
+ * @uses $vars['base_url'] Base URL of list (optional)
+ * @uses $vars['pagination'] Show pagination? (default: true)
+ * @uses $vars['position'] Position of the pagination: before, after, or both
+ * @uses $vars['full_view'] Show the full view of the items (default: false)
+ * @uses $vars['list_class'] Additional CSS class for the <ul> element
+ * @uses $vars['item_class'] Additional CSS class for the <li> elements
+ */
+
+$items = $vars['items'];
+$offset = elgg_extract('offset', $vars);
+$limit = elgg_extract('limit', $vars);
+$count = elgg_extract('count', $vars);
+$base_url = elgg_extract('base_url', $vars, '');
+$pagination = elgg_extract('pagination', $vars, true);
+$offset_key = elgg_extract('offset_key', $vars, 'offset');
+$position = elgg_extract('position', $vars, 'after');
+
+$list_class = 'elgg-list';
+if (isset($vars['list_class'])) {
+ $list_class = "$list_class {$vars['list_class']}";
+}
+
+$item_class = 'elgg-item';
+if (isset($vars['item_class'])) {
+ $item_class = "$item_class {$vars['item_class']}";
+}
+
+$html = "";
+$nav = "";
+
+if ($pagination && $count) {
+ $nav .= elgg_view('navigation/pagination', array(
+ 'base_url' => $base_url,
+ 'offset' => $offset,
+ 'count' => $count,
+ 'limit' => $limit,
+ 'offset_key' => $offset_key,
+ ));
+}
+
+if (is_array($items) && count($items) > 0) {
+ $html .= "<ul class=\"$list_class\">";
+ foreach ($items as $item) {
+ if($item->action_type != 'comment') {
+ if (elgg_instanceof($item)) {
+ $id = "elgg-{$item->getType()}-{$item->getGUID()}";
+ } else {
+ $id = "item-{$item->getType()}-{$item->id}";
+ }
+ $html .= "<li id=\"$id\" class=\"$item_class\">";
+ $html .= elgg_view_list_item($item, $vars);
+ $html .= '</li>';
+ }
+ }
+ $html .= '</ul>';
+}
+if ($position == 'before' || $position == 'both') {
+ $html = $nav . $html;
+}
+
+if ($position == 'after' || $position == 'both') {
+ $html .= $nav;
+}
+
+echo $html;
diff --git a/mod/cool_theme/views/default/page/components/module.php b/mod/cool_theme/views/default/page/components/module.php
new file mode 100644
index 000000000..7e1eaff20
--- /dev/null
+++ b/mod/cool_theme/views/default/page/components/module.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Elgg module element
+ *
+ * @uses $vars['title'] Optional title text (do not pass header with this option)
+ * @uses $vars['header'] Optional HTML content of the header
+ * @uses $vars['body'] HTML content of the body
+ * @uses $vars['footer'] Optional HTML content of the footer
+ * @uses $vars['class'] Optional additional class for module
+ * @uses $vars['id'] Optional id for module
+ * @uses $vars['show_inner'] Optional flag to leave out inner div (default: false)
+ */
+
+$title = elgg_extract('title', $vars, '');
+$header = elgg_extract('header', $vars, '');
+$body = elgg_extract('body', $vars, '');
+$footer = elgg_extract('footer', $vars, '');
+$show_inner = elgg_extract('show_inner', $vars, false);
+
+$class = 'elgg-module';
+$additional_class = elgg_extract('class', $vars, '');
+if ($additional_class) {
+ $class = "$class $additional_class";
+}
+
+$id = '';
+if (isset($vars['id'])) {
+ $id = "id=\"{$vars['id']}\"";
+}
+
+if (isset($vars['header'])) {
+ $header = "<div class=\"elgg-head\">$header</div>";
+} elseif ($title) {
+ $header = "<div class=\"elgg-head\"><h3>$title</h3></div>";
+}
+
+$body = "<div class=\"elgg-body\">$body</div>";
+
+if ($footer) {
+ $footer = "<div class=\"elgg-foot\">$footer</div>";
+}
+
+$contents = $header . $body . $footer;
+if ($show_inner) {
+ $contents = "<div class=\"elgg-inner\">$contents</div>";
+}
+
+echo "<div class=\"$class\" $id>$contents</div>";
diff --git a/mod/cool_theme/views/default/page/components/summary.php b/mod/cool_theme/views/default/page/components/summary.php
new file mode 100644
index 000000000..ea61a6e4b
--- /dev/null
+++ b/mod/cool_theme/views/default/page/components/summary.php
@@ -0,0 +1,4 @@
+<?php
+
+// Deprecated in favor of type/elements/summary
+echo elgg_view('object/elements/summary', $vars);
diff --git a/mod/cool_theme/views/default/page/default.php b/mod/cool_theme/views/default/page/default.php
new file mode 100644
index 000000000..1cc7a32a1
--- /dev/null
+++ b/mod/cool_theme/views/default/page/default.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Elgg pageshell
+ * The standard HTML page shell that everything else fits into
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['title'] The page title
+ * @uses $vars['body'] The main content of the page
+ * @uses $vars['sysmessages'] A 2d array of various message registers, passed from system_messages()
+ */
+
+// backward compatability support for plugins that are not using the new approach
+// of routing through admin. See reportedcontent plugin for a simple example.
+if (elgg_get_context() == 'admin') {
+ elgg_deprecated_notice("admin plugins should route through 'admin'.", 1.8);
+ elgg_admin_add_plugin_settings_menu();
+ elgg_unregister_css('elgg');
+ echo elgg_view('page/shells/admin', $vars);
+ return true;
+}
+
+// Set the content type
+header("Content-type: text/html; charset=UTF-8");
+?>
+<!DOCTYPE html>
+ <html xml:lang="en" lang="en">
+ <head>
+ <?php echo elgg_view('page/elements/head', $vars); ?>
+ </head>
+ <?php flush() ?>
+ <body>
+ <div class="elgg-page elgg-page-default">
+ <div class="elgg-page-messages">
+ <?php echo elgg_view('page/elements/messages', array('object' => $vars['sysmessages'])); ?>
+ </div>
+ <?php if (elgg_is_logged_in()): ?>
+ <div class="elgg-page-topbar">
+ <div class="elgg-inner">
+ <?php echo elgg_view('page/elements/topbar', $vars); ?>
+ </div>
+ </div>
+ <?php else: ?>
+ <div class="elgg-page-header">
+ <div class="elgg-inner">
+ <?php echo elgg_view('page/elements/header', $vars); ?>
+ </div>
+ </div>
+ <?php endif; ?>
+ <div class="elgg-page-body">
+ <div class="elgg-inner">
+ <?php echo elgg_view('page/elements/body', $vars); ?>
+ </div>
+ </div>
+ <div class="elgg-page-footer">
+ <div class="elgg-inner">
+ <?php echo elgg_view('page/elements/footer', $vars); ?>
+ </div>
+ </div>
+ </div>
+ <?php
+
+echo elgg_view('footer/analytics');
+$js = elgg_get_loaded_js('footer');
+foreach ($js as $script) { ?>
+<script type="text/javascript" src="<?php echo $script; ?>"></script>
+<?php
+}
+
+?>
+ </body>
+</html> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/composer.php b/mod/cool_theme/views/default/page/elements/composer.php
new file mode 100644
index 000000000..3c92b4e7b
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/composer.php
@@ -0,0 +1,7 @@
+<div class="elgg-composer"><h4><?php echo elgg_echo('composer:prompt'); ?> :</h4><?php
+ echo elgg_view_menu('composer', array(
+ 'entity' => elgg_get_page_owner_entity(),
+ 'class' => 'elgg-menu-hz',
+ 'sort_by' => 'priority',
+ ));
+ ?></div><script>$('.elgg-composer').tabs({spinner: '',panelTemplate: '<div><div class="elgg-ajax-loader"></div></div>'});</script> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/footer.php b/mod/cool_theme/views/default/page/elements/footer.php
new file mode 100644
index 000000000..5469e0f36
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/footer.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Elgg footer
+ * The standard HTML footer that displays across the site
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ */
+
+echo elgg_view_menu('footer', array('sort_by' => 'priority', 'class' => 'elgg-menu-hz'));
+
+$powered_url = elgg_get_site_url() . "_graphics/powered_by_elgg_badge_drk_bckgnd.gif";
+
+echo '<div class="mts clearfloat float-alt">';
+echo elgg_view('output/url', array(
+ 'href' => 'http://blog.wisb.me',
+ 'text' => elgg_echo('WISB:footer_wisblog'),
+ 'class' => '',
+ 'is_trusted' => true,
+));
+echo (' · ');
+echo elgg_view('output/url', array(
+ 'href' => 'http://developers.wisb.me',
+ 'text' => elgg_echo('WISB:footer_developers'),
+ 'class' => '',
+ 'is_trusted' => true,
+));
+echo (' · ');
+echo elgg_view('output/url', array(
+ 'href' => 'http://www.wisb.me',
+ 'text' => elgg_echo('WISB:footer_wisb'),
+ 'class' => '',
+ 'is_trusted' => true,
+));
+echo '</div>';
diff --git a/mod/cool_theme/views/default/page/elements/head.php b/mod/cool_theme/views/default/page/elements/head.php
new file mode 100644
index 000000000..859326bbe
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/head.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * The standard HTML head
+ *
+ * @uses $vars['title'] The page title
+ */
+
+// Set title
+if (empty($vars['title'])) {
+ $title = elgg_get_config('sitename');
+} else {
+ $title = elgg_get_config('sitename') . " · " . $vars['title'];
+}
+
+global $autofeed;
+if (isset($autofeed) && $autofeed == true) {
+ $url = full_url();
+ if (substr_count($url,'?')) {
+ $url .= "&view=rss";
+ } else {
+ $url .= "?view=rss";
+ }
+ $url = elgg_format_url($url);
+ $feedref = <<<END
+
+ <link rel="alternate" type="application/rss+xml" title="RSS" href="{$url}" />
+
+END;
+} else {
+ $feedref = "";
+}
+
+$js = elgg_get_loaded_js('head');
+$css = elgg_get_loaded_css();
+
+$version = get_version();
+$release = get_version(true);
+?>
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<title><?php echo $title; ?></title>
+<?php echo elgg_view('page/elements/shortcut_icon', $vars); ?>
+<?php foreach ($css as $link) { ?>
+ <link rel="stylesheet" href="<?php echo $link; ?>" type="text/css" />
+<?php } ?>
+<?php
+ $ie_url = elgg_get_simplecache_url('css', 'ie');
+ $ie7_url = elgg_get_simplecache_url('css', 'ie7');
+?>
+<!--[if gt IE 7]>
+ <link rel="stylesheet" type="text/css" href="<?php echo $ie_url; ?>" />
+<![endif]-->
+<!--[if IE 7]>
+ <link rel="stylesheet" type="text/css" href="<?php echo $ie7_url; ?>" />
+<![endif]-->
+<?php foreach ($js as $script) { ?>
+ <script type="text/javascript" src="<?php echo $script; ?>"></script>
+<?php } ?>
+<script type="text/javascript">
+<?php echo elgg_view('js/initialize_elgg'); ?>
+</script>
+<?php
+echo $feedref;
+
+$metatags = elgg_view('metatags', $vars);
+if ($metatags) {
+ elgg_deprecated_notice("The metatags view has been deprecated. Extend page/elements/head instead", 1.8);
+ echo $metatags;
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/header.php b/mod/cool_theme/views/default/page/elements/header.php
new file mode 100644
index 000000000..45fb91da8
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/header.php
@@ -0,0 +1,12 @@
+<?php
+
+$site = elgg_get_site_entity();
+
+echo "<h1 id=\"facebook-header-logo\">";
+echo elgg_view('output/url', array(
+ 'href' => '/',
+ 'text' => $site->name,
+));
+echo "</h1>";
+
+echo elgg_view_form('login', array('id' => 'facebook-header-login')); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/owner_block.php b/mod/cool_theme/views/default/page/elements/owner_block.php
new file mode 100644
index 000000000..cee13ebff
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/owner_block.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Elgg owner block
+ * Displays page ownership information
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ */
+
+elgg_push_context('owner_block');
+
+// groups and other users get owner block
+$owner = elgg_get_page_owner_entity();
+if ($owner instanceof ElggGroup || $owner instanceof ElggUser) {
+
+ $header = elgg_view_entity_icon($owner, 'large');
+
+ $body = elgg_view_menu('owner_block', array('entity' => $owner, 'sort_by' => 'priority'));
+
+ $body .= elgg_view('page/elements/owner_block/extend', $vars);
+
+ echo elgg_view('page/components/module', array(
+ 'header' => $header,
+ 'body' => $body,
+ 'class' => 'elgg-owner-block',
+ ));
+}
+
+elgg_pop_context(); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/shortcut_icon.php b/mod/cool_theme/views/default/page/elements/shortcut_icon.php
new file mode 100644
index 000000000..74ab4f629
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/shortcut_icon.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * Displays the default shortcut icon
+ */
+?>
+<link rel="SHORTCUT ICON" href="<?php echo elgg_get_site_url(); ?>mod/cool_theme/_graphics/favicon.ico" /> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/sidebar.php b/mod/cool_theme/views/default/page/elements/sidebar.php
new file mode 100644
index 000000000..3bd8abb8e
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/sidebar.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Elgg sidebar contents
+ *
+ * @uses $vars['sidebar'] Optional content that is displayed at the bottom of sidebar
+ */
+
+echo elgg_view('page/elements/owner_block', $vars);
+
+echo elgg_view_menu('page', array('sort_by' => 'priority'));
+
+// optional 'sidebar' parameter
+if (isset($vars['sidebar'])) {
+ echo $vars['sidebar'];
+}
+
+// @todo deprecated so remove in Elgg 2.0
+// optional second parameter of elgg_view_layout
+if (isset($vars['area2'])) {
+ echo $vars['area2'];
+}
+
+// @todo deprecated so remove in Elgg 2.0
+// optional third parameter of elgg_view_layout
+if (isset($vars['area3'])) {
+ echo $vars['area3'];
+}
+
+echo elgg_view_menu('extras', array(
+ 'sort_by' => 'priority',
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/sidebar_alt.php b/mod/cool_theme/views/default/page/elements/sidebar_alt.php
new file mode 100644
index 000000000..5d1f54947
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/sidebar_alt.php
@@ -0,0 +1,12 @@
+<?php
+
+
+$homepage = "/dashboard";
+$currentpage = $_SERVER['REQUEST_URI'];
+if($homepage==$currentpage) {
+echo "<strong><a href=\"../thanks\">Thanks</a></strong><br />
+edit the sidebar for the dashboard in /mod/cool_theme/views/default/page/elements/sidebar_alt.php<br />
+and enjoy";
+}
+
+?> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/elements/title.php b/mod/cool_theme/views/default/page/elements/title.php
new file mode 100644
index 000000000..77260212e
--- /dev/null
+++ b/mod/cool_theme/views/default/page/elements/title.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Elgg title element
+ *
+ * @uses $vars['title'] The page title
+ * @uses $vars['class'] Optional class for heading
+ */
+
+if (isset($vars['header'])) {
+ echo $vars['header'];
+ return true;
+}
+
+$class = '';
+if (isset($vars['class'])) {
+ $class = " class=\"{$vars['class']}\"";
+}
+
+echo elgg_view_menu('title', array('sort_by' => 'priority'));
+echo "<h1{$class}>{$vars['title']}</h1>";
+echo elgg_view('navigation/breadcrumbs'); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/layouts/content.php b/mod/cool_theme/views/default/page/layouts/content.php
new file mode 100644
index 000000000..ea27ab7f2
--- /dev/null
+++ b/mod/cool_theme/views/default/page/layouts/content.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Main content area layout
+ *
+ * @uses $vars['content'] HTML of main content area
+ * @uses $vars['sidebar'] HTML of the sidebar
+ * @uses $vars['header'] HTML of the content area header (override)
+ * @uses $vars['nav'] HTML of the content area nav (override)
+ * @uses $vars['footer'] HTML of the content area footer
+ * @uses $vars['filter'] HTML of the content area filter (override)
+ * @uses $vars['title'] Title text (override)
+ * @uses $vars['context'] Page context (override)
+ * @uses $vars['buttons'] Content header buttons (override)
+ * @uses $vars['filter_context'] Filter context: everyone, friends, mine
+ * @uses $vars['class'] Additional class to apply to layout
+ */
+
+// navigation defaults to breadcrumbs
+$nav = elgg_extract('nav', $vars, elgg_view('navigation/breadcrumbs'));
+
+// allow page handlers to override the default filter
+if (isset($vars['filter'])) {
+ $vars['filter_override'] = $vars['filter'];
+}
+$filter = elgg_view('page/layouts/content/filter', $vars);
+
+// the all important content
+$content = elgg_extract('content', $vars, '');
+
+// optional footer for main content area
+$footer_content = elgg_extract('footer', $vars, '');
+$params = $vars;
+$params['content'] = $footer_content;
+$footer = elgg_view('page/layouts/content/footer', $params);
+
+$params = array(
+ 'title' => $vars['title'],
+ 'content' => $filter . $content . $footer,
+ 'sidebar' => elgg_extract('sidebar_alt', $vars, ''),
+ 'sidebar_alt' => elgg_extract('sidebar', $vars, ''),
+);
+if (isset($vars['class'])) {
+ $params['class'] = $vars['class'];
+}
+echo elgg_view_layout('two_sidebar', $params); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/page/layouts/content/sidebar_alt.php b/mod/cool_theme/views/default/page/layouts/content/sidebar_alt.php
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/cool_theme/views/default/page/layouts/content/sidebar_alt.php
diff --git a/mod/cool_theme/views/default/page/layouts/two_sidebar.php b/mod/cool_theme/views/default/page/layouts/two_sidebar.php
new file mode 100644
index 000000000..817b02dc6
--- /dev/null
+++ b/mod/cool_theme/views/default/page/layouts/two_sidebar.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Elgg 2 sidebar layout
+ *
+ * @package Elgg
+ * @subpackage Core
+ *
+ * @uses $vars['content'] The content string for the main column
+ * @uses $vars['sidebar'] Optional content that is displayed in the sidebar
+ * @uses $vars['sidebar_alt'] Optional content that is displayed in the alternate sidebar
+ * @uses $vars['class'] Additional class to apply to layout
+ */
+
+$class = 'elgg-layout elgg-layout-two-sidebar clearfix';
+if (isset($vars['class'])) {
+ $class = "$class {$vars['class']}";
+}
+?>
+
+<div class="<?php echo $class; ?>">
+ <div class="elgg-sidebar">
+ <?php echo elgg_view('page/elements/sidebar', $vars); ?>
+ </div>
+ <div class="elgg-body">
+ <div class="elgg-head">
+ <?php echo elgg_view('page/elements/title', $vars); ?>
+ </div>
+ <?php
+ // allow page handlers to override the default header
+ ?>
+ <div class="elgg-sidebar-alt">
+ <?php echo elgg_view('page/elements/sidebar_alt', $vars); ?>
+ </div>
+ <div class="elgg-body elgg-main">
+ <?php
+ // @todo deprecated so remove in Elgg 2.0
+ if (isset($vars['area1'])) {
+ echo $vars['area1'];
+ }
+ if (isset($vars['content'])) {
+ echo $vars['content'];
+ }
+ ?>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/profile/details.php b/mod/cool_theme/views/default/profile/details.php
new file mode 100644
index 000000000..6ad73688f
--- /dev/null
+++ b/mod/cool_theme/views/default/profile/details.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Elgg user display (details)
+ * @uses $vars['entity'] The user entity
+ */
+
+$user = elgg_get_page_owner_entity();
+
+$profile_fields = elgg_get_config('profile_fields');
+
+echo "<dl class=\"elgg-profile\">";
+if (is_array($profile_fields) && sizeof($profile_fields) > 0) {
+ foreach ($profile_fields as $shortname => $valtype) {
+ if ($shortname == "description") {
+ // skip about me and put at bottom
+ continue;
+ }
+ $value = $user->$shortname;
+ if (!empty($value)) {
+?>
+ <dt><?php echo elgg_echo("profile:{$shortname}"); ?></dt>
+ <dd><?php echo elgg_view("output/{$valtype}", array('value' => $user->$shortname)); ?></dd>
+<?php
+ }
+ }
+}
+
+if (!elgg_get_config('profile_custom_fields')) {
+ if ($user->isBanned()) {
+ echo "</dl><p class='profile-banned-user'>";
+ echo elgg_echo('banned');
+ echo "</p>";
+ } else {
+ if ($user->description) {
+ echo "<dt>" . elgg_echo("profile:aboutme") . "</dt>";
+ echo "<dd>";
+ echo elgg_view('output/longtext', array('value' => $user->description));
+ echo "</dd></dl>";
+ }
+ }
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/elements/attachment.php b/mod/cool_theme/views/default/river/elements/attachment.php
new file mode 100644
index 000000000..d5c0aab99
--- /dev/null
+++ b/mod/cool_theme/views/default/river/elements/attachment.php
@@ -0,0 +1,25 @@
+<?php
+
+$title = '';
+$subtitle = false;
+$image = false;
+$description = false;
+
+extract($vars, EXTR_IF_EXISTS);
+
+$body = "<h4 class=\"elgg-attachment-title\">$title</h4>";
+
+if ($subtitle) {
+ $body .= "<div class=\"elgg-attachment-subtitle\">$subtitle</div>";
+}
+
+if ($description) {
+ $body .= "<div class=\"elgg-attachment-description\">$description</div>";
+}
+
+
+if ($image) {
+ echo elgg_view_image_block($image, $body);
+} else {
+ echo $body;
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/elements/body.php b/mod/cool_theme/views/default/river/elements/body.php
new file mode 100644
index 000000000..56d7a09e9
--- /dev/null
+++ b/mod/cool_theme/views/default/river/elements/body.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Body of river item
+ *
+ * @uses $vars['item'] ElggRiverItem
+ * @uses $vars['summary'] Alternate summary (the short text summary of action)
+ * @uses $vars['message'] Optional message (usually excerpt of text)
+ * @uses $vars['attachments'] Optional attachments (displaying icons or other non-text data)
+ * @uses $vars['responses'] Alternate respones (comments, replies, etc.)
+ */
+
+$item = $vars['item'];
+
+$menu = elgg_view_menu('river', array(
+ 'item' => $item,
+ 'sort_by' => 'priority',
+));
+
+// river item header
+if($item->action_type != 'comment') {
+$timestamp = elgg_get_friendly_time($item->getPostedTime());
+
+$summary = elgg_extract('summary', $vars, elgg_view('river/elements/summary', array('item' => $vars['item'])));
+if ($summary === false) {
+ $subject = $item->getSubjectEntity();
+ $summary = elgg_view('output/url', array(
+ 'href' => $subject->getURL(),
+ 'text' => $subject->name,
+ 'class' => 'elgg-river-subject',
+ ));
+}
+
+$message = elgg_extract('message', $vars, false);
+if ($message !== false) {
+ $message = "<div class=\"elgg-river-message\">$message</div>";
+}
+
+$attachments = elgg_extract('attachments', $vars, false);
+if ($attachments !== false) {
+ $attachments = "<div class=\"elgg-river-attachments\">$attachments</div>";
+}
+
+$responses = elgg_view('river/elements/responses', $vars);
+if ($responses) {
+ $responses = "<div class=\"elgg-river-responses\">$responses</div>";
+}
+
+$group_string = '';
+$object = $item->getObjectEntity();
+$container = $object->getContainerEntity();
+if ($container instanceof ElggGroup && $container->guid != elgg_get_page_owner_guid()) {
+ $group_link = elgg_view('output/url', array(
+ 'href' => $container->getURL(),
+ 'text' => $container->name,
+ ));
+ $group_string = elgg_echo('river:ingroup', array($group_link));
+}
+
+echo <<<RIVER
+<div class="elgg-river-summary">$summary $group_string</div>
+$message
+$attachments
+<span class="elgg-river-timestamp">$timestamp</span>
+$menu
+$responses
+RIVER;
+
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/elements/responses.php b/mod/cool_theme/views/default/river/elements/responses.php
new file mode 100644
index 000000000..432296737
--- /dev/null
+++ b/mod/cool_theme/views/default/river/elements/responses.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * River item footer
+ */
+
+$item = $vars['item'];
+$object = $item->getObjectEntity();
+
+// annotations do not have comments
+if (!$object || $item->annotation_id) {
+ return true;
+}
+
+
+$comment_count = $object->countComments();
+
+$comments = elgg_get_annotations(array(
+ 'guid' => $object->getGUID(),
+ 'annotation_name' => 'generic_comment',
+ 'limit' => 3,
+ 'order_by' => 'n_table.time_created desc'
+));
+
+if ($comments) {
+ // why is this reversing it? because we're asking for the 3 latest
+ // comments by sorting desc and limiting by 3, but we want to display
+ // these comments with the latest at the bottom.
+ $comments = array_reverse($comments);
+
+ if ($comment_count > count($comments)) {
+ $link = elgg_view('output/url', array(
+ 'href' => $object->getURL(),
+ 'text' => elgg_echo('river:comments:all', array($comment_count)),
+ ));
+
+ echo elgg_view_image_block(elgg_view_icon('speech-bubble-alt'), $link, array('class' => 'elgg-river-participation'));
+ }
+
+ echo elgg_view_annotation_list($comments, array('list_class' => 'elgg-river-comments', 'item_class' => 'elgg-river-participation'));
+
+}
+
+if ($object->canAnnotate(0, 'generic_comment')) {
+ // inline comment form
+ echo elgg_view_form('comments/add', array(
+ 'id' => "comments-add-{$object->getGUID()}",
+ 'class' => 'elgg-river-participation elgg-form-small',
+ ), array('entity' => $object, 'inline' => true));
+} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/group/create.php b/mod/cool_theme/views/default/river/group/create.php
new file mode 100644
index 000000000..6beaf2d7d
--- /dev/null
+++ b/mod/cool_theme/views/default/river/group/create.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Group creation river view.
+ */
+
+$object = $vars['item']->getObjectEntity();
+$subject = $vars['item']->getSubjectEntity();
+
+$subject_link = elgg_view('output/url', array(
+ 'href' => $subject->getURL(),
+ 'text' => $subject->name,
+ 'class' => 'elgg-actor-name',
+ 'encode_text' => true,
+));
+
+$group_link = elgg_view('output/url', array(
+ 'href' => $object->getURL(),
+ 'text' => $object->name,
+ 'encode_text' => true,
+));
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('group/default/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/object/blog/create.php b/mod/cool_theme/views/default/river/object/blog/create.php
new file mode 100644
index 000000000..2d08a7d86
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/blog/create.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Blog river view.
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('object/blog/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/object/bookmarks/create.php b/mod/cool_theme/views/default/river/object/bookmarks/create.php
new file mode 100644
index 000000000..b4170b8ec
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/bookmarks/create.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * New bookmarks river entry
+ *
+ * @package Bookmarks
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('object/bookmarks/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/object/file/create.php b/mod/cool_theme/views/default/river/object/file/create.php
new file mode 100644
index 000000000..99af38ace
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/file/create.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * New file river entry
+ *
+ * @package File
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('object/file/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/object/groupforumtopic/create.php b/mod/cool_theme/views/default/river/object/groupforumtopic/create.php
new file mode 100644
index 000000000..291585698
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/groupforumtopic/create.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Group discussion topic river view.
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('object/groupforumtopic/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/object/messageboard/create.php b/mod/cool_theme/views/default/river/object/messageboard/create.php
new file mode 100644
index 000000000..7d586450d
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/messageboard/create.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Post comment river view
+ */
+$object = $vars['item']->getObjectEntity();
+$comment = $vars['item']->getAnnotation();
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'message' => elgg_get_excerpt($comment->value),
+));
diff --git a/mod/cool_theme/views/default/river/object/page/create.php b/mod/cool_theme/views/default/river/object/page/create.php
new file mode 100644
index 000000000..1f1ab4801
--- /dev/null
+++ b/mod/cool_theme/views/default/river/object/page/create.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Page river view.
+ */
+
+$object = $vars['item']->getObjectEntity();
+
+echo elgg_view('river/item', array(
+ 'item' => $vars['item'],
+ 'attachments' => elgg_view('object/page/river', array('entity' => $object)),
+)); \ No newline at end of file
diff --git a/mod/cool_theme/views/default/river/user/default/profileiconupdate.php b/mod/cool_theme/views/default/river/user/default/profileiconupdate.php
new file mode 100644
index 000000000..255d660ca
--- /dev/null
+++ b/mod/cool_theme/views/default/river/user/default/profileiconupdate.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Update avatar river view
+ */
+
+$subject = $vars['item']->getSubjectEntity();
+
+$subject_link = elgg_view('output/url', array(
+ 'href' => $subject->getURL(),
+ 'text' => $subject->name,
+ 'class' => 'elgg-river-subject',
+ 'is_trusted' => true,
+));
+
+$string = elgg_echo('river:update:user:avatar', array($subject_link));
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'summary' => $string,
+ 'attachments' => elgg_view_entity_icon($subject, 'medium', array(
+ 'use_hover' => false,
+ 'use_link' => false,
+ )),
+));
diff --git a/mod/cool_theme/views/default/river/user/default/profileupdate.php b/mod/cool_theme/views/default/river/user/default/profileupdate.php
new file mode 100644
index 000000000..ce72970d6
--- /dev/null
+++ b/mod/cool_theme/views/default/river/user/default/profileupdate.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Update profile river view
+ */
+
+$subject = $vars['item']->getSubjectEntity();
+
+$subject_link = elgg_view('output/url', array(
+ 'href' => $subject->getURL(),
+ 'text' => $subject->name,
+ 'class' => 'elgg-river-subject',
+ 'is_trusted' => true,
+));
+
+$string = elgg_echo('river:update:user:profile', array($subject_link));
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'summary' => $string,
+));
diff --git a/mod/cool_theme/views/default/search/css.php b/mod/cool_theme/views/default/search/css.php
new file mode 100644
index 000000000..3e0c5f379
--- /dev/null
+++ b/mod/cool_theme/views/default/search/css.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Elgg Search css
+ *
+ */
+?>
+/* <style>
+/**********************************
+Search plugin
+***********************************/
+.elgg-search {width: 330px;background: white url(<?php echo elgg_get_site_url(); ?>_graphics/elgg_sprites.png) no-repeat 335px -934px;border: 1px solid #AAA;border-radius: 1px;height: 20px;padding: 0 23px 0 0;}.elgg-search .search-input {padding: 1px 0 1px 3px;margin: 2px 0 2px 2px;outline: none;font-size: 11px;border: 0;border-right: 1px solid #e9e9e9;}.elgg-search input[type=submit] {display: none;}.elgg-search .search-input:focus {background-position: 2px -700px;}.elgg-page-header .elgg-search {bottom: 5px;position: absolute;right: 0;border-color: black;}.elgg-page-topbar .elgg-search {margin: 4px 0 4px 181px;position: relative;}.search-list li {padding: 5px 0 0;}.search-heading-category {margin-top: 20px;color: #666666;}.search-highlight {background-color: #bbdaf7;}.search-highlight-color1 {background-color: #bbdaf7;}.search-highlight-color2 {background-color: #A0FFFF;}.search-highlight-color3 {background-color: #FDFFC3;}.search-highlight-color4 {background-color: #ccc;}.search-highlight-color5 {background-color: #4690d6;} \ No newline at end of file
diff --git a/mod/cool_theme/views/default/search/entity.php b/mod/cool_theme/views/default/search/entity.php
new file mode 100644
index 000000000..287ce4512
--- /dev/null
+++ b/mod/cool_theme/views/default/search/entity.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Default view for an entity returned in a search
+ *
+ * Display largely controlled by a set of overrideable volatile data:
+ * - search_icon (defaults to entity icon)
+ * - search_matched_title
+ * - search_matched_description
+ * - search_matched_extra
+ * - search_url (defaults to entity->getURL())
+ * - search_time (defaults to entity->time_updated or entity->time_created)
+ *
+ * @uses $vars['entity'] Entity returned in a search
+ */
+
+$entity = $vars['entity'];
+
+$icon = $entity->getVolatileData('search_icon');
+if (!$icon) {
+ // display the entity's owner by default if available.
+ // @todo allow an option to switch to displaying the entity's icon instead.
+ $type = $entity->getType();
+ if ($type == 'user' || $type == 'group') {
+ $icon = elgg_view_entity_icon($entity, 'small');
+ } elseif ($owner = $entity->getOwnerEntity()) {
+ $icon = elgg_view_entity_icon($owner, 'small');
+ } else {
+ // display a generic icon if no owner, though there will probably be
+ // other problems if the owner can't be found.
+ $icon = elgg_view_entity($entity, 'small');
+ }
+}
+
+$title = $entity->getVolatileData('search_matched_title');
+$description = $entity->getVolatileData('search_matched_description');
+$extra_info = $entity->getVolatileData('search_matched_extra');
+$url = $entity->getVolatileData('search_url');
+
+if (!$url) {
+ $url = $entity->getURL();
+}
+
+$title = "<a href=\"$url\">$title</a>";
+$time = $entity->getVolatileData('search_time');
+if (!$time) {
+ $tc = $entity->time_created;
+ $tu = $entity->time_updated;
+ $time = elgg_view_friendly_time(($tu > $tc) ? $tu : $tc);
+}
+
+$body = "<p class=\"mbn\">$title</p>$description";
+if ($extra_info) {
+ $body .= "<p class=\"elgg-subtext\">$extra_info</p>";
+}
+$body .= "<p class=\"elgg-subtext\">$time</p>";
+
+echo elgg_view_image_block($icon, $body);
diff --git a/mod/cool_theme/views/default/search/search_box.php b/mod/cool_theme/views/default/search/search_box.php
new file mode 100644
index 000000000..36cceef4a
--- /dev/null
+++ b/mod/cool_theme/views/default/search/search_box.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Search box
+ *
+ * @uses $vars['value'] Current search query
+ *
+ * @todo Move javascript into something that extends elgg.js
+ */
+
+$value = '';
+if (array_key_exists('value', $vars)) {
+ $value = $vars['value'];
+} elseif ($value = get_input('q', get_input('tag', NULL))) {
+ $value = $value;
+}
+
+// @todo - why the strip slashes?
+$value = stripslashes($value);
+
+// @todo - create function for sanitization of strings for display in 1.8
+// encode <,>,&, quotes and characters above 127
+$display_query = mb_convert_encoding($value, 'HTML-ENTITIES', 'UTF-8');
+$display_query = htmlspecialchars($display_query, ENT_QUOTES, 'UTF-8', false);
+
+
+?>
+<form class="elgg-search" action="<?php echo elgg_get_site_url(); ?>search" method="get"><fieldset><input type="text" size="21" name="q" placeholder="<?php echo elgg_echo('search'); ?>" class="search-input" value="<?php echo $value; ?>"/><input type="submit" value="<?php echo elgg_echo('search:go'); ?>" class="search-submit-button" /></fieldset></form> \ No newline at end of file
diff --git a/mod/cool_theme/views/default/thewire/composer.php b/mod/cool_theme/views/default/thewire/composer.php
new file mode 100644
index 000000000..a6cdcdd2a
--- /dev/null
+++ b/mod/cool_theme/views/default/thewire/composer.php
@@ -0,0 +1,2 @@
+<?php
+echo elgg_view_form('thewire/add'); \ No newline at end of file
diff --git a/mod/curatedgroups/languages/ca.php b/mod/curatedgroups/languages/ca.php
new file mode 100644
index 000000000..c7513aad1
--- /dev/null
+++ b/mod/curatedgroups/languages/ca.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Curated Groups -- Translation strings for Catalan
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This file is part of the CuratedGroups plugin for Elgg.
+ *
+ * CuratedGroups is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * CuratedGroups is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$catalan = array(
+ "curatedgroups:message" => "Tan sols es poden crear grups oficials. Si estàs intentant crear un grup oficial contacta amb els administradors.",
+ "curatedgroups:settings:message" => "Escriu un missatge personalitzat per mostrar quan s'estigui intentant crear un grup. Si no s'especifica, s'utilizarà un missatge per defecte internacionalitzable",
+ "curatedgroups:settings:creators" => "Escriu una llista de noms d'usuari separats per comes que podràn crear grups"
+);
+
+add_translation("ca", $catalan);
diff --git a/mod/curatedgroups/languages/en.php b/mod/curatedgroups/languages/en.php
new file mode 100755
index 000000000..88990a42d
--- /dev/null
+++ b/mod/curatedgroups/languages/en.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Curated Groups -- Translation strings for English
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This file is part of the CuratedGroups plugin for Elgg.
+ *
+ * CuratedGroups is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * CuratedGroups is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$english = array(
+ "curatedgroups:message" => "Only official groups are allowed. If you're trying to create an official group please contact the admins.",
+ "curatedgroups:settings:message" => "Write a personalized message to show when trying to create a group. If not defined a default internationalizable one will be shown",
+ "curatedgroups:settings:creators" => "Write a comma separated list of usernames that will be allowed to create groups"
+);
+
+add_translation("en",$english);
diff --git a/mod/curatedgroups/languages/es.php b/mod/curatedgroups/languages/es.php
new file mode 100755
index 000000000..7c44cf812
--- /dev/null
+++ b/mod/curatedgroups/languages/es.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Curated Groups -- Translation strings for Spanish
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This file is part of the CuratedGroups plugin for Elgg.
+ *
+ * CuratedGroups is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * CuratedGroups is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+$spanish = array(
+ "curatedgroups:message" => "Solo se pueden crear grupos oficiales. Si est&aacute; tratando de crear un grupo oficial contacta con las administradoras.",
+ "curatedgroups:settings:message" => "Escribe un mensaje personalizado que mostrar cuando se esté intentando crear un grupo. Si no se especifica se utilizará un mensaje por defecto internacionalizable",
+ "curatedgroups:settings:creators" => "Escribe una lista de nombres de usuario separados por comas que podrán crear grupos"
+);
+
+add_translation("es", $spanish);
diff --git a/mod/curatedgroups/manifest.xml b/mod/curatedgroups/manifest.xml
new file mode 100755
index 000000000..8bef940e9
--- /dev/null
+++ b/mod/curatedgroups/manifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Curated Groups</name>
+ <author>Lorea developers</author>
+ <version>1.1</version>
+ <category>lorea</category>
+ <category>groups</category>
+ <description>Limit group creation to administrators.</description>
+ <website>https://lorea.org/plugin/curatedgroups</website>
+ <repository>https://gitorious.org/lorea/curatedgroups</repository>
+ <donations>https://lorea.org/support</donations>
+ <license>GNU Affero GeneralPublic License version 3 or later</license>
+ <requires>
+ <type>elgg_version</type>
+ <version>2011061200</version>
+ </requires>
+ <admin_interface>advanced</admin_interface>
+</plugin_manifest>
diff --git a/mod/curatedgroups/start.php b/mod/curatedgroups/start.php
new file mode 100644
index 000000000..e4bca1ff7
--- /dev/null
+++ b/mod/curatedgroups/start.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Curated Groups -- Limit group creation to administrators
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ * @homepage http://lorea.org/plugin/curatedgroups
+ * @copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ * @license COPYING, http://www.gnu.org/licenses/agpl
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Elgg Curated Groups plugin
+ *
+ * @package ElggCuratedGroups
+ */
+elgg_register_event_handler('init','system','curatedgroups_init');
+
+function curatedgroups_init(){
+}
+
+?>
diff --git a/mod/curatedgroups/views/default/forms/groups/edit.php b/mod/curatedgroups/views/default/forms/groups/edit.php
new file mode 100644
index 000000000..72b017832
--- /dev/null
+++ b/mod/curatedgroups/views/default/forms/groups/edit.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Curated Groups -- Form
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This file is part of the CuratedGroups plugin for Elgg.
+ *
+ * CuratedGroups is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * CuratedGroups is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+ $creator=false;
+ // check if user is admin
+ if (isadminloggedin()) $creator=true;
+
+ // check if user is one of the specified group creators
+ if (!$creator) {
+ $creators_text = str_replace(' ', '', elgg_get_plugin_setting("creators", "curatedgroups"));
+ $creators = explode(",", $creators_text);
+ if (!empty($creators)) {
+ if (in_array(elgg_get_logged_in_user_entity()->username, $creators)) {
+ $creator = true;
+ // Compatibility with CuratedGroups 1.0
+ } elseif (in_array(elgg_get_logged_in_user_guid(), $creators)) {
+ $creator = true;
+ }
+ }
+ }
+
+ // check if user is admin of the current group (for editing an
+ // existing group)
+ if (!$creator && isset($vars['entity'])) {
+ if ($vars['entity']->canEdit())
+ $creator = true;
+ }
+
+ // check if user is admin of the parent group if defined (for
+ // subgroups)
+ if (!$creator) {
+ $parent_guid = (int)get_input("parent", 0);
+ if (!empty($parent_guid)) {
+ $parent = get_entity($parent_guid);
+ if ($parent->canEdit())
+ $creator = true;
+ }
+ }
+
+ // show group creation form if we're a creator, otherwise show the not
+ // allowed message
+ if ($creator) {
+ if (elgg_is_active_plugin("subgroups"))
+ include elgg_get_plugins_path() . "subgroups/views/default/forms/groups/edit.php";
+ else
+ include elgg_get_plugins_path() . "groups/views/default/forms/groups/edit.php";
+ }
+ else {
+ $message = elgg_get_plugin_setting("message", "curatedgroups");
+ if (empty($message))
+ $message = elgg_echo("curatedgroups:message");
+ echo $message;
+ }
+?>
diff --git a/mod/curatedgroups/views/default/settings/curatedgroups/edit.php b/mod/curatedgroups/views/default/settings/curatedgroups/edit.php
new file mode 100644
index 000000000..9c383b258
--- /dev/null
+++ b/mod/curatedgroups/views/default/settings/curatedgroups/edit.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Curated Groups -- Plugin settings
+ *
+ * @package Lorea
+ * @subpackage CuratedGroups
+ *
+ * Copyright 2011-2012 Lorea Faeries <federation@lorea.org>
+ *
+ * This file is part of the CuratedGroups plugin for Elgg.
+ *
+ * CuratedGroups is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * CuratedGroups is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+?>
+<p>
+ <?php echo elgg_echo('curatedgroups:settings:message'); ?>:
+ <?php
+ echo elgg_view('input/text', array('name' => 'params[message]', 'value' => $vars['entity']->message));
+ ?>
+</p>
+
+<p>
+ <?php echo elgg_echo('curatedgroups:settings:creators'); ?>:
+ <?php
+ echo elgg_view('input/text', array('name' => 'params[creators]', 'value' => $vars['entity']->creators));
+ ?>
+</p>
diff --git a/mod/custom_index/index.php b/mod/custom_index/index.php
new file mode 100644
index 000000000..43cab9723
--- /dev/null
+++ b/mod/custom_index/index.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Elgg custom index page
+ *
+ */
+
+elgg_push_context('front');
+
+elgg_push_context('widgets');
+
+$list_params = array(
+ 'type' => 'object',
+ 'limit' => 4,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+);
+
+//grab the latest 4 blog posts
+$list_params['subtype'] = 'blog';
+$blogs = elgg_list_entities($list_params);
+
+//grab the latest bookmarks
+$list_params['subtype'] = 'bookmarks';
+$bookmarks = elgg_list_entities($list_params);
+
+//grab the latest thewire
+$list_params['subtype'] = 'thewire';
+$thewire = elgg_list_entities($list_params);
+
+//grab the latest files
+$list_params['subtype'] = 'file';
+$files = elgg_list_entities($list_params);
+
+//get the newest members who have an avatar
+$newest_members = elgg_list_entities_from_metadata(array(
+ 'metadata_names' => 'icontime',
+ 'type' => 'user',
+ 'limit' => 10,
+ 'full_view' => false,
+ 'pagination' => false,
+ 'list_type' => 'gallery',
+ 'gallery_class' => 'elgg-gallery-users',
+ 'size' => 'small',
+));
+
+//newest groups
+$list_params['type'] = 'group';
+unset($list_params['subtype']);
+$groups = elgg_list_entities($list_params);
+
+//grab the login form
+$login = elgg_view("core/account/login_box");
+
+elgg_pop_context();
+
+// lay out the content
+$params = array(
+ 'blogs' => $blogs,
+ 'bookmarks' => $bookmarks,
+ 'files' => $files,
+ 'groups' => $groups,
+ 'login' => $login,
+ 'members' => $newest_members,
+ 'thewire' => $thewire,
+);
+$body = elgg_view_layout('custom_index', $params);
+
+// no RSS feed with a "widget" front page
+global $autofeed;
+$autofeed = FALSE;
+
+echo elgg_view_page('', $body);
diff --git a/mod/custom_index/languages/en.php b/mod/custom_index/languages/en.php
new file mode 100644
index 000000000..071ff81e5
--- /dev/null
+++ b/mod/custom_index/languages/en.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Custom Index English language file
+ */
+
+$english = array(
+ 'custom:bookmarks' => "Latest bookmarks",
+ 'custom:groups' => "Latest groups",
+ 'custom:files' => "Latest files",
+ 'custom:blogs' => "Latest blog posts",
+ 'custom:members' => "Newest members",
+);
+
+add_translation("en", $english);
diff --git a/mod/custom_index/manifest.xml b/mod/custom_index/manifest.xml
new file mode 100644
index 000000000..80187efbc
--- /dev/null
+++ b/mod/custom_index/manifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Custom Index</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <description>A demonstration of how to create a front page plugin.</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/custom_index/start.php b/mod/custom_index/start.php
new file mode 100644
index 000000000..48d03f27b
--- /dev/null
+++ b/mod/custom_index/start.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Elgg demo custom index page plugin
+ *
+ */
+
+elgg_register_event_handler('init', 'system', 'custom_index_init');
+
+function custom_index_init() {
+
+ // Extend system CSS with our own styles
+ elgg_extend_view('css/elgg', 'custom_index/css');
+
+ // Replace the default index page
+ elgg_register_plugin_hook_handler('index', 'system', 'custom_index');
+}
+
+function custom_index($hook, $type, $return, $params) {
+ if ($return == true) {
+ // another hook has already replaced the front page
+ return $return;
+ }
+
+ if (!include_once(dirname(__FILE__) . "/index.php")) {
+ return false;
+ }
+
+ // return true to signify that we have handled the front page
+ return true;
+}
diff --git a/mod/custom_index/views/default/custom_index/css.php b/mod/custom_index/views/default/custom_index/css.php
new file mode 100644
index 000000000..4c780a905
--- /dev/null
+++ b/mod/custom_index/views/default/custom_index/css.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Custom Index CSS
+ *
+ */
+?>
+
+/*******************************
+ Custom Index
+********************************/
+.custom-index {
+ padding: 10px 0;
+}
+.elgg-module-highlight {
+ -webkit-box-shadow: 1px 1px 5px #CCC;
+ -moz-box-shadow: 1px 1px 5px #CCC;
+ box-shadow: 1px 1px 5px #CCC;
+}
+.elgg-module-highlight:hover {
+ -webkit-box-shadow: 1px 1px 6px #AAA;
+ -moz-box-shadow: 1px 1px 6px #AAA;
+ box-shadow: 1px 1px 6px #AAA;
+}
diff --git a/mod/custom_index/views/default/page/layouts/custom_index.php b/mod/custom_index/views/default/page/layouts/custom_index.php
new file mode 100644
index 000000000..4f79754b9
--- /dev/null
+++ b/mod/custom_index/views/default/page/layouts/custom_index.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Elgg custom index layout
+ *
+ * You can edit the layout of this page with your own layout and style.
+ * Whatever you put in this view will appear on the front page of your site.
+ *
+ */
+
+$mod_params = array('class' => 'elgg-module-highlight');
+
+?>
+
+<div class="custom-index elgg-main elgg-grid clearfix">
+ <div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner pvm prl">
+<?php
+// left column
+
+// Top box for login or welcome message
+if (elgg_is_logged_in()) {
+ $top_box = "<h2>" . elgg_echo("welcome") . " ";
+ $top_box .= elgg_get_logged_in_user_entity()->name;
+ $top_box .= "</h2>";
+} else {
+ $top_box = $vars['login'];
+}
+echo elgg_view_module('featured', '', $top_box, $mod_params);
+
+// a view for plugins to extend
+echo elgg_view("index/lefthandside");
+
+// the wire
+if (elgg_is_active_plugin('thewire')) {
+ echo elgg_view_module('thewire', elgg_echo("thewire"), $vars['thewire'], $mod_params);
+}
+
+// files
+if (elgg_is_active_plugin('file')) {
+ echo elgg_view_module('featured', elgg_echo("custom:files"), $vars['files'], $mod_params);
+}
+
+// groups
+if (elgg_is_active_plugin('groups')) {
+ echo elgg_view_module('featured', elgg_echo("custom:groups"), $vars['groups'], $mod_params);
+}
+?>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner pvm">
+<?php
+// right column
+
+// a view for plugins to extend
+echo elgg_view("index/righthandside");
+
+// members
+//echo elgg_view_module('featured', elgg_echo("custom:members"), $vars['members'], $mod_params);
+
+// groups
+if (elgg_is_active_plugin('blog')) {
+ echo elgg_view_module('featured', elgg_echo("custom:blogs"), $vars['blogs'], $mod_params);
+}
+
+// files
+if (elgg_is_active_plugin('bookmarks')) {
+ echo elgg_view_module('featured', elgg_echo("custom:bookmarks"), $vars['bookmarks'], $mod_params);
+}
+?>
+ </div>
+ </div>
+</div>
diff --git a/mod/custom_index_widgets/index.php b/mod/custom_index_widgets/index.php
new file mode 100644
index 000000000..dac0db036
--- /dev/null
+++ b/mod/custom_index_widgets/index.php
@@ -0,0 +1,66 @@
+<?php
+
+ elgg_set_context('custom_index_widgets');
+ elgg_set_page_owner_guid(elgg_get_config('site_guid'));
+
+ $widgettypes = elgg_get_widget_types();
+
+ $page_owner = elgg_get_page_owner_guid();
+ $ciw_layout = elgg_get_plugin_setting("ciw_layout", "custom_index_widgets");
+ $ciw_showdashboard = elgg_get_plugin_setting("ciw_showdashboard", "custom_index_widgets");
+
+ $customwidgets = elgg_get_widgets($page_owner, elgg_get_context());
+ $area1widgets = isset($customwidgets[1]) ? $customwidgets[1] : FALSE;
+ $area2widgets = isset($customwidgets[2]) ? $customwidgets[2] : FALSE;
+ $area3widgets = isset($customwidgets[3]) ? $customwidgets[3] : FALSE;
+ /*
+ $area1widgets = elgg_get_widgets($page_owner,elgg_get_context(),1);
+ $area2widgets = elgg_get_widgets($page_owner,elgg_get_context(),2);
+ $area3widgets = elgg_get_widgets($page_owner,elgg_get_context(),3);
+ */
+
+ if (empty($area1widgets) && empty($area2widgets) && empty($area3widgets)) {
+
+ if (isset($vars['area3'])) $vars['area1'] = $vars['area3'];
+ if (isset($vars['area4'])) $vars['area2'] = $vars['area4'];
+ }
+
+ $leftcolumn_widgets_view = custom_index_build_columns($area1widgets,$widgettypes);
+ $middlecolumn_widgets_view = custom_index_build_columns($area2widgets,$widgettypes);
+ $rightcolumn_widgets_view = custom_index_build_columns($area3widgets,$widgettypes);
+
+
+ $content = elgg_view_layout($ciw_layout, array('area1' => $leftcolumn_widgets_view,'area2' => $middlecolumn_widgets_view,'area3' => $rightcolumn_widgets_view, 'layoutmode' => 'index_mode') );
+
+ if (elgg_is_logged_in() && $ciw_showdashboard=="yes"){
+
+ $user_guid = elgg_get_logged_in_user_guid();
+ elgg_set_page_owner_guid($user_guid);
+ elgg_set_context('dashboard');
+
+
+ $dashboardwidgets = elgg_get_widgets($user_guid, elgg_get_context());
+ $area1widgets = isset($dashboardwidgets[1]) ? $dashboardwidgets[1] : FALSE;
+ $area2widgets = isset($dashboardwidgets[2]) ? $dashboardwidgets[2] : FALSE;
+ $area3widgets = isset($dashboardwidgets[3]) ? $dashboardwidgets[3] : FALSE;
+ /*
+ $area1widgets = elgg_get_widgets($user_guid,elgg_get_context(),1);
+ $area2widgets = elgg_get_widgets($user_guid,elgg_get_context(),2);
+ $area3widgets = elgg_get_widgets($user_guid,elgg_get_context(),3);
+ */
+ if (empty($area1widgets) && empty($area2widgets) && empty($area3widgets)) {
+
+ if (isset($vars['area3'])) $vars['area1'] = $vars['area3'];
+ if (isset($vars['area4'])) $vars['area2'] = $vars['area4'];
+
+ }
+
+ $leftcolumn_widgets_view = custom_index_build_columns($area1widgets,$widgettypes);
+ $middlecolumn_widgets_view = custom_index_build_columns($area2widgets,$widgettypes);
+ $rightcolumn_widgets_view = custom_index_build_columns($area3widgets,$widgettypes);
+
+ $content .= elgg_view_layout($ciw_layout, array('area1' => $leftcolumn_widgets_view,'area2' => $middlecolumn_widgets_view,'area3' => $rightcolumn_widgets_view, 'layoutmode' => 'index_mode') );
+ }
+
+ echo elgg_view_page('Index', $content);
+?> \ No newline at end of file
diff --git a/mod/custom_index_widgets/languages/de.php b/mod/custom_index_widgets/languages/de.php
new file mode 100644
index 000000000..808b2fade
--- /dev/null
+++ b/mod/custom_index_widgets/languages/de.php
@@ -0,0 +1,78 @@
+ <?php
+
+ $german = array(
+
+
+ 'custom_index_widgets:latest_bookmarks_index' => "Neueste Lesezeichen",
+ 'custom_index_widgets:latest_groups_index' => "Neueste Gruppen",
+ 'custom_index_widgets:latest_files_index' => "Neueste Dateien",
+ 'custom_index_widgets:latest_blogs_index' => "Neueste Blogeintr&auml;ge",
+ 'custom_index_widgets:latest_members_index' => "Neueste Mitglieder",
+ 'custom_index_widgets:nofiles' => "Keine Dateien gefunden",
+ 'custom_index_widgets:nogroups' => "Keine Gruppen gefunden",
+ 'custom_index_widgets:latest_news_index' => "Neueste Nachrichten",
+ 'custom_index_widgets:latest_pages_index' => "Neueste Seiten",
+ 'custom_index_widgets:latest_events_index' => 'Eingehende Events',
+ 'custom_index_widgets:latest_wire_index' => 'Neuester Wire-Beitrag',
+ 'custom_index_widgets:inline_content_index' => 'Eigenes HTML',
+ 'custom_index_widgets:html_content' => 'Ihr Text',
+ 'custom_index_widgets:latest_generic_index'=>"Generischer Inhalt",
+ 'custom_index_widgets:latest_tasks_index'=>"Neueste Aufgaben",
+ 'custom_index_widgets:latest_activity_index' => 'Aktivit&auml;ten',
+ 'custom_index_widgets:cloud_generic_index'=>"Tag Cloud",
+ 'custom_index_widgets:widget_subtype'=>"Widget-Subtyp",
+ 'custom_index_widgets:metadata_name' => "Metadaten",
+ 'custom_index_widgets:threshold'=> "Thresold",
+ 'custom_index_widgets:latest_izap_videos_index' => 'Neueste Videos',
+ 'custom_index_widgets:display_avatar' => 'Avatar',
+
+ 'custom_index_widgets:rich_media_index' => "Multimedia Inhalte",
+ 'custom_index_widgets:widget_video_width' => "Breite (Nur Zahl, ohne px oder %)",
+ 'custom_index_widgets:widget_video_height' => "H&ouml;he (Nur Zahl, ohne px oder %)",
+ 'custom_index_widgets:widget_video_url' => "URL",
+ 'custom_index_widgets:widget_video_caption' => "&Uuml;berschrift",
+
+ 'custom_index_widgets:layout' => "Layout",
+
+ 'custom_index_widgets:index_2rmsb' => '2 Spalten, [Mittelbreit, Schmal] - [Big]',
+ 'custom_index_widgets:index_2rsmb' => '2 Spalten, [Schmal, Mittelbreit] - [Big]',
+ 'custom_index_widgets:index_2rhhb' => '2 Spalten, [Halbe Breite, Halbe Breite] - [Big]',
+ 'custom_index_widgets:index_1rsss' => '1 Spalte, [Schmal, Schmal, Schmal]',
+ 'custom_index_widgets:index_2rbhh' => '2 Spalten, [Big] -[Halbe Breite, Halbe Breite]',
+ 'custom_index_widgets:index_2rbsm' => '2 Spalten, [Big] -[Schmal, Mittelbreit]',
+ 'custom_index_widgets:index_2rbms' => '2 Spalten, [Big] -[Mittelbreit, Schmal]',
+
+ 'custom_index_widgets:area1' => 'Widgets Zone 1',
+ 'custom_index_widgets:area2' => 'Widgets Zone 2',
+ 'custom_index_widgets:area3' => 'Widgets Zone 3',
+
+ 'custom_index_widgets:admin:notfound' => 'Seite nicht gefunden',
+ 'custom_index_widgets:index' => "Widgets aktiv auf Index",
+ 'custom_index_widgets:num_items' => "Einzahl Module",
+ 'custom_index_widgets:reset' => "Zonen auf Standard setzen",
+
+ 'custom_index_widgets:pleaselogin' => "Anmelden f&uuml;r alle Details ...",
+
+ 'custom_index_widgets:widget_title' => "Widget-Titel &uuml;berschreiben (auf index-Seite anstelle des Standardtitels des Widgets)",
+ 'custom_index_widgets:context_mode' => "Layout-Stil",
+ 'custom_index_widgets:context_list' => "Liste",
+ 'custom_index_widgets:context_detail' => "Details",
+
+ 'custom_index_widgets:login_style'=>"Login-Position",
+ 'custom_index_widgets:inlayout'=>"Im Layout",
+ 'custom_index_widgets:topbar'=>"Top-Leiste",
+ 'custom_index_widgets:widget_all_groups' => "Alle Gruppen",
+
+ "custom_index_widgets:showdashboard"=>"End index with dashboard",
+ "custom_index_widgets:showdashboard_yes"=>"Ya",
+ "custom_index_widgets:showdashboard_no"=>"Nein",
+
+ "custom_index_widgets:guest_only" => "Guest only",
+ "custom_index_widgets:box_style" => "Box Style",
+ "custom_index_widgets:social_share_index" => "Social Share",
+ "custom_index_widgets:login_index"=>"Login",
+ "admin:appearance:custom_index_widgets" => "Index Widgets"
+
+ );
+
+ add_translation("de",$german);
diff --git a/mod/custom_index_widgets/languages/en.php b/mod/custom_index_widgets/languages/en.php
new file mode 100644
index 000000000..ba9cb4859
--- /dev/null
+++ b/mod/custom_index_widgets/languages/en.php
@@ -0,0 +1,82 @@
+<?php
+
+ $english = array(
+
+
+ 'custom_index_widgets:latest_bookmarks_index' => "Latest bookmarks",
+ 'custom_index_widgets:latest_groups_index' => "Latest groups",
+ 'custom_index_widgets:latest_files_index' => "Latest files",
+ 'custom_index_widgets:latest_blogs_index' => "Latest blog posts",
+ 'custom_index_widgets:latest_members_index' => "Newest members",
+ 'custom_index_widgets:nofiles' => "There are no files yet",
+ 'custom_index_widgets:nogroups' => "There are no groups yet",
+ 'custom_index_widgets:latest_news_index' => "Latest news",
+ 'custom_index_widgets:latest_pages_index' => "Latest pages",
+ 'custom_index_widgets:latest_events_index' => 'Incomming events',
+ 'custom_index_widgets:latest_wire_index' => 'Last wire posts',
+ 'custom_index_widgets:inline_content_index' => 'Free html',
+ 'custom_index_widgets:html_content' => 'Your text',
+ 'custom_index_widgets:latest_generic_index'=>"Generic content",
+ 'custom_index_widgets:latest_tasks_index'=>"Latest tasks",
+ 'custom_index_widgets:latest_activity_index' => 'In the river',
+ 'custom_index_widgets:cloud_generic_index'=>"Tag Cloud",
+ 'custom_index_widgets:widget_subtype'=>"Entity subtype",
+ 'custom_index_widgets:metadata_name' => "Metadata",
+ 'custom_index_widgets:threshold'=> "Thresold",
+ 'custom_index_widgets:latest_izap_videos_index' => 'Latest videos',
+ 'custom_index_widgets:display_avatar' => 'Avatar',
+
+ 'custom_index_widgets:rich_media_index' => "Multimédia content",
+ 'custom_index_widgets:widget_video_width' => "Width (number without px or %)",
+ 'custom_index_widgets:widget_video_height' => "Heigh (number without px or %)",
+ 'custom_index_widgets:widget_video_url' => "Url",
+ 'custom_index_widgets:widget_video_caption' => "Caption",
+
+ 'custom_index_widgets:layout' => "Layout",
+
+ 'custom_index_widgets:index_2rmsb' => '2 rows, [Medium, Small] - [Big]',
+ 'custom_index_widgets:index_2rsmb' => '2 rows, [Small, Medium] - [Big]',
+ 'custom_index_widgets:index_2rhhb' => '2 rows, [Half, Half] - [Big]',
+ 'custom_index_widgets:index_1rsss' => '1 row, [Small, Small, Small]',
+ 'custom_index_widgets:index_2rbhh' => '2 rows, [Big] -[Half, Half]',
+ 'custom_index_widgets:index_2rbsm' => '2 rows, [Big] -[Small, Medium]',
+ 'custom_index_widgets:index_2rbms' => '2 rows, [Big] -[Medium, Small]',
+
+ 'custom_index_widgets:area1' => 'Widgets Zone 1',
+ 'custom_index_widgets:area2' => 'Widgets Zone 2',
+ 'custom_index_widgets:area3' => 'Widgets Zone 3',
+
+ 'custom_index_widgets:admin:notfound' => 'Page not found',
+ 'custom_index_widgets:index' => "Index widgetisation",
+ 'custom_index_widgets:num_items' => "Number of items",
+
+ 'custom_index_widgets:pleaselogin' => "Please, please, login to see more...",
+
+ 'custom_index_widgets:widget_title' => "Override widget title (will be shown only on the index in replacement of widget default title)",
+ 'custom_index_widgets:context_mode' => "Layout style",
+ 'custom_index_widgets:context_list' => "List",
+ 'custom_index_widgets:context_detail' => "Detail",
+
+ 'custom_index_widgets:login_style'=>"Login position",
+ 'custom_index_widgets:inlayout'=>"In layout",
+ 'custom_index_widgets:topbar'=>"Top bar",
+ 'custom_index_widgets:widget_all_groups' => "All groups",
+
+ "custom_index_widgets:showdashboard"=>"End index with dashboard",
+ "custom_index_widgets:showdashboard_yes"=>"Yes",
+ "custom_index_widgets:showdashboard_no"=>"No",
+ "custom_index_widgets:guest_only" => "Guest only",
+ "custom_index_widgets:box_style" => "Box Style",
+ "custom_index_widgets:social_share_index" => "Social Share",
+ "custom_index_widgets:login_index"=>"Login",
+ "admin:appearance:custom_index_widgets" => "Index Widgets",
+ // time limit
+ "custom_index_widgets:widget_created_time_limit" => "Time lapse",
+ "custom_index_widgets:time_limit:all" => "All time",
+ "custom_index_widgets:time_limit:day" => "Last day",
+ "custom_index_widgets:time_limit:week" => "Last week",
+ "custom_index_widgets:time_limit:month" => "Last month"
+
+ );
+
+ add_translation("en",$english);
diff --git a/mod/custom_index_widgets/languages/es.php b/mod/custom_index_widgets/languages/es.php
new file mode 100644
index 000000000..c8dc35633
--- /dev/null
+++ b/mod/custom_index_widgets/languages/es.php
@@ -0,0 +1,78 @@
+<?php
+
+ $spanish = array(
+
+
+ 'custom_index_widgets:latest_bookmarks_index' => "Ultimos favoritos",
+ 'custom_index_widgets:latest_groups_index' => "Ultimos Grupos",
+ 'custom_index_widgets:latest_files_index' => "Ultimos Archivos",
+ 'custom_index_widgets:latest_blogs_index' => "Ultimos Articulos de Blogs",
+ 'custom_index_widgets:latest_members_index' => "Nuevos habitantes",
+ 'custom_index_widgets:nofiles' => "No hay archivos todavia",
+ 'custom_index_widgets:nogroups' => "No hay frupos todavia",
+ 'custom_index_widgets:latest_news_index' => "Ultimas noticias",
+ 'custom_index_widgets:latest_pages_index' => "Ultimas paginas",
+ 'custom_index_widgets:latest_events_index' => 'Eventos anunciados',
+ 'custom_index_widgets:latest_wire_index' => 'Ultimos post',
+ 'custom_index_widgets:inline_content_index' => 'Html libre',
+ 'custom_index_widgets:html_content' => 'Tu texto',
+ 'custom_index_widgets:latest_generic_index'=>"Contenido generico",
+ 'custom_index_widgets:latest_tasks_index'=>"Ultimas tareas",
+ 'custom_index_widgets:latest_activity_index' => 'In the river',
+ 'custom_index_widgets:cloud_generic_index'=>"Nube de tags",
+ 'custom_index_widgets:widget_subtype'=>"Subtipo de la entidad",
+ 'custom_index_widgets:metadata_name' => "Metadata",
+ 'custom_index_widgets:threshold'=> "Thresold",
+ 'custom_index_widgets:latest_izap_videos_index' => 'Ultimos videos',
+ 'custom_index_widgets:display_avatar' => 'Avatar',
+
+ 'custom_index_widgets:rich_media_index' => "Contenido multimedia",
+ 'custom_index_widgets:widget_video_width' => "Ancho (numeros sin px o %)",
+ 'custom_index_widgets:widget_video_height' => "Alto (numeros sin px o %)",
+ 'custom_index_widgets:widget_video_url' => "Url",
+ 'custom_index_widgets:widget_video_caption' => "Caption",
+
+ 'custom_index_widgets:layout' => "Layout",
+
+ 'custom_index_widgets:index_2rmsb' => '2 rows, [Medio, Peque] - [Grande]',
+ 'custom_index_widgets:index_2rsmb' => '2 rows, [Peque, Medio] - [Grande]',
+ 'custom_index_widgets:index_2rhhb' => '2 rows, [Mitad, Mitad] - [Grande]',
+ 'custom_index_widgets:index_1rsss' => '1 row, [Peque, Peque, Peque]',
+ 'custom_index_widgets:index_2rbhh' => '2 rows, [Grande] -[Mitad, Mitad]',
+ 'custom_index_widgets:index_2rbsm' => '2 rows, [Grande] -[Peque, Medio]',
+ 'custom_index_widgets:index_2rbms' => '2 rows, [Grande] -[Medio, Peque]',
+
+ 'custom_index_widgets:area1' => 'Widgets Zona 1',
+ 'custom_index_widgets:area2' => 'Widgets Zona 2',
+ 'custom_index_widgets:area3' => 'Widgets Zona 3',
+
+ 'custom_index_widgets:admin:notfound' => 'Pagina no encontrada',
+ 'custom_index_widgets:index' => "Index widgetisation",
+ 'custom_index_widgets:num_items' => "Numero de items",
+ 'custom_index_widgets:reset' => "Restablecer todas las zonas",
+
+ 'custom_index_widgets:pleaselogin' => "Por favor, por favor, inicie sesión para ver mas...",
+
+ 'custom_index_widgets:widget_title' => "Título del widget Override (solo se mostraran en el índice en sustitucion del título widget por defecto)",
+ 'custom_index_widgets:context_mode' => "Estilo",
+ 'custom_index_widgets:context_list' => "Lista",
+ 'custom_index_widgets:context_detail' => "Detalle",
+
+ 'custom_index_widgets:login_style'=>"Posicion de Login",
+ 'custom_index_widgets:inlayout'=>"Barra inferior",
+ 'custom_index_widgets:topbar'=>"Barra superior",
+ 'custom_index_widgets:widget_all_groups' => "Todos los grupos",
+
+ "custom_index_widgets:showdashboard"=>"End index with dashboard",
+ "custom_index_widgets:showdashboard_yes"=>"Si",
+ "custom_index_widgets:showdashboard_no"=>"No",
+ "custom_index_widgets:guest_only" => "Guest only",
+ "custom_index_widgets:box_style" => "Box Style",
+ "custom_index_widgets:social_share_index" => "Social Share",
+ "custom_index_widgets:login_index"=>"Login",
+ "admin:appearance:custom_index_widgets" => "Index Widgets"
+
+ );
+
+ add_translation("es",$spanish);
+
diff --git a/mod/custom_index_widgets/languages/fr.php b/mod/custom_index_widgets/languages/fr.php
new file mode 100644
index 000000000..486500710
--- /dev/null
+++ b/mod/custom_index_widgets/languages/fr.php
@@ -0,0 +1,80 @@
+<?php
+
+ $french = array(
+
+ 'custom_index_widgets:latest_bookmarks_index' => "Derniers bookmarks",
+ 'custom_index_widgets:latest_groups_index' => "Groupes les + r&eacute;cents",
+ 'custom_index_widgets:latest_files_index' => "Fichiers les + r&eacute;cents",
+ 'custom_index_widgets:latest_blogs_index' => "Derniers ajouts de blogs",
+ 'custom_index_widgets:latest_members_index' => "Nouveaux membres",
+ 'custom_index_widgets:nofiles' => "Il n'y a aucun fichier pour l'instant",
+ 'custom_index_widgets:nogroups' => "Il n'y a aucun groupe pour l'instant",
+ 'custom_index_widgets:latest_news_index' => "Dernieres news",
+ 'custom_index_widgets:latest_pages_index' => "Dernieres pages",
+ 'custom_index_widgets:latest_events_index' => 'Prochains evenements',
+ 'custom_index_widgets:latest_wire_index' => 'Derniers messages',
+ 'custom_index_widgets:inline_content_index' => 'Texte libre',
+ 'custom_index_widgets:html_content' => 'Votre texte',
+ 'custom_index_widgets:latest_generic_index'=>"Contenu générique",
+ 'custom_index_widgets:latest_tasks_index'=>"Tâches récentes",
+ 'custom_index_widgets:latest_activity_index' => 'En bref',
+ 'custom_index_widgets:cloud_generic_index'=>"Nuage de tags",
+ 'custom_index_widgets:widget_subtype'=>"Type d'entité",
+ 'custom_index_widgets:metadata_name' => "Metadata",
+ 'custom_index_widgets:threshold'=> "Seuil minimal",
+ 'custom_index_widgets:latest_izap_videos_index' => 'Dernières vidéos',
+ 'custom_index_widgets:display_avatar' => 'Avatar',
+
+ 'custom_index_widgets:rich_media_index' => "Contenu multimédia",
+ 'custom_index_widgets:widget_video_width' => "Largeur de la vidéo (chiffre sans px ni %)",
+ 'custom_index_widgets:widget_video_height' => "Hauteur de la vidéo (chiffre sans px ni %)",
+ 'custom_index_widgets:widget_video_url' => "Url de la vidéo",
+ 'custom_index_widgets:widget_video_caption' => "Légende de la vidéo",
+
+ 'custom_index_widgets:layout' => "Présentation",
+
+ 'custom_index_widgets:index_2rmsb' => '2 lignes, [Medium, Small] - [Big]',
+ 'custom_index_widgets:index_2rsmb' => '2 lignes, [Small, Medium] - [Big]',
+ 'custom_index_widgets:index_2rhhb' => '2 lignes, [Half, Half] - [Big]',
+ 'custom_index_widgets:index_1rsss' => '1 ligne, [Small, Small, Small]',
+ 'custom_index_widgets:index_1rsms' => '1 ligne, [Small, Medium, Small]',
+
+ 'custom_index_widgets:index_2rbhh' => '2 lignes, [Big] -[Half, Half]',
+ 'custom_index_widgets:index_2rbsm' => '2 lignes, [Big] -[Small, Medium]',
+ 'custom_index_widgets:index_2rbms' => '2 lignes, [Big] -[Medium, Small]',
+
+ 'custom_index_widgets:area1' => 'Widgets Zone 1',
+ 'custom_index_widgets:area2' => 'Widgets Zone 2',
+ 'custom_index_widgets:area3' => 'Widgets Zone 3',
+
+ 'custom_index_widgets:admin:notfound' => 'Page non trouv&eacute;e',
+ 'custom_index_widgets:index' => "Configuration de l'index",
+ 'custom_index_widgets:num_items' => "Nombre d'items",
+ 'custom_index_widgets:reset' => "Supprimer tout les widgets",
+
+ 'custom_index_widgets:pleaselogin' => "Allez, connectez-vous quoi ...",
+
+ 'custom_index_widgets:widget_title' => "Titre de remplacement (est affiché à la place du titre du widget uniquement sur la page d'accueil)",
+ 'custom_index_widgets:context_mode' => "Mode d'affichage",
+ 'custom_index_widgets:context_list' => "Liste",
+ 'custom_index_widgets:context_detail' => "Détail",
+
+ 'custom_index_widgets:login_style'=>"Position de la zone login",
+ 'custom_index_widgets:inlayout'=>"Dans la page",
+ 'custom_index_widgets:topbar'=>"Top bar",
+
+ "custom_index_widgets:showdashboard"=>"Afficher le dashboard en fin de page",
+ "custom_index_widgets:showdashboard_yes"=>"Oui",
+ "custom_index_widgets:showdashboard_no"=>"Non",
+
+ 'custom_index_widgets:widget_all_groups' => "Tous les groupes",
+ "search:go" => "Ok",
+ "custom_index_widgets:guest_only" => "Que pour les invités",
+ "custom_index_widgets:box_style" => "Type d'affichage",
+ "custom_index_widgets:social_share_index" => "Social Share",
+ "custom_index_widgets:login_index"=>"Login",
+ "admin:appearance:custom_index_widgets" => "Index Widgets"
+
+ );
+
+ add_translation("fr",$french);
diff --git a/mod/custom_index_widgets/manifest.xml b/mod/custom_index_widgets/manifest.xml
new file mode 100644
index 000000000..33784b313
--- /dev/null
+++ b/mod/custom_index_widgets/manifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Custom index widgets</name>
+ <author>Fx NION, Lorea developers</author>
+ <version>1.8.0</version>
+ <category>content</category>
+ <category>widget</category>
+ <description>Customise your index, with severals layout and customisable widgets. And get fun.</description>
+ <website>https://lorea.org/</website>
+ <copyright>(C) Fx NION 2009-2011, Lorea 2012-2013</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8.3</version>
+ </requires>
+ <conflicts>
+ <type>plugin</type>
+ <name>custom_index</name>
+ </conflicts>
+ <activate_on_install>false</activate_on_install>
+</plugin_manifest>
diff --git a/mod/custom_index_widgets/start.php b/mod/custom_index_widgets/start.php
new file mode 100644
index 000000000..70a755dc2
--- /dev/null
+++ b/mod/custom_index_widgets/start.php
@@ -0,0 +1,159 @@
+<?php
+
+elgg_register_event_handler('init', 'system', 'custom_index_widgets_init');
+
+function custom_index_widgets_init() {
+
+ elgg_extend_view('css/elgg','custom_index_widgets/css');
+
+ elgg_register_admin_menu_item('configure', 'custom_index_widgets', 'appearance');
+
+
+ $ciw_layout = elgg_get_plugin_setting("ciw_layout", "custom_index_widgets");
+ if ($ciw_layout == NULL) {
+ elgg_set_plugin_setting("ciw_layout", "index_2rmsb", "custom_index_widgets");
+ }
+
+ $ciw_showdashboard = elgg_get_plugin_setting("ciw_showdashboard", "custom_index_widgets");
+ if ($ciw_showdashboard == NULL) {
+ elgg_set_plugin_setting("ciw_showdashboard", "yes", "custom_index_widgets");
+ }
+ elgg_register_widget_type('latest_members_index', elgg_echo('custom_index_widgets:latest_members_index'), elgg_echo('custom_index_widgets:latest_members_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('inline_content_index', elgg_echo('custom_index_widgets:inline_content_index'), elgg_echo('custom_index_widgets:inline_content_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('rich_media_index', elgg_echo('custom_index_widgets:rich_media_index'), elgg_echo('custom_index_widgets:rich_media_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('latest_generic_index', elgg_echo('custom_index_widgets:latest_generic_index'), elgg_echo('custom_index_widgets:latest_generic_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('latest_activity_index', elgg_echo('custom_index_widgets:latest_activity_index'), elgg_echo('custom_index_widgets:latest_activity_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('cloud_generic_index', elgg_echo('custom_index_widgets:cloud_generic_index'), elgg_echo('custom_index_widgets:cloud_generic_index'), "custom_index_widgets", true);
+ elgg_register_widget_type('login_index', elgg_echo('custom_index_widgets:login_index'), elgg_echo('custom_index_widgets:login_index'), "custom_index_widgets", true);
+
+ if (elgg_is_active_plugin('groups')) {
+ elgg_register_widget_type('latest_groups_index', elgg_echo('custom_index_widgets:latest_groups_index'), elgg_echo('custom_index_widgets:latest_groups_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('file')) {
+ elgg_register_widget_type('latest_files_index', elgg_echo('custom_index_widgets:latest_files_index'), elgg_echo('custom_index_widgets:latest_files_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('news')) {
+ elgg_register_widget_type('latest_news_index', elgg_echo('custom_index_widgets:latest_news_index'), elgg_echo('custom_index_widgets:latest_news_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('bookmarks_enhanced') or elgg_is_active_plugin('bookmarks')) {
+ elgg_register_widget_type('latest_bookmarks_index', elgg_echo('custom_index_widgets:latest_bookmarks_index'), elgg_echo('custom_index_widgets:latest_bookmarks_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('blog')) {
+ elgg_register_widget_type('latest_blogs_index', elgg_echo('custom_index_widgets:latest_blogs_index'), elgg_echo('custom_index_widgets:latest_blogs_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('pages')) {
+ elgg_register_widget_type('latest_pages_index', elgg_echo('custom_index_widgets:latest_pages_index'), elgg_echo('custom_index_widgets:latest_pages_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('event_calendar')) {
+ elgg_register_widget_type('latest_events_index', elgg_echo('custom_index_widgets:latest_events_index'), elgg_echo('custom_index_widgets:latest_events_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('tidypics')) {
+ elgg_register_widget_type('latest_photos_index', elgg_echo("tidypics:widget:latest"), elgg_echo("tidypics:widget:latest_descr"), "custom_index_widgets", true);
+ elgg_register_widget_type('latest_album_index', elgg_echo("tidypics:widget:albums"), elgg_echo("tidypics:widget:latest_descr"), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('thewire')) {
+ elgg_register_widget_type('latest_wire_index', elgg_echo('custom_index_widgets:latest_wire_index'), elgg_echo('custom_index_widgets:latest_wire_index'), "custom_index_widgets", true);
+ }
+
+ if (elgg_is_active_plugin('tasks')) {
+ elgg_register_widget_type('latest_tasks_index', elgg_echo('custom_index_widgets:latest_tasks_index'), elgg_echo('custom_index_widgets:latest_tasks_index'), "custom_index_widgets", true);
+ }
+
+ if (elgg_is_active_plugin('izap_videos')) {
+ elgg_register_widget_type('latest_izap_videos_index',elgg_echo ('custom_index_widgets:latest_izap_videos_index'), elgg_echo('custom_index_widgets:latest_izap_videos_index'), "custom_index_widgets", true);
+ }
+ if (elgg_is_active_plugin('simplepie')) {
+ elgg_register_widget_type('feed_reader_index', elgg_echo('simplepie:widget'),elgg_echo('simplepie:description'),'custom_index_widgets', true);
+ }
+
+ elgg_register_plugin_hook_handler('index', 'system', 'custom_index_widgets');
+ elgg_register_page_handler ('custom_index_widgets', 'custom_index_widgets_page_handler');
+
+}
+
+function custom_index_widgets($hook, $type, $return, $params) {
+ if ($return == true) {
+ // another hook has already replaced the front page
+ return $return;
+ }
+
+ if (!include_once(dirname(__FILE__) . "/index.php")) {
+ return false;
+ }
+
+ // return true to signify that we have handled the front page
+ return true;
+}
+
+
+function custom_index_widgets_page_handler($page) {
+ if (isset ($page [0])) {
+ switch ($page [0]) {
+ case "edit" :
+ @include (dirname ( __FILE__ ) . "/edit.php");
+ break;
+ }
+ } else {
+ register_error(elgg_echo("custom_index_widgets:admin:notfound"));
+ forward(elgg_get_site_url());
+ }
+ return true;
+}
+
+
+function custom_index_show_widget_area($areawidgets){
+ if (is_array($areawidgets) && sizeof($areawidgets) > 0) {
+ foreach($areawidgets as $widget) {
+ if ($widget instanceof ElggWidget) {
+ $vars['entity'] = $widget;
+ $handler = $widget->handler;
+ if (elgg_view_exists("widgets/$handler/content")) {
+ $content = elgg_view("widgets/$handler/content", $vars);
+ } else {
+ elgg_deprecated_notice("widgets use content as the display view", 1.8);
+ $content = elgg_view("widgets/$handler/view", $vars);
+ }
+ echo elgg_view_module('featured', $widget->title, $content, array('class' => 'elgg-module-highlight'));
+ } else {
+ echo $widget;
+ }
+ }
+ }
+}
+
+function custom_index_build_columns($area_widget_list, $widgettypes, $build_server_side = true) {
+
+ $column_widgets_view = array();
+ $column_widgets_string = "";
+
+ if (is_array($area_widget_list) && sizeof($area_widget_list) > 0) {
+ foreach ($area_widget_list as $widget) {
+ if ($build_server_side ) {
+ $title = $widget->widget_title;
+ if (!$title) {
+ $title = $widgettypes[$widget->handler]->name;
+ if (!$title) {
+ $title = $widget->handler;
+ }
+ }
+ $widget->title = $title;
+
+ if (($widget->guest_only == "yes" && !elgg_is_logged_in()) || $widget->guest_only == "no" || !isset($widget->guest_only)) {
+ $column_widgets_view[] = $widget;
+ }
+ } else {
+ if (!empty($column_widgets_string)) {
+ $column_widgets_string .= "::";
+ }
+ $column_widgets_string .= "{$widget->handler}::{$widget->getGUID()}";
+ }
+ }
+
+ if ($build_server_side) {
+ return $column_widgets_view;
+ } else {
+ return $column_widgets_string;
+ }
+ }
+ return null;
+}
diff --git a/mod/custom_index_widgets/views/default/admin/appearance/custom_index_widgets.php b/mod/custom_index_widgets/views/default/admin/appearance/custom_index_widgets.php
new file mode 100644
index 000000000..491c878e5
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/admin/appearance/custom_index_widgets.php
@@ -0,0 +1,56 @@
+<?php
+
+
+elgg_push_context('custom_index_widgets');
+elgg_set_page_owner_guid(elgg_get_config('site_guid'));
+
+$num_columns = elgg_extract('num_columns', $vars, 3);
+$show_add_widgets = elgg_extract('show_add_widgets', $vars, true);
+$exact_match = elgg_extract('exact_match', $vars, true);
+$show_access = elgg_extract('show_access', $vars, true);
+
+
+$owner = elgg_get_page_owner_entity();
+
+
+$context = elgg_get_context();
+$widget_types = elgg_get_widget_types($context, true);
+$widgets = elgg_get_widgets($owner->guid, $context);
+
+
+if (elgg_can_edit_widget_layout($context)) {
+
+ if ($show_add_widgets) {
+ echo elgg_view('page/layouts/widgets/add_button');
+ }
+ $params = array(
+ 'widgets' => $widgets,
+ 'context' => $context,
+ 'exact_match' => $exact_match,
+ );
+
+ echo elgg_view('page/layouts/widgets/add_panel', $params);
+}
+
+echo $vars['content'];
+
+$widget_class = "elgg-col-1of{$num_columns}";
+for ($column_index = 1; $column_index <= $num_columns; $column_index++) {
+ if (isset($widgets[$column_index])) {
+ $column_widgets = $widgets[$column_index];
+ } else {
+ $column_widgets = array();
+ }
+
+ echo "<div class=\"$widget_class elgg-widgets\" id=\"elgg-widget-col-$column_index\">";
+ if (sizeof($column_widgets) > 0) {
+ foreach ($column_widgets as $widget) {
+ if (array_key_exists($widget->handler, $widget_types)) {
+ echo elgg_view_entity($widget, array('show_access' => $show_access));
+ }
+ }
+ }
+ echo '</div>';
+}
+
+
diff --git a/mod/custom_index_widgets/views/default/custom_index_widgets/css.php b/mod/custom_index_widgets/views/default/custom_index_widgets/css.php
new file mode 100644
index 000000000..e80d28684
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/custom_index_widgets/css.php
@@ -0,0 +1,347 @@
+<?php
+ /**
+ * Custom Index page css extender
+ *
+ * @package custom_index
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author Curverider <info@elgg.com>
+ * @copyright Curverider Ltd 2008-2009
+ * @link http://elgg.org/
+ */
+?>
+
+.icon_members {
+ float:left;
+ margin:2pt 5px 3px 0pt;
+}
+
+.icon_latest {
+ margin:0 auto;
+}
+#login-box{
+ width:100%;
+}
+#login-box form{
+ width:auto;
+}
+
+#login-box input[type="text"],
+#login-box input[type="password"]{
+ width: 95%;
+}
+
+#rightcolumn_widgets,
+#leftcolumn_widgets,
+#middlecolumn_widgets{
+ min-height: 1px;
+}
+
+
+#rightcolumn_widgets.small_edit_mode_box,
+#leftcolumn_widgets.small_edit_mode_box,
+#middlecolumn_widgets.small_edit_mode_box,
+#customise_page_view table tr td h2.small_edit_mode_box {
+ margin:5px 10px 0 0;
+ width: auto;
+}
+#rightcolumn_widgets.medium_edit_mode_box,
+#leftcolumn_widgets.medium_edit_mode_box,
+#middlecolumn_widgets.medium_edit_mode_box,
+#customise_page_view table tr td h2.medium_edit_mode_box{
+ margin:5px 10px 0 0;
+ width: auto;
+}
+#rightcolumn_widgets.big_edit_mode_box,
+#leftcolumn_widgets.big_edit_mode_box,
+#middlecolumn_widgets.big_edit_mode_box,
+#customise_page_view table tr td h2.big_edit_mode_box{
+ margin:5px 10px 0 0;
+ width: auto;
+}
+#rightcolumn_widgets.half_edit_mode_box,
+#leftcolumn_widgets.half_edit_mode_box,
+#middlecolumn_widgets.half_edit_mode_box,
+#customise_page_view table tr td h2.half_edit_mode_box{
+ margin:5px 10px 0 0;
+ width: auto;
+}
+
+#rightcolumn_widgets.small_index_mode_box,
+#leftcolumn_widgets.small_index_mode_box,
+#middlecolumn_widgets.small_index_mode_box,
+#customise_page_view table tr td h2.small_index_mode_box {
+ /*width: 312px;*/
+ width: auto;
+ padding: 0 0 5px;
+ margin-right: 10px;
+ border: 0 none;
+}
+#rightcolumn_widgets.medium_index_mode_box,
+#leftcolumn_widgets.medium_index_mode_box,
+#middlecolumn_widgets.medium_index_mode_box,
+#customise_page_view table tr td h2.medium_index_mode_box{
+ /*width: 608px;*/
+ width: auto;
+ padding: 0 0 5px;
+ margin-right: 10px;
+ border: 0 none;
+}
+#rightcolumn_widgets.big_index_mode_box,
+#leftcolumn_widgets.big_index_mode_box,
+#middlecolumn_widgets.big_index_mode_box,
+#customise_page_view table tr td h2.big_index_mode_box{
+ width: auto;
+ padding: 0 0 5px;
+ margin-right: 10px;
+ border: 0 none;
+}
+#rightcolumn_widgets.half_index_mode_box,
+#leftcolumn_widgets.half_index_mode_box,
+#middlecolumn_widgets.half_index_mode_box,
+#customise_page_view.half_index_mode_box h2{
+ /*width: 460px;*/
+ width: auto;
+ padding: 0 0 5px;
+ margin: 10px 3px;
+ border: 0 none;
+}
+
+table.index_mode{
+ width: 96%;
+ margin-left: 2%;
+ border: 0 none;
+}
+
+td.small {
+ width: 38%;
+}
+td.half {
+ width: 47%;
+}
+td.medium {
+ width: 57%;
+}
+td.big {
+ width: 100%;
+}
+.logintop{
+ margin:0 auto;
+ padding:0;
+ padding-top: 3px;
+ width:990px;
+}
+.logintop_links{
+ margin-left:80px;
+}
+
+.logintop_links a {
+ margin:0 0 0 2px;
+ color:#999999;
+ padding:3px;
+}
+.logintop_links a:hover {
+ color:#eeeeee;
+}
+
+#logintopform{
+ color: #BBBBBB;
+ font-size: 12px;
+}
+
+#logintopform input.logintop_input {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ background-color:#FFFFFF;
+ border:1px solid #BBBBBB;
+ color:#999999;
+ font-size:12px;
+ font-weight:bold;
+ margin:0pt;
+ padding:2px;
+ width:180px;
+ height:12px;
+}
+#logintopform input.logintop_submit_button {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ color:#333333;
+ background: #cccccc;
+ border:none;
+ font-size:12px;
+ font-weight:bold;
+ margin:0px;
+ padding:2px;
+ width:auto;
+ height:18px;
+ cursor:pointer;
+}
+#logintopform input.logintop_submit_button:hover {
+ color:#ffffff;
+ background: #4690d6;
+}
+
+/* ***************************************
+STANDARD BOXES
+*************************************** */
+.standard_box {
+ margin: 0 0 20px 0;
+ height:auto;
+
+}
+/* IE6 fix */
+* html .standard_box {
+ height:10px;
+}
+.standard_box_header {
+ color: #4690d6;
+ padding: 5px 10px 5px 10px;
+ margin:0;
+ border-left: 1px solid white;
+ border-right: 1px solid #cccccc;
+ border-bottom: 1px solid #cccccc;
+ -moz-border-radius-topleft:8px;
+ -moz-border-radius-topright:8px;
+ -webkit-border-top-right-radius:8px;
+ -webkit-border-top-left-radius:8px;
+ background:#dedede;
+}
+.standard_box_header h1 {
+ color: #0054a7;
+ font-size:1.25em;
+ line-height: 1.2em;
+}
+.standard_box_content {
+ padding: 10px 0 10px 0;
+ margin:0;
+ height:auto;
+ background:#dedede;
+ -moz-border-radius-bottomleft:8px;
+ -moz-border-radius-bottomright:8px;
+ -webkit-border-bottom-right-radius:8px;
+ -webkit-border-bottom-left-radius:8px;
+ border-left: 1px solid white;
+ border-right: 1px solid #cccccc;
+ border-bottom: 1px solid #cccccc;
+}
+.standard_box_content .contentWrapper {
+ margin-bottom:5px;
+}
+.standard_box_editpanel {
+ display: none;
+ background: #a8a8a8;
+ padding:10px 10px 5px 10px;
+ border-left: 1px solid white;
+ border-bottom: 1px solid white;
+}
+.standard_box_editpanel p {
+ margin:0 0 5px 0;
+}
+.standard_box_header a.toggle_box_contents {
+ color: #4690d6;
+ cursor:pointer;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size:20px;
+ font-weight: bold;
+ text-decoration:none;
+ float:right;
+ margin: 0;
+ margin-top: -7px;
+}
+.standard_box_header a.toggle_box_edit_panel {
+ color: #4690d6;
+ cursor:pointer;
+ font-size:9px;
+ text-transform: uppercase;
+ text-decoration:none;
+ font-weight: normal;
+ float:right;
+ margin: 3px 10px 0 0;
+}
+.standard_box_editpanel label {
+ font-weight: normal;
+ font-size: 100%;
+}
+
+
+/* ***************************************
+PLAIN BOXES
+*************************************** */
+.plain_box , .plain.collapsable_box{
+ margin: 0 0 20px 0;
+ height:auto;
+
+}
+/* IE6 fix */
+* html .plain_box , * html .plain.collapsable_box {
+ height:10px;
+}
+.plain_box_header , .plain.collapsable_box_header{
+ color: #4690d6;
+ padding: 5px 10px 5px 10px;
+ margin:0;
+ border-left: 1px solid #cccccc;
+ border-right: 1px solid #cccccc;
+ border-top: 1px solid #cccccc;
+ -moz-border-radius-topleft:8px;
+ -moz-border-radius-topright:8px;
+ -webkit-border-top-right-radius:8px;
+ -webkit-border-top-left-radius:8px;
+ background:transparent;
+}
+.plain_box_header h1, .plain.collapsable_box_header h1 {
+ color: #0054a7;
+ font-size:1.25em;
+ line-height: 1.2em;
+}
+.plain_box_content, .plain.collapsable_box_content {
+ padding: 10px 0 10px 0;
+ margin:0;
+ height:auto;
+ -moz-border-radius-bottomleft:8px;
+ -moz-border-radius-bottomright:8px;
+ -webkit-border-bottom-right-radius:8px;
+ -webkit-border-bottom-left-radius:8px;
+ border-left: 1px solid #cccccc;
+ border-right: 1px solid #cccccc;
+ border-bottom: 1px solid #cccccc;
+ background:transparent;
+
+}
+.plain_box_content .contentWrapper , .plain.collapsable_box_content .contentWrapper{
+ margin-bottom:5px;
+}
+.plain_box_editpanel .plain.collapsable_box_editpanel{
+ display: none;
+ background: #a8a8a8;
+ padding:10px 10px 5px 10px;
+ border-left: 1px solid white;
+ border-bottom: 1px solid white;
+}
+.plain_box_editpanel p , .plain.collapsable_box_editpanel{
+ margin:0 0 5px 0;
+}
+.plain_box_header a.toggle_box_contents , .plain.collapsable_box_header a.toggle_box_contents{
+ color: #4690d6;
+ cursor:pointer;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size:20px;
+ font-weight: bold;
+ text-decoration:none;
+ float:right;
+ margin: 0;
+ margin-top: -7px;
+}
+.plain_box_header a.toggle_box_edit_panel , .plain.collapsable_box_header a.toggle_box_edit_panel {
+ color: #4690d6;
+ cursor:pointer;
+ font-size:9px;
+ text-transform: uppercase;
+ text-decoration:none;
+ font-weight: normal;
+ float:right;
+ margin: 3px 10px 0 0;
+}
+.plain_box_editpanel label , .plain.collapsable_box_editpanel label{
+ font-weight: normal;
+ font-size: 100%;
+}
diff --git a/mod/custom_index_widgets/views/default/custom_index_widgets/footerlinks.php b/mod/custom_index_widgets/views/default/custom_index_widgets/footerlinks.php
new file mode 100644
index 000000000..ed92a9032
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/custom_index_widgets/footerlinks.php
@@ -0,0 +1,3 @@
+<div class="mts float-alt">
+<a href="http://fxnion.free.fr/"><img src="<?php echo elgg_get_site_url(); ?>mod/custom_index_widgets/images/fxnion_elgg_custom_index.gif" alt="Elgg Custom index by Fx Nion" title="Elgg Custom index by Fx Nion"/></a>
+</div>
diff --git a/mod/custom_index_widgets/views/default/page/layouts/edit_widgets.php b/mod/custom_index_widgets/views/default/page/layouts/edit_widgets.php
new file mode 100644
index 000000000..f61cea356
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/edit_widgets.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Elgg widgets layout
+ *
+ * @uses $vars['content'] Optional display box at the top of layout
+ * @uses $vars['num_columns'] Number of widget columns for this layout (3)
+ * @uses $vars['show_add_widgets'] Display the add widgets button and panel (true)
+ * @uses $vars['exact_match'] Widgets must match the current context (false)
+ * @uses $vars['show_access'] Show the access control (true)
+ */
+
+$num_columns = elgg_extract('num_columns', $vars, 3);
+$show_add_widgets = elgg_extract('show_add_widgets', $vars, true);
+$exact_match = elgg_extract('exact_match', $vars, false);
+$show_access = elgg_extract('show_access', $vars, true);
+
+$owner = elgg_get_page_owner_entity();
+
+$widget_types = elgg_get_widget_types();
+
+$context = elgg_get_context();
+//elgg_push_context('widgets');
+
+$widgets = elgg_get_widgets($owner->guid, $context);
+
+if (elgg_can_edit_widget_layout($context)) {
+ if ($show_add_widgets) {
+ echo elgg_view('page/layouts/widgets/add_button');
+ }
+ $params = array(
+ 'widgets' => $widgets,
+ 'context' => $context,
+ 'exact_match' => $exact_match,
+ );
+ echo elgg_view('page/layouts/widgets/add_panel', $params);
+}
+
+echo $vars['content'];
+
+$widget_class = "elgg-col-1of{$num_columns}";
+for ($column_index = 1; $column_index <= $num_columns; $column_index++) {
+ if (isset($widgets[$column_index])) {
+ $column_widgets = $widgets[$column_index];
+ } else {
+ $column_widgets = array();
+ }
+
+ echo "<div class=\"$widget_class elgg-widgets\" id=\"elgg-widget-col-$column_index\">";
+ if (sizeof($column_widgets) > 0) {
+ foreach ($column_widgets as $widget) {
+ if (array_key_exists($widget->handler, $widget_types)) {
+ echo elgg_view_entity($widget, array('show_access' => $show_access));
+ }
+ }
+ }
+ echo '</div>';
+}
+
+elgg_pop_context();
+
+echo elgg_view('graphics/ajax_loader', array('id' => 'elgg-widget-loader'));
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index.php b/mod/custom_index_widgets/views/default/page/layouts/index.php
new file mode 100644
index 000000000..a73a0d7b1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td align="left" valign="top" class="half">
+ <div id="leftcolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="half">
+ <div id="middlecolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr >
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="rightcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_1rsss.php b/mod/custom_index_widgets/views/default/page/layouts/index_1rsss.php
new file mode 100644
index 000000000..0d43469e9
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_1rsss.php
@@ -0,0 +1,29 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td align="left" valign="top" class="small">
+ <div id="leftcolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="small">
+ <div id="middlecolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="small">
+ <div id="rightcolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rbhh.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rbhh.php
new file mode 100644
index 000000000..7f8c22437
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rbhh.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="leftcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td align="left" valign="top" class="half">
+ <div id="middlecolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="half">
+ <div id="rightcolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rbms.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rbms.php
new file mode 100644
index 000000000..fdb0cf38b
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rbms.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="leftcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td align="left" valign="top" class="medium">
+ <div id="middlecolumn_widgets" class="medium_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="small">
+ <div id="rightcolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rbsm.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rbsm.php
new file mode 100644
index 000000000..d5a81f1f5
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rbsm.php
@@ -0,0 +1,28 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="leftcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td align="left" valign="top" class="small">
+ <div id="middlecolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="medium">
+ <div id="rightcolumn_widgets" class="medium_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rhhb.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rhhb.php
new file mode 100644
index 000000000..ae2995ff9
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rhhb.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td align="left" valign="top" class="half">
+ <div id="leftcolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="half">
+ <div id="middlecolumn_widgets" class="half_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="rightcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rmsb.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rmsb.php
new file mode 100644
index 000000000..a774a4a42
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rmsb.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td align="left" valign="top" class="medium">
+ <div id="leftcolumn_widgets" class="medium_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="small">
+ <div id="middlecolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="rightcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/page/layouts/index_2rsmb.php b/mod/custom_index_widgets/views/default/page/layouts/index_2rsmb.php
new file mode 100644
index 000000000..72bb92d3d
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/page/layouts/index_2rsmb.php
@@ -0,0 +1,30 @@
+<?php
+ $area1widgets = $vars['area1'];
+ $area2widgets = $vars['area2'];
+ $area3widgets = $vars['area3'];
+ $layoutmode = $vars['layoutmode']; //edit, index
+?>
+
+ <table cellspacing="10" cellpadding="10" width="100%" class="<?php echo elgg_echo($layoutmode); ?>">
+ <tr>
+ <td align="left" valign="top" class="small">
+ <div id="leftcolumn_widgets" class="small_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area1widgets) ?>
+ </div>
+ </td>
+ <td align="left" valign="top" class="medium">
+ <div id="middlecolumn_widgets" class="medium_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area2widgets) ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" align="left" valign="top" class="big">
+ <div id="rightcolumn_widgets" class="big_<?php echo elgg_echo($layoutmode); ?>_box">
+ <?php custom_index_show_widget_area($area3widgets) ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+
diff --git a/mod/custom_index_widgets/views/default/plugins/custom_index_widgets/settings.php b/mod/custom_index_widgets/views/default/plugins/custom_index_widgets/settings.php
new file mode 100644
index 000000000..ef70eeb8d
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/plugins/custom_index_widgets/settings.php
@@ -0,0 +1,61 @@
+<?php
+
+?>
+<div>
+ <div class="contentWrapper">
+ <table>
+ <tr>
+ <td style="width:50%"><?php echo elgg_echo("custom_index_widgets:layout"); ?></td>
+ <td>
+ <?php echo elgg_view('input/dropdown', array(
+ 'name' => 'params[ciw_layout]',
+ 'options_values' => array(
+ 'index' => 'Default',
+ 'index_2rmsb' => elgg_echo('custom_index_widgets:index_2rmsb'),
+ 'index_2rsmb' => elgg_echo('custom_index_widgets:index_2rsmb'),
+ 'index_2rhhb' => elgg_echo('custom_index_widgets:index_2rhhb'),
+ 'index_2rbhh' => elgg_echo('custom_index_widgets:index_2rbhh'),
+
+ 'index_2rbsm' => elgg_echo('custom_index_widgets:index_2rbsm'),
+ 'index_2rbms' => elgg_echo('custom_index_widgets:index_2rbms'),
+
+ 'index_1rsss' => elgg_echo('custom_index_widgets:index_1rsss')
+
+ ),
+ 'value' => $vars["entity"]->ciw_layout
+ ));
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td style="width:50%"><?php echo elgg_echo("custom_index_widgets:login_style"); ?></td>
+ <td>
+ <?php echo elgg_view('input/dropdown', array(
+ 'name' => 'params[login_style]',
+ 'options_values' => array(
+ 'inlayout' => elgg_echo('custom_index_widgets:inlayout'),
+ 'topbar' => elgg_echo('custom_index_widgets:topbar'),
+ ),
+ 'value' => $vars["entity"]->login_style
+ ));
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td style="width:50%"><?php echo elgg_echo("custom_index_widgets:showdashboard"); ?></td>
+ <td>
+ <?php echo elgg_view('input/dropdown', array(
+ 'name' => 'params[ciw_showdashboard]',
+ 'options_values' => array(
+ 'yes' => elgg_echo('custom_index_widgets:showdashboard_yes'),
+ 'no' => elgg_echo('custom_index_widgets:showdashboard_no'),
+ ),
+ 'value' => $vars["entity"]->ciw_showdashboard
+ ));
+ ?>
+ </td>
+ </tr>
+
+ </table>
+ </div>
+</div>
diff --git a/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/content.php b/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/content.php
new file mode 100644
index 000000000..bee459e1d
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/content.php
@@ -0,0 +1,59 @@
+<?php
+$maintype = "object";
+$subtype = $vars["entity"]->widget_subtype;
+if (empty($subtype) || $subtype == 'All') {
+ $subtype = ELGG_ENTITIES_ANY_VALUE;
+}
+
+if ($subtype == 'user') {$maintype='user';}
+if ($subtype == 'group') {$maintype='group';}
+
+
+$num_items = $vars['entity']->num_items;
+if (!isset($num_items))
+ $num_items = 20;
+
+$created_time_limit = $vars['entity']->created_time_limit;
+if (!isset($created_time_limit) || $created_time_limit == 'all') {
+ $created_time = ELGG_ENTITIES_ANY_VALUE;
+}
+elseif ($created_time_limit == 'day') {
+ $created_time = time()-(3600*24);
+}
+elseif ($created_time_limit == 'week') {
+ $created_time = time()-(3600*24*7);
+}
+elseif ($created_time_limit == 'month') {
+ $created_time = time()-(3600*24*30);
+}
+
+$metadata_name = $vars['entity']->metadata_name;
+if (!isset($metadata_name)) {
+ $metadata_name = 'tags';
+} else {
+ $metadata_name = $metadata_name;
+}
+
+$threshold = $vars['entity']->threshold;
+if (!isset($threshold))
+ $threshold = 1;
+
+$widget_group = $vars["entity"]->widget_group;
+if (empty($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+
+elgg_push_context('tags');
+$options = array('threshold' => $threshold,
+ 'limit' => $num_items,
+ 'type' => $maintype,
+ 'subtype' => $subtype,
+ 'tag_name' => $metadata_name,
+ 'created_time_lower' => $created_time,
+ 'container_guid' => $widget_group);
+
+$body = elgg_view_tagcloud($options);
+elgg_pop_context();
+
+echo $body;
+
+?>
diff --git a/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/edit.php b/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/edit.php
new file mode 100644
index 000000000..84b2fa861
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/cloud_generic_index/edit.php
@@ -0,0 +1,120 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $created_time_limit = $vars['entity']->created_time_limit;
+ if (!isset($created_time_limit)) $created_time_limit = 'all';
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $metadata_name = $vars['entity']->metadata_name;
+ if (!isset($metadata_name)) $metadata_name = "";
+
+ $threshold = $vars['entity']->threshold;
+ if (!isset($threshold)) $threshold = 1;
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+ $widget_subtype = $vars["entity"]->widget_subtype;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_subtype'); ?>
+ :
+ <?php
+
+ $subtypes = get_data("SELECT subtype from {$CONFIG->dbprefix}entity_subtypes");
+ $subtype_list = array();
+ $subtype_list['All'] = '';
+ $subtype_list['user'] = 'user';
+ $subtype_list['group'] = 'group';
+
+ if ($subtypes) {
+ foreach ($subtypes as $data) {
+ $subtype_list[$data->subtype] = $data->subtype;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_subtype]', 'options_values'=>$subtype_list, 'value'=>$widget_subtype));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_created_time_limit'); ?>
+ :
+ <?php
+
+ $limits = array('all', 'month', 'week', 'day');
+ $limit_list = array();
+ foreach($limits as $limit) {
+ $limit_list[$limit] = elgg_echo("custom_index_widgets:time_limit:$limit");
+ }
+ echo '<p>'.elgg_view('input/dropdown', array('name'=>'params[created_time_limit]', 'options_values'=>$limit_list, 'value'=>$created_time_limit))."</p>";
+ ?>
+ </p>
+
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:threshold'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[threshold]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$thresholds));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:metadata_name'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[metadata_name]', 'value'=>$metadata_name));
+ ?>
+ </p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p>
diff --git a/mod/custom_index_widgets/views/default/widgets/feed_reader_index/content.php b/mod/custom_index_widgets/views/default/widgets/feed_reader_index/content.php
new file mode 100644
index 000000000..2695315d5
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/feed_reader_index/content.php
@@ -0,0 +1,8 @@
+<?php
+
+ include elgg_get_plugins_path() . 'simplepie/views/default/widgets/feed_reader/content.php';
+
+ //$body = elgg_view("simplepie/widgets/feed_reader/content", $vars);
+ //echo $body;
+
+?>
diff --git a/mod/custom_index_widgets/views/default/widgets/feed_reader_index/edit.php b/mod/custom_index_widgets/views/default/widgets/feed_reader_index/edit.php
new file mode 100644
index 000000000..5fc36bc54
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/feed_reader_index/edit.php
@@ -0,0 +1,5 @@
+<?php
+ include elgg_get_plugins_path() . 'simplepie/views/default/widgets/feed_reader/edit.php';
+ //echo elgg_view("simplepie/edit", $vars);
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/inline_content_index/content.php b/mod/custom_index_widgets/views/default/widgets/inline_content_index/content.php
new file mode 100644
index 000000000..6ed53f197
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/inline_content_index/content.php
@@ -0,0 +1,7 @@
+<div class="contentWrapper">
+ <?php
+ echo $vars[entity]->html_content;
+ ?>
+ <div class="clearfloat">
+ </div>
+</div>
diff --git a/mod/custom_index_widgets/views/default/widgets/inline_content_index/edit.php b/mod/custom_index_widgets/views/default/widgets/inline_content_index/edit.php
new file mode 100644
index 000000000..e5c319bf1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/inline_content_index/edit.php
@@ -0,0 +1,46 @@
+<?php
+ $widget_title = $vars['entity']->widget_title;
+ $html_content = $vars['entity']->html_content;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:html_content'); ?>
+<?php
+ echo elgg_view('input/longtext', array(
+ 'name' => 'params[html_content]',
+ 'value' => $html_content
+ ));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_activity_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_activity_index/content.php
new file mode 100644
index 000000000..4010e0cb4
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_activity_index/content.php
@@ -0,0 +1,20 @@
+<?php
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ /*
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+ */
+ $widget_datas = elgg_list_river(0, $widget_group, '', '', '', '', $num_items,0,0,false);
+
+ echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_activity_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_activity_index/edit.php
new file mode 100644
index 000000000..622655307
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_activity_index/edit.php
@@ -0,0 +1,64 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ //$groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $groups = elgg_get_entities(array('type'=>'group'));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_album_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_album_index/content.php
new file mode 100644
index 000000000..c511a775a
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_album_index/content.php
@@ -0,0 +1,64 @@
+<div class="contentWrapper">
+<?php
+
+ $object_type ='album';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items))
+ $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group))
+ $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ $owner_albums = elgg_get_entities("object", $object_type, $widget_group, "", $num_items, 0, false);
+
+ echo '<div id="tidypics_album_widget_container">';
+
+ if ($owner_albums) {
+ foreach($owner_albums as $album) {
+
+ if($album->cover)
+ $album_cover = '<img src="'.$vars['url'].'mod/tidypics/thumbnail.php?file_guid='.$album->cover.'&size=small" class="tidypics_album_cover" alt="' . $album->title . '"/>';
+ else
+ $album_cover = '<img src="'.$vars['url'].'mod/tidypics/graphics/empty_album.png" class="tidypics_album_cover" alt="' . $album->title . '">';
+?>
+ <div class="tidypics_album_widget_single_item">
+ <div class="tidypics_album_widget_title"><a href="<?php echo $album->getURL();?>"><?php echo $album->title;?></a></div>
+ <div class="tidypics_album_widget_timestamp"> <?php echo elgg_echo("album:created:on") . ' ' . elgg_get_friendly_time($album->time_created);?></div>
+<?php
+ //get the number of comments
+ $numcomments = $album->countComments();
+ if ($numcomments)
+ echo "<a href=\"{$album->getURL()}\">" . sprintf(elgg_echo("comments")) . " (" . $numcomments . ")</a><br>";
+?>
+ <a href="<?php echo $album->getURL();?>"><?php echo $album_cover;?></a>
+ </div>
+<?php
+ } //end of foreach loop
+
+ // bottom link to all group/user albums
+ /*if (is_null($owner->username) || empty($owner->username)) {
+ echo '<p class="profile_info_edit_buttons"><a href="' . $vars['url'] . 'pg/photos/world">' . elgg_echo('album:all') . '</a></p>';
+ } else {
+ echo '<p class="tidypics_download"><a href="' . $vars['url'] . 'pg/photos/owned/' . $owner->username . '">' . elgg_echo('album:more') . '</a></p>';
+ }*/
+
+ }
+
+ /*if (can_write_to_container(0, $owner->guid)) {
+ echo '<p class="tidypics_download"><a href=' . $CONFIG->wwwroot .'pg/photos/new/' . $owner->username . '>' . elgg_echo("album:create") . '</a></p>';
+ }*/
+
+
+ //close album_widget_container div
+ echo "</div>";
+?>
+</div> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_album_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_album_index/edit.php
new file mode 100644
index 000000000..86eaa19cc
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_album_index/edit.php
@@ -0,0 +1,64 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/content.php
new file mode 100644
index 000000000..cce94185d
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/content.php
@@ -0,0 +1,43 @@
+<?php
+$object_type = 'blog';
+
+$num_items = $vars['entity']->num_items;
+if (!isset($num_items))
+ $num_items = 10;
+
+$widget_group = $vars["entity"]->widget_group;
+if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+$site_categories = $vars['config']->site->categories;
+$widget_categorie = $vars['entity']->widget_categorie;
+$widget_context_mode = $vars['entity']->widget_context_mode;
+if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+elgg_set_context($widget_context_mode);
+
+if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/edit.php
new file mode 100644
index 000000000..e89a68304
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_blogs_index/edit.php
@@ -0,0 +1,85 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/content.php
new file mode 100644
index 000000000..2622a63ea
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/content.php
@@ -0,0 +1,43 @@
+<?php
+
+ $object_type ='bookmarks';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/edit.php
new file mode 100644
index 000000000..1a15cea49
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_bookmarks_index/edit.php
@@ -0,0 +1,85 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_events_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_events_index/content.php
new file mode 100644
index 000000000..7c5ae40f3
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_events_index/content.php
@@ -0,0 +1,95 @@
+<?php
+
+ require_once($CONFIG->pluginspath.'event_calendar/models/model.php');
+
+ if(!function_exists('getLastDayOfMonth')){
+ function getLastDayOfMonth($month,$year) {
+ return idate('d', mktime(0, 0, 0, ($month + 1), 0, $year));
+ }
+ }
+
+ $object_type ='event_calendar';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items))
+ $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group))
+ $widget_group = 0;
+
+ $mode = $vars['mode']->mode;
+ if (!isset($mode))
+ $mode = "month";
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+
+ elgg_set_context($widget_context_mode);
+
+
+ $original_start_date = date('Y-m-d');
+ $day = 60*60*24;
+ $week = 7*$day;
+ $month = 31*$day;
+
+
+ if ($mode == "day") {
+ $start_date = $original_start_date;
+ $end_date = $start_date;
+ $start_ts = strtotime($start_date);
+ $end_ts = strtotime($end_date)+$day-1;
+ } else if ($mode == "week") {
+
+ $start_ts = strtotime($original_start_date);
+ $start_ts -= date("w",$start_ts)*$day;
+ $end_ts = $start_ts + 6*$day;
+
+ $start_date = date('Y-m-d',$start_ts);
+ $end_date = date('Y-m-d',$end_ts);
+ } else {
+ $start_ts = strtotime($original_start_date);
+ $month = date('m',$start_ts);
+ $year = date('Y',$start_ts);
+ $start_date = $year.'-'.$month.'-1';
+ $end_date = $year.'-'.$month.'-'.getLastDayOfMonth($month,$year);
+ }
+
+ if ($event_calendar_first_date && ($start_date < $event_calendar_first_date)) {
+ $start_date = $event_calendar_first_date;
+ }
+
+ if ($event_calendar_last_date && ($end_date > $event_calendar_last_date)) {
+ $end_date = $event_calendar_last_date;
+ }
+
+ $start_ts = strtotime($start_date);
+
+ if ($mode == "day") {
+ $end_ts = strtotime($end_date)+$day-1;
+ } else if ($mode == "week") {
+ $end_ts = $start_ts + 6*$day;
+ } else {
+ $end_ts = strtotime($end_date);
+ }
+
+ $count = event_calendar_get_events_between($start_ts,$end_ts,true,$num_items,0,$widget_group,'-');
+ $events = event_calendar_get_events_between($start_ts,$end_ts,false,$num_items,0,$widget_group,'-');
+ //$widget_datas= $event_list = elgg_view_entity_list($events, $count, 0, $num_items, false, false);
+
+ $options = array(
+ 'list_class' => 'elgg-list-entity',
+ 'full_view' => FALSE,
+ 'pagination' => TRUE,
+ 'list_type' => 'listing',
+ 'list_type_toggle' => FALSE,
+ 'offset' => $vars['offset'],
+ 'limit' => $vars['limit'],
+ );
+ $widget_datas = elgg_view_entity_list($events, $options);
+ echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_events_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_events_index/edit.php
new file mode 100644
index 000000000..3aa20f574
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_events_index/edit.php
@@ -0,0 +1,96 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('event_calendar:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[mode]',
+ 'options_values'=>array('day'=>elgg_echo('event_calendar:day_label'),
+ 'week'=>elgg_echo('event_calendar:week_label'),
+ 'month'=>elgg_echo('event_calendar:month_label')),
+ 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_files_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_files_index/content.php
new file mode 100644
index 000000000..b726efe70
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_files_index/content.php
@@ -0,0 +1,44 @@
+<?php
+
+ $object_type ='file';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+ echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_files_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_files_index/edit.php
new file mode 100644
index 000000000..5625eca44
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_files_index/edit.php
@@ -0,0 +1,86 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ //$groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $groups = elgg_get_entities(array('type'=>'group'));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_generic_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_generic_index/content.php
new file mode 100644
index 000000000..941b5ebeb
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_generic_index/content.php
@@ -0,0 +1,47 @@
+<?php
+
+$object_type = $vars["entity"]->widget_subtype;
+if (!isset($object_type))
+ $object_type = 'ELGG_ENTITIES_ANY_VALUE';
+
+$num_items = $vars['entity']->num_items;
+if (!isset($num_items))
+ $num_items = 10;
+
+$widget_group = $vars["entity"]->widget_group;
+if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+$site_categories = $vars['config']->site->categories;
+$widget_categorie = $vars['entity']->widget_categorie;
+$widget_context_mode = $vars['entity']->widget_context_mode;
+if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+elgg_set_context($widget_context_mode);
+
+if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_generic_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_generic_index/edit.php
new file mode 100644
index 000000000..f7584a847
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_generic_index/edit.php
@@ -0,0 +1,103 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+ $widget_subtype = $vars["entity"]->widget_subtype;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_subtype'); ?>
+ :
+ <?php
+
+ $subtypes = get_data("SELECT subtype from {$CONFIG->dbprefix}entity_subtypes");
+ $subtype_list = array();
+ if ($subtypes) {
+ foreach ($subtypes as $data) {
+ $subtype_list[$data->subtype] = $data->subtype;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_subtype]', 'options_values'=>$subtype_list, 'value'=>$widget_subtype));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ //$groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $groups = elgg_get_entities(array('type'=>'group'));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_groups_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_groups_index/content.php
new file mode 100644
index 000000000..0557f874e
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_groups_index/content.php
@@ -0,0 +1,21 @@
+<?php
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'group',
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+
+
+
+echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_groups_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_groups_index/edit.php
new file mode 100644
index 000000000..71f7d6be8
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_groups_index/edit.php
@@ -0,0 +1,63 @@
+<?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_title = $vars['entity']->widget_title;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+ </p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+
+<?php
+ echo elgg_view('input/dropdown', array(
+ 'name' => 'params[num_items]',
+ 'options_values' => array( '1' => '1',
+ '3' => '3',
+ '5' => '5',
+ '8' => '8',
+ '10' => '10',
+ '12' => '12',
+ '15' => '15',
+ '20' => '20',
+ '30' => '30',
+ '40' => '40',
+ '50' => '50',
+ '100' => '100',
+ ),
+ 'value' => $num_items
+ ));
+?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/content.php
new file mode 100644
index 000000000..22b15b37c
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/content.php
@@ -0,0 +1,50 @@
+<?php
+$object_type = 'izap_videos';
+
+$num_items = $vars['entity']->num_items;
+if (!isset($num_items))
+ $num_items = 10;
+
+$widget_group = $vars["entity"]->widget_group;
+if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+$site_categories = $vars['config']->site->categories;
+$widget_categorie = $vars['entity']->widget_categorie;
+$widget_context_mode = $vars['entity']->widget_context_mode;
+if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+elgg_set_context($widget_context_mode);
+
+if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+?>
+<div class="contentWrapper">
+ <?php
+ if (isset($widget_datas)) {
+ echo $widget_datas;
+ }
+ ?>
+ <div class="clearfloat">
+ </div>
+</div>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/edit.php
new file mode 100644
index 000000000..54c41e1a9
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_izap_videos_index/edit.php
@@ -0,0 +1,86 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_members_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_members_index/content.php
new file mode 100644
index 000000000..c4f95a77d
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_members_index/content.php
@@ -0,0 +1,20 @@
+<?php
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+ $display_avatar = $vars['entity']->display_avatar;
+ if (!isset($display_avatar)) $display_avatar = 'yes';
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'metadata_names' => 'icontime',
+ 'types' => 'user',
+ 'limit' => $num_items,
+ 'full_view' => false,
+ 'pagination' => false,
+ 'size' => 'small',
+ ));
+
+echo $widget_datas;
+?>
+
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_members_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_members_index/edit.php
new file mode 100644
index 000000000..856d5ed0b
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_members_index/edit.php
@@ -0,0 +1,79 @@
+<?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $display_avatar = $vars['entity']->display_avatar;
+ if (!isset($display_avatar)) $display_avatar = 'yes';
+
+ $widget_title = $vars['entity']->widget_title;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+
+
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+
+<?php
+ echo elgg_view('input/dropdown', array(
+ 'name' => 'params[num_items]',
+ 'options_values' => array(
+ '7' => '7',
+ '14' => '14',
+ '21' => '21',
+ '28' => '28',
+ '35' => '35',
+ '42' => '42',
+ '49' => '49',
+ '56' => '56',
+ '100' => '100',
+ ),
+ 'value' => $num_items
+ ));
+?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:display_avatar'); ?>
+
+<?php
+ echo elgg_view('input/dropdown', array(
+ 'name' => 'params[display_avatar]',
+ 'options_values' => array( 'yes' => 'yes',
+ 'no' => 'no',
+
+ ),
+ 'value' => $display_avatar
+ ));
+?>
+</p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_news_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_news_index/content.php
new file mode 100644
index 000000000..8a10093b1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_news_index/content.php
@@ -0,0 +1,47 @@
+<?php
+
+ $object_type ='news';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items))
+ $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+echo $widget_datas;
+?>
+
+
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_news_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_news_index/edit.php
new file mode 100644
index 000000000..063b5ddc1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_news_index/edit.php
@@ -0,0 +1,85 @@
+<?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_pages_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_pages_index/content.php
new file mode 100644
index 000000000..cc8a46d55
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_pages_index/content.php
@@ -0,0 +1,45 @@
+<?php
+
+ $object_type ='page_top';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items))
+ $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode))
+ $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+echo $widget_datas;
+?>
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_pages_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_pages_index/edit.php
new file mode 100644
index 000000000..a14371b02
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_pages_index/edit.php
@@ -0,0 +1,86 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ //$groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $groups = elgg_get_entities(array('type'=>'group'));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_photos_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_photos_index/content.php
new file mode 100644
index 000000000..bb83cac40
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_photos_index/content.php
@@ -0,0 +1,25 @@
+<div class="contentWrapper">
+<?php
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ if ($widget_group != 0){
+ $album = elgg_get_entities("object", 'album', $widget_group, "", 1, 0, false);
+ $album_guid = $album[0]->getGUID();
+ $entities = elgg_get_entities("object", "image", $album_guid, '', 999);
+ elgg_set_context('front');
+ $widgetdatas = elgg_view_entity_list($entities);
+ }else{
+ $widgetdatas = tp_get_latest_photos($num_items, 0);
+ }
+
+ echo '<div class="icon_latest">';
+ echo $widgetdatas;
+ echo '</div>';
+
+?>
+</div> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_photos_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_photos_index/edit.php
new file mode 100644
index 000000000..0ef5e53a1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_photos_index/edit.php
@@ -0,0 +1,64 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/content.php
new file mode 100644
index 000000000..1f06a0db1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/content.php
@@ -0,0 +1,45 @@
+<?php
+
+ $object_type ='task_top';
+
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = ELGG_ENTITIES_ANY_VALUE;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+ elgg_set_context($widget_context_mode);
+
+ if ($site_categories == NULL || $widget_categorie == NULL) {
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+} else {
+
+ $widget_datas = elgg_list_entities_from_metadata(array(
+ 'type'=>'object',
+ 'subtype'=>$object_type,
+ 'container_guids' => $widget_group,
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false,
+ 'metadata_name' => 'universal_categories',
+ 'metadata_value' => $widget_categorie,
+ ));
+}
+
+echo $widget_datas;
+?>
+
+
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/edit.php
new file mode 100644
index 000000000..c587bc184
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_tasks_index/edit.php
@@ -0,0 +1,85 @@
+ <?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_group = $vars["entity"]->widget_group;
+ if (!isset($widget_group)) $widget_group = 0;
+
+ $site_categories = $vars['config']->site->categories;
+ $widget_categorie = $vars['entity']->widget_categorie;
+ $widget_context_mode = $vars['entity']->widget_context_mode;
+ if (!isset($widget_context_mode)) $widget_context_mode = 'search';
+
+ $widget_title = $vars['entity']->widget_title;
+ $widget_group = $vars["entity"]->widget_group;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+ ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>
+ :
+ <?php
+ echo elgg_view('input/text', array('name'=>'params[widget_title]', 'value'=>$widget_title));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('group'); ?>
+ :
+ <?php
+ $groups = elgg_get_entities(array("type"=>'group','limit'=>100));
+ $group_list = array();
+ $group_list[0] = elgg_echo('custom_index_widgets:widget_all_groups');
+ if ($groups) {
+ foreach ($groups as $group) {
+ $group_list[$group->getGUID()] = $group->name;
+ }
+ }
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_group]', 'options_values'=>$group_list, 'value'=>$widget_group));
+ ?>
+ </p>
+ <?php if ($site_categories != NULL) { ?>
+ <p>
+ <?php echo elgg_echo('categories'); ?>
+ :
+ <?php
+ $categories_with_empty_choice = array_merge(array('-1'=>''), array_combine($site_categories, $site_categories));
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_categorie]', 'options_values'=>$categories_with_empty_choice, 'value'=>$widget_categorie));
+ ?>
+ </p>
+ <?php } ?>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:context_mode'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[widget_context_mode]', 'options_values'=>array('search'=>elgg_echo('custom_index_widgets:context_list'), 'detail'=>elgg_echo('custom_index_widgets:context_detail')), 'value'=>$widget_context_mode));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[num_items]', 'options_values'=>array('1'=>'1', '3'=>'3', '5'=>'5', '8'=>'8', '10'=>'10', '12'=>'12', '15'=>'15', '20'=>'20', '30'=>'30', '40'=>'40', '50'=>'50', '100'=>'100', ), 'value'=>$num_items));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_wire_index/content.php b/mod/custom_index_widgets/views/default/widgets/latest_wire_index/content.php
new file mode 100644
index 000000000..98d3b43e1
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_wire_index/content.php
@@ -0,0 +1,17 @@
+<?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+ elgg_set_context('search');
+
+ $widget_datas = elgg_list_entities(array(
+ 'type'=>'object',
+ 'subtype'=>'thewire',
+ 'limit'=>$num_items,
+ 'full_view' => false,
+ 'view_type_toggle' => false,
+ 'pagination' => false));
+
+ echo $widget_datas;
+?>
+
+
diff --git a/mod/custom_index_widgets/views/default/widgets/latest_wire_index/edit.php b/mod/custom_index_widgets/views/default/widgets/latest_wire_index/edit.php
new file mode 100644
index 000000000..d08066648
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/latest_wire_index/edit.php
@@ -0,0 +1,62 @@
+<?php
+ $num_items = $vars['entity']->num_items;
+ if (!isset($num_items)) $num_items = 10;
+
+ $widget_title = $vars['entity']->widget_title;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+ </p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:num_items'); ?>
+<?php
+ echo elgg_view('input/dropdown', array(
+ 'name' => 'params[num_items]',
+ 'options_values' => array( '1' => '1',
+ '3' => '3',
+ '5' => '5',
+ '8' => '8',
+ '10' => '10',
+ '12' => '12',
+ '15' => '15',
+ '20' => '20',
+ '30' => '30',
+ '40' => '40',
+ '50' => '50',
+ '100' => '100',
+ ),
+ 'value' => $num_items
+ ));
+?>
+</p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
diff --git a/mod/custom_index_widgets/views/default/widgets/login_index/content.php b/mod/custom_index_widgets/views/default/widgets/login_index/content.php
new file mode 100644
index 000000000..1e82df544
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/login_index/content.php
@@ -0,0 +1,15 @@
+<?php
+
+if (elgg_is_logged_in()) {
+ $top_box = "<h2>" . elgg_echo("welcome") . " ";
+ $top_box .= elgg_get_logged_in_user_entity()->name;
+ $top_box .= "</h2>";
+} else {
+ $top_box = elgg_view("core/account/login_box");
+}
+
+echo $top_box;
+?>
+
+
+
diff --git a/mod/custom_index_widgets/views/default/widgets/login_index/edit.php b/mod/custom_index_widgets/views/default/widgets/login_index/edit.php
new file mode 100644
index 000000000..149008323
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/login_index/edit.php
@@ -0,0 +1,27 @@
+<?php
+ $widget_title = $vars['entity']->widget_title;
+
+ $show_welcome = $vars['entity']->show_welcome;
+ if (!isset($show_welcome)) $show_welcome = "yes";
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+</p> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/rich_media_index/content.php b/mod/custom_index_widgets/views/default/widgets/rich_media_index/content.php
new file mode 100644
index 000000000..dddc32bd7
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/rich_media_index/content.php
@@ -0,0 +1,27 @@
+<?php
+
+ $widget_video_width = $vars['entity']->widget_video_width;
+ $widget_video_height = $vars['entity']->widget_video_height;
+ $widget_video_url = $vars['entity']->widget_video_url;
+ $widget_video_caption = $vars['entity']->widget_video_caption;
+
+ if (!isset($widget_video_width)){
+ $widget_video_width = '250';
+ }
+ if (!isset($widget_video_height)){
+ $widget_video_height = '250';
+ }
+
+?>
+
+<div class="contentWrapper" align="center">
+ <a id="media<?php echo $vars['entity']->getGUID();?>" class="media" href="<?php echo $widget_video_url;?>"><?php echo $widget_video_title;?></a> <div class="clearfloat">
+ </div>
+</div>
+<?php if (isset($widget_video_url)) { ?>
+<script type="text/javascript">
+ jQuery(document).ready(function($){
+ $('#media<?php echo $vars['entity']->getGUID();?>').media({width:<?php echo $widget_video_width;?>, height:<?php echo $widget_video_height;?>, autoplay: true});
+ });
+</script>
+<?php } ?> \ No newline at end of file
diff --git a/mod/custom_index_widgets/views/default/widgets/rich_media_index/edit.php b/mod/custom_index_widgets/views/default/widgets/rich_media_index/edit.php
new file mode 100644
index 000000000..a3956159c
--- /dev/null
+++ b/mod/custom_index_widgets/views/default/widgets/rich_media_index/edit.php
@@ -0,0 +1,78 @@
+<?php
+ $widget_title = $vars['entity']->widget_title;
+ $widget_video_width = $vars['entity']->widget_video_width;
+ $widget_video_height = $vars['entity']->widget_video_height;
+ $widget_video_url = $vars['entity']->widget_video_url;
+ $widget_video_title = $vars['entity']->widget_video_title;
+
+ $guest_only = $vars['entity']->guest_only;
+ if (!isset($guest_only)) $guest_only = "no";
+
+ $box_style = $vars['entity']->box_style;
+ if (!isset($box_style)) $box_style = "collapsable";
+
+?>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:widget_title'); ?>:
+ <?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_title]',
+ 'value' => $widget_title
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:widget_video_caption'); ?>
+<?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_video_caption]',
+ 'value' => $widget_video_caption
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:widget_video_url'); ?>
+<?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_video_url]',
+ 'value' => $widget_video_url
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:widget_video_width'); ?>
+<?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_video_width]',
+ 'value' => $widget_video_width
+ ));
+ ?>
+</p>
+<p>
+<?php echo elgg_echo('custom_index_widgets:widget_video_height'); ?>
+<?php
+ echo elgg_view('input/text', array(
+ 'name' => 'params[widget_video_height]',
+ 'value' => $widget_video_height
+ ));
+ ?>
+</p>
+<p>
+ <?php echo elgg_echo('custom_index_widgets:box_style'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[box_style]',
+ 'options_values'=>array('plain'=>'Plain', 'plain collapsable'=>'Plain and collapsable', 'collapsable'=>'Collapsable', 'standard' => 'No Collapsable'),
+ 'value'=>$box_style));
+ ?>
+ </p>
+ <p>
+ <?php echo elgg_echo('custom_index_widgets:guest_only'); ?>
+ :
+ <?php
+ echo elgg_view('input/dropdown', array('name'=>'params[guest_only]',
+ 'options_values'=>array('yes'=>'yes', 'no'=>'no'),
+ 'value'=>$guest_only));
+ ?>
+ </p>
+
diff --git a/mod/dashboard/languages/en.php b/mod/dashboard/languages/en.php
new file mode 100644
index 000000000..e1378f2f1
--- /dev/null
+++ b/mod/dashboard/languages/en.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * User dashboard languages
+ */
+
+$english = array(
+ 'dashboard:widget:group:title' => 'Group activity',
+ 'dashboard:widget:group:desc' => 'View the activity in one of your groups',
+ 'dashboard:widget:group:select' => 'Select a group',
+ 'dashboard:widget:group:noactivity' => 'There is no activity in this group',
+ 'dashboard:widget:group:noselect' => 'Edit this widget to select a group',
+);
+
+add_translation("en", $english);
diff --git a/mod/dashboard/manifest.xml b/mod/dashboard/manifest.xml
new file mode 100644
index 000000000..cbbc1044c
--- /dev/null
+++ b/mod/dashboard/manifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>User Dashboard</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <description>A widget-based dashboard for your users</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/dashboard/start.php b/mod/dashboard/start.php
new file mode 100644
index 000000000..65007d1a8
--- /dev/null
+++ b/mod/dashboard/start.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * A user dashboard
+ */
+
+elgg_register_event_handler('init', 'system', 'dashboard_init');
+
+function dashboard_init() {
+ elgg_register_page_handler('dashboard', 'dashboard_page_handler');
+
+ elgg_extend_view('css/elgg', 'dashboard/css');
+
+ elgg_register_menu_item('topbar', array(
+ 'name' => 'dashboard',
+ 'href' => 'dashboard',
+ 'text' => elgg_view_icon('home') . elgg_echo('dashboard'),
+ 'priority' => 450,
+ 'section' => 'alt',
+ ));
+
+ elgg_register_widget_type(
+ 'group_activity',
+ elgg_echo('dashboard:widget:group:title'),
+ elgg_echo('dashboard:widget:group:desc'),
+ 'dashboard',
+ true
+ );
+
+ elgg_register_plugin_hook_handler('get_list', 'default_widgets', 'dashboard_default_widgets');
+}
+
+/**
+ * Dashboard page handler
+ * @return bool
+ */
+function dashboard_page_handler() {
+ // Ensure that only logged-in users can see this page
+ gatekeeper();
+
+ // Set context and title
+ elgg_set_context('dashboard');
+ elgg_set_page_owner_guid(elgg_get_logged_in_user_guid());
+ $title = elgg_echo('dashboard');
+
+ // wrap intro message in a div
+ $intro_message = elgg_view('dashboard/blurb');
+
+ $params = array(
+ 'content' => $intro_message,
+ 'num_columns' => 3,
+ 'show_access' => false,
+ );
+ $widgets = elgg_view_layout('widgets', $params);
+
+ $body = elgg_view_layout('one_column', array('content' => $widgets));
+
+ echo elgg_view_page($title, $body);
+ return true;
+}
+
+
+/**
+ * Register user dashboard with default widgets
+ *
+ * @param unknown_type $hook
+ * @param unknown_type $type
+ * @param unknown_type $return
+ * @param unknown_type $params
+ * @return array
+ */
+function dashboard_default_widgets($hook, $type, $return, $params) {
+ $return[] = array(
+ 'name' => elgg_echo('dashboard'),
+ 'widget_context' => 'dashboard',
+ 'widget_columns' => 3,
+
+ 'event' => 'create',
+ 'entity_type' => 'user',
+ 'entity_subtype' => ELGG_ENTITIES_ANY_VALUE,
+ );
+
+ return $return;
+} \ No newline at end of file
diff --git a/mod/dashboard/views/default/dashboard/blurb.php b/mod/dashboard/views/default/dashboard/blurb.php
new file mode 100644
index 000000000..9293e513a
--- /dev/null
+++ b/mod/dashboard/views/default/dashboard/blurb.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Elgg dashboard blurb
+ *
+ */
+?>
+
+<div class="elgg-col elgg-col-2of3">
+<?php
+ echo elgg_view('output/longtext', array(
+ 'id' => 'dashboard-info',
+ 'class' => 'elgg-inner pam mhs mtn',
+ 'value' => elgg_echo("dashboard:nowidgets"),
+ ));
+
+?>
+</div> \ No newline at end of file
diff --git a/mod/dashboard/views/default/dashboard/css.php b/mod/dashboard/views/default/dashboard/css.php
new file mode 100644
index 000000000..f49293293
--- /dev/null
+++ b/mod/dashboard/views/default/dashboard/css.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * User dashboard CSS
+ */
+?>
+
+#dashboard-info {
+ border: 2px solid #dedede;
+ margin-bottom: 15px;
+}
diff --git a/mod/dashboard/views/default/widgets/group_activity/content.php b/mod/dashboard/views/default/widgets/group_activity/content.php
new file mode 100644
index 000000000..60a9b352c
--- /dev/null
+++ b/mod/dashboard/views/default/widgets/group_activity/content.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Group activity widget
+ */
+
+$num = (int) $vars['entity']->num_display;
+$guid = $vars['entity']->group_guid;
+
+$content = '';
+
+if ($guid) {
+ $title = get_entity($guid)->name;
+ $content = "<h3>$title</h3>";
+
+ elgg_push_context('widgets');
+ $db_prefix = elgg_get_config('dbprefix');
+ $activity = elgg_list_river(array(
+ 'limit' => $num,
+ 'pagination' => false,
+ 'joins' => array("JOIN {$db_prefix}entities e1 ON e1.guid = rv.object_guid"),
+ 'wheres' => array("(e1.container_guid = $guid)"),
+ ));
+ if (!$activity) {
+ $activity = '<p>' . elgg_echo('dashboard:widget:group:noactivity') . '</p>';
+ }
+ elgg_pop_context();
+
+ $content .= $activity;
+} else {
+ // no group selected yet
+ if ($vars['entity']->canEdit()) {
+ $content = '<p>' . elgg_echo('dashboard:widget:group:noselect') . '</p>';
+ }
+}
+
+echo $content;
diff --git a/mod/dashboard/views/default/widgets/group_activity/edit.php b/mod/dashboard/views/default/widgets/group_activity/edit.php
new file mode 100644
index 000000000..4e10f6ad4
--- /dev/null
+++ b/mod/dashboard/views/default/widgets/group_activity/edit.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Group activity widget settings
+ */
+
+// once autocomplete is working use that
+$groups = elgg_get_logged_in_user_entity()->getGroups("", 0);
+$mygroups = array();
+if (!$vars['entity']->group_guid) {
+ $mygroups[0] = '';
+}
+foreach ($groups as $group) {
+ $mygroups[$group->guid] = $group->name;
+}
+$params = array(
+ 'name' => 'params[group_guid]',
+ 'value' => $vars['entity']->group_guid,
+ 'options_values' => $mygroups,
+);
+$group_dropdown = elgg_view('input/dropdown', $params);
+?>
+<div>
+ <?php echo elgg_echo('dashboard:widget:group:select'); ?>:
+ <?php echo $group_dropdown; ?>
+</div>
+<?php
+
+// set default value for number to display
+if (!isset($vars['entity']->num_display)) {
+ $vars['entity']->num_display = 8;
+}
+
+$params = array(
+ 'name' => 'params[num_display]',
+ 'value' => $vars['entity']->num_display,
+ 'options' => array(5, 8, 10, 12, 15, 20),
+);
+$num_dropdown = elgg_view('input/dropdown', $params);
+
+?>
+<div>
+ <?php echo elgg_echo('widget:numbertodisplay'); ?>:
+ <?php echo $num_dropdown; ?>
+</div>
+
diff --git a/mod/developers/actions/developers/inspect.php b/mod/developers/actions/developers/inspect.php
new file mode 100644
index 000000000..6fd9e90f9
--- /dev/null
+++ b/mod/developers/actions/developers/inspect.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Ajax endpoint for inspection
+ *
+ */
+
+$inspect_type = get_input('inspect_type');
+$method = 'get' . str_replace(' ', '', $inspect_type);
+
+$inspector = new ElggInspector();
+if ($inspector && method_exists($inspector, $method)) {
+ $tree = $inspector->$method();
+ echo elgg_view('developers/tree', array('tree' => $tree));
+} else {
+ echo 'error';
+}
diff --git a/mod/developers/actions/developers/settings.php b/mod/developers/actions/developers/settings.php
new file mode 100644
index 000000000..7c91e2f5f
--- /dev/null
+++ b/mod/developers/actions/developers/settings.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Save the developer settings
+ */
+
+$site = elgg_get_site_entity();
+
+if (get_input('simple_cache')) {
+ elgg_enable_simplecache();
+} else {
+ elgg_disable_simplecache();
+}
+
+if (get_input('system_cache')) {
+ elgg_enable_system_cache();
+} else {
+ elgg_disable_system_cache();
+}
+
+$debug = get_input('debug_level');
+if ($debug) {
+ set_config('debug', $debug, $site->getGUID());
+} else {
+ unset_config('debug', $site->getGUID());
+}
+
+$simple_settings = array('display_errors', 'screen_log', 'show_strings',
+ 'wrap_views', 'log_events',);
+foreach ($simple_settings as $setting) {
+ elgg_set_plugin_setting($setting, get_input($setting), 'developers');
+}
+
+system_message(elgg_echo('developers:settings:success'));
+
+forward(REFERER);
diff --git a/mod/developers/classes/ElggInspector.php b/mod/developers/classes/ElggInspector.php
new file mode 100644
index 000000000..e83fc6b81
--- /dev/null
+++ b/mod/developers/classes/ElggInspector.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * Inspect Elgg variables
+ *
+ */
+
+class ElggInspector {
+
+ /**
+ * Get Elgg event information
+ *
+ * returns [event,type] => array(handlers)
+ */
+ public function getEvents() {
+ global $CONFIG;
+
+ $tree = array();
+ foreach ($CONFIG->events as $event => $types) {
+ foreach ($types as $type => $handlers) {
+ $tree[$event . ',' . $type] = array_values($handlers);
+ }
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+ /**
+ * Get Elgg plugin hooks information
+ *
+ * returns [hook,type] => array(handlers)
+ */
+ public function getPluginHooks() {
+ global $CONFIG;
+
+ $tree = array();
+ foreach ($CONFIG->hooks as $hook => $types) {
+ foreach ($types as $type => $handlers) {
+ $tree[$hook . ',' . $type] = array_values($handlers);
+ }
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+ /**
+ * Get Elgg view information
+ *
+ * returns [view] => array(view location and extensions)
+ */
+ public function getViews() {
+ global $CONFIG;
+
+ $coreViews = $this->recurseFileTree($CONFIG->viewpath . "default/");
+
+ // remove base path and php extension
+ array_walk($coreViews, create_function('&$v,$k', 'global $CONFIG; $v = substr($v, strlen($CONFIG->viewpath . "default/"), -4);'));
+
+ // setup views array before adding extensions and plugin views
+ $views = array();
+ foreach ($coreViews as $view) {
+ $views[$view] = array($CONFIG->viewpath . "default/" . $view . ".php");
+ }
+
+ // add plugins and handle overrides
+ foreach ($CONFIG->views->locations['default'] as $view => $location) {
+ $views[$view] = array($location . $view . ".php");
+ }
+
+ // now extensions
+ foreach ($CONFIG->views->extensions as $view => $extensions) {
+ $view_list = array();
+ foreach ($extensions as $priority => $ext_view) {
+ if (isset($views[$ext_view])) {
+ $view_list[] = $views[$ext_view][0];
+ }
+ }
+ if (count($view_list) > 0) {
+ $views[$view] = $view_list;
+ }
+ }
+
+ ksort($views);
+
+ return $views;
+ }
+
+ /**
+ * Get Elgg widget information
+ *
+ * returns [widget] => array(name, contexts)
+ */
+ public function getWidgets() {
+ global $CONFIG;
+
+ $tree = array();
+ foreach ($CONFIG->widgets->handlers as $handler => $handler_obj) {
+ $tree[$handler] = array($handler_obj->name, implode(',', array_values($handler_obj->context)));
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+
+ /**
+ * Get Elgg actions information
+ *
+ * returns [action] => array(file, public, admin)
+ */
+ public function getActions() {
+ global $CONFIG;
+
+ $tree = array();
+ foreach ($CONFIG->actions as $action => $info) {
+ $tree[$action] = array($info['file'], ($info['public']) ? 'public' : 'logged in only', ($info['admin']) ? 'admin only' : 'non-admin');
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+ /**
+ * Get simplecache information
+ *
+ * returns [views]
+ */
+ public function getSimpleCache() {
+ global $CONFIG;
+
+ $tree = array();
+ foreach ($CONFIG->views->simplecache as $view) {
+ $tree[$view] = "";
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+ /**
+ * Get Elgg web services API methods
+ *
+ * returns [method] => array(function, parameters, call_method, api auth, user auth)
+ */
+ public function getWebServices() {
+ global $API_METHODS;
+
+ $tree = array();
+ foreach ($API_METHODS as $method => $info) {
+ $params = implode(', ', array_keys($info['parameters']));
+ if (!$params) {
+ $params = 'none';
+ }
+ $tree[$method] = array(
+ $info['function'],
+ "params: $params",
+ $info['call_method'],
+ ($info['require_api_auth']) ? 'API authentication required' : 'No API authentication required',
+ ($info['require_user_auth']) ? 'User authentication required' : 'No user authentication required',
+ );
+ }
+
+ ksort($tree);
+
+ return $tree;
+ }
+
+ /**
+ * Create array of all php files in directory and subdirectories
+ *
+ * @param $dir full path to directory to begin search
+ * @return array of every php file in $dir or below in file tree
+ */
+ protected function recurseFileTree($dir) {
+ $view_list = array();
+
+ $handle = opendir($dir);
+ while ($file = readdir($handle)) {
+ if ($file[0] == '.') {
+
+ } else if (is_dir($dir . $file)) {
+ $view_list = array_merge($view_list, $this->recurseFileTree($dir . $file. "/"));
+ } else {
+ $extension = strrchr(trim($file, "/"), '.');
+ if ($extension === ".php") {
+ $view_list[] = $dir . $file;
+ }
+ }
+ }
+ closedir($handle);
+
+ return $view_list;
+ }
+
+}
diff --git a/mod/developers/classes/ElggLogCache.php b/mod/developers/classes/ElggLogCache.php
new file mode 100644
index 000000000..5bd4bce28
--- /dev/null
+++ b/mod/developers/classes/ElggLogCache.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Cache logging information for later display
+ *
+ */
+
+class ElggLogCache {
+ protected $cache;
+
+ public function __construct() {
+ $this->cache = array();
+ }
+
+ /**
+ * Insert into cache
+ *
+ * @param mixed $data The log data to cache
+ */
+ public function insert($data) {
+ $this->cache[] = $data;
+ }
+
+ /**
+ * Insert into cache from plugin hook
+ *
+ * @param string $hook
+ * @param string $type
+ * @param bool $result
+ * @param array $params Must have the data at $params['msg']
+ */
+ public function insertDump($hook, $type, $result, $params) {
+ $this->insert($params['msg']);
+ return false;
+ }
+
+ /**
+ * Get the cache
+ *
+ * @return array
+ */
+ public function get() {
+ return $this->cache;
+ }
+}
diff --git a/mod/developers/languages/en.php b/mod/developers/languages/en.php
new file mode 100644
index 000000000..266b5406e
--- /dev/null
+++ b/mod/developers/languages/en.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Elgg developer tools English language file.
+ *
+ */
+
+$english = array(
+ // menu
+ 'admin:develop_tools' => 'Tools',
+ 'admin:develop_tools:preview' => 'Theming Sandbox',
+ 'admin:develop_tools:inspect' => 'Inspect',
+ 'admin:develop_tools:unit_tests' => 'Unit Tests',
+ 'admin:developers' => 'Developers',
+ 'admin:developers:settings' => 'Settings',
+
+ // settings
+ 'elgg_dev_tools:settings:explanation' => 'Control your development and debugging settings below. Some of these settings are also available on other admin pages.',
+ 'developers:label:simple_cache' => 'Use simple cache',
+ 'developers:help:simple_cache' => 'Turn off this cache when developing. Otherwise, changes to your CSS and JavaScript will be ignored.',
+ 'developers:label:system_cache' => 'Use system cache',
+ 'developers:help:system_cache' => 'Turn this off when developing. Otherwise, changes in your plugins will not be registered.',
+ 'developers:label:debug_level' => "Trace level",
+ 'developers:help:debug_level' => "This controls the amount of information logged. See elgg_log() for more information.",
+ 'developers:label:display_errors' => 'Display fatal PHP errors',
+ 'developers:help:display_errors' => "By default, Elgg's .htaccess file supresses the display of fatal errors.",
+ 'developers:label:screen_log' => "Log to the screen",
+ 'developers:help:screen_log' => "This displays elgg_log() and elgg_dump() output on the web page.",
+ 'developers:label:show_strings' => "Show raw translation strings",
+ 'developers:help:show_strings' => "This displays the translation strings used by elgg_echo().",
+ 'developers:label:wrap_views' => "Wrap views",
+ 'developers:help:wrap_views' => "This wraps almost every view with HTML comments. Useful for finding the view creating particular HTML.
+ This can break non-HTML views in the default viewtype. See developers_wrap_views() for details.",
+ 'developers:label:log_events' => "Log events and plugin hooks",
+ 'developers:help:log_events' => "Write events and plugin hooks to the log. Warning: there are many of these per page.",
+
+ 'developers:debug:off' => 'Off',
+ 'developers:debug:error' => 'Error',
+ 'developers:debug:warning' => 'Warning',
+ 'developers:debug:notice' => 'Notice',
+
+ // inspection
+ 'developers:inspect:help' => 'Inspect configuration of the Elgg framework.',
+
+ // event logging
+ 'developers:event_log_msg' => "%s: '%s, %s' in %s",
+
+ // theme preview
+ 'theme_preview:general' => 'Introduction',
+ 'theme_preview:breakout' => 'Break out of iframe',
+ 'theme_preview:buttons' => 'Buttons',
+ 'theme_preview:components' => 'Components',
+ 'theme_preview:forms' => 'Forms',
+ 'theme_preview:grid' => 'Grid',
+ 'theme_preview:icons' => 'Icons',
+ 'theme_preview:modules' => 'Modules',
+ 'theme_preview:navigation' => 'Navigation',
+ 'theme_preview:typography' => 'Typography',
+ 'theme_preview:miscellaneous' => 'Miscellaneous',
+
+ // unit tests
+ 'developers:unit_tests:description' => 'Elgg has unit and integration tests for detecting bugs in its core classes and functions.',
+ 'developers:unit_tests:warning' => 'Warning: Do Not Run These Tests on a Production Site. They can corrupt your database.',
+ 'developers:unit_tests:run' => 'Run',
+
+ // status messages
+ 'developers:settings:success' => 'Settings saved',
+);
+
+add_translation('en', $english);
diff --git a/mod/developers/manifest.xml b/mod/developers/manifest.xml
new file mode 100644
index 000000000..23e726e2b
--- /dev/null
+++ b/mod/developers/manifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Elgg Developer Tools</name>
+ <author>Core developers</author>
+ <version>1.0</version>
+ <category>bundled</category>
+ <category>development</category>
+ <blurb>Developer tools for Elgg</blurb>
+ <description>A set of tools for writing plugins and themes. It is recommended that you have this plugin at the top of the plugin list.</description>
+ <website>http://www.elgg.org/</website>
+ <bugtracker>https://github.com/Elgg/Elgg/issues</bugtracker>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/developers/start.php b/mod/developers/start.php
new file mode 100644
index 000000000..94d0f652c
--- /dev/null
+++ b/mod/developers/start.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * Elgg developer tools
+ */
+
+// we want to run this as soon as possible - other plugins should not need to do this
+developers_process_settings();
+
+elgg_register_event_handler('init', 'system', 'developers_init');
+
+function developers_init() {
+ elgg_register_event_handler('pagesetup', 'system', 'developers_setup_menu');
+
+ elgg_extend_view('css/admin', 'developers/css');
+ elgg_extend_view('css/elgg', 'developers/css');
+
+ elgg_register_page_handler('theme_preview', 'developers_theme_preview_controller');
+
+ $action_base = elgg_get_plugins_path() . 'developers/actions/developers';
+ elgg_register_action('developers/settings', "$action_base/settings.php", 'admin');
+ elgg_register_action('developers/inspect', "$action_base/inspect.php", 'admin');
+
+ elgg_register_js('jquery.jstree', 'mod/developers/vendors/jsTree/jquery.jstree.js', 'footer');
+ elgg_register_css('jquery.jstree', 'mod/developers/vendors/jsTree/themes/default/style.css');
+
+ elgg_load_js('jquery.form');
+
+ elgg_register_js('elgg.dev', 'js/developers/developers.js', 'footer');
+ elgg_load_js('elgg.dev');
+}
+
+function developers_process_settings() {
+ if (elgg_get_plugin_setting('display_errors', 'developers') == 1) {
+ ini_set('display_errors', 1);
+ } else {
+ ini_set('display_errors', 0);
+ }
+
+ if (elgg_get_plugin_setting('screen_log', 'developers') == 1) {
+ $cache = new ElggLogCache();
+ elgg_set_config('log_cache', $cache);
+ elgg_register_plugin_hook_handler('debug', 'log', array($cache, 'insertDump'));
+ elgg_extend_view('page/elements/foot', 'developers/log');
+ }
+
+ if (elgg_get_plugin_setting('show_strings', 'developers') == 1) {
+ // first and last in case a plugin registers a translation in an init method
+ elgg_register_event_handler('init', 'system', 'developers_clear_strings', 1000);
+ elgg_register_event_handler('init', 'system', 'developers_clear_strings', 1);
+ }
+
+ if (elgg_get_plugin_setting('wrap_views', 'developers') == 1) {
+ elgg_register_plugin_hook_handler('view', 'all', 'developers_wrap_views');
+ }
+
+ if (elgg_get_plugin_setting('log_events', 'developers') == 1) {
+ elgg_register_event_handler('all', 'all', 'developers_log_events', 1);
+ elgg_register_plugin_hook_handler('all', 'all', 'developers_log_events', 1);
+ }
+}
+
+function developers_setup_menu() {
+ if (elgg_in_context('admin')) {
+ elgg_register_admin_menu_item('develop', 'inspect', 'develop_tools');
+ elgg_register_admin_menu_item('develop', 'preview', 'develop_tools');
+ elgg_register_admin_menu_item('develop', 'unit_tests', 'develop_tools');
+
+ elgg_register_menu_item('page', array(
+ 'name' => 'dev_settings',
+ 'href' => 'admin/developers/settings',
+ 'text' => elgg_echo('settings'),
+ 'context' => 'admin',
+ 'priority' => 10,
+ 'section' => 'develop'
+ ));
+ }
+}
+
+/**
+ * Clear all the strings so the raw descriptor strings are displayed
+ */
+function developers_clear_strings() {
+ global $CONFIG;
+
+ $language = get_language();
+ $CONFIG->translations[$language] = array();
+ $CONFIG->translations['en'] = array();
+}
+
+/**
+ * Post-process a view to add wrapper comments to it
+ *
+ * 1. Only process views served with the 'default' viewtype.
+ * 2. Does not wrap views that begin with js/ or css/ as they are not HTML.
+ * 3. Does not wrap views that are images (start with icon/). Is this still true?
+ * 4. Does not wrap input and output views (why?).
+ * 5. Does not wrap html head or the primary page shells
+ *
+ * @warning this will break views in the default viewtype that return non-HTML data
+ * that do not match the above restrictions.
+ */
+function developers_wrap_views($hook, $type, $result, $params) {
+ if (elgg_get_viewtype() != "default") {
+ return;
+ }
+
+ $excluded_bases = array('css', 'js', 'input', 'output', 'embed', 'icon',);
+
+ $excluded_views = array(
+ 'page/default',
+ 'page/admin',
+ 'page/elements/head',
+ );
+
+ $view = $params['view'];
+
+ $view_hierarchy = explode('/',$view);
+ if (in_array($view_hierarchy[0], $excluded_bases)) {
+ return;
+ }
+
+ if (in_array($view, $excluded_views)) {
+ return;
+ }
+
+ if ($result) {
+ $result = "<!-- developers:begin $view -->$result<!-- developers:end $view -->";
+ }
+
+ return $result;
+}
+
+/**
+ * Log the events and plugin hooks
+ */
+function developers_log_events($name, $type) {
+
+ // filter out some very common events
+ if ($name == 'view' || $name == 'display' || $name == 'log' || $name == 'debug') {
+ return;
+ }
+ if ($name == 'session:get' || $name == 'validate') {
+ return;
+ }
+
+ $stack = debug_backtrace();
+ if ($stack[2]['function'] == 'elgg_trigger_event') {
+ $event_type = 'Event';
+ } else {
+ $event_type = 'Plugin hook';
+ }
+ $function = $stack[3]['function'] . '()';
+ if ($function == 'require_once' || $function == 'include_once') {
+ $function = $stack[3]['file'];
+ }
+
+ $msg = elgg_echo('developers:event_log_msg', array(
+ $event_type,
+ $name,
+ $type,
+ $function,
+ ));
+ elgg_dump($msg, false, 'WARNING');
+
+ unset($stack);
+}
+
+/**
+ * Serve the theme preview pages
+ *
+ * @param array $page
+ * @return bool
+ */
+function developers_theme_preview_controller($page) {
+ if (!isset($page[0])) {
+ forward('theme_preview/general');
+ }
+
+ $pages = array(
+ 'buttons',
+ 'components',
+ 'forms',
+ 'grid',
+ 'icons',
+ 'modules',
+ 'navigation',
+ 'typography',
+ 'miscellaneous'
+ );
+
+ foreach ($pages as $page_name) {
+ elgg_register_menu_item('page', array(
+ 'name' => $page_name,
+ 'text' => elgg_echo("theme_preview:$page_name"),
+ 'href' => "theme_preview/$page_name",
+ ));
+ }
+
+ $title = elgg_echo("theme_preview:{$page[0]}");
+ $body = elgg_view("theme_preview/{$page[0]}");
+
+ $layout = elgg_view_layout('one_sidebar', array(
+ 'title' => $title,
+ 'content' => $body,
+ ));
+
+ echo elgg_view_page($title, $layout, 'theme_preview');
+ return true;
+}
diff --git a/mod/developers/vendors/jsTree/jquery.jstree.js b/mod/developers/vendors/jsTree/jquery.jstree.js
new file mode 100644
index 000000000..965a612f6
--- /dev/null
+++ b/mod/developers/vendors/jsTree/jquery.jstree.js
@@ -0,0 +1,4544 @@
+/*
+ * jsTree 1.0-rc3
+ * http://jstree.com/
+ *
+ * Copyright (c) 2010 Ivan Bozhanov (vakata.com)
+ *
+ * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * $Date: 2011-02-09 01:17:14 +0200 (ÑÑ€, 09 февр 2011) $
+ * $Revision: 236 $
+ */
+
+/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */
+/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/
+
+"use strict";
+
+// top wrapper to prevent multiple inclusion (is this OK?)
+(function () { if(jQuery && jQuery.jstree) { return; }
+ var is_ie6 = false, is_ie7 = false, is_ff2 = false;
+
+/*
+ * jsTree core
+ */
+(function ($) {
+ // Common functions not related to jsTree
+ // decided to move them to a `vakata` "namespace"
+ $.vakata = {};
+ // CSS related functions
+ $.vakata.css = {
+ get_css : function(rule_name, delete_flag, sheet) {
+ rule_name = rule_name.toLowerCase();
+ var css_rules = sheet.cssRules || sheet.rules,
+ j = 0;
+ do {
+ if(css_rules.length && j > css_rules.length + 5) { return false; }
+ if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {
+ if(delete_flag === true) {
+ if(sheet.removeRule) { sheet.removeRule(j); }
+ if(sheet.deleteRule) { sheet.deleteRule(j); }
+ return true;
+ }
+ else { return css_rules[j]; }
+ }
+ }
+ while (css_rules[++j]);
+ return false;
+ },
+ add_css : function(rule_name, sheet) {
+ if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }
+ if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }
+ return $.vakata.css.get_css(rule_name);
+ },
+ remove_css : function(rule_name, sheet) {
+ return $.vakata.css.get_css(rule_name, true, sheet);
+ },
+ add_sheet : function(opts) {
+ var tmp = false, is_new = true;
+ if(opts.str) {
+ if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; }
+ if(tmp) { is_new = false; }
+ else {
+ tmp = document.createElement("style");
+ tmp.setAttribute('type',"text/css");
+ if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); }
+ }
+ if(tmp.styleSheet) {
+ if(is_new) {
+ document.getElementsByTagName("head")[0].appendChild(tmp);
+ tmp.styleSheet.cssText = opts.str;
+ }
+ else {
+ tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str;
+ }
+ }
+ else {
+ tmp.appendChild(document.createTextNode(opts.str));
+ document.getElementsByTagName("head")[0].appendChild(tmp);
+ }
+ return tmp.sheet || tmp.styleSheet;
+ }
+ if(opts.url) {
+ if(document.createStyleSheet) {
+ try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
+ }
+ else {
+ tmp = document.createElement('link');
+ tmp.rel = 'stylesheet';
+ tmp.type = 'text/css';
+ tmp.media = "all";
+ tmp.href = opts.url;
+ document.getElementsByTagName("head")[0].appendChild(tmp);
+ return tmp.styleSheet;
+ }
+ }
+ }
+ };
+
+ // private variables
+ var instances = [], // instance array (used by $.jstree.reference/create/focused)
+ focused_instance = -1, // the index in the instance array of the currently focused instance
+ plugins = {}, // list of included plugins
+ prepared_move = {}; // for the move_node function
+
+ // jQuery plugin wrapper (thanks to jquery UI widget function)
+ $.fn.jstree = function (settings) {
+ var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")
+ args = Array.prototype.slice.call(arguments, 1),
+ returnValue = this;
+
+ // if a method call execute the method on all selected instances
+ if(isMethodCall) {
+ if(settings.substring(0, 1) == '_') { return returnValue; }
+ this.each(function() {
+ var instance = instances[$.data(this, "jstree-instance-id")],
+ methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;
+ if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }
+ });
+ }
+ else {
+ this.each(function() {
+ // extend settings and allow for multiple hashes and $.data
+ var instance_id = $.data(this, "jstree-instance-id"),
+ a = [],
+ b = settings ? $.extend({}, true, settings) : {},
+ c = $(this),
+ s = false,
+ t = [];
+ a = a.concat(args);
+ if(c.data("jstree")) { a.push(c.data("jstree")); }
+ b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b;
+
+ // if an instance already exists, destroy it first
+ if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }
+ // push a new empty object to the instances array
+ instance_id = parseInt(instances.push({}),10) - 1;
+ // store the jstree instance id to the container element
+ $.data(this, "jstree-instance-id", instance_id);
+ // clean up all plugins
+ b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice();
+ b.plugins.unshift("core");
+ // only unique plugins
+ b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
+
+ // extend defaults with passed data
+ s = $.extend(true, {}, $.jstree.defaults, b);
+ s.plugins = b.plugins;
+ $.each(plugins, function (i, val) {
+ if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; }
+ else { t.push(i); }
+ });
+ s.plugins = t;
+
+ // push the new object to the instances array (at the same time set the default classes to the container) and init
+ instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s);
+ // init all activated plugins for this instance
+ $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });
+ $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });
+ // initialize the instance
+ setTimeout(function() { instances[instance_id].init(); }, 0);
+ });
+ }
+ // return the jquery selection (or if it was a method call that returned a value - the returned value)
+ return returnValue;
+ };
+ // object to store exposed functions and objects
+ $.jstree = {
+ defaults : {
+ plugins : []
+ },
+ _focused : function () { return instances[focused_instance] || null; },
+ _reference : function (needle) {
+ // get by instance id
+ if(instances[needle]) { return instances[needle]; }
+ // get by DOM (if still no luck - return null
+ var o = $(needle);
+ if(!o.length && typeof needle === "string") { o = $("#" + needle); }
+ if(!o.length) { return null; }
+ return instances[o.closest(".jstree").data("jstree-instance-id")] || null;
+ },
+ _instance : function (index, container, settings) {
+ // for plugins to store data in
+ this.data = { core : {} };
+ this.get_settings = function () { return $.extend(true, {}, settings); };
+ this._get_settings = function () { return settings; };
+ this.get_index = function () { return index; };
+ this.get_container = function () { return container; };
+ this.get_container_ul = function () { return container.children("ul:eq(0)"); };
+ this._set_settings = function (s) {
+ settings = $.extend(true, {}, settings, s);
+ };
+ },
+ _fn : { },
+ plugin : function (pname, pdata) {
+ pdata = $.extend({}, {
+ __init : $.noop,
+ __destroy : $.noop,
+ _fn : {},
+ defaults : false
+ }, pdata);
+ plugins[pname] = pdata;
+
+ $.jstree.defaults[pname] = pdata.defaults;
+ $.each(pdata._fn, function (i, val) {
+ val.plugin = pname;
+ val.old = $.jstree._fn[i];
+ $.jstree._fn[i] = function () {
+ var rslt,
+ func = val,
+ args = Array.prototype.slice.call(arguments),
+ evnt = new $.Event("before.jstree"),
+ rlbk = false;
+
+ if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; }
+
+ // Check if function belongs to the included plugins of this instance
+ do {
+ if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }
+ func = func.old;
+ } while(func);
+ if(!func) { return; }
+
+ // context and function to trigger events, then finally call the function
+ if(i.indexOf("_") === 0) {
+ rslt = func.apply(this, args);
+ }
+ else {
+ rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin });
+ if(rslt === false) { return; }
+ if(typeof rslt !== "undefined") { args = rslt; }
+
+ rslt = func.apply(
+ $.extend({}, this, {
+ __callback : function (data) {
+ this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });
+ },
+ __rollback : function () {
+ rlbk = this.get_rollback();
+ return rlbk;
+ },
+ __call_old : function (replace_arguments) {
+ return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );
+ }
+ }), args);
+ }
+
+ // return the result
+ return rslt;
+ };
+ $.jstree._fn[i].old = val.old;
+ $.jstree._fn[i].plugin = pname;
+ });
+ },
+ rollback : function (rb) {
+ if(rb) {
+ if(!$.isArray(rb)) { rb = [ rb ]; }
+ $.each(rb, function (i, val) {
+ instances[val.i].set_rollback(val.h, val.d);
+ });
+ }
+ }
+ };
+ // set the prototype for all instances
+ $.jstree._fn = $.jstree._instance.prototype = {};
+
+ // load the css when DOM is ready
+ $(function() {
+ // code is copied from jQuery ($.browser is deprecated + there is a bug in IE)
+ var u = navigator.userAgent.toLowerCase(),
+ v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
+ css_string = '' +
+ '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' +
+ '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' +
+ '.jstree-rtl li { margin-left:0; margin-right:18px; } ' +
+ '.jstree > ul > li { margin-left:0px; } ' +
+ '.jstree-rtl > ul > li { margin-right:0px; } ' +
+ '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' +
+ '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' +
+ '.jstree a:focus { outline: none; } ' +
+ '.jstree a > ins { height:16px; width:16px; } ' +
+ '.jstree a > .jstree-icon { margin-right:3px; } ' +
+ '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' +
+ 'li.jstree-open > ul { display:block; } ' +
+ 'li.jstree-closed > ul { display:none; } ';
+ // Correct IE 6 (does not support the > CSS selector)
+ if(/msie/.test(u) && parseInt(v, 10) == 6) {
+ is_ie6 = true;
+
+ // fix image flicker and lack of caching
+ try {
+ document.execCommand("BackgroundImageCache", false, true);
+ } catch (err) { }
+
+ css_string += '' +
+ '.jstree li { height:18px; margin-left:0; margin-right:0; } ' +
+ '.jstree li li { margin-left:18px; } ' +
+ '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' +
+ 'li.jstree-open ul { display:block; } ' +
+ 'li.jstree-closed ul { display:none !important; } ' +
+ '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' +
+ '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' +
+ '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';
+ }
+ // Correct IE 7 (shifts anchor nodes onhover)
+ if(/msie/.test(u) && parseInt(v, 10) == 7) {
+ is_ie7 = true;
+ css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';
+ }
+ // correct ff2 lack of display:inline-block
+ if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) {
+ is_ff2 = true;
+ css_string += '' +
+ '.jstree ins { display:-moz-inline-box; } ' +
+ '.jstree li { line-height:12px; } ' + // WHY??
+ '.jstree a { display:-moz-inline-box; } ' +
+ '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } ';
+ /* this shouldn't be here as it is theme specific */
+ }
+ // the default stylesheet
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
+ });
+
+ // core functions (open, close, create, update, delete)
+ $.jstree.plugin("core", {
+ __init : function () {
+ this.data.core.locked = false;
+ this.data.core.to_open = this.get_settings().core.initially_open;
+ this.data.core.to_load = this.get_settings().core.initially_load;
+ },
+ defaults : {
+ html_titles : false,
+ animation : 500,
+ initially_open : [],
+ initially_load : [],
+ open_parents : true,
+ notify_plugins : true,
+ rtl : false,
+ load_open : false,
+ strings : {
+ loading : "Loading ...",
+ new_node : "New node",
+ multiple_selection : "Multiple selection"
+ }
+ },
+ _fn : {
+ init : function () {
+ this.set_focus();
+ if(this._get_settings().core.rtl) {
+ this.get_container().addClass("jstree-rtl").css("direction", "rtl");
+ }
+ this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_string("loading") + "</a></li></ul>");
+ this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18;
+
+ this.get_container()
+ .delegate("li > ins", "click.jstree", $.proxy(function (event) {
+ var trgt = $(event.target);
+ if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
+ }, this))
+ .bind("mousedown.jstree", $.proxy(function () {
+ this.set_focus(); // This used to be setTimeout(set_focus,0) - why?
+ }, this))
+ .bind("dblclick.jstree", function (event) {
+ var sel;
+ if(document.selection && document.selection.empty) { document.selection.empty(); }
+ else {
+ if(window.getSelection) {
+ sel = window.getSelection();
+ try {
+ sel.removeAllRanges();
+ sel.collapse();
+ } catch (err) { }
+ }
+ }
+ });
+ if(this._get_settings().core.notify_plugins) {
+ this.get_container()
+ .bind("load_node.jstree", $.proxy(function (e, data) {
+ var o = this._get_node(data.rslt.obj),
+ t = this;
+ if(o === -1) { o = this.get_container_ul(); }
+ if(!o.length) { return; }
+ o.find("li").each(function () {
+ var th = $(this);
+ if(th.data("jstree")) {
+ $.each(th.data("jstree"), function (plugin, values) {
+ if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) {
+ t["_" + plugin + "_notify"].call(t, th, values);
+ }
+ });
+ }
+ });
+ }, this));
+ }
+ if(this._get_settings().core.load_open) {
+ this.get_container()
+ .bind("load_node.jstree", $.proxy(function (e, data) {
+ var o = this._get_node(data.rslt.obj),
+ t = this;
+ if(o === -1) { o = this.get_container_ul(); }
+ if(!o.length) { return; }
+ o.find("li.jstree-open:not(:has(ul))").each(function () {
+ t.load_node(this, $.noop, $.noop);
+ });
+ }, this));
+ }
+ this.__callback();
+ this.load_node(-1, function () { this.loaded(); this.reload_nodes(); });
+ },
+ destroy : function () {
+ var i,
+ n = this.get_index(),
+ s = this._get_settings(),
+ _this = this;
+
+ $.each(s.plugins, function (i, val) {
+ try { plugins[val].__destroy.apply(_this); } catch(err) { }
+ });
+ this.__callback();
+ // set focus to another instance if this one is focused
+ if(this.is_focused()) {
+ for(i in instances) {
+ if(instances.hasOwnProperty(i) && i != n) {
+ instances[i].set_focus();
+ break;
+ }
+ }
+ }
+ // if no other instance found
+ if(n === focused_instance) { focused_instance = -1; }
+ // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
+ this.get_container()
+ .unbind(".jstree")
+ .undelegate(".jstree")
+ .removeData("jstree-instance-id")
+ .find("[class^='jstree']")
+ .andSelf()
+ .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
+ $(document)
+ .unbind(".jstree-" + n)
+ .undelegate(".jstree-" + n);
+ // remove the actual data
+ instances[n] = null;
+ delete instances[n];
+ },
+
+ _core_notify : function (n, data) {
+ if(data.opened) {
+ this.open_node(n, false, true);
+ }
+ },
+
+ lock : function () {
+ this.data.core.locked = true;
+ this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7");
+ this.__callback({});
+ },
+ unlock : function () {
+ this.data.core.locked = false;
+ this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1");
+ this.__callback({});
+ },
+ is_locked : function () { return this.data.core.locked; },
+ save_opened : function () {
+ var _this = this;
+ this.data.core.to_open = [];
+ this.get_container_ul().find("li.jstree-open").each(function () {
+ if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); }
+ });
+ this.__callback(_this.data.core.to_open);
+ },
+ save_loaded : function () { },
+ reload_nodes : function (is_callback) {
+ var _this = this,
+ done = true,
+ current = [],
+ remaining = [];
+ if(!is_callback) {
+ this.data.core.reopen = false;
+ this.data.core.refreshing = true;
+ this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
+ this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
+ if(this.data.core.to_open.length) {
+ this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open);
+ }
+ }
+ if(this.data.core.to_load.length) {
+ $.each(this.data.core.to_load, function (i, val) {
+ if(val == "#") { return true; }
+ if($(val).length) { current.push(val); }
+ else { remaining.push(val); }
+ });
+ if(current.length) {
+ this.data.core.to_load = remaining;
+ $.each(current, function (i, val) {
+ if(!_this._is_loaded(val)) {
+ _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); });
+ done = false;
+ }
+ });
+ }
+ }
+ if(this.data.core.to_open.length) {
+ $.each(this.data.core.to_open, function (i, val) {
+ _this.open_node(val, false, true);
+ });
+ }
+ if(done) {
+ // TODO: find a more elegant approach to syncronizing returning requests
+ if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
+ this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);
+ this.data.core.refreshing = false;
+ this.reopen();
+ }
+ },
+ reopen : function () {
+ var _this = this;
+ if(this.data.core.to_open.length) {
+ $.each(this.data.core.to_open, function (i, val) {
+ _this.open_node(val, false, true);
+ });
+ }
+ this.__callback({});
+ },
+ refresh : function (obj) {
+ var _this = this;
+ this.save_opened();
+ if(!obj) { obj = -1; }
+ obj = this._get_node(obj);
+ if(!obj) { obj = -1; }
+ if(obj !== -1) { obj.children("UL").remove(); }
+ else { this.get_container_ul().empty(); }
+ this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); });
+ },
+ // Dummy function to fire after the first load (so that there is a jstree.loaded event)
+ loaded : function () {
+ this.__callback();
+ },
+ // deal with focus
+ set_focus : function () {
+ if(this.is_focused()) { return; }
+ var f = $.jstree._focused();
+ if(f) { f.unset_focus(); }
+
+ this.get_container().addClass("jstree-focused");
+ focused_instance = this.get_index();
+ this.__callback();
+ },
+ is_focused : function () {
+ return focused_instance == this.get_index();
+ },
+ unset_focus : function () {
+ if(this.is_focused()) {
+ this.get_container().removeClass("jstree-focused");
+ focused_instance = -1;
+ }
+ this.__callback();
+ },
+
+ // traverse
+ _get_node : function (obj) {
+ var $obj = $(obj, this.get_container());
+ if($obj.is(".jstree") || obj == -1) { return -1; }
+ $obj = $obj.closest("li", this.get_container());
+ return $obj.length ? $obj : false;
+ },
+ _get_next : function (obj, strict) {
+ obj = this._get_node(obj);
+ if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }
+ if(!obj.length) { return false; }
+ if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }
+
+ if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }
+ else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }
+ else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }
+ },
+ _get_prev : function (obj, strict) {
+ obj = this._get_node(obj);
+ if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }
+ if(!obj.length) { return false; }
+ if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }
+
+ if(obj.prev("li").length) {
+ obj = obj.prev("li").eq(0);
+ while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }
+ return obj;
+ }
+ else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }
+ },
+ _get_parent : function (obj) {
+ obj = this._get_node(obj);
+ if(obj == -1 || !obj.length) { return false; }
+ var o = obj.parentsUntil(".jstree", "li:eq(0)");
+ return o.length ? o : -1;
+ },
+ _get_children : function (obj) {
+ obj = this._get_node(obj);
+ if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }
+ if(!obj.length) { return false; }
+ return obj.children("ul:eq(0)").children("li");
+ },
+ get_path : function (obj, id_mode) {
+ var p = [],
+ _this = this;
+ obj = this._get_node(obj);
+ if(obj === -1 || !obj || !obj.length) { return false; }
+ obj.parentsUntil(".jstree", "li").each(function () {
+ p.push( id_mode ? this.id : _this.get_text(this) );
+ });
+ p.reverse();
+ p.push( id_mode ? obj.attr("id") : this.get_text(obj) );
+ return p;
+ },
+
+ // string functions
+ _get_string : function (key) {
+ return this._get_settings().core.strings[key] || key;
+ },
+
+ is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },
+ is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },
+ is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },
+ correct_state : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj || obj === -1) { return false; }
+ obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove();
+ this.__callback({ "obj" : obj });
+ },
+ // open/close
+ open_node : function (obj, callback, skip_animation) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }
+ var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
+ t = this;
+ if(!this._is_loaded(obj)) {
+ obj.children("a").addClass("jstree-loading");
+ this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);
+ }
+ else {
+ if(this._get_settings().core.open_parents) {
+ obj.parentsUntil(".jstree",".jstree-closed").each(function () {
+ t.open_node(this, false, true);
+ });
+ }
+ if(s) { obj.children("ul").css("display","none"); }
+ obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");
+ if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); }
+ else { t.after_open(obj); }
+ this.__callback({ "obj" : obj });
+ if(callback) { callback.call(); }
+ }
+ },
+ after_open : function (obj) { this.__callback({ "obj" : obj }); },
+ close_node : function (obj, skip_animation) {
+ obj = this._get_node(obj);
+ var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
+ t = this;
+ if(!obj.length || !obj.hasClass("jstree-open")) { return false; }
+ if(s) { obj.children("ul").attr("style","display:block !important"); }
+ obj.removeClass("jstree-open").addClass("jstree-closed");
+ if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); }
+ else { t.after_close(obj); }
+ this.__callback({ "obj" : obj });
+ },
+ after_close : function (obj) { this.__callback({ "obj" : obj }); },
+ toggle_node : function (obj) {
+ obj = this._get_node(obj);
+ if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }
+ if(obj.hasClass("jstree-open")) { return this.close_node(obj); }
+ },
+ open_all : function (obj, do_animation, original_obj) {
+ obj = obj ? this._get_node(obj) : -1;
+ if(!obj || obj === -1) { obj = this.get_container_ul(); }
+ if(original_obj) {
+ obj = obj.find("li.jstree-closed");
+ }
+ else {
+ original_obj = obj;
+ if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }
+ else { obj = obj.find("li.jstree-closed"); }
+ }
+ var _this = this;
+ obj.each(function () {
+ var __this = this;
+ if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); }
+ else { _this.open_node(this, false, !do_animation); }
+ });
+ // so that callback is fired AFTER all nodes are open
+ if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }
+ },
+ close_all : function (obj, do_animation) {
+ var _this = this;
+ obj = obj ? this._get_node(obj) : this.get_container();
+ if(!obj || obj === -1) { obj = this.get_container_ul(); }
+ obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); });
+ this.__callback({ "obj" : obj });
+ },
+ clean_node : function (obj) {
+ obj = obj && obj != -1 ? $(obj) : this.get_container_ul();
+ obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");
+ obj.removeClass("jstree-last")
+ .filter("li:last-child").addClass("jstree-last").end()
+ .filter(":has(li)")
+ .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");
+ obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();
+ this.__callback({ "obj" : obj });
+ },
+ // rollback
+ get_rollback : function () {
+ this.__callback();
+ return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data };
+ },
+ set_rollback : function (html, data) {
+ this.get_container().empty().append(html);
+ this.data = data;
+ this.__callback();
+ },
+ // Dummy functions to be overwritten by any datastore plugin included
+ load_node : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },
+ _is_loaded : function (obj) { return true; },
+
+ // Basic operations: create
+ create_node : function (obj, position, js, callback, is_loaded) {
+ obj = this._get_node(obj);
+ position = typeof position === "undefined" ? "last" : position;
+ var d = $("<li />"),
+ s = this._get_settings().core,
+ tmp;
+
+ if(obj !== -1 && !obj.length) { return false; }
+ if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }
+
+ this.__rollback();
+
+ if(typeof js === "string") { js = { "data" : js }; }
+ if(!js) { js = {}; }
+ if(js.attr) { d.attr(js.attr); }
+ if(js.metadata) { d.data(js.metadata); }
+ if(js.state) { d.addClass("jstree-" + js.state); }
+ if(!js.data) { js.data = this._get_string("new_node"); }
+ if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
+ $.each(js.data, function (i, m) {
+ tmp = $("<a />");
+ if($.isFunction(m)) { m = m.call(this, js); }
+ if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }
+ else {
+ if(!m.attr) { m.attr = {}; }
+ if(!m.attr.href) { m.attr.href = '#'; }
+ tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);
+ if(m.language) { tmp.addClass(m.language); }
+ }
+ tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
+ if(m.icon) {
+ if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
+ else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
+ }
+ d.append(tmp);
+ });
+ d.prepend("<ins class='jstree-icon'>&#160;</ins>");
+ if(obj === -1) {
+ obj = this.get_container();
+ if(position === "before") { position = "first"; }
+ if(position === "after") { position = "last"; }
+ }
+ switch(position) {
+ case "before": obj.before(d); tmp = this._get_parent(obj); break;
+ case "after" : obj.after(d); tmp = this._get_parent(obj); break;
+ case "inside":
+ case "first" :
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
+ obj.children("ul").prepend(d);
+ tmp = obj;
+ break;
+ case "last":
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
+ obj.children("ul").append(d);
+ tmp = obj;
+ break;
+ default:
+ if(!obj.children("ul").length) { obj.append("<ul />"); }
+ if(!position) { position = 0; }
+ tmp = obj.children("ul").children("li").eq(position);
+ if(tmp.length) { tmp.before(d); }
+ else { obj.children("ul").append(d); }
+ tmp = obj;
+ break;
+ }
+ if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }
+ this.clean_node(tmp);
+ this.__callback({ "obj" : d, "parent" : tmp });
+ if(callback) { callback.call(this, d); }
+ return d;
+ },
+ // Basic operations: rename (deal with text)
+ get_text : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ var s = this._get_settings().core.html_titles;
+ obj = obj.children("a:eq(0)");
+ if(s) {
+ obj = obj.clone();
+ obj.children("INS").remove();
+ return obj.html();
+ }
+ else {
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
+ return obj.nodeValue;
+ }
+ },
+ set_text : function (obj, val) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ obj = obj.children("a:eq(0)");
+ if(this._get_settings().core.html_titles) {
+ var tmp = obj.children("INS").clone();
+ obj.html(val).prepend(tmp);
+ this.__callback({ "obj" : obj, "name" : val });
+ return true;
+ }
+ else {
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
+ this.__callback({ "obj" : obj, "name" : val });
+ return (obj.nodeValue = val);
+ }
+ },
+ rename_node : function (obj, val) {
+ obj = this._get_node(obj);
+ this.__rollback();
+ if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }
+ },
+ // Basic operations: deleting nodes
+ delete_node : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ this.__rollback();
+ var p = this._get_parent(obj), prev = $([]), t = this;
+ obj.each(function () {
+ prev = prev.add(t._get_prev(this));
+ });
+ obj = obj.detach();
+ if(p !== -1 && p.find("> ul > li").length === 0) {
+ p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
+ }
+ this.clean_node(p);
+ this.__callback({ "obj" : obj, "prev" : prev, "parent" : p });
+ return obj;
+ },
+ prepare_move : function (o, r, pos, cb, is_cb) {
+ var p = {};
+
+ p.ot = $.jstree._reference(o) || this;
+ p.o = p.ot._get_node(o);
+ p.r = r === - 1 ? -1 : this._get_node(r);
+ p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting
+ if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {
+ this.__callback(prepared_move);
+ if(cb) { cb.call(this, prepared_move); }
+ return;
+ }
+ p.ot = $.jstree._reference(p.o) || this;
+ p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this
+ if(p.r === -1 || !p.r) {
+ p.cr = -1;
+ switch(p.p) {
+ case "first":
+ case "before":
+ case "inside":
+ p.cp = 0;
+ break;
+ case "after":
+ case "last":
+ p.cp = p.rt.get_container().find(" > ul > li").length;
+ break;
+ default:
+ p.cp = p.p;
+ break;
+ }
+ }
+ else {
+ if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {
+ return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });
+ }
+ switch(p.p) {
+ case "before":
+ p.cp = p.r.index();
+ p.cr = p.rt._get_parent(p.r);
+ break;
+ case "after":
+ p.cp = p.r.index() + 1;
+ p.cr = p.rt._get_parent(p.r);
+ break;
+ case "inside":
+ case "first":
+ p.cp = 0;
+ p.cr = p.r;
+ break;
+ case "last":
+ p.cp = p.r.find(" > ul > li").length;
+ p.cr = p.r;
+ break;
+ default:
+ p.cp = p.p;
+ p.cr = p.r;
+ break;
+ }
+ }
+ p.np = p.cr == -1 ? p.rt.get_container() : p.cr;
+ p.op = p.ot._get_parent(p.o);
+ p.cop = p.o.index();
+ if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); }
+ if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; }
+ //if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }
+ p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");
+ prepared_move = p;
+ this.__callback(prepared_move);
+ if(cb) { cb.call(this, prepared_move); }
+ },
+ check_move : function () {
+ var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r;
+ if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; }
+ if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; }
+ obj.o.each(function () {
+ if(r.parentsUntil(".jstree", "li").andSelf().index(this) !== -1) { ret = false; return false; }
+ });
+ return ret;
+ },
+ move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
+ if(!is_prepared) {
+ return this.prepare_move(obj, ref, position, function (p) {
+ this.move_node(p, false, false, is_copy, true, skip_check);
+ });
+ }
+ if(is_copy) {
+ prepared_move.cy = true;
+ }
+ if(!skip_check && !this.check_move()) { return false; }
+
+ this.__rollback();
+ var o = false;
+ if(is_copy) {
+ o = obj.o.clone(true);
+ o.find("*[id]").andSelf().each(function () {
+ if(this.id) { this.id = "copy_" + this.id; }
+ });
+ }
+ else { o = obj.o; }
+
+ if(obj.or.length) { obj.or.before(o); }
+ else {
+ if(!obj.np.children("ul").length) { $("<ul />").appendTo(obj.np); }
+ obj.np.children("ul:eq(0)").append(o);
+ }
+
+ try {
+ obj.ot.clean_node(obj.op);
+ obj.rt.clean_node(obj.np);
+ if(!obj.op.find("> ul > li").length) {
+ obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();
+ }
+ } catch (e) { }
+
+ if(is_copy) {
+ prepared_move.cy = true;
+ prepared_move.oc = o;
+ }
+ this.__callback(prepared_move);
+ return prepared_move;
+ },
+ _get_move : function () { return prepared_move; }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree ui plugin
+ * This plugins handles selecting/deselecting/hovering/dehovering nodes
+ */
+(function ($) {
+ var scrollbar_width, e1, e2;
+ $(function() {
+ if (/msie/.test(navigator.userAgent.toLowerCase())) {
+ e1 = $('<textarea cols="10" rows="2"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
+ e2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
+ scrollbar_width = e1.width() - e2.width();
+ e1.add(e2).remove();
+ }
+ else {
+ e1 = $('<div />').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 })
+ .prependTo('body').append('<div />').find('div').css({ width: '100%', height: 200 });
+ scrollbar_width = 100 - e1.width();
+ e1.parent().remove();
+ }
+ });
+ $.jstree.plugin("ui", {
+ __init : function () {
+ this.data.ui.selected = $();
+ this.data.ui.last_selected = false;
+ this.data.ui.hovered = null;
+ this.data.ui.to_select = this.get_settings().ui.initially_select;
+
+ this.get_container()
+ .delegate("a", "click.jstree", $.proxy(function (event) {
+ event.preventDefault();
+ event.currentTarget.blur();
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
+ this.select_node(event.currentTarget, true, event);
+ }
+ }, this))
+ .delegate("a", "mouseenter.jstree", $.proxy(function (event) {
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
+ this.hover_node(event.target);
+ }
+ }, this))
+ .delegate("a", "mouseleave.jstree", $.proxy(function (event) {
+ if(!$(event.currentTarget).hasClass("jstree-loading")) {
+ this.dehover_node(event.target);
+ }
+ }, this))
+ .bind("reopen.jstree", $.proxy(function () {
+ this.reselect();
+ }, this))
+ .bind("get_rollback.jstree", $.proxy(function () {
+ this.dehover_node();
+ this.save_selected();
+ }, this))
+ .bind("set_rollback.jstree", $.proxy(function () {
+ this.reselect();
+ }, this))
+ .bind("close_node.jstree", $.proxy(function (event, data) {
+ var s = this._get_settings().ui,
+ obj = this._get_node(data.rslt.obj),
+ clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(),
+ _this = this;
+ if(s.selected_parent_close === false || !clk.length) { return; }
+ clk.each(function () {
+ _this.deselect_node(this);
+ if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }
+ });
+ }, this))
+ .bind("delete_node.jstree", $.proxy(function (event, data) {
+ var s = this._get_settings().ui.select_prev_on_delete,
+ obj = this._get_node(data.rslt.obj),
+ clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [],
+ _this = this;
+ clk.each(function () { _this.deselect_node(this); });
+ if(s && clk.length) {
+ data.rslt.prev.each(function () {
+ if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */}
+ });
+ }
+ }, this))
+ .bind("move_node.jstree", $.proxy(function (event, data) {
+ if(data.rslt.cy) {
+ data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked");
+ }
+ }, this));
+ },
+ defaults : {
+ select_limit : -1, // 0, 1, 2 ... or -1 for unlimited
+ select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt
+ select_range_modifier : "shift",
+ selected_parent_close : "select_parent", // false, "deselect", "select_parent"
+ selected_parent_open : true,
+ select_prev_on_delete : true,
+ disable_selecting_children : false,
+ initially_select : []
+ },
+ _fn : {
+ _get_node : function (obj, allow_multiple) {
+ if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }
+ var $obj = $(obj, this.get_container());
+ if($obj.is(".jstree") || obj == -1) { return -1; }
+ $obj = $obj.closest("li", this.get_container());
+ return $obj.length ? $obj : false;
+ },
+ _ui_notify : function (n, data) {
+ if(data.selected) {
+ this.select_node(n, false);
+ }
+ },
+ save_selected : function () {
+ var _this = this;
+ this.data.ui.to_select = [];
+ this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } });
+ this.__callback(this.data.ui.to_select);
+ },
+ reselect : function () {
+ var _this = this,
+ s = this.data.ui.to_select;
+ s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
+ // this.deselect_all(); WHY deselect, breaks plugin state notifier?
+ $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });
+ this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; });
+ this.__callback();
+ },
+ refresh : function (obj) {
+ this.save_selected();
+ return this.__call_old();
+ },
+ hover_node : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
+ if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }
+ this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();
+ this._fix_scroll(obj);
+ this.__callback({ "obj" : obj });
+ },
+ dehover_node : function () {
+ var obj = this.data.ui.hovered, p;
+ if(!obj || !obj.length) { return false; }
+ p = obj.children("a").removeClass("jstree-hovered").parent();
+ if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }
+ this.__callback({ "obj" : obj });
+ },
+ select_node : function (obj, check, e) {
+ obj = this._get_node(obj);
+ if(obj == -1 || !obj || !obj.length) { return false; }
+ var s = this._get_settings().ui,
+ is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),
+ is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]),
+ is_selected = this.is_selected(obj),
+ proceed = true,
+ t = this;
+ if(check) {
+ if(s.disable_selecting_children && is_multiple &&
+ (
+ (obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) ||
+ (obj.children("ul").find("a.jstree-clicked:eq(0)").length)
+ )
+ ) {
+ return false;
+ }
+ proceed = false;
+ switch(!0) {
+ case (is_range):
+ this.data.ui.last_selected.addClass("jstree-last-selected");
+ obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").andSelf();
+ if(s.select_limit == -1 || obj.length < s.select_limit) {
+ this.data.ui.last_selected.removeClass("jstree-last-selected");
+ this.data.ui.selected.each(function () {
+ if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); }
+ });
+ is_selected = false;
+ proceed = true;
+ }
+ else {
+ proceed = false;
+ }
+ break;
+ case (is_selected && !is_multiple):
+ this.deselect_all();
+ is_selected = false;
+ proceed = true;
+ break;
+ case (!is_selected && !is_multiple):
+ if(s.select_limit == -1 || s.select_limit > 0) {
+ this.deselect_all();
+ proceed = true;
+ }
+ break;
+ case (is_selected && is_multiple):
+ this.deselect_node(obj);
+ break;
+ case (!is_selected && is_multiple):
+ if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) {
+ proceed = true;
+ }
+ break;
+ }
+ }
+ if(proceed && !is_selected) {
+ if(!is_range) { this.data.ui.last_selected = obj; }
+ obj.children("a").addClass("jstree-clicked");
+ if(s.selected_parent_open) {
+ obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
+ }
+ this.data.ui.selected = this.data.ui.selected.add(obj);
+ this._fix_scroll(obj.eq(0));
+ this.__callback({ "obj" : obj, "e" : e });
+ }
+ },
+ _fix_scroll : function (obj) {
+ var c = this.get_container()[0], t;
+ if(c.scrollHeight > c.offsetHeight) {
+ obj = this._get_node(obj);
+ if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; }
+ t = obj.offset().top - this.get_container().offset().top;
+ if(t < 0) {
+ c.scrollTop = c.scrollTop + t - 1;
+ }
+ if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) {
+ c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0));
+ }
+ }
+ },
+ deselect_node : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ if(this.is_selected(obj)) {
+ obj.children("a").removeClass("jstree-clicked");
+ this.data.ui.selected = this.data.ui.selected.not(obj);
+ if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }
+ this.__callback({ "obj" : obj });
+ }
+ },
+ toggle_select : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return false; }
+ if(this.is_selected(obj)) { this.deselect_node(obj); }
+ else { this.select_node(obj); }
+ },
+ is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },
+ get_selected : function (context) {
+ return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected;
+ },
+ deselect_all : function (context) {
+ var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent();
+ ret.children("a.jstree-clicked").removeClass("jstree-clicked");
+ this.data.ui.selected = $([]);
+ this.data.ui.last_selected = false;
+ this.__callback({ "obj" : ret });
+ }
+ }
+ });
+ // include the selection plugin by default
+ $.jstree.defaults.plugins.push("ui");
+})(jQuery);
+//*/
+
+/*
+ * jsTree CRRM plugin
+ * Handles creating/renaming/removing/moving nodes by user interaction.
+ */
+(function ($) {
+ $.jstree.plugin("crrm", {
+ __init : function () {
+ this.get_container()
+ .bind("move_node.jstree", $.proxy(function (e, data) {
+ if(this._get_settings().crrm.move.open_onmove) {
+ var t = this;
+ data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {
+ t.open_node(this, false, true);
+ });
+ }
+ }, this));
+ },
+ defaults : {
+ input_width_limit : 200,
+ move : {
+ always_copy : false, // false, true or "multitree"
+ open_onmove : true,
+ default_position : "last",
+ check_move : function (m) { return true; }
+ }
+ },
+ _fn : {
+ _show_input : function (obj, callback) {
+ obj = this._get_node(obj);
+ var rtl = this._get_settings().core.rtl,
+ w = this._get_settings().crrm.input_width_limit,
+ w1 = obj.children("ins").width(),
+ w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,
+ t = this.get_text(obj),
+ h1 = $("<div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
+ h2 = obj.css("position","relative").append(
+ $("<input />", {
+ "value" : t,
+ "class" : "jstree-rename-input",
+ // "size" : t.length,
+ "css" : {
+ "padding" : "0",
+ "border" : "1px solid silver",
+ "position" : "absolute",
+ "left" : (rtl ? "auto" : (w1 + w2 + 4) + "px"),
+ "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),
+ "top" : "0px",
+ "height" : (this.data.core.li_height - 2) + "px",
+ "lineHeight" : (this.data.core.li_height - 2) + "px",
+ "width" : "150px" // will be set a bit further down
+ },
+ "blur" : $.proxy(function () {
+ var i = obj.children(".jstree-rename-input"),
+ v = i.val();
+ if(v === "") { v = t; }
+ h1.remove();
+ i.remove(); // rollback purposes
+ this.set_text(obj,t); // rollback purposes
+ this.rename_node(obj, v);
+ callback.call(this, obj, v, t);
+ obj.css("position","");
+ }, this),
+ "keyup" : function (event) {
+ var key = event.keyCode || event.which;
+ if(key == 27) { this.value = t; this.blur(); return; }
+ else if(key == 13) { this.blur(); return; }
+ else {
+ h2.width(Math.min(h1.text("pW" + this.value).width(),w));
+ }
+ },
+ "keypress" : function(event) {
+ var key = event.keyCode || event.which;
+ if(key == 13) { return false; }
+ }
+ })
+ ).children(".jstree-rename-input");
+ this.set_text(obj, "");
+ h1.css({
+ fontFamily : h2.css('fontFamily') || '',
+ fontSize : h2.css('fontSize') || '',
+ fontWeight : h2.css('fontWeight') || '',
+ fontStyle : h2.css('fontStyle') || '',
+ fontStretch : h2.css('fontStretch') || '',
+ fontVariant : h2.css('fontVariant') || '',
+ letterSpacing : h2.css('letterSpacing') || '',
+ wordSpacing : h2.css('wordSpacing') || ''
+ });
+ h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
+ },
+ rename : function (obj) {
+ obj = this._get_node(obj);
+ this.__rollback();
+ var f = this.__callback;
+ this._show_input(obj, function (obj, new_name, old_name) {
+ f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });
+ });
+ },
+ create : function (obj, position, js, callback, skip_rename) {
+ var t, _this = this;
+ obj = this._get_node(obj);
+ if(!obj) { obj = -1; }
+ this.__rollback();
+ t = this.create_node(obj, position, js, function (t) {
+ var p = this._get_parent(t),
+ pos = $(t).index();
+ if(callback) { callback.call(this, t); }
+ if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }
+ if(!skip_rename) {
+ this._show_input(t, function (obj, new_name, old_name) {
+ _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });
+ });
+ }
+ else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }
+ });
+ return t;
+ },
+ remove : function (obj) {
+ obj = this._get_node(obj, true);
+ var p = this._get_parent(obj), prev = this._get_prev(obj);
+ this.__rollback();
+ obj = this.delete_node(obj);
+ if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); }
+ },
+ check_move : function () {
+ if(!this.__call_old()) { return false; }
+ var s = this._get_settings().crrm.move;
+ if(!s.check_move.call(this, this._get_move())) { return false; }
+ return true;
+ },
+ move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
+ var s = this._get_settings().crrm.move;
+ if(!is_prepared) {
+ if(typeof position === "undefined") { position = s.default_position; }
+ if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }
+ return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);
+ }
+ // if the move is already prepared
+ if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {
+ is_copy = true;
+ }
+ this.__call_old(true, obj, ref, position, is_copy, true, skip_check);
+ },
+
+ cut : function (obj) {
+ obj = this._get_node(obj, true);
+ if(!obj || !obj.length) { return false; }
+ this.data.crrm.cp_nodes = false;
+ this.data.crrm.ct_nodes = obj;
+ this.__callback({ "obj" : obj });
+ },
+ copy : function (obj) {
+ obj = this._get_node(obj, true);
+ if(!obj || !obj.length) { return false; }
+ this.data.crrm.ct_nodes = false;
+ this.data.crrm.cp_nodes = obj;
+ this.__callback({ "obj" : obj });
+ },
+ paste : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj || !obj.length) { return false; }
+ var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes;
+ if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }
+ if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; }
+ if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }
+ this.__callback({ "obj" : obj, "nodes" : nodes });
+ }
+ }
+ });
+ // include the crr plugin by default
+ // $.jstree.defaults.plugins.push("crrm");
+})(jQuery);
+//*/
+
+/*
+ * jsTree themes plugin
+ * Handles loading and setting themes, as well as detecting path to themes, etc.
+ */
+(function ($) {
+ var themes_loaded = [];
+ // this variable stores the path to the themes folder - if left as false - it will be autodetected
+ $.jstree._themes = false;
+ $.jstree.plugin("themes", {
+ __init : function () {
+ this.get_container()
+ .bind("init.jstree", $.proxy(function () {
+ var s = this._get_settings().themes;
+ this.data.themes.dots = s.dots;
+ this.data.themes.icons = s.icons;
+ this.set_theme(s.theme, s.url);
+ }, this))
+ .bind("loaded.jstree", $.proxy(function () {
+ // bound here too, as simple HTML tree's won't honor dots & icons otherwise
+ if(!this.data.themes.dots) { this.hide_dots(); }
+ else { this.show_dots(); }
+ if(!this.data.themes.icons) { this.hide_icons(); }
+ else { this.show_icons(); }
+ }, this));
+ },
+ defaults : {
+ theme : "default",
+ url : false,
+ dots : true,
+ icons : true
+ },
+ _fn : {
+ set_theme : function (theme_name, theme_url) {
+ if(!theme_name) { return false; }
+ if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }
+ if($.inArray(theme_url, themes_loaded) == -1) {
+ $.vakata.css.add_sheet({ "url" : theme_url });
+ themes_loaded.push(theme_url);
+ }
+ if(this.data.themes.theme != theme_name) {
+ this.get_container().removeClass('jstree-' + this.data.themes.theme);
+ this.data.themes.theme = theme_name;
+ }
+ this.get_container().addClass('jstree-' + theme_name);
+ if(!this.data.themes.dots) { this.hide_dots(); }
+ else { this.show_dots(); }
+ if(!this.data.themes.icons) { this.hide_icons(); }
+ else { this.show_icons(); }
+ this.__callback();
+ },
+ get_theme : function () { return this.data.themes.theme; },
+
+ show_dots : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },
+ hide_dots : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },
+ toggle_dots : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
+
+ show_icons : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },
+ hide_icons : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },
+ toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }
+ }
+ });
+ // autodetect themes path
+ $(function () {
+ if($.jstree._themes === false) {
+ $("script").each(function () {
+ if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) {
+ $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/';
+ return false;
+ }
+ });
+ }
+ if($.jstree._themes === false) { $.jstree._themes = "themes/"; }
+ });
+ // include the themes plugin by default
+ $.jstree.defaults.plugins.push("themes");
+})(jQuery);
+//*/
+
+/*
+ * jsTree hotkeys plugin
+ * Enables keyboard navigation for all tree instances
+ * Depends on the jstree ui & jquery hotkeys plugins
+ */
+(function ($) {
+ var bound = [];
+ function exec(i, event) {
+ var f = $.jstree._focused(), tmp;
+ if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) {
+ tmp = f._get_settings().hotkeys[i];
+ if(tmp) { return tmp.call(f, event); }
+ }
+ }
+ $.jstree.plugin("hotkeys", {
+ __init : function () {
+ if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }
+ if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }
+ $.each(this._get_settings().hotkeys, function (i, v) {
+ if(v !== false && $.inArray(i, bound) == -1) {
+ $(document).bind("keydown", i, function (event) { return exec(i, event); });
+ bound.push(i);
+ }
+ });
+ this.get_container()
+ .bind("lock.jstree", $.proxy(function () {
+ if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; }
+ }, this))
+ .bind("unlock.jstree", $.proxy(function () {
+ if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; }
+ }, this));
+ this.enable_hotkeys();
+ },
+ defaults : {
+ "up" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_prev(o));
+ return false;
+ },
+ "ctrl+up" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_prev(o));
+ return false;
+ },
+ "shift+up" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_prev(o));
+ return false;
+ },
+ "down" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_next(o));
+ return false;
+ },
+ "ctrl+down" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_next(o));
+ return false;
+ },
+ "shift+down" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
+ this.hover_node(this._get_next(o));
+ return false;
+ },
+ "left" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o) {
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
+ else { this.hover_node(this._get_prev(o)); }
+ }
+ return false;
+ },
+ "ctrl+left" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o) {
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
+ else { this.hover_node(this._get_prev(o)); }
+ }
+ return false;
+ },
+ "shift+left" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o) {
+ if(o.hasClass("jstree-open")) { this.close_node(o); }
+ else { this.hover_node(this._get_prev(o)); }
+ }
+ return false;
+ },
+ "right" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o && o.length) {
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
+ else { this.hover_node(this._get_next(o)); }
+ }
+ return false;
+ },
+ "ctrl+right" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o && o.length) {
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
+ else { this.hover_node(this._get_next(o)); }
+ }
+ return false;
+ },
+ "shift+right" : function () {
+ var o = this.data.ui.hovered || this.data.ui.last_selected;
+ if(o && o.length) {
+ if(o.hasClass("jstree-closed")) { this.open_node(o); }
+ else { this.hover_node(this._get_next(o)); }
+ }
+ return false;
+ },
+ "space" : function () {
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); }
+ return false;
+ },
+ "ctrl+space" : function (event) {
+ event.type = "click";
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
+ return false;
+ },
+ "shift+space" : function (event) {
+ event.type = "click";
+ if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
+ return false;
+ },
+ "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },
+ "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }
+ },
+ _fn : {
+ enable_hotkeys : function () {
+ this.data.hotkeys.enabled = true;
+ },
+ disable_hotkeys : function () {
+ this.data.hotkeys.enabled = false;
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree JSON plugin
+ * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
+ */
+(function ($) {
+ $.jstree.plugin("json_data", {
+ __init : function() {
+ var s = this._get_settings().json_data;
+ if(s.progressive_unload) {
+ this.get_container().bind("after_close.jstree", function (e, data) {
+ data.rslt.obj.children("ul").remove();
+ });
+ }
+ },
+ defaults : {
+ // `data` can be a function:
+ // * accepts two arguments - node being loaded and a callback to pass the result to
+ // * will be executed in the current tree's scope & ajax won't be supported
+ data : false,
+ ajax : false,
+ correct_state : true,
+ progressive_render : false,
+ progressive_unload : false
+ },
+ _fn : {
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
+ _is_loaded : function (obj) {
+ var s = this._get_settings().json_data;
+ obj = this._get_node(obj);
+ return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0;
+ },
+ refresh : function (obj) {
+ obj = this._get_node(obj);
+ var s = this._get_settings().json_data;
+ if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) {
+ obj.removeData("jstree-children");
+ }
+ return this.__call_old();
+ },
+ load_node_json : function (obj, s_call, e_call) {
+ var s = this.get_settings().json_data, d,
+ error_func = function () {},
+ success_func = function () {};
+ obj = this._get_node(obj);
+
+ if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree-children")) {
+ d = this._parse_json(obj.data("jstree-children"), obj);
+ if(d) {
+ obj.append(d);
+ if(!s.progressive_unload) { obj.removeData("jstree-children"); }
+ }
+ this.clean_node(obj);
+ if(s_call) { s_call.call(this); }
+ return;
+ }
+
+ if(obj && obj !== -1) {
+ if(obj.data("jstree-is-loading")) { return; }
+ else { obj.data("jstree-is-loading",true); }
+ }
+ switch(!0) {
+ case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
+ // function option added here for easier model integration (also supporting async - see callback)
+ case ($.isFunction(s.data)):
+ s.data.call(this, obj, $.proxy(function (d) {
+ d = this._parse_json(d, obj);
+ if(!d) {
+ if(obj === -1 || !obj) {
+ if(s.correct_state) { this.get_container().children("ul").empty(); }
+ }
+ else {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) { this.correct_state(obj); }
+ }
+ if(e_call) { e_call.call(this); }
+ }
+ else {
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
+ else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
+ this.clean_node(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }, this));
+ break;
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
+ if(!obj || obj == -1) {
+ d = this._parse_json(s.data, obj);
+ if(d) {
+ this.get_container().children("ul").empty().append(d.children());
+ this.clean_node();
+ }
+ else {
+ if(s.correct_state) { this.get_container().children("ul").empty(); }
+ }
+ }
+ if(s_call) { s_call.call(this); }
+ break;
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
+ error_func = function (x, t, e) {
+ var ef = this.get_settings().json_data.ajax.error;
+ if(ef) { ef.call(this, x, t, e); }
+ if(obj != -1 && obj.length) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
+ }
+ else {
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
+ }
+ if(e_call) { e_call.call(this); }
+ };
+ success_func = function (d, t, x) {
+ var sf = this.get_settings().json_data.ajax.success;
+ if(sf) { d = sf.call(this,d,t,x) || d; }
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) {
+ return error_func.call(this, x, t, "");
+ }
+ d = this._parse_json(d, obj);
+ if(d) {
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
+ else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
+ this.clean_node(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ else {
+ if(obj === -1 || !obj) {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) {
+ this.correct_state(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }
+ };
+ s.ajax.context = this;
+ s.ajax.error = error_func;
+ s.ajax.success = success_func;
+ if(!s.ajax.dataType) { s.ajax.dataType = "json"; }
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
+ $.ajax(s.ajax);
+ break;
+ }
+ },
+ _parse_json : function (js, obj, is_callback) {
+ var d = false,
+ p = this._get_settings(),
+ s = p.json_data,
+ t = p.core.html_titles,
+ tmp, i, j, ul1, ul2;
+
+ if(!js) { return d; }
+ if(s.progressive_unload && obj && obj !== -1) {
+ obj.data("jstree-children", d);
+ }
+ if($.isArray(js)) {
+ d = $();
+ if(!js.length) { return false; }
+ for(i = 0, j = js.length; i < j; i++) {
+ tmp = this._parse_json(js[i], obj, true);
+ if(tmp.length) { d = d.add(tmp); }
+ }
+ }
+ else {
+ if(typeof js == "string") { js = { data : js }; }
+ if(!js.data && js.data !== "") { return d; }
+ d = $("<li />");
+ if(js.attr) { d.attr(js.attr); }
+ if(js.metadata) { d.data(js.metadata); }
+ if(js.state) { d.addClass("jstree-" + js.state); }
+ if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
+ $.each(js.data, function (i, m) {
+ tmp = $("<a />");
+ if($.isFunction(m)) { m = m.call(this, js); }
+ if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }
+ else {
+ if(!m.attr) { m.attr = {}; }
+ if(!m.attr.href) { m.attr.href = '#'; }
+ tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);
+ if(m.language) { tmp.addClass(m.language); }
+ }
+ tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
+ if(!m.icon && js.icon) { m.icon = js.icon; }
+ if(m.icon) {
+ if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
+ else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
+ }
+ d.append(tmp);
+ });
+ d.prepend("<ins class='jstree-icon'>&#160;</ins>");
+ if(js.children) {
+ if(s.progressive_render && js.state !== "open") {
+ d.addClass("jstree-closed").data("jstree-children", js.children);
+ }
+ else {
+ if(s.progressive_unload) { d.data("jstree-children", js.children); }
+ if($.isArray(js.children) && js.children.length) {
+ tmp = this._parse_json(js.children, obj, true);
+ if(tmp.length) {
+ ul2 = $("<ul />");
+ ul2.append(tmp);
+ d.append(ul2);
+ }
+ }
+ }
+ }
+ }
+ if(!is_callback) {
+ ul1 = $("<ul />");
+ ul1.append(d);
+ d = ul1;
+ }
+ return d;
+ },
+ get_json : function (obj, li_attr, a_attr, is_callback) {
+ var result = [],
+ s = this._get_settings(),
+ _this = this,
+ tmp1, tmp2, li, a, t, lang;
+ obj = this._get_node(obj);
+ if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
+ li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
+ if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }
+ a_attr = $.isArray(a_attr) ? a_attr : [ ];
+
+ obj.each(function () {
+ li = $(this);
+ tmp1 = { data : [] };
+ if(li_attr.length) { tmp1.attr = { }; }
+ $.each(li_attr, function (i, v) {
+ tmp2 = li.attr(v);
+ if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) {
+ tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
+ }
+ });
+ if(li.hasClass("jstree-open")) { tmp1.state = "open"; }
+ if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }
+ if(li.data()) { tmp1.metadata = li.data(); }
+ a = li.children("a");
+ a.each(function () {
+ t = $(this);
+ if(
+ a_attr.length ||
+ $.inArray("languages", s.plugins) !== -1 ||
+ t.children("ins").get(0).style.backgroundImage.length ||
+ (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)
+ ) {
+ lang = false;
+ if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
+ $.each(s.languages, function (l, lv) {
+ if(t.hasClass(lv)) {
+ lang = lv;
+ return false;
+ }
+ });
+ }
+ tmp2 = { attr : { }, title : _this.get_text(t, lang) };
+ $.each(a_attr, function (k, z) {
+ tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
+ });
+ if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
+ $.each(s.languages, function (k, z) {
+ if(t.hasClass(z)) { tmp2.language = z; return true; }
+ });
+ }
+ if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
+ tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
+ }
+ if(t.children("ins").get(0).style.backgroundImage.length) {
+ tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");
+ }
+ }
+ else {
+ tmp2 = _this.get_text(t);
+ }
+ if(a.length > 1) { tmp1.data.push(tmp2); }
+ else { tmp1.data = tmp2; }
+ });
+ li = li.find("> ul > li");
+ if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }
+ result.push(tmp1);
+ });
+ return result;
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree languages plugin
+ * Adds support for multiple language versions in one tree
+ * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time
+ * This is useful for maintaining the same structure in many languages (hence the name of the plugin)
+ */
+(function ($) {
+ $.jstree.plugin("languages", {
+ __init : function () { this._load_css(); },
+ defaults : [],
+ _fn : {
+ set_lang : function (i) {
+ var langs = this._get_settings().languages,
+ st = false,
+ selector = ".jstree-" + this.get_index() + ' a';
+ if(!$.isArray(langs) || langs.length === 0) { return false; }
+ if($.inArray(i,langs) == -1) {
+ if(!!langs[i]) { i = langs[i]; }
+ else { return false; }
+ }
+ if(i == this.data.languages.current_language) { return true; }
+ st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);
+ if(st !== false) { st.style.display = "none"; }
+ st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);
+ if(st !== false) { st.style.display = ""; }
+ this.data.languages.current_language = i;
+ this.__callback(i);
+ return true;
+ },
+ get_lang : function () {
+ return this.data.languages.current_language;
+ },
+ _get_string : function (key, lang) {
+ var langs = this._get_settings().languages,
+ s = this._get_settings().core.strings;
+ if($.isArray(langs) && langs.length) {
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
+ }
+ if(s[lang] && s[lang][key]) { return s[lang][key]; }
+ if(s[key]) { return s[key]; }
+ return key;
+ },
+ get_text : function (obj, lang) {
+ obj = this._get_node(obj) || this.data.ui.last_selected;
+ if(!obj.size()) { return false; }
+ var langs = this._get_settings().languages,
+ s = this._get_settings().core.html_titles;
+ if($.isArray(langs) && langs.length) {
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
+ obj = obj.children("a." + lang);
+ }
+ else { obj = obj.children("a:eq(0)"); }
+ if(s) {
+ obj = obj.clone();
+ obj.children("INS").remove();
+ return obj.html();
+ }
+ else {
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
+ return obj.nodeValue;
+ }
+ },
+ set_text : function (obj, val, lang) {
+ obj = this._get_node(obj) || this.data.ui.last_selected;
+ if(!obj.size()) { return false; }
+ var langs = this._get_settings().languages,
+ s = this._get_settings().core.html_titles,
+ tmp;
+ if($.isArray(langs) && langs.length) {
+ lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
+ obj = obj.children("a." + lang);
+ }
+ else { obj = obj.children("a:eq(0)"); }
+ if(s) {
+ tmp = obj.children("INS").clone();
+ obj.html(val).prepend(tmp);
+ this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
+ return true;
+ }
+ else {
+ obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
+ this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
+ return (obj.nodeValue = val);
+ }
+ },
+ _load_css : function () {
+ var langs = this._get_settings().languages,
+ str = "/* languages css */",
+ selector = ".jstree-" + this.get_index() + ' a',
+ ln;
+ if($.isArray(langs) && langs.length) {
+ this.data.languages.current_language = langs[0];
+ for(ln = 0; ln < langs.length; ln++) {
+ str += selector + "." + langs[ln] + " {";
+ if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }
+ str += " } ";
+ }
+ this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" });
+ }
+ },
+ create_node : function (obj, position, js, callback) {
+ var t = this.__call_old(true, obj, position, js, function (t) {
+ var langs = this._get_settings().languages,
+ a = t.children("a"),
+ ln;
+ if($.isArray(langs) && langs.length) {
+ for(ln = 0; ln < langs.length; ln++) {
+ if(!a.is("." + langs[ln])) {
+ t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));
+ }
+ }
+ a.not("." + langs.join(", .")).remove();
+ }
+ if(callback) { callback.call(this, t); }
+ });
+ return t;
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree cookies plugin
+ * Stores the currently opened/selected nodes in a cookie and then restores them
+ * Depends on the jquery.cookie plugin
+ */
+(function ($) {
+ $.jstree.plugin("cookies", {
+ __init : function () {
+ if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }
+
+ var s = this._get_settings().cookies,
+ tmp;
+ if(!!s.save_loaded) {
+ tmp = $.cookie(s.save_loaded);
+ if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); }
+ }
+ if(!!s.save_opened) {
+ tmp = $.cookie(s.save_opened);
+ if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }
+ }
+ if(!!s.save_selected) {
+ tmp = $.cookie(s.save_selected);
+ if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }
+ }
+ this.get_container()
+ .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {
+ this.get_container()
+ .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) {
+ if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }
+ }, this));
+ }, this));
+ },
+ defaults : {
+ save_loaded : "jstree_load",
+ save_opened : "jstree_open",
+ save_selected : "jstree_select",
+ auto_save : true,
+ cookie_options : {}
+ },
+ _fn : {
+ save_cookie : function (c) {
+ if(this.data.core.refreshing) { return; }
+ var s = this._get_settings().cookies;
+ if(!c) { // if called manually and not by event
+ if(s.save_loaded) {
+ this.save_loaded();
+ $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
+ }
+ if(s.save_opened) {
+ this.save_opened();
+ $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
+ }
+ if(s.save_selected && this.data.ui) {
+ this.save_selected();
+ $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
+ }
+ return;
+ }
+ switch(c) {
+ case "open_node":
+ case "close_node":
+ if(!!s.save_opened) {
+ this.save_opened();
+ $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
+ }
+ if(!!s.save_loaded) {
+ this.save_loaded();
+ $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
+ }
+ break;
+ case "select_node":
+ case "deselect_node":
+ if(!!s.save_selected && this.data.ui) {
+ this.save_selected();
+ $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
+ }
+ break;
+ }
+ }
+ }
+ });
+ // include cookies by default
+ // $.jstree.defaults.plugins.push("cookies");
+})(jQuery);
+//*/
+
+/*
+ * jsTree sort plugin
+ * Sorts items alphabetically (or using any other function)
+ */
+(function ($) {
+ $.jstree.plugin("sort", {
+ __init : function () {
+ this.get_container()
+ .bind("load_node.jstree", $.proxy(function (e, data) {
+ var obj = this._get_node(data.rslt.obj);
+ obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");
+ this.sort(obj);
+ }, this))
+ .bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) {
+ this.sort(data.rslt.obj.parent());
+ }, this))
+ .bind("move_node.jstree", $.proxy(function (e, data) {
+ var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;
+ this.sort(m.children("ul"));
+ }, this));
+ },
+ defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },
+ _fn : {
+ sort : function (obj) {
+ var s = this._get_settings().sort,
+ t = this;
+ obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));
+ obj.find("> li > ul").each(function() { t.sort($(this)); });
+ this.clean_node(obj);
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree DND plugin
+ * Drag and drop plugin for moving/copying nodes
+ */
+(function ($) {
+ var o = false,
+ r = false,
+ m = false,
+ ml = false,
+ sli = false,
+ sti = false,
+ dir1 = false,
+ dir2 = false,
+ last_pos = false;
+ $.vakata.dnd = {
+ is_down : false,
+ is_drag : false,
+ helper : false,
+ scroll_spd : 10,
+ init_x : 0,
+ init_y : 0,
+ threshold : 5,
+ helper_left : 5,
+ helper_top : 10,
+ user_data : {},
+
+ drag_start : function (e, data, html) {
+ if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }
+ try {
+ e.currentTarget.unselectable = "on";
+ e.currentTarget.onselectstart = function() { return false; };
+ if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
+ } catch(err) { }
+ $.vakata.dnd.init_x = e.pageX;
+ $.vakata.dnd.init_y = e.pageY;
+ $.vakata.dnd.user_data = data;
+ $.vakata.dnd.is_down = true;
+ $.vakata.dnd.helper = $("<div id='vakata-dragged' />").html(html); //.fadeTo(10,0.25);
+ $(document).bind("mousemove", $.vakata.dnd.drag);
+ $(document).bind("mouseup", $.vakata.dnd.drag_stop);
+ return false;
+ },
+ drag : function (e) {
+ if(!$.vakata.dnd.is_down) { return; }
+ if(!$.vakata.dnd.is_drag) {
+ if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) {
+ $.vakata.dnd.helper.appendTo("body");
+ $.vakata.dnd.is_drag = true;
+ $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
+ }
+ else { return; }
+ }
+
+ // maybe use a scrolling parent element instead of document?
+ if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
+ var d = $(document), t = d.scrollTop(), l = d.scrollLeft();
+ if(e.pageY - t < 20) {
+ if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
+ if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }
+ }
+ else {
+ if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
+ }
+ if($(window).height() - (e.pageY - t) < 20) {
+ if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
+ if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }
+ }
+ else {
+ if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
+ }
+
+ if(e.pageX - l < 20) {
+ if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
+ if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }
+ }
+ else {
+ if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
+ }
+ if($(window).width() - (e.pageX - l) < 20) {
+ if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
+ if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }
+ }
+ else {
+ if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
+ }
+ }
+
+ $.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" });
+ $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
+ },
+ drag_stop : function (e) {
+ if(sli) { clearInterval(sli); }
+ if(sti) { clearInterval(sti); }
+ $(document).unbind("mousemove", $.vakata.dnd.drag);
+ $(document).unbind("mouseup", $.vakata.dnd.drag_stop);
+ $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
+ $.vakata.dnd.helper.remove();
+ $.vakata.dnd.init_x = 0;
+ $.vakata.dnd.init_y = 0;
+ $.vakata.dnd.user_data = {};
+ $.vakata.dnd.is_down = false;
+ $.vakata.dnd.is_drag = false;
+ }
+ };
+ $(function() {
+ var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';
+ $.vakata.css.add_sheet({ str : css_string, title : "vakata" });
+ });
+
+ $.jstree.plugin("dnd", {
+ __init : function () {
+ this.data.dnd = {
+ active : false,
+ after : false,
+ inside : false,
+ before : false,
+ off : false,
+ prepared : false,
+ w : 0,
+ to1 : false,
+ to2 : false,
+ cof : false,
+ cw : false,
+ ch : false,
+ i1 : false,
+ i2 : false,
+ mto : false
+ };
+ this.get_container()
+ .bind("mouseenter.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ if(this.data.themes) {
+ m.attr("class", "jstree-" + this.data.themes.theme);
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
+ }
+ //if($(e.currentTarget).find("> ul > li").length === 0) {
+ if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
+ var tr = $.jstree._reference(e.target), dc;
+ if(tr.data.dnd.foreign) {
+ dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
+ if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
+ }
+ }
+ else {
+ tr.prepare_move(o, tr.get_container(), "last");
+ if(tr.check_move()) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
+ }
+ }
+ }
+ }
+ }, this))
+ .bind("mouseup.jstree", $.proxy(function (e) {
+ //if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
+ var tr = $.jstree._reference(e.currentTarget), dc;
+ if(tr.data.dnd.foreign) {
+ dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
+ if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
+ tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
+ }
+ }
+ else {
+ tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]);
+ }
+ }
+ }, this))
+ .bind("mouseleave.jstree", $.proxy(function (e) {
+ if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
+ return false;
+ }
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
+ if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
+ }
+ }
+ }, this))
+ .bind("mousemove.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ var cnt = this.get_container()[0];
+
+ // Horizontal scroll
+ if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
+ this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);
+ }
+ else if(e.pageX - 24 < this.data.dnd.cof.left) {
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
+ this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);
+ }
+ else {
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
+ }
+
+ // Vertical scroll
+ if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
+ this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);
+ }
+ else if(e.pageY - 24 < this.data.dnd.cof.top) {
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
+ this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);
+ }
+ else {
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
+ }
+
+ }
+ }, this))
+ .bind("scroll.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) {
+ m.hide();
+ ml.hide();
+ }
+ }, this))
+ .delegate("a", "mousedown.jstree", $.proxy(function (e) {
+ if(e.which === 1) {
+ this.start_drag(e.currentTarget, e);
+ return false;
+ }
+ }, this))
+ .delegate("a", "mouseenter.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ this.dnd_enter(e.currentTarget);
+ }
+ }, this))
+ .delegate("a", "mousemove.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ if(!r || !r.length || r.children("a")[0] !== e.currentTarget) {
+ this.dnd_enter(e.currentTarget);
+ }
+ if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }
+ this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;
+ if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }
+ this.dnd_show();
+ }
+ }, this))
+ .delegate("a", "mouseleave.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
+ return false;
+ }
+ if(m) { m.hide(); }
+ if(ml) { ml.hide(); }
+ /*
+ var ec = $(e.currentTarget).closest("li"),
+ er = $(e.relatedTarget).closest("li");
+ if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) {
+ if(m) { m.hide(); }
+ if(ml) { ml.hide(); }
+ }
+ */
+ this.data.dnd.mto = setTimeout(
+ (function (t) { return function () { t.dnd_leave(e); }; })(this),
+ 0);
+ }
+ }, this))
+ .delegate("a", "mouseup.jstree", $.proxy(function (e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
+ this.dnd_finish(e);
+ }
+ }, this));
+
+ $(document)
+ .bind("drag_stop.vakata", $.proxy(function () {
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
+ if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
+ if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
+ this.data.dnd.after = false;
+ this.data.dnd.before = false;
+ this.data.dnd.inside = false;
+ this.data.dnd.off = false;
+ this.data.dnd.prepared = false;
+ this.data.dnd.w = false;
+ this.data.dnd.to1 = false;
+ this.data.dnd.to2 = false;
+ this.data.dnd.i1 = false;
+ this.data.dnd.i2 = false;
+ this.data.dnd.active = false;
+ this.data.dnd.foreign = false;
+ if(m) { m.css({ "top" : "-2000px" }); }
+ if(ml) { ml.css({ "top" : "-2000px" }); }
+ }, this))
+ .bind("drag_start.vakata", $.proxy(function (e, data) {
+ if(data.data.jstree) {
+ var et = $(data.event.target);
+ if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {
+ this.dnd_enter(et);
+ }
+ }
+ }, this));
+ /*
+ .bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) {
+ if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) {
+ var h = $.vakata.dnd.helper.children("ins");
+ if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) {
+ h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)");
+ }
+ else {
+ h.parent().html(h.parent().html().replace(/ \(Copy\)$/, ""));
+ }
+ }
+ }, this)); */
+
+
+
+ var s = this._get_settings().dnd;
+ if(s.drag_target) {
+ $(document)
+ .delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) {
+ o = e.target;
+ $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );
+ if(this.data.themes) {
+ if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
+ }
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
+ var cnt = this.get_container();
+ this.data.dnd.cof = cnt.offset();
+ this.data.dnd.cw = parseInt(cnt.width(),10);
+ this.data.dnd.ch = parseInt(cnt.height(),10);
+ this.data.dnd.foreign = true;
+ e.preventDefault();
+ }, this));
+ }
+ if(s.drop_target) {
+ $(document)
+ .delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) {
+ if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
+ }
+ }, this))
+ .delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) {
+ if(this.data.dnd.active) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
+ }
+ }, this))
+ .delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) {
+ if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
+ this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e });
+ }
+ }, this));
+ }
+ },
+ defaults : {
+ copy_modifier : "ctrl",
+ check_timeout : 100,
+ open_timeout : 500,
+ drop_target : ".jstree-drop",
+ drop_check : function (data) { return true; },
+ drop_finish : $.noop,
+ drag_target : ".jstree-draggable",
+ drag_finish : $.noop,
+ drag_check : function (data) { return { after : false, before : false, inside : true }; }
+ },
+ _fn : {
+ dnd_prepare : function () {
+ if(!r || !r.length) { return; }
+ this.data.dnd.off = r.offset();
+ if(this._get_settings().core.rtl) {
+ this.data.dnd.off.right = this.data.dnd.off.left + r.width();
+ }
+ if(this.data.dnd.foreign) {
+ var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });
+ this.data.dnd.after = a.after;
+ this.data.dnd.before = a.before;
+ this.data.dnd.inside = a.inside;
+ this.data.dnd.prepared = true;
+ return this.dnd_show();
+ }
+ this.prepare_move(o, r, "before");
+ this.data.dnd.before = this.check_move();
+ this.prepare_move(o, r, "after");
+ this.data.dnd.after = this.check_move();
+ if(this._is_loaded(r)) {
+ this.prepare_move(o, r, "inside");
+ this.data.dnd.inside = this.check_move();
+ }
+ else {
+ this.data.dnd.inside = false;
+ }
+ this.data.dnd.prepared = true;
+ return this.dnd_show();
+ },
+ dnd_show : function () {
+ if(!this.data.dnd.prepared) { return; }
+ var o = ["before","inside","after"],
+ r = false,
+ rtl = this._get_settings().core.rtl,
+ pos;
+ if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }
+ else if(this.data.dnd.w <= this.data.core.li_height*2/3) {
+ o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];
+ }
+ else { o = ["after","inside","before"]; }
+ $.each(o, $.proxy(function (i, val) {
+ if(this.data.dnd[val]) {
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
+ r = val;
+ return false;
+ }
+ }, this));
+ if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }
+
+ pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);
+ switch(r) {
+ case "before":
+ m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();
+ if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); }
+ break;
+ case "after":
+ m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show();
+ if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); }
+ break;
+ case "inside":
+ m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();
+ if(ml) { ml.hide(); }
+ break;
+ default:
+ m.hide();
+ if(ml) { ml.hide(); }
+ break;
+ }
+ last_pos = r;
+ return r;
+ },
+ dnd_open : function () {
+ this.data.dnd.to2 = false;
+ this.open_node(r, $.proxy(this.dnd_prepare,this), true);
+ },
+ dnd_finish : function (e) {
+ if(this.data.dnd.foreign) {
+ if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {
+ this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos });
+ }
+ }
+ else {
+ this.dnd_prepare();
+ this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]);
+ }
+ o = false;
+ r = false;
+ m.hide();
+ if(ml) { ml.hide(); }
+ },
+ dnd_enter : function (obj) {
+ if(this.data.dnd.mto) {
+ clearTimeout(this.data.dnd.mto);
+ this.data.dnd.mto = false;
+ }
+ var s = this._get_settings().dnd;
+ this.data.dnd.prepared = false;
+ r = this._get_node(obj);
+ if(s.check_timeout) {
+ // do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
+ if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
+ this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout);
+ }
+ else {
+ this.dnd_prepare();
+ }
+ if(s.open_timeout) {
+ if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
+ if(r && r.length && r.hasClass("jstree-closed")) {
+ // if the node is closed - open it, then recalculate
+ this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);
+ }
+ }
+ else {
+ if(r && r.length && r.hasClass("jstree-closed")) {
+ this.dnd_open();
+ }
+ }
+ },
+ dnd_leave : function (e) {
+ this.data.dnd.after = false;
+ this.data.dnd.before = false;
+ this.data.dnd.inside = false;
+ $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
+ m.hide();
+ if(ml) { ml.hide(); }
+ if(r && r[0] === e.target.parentNode) {
+ if(this.data.dnd.to1) {
+ clearTimeout(this.data.dnd.to1);
+ this.data.dnd.to1 = false;
+ }
+ if(this.data.dnd.to2) {
+ clearTimeout(this.data.dnd.to2);
+ this.data.dnd.to2 = false;
+ }
+ }
+ },
+ start_drag : function (obj, e) {
+ o = this._get_node(obj);
+ if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }
+ var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o),
+ cnt = this.get_container();
+ if(!this._get_settings().core.html_titles) { dt = dt.replace(/</ig,"&lt;").replace(/>/ig,"&gt;"); }
+ $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + dt );
+ if(this.data.themes) {
+ if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
+ if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
+ $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
+ }
+ this.data.dnd.cof = cnt.offset();
+ this.data.dnd.cw = parseInt(cnt.width(),10);
+ this.data.dnd.ch = parseInt(cnt.height(),10);
+ this.data.dnd.active = true;
+ }
+ }
+ });
+ $(function() {
+ var css_string = '' +
+ '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' +
+ ' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +
+ '} ' +
+ '#vakata-dragged .jstree-ok { background:green; } ' +
+ '#vakata-dragged .jstree-invalid { background:red; } ' +
+ '#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' +
+ '#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' +
+ ' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' +
+ ' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +
+ '}' +
+ '';
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
+ m = $("<div />").attr({ id : "jstree-marker" }).hide().html("&raquo;")
+ .bind("mouseleave mouseenter", function (e) {
+ m.hide();
+ ml.hide();
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return false;
+ })
+ .appendTo("body");
+ ml = $("<div />").attr({ id : "jstree-marker-line" }).hide()
+ .bind("mouseup", function (e) {
+ if(r && r.length) {
+ r.children("a").trigger(e);
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return false;
+ }
+ })
+ .bind("mouseleave", function (e) {
+ var rt = $(e.relatedTarget);
+ if(rt.is(".jstree") || rt.closest(".jstree").length === 0) {
+ if(r && r.length) {
+ r.children("a").trigger(e);
+ m.hide();
+ ml.hide();
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return false;
+ }
+ }
+ })
+ .appendTo("body");
+ $(document).bind("drag_start.vakata", function (e, data) {
+ if(data.data.jstree) { m.show(); if(ml) { ml.show(); } }
+ });
+ $(document).bind("drag_stop.vakata", function (e, data) {
+ if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } }
+ });
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree checkbox plugin
+ * Inserts checkboxes in front of every node
+ * Depends on the ui plugin
+ * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
+ */
+(function ($) {
+ $.jstree.plugin("checkbox", {
+ __init : function () {
+ this.data.checkbox.noui = this._get_settings().checkbox.override_ui;
+ if(this.data.ui && this.data.checkbox.noui) {
+ this.select_node = this.deselect_node = this.deselect_all = $.noop;
+ this.get_selected = this.get_checked;
+ }
+
+ this.get_container()
+ .bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) {
+ this._prepare_checkboxes(data.rslt.obj);
+ }, this))
+ .bind("loaded.jstree", $.proxy(function (e) {
+ this._prepare_checkboxes();
+ }, this))
+ .delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) {
+ e.preventDefault();
+ if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
+ else { this.check_node(e.target); }
+ if(this.data.ui && this.data.checkbox.noui) {
+ this.save_selected();
+ if(this.data.cookies) { this.save_cookie("select_node"); }
+ }
+ else {
+ e.stopImmediatePropagation();
+ return false;
+ }
+ }, this));
+ },
+ defaults : {
+ override_ui : false,
+ two_state : false,
+ real_checkboxes : false,
+ checked_parent_open : true,
+ real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; }
+ },
+ __destroy : function () {
+ this.get_container()
+ .find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end()
+ .find("ins.jstree-checkbox").remove();
+ },
+ _fn : {
+ _checkbox_notify : function (n, data) {
+ if(data.checked) {
+ this.check_node(n, false);
+ }
+ },
+ _prepare_checkboxes : function (obj) {
+ obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
+ if(obj === false) { return; } // added for removing root nodes
+ var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names;
+ obj.each(function () {
+ t = $(this);
+ c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked";
+ t.find("li").andSelf().each(function () {
+ var $t = $(this), nm;
+ $t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c );
+ if(rc) {
+ if(!$t.children(":checkbox").length) {
+ nm = rcn.call(_this, $t);
+ $t.prepend("<input type='checkbox' class='jstree-real-checkbox' id='" + nm[0] + "' name='" + nm[0] + "' value='" + nm[1] + "' />");
+ }
+ else {
+ $t.children(":checkbox").addClass("jstree-real-checkbox");
+ }
+ if(c === "jstree-checked") {
+ $t.children(":checkbox").attr("checked","checked");
+ }
+ }
+ if(c === "jstree-checked" && !ts) {
+ $t.find("li").addClass("jstree-checked");
+ }
+ });
+ });
+ if(!ts) {
+ if(obj.length === 1 && obj.is("li")) { this._repair_state(obj); }
+ if(obj.is("li")) { obj.each(function () { _this._repair_state(this); }); }
+ else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }
+ obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); });
+ }
+ },
+ change_state : function (obj, state) {
+ obj = this._get_node(obj);
+ var coll = false, rc = this._get_settings().checkbox.real_checkboxes;
+ if(!obj || obj === -1) { return false; }
+ state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
+ if(this._get_settings().checkbox.two_state) {
+ if(state) {
+ obj.removeClass("jstree-checked").addClass("jstree-unchecked");
+ if(rc) { obj.children(":checkbox").removeAttr("checked"); }
+ }
+ else {
+ obj.removeClass("jstree-unchecked").addClass("jstree-checked");
+ if(rc) { obj.children(":checkbox").attr("checked","checked"); }
+ }
+ }
+ else {
+ if(state) {
+ coll = obj.find("li").andSelf();
+ if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; }
+ coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
+ if(rc) { coll.children(":checkbox").removeAttr("checked"); }
+ }
+ else {
+ coll = obj.find("li").andSelf();
+ if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; }
+ coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
+ if(rc) { coll.children(":checkbox").attr("checked","checked"); }
+ if(this.data.ui) { this.data.ui.last_selected = obj; }
+ this.data.checkbox.last_selected = obj;
+ }
+ obj.parentsUntil(".jstree", "li").each(function () {
+ var $this = $(this);
+ if(state) {
+ if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) {
+ $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
+ if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
+ return false;
+ }
+ else {
+ $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
+ if(rc) { $this.children(":checkbox").removeAttr("checked"); }
+ }
+ }
+ else {
+ if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) {
+ $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
+ if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
+ return false;
+ }
+ else {
+ $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
+ if(rc) { $this.children(":checkbox").attr("checked","checked"); }
+ }
+ }
+ });
+ }
+ if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); }
+ this.__callback(obj);
+ return true;
+ },
+ check_node : function (obj) {
+ if(this.change_state(obj, false)) {
+ obj = this._get_node(obj);
+ if(this._get_settings().checkbox.checked_parent_open) {
+ var t = this;
+ obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
+ }
+ this.__callback({ "obj" : obj });
+ }
+ },
+ uncheck_node : function (obj) {
+ if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); }
+ },
+ check_all : function () {
+ var _this = this,
+ coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
+ coll.each(function () {
+ _this.change_state(this, false);
+ });
+ this.__callback();
+ },
+ uncheck_all : function () {
+ var _this = this,
+ coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
+ coll.each(function () {
+ _this.change_state(this, true);
+ });
+ this.__callback();
+ },
+
+ is_checked : function(obj) {
+ obj = this._get_node(obj);
+ return obj.length ? obj.is(".jstree-checked") : false;
+ },
+ get_checked : function (obj, get_all) {
+ obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
+ return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
+ },
+ get_unchecked : function (obj, get_all) {
+ obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
+ return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
+ },
+
+ show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
+ hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },
+
+ _repair_state : function (obj) {
+ obj = this._get_node(obj);
+ if(!obj.length) { return; }
+ var rc = this._get_settings().checkbox.real_checkboxes,
+ a = obj.find("> ul > .jstree-checked").length,
+ b = obj.find("> ul > .jstree-undetermined").length,
+ c = obj.find("> ul > li").length;
+ if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } }
+ else if(a === 0 && b === 0) { this.change_state(obj, true); }
+ else if(a === c) { this.change_state(obj, false); }
+ else {
+ obj.parentsUntil(".jstree","li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
+ if(rc) { obj.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
+ }
+ },
+ reselect : function () {
+ if(this.data.ui && this.data.checkbox.noui) {
+ var _this = this,
+ s = this.data.ui.to_select;
+ s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
+ this.deselect_all();
+ $.each(s, function (i, val) { _this.check_node(val); });
+ this.__callback();
+ }
+ else {
+ this.__call_old();
+ }
+ },
+ save_loaded : function () {
+ var _this = this;
+ this.data.core.to_load = [];
+ this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () {
+ if(this.id) { _this.data.core.to_load.push("#" + this.id); }
+ });
+ }
+ }
+ });
+ $(function() {
+ var css_string = '.jstree .jstree-real-checkbox { display:none; } ';
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree XML plugin
+ * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
+ */
+(function ($) {
+ $.vakata.xslt = function (xml, xsl, callback) {
+ var rs = "", xm, xs, processor, support;
+ // TODO: IE9 no XSLTProcessor, no document.recalc
+ if(document.recalc) {
+ xm = document.createElement('xml');
+ xs = document.createElement('xml');
+ xm.innerHTML = xml;
+ xs.innerHTML = xsl;
+ $("body").append(xm).append(xs);
+ setTimeout( (function (xm, xs, callback) {
+ return function () {
+ callback.call(null, xm.transformNode(xs.XMLDocument));
+ setTimeout( (function (xm, xs) { return function () { $(xm).remove(); $(xs).remove(); }; })(xm, xs), 200);
+ };
+ })(xm, xs, callback), 100);
+ return true;
+ }
+ if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor === "undefined") {
+ xml = new DOMParser().parseFromString(xml, "text/xml");
+ xsl = new DOMParser().parseFromString(xsl, "text/xml");
+ // alert(xml.transformNode());
+ // callback.call(null, new XMLSerializer().serializeToString(rs));
+
+ }
+ if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {
+ processor = new XSLTProcessor();
+ support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;
+ if(!support) { return false; }
+ xml = new DOMParser().parseFromString(xml, "text/xml");
+ xsl = new DOMParser().parseFromString(xsl, "text/xml");
+ if($.isFunction(processor.transformDocument)) {
+ rs = document.implementation.createDocument("", "", null);
+ processor.transformDocument(xml, xsl, rs, null);
+ callback.call(null, new XMLSerializer().serializeToString(rs));
+ return true;
+ }
+ else {
+ processor.importStylesheet(xsl);
+ rs = processor.transformToFragment(xml, document);
+ callback.call(null, $("<div />").append(rs).html());
+ return true;
+ }
+ }
+ return false;
+ };
+ var xsl = {
+ 'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
+ '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' +
+ '<xsl:template match="/">' +
+ ' <xsl:call-template name="nodes">' +
+ ' <xsl:with-param name="node" select="/root" />' +
+ ' </xsl:call-template>' +
+ '</xsl:template>' +
+ '<xsl:template name="nodes">' +
+ ' <xsl:param name="node" />' +
+ ' <ul>' +
+ ' <xsl:for-each select="$node/item">' +
+ ' <xsl:variable name="children" select="count(./item) &gt; 0" />' +
+ ' <li>' +
+ ' <xsl:attribute name="class">' +
+ ' <xsl:if test="position() = last()">jstree-last </xsl:if>' +
+ ' <xsl:choose>' +
+ ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
+ ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
+ ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
+ ' </xsl:choose>' +
+ ' <xsl:value-of select="@class" />' +
+ ' </xsl:attribute>' +
+ ' <xsl:for-each select="@*">' +
+ ' <xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' +
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
+ ' </xsl:if>' +
+ ' </xsl:for-each>' +
+ ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
+ ' <xsl:for-each select="content/name">' +
+ ' <a>' +
+ ' <xsl:attribute name="href">' +
+ ' <xsl:choose>' +
+ ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
+ ' <xsl:otherwise>#</xsl:otherwise>' +
+ ' </xsl:choose>' +
+ ' </xsl:attribute>' +
+ ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
+ ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
+ ' <xsl:for-each select="@*">' +
+ ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
+ ' </xsl:if>' +
+ ' </xsl:for-each>' +
+ ' <ins>' +
+ ' <xsl:attribute name="class">jstree-icon ' +
+ ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
+ ' </xsl:attribute>' +
+ ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
+ ' <xsl:text>&#xa0;</xsl:text>' +
+ ' </ins>' +
+ ' <xsl:copy-of select="./child::node()" />' +
+ ' </a>' +
+ ' </xsl:for-each>' +
+ ' <xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' +
+ ' </li>' +
+ ' </xsl:for-each>' +
+ ' </ul>' +
+ '</xsl:template>' +
+ '</xsl:stylesheet>',
+
+ 'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
+ '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
+ '<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' +
+ '<xsl:template match="/">' +
+ ' <ul>' +
+ ' <xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
+ ' <xsl:call-template name="nodes">' +
+ ' <xsl:with-param name="node" select="." />' +
+ ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
+ ' </xsl:call-template>' +
+ ' </xsl:for-each>' +
+ ' </ul>' +
+ '</xsl:template>' +
+ '<xsl:template name="nodes">' +
+ ' <xsl:param name="node" />' +
+ ' <xsl:param name="is_last" />' +
+ ' <xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' +
+ ' <li>' +
+ ' <xsl:attribute name="class">' +
+ ' <xsl:if test="$is_last = true()">jstree-last </xsl:if>' +
+ ' <xsl:choose>' +
+ ' <xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
+ ' <xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
+ ' <xsl:otherwise>jstree-leaf </xsl:otherwise>' +
+ ' </xsl:choose>' +
+ ' <xsl:value-of select="@class" />' +
+ ' </xsl:attribute>' +
+ ' <xsl:for-each select="@*">' +
+ ' <xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' +
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
+ ' </xsl:if>' +
+ ' </xsl:for-each>' +
+ ' <ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
+ ' <xsl:for-each select="content/name">' +
+ ' <a>' +
+ ' <xsl:attribute name="href">' +
+ ' <xsl:choose>' +
+ ' <xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
+ ' <xsl:otherwise>#</xsl:otherwise>' +
+ ' </xsl:choose>' +
+ ' </xsl:attribute>' +
+ ' <xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
+ ' <xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
+ ' <xsl:for-each select="@*">' +
+ ' <xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
+ ' <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
+ ' </xsl:if>' +
+ ' </xsl:for-each>' +
+ ' <ins>' +
+ ' <xsl:attribute name="class">jstree-icon ' +
+ ' <xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
+ ' </xsl:attribute>' +
+ ' <xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
+ ' <xsl:text>&#xa0;</xsl:text>' +
+ ' </ins>' +
+ ' <xsl:copy-of select="./child::node()" />' +
+ ' </a>' +
+ ' </xsl:for-each>' +
+ ' <xsl:if test="$children">' +
+ ' <ul>' +
+ ' <xsl:for-each select="//item[@parent_id=$node/attribute::id]">' +
+ ' <xsl:call-template name="nodes">' +
+ ' <xsl:with-param name="node" select="." />' +
+ ' <xsl:with-param name="is_last" select="number(position() = last())" />' +
+ ' </xsl:call-template>' +
+ ' </xsl:for-each>' +
+ ' </ul>' +
+ ' </xsl:if>' +
+ ' </li>' +
+ '</xsl:template>' +
+ '</xsl:stylesheet>'
+ },
+ escape_xml = function(string) {
+ return string
+ .toString()
+ .replace(/&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/"/g, '&quot;')
+ .replace(/'/g, '&apos;');
+ };
+ $.jstree.plugin("xml_data", {
+ defaults : {
+ data : false,
+ ajax : false,
+ xsl : "flat",
+ clean_node : false,
+ correct_state : true,
+ get_skip_empty : false,
+ get_include_preamble : true
+ },
+ _fn : {
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
+ _is_loaded : function (obj) {
+ var s = this._get_settings().xml_data;
+ obj = this._get_node(obj);
+ return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
+ },
+ load_node_xml : function (obj, s_call, e_call) {
+ var s = this.get_settings().xml_data,
+ error_func = function () {},
+ success_func = function () {};
+
+ obj = this._get_node(obj);
+ if(obj && obj !== -1) {
+ if(obj.data("jstree-is-loading")) { return; }
+ else { obj.data("jstree-is-loading",true); }
+ }
+ switch(!0) {
+ case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
+ case ($.isFunction(s.data)):
+ s.data.call(this, obj, $.proxy(function (d) {
+ this.parse_xml(d, $.proxy(function (d) {
+ if(d) {
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
+ if(d.length > 10) {
+ d = $(d);
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
+ if(s.clean_node) { this.clean_node(obj); }
+ if(s_call) { s_call.call(this); }
+ }
+ else {
+ if(obj && obj !== -1) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) {
+ this.correct_state(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }
+ }
+ }, this));
+ }, this));
+ break;
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
+ if(!obj || obj == -1) {
+ this.parse_xml(s.data, $.proxy(function (d) {
+ if(d) {
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
+ if(d.length > 10) {
+ d = $(d);
+ this.get_container().children("ul").empty().append(d.children());
+ if(s.clean_node) { this.clean_node(obj); }
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }, this));
+ }
+ break;
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
+ error_func = function (x, t, e) {
+ var ef = this.get_settings().xml_data.ajax.error;
+ if(ef) { ef.call(this, x, t, e); }
+ if(obj !== -1 && obj.length) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
+ }
+ else {
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
+ }
+ if(e_call) { e_call.call(this); }
+ };
+ success_func = function (d, t, x) {
+ d = x.responseText;
+ var sf = this.get_settings().xml_data.ajax.success;
+ if(sf) { d = sf.call(this,d,t,x) || d; }
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
+ return error_func.call(this, x, t, "");
+ }
+ this.parse_xml(d, $.proxy(function (d) {
+ if(d) {
+ d = d.replace(/ ?xmlns="[^"]*"/ig, "");
+ if(d.length > 10) {
+ d = $(d);
+ if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
+ if(s.clean_node) { this.clean_node(obj); }
+ if(s_call) { s_call.call(this); }
+ }
+ else {
+ if(obj && obj !== -1) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) {
+ this.correct_state(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }
+ }
+ }, this));
+ };
+ s.ajax.context = this;
+ s.ajax.error = error_func;
+ s.ajax.success = success_func;
+ if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
+ $.ajax(s.ajax);
+ break;
+ }
+ },
+ parse_xml : function (xml, callback) {
+ var s = this._get_settings().xml_data;
+ $.vakata.xslt(xml, xsl[s.xsl], callback);
+ },
+ get_xml : function (tp, obj, li_attr, a_attr, is_callback) {
+ var result = "",
+ s = this._get_settings(),
+ _this = this,
+ tmp1, tmp2, li, a, lang;
+ if(!tp) { tp = "flat"; }
+ if(!is_callback) { is_callback = 0; }
+ obj = this._get_node(obj);
+ if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
+ li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
+ if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }
+
+ a_attr = $.isArray(a_attr) ? a_attr : [ ];
+
+ if(!is_callback) {
+ if(s.xml_data.get_include_preamble) {
+ result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>';
+ }
+ result += "<root>";
+ }
+ obj.each(function () {
+ result += "<item";
+ li = $(this);
+ $.each(li_attr, function (i, v) {
+ var t = li.attr(v);
+ if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
+ result += " " + v + "=\"" + escape_xml((" " + (t || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
+ }
+ });
+ if(li.hasClass("jstree-open")) { result += " state=\"open\""; }
+ if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }
+ if(tp === "flat") { result += " parent_id=\"" + escape_xml(is_callback) + "\""; }
+ result += ">";
+ result += "<content>";
+ a = li.children("a");
+ a.each(function () {
+ tmp1 = $(this);
+ lang = false;
+ result += "<name";
+ if($.inArray("languages", s.plugins) !== -1) {
+ $.each(s.languages, function (k, z) {
+ if(tmp1.hasClass(z)) { result += " lang=\"" + escape_xml(z) + "\""; lang = z; return false; }
+ });
+ }
+ if(a_attr.length) {
+ $.each(a_attr, function (k, z) {
+ var t = tmp1.attr(z);
+ if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
+ result += " " + z + "=\"" + escape_xml((" " + t || "").replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
+ }
+ });
+ }
+ if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
+ result += ' icon="' + escape_xml(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + '"';
+ }
+ if(tmp1.children("ins").get(0).style.backgroundImage.length) {
+ result += ' icon="' + escape_xml(tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","").replace(/'/ig,"").replace(/"/ig,"")) + '"';
+ }
+ result += ">";
+ result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";
+ result += "</name>";
+ });
+ result += "</content>";
+ tmp2 = li[0].id || true;
+ li = li.find("> ul > li");
+ if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }
+ else { tmp2 = ""; }
+ if(tp == "nest") { result += tmp2; }
+ result += "</item>";
+ if(tp == "flat") { result += tmp2; }
+ });
+ if(!is_callback) { result += "</root>"; }
+ return result;
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree search plugin
+ * Enables both sync and async search on the tree
+ * DOES NOT WORK WITH JSON PROGRESSIVE RENDER
+ */
+(function ($) {
+ $.expr[':'].jstree_contains = function(a,i,m){
+ return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
+ };
+ $.expr[':'].jstree_title_contains = function(a,i,m) {
+ return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
+ };
+ $.jstree.plugin("search", {
+ __init : function () {
+ this.data.search.str = "";
+ this.data.search.result = $();
+ if(this._get_settings().search.show_only_matches) {
+ this.get_container()
+ .bind("search.jstree", function (e, data) {
+ $(this).children("ul").find("li").hide().removeClass("jstree-last");
+ data.rslt.nodes.parentsUntil(".jstree").andSelf().show()
+ .filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); });
+ })
+ .bind("clear_search.jstree", function () {
+ $(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1);
+ });
+ }
+ },
+ defaults : {
+ ajax : false,
+ search_method : "jstree_contains", // for case insensitive - jstree_contains
+ show_only_matches : false
+ },
+ _fn : {
+ search : function (str, skip_async) {
+ if($.trim(str) === "") { this.clear_search(); return; }
+ var s = this.get_settings().search,
+ t = this,
+ error_func = function () { },
+ success_func = function () { };
+ this.data.search.str = str;
+
+ if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) {
+ this.search.supress_callback = true;
+ error_func = function () { };
+ success_func = function (d, t, x) {
+ var sf = this.get_settings().search.ajax.success;
+ if(sf) { d = sf.call(this,d,t,x) || d; }
+ this.data.search.to_open = d;
+ this._search_open();
+ };
+ s.ajax.context = this;
+ s.ajax.error = error_func;
+ s.ajax.success = success_func;
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }
+ if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }
+ if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }
+ $.ajax(s.ajax);
+ return;
+ }
+ if(this.data.search.result.length) { this.clear_search(); }
+ this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")");
+ this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () {
+ t.open_node(this, false, true);
+ });
+ this.__callback({ nodes : this.data.search.result, str : str });
+ },
+ clear_search : function (str) {
+ this.data.search.result.removeClass("jstree-search");
+ this.__callback(this.data.search.result);
+ this.data.search.result = $();
+ },
+ _search_open : function (is_callback) {
+ var _this = this,
+ done = true,
+ current = [],
+ remaining = [];
+ if(this.data.search.to_open.length) {
+ $.each(this.data.search.to_open, function (i, val) {
+ if(val == "#") { return true; }
+ if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
+ else { remaining.push(val); }
+ });
+ if(current.length) {
+ this.data.search.to_open = remaining;
+ $.each(current, function (i, val) {
+ _this.open_node(val, function () { _this._search_open(true); });
+ });
+ done = false;
+ }
+ }
+ if(done) { this.search(this.data.search.str, true); }
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree contextmenu plugin
+ */
+(function ($) {
+ $.vakata.context = {
+ hide_on_mouseleave : false,
+
+ cnt : $("<div id='vakata-contextmenu' />"),
+ vis : false,
+ tgt : false,
+ par : false,
+ func : false,
+ data : false,
+ rtl : false,
+ show : function (s, t, x, y, d, p, rtl) {
+ $.vakata.context.rtl = !!rtl;
+ var html = $.vakata.context.parse(s), h, w;
+ if(!html) { return; }
+ $.vakata.context.vis = true;
+ $.vakata.context.tgt = t;
+ $.vakata.context.par = p || t || null;
+ $.vakata.context.data = d || null;
+ $.vakata.context.cnt
+ .html(html)
+ .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });
+
+ if($.vakata.context.hide_on_mouseleave) {
+ $.vakata.context.cnt
+ .one("mouseleave", function(e) { $.vakata.context.hide(); });
+ }
+
+ h = $.vakata.context.cnt.height();
+ w = $.vakata.context.cnt.width();
+ if(x + w > $(document).width()) {
+ x = $(document).width() - (w + 5);
+ $.vakata.context.cnt.find("li > ul").addClass("right");
+ }
+ if(y + h > $(document).height()) {
+ y = y - (h + t[0].offsetHeight);
+ $.vakata.context.cnt.find("li > ul").addClass("bottom");
+ }
+
+ $.vakata.context.cnt
+ .css({ "left" : x, "top" : y })
+ .find("li:has(ul)")
+ .bind("mouseenter", function (e) {
+ var w = $(document).width(),
+ h = $(document).height(),
+ ul = $(this).children("ul").show();
+ if(w !== $(document).width()) { ul.toggleClass("right"); }
+ if(h !== $(document).height()) { ul.toggleClass("bottom"); }
+ })
+ .bind("mouseleave", function (e) {
+ $(this).children("ul").hide();
+ })
+ .end()
+ .css({ "visibility" : "visible" })
+ .show();
+ $(document).triggerHandler("context_show.vakata");
+ },
+ hide : function () {
+ $.vakata.context.vis = false;
+ $.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" });
+ $(document).triggerHandler("context_hide.vakata");
+ },
+ parse : function (s, is_callback) {
+ if(!s) { return false; }
+ var str = "",
+ tmp = false,
+ was_sep = true;
+ if(!is_callback) { $.vakata.context.func = {}; }
+ str += "<ul>";
+ $.each(s, function (i, val) {
+ if(!val) { return true; }
+ $.vakata.context.func[i] = val.action;
+ if(!was_sep && val.separator_before) {
+ str += "<li class='vakata-separator vakata-separator-before'></li>";
+ }
+ was_sep = false;
+ str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
+ if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }
+ if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }
+ str += ">&#160;</ins><a href='#' rel='" + i + "'>";
+ if(val.submenu) {
+ str += "<span style='float:" + ($.vakata.context.rtl ? "left" : "right") + ";'>&raquo;</span>";
+ }
+ str += val.label + "</a>";
+ if(val.submenu) {
+ tmp = $.vakata.context.parse(val.submenu, true);
+ if(tmp) { str += tmp; }
+ }
+ str += "</li>";
+ if(val.separator_after) {
+ str += "<li class='vakata-separator vakata-separator-after'></li>";
+ was_sep = true;
+ }
+ });
+ str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");
+ str += "</ul>";
+ $(document).triggerHandler("context_parse.vakata");
+ return str.length > 10 ? str : false;
+ },
+ exec : function (i) {
+ if($.isFunction($.vakata.context.func[i])) {
+ // if is string - eval and call it!
+ $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);
+ return true;
+ }
+ else { return false; }
+ }
+ };
+ $(function () {
+ var css_string = '' +
+ '#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' +
+ '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' +
+ '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' +
+ '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' +
+ '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' +
+ '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' +
+ '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' +
+ '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' +
+ '#vakata-contextmenu .right { right:100%; left:auto; } ' +
+ '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' +
+ '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';
+ $.vakata.css.add_sheet({ str : css_string, title : "vakata" });
+ $.vakata.context.cnt
+ .delegate("a","click", function (e) { e.preventDefault(); })
+ .delegate("a","mouseup", function (e) {
+ if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {
+ $.vakata.context.hide();
+ }
+ else { $(this).blur(); }
+ })
+ .delegate("a","mouseover", function () {
+ $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");
+ })
+ .appendTo("body");
+ $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });
+ if(typeof $.hotkeys !== "undefined") {
+ $(document)
+ .bind("keydown", "up", function (e) {
+ if($.vakata.context.vis) {
+ var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();
+ if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }
+ o.addClass("vakata-hover");
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+ })
+ .bind("keydown", "down", function (e) {
+ if($.vakata.context.vis) {
+ var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();
+ if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }
+ o.addClass("vakata-hover");
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+ })
+ .bind("keydown", "right", function (e) {
+ if($.vakata.context.vis) {
+ $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+ })
+ .bind("keydown", "left", function (e) {
+ if($.vakata.context.vis) {
+ $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+ })
+ .bind("keydown", "esc", function (e) {
+ $.vakata.context.hide();
+ e.preventDefault();
+ })
+ .bind("keydown", "space", function (e) {
+ $.vakata.context.cnt.find(".vakata-hover").last().children("a").click();
+ e.preventDefault();
+ });
+ }
+ });
+
+ $.jstree.plugin("contextmenu", {
+ __init : function () {
+ this.get_container()
+ .delegate("a", "contextmenu.jstree", $.proxy(function (e) {
+ e.preventDefault();
+ if(!$(e.currentTarget).hasClass("jstree-loading")) {
+ this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);
+ }
+ }, this))
+ .delegate("a", "click.jstree", $.proxy(function (e) {
+ if(this.data.contextmenu) {
+ $.vakata.context.hide();
+ }
+ }, this))
+ .bind("destroy.jstree", $.proxy(function () {
+ // TODO: move this to descruct method
+ if(this.data.contextmenu) {
+ $.vakata.context.hide();
+ }
+ }, this));
+ $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));
+ },
+ defaults : {
+ select_node : false, // requires UI plugin
+ show_at_node : true,
+ items : { // Could be a function that should return an object like this one
+ "create" : {
+ "separator_before" : false,
+ "separator_after" : true,
+ "label" : "Create",
+ "action" : function (obj) { this.create(obj); }
+ },
+ "rename" : {
+ "separator_before" : false,
+ "separator_after" : false,
+ "label" : "Rename",
+ "action" : function (obj) { this.rename(obj); }
+ },
+ "remove" : {
+ "separator_before" : false,
+ "icon" : false,
+ "separator_after" : false,
+ "label" : "Delete",
+ "action" : function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } }
+ },
+ "ccp" : {
+ "separator_before" : true,
+ "icon" : false,
+ "separator_after" : false,
+ "label" : "Edit",
+ "action" : false,
+ "submenu" : {
+ "cut" : {
+ "separator_before" : false,
+ "separator_after" : false,
+ "label" : "Cut",
+ "action" : function (obj) { this.cut(obj); }
+ },
+ "copy" : {
+ "separator_before" : false,
+ "icon" : false,
+ "separator_after" : false,
+ "label" : "Copy",
+ "action" : function (obj) { this.copy(obj); }
+ },
+ "paste" : {
+ "separator_before" : false,
+ "icon" : false,
+ "separator_after" : false,
+ "label" : "Paste",
+ "action" : function (obj) { this.paste(obj); }
+ }
+ }
+ }
+ }
+ },
+ _fn : {
+ show_contextmenu : function (obj, x, y) {
+ obj = this._get_node(obj);
+ var s = this.get_settings().contextmenu,
+ a = obj.children("a:visible:eq(0)"),
+ o = false,
+ i = false;
+ if(s.select_node && this.data.ui && !this.is_selected(obj)) {
+ this.deselect_all();
+ this.select_node(obj, true);
+ }
+ if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {
+ o = a.offset();
+ x = o.left;
+ y = o.top + this.data.core.li_height;
+ }
+ i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items;
+ if($.isFunction(i)) { i = i.call(this, obj); }
+ this.data.contextmenu = true;
+ $.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl);
+ if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree types plugin
+ * Adds support types of nodes
+ * You can set an attribute on each li node, that represents its type.
+ * According to the type setting the node may get custom icon/validation rules
+ */
+(function ($) {
+ $.jstree.plugin("types", {
+ __init : function () {
+ var s = this._get_settings().types;
+ this.data.types.attach_to = [];
+ this.get_container()
+ .bind("init.jstree", $.proxy(function () {
+ var types = s.types,
+ attr = s.type_attr,
+ icons_css = "",
+ _this = this;
+
+ $.each(types, function (i, tp) {
+ $.each(tp, function (k, v) {
+ if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }
+ });
+ if(!tp.icon) { return true; }
+ if( tp.icon.image || tp.icon.position) {
+ if(i == "default") { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }
+ else { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; }
+ if(tp.icon.image) { icons_css += ' background-image:url(' + tp.icon.image + '); '; }
+ if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }
+ else { icons_css += ' background-position:0 0; '; }
+ icons_css += '} ';
+ }
+ });
+ if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); }
+ }, this))
+ .bind("before.jstree", $.proxy(function (e, data) {
+ var s, t,
+ o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false,
+ d = o && o !== -1 && o.length ? o.data("jstree") : false;
+ if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; }
+ if($.inArray(data.func, this.data.types.attach_to) !== -1) {
+ if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; }
+ s = this._get_settings().types.types;
+ t = this._get_type(data.args[0]);
+ if(
+ (
+ (s[t] && typeof s[t][data.func] !== "undefined") ||
+ (s["default"] && typeof s["default"][data.func] !== "undefined")
+ ) && this._check(data.func, data.args[0]) === false
+ ) {
+ e.stopImmediatePropagation();
+ return false;
+ }
+ }
+ }, this));
+ if(is_ie6) {
+ this.get_container()
+ .bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) {
+ var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(),
+ c = false,
+ s = this._get_settings().types;
+ $.each(s.types, function (i, tp) {
+ if(tp.icon && (tp.icon.image || tp.icon.position)) {
+ c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon");
+ if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); }
+ c.css("backgroundPosition", tp.icon.position || "0 0");
+ }
+ });
+ }, this));
+ }
+ },
+ defaults : {
+ // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
+ max_children : -1,
+ // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
+ max_depth : -1,
+ // defines valid node types for the root nodes
+ valid_children : "all",
+
+ // whether to use $.data
+ use_data : false,
+ // where is the type stores (the rel attribute of the LI element)
+ type_attr : "rel",
+ // a list of types
+ types : {
+ // the default type
+ "default" : {
+ "max_children" : -1,
+ "max_depth" : -1,
+ "valid_children": "all"
+
+ // Bound functions - you can bind any other function here (using boolean or function)
+ //"select_node" : true
+ }
+ }
+ },
+ _fn : {
+ _types_notify : function (n, data) {
+ if(data.type && this._get_settings().types.use_data) {
+ this.set_type(data.type, n);
+ }
+ },
+ _get_type : function (obj) {
+ obj = this._get_node(obj);
+ return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";
+ },
+ set_type : function (str, obj) {
+ obj = this._get_node(obj);
+ var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);
+ if(ret) { this.__callback({ obj : obj, type : str}); }
+ return ret;
+ },
+ _check : function (rule, obj, opts) {
+ obj = this._get_node(obj);
+ var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false;
+ if(obj === -1) {
+ if(!!s[rule]) { v = s[rule]; }
+ else { return; }
+ }
+ else {
+ if(t === false) { return; }
+ data = s.use_data ? obj.data("jstree") : false;
+ if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; }
+ else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; }
+ else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; }
+ }
+ if($.isFunction(v)) { v = v.call(this, obj); }
+ if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {
+ // also include the node itself - otherwise if root node it is not checked
+ obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {
+ // check if current depth already exceeds global tree depth
+ if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }
+ d = (i === 0) ? v : _this._check(rule, this, false);
+ // check if current node max depth is already matched or exceeded
+ if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }
+ // otherwise - set the max depth to the current value minus current depth
+ if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }
+ // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
+ if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }
+ });
+ }
+ return v;
+ },
+ check_move : function () {
+ if(!this.__call_old()) { return false; }
+ var m = this._get_move(),
+ s = m.rt._get_settings().types,
+ mc = m.rt._check("max_children", m.cr),
+ md = m.rt._check("max_depth", m.cr),
+ vc = m.rt._check("valid_children", m.cr),
+ ch = 0, d = 1, t;
+
+ if(vc === "none") { return false; }
+ if($.isArray(vc) && m.ot && m.ot._get_type) {
+ m.o.each(function () {
+ if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }
+ });
+ if(d === false) { return false; }
+ }
+ if(s.max_children !== -2 && mc !== -1) {
+ ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length;
+ if(ch + m.o.length > mc) { return false; }
+ }
+ if(s.max_depth !== -2 && md !== -1) {
+ d = 0;
+ if(md === 0) { return false; }
+ if(typeof m.o.d === "undefined") {
+ // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
+ t = m.o;
+ while(t.length > 0) {
+ t = t.find("> ul > li");
+ d ++;
+ }
+ m.o.d = d;
+ }
+ if(md - m.o.d < 0) { return false; }
+ }
+ return true;
+ },
+ create_node : function (obj, position, js, callback, is_loaded, skip_check) {
+ if(!skip_check && (is_loaded || this._is_loaded(obj))) {
+ var p = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),
+ s = this._get_settings().types,
+ mc = this._check("max_children", p),
+ md = this._check("max_depth", p),
+ vc = this._check("valid_children", p),
+ ch;
+ if(typeof js === "string") { js = { data : js }; }
+ if(!js) { js = {}; }
+ if(vc === "none") { return false; }
+ if($.isArray(vc)) {
+ if(!js.attr || !js.attr[s.type_attr]) {
+ if(!js.attr) { js.attr = {}; }
+ js.attr[s.type_attr] = vc[0];
+ }
+ else {
+ if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }
+ }
+ }
+ if(s.max_children !== -2 && mc !== -1) {
+ ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length;
+ if(ch + 1 > mc) { return false; }
+ }
+ if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }
+ }
+ return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree HTML plugin
+ * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.
+ */
+(function ($) {
+ $.jstree.plugin("html_data", {
+ __init : function () {
+ // this used to use html() and clean the whitespace, but this way any attached data was lost
+ this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);
+ // remove white space from LI node - otherwise nodes appear a bit to the right
+ this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();
+ },
+ defaults : {
+ data : false,
+ ajax : false,
+ correct_state : true
+ },
+ _fn : {
+ load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
+ _is_loaded : function (obj) {
+ obj = this._get_node(obj);
+ return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
+ },
+ load_node_html : function (obj, s_call, e_call) {
+ var d,
+ s = this.get_settings().html_data,
+ error_func = function () {},
+ success_func = function () {};
+ obj = this._get_node(obj);
+ if(obj && obj !== -1) {
+ if(obj.data("jstree-is-loading")) { return; }
+ else { obj.data("jstree-is-loading",true); }
+ }
+ switch(!0) {
+ case ($.isFunction(s.data)):
+ s.data.call(this, obj, $.proxy(function (d) {
+ if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") {
+ d = $(d);
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
+ if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
+ this.clean_node(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ else {
+ if(obj && obj !== -1) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) {
+ this.correct_state(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }
+ }, this));
+ break;
+ case (!s.data && !s.ajax):
+ if(!obj || obj == -1) {
+ this.get_container()
+ .children("ul").empty()
+ .append(this.data.html_data.original_container_html)
+ .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
+ .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
+ this.clean_node();
+ }
+ if(s_call) { s_call.call(this); }
+ break;
+ case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
+ if(!obj || obj == -1) {
+ d = $(s.data);
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
+ this.get_container()
+ .children("ul").empty().append(d.children())
+ .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
+ .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
+ this.clean_node();
+ }
+ if(s_call) { s_call.call(this); }
+ break;
+ case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
+ obj = this._get_node(obj);
+ error_func = function (x, t, e) {
+ var ef = this.get_settings().html_data.ajax.error;
+ if(ef) { ef.call(this, x, t, e); }
+ if(obj != -1 && obj.length) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(t === "success" && s.correct_state) { this.correct_state(obj); }
+ }
+ else {
+ if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
+ }
+ if(e_call) { e_call.call(this); }
+ };
+ success_func = function (d, t, x) {
+ var sf = this.get_settings().html_data.ajax.success;
+ if(sf) { d = sf.call(this,d,t,x) || d; }
+ if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
+ return error_func.call(this, x, t, "");
+ }
+ if(d) {
+ d = $(d);
+ if(!d.is("ul")) { d = $("<ul />").append(d); }
+ if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
+ else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
+ this.clean_node(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ else {
+ if(obj && obj !== -1) {
+ obj.children("a.jstree-loading").removeClass("jstree-loading");
+ obj.removeData("jstree-is-loading");
+ if(s.correct_state) {
+ this.correct_state(obj);
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ else {
+ if(s.correct_state) {
+ this.get_container().children("ul").empty();
+ if(s_call) { s_call.call(this); }
+ }
+ }
+ }
+ };
+ s.ajax.context = this;
+ s.ajax.error = error_func;
+ s.ajax.success = success_func;
+ if(!s.ajax.dataType) { s.ajax.dataType = "html"; }
+ if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
+ if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
+ $.ajax(s.ajax);
+ break;
+ }
+ }
+ }
+ });
+ // include the HTML data plugin by default
+ $.jstree.defaults.plugins.push("html_data");
+})(jQuery);
+//*/
+
+/*
+ * jsTree themeroller plugin
+ * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.
+ */
+(function ($) {
+ $.jstree.plugin("themeroller", {
+ __init : function () {
+ var s = this._get_settings().themeroller;
+ this.get_container()
+ .addClass("ui-widget-content")
+ .addClass("jstree-themeroller")
+ .delegate("a","mouseenter.jstree", function (e) {
+ if(!$(e.currentTarget).hasClass("jstree-loading")) {
+ $(this).addClass(s.item_h);
+ }
+ })
+ .delegate("a","mouseleave.jstree", function () {
+ $(this).removeClass(s.item_h);
+ })
+ .bind("init.jstree", $.proxy(function (e, data) {
+ data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh");
+ this._themeroller(data.inst.get_container().find("> ul > li"));
+ }, this))
+ .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) {
+ this._themeroller(data.rslt.obj);
+ }, this))
+ .bind("loaded.jstree refresh.jstree", $.proxy(function (e) {
+ this._themeroller();
+ }, this))
+ .bind("close_node.jstree", $.proxy(function (e, data) {
+ this._themeroller(data.rslt.obj);
+ }, this))
+ .bind("delete_node.jstree", $.proxy(function (e, data) {
+ this._themeroller(data.rslt.parent);
+ }, this))
+ .bind("correct_state.jstree", $.proxy(function (e, data) {
+ data.rslt.obj
+ .children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end()
+ .find("> a > ins.ui-icon")
+ .filter(function() {
+ return this.className.toString()
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
+ .indexOf("ui-icon-") === -1;
+ }).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon");
+ }, this))
+ .bind("select_node.jstree", $.proxy(function (e, data) {
+ data.rslt.obj.children("a").addClass(s.item_a);
+ }, this))
+ .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {
+ this.get_container()
+ .find("a." + s.item_a).removeClass(s.item_a).end()
+ .find("a.jstree-clicked").addClass(s.item_a);
+ }, this))
+ .bind("dehover_node.jstree", $.proxy(function (e, data) {
+ data.rslt.obj.children("a").removeClass(s.item_h);
+ }, this))
+ .bind("hover_node.jstree", $.proxy(function (e, data) {
+ this.get_container()
+ .find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h);
+ data.rslt.obj.children("a").addClass(s.item_h);
+ }, this))
+ .bind("move_node.jstree", $.proxy(function (e, data) {
+ this._themeroller(data.rslt.o);
+ this._themeroller(data.rslt.op);
+ }, this));
+ },
+ __destroy : function () {
+ var s = this._get_settings().themeroller,
+ c = [ "ui-icon" ];
+ $.each(s, function (i, v) {
+ v = v.split(" ");
+ if(v.length) { c = c.concat(v); }
+ });
+ this.get_container()
+ .removeClass("ui-widget-content")
+ .find("." + c.join(", .")).removeClass(c.join(" "));
+ },
+ _fn : {
+ _themeroller : function (obj) {
+ var s = this._get_settings().themeroller;
+ obj = !obj || obj == -1 ? this.get_container_ul() : this._get_node(obj).parent();
+ obj
+ .find("li.jstree-closed")
+ .children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()
+ .children("a").addClass(s.item)
+ .children("ins.jstree-icon").addClass("ui-icon")
+ .filter(function() {
+ return this.className.toString()
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
+ .indexOf("ui-icon-") === -1;
+ }).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon")
+ .end()
+ .end()
+ .end()
+ .end()
+ .find("li.jstree-open")
+ .children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()
+ .children("a").addClass(s.item)
+ .children("ins.jstree-icon").addClass("ui-icon")
+ .filter(function() {
+ return this.className.toString()
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
+ .indexOf("ui-icon-") === -1;
+ }).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon")
+ .end()
+ .end()
+ .end()
+ .end()
+ .find("li.jstree-leaf")
+ .children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end()
+ .children("a").addClass(s.item)
+ .children("ins.jstree-icon").addClass("ui-icon")
+ .filter(function() {
+ return this.className.toString()
+ .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
+ .indexOf("ui-icon-") === -1;
+ }).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon");
+ }
+ },
+ defaults : {
+ "opened" : "ui-icon-triangle-1-se",
+ "closed" : "ui-icon-triangle-1-e",
+ "item" : "ui-state-default",
+ "item_h" : "ui-state-hover",
+ "item_a" : "ui-state-active",
+ "item_open" : "ui-icon-folder-open",
+ "item_clsd" : "ui-icon-folder-collapsed",
+ "item_leaf" : "ui-icon-document"
+ }
+ });
+ $(function() {
+ var css_string = '' +
+ '.jstree-themeroller .ui-icon { overflow:visible; } ' +
+ '.jstree-themeroller a { padding:0 2px; } ' +
+ '.jstree-themeroller .jstree-no-icon { display:none; }';
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree unique plugin
+ * Forces different names amongst siblings (still a bit experimental)
+ * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)
+ */
+(function ($) {
+ $.jstree.plugin("unique", {
+ __init : function () {
+ this.get_container()
+ .bind("before.jstree", $.proxy(function (e, data) {
+ var nms = [], res = true, p, t;
+ if(data.func == "move_node") {
+ // obj, ref, position, is_copy, is_prepared, skip_check
+ if(data.args[4] === true) {
+ if(data.args[0].o && data.args[0].o.length) {
+ data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
+ res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node");
+ }
+ }
+ }
+ if(data.func == "create_node") {
+ // obj, position, js, callback, is_loaded
+ if(data.args[4] || this._is_loaded(data.args[0])) {
+ p = this._get_node(data.args[0]);
+ if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {
+ p = this._get_parent(data.args[0]);
+ if(!p || p === -1) { p = this.get_container(); }
+ }
+ if(typeof data.args[2] === "string") { nms.push(data.args[2]); }
+ else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); }
+ else { nms.push(data.args[2].data); }
+ res = this._check_unique(nms, p.find("> ul > li"), "create_node");
+ }
+ }
+ if(data.func == "rename_node") {
+ // obj, val
+ nms.push(data.args[1]);
+ t = this._get_node(data.args[0]);
+ p = this._get_parent(t);
+ if(!p || p === -1) { p = this.get_container(); }
+ res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node");
+ }
+ if(!res) {
+ e.stopPropagation();
+ return false;
+ }
+ }, this));
+ },
+ defaults : {
+ error_callback : $.noop
+ },
+ _fn : {
+ _check_unique : function (nms, p, func) {
+ var cnms = [];
+ p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });
+ if(!cnms.length || !nms.length) { return true; }
+ cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
+ if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {
+ this._get_settings().unique.error_callback.call(null, nms, p, func);
+ return false;
+ }
+ return true;
+ },
+ check_move : function () {
+ if(!this.__call_old()) { return false; }
+ var p = this._get_move(), nms = [];
+ if(p.o && p.o.length) {
+ p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
+ return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move");
+ }
+ return true;
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+/*
+ * jsTree wholerow plugin
+ * Makes select and hover work on the entire width of the node
+ * MAY BE HEAVY IN LARGE DOM
+ */
+(function ($) {
+ $.jstree.plugin("wholerow", {
+ __init : function () {
+ if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; }
+ this.data.wholerow.html = false;
+ this.data.wholerow.to = false;
+ this.get_container()
+ .bind("init.jstree", $.proxy(function (e, data) {
+ this._get_settings().core.animation = 0;
+ }, this))
+ .bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) {
+ this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 );
+ }, this))
+ .bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) {
+ if(this.data.to) { clearTimeout(this.data.to); }
+ this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this, data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0);
+ }, this))
+ .bind("deselect_all.jstree", $.proxy(function (e, data) {
+ this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" ));
+ }, this))
+ .bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) {
+ data.rslt.obj.each(function () {
+ var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")");
+ // ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");
+ ref.children("a").attr("class",data.rslt.obj.children("a").attr("class"));
+ });
+ }, this))
+ .bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) {
+ this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" ));
+ if(e.type === "hover_node") {
+ var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")");
+ // ref.children("a").addClass("jstree-hovered");
+ ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class"));
+ }
+ }, this))
+ .delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) {
+ var n = $(e.currentTarget);
+ if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; }
+ n.closest("li").children("a:visible:eq(0)").click();
+ e.stopImmediatePropagation();
+ })
+ .delegate("li", "mouseover.jstree", $.proxy(function (e) {
+ e.stopImmediatePropagation();
+ if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; }
+ this.hover_node(e.currentTarget);
+ return false;
+ }, this))
+ .delegate("li", "mouseleave.jstree", $.proxy(function (e) {
+ if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; }
+ this.dehover_node(e.currentTarget);
+ }, this));
+ if(is_ie7 || is_ie6) {
+ $.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" });
+ }
+ },
+ defaults : {
+ },
+ __destroy : function () {
+ this.get_container().children(".jstree-wholerow").remove();
+ this.get_container().find(".jstree-wholerow-span").remove();
+ },
+ _fn : {
+ _prepare_wholerow_span : function (obj) {
+ obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
+ if(obj === false) { return; } // added for removing root nodes
+ obj.each(function () {
+ $(this).find("li").andSelf().each(function () {
+ var $t = $(this);
+ if($t.children(".jstree-wholerow-span").length) { return true; }
+ $t.prepend("<span class='jstree-wholerow-span' style='width:" + ($t.parentsUntil(".jstree","li").length * 18) + "px;'>&#160;</span>");
+ });
+ });
+ },
+ _prepare_wholerow_ul : function () {
+ var o = this.get_container().children("ul").eq(0), h = o.html();
+ o.addClass("jstree-wholerow-real");
+ if(this.data.wholerow.last_html !== h) {
+ this.data.wholerow.last_html = h;
+ this.get_container().children(".jstree-wholerow").remove();
+ this.get_container().append(
+ o.clone().removeClass("jstree-wholerow-real")
+ .wrapAll("<div class='jstree-wholerow' />").parent()
+ .width(o.parent()[0].scrollWidth)
+ .css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 )
+ .find("li[id]").each(function () { this.removeAttribute("id"); }).end()
+ );
+ }
+ }
+ }
+ });
+ $(function() {
+ var css_string = '' +
+ '.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' +
+ '.jstree .jstree-wholerow-real li { cursor:pointer; } ' +
+ '.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' +
+ '.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' +
+ '.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' +
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' +
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' +
+ '.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' +
+ '.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' +
+ '.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }';
+ if(is_ff2) {
+ css_string += '' +
+ '.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' +
+ '.jstree .jstree-wholerow-real a { border-color:transparent !important; } ';
+ }
+ if(is_ie7 || is_ie6) {
+ css_string += '' +
+ '.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' +
+ '.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ';
+ }
+ $.vakata.css.add_sheet({ str : css_string, title : "jstree" });
+ });
+})(jQuery);
+//*/
+
+/*
+* jsTree model plugin
+* This plugin gets jstree to use a class model to retrieve data, creating great dynamism
+*/
+(function ($) {
+ var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"],
+ validateInterface = function(obj, inter) {
+ var valid = true;
+ obj = obj || {};
+ inter = [].concat(inter);
+ $.each(inter, function (i, v) {
+ if(!$.isFunction(obj[v])) { valid = false; return false; }
+ });
+ return valid;
+ };
+ $.jstree.plugin("model", {
+ __init : function () {
+ if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; }
+ this._get_settings().json_data.data = function (n, b) {
+ var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model");
+ if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); }
+ if(this._get_settings().model.async) {
+ obj.getChildren($.proxy(function (data) {
+ this.model_done(data, b);
+ }, this));
+ }
+ else {
+ this.model_done(obj.getChildren(), b);
+ }
+ };
+ },
+ defaults : {
+ object : false,
+ id_prefix : false,
+ async : false
+ },
+ _fn : {
+ model_done : function (data, callback) {
+ var ret = [],
+ s = this._get_settings(),
+ _this = this;
+
+ if(!$.isArray(data)) { data = [data]; }
+ $.each(data, function (i, nd) {
+ var r = nd.getProps() || {};
+ r.attr = nd.getAttr() || {};
+ if(nd.getChildrenCount()) { r.state = "closed"; }
+ r.data = nd.getName();
+ if(!$.isArray(r.data)) { r.data = [r.data]; }
+ if(_this.data.types && $.isFunction(nd.getType)) {
+ r.attr[s.types.type_attr] = nd.getType();
+ }
+ if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; }
+ if(!r.metadata) { r.metadata = { }; }
+ r.metadata.jstree_model = nd;
+ ret.push(r);
+ });
+ callback.call(null, ret);
+ }
+ }
+ });
+})(jQuery);
+//*/
+
+})(); \ No newline at end of file
diff --git a/mod/developers/vendors/jsTree/themes/apple/bg.jpg b/mod/developers/vendors/jsTree/themes/apple/bg.jpg
new file mode 100644
index 000000000..3aad05d8f
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/apple/bg.jpg
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/apple/d.png b/mod/developers/vendors/jsTree/themes/apple/d.png
new file mode 100644
index 000000000..2463ba6df
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/apple/d.png
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/apple/dot_for_ie.gif b/mod/developers/vendors/jsTree/themes/apple/dot_for_ie.gif
new file mode 100644
index 000000000..c0cc5fda7
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/apple/dot_for_ie.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/apple/style.css b/mod/developers/vendors/jsTree/themes/apple/style.css
new file mode 100644
index 000000000..db7a143e0
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/apple/style.css
@@ -0,0 +1,61 @@
+/*
+ * jsTree apple theme 1.0
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
+ */
+
+.jstree-apple > ul { background:url("bg.jpg") left top repeat; }
+.jstree-apple li,
+.jstree-apple ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
+.jstree-apple li { background-position:-90px 0; background-repeat:repeat-y; }
+.jstree-apple li.jstree-last { background:transparent; }
+.jstree-apple .jstree-open > ins { background-position:-72px 0; }
+.jstree-apple .jstree-closed > ins { background-position:-54px 0; }
+.jstree-apple .jstree-leaf > ins { background-position:-36px 0; }
+
+.jstree-apple a { border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; text-shadow:1px 1px 1px white; }
+.jstree-apple .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 3px 0 1px; text-shadow:1px 1px 1px silver; }
+.jstree-apple .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 3px 0 1px; }
+.jstree-apple a .jstree-icon { background-position:-56px -20px; }
+.jstree-apple a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
+
+.jstree-apple.jstree-focused { background:white; }
+
+.jstree-apple .jstree-no-dots li,
+.jstree-apple .jstree-no-dots .jstree-leaf > ins { background:transparent; }
+.jstree-apple .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
+.jstree-apple .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
+
+.jstree-apple .jstree-no-icons a .jstree-icon { display:none; }
+
+.jstree-apple .jstree-search { font-style:italic; }
+
+.jstree-apple .jstree-no-icons .jstree-checkbox { display:inline-block; }
+.jstree-apple .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
+.jstree-apple .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
+.jstree-apple .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
+.jstree-apple .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
+.jstree-apple .jstree-checked > a > .checkbox:hover { background-position:-38px -37px; }
+.jstree-apple .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
+.jstree-apple .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
+
+#vakata-dragged.jstree-apple ins { background:transparent !important; }
+#vakata-dragged.jstree-apple .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
+#vakata-dragged.jstree-apple .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
+#jstree-marker.jstree-apple { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
+
+.jstree-apple a.jstree-search { color:aqua; }
+.jstree-apple .jstree-locked a { color:silver; cursor:default; }
+
+#vakata-contextmenu.jstree-apple-context,
+#vakata-contextmenu.jstree-apple-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
+#vakata-contextmenu.jstree-apple-context li { }
+#vakata-contextmenu.jstree-apple-context a { color:black; }
+#vakata-contextmenu.jstree-apple-context a:hover,
+#vakata-contextmenu.jstree-apple-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
+#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a,
+#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
+#vakata-contextmenu.jstree-apple-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
+#vakata-contextmenu.jstree-apple-context li ul { margin-left:-4px; }
+
+/* TODO: IE6 support - the `>` selectors */ \ No newline at end of file
diff --git a/mod/developers/vendors/jsTree/themes/apple/throbber.gif b/mod/developers/vendors/jsTree/themes/apple/throbber.gif
new file mode 100644
index 000000000..5b33f7e54
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/apple/throbber.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/classic/d.gif b/mod/developers/vendors/jsTree/themes/classic/d.gif
new file mode 100644
index 000000000..6eb0004ce
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/classic/d.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/classic/d.png b/mod/developers/vendors/jsTree/themes/classic/d.png
new file mode 100644
index 000000000..275daeca2
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/classic/d.png
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/classic/dot_for_ie.gif b/mod/developers/vendors/jsTree/themes/classic/dot_for_ie.gif
new file mode 100644
index 000000000..c0cc5fda7
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/classic/dot_for_ie.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/classic/style.css b/mod/developers/vendors/jsTree/themes/classic/style.css
new file mode 100644
index 000000000..492856ddc
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/classic/style.css
@@ -0,0 +1,77 @@
+/*
+ * jsTree classic theme 1.0
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
+ */
+
+.jstree-classic li,
+.jstree-classic ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
+.jstree-classic li { background-position:-90px 0; background-repeat:repeat-y; }
+.jstree-classic li.jstree-last { background:transparent; }
+.jstree-classic .jstree-open > ins { background-position:-72px 0; }
+.jstree-classic .jstree-closed > ins { background-position:-54px 0; }
+.jstree-classic .jstree-leaf > ins { background-position:-36px 0; }
+
+.jstree-classic .jstree-hovered { background:#e7f4f9; border:1px solid #e7f4f9; padding:0 2px 0 1px; }
+.jstree-classic .jstree-clicked { background:navy; border:1px solid navy; padding:0 2px 0 1px; color:white; }
+.jstree-classic a .jstree-icon { background-position:-56px -19px; }
+.jstree-classic .jstree-open > a .jstree-icon { background-position:-56px -36px; }
+.jstree-classic a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
+
+.jstree-classic.jstree-focused { background:white; }
+
+.jstree-classic .jstree-no-dots li,
+.jstree-classic .jstree-no-dots .jstree-leaf > ins { background:transparent; }
+.jstree-classic .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
+.jstree-classic .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
+
+.jstree-classic .jstree-no-icons a .jstree-icon { display:none; }
+
+.jstree-classic .jstree-search { font-style:italic; }
+
+.jstree-classic .jstree-no-icons .jstree-checkbox { display:inline-block; }
+.jstree-classic .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
+.jstree-classic .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
+.jstree-classic .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
+.jstree-classic .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
+.jstree-classic .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }
+.jstree-classic .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
+.jstree-classic .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
+
+#vakata-dragged.jstree-classic ins { background:transparent !important; }
+#vakata-dragged.jstree-classic .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
+#vakata-dragged.jstree-classic .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
+#jstree-marker.jstree-classic { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
+
+.jstree-classic a.jstree-search { color:aqua; }
+.jstree-classic .jstree-locked a { color:silver; cursor:default; }
+
+#vakata-contextmenu.jstree-classic-context,
+#vakata-contextmenu.jstree-classic-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
+#vakata-contextmenu.jstree-classic-context li { }
+#vakata-contextmenu.jstree-classic-context a { color:black; }
+#vakata-contextmenu.jstree-classic-context a:hover,
+#vakata-contextmenu.jstree-classic-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
+#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a,
+#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
+#vakata-contextmenu.jstree-classic-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
+#vakata-contextmenu.jstree-classic-context li ul { margin-left:-4px; }
+
+/* IE6 BEGIN */
+.jstree-classic li,
+.jstree-classic ins,
+#vakata-dragged.jstree-classic .jstree-invalid,
+#vakata-dragged.jstree-classic .jstree-ok,
+#jstree-marker.jstree-classic { _background-image:url("d.gif"); }
+.jstree-classic .jstree-open ins { _background-position:-72px 0; }
+.jstree-classic .jstree-closed ins { _background-position:-54px 0; }
+.jstree-classic .jstree-leaf ins { _background-position:-36px 0; }
+.jstree-classic .jstree-open a ins.jstree-icon { _background-position:-56px -36px; }
+.jstree-classic .jstree-closed a ins.jstree-icon { _background-position:-56px -19px; }
+.jstree-classic .jstree-leaf a ins.jstree-icon { _background-position:-56px -19px; }
+#vakata-contextmenu.jstree-classic-context ins { _display:none; }
+#vakata-contextmenu.jstree-classic-context li { _zoom:1; }
+.jstree-classic .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }
+.jstree-classic .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }
+.jstree-classic .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }
+/* IE6 END */ \ No newline at end of file
diff --git a/mod/developers/vendors/jsTree/themes/classic/throbber.gif b/mod/developers/vendors/jsTree/themes/classic/throbber.gif
new file mode 100644
index 000000000..5b33f7e54
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/classic/throbber.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default-rtl/d.gif b/mod/developers/vendors/jsTree/themes/default-rtl/d.gif
new file mode 100644
index 000000000..d85aba049
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default-rtl/d.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default-rtl/d.png b/mod/developers/vendors/jsTree/themes/default-rtl/d.png
new file mode 100644
index 000000000..5179cf64e
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default-rtl/d.png
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default-rtl/dots.gif b/mod/developers/vendors/jsTree/themes/default-rtl/dots.gif
new file mode 100644
index 000000000..00433648c
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default-rtl/dots.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default-rtl/style.css b/mod/developers/vendors/jsTree/themes/default-rtl/style.css
new file mode 100644
index 000000000..d51aef6cc
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default-rtl/style.css
@@ -0,0 +1,84 @@
+/*
+ * jsTree default-rtl theme 1.0
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
+ */
+
+.jstree-default-rtl li,
+.jstree-default-rtl ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
+.jstree-default-rtl li { background-position:-90px 0; background-repeat:repeat-y; }
+.jstree-default-rtl li.jstree-last { background:transparent; }
+.jstree-default-rtl .jstree-open > ins { background-position:-72px 0; }
+.jstree-default-rtl .jstree-closed > ins { background-position:-54px 0; }
+.jstree-default-rtl .jstree-leaf > ins { background-position:-36px 0; }
+
+.jstree-default-rtl .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; }
+.jstree-default-rtl .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; }
+.jstree-default-rtl a .jstree-icon { background-position:-56px -19px; }
+.jstree-default-rtl a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
+
+.jstree-default-rtl.jstree-focused { background:#ffffee; }
+
+.jstree-default-rtl .jstree-no-dots li,
+.jstree-default-rtl .jstree-no-dots .jstree-leaf > ins { background:transparent; }
+.jstree-default-rtl .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
+.jstree-default-rtl .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
+
+.jstree-default-rtl .jstree-no-icons a .jstree-icon { display:none; }
+
+.jstree-default-rtl .jstree-search { font-style:italic; }
+
+.jstree-default-rtl .jstree-no-icons .jstree-checkbox { display:inline-block; }
+.jstree-default-rtl .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
+
+#vakata-dragged.jstree-default-rtl ins { background:transparent !important; }
+#vakata-dragged.jstree-default-rtl .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
+#vakata-dragged.jstree-default-rtl .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
+#jstree-marker.jstree-default-rtl { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
+
+.jstree-default-rtl a.jstree-search { color:aqua; }
+.jstree-default-rtl .jstree-locked a { color:silver; cursor:default; }
+
+#vakata-contextmenu.jstree-default-rtl-context,
+#vakata-contextmenu.jstree-default-rtl-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
+#vakata-contextmenu.jstree-default-rtl-context li { }
+#vakata-contextmenu.jstree-default-rtl-context a { color:black; }
+#vakata-contextmenu.jstree-default-rtl-context a:hover,
+#vakata-contextmenu.jstree-default-rtl-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
+#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a,
+#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
+#vakata-contextmenu.jstree-default-rtl-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
+#vakata-contextmenu.jstree-default-rtl-context li ul { margin-left:-4px; }
+
+/* IE6 BEGIN */
+.jstree-default-rtl li,
+.jstree-default-rtl ins,
+#vakata-dragged.jstree-default-rtl .jstree-invalid,
+#vakata-dragged.jstree-default-rtl .jstree-ok,
+#jstree-marker.jstree-default-rtl { _background-image:url("d.gif"); }
+.jstree-default-rtl .jstree-open ins { _background-position:-72px 0; }
+.jstree-default-rtl .jstree-closed ins { _background-position:-54px 0; }
+.jstree-default-rtl .jstree-leaf ins { _background-position:-36px 0; }
+.jstree-default-rtl a ins.jstree-icon { _background-position:-56px -19px; }
+#vakata-contextmenu.jstree-default-rtl-context ins { _display:none; }
+#vakata-contextmenu.jstree-default-rtl-context li { _zoom:1; }
+.jstree-default-rtl .jstree-undetermined a .jstree-checkbox { _background-position:-18px -19px; }
+.jstree-default-rtl .jstree-checked a .jstree-checkbox { _background-position:-36px -19px; }
+.jstree-default-rtl .jstree-unchecked a .jstree-checkbox { _background-position:0px -19px; }
+/* IE6 END */
+
+/* RTL part */
+.jstree-default-rtl .jstree-hovered, .jstree-default-rtl .jstree-clicked { padding:0 1px 0 2px; }
+.jstree-default-rtl li { background-image:url("dots.gif"); background-position: 100% 0px; }
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-36px -19px; margin-left:2px; }
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:0px -19px; margin-left:2px; }
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-18px -19px; margin-left:2px; }
+.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-36px -37px; }
+.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:0px -37px; }
+.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-18px -37px; } \ No newline at end of file
diff --git a/mod/developers/vendors/jsTree/themes/default-rtl/throbber.gif b/mod/developers/vendors/jsTree/themes/default-rtl/throbber.gif
new file mode 100644
index 000000000..5b33f7e54
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default-rtl/throbber.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default/d.gif b/mod/developers/vendors/jsTree/themes/default/d.gif
new file mode 100644
index 000000000..0e958d387
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default/d.gif
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default/d.png b/mod/developers/vendors/jsTree/themes/default/d.png
new file mode 100644
index 000000000..8540175a0
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default/d.png
Binary files differ
diff --git a/mod/developers/vendors/jsTree/themes/default/style.css b/mod/developers/vendors/jsTree/themes/default/style.css
new file mode 100644
index 000000000..238ce1a1c
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default/style.css
@@ -0,0 +1,74 @@
+/*
+ * jsTree default theme 1.0
+ * Supported features: dots/no-dots, icons/no-icons, focused, loading
+ * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
+ */
+
+.jstree-default li,
+.jstree-default ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
+.jstree-default li { background-position:-90px 0; background-repeat:repeat-y; }
+.jstree-default li.jstree-last { background:transparent; }
+.jstree-default .jstree-open > ins { background-position:-72px 0; }
+.jstree-default .jstree-closed > ins { background-position:-54px 0; }
+.jstree-default .jstree-leaf > ins { background-position:-36px 0; }
+
+.jstree-default .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; }
+.jstree-default .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; }
+.jstree-default a .jstree-icon { background-position:-56px -19px; }
+.jstree-default a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
+
+.jstree-default.jstree-focused { background:#ffffee; }
+
+.jstree-default .jstree-no-dots li,
+.jstree-default .jstree-no-dots .jstree-leaf > ins { background:transparent; }
+.jstree-default .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
+.jstree-default .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
+
+.jstree-default .jstree-no-icons a .jstree-icon { display:none; }
+
+.jstree-default .jstree-search { font-style:italic; }
+
+.jstree-default .jstree-no-icons .jstree-checkbox { display:inline-block; }
+.jstree-default .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
+.jstree-default .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
+.jstree-default .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
+.jstree-default .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
+.jstree-default .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }
+.jstree-default .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
+.jstree-default .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
+
+#vakata-dragged.jstree-default ins { background:transparent !important; }
+#vakata-dragged.jstree-default .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
+#vakata-dragged.jstree-default .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
+#jstree-marker.jstree-default { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
+
+.jstree-default a.jstree-search { color:aqua; }
+.jstree-default .jstree-locked a { color:silver; cursor:default; }
+
+#vakata-contextmenu.jstree-default-context,
+#vakata-contextmenu.jstree-default-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
+#vakata-contextmenu.jstree-default-context li { }
+#vakata-contextmenu.jstree-default-context a { color:black; }
+#vakata-contextmenu.jstree-default-context a:hover,
+#vakata-contextmenu.jstree-default-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
+#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a,
+#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
+#vakata-contextmenu.jstree-default-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
+#vakata-contextmenu.jstree-default-context li ul { margin-left:-4px; }
+
+/* IE6 BEGIN */
+.jstree-default li,
+.jstree-default ins,
+#vakata-dragged.jstree-default .jstree-invalid,
+#vakata-dragged.jstree-default .jstree-ok,
+#jstree-marker.jstree-default { _background-image:url("d.gif"); }
+.jstree-default .jstree-open ins { _background-position:-72px 0; }
+.jstree-default .jstree-closed ins { _background-position:-54px 0; }
+.jstree-default .jstree-leaf ins { _background-position:-36px 0; }
+.jstree-default a ins.jstree-icon { _background-position:-56px -19px; }
+#vakata-contextmenu.jstree-default-context ins { _display:none; }
+#vakata-contextmenu.jstree-default-context li { _zoom:1; }
+.jstree-default .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }
+.jstree-default .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }
+.jstree-default .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }
+/* IE6 END */ \ No newline at end of file
diff --git a/mod/developers/vendors/jsTree/themes/default/throbber.gif b/mod/developers/vendors/jsTree/themes/default/throbber.gif
new file mode 100644
index 000000000..5b33f7e54
--- /dev/null
+++ b/mod/developers/vendors/jsTree/themes/default/throbber.gif
Binary files differ
diff --git a/mod/developers/views/default/admin/develop_tools/inspect.php b/mod/developers/views/default/admin/develop_tools/inspect.php
new file mode 100644
index 000000000..cfa3de2ea
--- /dev/null
+++ b/mod/developers/views/default/admin/develop_tools/inspect.php
@@ -0,0 +1,14 @@
+<?php
+/**
+* Inspect View
+*
+* Inspect global variables of Elgg
+*/
+
+elgg_load_js('jquery.jstree');
+elgg_load_css('jquery.jstree');
+
+echo elgg_view_form('developers/inspect', array('class' => 'developers-form-inspect'));
+
+echo '<div id="developers-inspect-results"></div>';
+echo elgg_view('graphics/ajax_loader', array('id' => 'developers-ajax-loader'));
diff --git a/mod/developers/views/default/admin/develop_tools/preview.php b/mod/developers/views/default/admin/develop_tools/preview.php
new file mode 100644
index 000000000..920047d98
--- /dev/null
+++ b/mod/developers/views/default/admin/develop_tools/preview.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * CSS Preview
+ */
+
+$url = elgg_get_site_url() . 'theme_preview';
+?>
+<iframe id="developers-iframe" src="<?php echo $url; ?>"></iframe> \ No newline at end of file
diff --git a/mod/developers/views/default/admin/develop_tools/unit_tests.php b/mod/developers/views/default/admin/develop_tools/unit_tests.php
new file mode 100644
index 000000000..81658e88b
--- /dev/null
+++ b/mod/developers/views/default/admin/develop_tools/unit_tests.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Elgg unit and integration tests
+ *
+ */
+
+echo '<p>' . elgg_echo('developers:unit_tests:description') . '</p>';
+echo '<p><strong>' . elgg_echo('developers:unit_tests:warning') . '</strong></p>';
+
+// create a button to run tests
+$params = array(
+ 'text' => elgg_echo('developers:unit_tests:run'),
+ 'href' => 'engine/tests/suite.php',
+ 'class' => 'elgg-button elgg-button-submit',
+ 'is_trusted' => true,
+);
+echo '<p>' . elgg_view('output/url', $params) . '</p>';
diff --git a/mod/developers/views/default/admin/developers/settings.php b/mod/developers/views/default/admin/developers/settings.php
new file mode 100644
index 000000000..459cbabad
--- /dev/null
+++ b/mod/developers/views/default/admin/developers/settings.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Developer settings
+ */
+
+$data = array(
+ 'simple_cache' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_config('simplecache_enabled') == 1,
+ ),
+
+ 'system_cache' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_config('system_cache_enabled') == 1,
+ ),
+
+ 'display_errors' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_plugin_setting('display_errors', 'developers') == 1,
+ ),
+
+ 'debug_level' => array(
+ 'type' => 'dropdown',
+ 'value' => elgg_get_config('debug'),
+ 'options_values' => array(
+ false => elgg_echo('developers:debug:off'),
+ 'ERROR' => elgg_echo('developers:debug:error'),
+ 'WARNING' => elgg_echo('developers:debug:warning'),
+ 'NOTICE' => elgg_echo('developers:debug:notice'),
+ ),
+ ),
+
+ 'screen_log' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_plugin_setting('screen_log', 'developers') == 1,
+ ),
+
+ 'show_strings' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_plugin_setting('show_strings', 'developers') == 1,
+ ),
+
+ 'wrap_views' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_plugin_setting('wrap_views', 'developers') == 1,
+ ),
+
+ 'log_events' => array(
+ 'type' => 'checkbox',
+ 'value' => 1,
+ 'checked' => elgg_get_plugin_setting('log_events', 'developers') == 1,
+ ),
+);
+
+$form_vars = array('id' => 'developer-settings-form', 'class' => 'elgg-form-settings');
+$body_vars = array('data' => $data);
+echo elgg_view_form('developers/settings', $form_vars, $body_vars);
diff --git a/mod/developers/views/default/developers/css.php b/mod/developers/views/default/developers/css.php
new file mode 100644
index 000000000..b4f59fdec
--- /dev/null
+++ b/mod/developers/views/default/developers/css.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Admin CSS for Elgg Developers plugin
+ */
+?>
+/*** Elgg Developer Tools ***/
+#developers-iframe {
+ width: 100%;
+ height: 600px;
+ border: none;
+}
+#developer-settings-form label {
+ margin-right: 5px;
+}
+.elgg-page .jstree-default.jstree-focused {
+ background-color: transparent;
+}
+.developers-log {
+ background-color: #EBF5FF;
+ border: 1px solid #999;
+ color: #666;
+ padding: 20px;
+}
+
+.developers-content-thin {
+ max-width: 600px;
+} \ No newline at end of file
diff --git a/mod/developers/views/default/developers/ipsum.php b/mod/developers/views/default/developers/ipsum.php
new file mode 100644
index 000000000..dd9bb278f
--- /dev/null
+++ b/mod/developers/views/default/developers/ipsum.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Lorem ipsum text
+ */
+?>
+Sed scelerisque sagittis lorem. Phasellus sodales.
+Nulla urna justo, vehicula in, suscipit nec, molestie sed, tellus. \ No newline at end of file
diff --git a/mod/developers/views/default/developers/log.php b/mod/developers/views/default/developers/log.php
new file mode 100644
index 000000000..98120ca98
--- /dev/null
+++ b/mod/developers/views/default/developers/log.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Logging information
+ */
+
+$cache = elgg_get_config('log_cache');
+$items = $cache->get();
+
+echo '<div class="developers-log">';
+if ($items) {
+ foreach ($items as $item) {
+ echo '<pre>';
+ print_r($item);
+ echo '</pre>';
+ }
+}
+
+echo '</div>'; \ No newline at end of file
diff --git a/mod/developers/views/default/developers/tree.php b/mod/developers/views/default/developers/tree.php
new file mode 100644
index 000000000..a8e47333b
--- /dev/null
+++ b/mod/developers/views/default/developers/tree.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Displays a tree for inspection
+ *
+ * @uses $vars['tree']
+ */
+
+echo "<ul>";
+foreach ($vars['tree'] as $key => $arr) {
+ echo "<li><a>$key</a>";
+ echo "<ul>";
+ foreach ($arr as $value) {
+ echo "<li><a>$value</a></li>";
+ }
+ echo "</ul>";
+ echo "</li>";
+}
+echo "</ul>";
diff --git a/mod/developers/views/default/forms/developers/inspect.php b/mod/developers/views/default/forms/developers/inspect.php
new file mode 100644
index 000000000..a1b433fea
--- /dev/null
+++ b/mod/developers/views/default/forms/developers/inspect.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Configuration inspection form
+ */
+
+echo '<div>';
+echo '<p>' . elgg_echo('developers:inspect:help') . '</p>';
+
+echo elgg_view('input/dropdown', array(
+ 'name' => 'inspect_type',
+ 'options_values' => array(
+ 'Actions' => 'Actions',
+ 'Events' => 'Events',
+ 'Plugin Hooks' => 'Plugin Hooks',
+ 'Simple Cache' => 'Simple Cache',
+ 'Views' => 'Views',
+ 'Web Services' => 'Web Services',
+ 'Widgets' => 'Widgets',
+ ),
+));
+
+echo elgg_view('input/submit', array('value' => elgg_echo('submit')));
+echo '</div>';
diff --git a/mod/developers/views/default/forms/developers/settings.php b/mod/developers/views/default/forms/developers/settings.php
new file mode 100644
index 000000000..78e1372de
--- /dev/null
+++ b/mod/developers/views/default/forms/developers/settings.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Settings form body
+ *
+ * @uses $vars['values']
+ */
+
+echo '<p>' . elgg_echo('elgg_dev_tools:settings:explanation') . '</p>';
+
+foreach ($vars['data'] as $name => $info) {
+ echo '<div>';
+ if ($info['type'] == 'checkbox') {
+ echo '<label>';
+ echo elgg_view("input/checkbox", array(
+ 'name' => $name,
+ 'value' => $info['value'],
+ 'checked' => $info['checked'],
+ ));
+ echo elgg_echo("developers:label:$name") . '</label>';
+ echo '<span class="elgg-text-help">' . elgg_echo("developers:help:$name") . '</span>';
+ } else {
+ echo '<label>' . elgg_echo("developers:label:$name");
+ echo elgg_view("input/{$info['type']}", array(
+ 'name' => $name,
+ 'value' => $info['value'],
+ 'options_values' => $info['options_values'],
+ ));
+ echo '</label>';
+ echo '<span class="elgg-text-help">' . elgg_echo("developers:help:$name") . '</span>';
+ }
+ echo '</div>';
+}
+
+echo '<div class="elgg-foot">';
+echo elgg_view('input/submit', array('value' => elgg_echo('save')));
+echo '</div>';
diff --git a/mod/developers/views/default/js/developers/developers.php b/mod/developers/views/default/js/developers/developers.php
new file mode 100644
index 000000000..6e82295aa
--- /dev/null
+++ b/mod/developers/views/default/js/developers/developers.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Elgg developers tool JavaScript
+ */
+?>
+
+elgg.provide('elgg.dev');
+
+elgg.dev.init = function() {
+ $('.developers-form-inspect').live('submit', elgg.dev.inspectSubmit);
+};
+
+/**
+ * Submit the inspect form through Ajax
+ *
+ * Requires the jQuery Form Plugin.
+ *
+ * @param {Object} event
+ */
+elgg.dev.inspectSubmit = function(event) {
+
+ $("#developers-inspect-results").hide();
+ $("#developers-ajax-loader").show();
+
+ $(this).ajaxSubmit({
+ dataType : 'json',
+ success : function(response) {
+ if (response) {
+ $("#developers-inspect-results").html(response.output);
+ $("#developers-inspect-results").jstree({
+ "plugins" : [ "themes", "html_data" ],
+ "themes" : {"icons" : false}
+ }).bind("loaded.jstree", function() {
+ $("#developers-inspect-results").fadeIn();
+ $("#developers-ajax-loader").hide();
+ });
+ }
+ }
+ });
+
+ event.preventDefault();
+};
+
+elgg.register_hook_handler('init', 'system', elgg.dev.init); \ No newline at end of file
diff --git a/mod/developers/views/default/page/theme_preview.php b/mod/developers/views/default/page/theme_preview.php
new file mode 100644
index 000000000..ee2bc0c0f
--- /dev/null
+++ b/mod/developers/views/default/page/theme_preview.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Page shell for theme preview
+ */
+
+$elgg = elgg_get_simplecache_url('css', 'elgg');
+$ie_url = elgg_get_simplecache_url('css', 'ie');
+$ie6_url = elgg_get_simplecache_url('css', 'ie6');
+
+// Set the content type
+header("Content-type: text/html; charset=UTF-8");
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <?php echo elgg_view('page/elements/head', $vars); ?>
+</head>
+<body>
+<div class="elgg-page elgg-page-default">
+ <div class="elgg-page-messages">
+ <ul class="elgg-system-messages">
+ <li class="hidden"></li>
+ </ul>
+ </div>
+ <div class="elgg-page-header">
+ <div class="elgg-inner">
+ <h1 class="elgg-heading-site">Theme Sandbox</h1>
+ <?php
+ if (get_input("site_menu", false)) {
+ echo elgg_view_menu('site');
+ }
+ ?>
+ </div>
+ </div>
+ <div class="elgg-page-body">
+ <div class="elgg-inner">
+ <?php echo elgg_view('page/elements/body', $vars); ?>
+ </div>
+ </div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/buttons.php b/mod/developers/views/default/theme_preview/buttons.php
new file mode 100644
index 000000000..718d88617
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/buttons.php
@@ -0,0 +1,41 @@
+<table class="elgg-table">
+ <thead>
+ <tr>
+ <th></th>
+ <th>Default</th>
+ <th>Disabled (.elgg-state-disabled)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>Base (.elgg-button)</th>
+ <td><a href="#" class="elgg-button">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-state-disabled">anchor</a></td>
+ </tr>
+ <tr>
+ <th>Action (.elgg-button-action)</th>
+ <td><a href="#" class="elgg-button elgg-button-action">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-button-action elgg-state-disabled">anchor</a></td>
+ </tr>
+ <tr>
+ <th>Cancel (.elgg-button-cancel)</th>
+ <td><a href="#" class="elgg-button elgg-button-cancel">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-button-cancel elgg-state-disabled">anchor</a></td>
+ </tr>
+ <tr>
+ <th>Submit (.elgg-button-submit)</th>
+ <td><a href="#" class="elgg-button elgg-button-submit">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-button-submit elgg-state-disabled">anchor</a></td>
+ </tr>
+ <tr>
+ <th>Special (.elgg-button-special)</th>
+ <td><a href="#" class="elgg-button elgg-button-special">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-button-special elgg-state-disabled">anchor</a></td>
+ </tr>
+ <tr>
+ <th>Delete (.elgg-button-delete)</th>
+ <td><a href="#" class="elgg-button elgg-button-delete">anchor</a></td>
+ <td><a href="#" class="elgg-button elgg-button-delete elgg-state-disabled">anchor</a></td>
+ </tr>
+ </tbody>
+</table> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/components.php b/mod/developers/views/default/theme_preview/components.php
new file mode 100644
index 000000000..50c155b14
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * CSS Objects: list, module, image_block, table, messages
+ */
+
+$body = elgg_view('theme_preview/components/image_block');
+echo elgg_view_module('info', 'Image Block (.elgg-image-block)', $body);
+
+$body = elgg_view('theme_preview/components/list');
+echo elgg_view_module('info', 'List (.elgg-list)', $body);
+
+$body = elgg_view('theme_preview/components/table', array('class' => 'elgg-table'));
+echo elgg_view_module('info', 'Table (.elgg-table)', $body);
+
+$body = elgg_view('theme_preview/components/table', array('class' => 'elgg-table-alt'));
+echo elgg_view_module('info', 'Table Alternate (.elgg-table-alt)', $body);
+
+$body = elgg_view('theme_preview/components/tagcloud');
+echo elgg_view_module('info', 'Tag cloud (.elgg-tagcloud)', $body);
+
+$body = elgg_view('theme_preview/components/tags');
+echo elgg_view_module('info', 'Tags (.elgg-tag)', $body);
+
+$body = elgg_view('theme_preview/components/messages');
+echo elgg_view_module('info', 'Messages (.elgg-message)', $body); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/components/image_block.php b/mod/developers/views/default/theme_preview/components/image_block.php
new file mode 100644
index 000000000..ecd35ac65
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/image_block.php
@@ -0,0 +1,6 @@
+<?php
+$ipsum = elgg_view('developers/ipsum');
+
+$user = new ElggUser();
+$image = elgg_view_entity_icon($user, 'small');
+echo elgg_view_image_block($image, "$ipsum $ipsum $ipsum $ipsum $ipsum $ipsum $ipsum");
diff --git a/mod/developers/views/default/theme_preview/components/list.php b/mod/developers/views/default/theme_preview/components/list.php
new file mode 100644
index 000000000..fcb6f768a
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/list.php
@@ -0,0 +1,19 @@
+<?php
+
+$obj1 = new ElggObject();
+$obj1->title = "Object 1";
+$obj1->description = $ipsum;
+
+$obj2 = new ElggObject();
+$obj2->title = "Object 2";
+$obj2->description = $ipsum;
+
+$obj3 = new ElggObject();
+$obj3->title = "Object 3";
+$obj3->description = $ipsum;
+
+$obj4 = new ElggObject();
+$obj4->title = "Object 4";
+$obj4->description = $ipsum;
+
+echo elgg_view('page/components/list', array('items' => array($obj1, $obj2, $obj3, $obj4)));
diff --git a/mod/developers/views/default/theme_preview/components/messages.php b/mod/developers/views/default/theme_preview/components/messages.php
new file mode 100644
index 000000000..a53255291
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/messages.php
@@ -0,0 +1,5 @@
+<ul>
+ <li class="elgg-message elgg-state-success mas">Success message (.elgg-state-success)</li>
+ <li class="elgg-message elgg-state-error mas">Error message (.elgg-state-error)</li>
+ <li class="elgg-message elgg-state-notice mas">Notice message (.elgg-state-notice)</li>
+</ul>
diff --git a/mod/developers/views/default/theme_preview/components/table.php b/mod/developers/views/default/theme_preview/components/table.php
new file mode 100644
index 000000000..7d619dcea
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/table.php
@@ -0,0 +1,12 @@
+<table class="<?php echo $vars['class']; ?>">
+<?php
+ echo "<thead><tr><th>column 1</th><th>column 2</th></tr></thead>";
+ for ($i = 1; $i < 5; $i++) {
+ echo '<tr>';
+ for ($j = 1; $j < 3; $j++) {
+ echo "<td>value $j</td>";
+ }
+ echo '</tr>';
+ }
+?>
+</table> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/components/tagcloud.php b/mod/developers/views/default/theme_preview/components/tagcloud.php
new file mode 100644
index 000000000..3cbf34745
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/tagcloud.php
@@ -0,0 +1,17 @@
+<?php
+
+$tags = array(
+ (object)array('tag' => 'php', 'total' => 2),
+ (object)array('tag' => 'elgg', 'total' => 8),
+ (object)array('tag' => 'javascript', 'total' => 3),
+ (object)array('tag' => 'css', 'total' => 4),
+ (object)array('tag' => 'html', 'total' => 1),
+ (object)array('tag' => 'framework', 'total' => 4),
+ (object)array('tag' => 'social', 'total' => 3),
+ (object)array('tag' => 'web', 'total' => 7),
+ (object)array('tag' => 'code', 'total' => 2),
+);
+
+echo '<div style="width: 200px;">';
+echo elgg_view('output/tagcloud', array('value' => $tags));
+echo '</div>';
diff --git a/mod/developers/views/default/theme_preview/components/tags.php b/mod/developers/views/default/theme_preview/components/tags.php
new file mode 100644
index 000000000..04df9511a
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/components/tags.php
@@ -0,0 +1,5 @@
+<?php
+
+echo elgg_view('output/tags', array(
+ 'value' => array('one', 'two', 'three', 'four', 'cinco'),
+));
diff --git a/mod/developers/views/default/theme_preview/forms.php b/mod/developers/views/default/theme_preview/forms.php
new file mode 100644
index 000000000..ffb77f3a9
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/forms.php
@@ -0,0 +1,138 @@
+<form action="#">
+ <fieldset>
+ <legend>Fieldset Legend</legend>
+ <div>
+ <label for="f1">Text input (.elgg-input-text):</label>
+ <?php echo elgg_view('input/text', array(
+ 'name' => 'f1',
+ 'id' => 'f1',
+ 'value' => 'input text',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f2">Password input (.elgg-input-password):</label>
+ <?php echo elgg_view('input/password', array(
+ 'name' => 'f2',
+ 'id' => 'f2',
+ 'value' => 'password',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f3">Radio input (.elgg-input-radios):</label><br />
+ <?php echo elgg_view('input/radio', array(
+ 'name' => 'f3',
+ 'id' => 'f3',
+ 'options' => array('a (.elgg-input-radio)' => 1, 'b (.elgg-input-radio)' => 2),
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f4">Checkboxes input (.elgg-input-checkboxes):</label><br />
+ <?php echo elgg_view('input/checkboxes', array(
+ 'name' => 'f4',
+ 'id' => 'f4',
+ 'options' => array('a (.elgg-input-checkbox)' => 1, 'b (.elgg-input-checkbox)' => 2),
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f5">Dropdown input (.elgg-input-dropdown):</label><br />
+ <?php echo elgg_view('input/dropdown', array(
+ 'name' => 'f5',
+ 'id' => 'f5',
+ 'options' => array('option 1', 'option 2'),
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f6">Access input (.elgg-input-access):</label><br />
+ <?php echo elgg_view('input/access', array(
+ 'name' => 'f6',
+ 'id' => 'f6',
+ 'value' => ACCESS_PUBLIC,
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f7">File input (.elgg-input-file):</label>
+ <?php echo elgg_view('input/file', array(
+ 'name' => 'f7',
+ 'id' => 'f7',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f8">URL input (.elgg-input-url):</label>
+ <?php echo elgg_view('input/url', array(
+ 'name' => 'f8',
+ 'id' => 'f8',
+ 'value' => 'http://elgg.org/',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f9">Tags input (.elgg-input-tags):</label>
+ <?php echo elgg_view('input/tags', array(
+ 'name' => 'f9',
+ 'id' => 'f9',
+ 'value' => 'one, two, three',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f10">Email input (.elgg-input-email):</label>
+ <?php echo elgg_view('input/email', array(
+ 'name' => 'f10',
+ 'id' => 'f10',
+ 'value' => 'noone@elgg.org',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f11">Autocomplete input (.elgg-input-autocomplete):</label>
+ <?php echo elgg_view('input/autocomplete', array(
+ 'name' => 'f11',
+ 'id' => 'f11',
+ 'match_on' => 'users',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f12">Date input (.elgg-input-date):</label>
+ <?php echo elgg_view('input/date', array(
+ 'name' => 'f12',
+ 'id' => 'f12',
+ 'value' => '2012-12-31',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f13">User picker input (.elgg-user-picker):</label>
+ <?php echo elgg_view('input/userpicker', array(
+ 'name' => 'f13',
+ 'id' => 'f13',
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f15">Plain textarea input (.elgg-input-plaintext):</label>
+ <?php echo elgg_view('input/plaintext', array(
+ 'name' => 'f15',
+ 'id' => 'f15',
+ 'value' => $ipsum,
+ ));
+ ?>
+ </div>
+ <div>
+ <label for="f14">Long textarea input (.elgg-input-longtext):</label>
+ <?php echo elgg_view('input/longtext', array(
+ 'name' => 'f14',
+ 'id' => 'f14',
+ 'value' => $ipsum,
+ ));
+ ?>
+ </div>
+ </fieldset>
+</form> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/general.php b/mod/developers/views/default/theme_preview/general.php
new file mode 100644
index 000000000..7d98d4443
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/general.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Quick introduction to the theme sandbox
+ *
+ * @todo links to resources?
+ */
+?>
+
+<p>This theme sandbox provides a visual catalog for many of the theming elements
+ that Elgg uses. The primary css selector is listed with each theme element.
+ The preview is divided into sections that are listed in the page menu
+ (usually in the sidebar but depends on your current theme).
+</p>
+<?php
+$simple_cache = elgg_get_config('simplecache_enabled');
+$system_cache = elgg_get_config('system_cache_enabled');
+
+if ($simple_cache || $system_cache) {
+ $advanced = elgg_view('output/url', array(
+ 'text' => 'Advanced Settings',
+ 'href' => 'admin/settings/advanced',
+ 'is_trusted' => true
+ ));
+ $developers = elgg_view('output/url', array(
+ 'text' => 'Developers\' Plugin Settings',
+ 'href' => 'admin/developers/settings',
+ 'is_trusted' => true
+ ));
+
+ $body = "Caches are enabled. Changes you make to CSS and views might not appear. It is
+ always recommended to disable caches while developing themes and plugins. To
+ disable caches, visit the $advanced or $developers pages.";
+
+ echo elgg_view_module('info', 'Warning', $body);
+}
+?>
+<p>
+<?php
+ echo elgg_view('output/url', array(
+ 'text' => elgg_echo('theme_preview:breakout'),
+ 'href' => current_page_url(),
+ 'target' => '_parent',
+ 'is_trusted' => true,
+ ));
+?>
+</p>
diff --git a/mod/developers/views/default/theme_preview/grid.php b/mod/developers/views/default/theme_preview/grid.php
new file mode 100644
index 000000000..0c4cbb251
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/grid.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Grid CSS
+ */
+
+?>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of1"><div class="elgg-inner"><h3>1/1</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of2"><div class="elgg-inner"><h3>1/2</h3></div></div>
+ <div class="elgg-col elgg-col-1of2"><div class="elgg-inner"><h3>1/2</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of3"><div class="elgg-inner"><h3>1/3</h3></div></div>
+ <div class="elgg-col elgg-col-2of3"><div class="elgg-inner"><h3>2/3</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-3of4"><div class="elgg-inner"><h3>3/4</h3></div></div>
+ <div class="elgg-col elgg-col-1of4"><div class="elgg-inner"><h3>1/4</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of5"><div class="elgg-inner"><h3>1/5</h3></div></div>
+ <div class="elgg-col elgg-col-4of5"><div class="elgg-inner"><h3>4/5</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-3of5"><div class="elgg-inner"><h3>3/5</h3></div></div>
+ <div class="elgg-col elgg-col-2of5"><div class="elgg-inner"><h3>2/5</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of6"><div class="elgg-inner"><h3>1/6</h3></div></div>
+ <div class="elgg-col elgg-col-5of6"><div class="elgg-inner"><h3>5/6</h3></div></div>
+</div>
+<div class="elgg-grid">
+ <style>
+ h3 { text-align: center; }
+ .elgg-col > .elgg-inner {
+ border: 1px solid #cccccc;
+ border-radius: 5px;
+ padding: 5px;
+ }
+ </style>
+ <div class="elgg-col elgg-col-1of5">
+ <div class="elgg-inner">
+ <h3>1/5</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-3of5">
+ <div class="elgg-inner clearfix">
+ <h3>3/5</h3>
+ <div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner">
+ <h3>1/2</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-1of2 elgg-col-last">
+ <div class="elgg-inner">
+ <h3>1/2</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ </div>
+ <div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of3">
+ <div class="elgg-inner">
+ <h3>1/3</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-2of3 elgg-col-last">
+ <div class="elgg-inner">
+ <h3>2/3</h3>
+ <div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of2">
+ <div class="elgg-inner">
+ <h3>1/2</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-1of2 elgg-col-last">
+ <div class="elgg-inner">
+ <h3>1/2</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ </div>
+ <div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of1">
+ <div class="elgg-inner">
+ <h3>1</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-1of5 elgg-col-last">
+ <div class="elgg-inner">
+ <h3>1/5</h3>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing 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.</p>
+ </div>
+ </div>
+</div>
diff --git a/mod/developers/views/default/theme_preview/icons.php b/mod/developers/views/default/theme_preview/icons.php
new file mode 100644
index 000000000..e1684c110
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/icons.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Icons CSS
+ */
+
+echo elgg_view_module('info', 'Icon Sprites (.elgg-icon)', elgg_view('theme_preview/icons/sprites'));
+
+echo elgg_view_module('info', 'Ajax Loader (.elgg-ajax-loader)', elgg_view('theme_preview/icons/loader'));
+
+echo elgg_view_module('info', 'Avatars (.elgg-avatar)', elgg_view('theme_preview/icons/avatars'));
diff --git a/mod/developers/views/default/theme_preview/icons/avatars.php b/mod/developers/views/default/theme_preview/icons/avatars.php
new file mode 100644
index 000000000..3aa1eda26
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/icons/avatars.php
@@ -0,0 +1,36 @@
+<?php
+ $user = new ElggUser();
+ $group = new ElggGroup();
+
+ $sizes = array('large', 'medium', 'small', 'tiny');
+?>
+<table class="elgg-table">
+ <tr>
+ <th></th>
+ <?php
+ foreach ($sizes as $size) {
+ echo "<th>$size</th>";
+ }
+ ?>
+ </tr>
+ <tr>
+ <th>User</th>
+ <?php
+ foreach ($sizes as $size) {
+ echo '<td>';
+ echo elgg_view_entity_icon($user, $size, array('use_hover' => false));
+ echo '</td>';
+ }
+ ?>
+ </tr>
+ <tr>
+ <th>Group</th>
+ <?php
+ foreach ($sizes as $size) {
+ echo '<td>';
+ echo elgg_view_entity_icon($group, $size, array('use_hover' => false));
+ echo '</td>';
+ }
+ ?>
+ </tr>
+</table>
diff --git a/mod/developers/views/default/theme_preview/icons/loader.php b/mod/developers/views/default/theme_preview/icons/loader.php
new file mode 100644
index 000000000..e542da27c
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/icons/loader.php
@@ -0,0 +1 @@
+<?php echo elgg_view('graphics/ajax_loader', array('hidden' => false)); ?> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/icons/sprites.php b/mod/developers/views/default/theme_preview/icons/sprites.php
new file mode 100644
index 000000000..3edb0bd7c
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/icons/sprites.php
@@ -0,0 +1,61 @@
+<?php
+$icons = array(
+ 'arrow-left',
+ 'arrow-right',
+ 'arrow-two-head',
+ 'calendar',
+ 'checkmark',
+ 'clip',
+ 'cursor-drag-arrow',
+ 'delete-alt',
+ 'delete',
+ 'download',
+ 'facebook',
+ 'home',
+ 'hover-menu',
+ 'link',
+ 'mail-alt',
+ 'mail',
+ 'print-alt',
+ 'print',
+ 'push-pin-alt',
+ 'push-pin',
+ 'redo',
+ 'refresh',
+ 'round-arrow-left',
+ 'round-arrow-right',
+ 'round-checkmark',
+ 'round-minus',
+ 'round-plus',
+ 'rss',
+ 'search-focus',
+ 'search',
+ 'settings-alt',
+ 'settings',
+ 'share',
+ 'shop-cart',
+ 'speech-bubble-alt',
+ 'speech-bubble',
+ 'star-alt',
+ 'star-empty',
+ 'star',
+ 'tag',
+ 'thumbs-down-alt',
+ 'thumbs-down',
+ 'thumbs-up-alt',
+ 'thumbs-up',
+ 'trash',
+ 'twitter',
+ 'undo',
+ 'user',
+ 'users',
+);
+?>
+
+<ul class="elgg-gallery">
+<?php
+ foreach ($icons as $icon) {
+ echo "<li title=\".elgg-icon-$icon\" style=\"margin:10px\">" . elgg_view_icon($icon) . "</li>";
+ }
+?>
+</ul> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous.php b/mod/developers/views/default/theme_preview/miscellaneous.php
new file mode 100644
index 000000000..2f4ee4acd
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Miscellaneous and complex components
+ */
+
+$body = elgg_view('theme_preview/miscellaneous/lightbox');
+echo elgg_view_module('info', 'Lightbox (.elgg-lightbox)', $body);
+
+$body = elgg_view('theme_preview/miscellaneous/popup');
+echo elgg_view_module('info', 'Popup (rel=popup)', $body);
+
+$body = elgg_view('theme_preview/miscellaneous/toggle');
+echo elgg_view_module('info', 'Toggle (rel=toggle)', $body);
+
+$body = elgg_view('theme_preview/miscellaneous/system_messages');
+echo elgg_view_module('info', 'System Messages and Errors', $body);
+
+$body = elgg_view('theme_preview/miscellaneous/site_menu');
+echo elgg_view_module('info', 'Site Menu', $body);
+
+$body = elgg_view('theme_preview/miscellaneous/user_hover_menu');
+echo elgg_view_module('info', 'User Icon with Hover Menu', $body); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/lightbox.php b/mod/developers/views/default/theme_preview/miscellaneous/lightbox.php
new file mode 100644
index 000000000..b673c4ee0
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/lightbox.php
@@ -0,0 +1,19 @@
+<?php
+
+elgg_load_js('lightbox');
+elgg_load_css('lightbox');
+
+$ipsum = elgg_view('developers/ipsum');
+
+$link = elgg_view('output/url', array(
+ 'text' => 'Open lighbox',
+ 'href' => "#elgg-lightbox-test",
+ 'class' => 'elgg-lightbox'
+));
+
+echo $link;
+echo '<div class="hidden">';
+echo elgg_view_module('aside', 'Lightbox Test', $ipsum, array(
+ 'id' => 'elgg-lightbox-test'
+));
+echo '</div>'; \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/popup.php b/mod/developers/views/default/theme_preview/miscellaneous/popup.php
new file mode 100644
index 000000000..b711bb7cc
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/popup.php
@@ -0,0 +1,15 @@
+<?php
+
+$ipsum = elgg_view('developers/ipsum');
+
+$link = elgg_view('output/url', array(
+ 'text' => 'Popup content',
+ 'href' => "#elgg-popup-test",
+ 'rel' => 'popup'
+));
+
+echo $link;
+echo elgg_view_module('popup', 'Popup Test', $ipsum, array(
+ 'id' => 'elgg-popup-test',
+ 'class' => 'hidden clearfix developers-content-thin',
+)); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/site_menu.php b/mod/developers/views/default/theme_preview/miscellaneous/site_menu.php
new file mode 100644
index 000000000..e2384b9f7
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/site_menu.php
@@ -0,0 +1,15 @@
+<?php
+
+if (!get_input('site_menu')) {
+ echo elgg_view('output/url', array(
+ 'text' => 'Show Site Menu',
+ 'href' => elgg_http_add_url_query_elements(current_page_url(), array('site_menu' => 1)),
+ 'is_trusted' => true
+ ));
+} else {
+ echo elgg_view('output/url', array(
+ 'text' => 'Hide Site Menu',
+ 'href' => elgg_http_remove_url_query_element(current_page_url(), 'site_menu'),
+ 'is_trusted' => true
+ ));
+} \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/system_messages.php b/mod/developers/views/default/theme_preview/miscellaneous/system_messages.php
new file mode 100644
index 000000000..a6663a3dc
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/system_messages.php
@@ -0,0 +1,35 @@
+<?php
+
+// can't use the ipsum because it includes html when wrapping views.
+$message = elgg_view('output/url', array(
+ 'text' => 'Show system message (system_message())',
+ 'is_trusted' => true,
+ 'href' => '#',
+ 'id' => 'developers-system-message',
+// 'onclick' => "elgg.system_message('Elgg System Message');"
+));
+
+$error = elgg_view('output/url', array(
+ 'text' => 'Show error message (register_error())',
+ 'is_trusted' => true,
+ 'href' => '#',
+ 'id' => 'developers-error-message',
+));
+
+?>
+<script type="text/javascript">
+ $(function() {
+ $('#developers-system-message').click(function() {
+ elgg.system_message('Elgg System Message');
+ })
+
+ $('#developers-error-message').click(function() {
+ elgg.register_error('Elgg Error Message');
+ })
+ });
+</script>
+
+<ul>
+ <li><?php echo $message; ?></li>
+ <li><?php echo $error; ?></li>
+</ul> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/toggle.php b/mod/developers/views/default/theme_preview/miscellaneous/toggle.php
new file mode 100644
index 000000000..abe39ddd8
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/toggle.php
@@ -0,0 +1,15 @@
+<?php
+
+$ipsum = elgg_view('developers/ipsum');
+
+$link = elgg_view('output/url', array(
+ 'text' => 'Toggle content',
+ 'href' => "#elgg-toggle-test",
+ 'rel' => 'toggle'
+));
+
+echo $link;
+echo elgg_view_module('featured', 'Toggle Test', $ipsum, array(
+ 'id' => 'elgg-toggle-test',
+ 'class' => 'hidden clearfix developers-content-thin',
+)); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/miscellaneous/user_hover_menu.php b/mod/developers/views/default/theme_preview/miscellaneous/user_hover_menu.php
new file mode 100644
index 000000000..45331b6e0
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/miscellaneous/user_hover_menu.php
@@ -0,0 +1,16 @@
+<?php
+
+$me = elgg_get_logged_in_user_entity();
+echo elgg_view_entity_icon($me);
+
+// show another user if available
+$users = elgg_get_entities(array(
+ 'type' => 'user',
+ 'wheres' => array("guid != {$me->getGUID()}"),
+ 'limit' => 1
+));
+
+if (is_array($users) && count($users) > 0) {
+ echo elgg_view_entity_icon($users[0]);
+}
+
diff --git a/mod/developers/views/default/theme_preview/modules.php b/mod/developers/views/default/theme_preview/modules.php
new file mode 100644
index 000000000..c46c94296
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/modules.php
@@ -0,0 +1,6 @@
+<?php
+
+echo elgg_view_module('info', 'Modules (.elgg-module)', elgg_view('theme_preview/modules/modules'));
+
+echo elgg_view_module('info', 'Widgets (.elgg-module-widget)', elgg_view('theme_preview/modules/widgets'));
+
diff --git a/mod/developers/views/default/theme_preview/modules/modules.php b/mod/developers/views/default/theme_preview/modules/modules.php
new file mode 100644
index 000000000..04f5917b4
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/modules/modules.php
@@ -0,0 +1,23 @@
+<?php
+
+$ipsum = elgg_view('developers/ipsum');
+
+?>
+<div class="elgg-grid">
+ <div class="elgg-col elgg-col-1of2">
+ <div class="pam">
+ <?php
+ echo elgg_view_module('aside', 'Aside (.elgg-module-aside)', $ipsum);
+ echo elgg_view_module('popup', 'Popup (.elgg-module-popup)', $ipsum);
+ ?>
+ </div>
+ </div>
+ <div class="elgg-col elgg-col-1of2">
+ <div class="pam">
+ <?php
+ echo elgg_view_module('info', 'Info (.elgg-module-info)', $ipsum);
+ echo elgg_view_module('featured', 'Featured (.elgg-module-featured)', $ipsum);
+ ?>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/modules/widgets.php b/mod/developers/views/default/theme_preview/modules/widgets.php
new file mode 100644
index 000000000..8c9fd6483
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/modules/widgets.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Widgets CSS
+ */
+
+$url = current_page_url();
+
+elgg_register_plugin_hook_handler('view', 'widgets/friends/content', 'css_widget_content');
+elgg_register_plugin_hook_handler('view', 'widgets/friends/edit', 'css_widget_content');
+elgg_register_plugin_hook_handler('permissions_check', 'all', 'css_permissions_override');
+
+function css_widget_content() {
+ return $ipsum = elgg_view('developers/ipsum');
+}
+
+function css_permissions_override() {
+ return true;
+}
+
+
+?>
+<div class="elgg-body mal">
+ <?php echo elgg_view('theme_preview/header', $vars); ?>
+<?php
+$w = array();
+for ($i=1; $i<=6; $i++) {
+ $obj = new ElggWidget();
+ $obj->handler = 'friends';
+ $obj->title = "Widget $i";
+ $w[] = $obj;
+}
+$column1 = array($w[0], $w[1]);
+$column2 = array($w[2], $w[3]);
+$column3 = array($w[4], $w[5]);
+$widgets = array(1 => $column1, 2 => $column2, 3 => $column3);
+$num_columns = 3;
+$widget_class = "elgg-col-1of{$num_columns}";
+for ($column_index = 1; $column_index <= $num_columns; $column_index++) {
+ $column_widgets = $widgets[$column_index];
+
+ echo "<div class=\"$widget_class elgg-widgets\" id=\"elgg-widget-col-$column_index\">";
+ if (is_array($column_widgets) && sizeof($column_widgets) > 0) {
+ foreach ($column_widgets as $widget) {
+ echo elgg_view_entity($widget);
+ }
+ }
+ echo '</div>';
+}
+?>
+</div>
+<script type="text/javascript">
+ // widgets do not have guids so we override the edit toggle and delete button
+ $(function() {
+ $('.elgg-widget-edit-button').unbind('click');
+ $('.elgg-widget-edit-button').click(function() {
+ $(this).closest('.elgg-module-widget').find('.elgg-widget-edit').slideToggle('medium');
+ return false;
+ });
+ $('.elgg-widget-delete-button').click(function() {
+ $(this).closest('.elgg-module-widget').remove();
+ return false;
+ });
+ });
+</script>
diff --git a/mod/developers/views/default/theme_preview/navigation.php b/mod/developers/views/default/theme_preview/navigation.php
new file mode 100644
index 000000000..5d3060d10
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Navigation CSS
+ */
+echo elgg_view_module('info', "Tabs (.elgg-tabs)", elgg_view('theme_preview/navigation/tabs'));
+
+echo elgg_view_module('info', "Pagination (.elgg-pagination)", elgg_view('theme_preview/navigation/pagination'));
+
+echo elgg_view_module('info', "Site Menu (.elgg-menu-site)", elgg_view('theme_preview/navigation/site'));
+
+echo elgg_view_module('info', "Breadcrumbs (.elgg-breadcrumbs)", elgg_view('theme_preview/navigation/breadcrumbs'));
+
+echo elgg_view_module('info', "Page Menu (.elgg-menu-page)", elgg_view('theme_preview/navigation/page'));
+
+echo elgg_view_module('info', "Filter Menu (.elgg-menu-filter)", elgg_view('theme_preview/navigation/filter'));
+
+echo elgg_view_module('info', "Extras Menu (.elgg-menu-extras and .elgg-menu-hz)", elgg_view('theme_preview/navigation/extras'));
+
+echo elgg_view_module('info', "Entity Menu (.elgg-menu-entity and .elgg-menu-hz)", elgg_view('theme_preview/navigation/entity'));
+
+echo elgg_view_module('info', "Owner Block Menu (.elgg-menu-owner-block)", elgg_view('theme_preview/navigation/owner_block'));
+
+echo elgg_view_module('info', "Footer Menu (.elgg-menu-footer)", elgg_view('theme_preview/navigation/footer'));
diff --git a/mod/developers/views/default/theme_preview/navigation/breadcrumbs.php b/mod/developers/views/default/theme_preview/navigation/breadcrumbs.php
new file mode 100644
index 000000000..0439bd577
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/breadcrumbs.php
@@ -0,0 +1,10 @@
+<?php
+elgg_push_breadcrumb('First', "#");
+elgg_push_breadcrumb('Second', "#");
+elgg_push_breadcrumb('Third');
+
+echo elgg_view('navigation/breadcrumbs', array('class' => mts));
+
+elgg_pop_breadcrumb();
+elgg_pop_breadcrumb();
+elgg_pop_breadcrumb();
diff --git a/mod/developers/views/default/theme_preview/navigation/default.php b/mod/developers/views/default/theme_preview/navigation/default.php
new file mode 100644
index 000000000..6efcd8890
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/default.php
@@ -0,0 +1,11 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+
+echo elgg_view('navigation/menu/default', $params);
diff --git a/mod/developers/views/default/theme_preview/navigation/entity.php b/mod/developers/views/default/theme_preview/navigation/entity.php
new file mode 100644
index 000000000..465585b00
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/entity.php
@@ -0,0 +1,12 @@
+<?php
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+$params['menu']['default'][] = new ElggMenuItem(1, "Public", false);
+$params['menu']['default'][] = new ElggMenuItem(2, "Edit", "#");
+$params['menu']['default'][] = new ElggMenuItem(3, elgg_view_icon('thumbs-up'), "#");
+$params['name'] = 'entity';
+$params['class'] = 'elgg-menu-hz';
+
+echo elgg_view('navigation/menu/default', $params);
+
diff --git a/mod/developers/views/default/theme_preview/navigation/extras.php b/mod/developers/views/default/theme_preview/navigation/extras.php
new file mode 100644
index 000000000..01bc6d434
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/extras.php
@@ -0,0 +1,18 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+$params['menu']['default'][] = new ElggMenuItem(1, elgg_view_icon('push-pin-alt'), "#");
+$params['menu']['default'][] = new ElggMenuItem(2, elgg_view_icon('rss'), "#");
+$params['menu']['default'][] = new ElggMenuItem(3, elgg_view_icon('star-alt'), "#");
+$params['name'] = 'extras';
+$params['class'] = 'elgg-menu-hz';
+
+?>
+
+<div class="elgg-sidebar">
+<?php
+ echo elgg_view('navigation/menu/default', $params);
+?>
+</div> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/navigation/filter.php b/mod/developers/views/default/theme_preview/navigation/filter.php
new file mode 100644
index 000000000..70cd31d2a
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/filter.php
@@ -0,0 +1,13 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+
+$params['name'] = 'filter';
+
+echo elgg_view('navigation/menu/default', $params);
diff --git a/mod/developers/views/default/theme_preview/navigation/footer.php b/mod/developers/views/default/theme_preview/navigation/footer.php
new file mode 100644
index 000000000..92a1bb43c
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/footer.php
@@ -0,0 +1,10 @@
+<?php
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['name'] = 'footer';
+
+echo elgg_view('navigation/menu/default', $params);
diff --git a/mod/developers/views/default/theme_preview/navigation/horizontal.php b/mod/developers/views/default/theme_preview/navigation/horizontal.php
new file mode 100644
index 000000000..44e04cd7c
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/horizontal.php
@@ -0,0 +1,12 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+$params['class'] = 'elgg-menu-hz';
+
+echo elgg_view('navigation/menu/default', $params);
diff --git a/mod/developers/views/default/theme_preview/navigation/owner_block.php b/mod/developers/views/default/theme_preview/navigation/owner_block.php
new file mode 100644
index 000000000..f5f203947
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/owner_block.php
@@ -0,0 +1,13 @@
+<?php
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+$params['name'] = 'owner-block';
+
+echo '<div class="elgg-sidebar">';
+echo elgg_view('navigation/menu/default', $params);
+echo '</div>';
diff --git a/mod/developers/views/default/theme_preview/navigation/page.php b/mod/developers/views/default/theme_preview/navigation/page.php
new file mode 100644
index 000000000..1da6a1fd9
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/page.php
@@ -0,0 +1,20 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+
+$m = new ElggMenuItem(10, "Child", "#");
+$m->setParent($params['menu']['default'][1]);
+$params['menu']['default'][1]->addChild($m);
+?>
+
+<div class="elgg-sidebar">
+<?php
+ echo elgg_view('navigation/menu/page', $params);
+?>
+</div> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/navigation/pagination.php b/mod/developers/views/default/theme_preview/navigation/pagination.php
new file mode 100644
index 000000000..f5e1b632d
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/pagination.php
@@ -0,0 +1,8 @@
+<?php
+$params = array(
+ 'count' => 1000,
+ 'limit' => 10,
+ 'offset' => 230,
+);
+
+echo elgg_view('navigation/pagination', $params); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/navigation/site.php b/mod/developers/views/default/theme_preview/navigation/site.php
new file mode 100644
index 000000000..90bb8ff46
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/site.php
@@ -0,0 +1,18 @@
+<?php
+
+$params = array();
+$params['menu'] = array();
+$params['menu']['default'] = array();
+for ($i=1; $i<=5; $i++) {
+ $params['menu']['default'][] = new ElggMenuItem($i, "Page $i", "#");
+}
+$params['menu']['default'][2]->setSelected(true);
+?>
+
+<div class="elgg-page-header">
+ <div class="elgg-inner">
+ <?php
+ echo elgg_view('navigation/menu/site', $params);
+ ?>
+ </div>
+</div>
diff --git a/mod/developers/views/default/theme_preview/navigation/tabs.php b/mod/developers/views/default/theme_preview/navigation/tabs.php
new file mode 100644
index 000000000..dd282dc83
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/navigation/tabs.php
@@ -0,0 +1,10 @@
+<?php
+$params = array(
+ 'tabs' => array(
+ array('title' => 'First', 'url' => "#"),
+ array('title' => 'Second', 'url' => "#", 'selected' => true),
+ array('title' => 'Third', 'url' => "#"),
+ )
+);
+
+echo elgg_view('navigation/tabs', $params); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/typography.php b/mod/developers/views/default/theme_preview/typography.php
new file mode 100644
index 000000000..7a6328cf9
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/typography.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * General CSS
+ */
+
+echo elgg_view_module('info', "Headings", elgg_view('theme_preview/typography/headings'));
+
+echo elgg_view_module('info', "Fonts", elgg_view('theme_preview/typography/fonts'));
+
+echo elgg_view_module('info', "Paragraph", elgg_view('theme_preview/typography/paragraph'));
+
+echo elgg_view_module('info', "Misc", elgg_view('theme_preview/typography/misc')); \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/typography/fonts.php b/mod/developers/views/default/theme_preview/typography/fonts.php
new file mode 100644
index 000000000..dd3c53f00
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/typography/fonts.php
@@ -0,0 +1,7 @@
+<ul>
+ <li>Lorem ipsum dolor sit amet (body)</li>
+ <li><span class="elgg-text-help" style="display: inline;">Lorem ipsum dolor sit amet</span> (.elgg-text-help)</li>
+ <li><span class="elgg-quiet">Lorem ipsum dolor sit amet</span> (.elgg-quiet)</li>
+ <li><span class="elgg-loud">Lorem ipsum dolor sit amet</span> (.elgg-loud)</li>
+ <li><span class="elgg-monospace">Lorem ipsum dolor sit amet</span> (.elgg-monospace)</li>
+</ul> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/typography/headings.php b/mod/developers/views/default/theme_preview/typography/headings.php
new file mode 100644
index 000000000..d843853e3
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/typography/headings.php
@@ -0,0 +1,6 @@
+<h1>Level 1 heading</h1>
+<h2>Level 2 heading</h2>
+<h3>Level 3 heading</h3>
+<h4>Level 4 heading</h4>
+<h5>Level 5 heading</h5>
+<h6>Level 6 heading</h6> \ No newline at end of file
diff --git a/mod/developers/views/default/theme_preview/typography/misc.php b/mod/developers/views/default/theme_preview/typography/misc.php
new file mode 100644
index 000000000..0b9fd9db7
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/typography/misc.php
@@ -0,0 +1,16 @@
+<ul>
+ <li>I am <a href="?abc123">the a tag</a> example</li>
+ <li>I am <abbr title="test">the abbr tag</abbr> example</li>
+ <li>I am <acronym>the acronym tag</acronym> example</li>
+ <li>I am <b>the b tag</b> example</li>
+ <li>I am <code>the code tag</code> example</li>
+ <li>I am <del>the del tag</del> example</li>
+ <li>I am <em>the em tag</em> example</li>
+ <li>I am <i>the i tag</i> example</li>
+ <li>I am <strong>the strong tag</strong> example</li>
+</ul>
+<blockquote><p>Paragraph inside Blockquote: <?php echo $ipsum; ?></p></blockquote>
+<pre>
+ <strong>Preformated:</strong>Testing one row
+ and another
+</pre>
diff --git a/mod/developers/views/default/theme_preview/typography/paragraph.php b/mod/developers/views/default/theme_preview/typography/paragraph.php
new file mode 100644
index 000000000..a3a7b2cfa
--- /dev/null
+++ b/mod/developers/views/default/theme_preview/typography/paragraph.php
@@ -0,0 +1,19 @@
+<p>Lorem ipsum dolor sit amet, <a href="#" title="test link">test link</a>
+adipiscing elit. Nullam dignissim convallis est. Quisque aliquam. Donec
+faucibus. Nunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero
+nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent
+mattis, massa quis luctus <strong>strong</strong>, turpis mi volutpat justo, eu
+volutpat enim diam eget metus. Maecenas ornare tortor. Donec sed tellus
+eget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem,
+consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue
+quis tellus.</p>
+
+<p>Lorem ipsum dolor sit amet, <em>emphasis</em> consectetuer
+adipiscing elit. Nullam dignissim convallis est. Quisque aliquam. Donec
+faucibus. Nunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero
+nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent
+mattis, massa quis luctus fermentum, turpis mi volutpat justo, eu
+volutpat enim diam eget metus. Maecenas ornare tortor. Donec sed tellus
+eget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem,
+consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue
+quis tellus.</p> \ No newline at end of file
diff --git a/mod/diagnostics/actions/download.php b/mod/diagnostics/actions/download.php
new file mode 100644
index 000000000..97775c92e
--- /dev/null
+++ b/mod/diagnostics/actions/download.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Elgg diagnostics
+ *
+ * @package ElggDiagnostics
+ */
+
+$output = elgg_echo('diagnostics:header', array(date('r'), elgg_get_logged_in_user_entity()->name));
+$output = elgg_trigger_plugin_hook('diagnostics:report', 'system', null, $output);
+
+header("Cache-Control: public");
+header("Content-Description: File Transfer");
+header('Content-disposition: attachment; filename=elggdiagnostic.txt');
+header("Content-Type: text/plain");
+header('Content-Length: ' . strlen($output));
+
+echo $output;
+exit;
diff --git a/mod/diagnostics/languages/en.php b/mod/diagnostics/languages/en.php
new file mode 100644
index 000000000..54859941d
--- /dev/null
+++ b/mod/diagnostics/languages/en.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Elgg diagnostics language pack.
+ *
+ * @package ElggDiagnostics
+ */
+
+$english = array(
+ 'admin:administer_utilities:diagnostics' => 'System Diagnostics',
+ 'diagnostics' => 'System diagnostics',
+ 'diagnostics:report' => 'Diagnostics Report',
+ 'diagnostics:description' => 'The following diagnostic report can be useful for diagnosing problems with Elgg. The developers of Elgg may request that you attach it to a bug report.',
+ 'diagnostics:download' => 'Download',
+ 'diagnostics:header' => '========================================================================
+Elgg Diagnostic Report
+Generated %s by %s
+========================================================================
+
+',
+ 'diagnostics:report:basic' => '
+Elgg Release %s, version %s
+
+------------------------------------------------------------------------',
+ 'diagnostics:report:php' => '
+PHP info:
+%s
+------------------------------------------------------------------------',
+ 'diagnostics:report:plugins' => '
+Installed plugins and details:
+
+%s
+------------------------------------------------------------------------',
+ 'diagnostics:report:md5' => '
+Installed files and checksums:
+
+%s
+------------------------------------------------------------------------',
+ 'diagnostics:report:globals' => '
+Global variables:
+
+%s
+------------------------------------------------------------------------',
+);
+
+add_translation("en", $english);
diff --git a/mod/diagnostics/manifest.xml b/mod/diagnostics/manifest.xml
new file mode 100644
index 000000000..21e847d22
--- /dev/null
+++ b/mod/diagnostics/manifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Diagnostics</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <category>development</category>
+ <category>admin</category>
+ <description>Elgg diagnostics tool</description>
+ <website>http://www.elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+</plugin_manifest>
diff --git a/mod/diagnostics/start.php b/mod/diagnostics/start.php
new file mode 100644
index 000000000..55842800a
--- /dev/null
+++ b/mod/diagnostics/start.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Elgg diagnostics
+ *
+ * @package ElggDiagnostics
+ */
+
+elgg_register_event_handler('init', 'system', 'diagnostics_init');
+
+/**
+ * Initialise the diagnostics tool
+ */
+function diagnostics_init() {
+
+ // Add admin menu item
+ elgg_register_admin_menu_item('administer', 'diagnostics', 'administer_utilities');
+
+ // Register some actions
+ $file = elgg_get_plugins_path() . "diagnostics/actions/download.php";
+ elgg_register_action("diagnostics/download", $file, 'admin');
+}
+
+/**
+ * Generate a basic report.
+ *
+ * @return string
+ */
+function diagnostics_basic_hook($hook, $entity_type, $returnvalue, $params) {
+
+ // Get version information
+ $version = get_version();
+ $release = get_version(true);
+
+ $returnvalue .= elgg_echo('diagnostics:report:basic', array($release, $version));
+
+ return $returnvalue;
+}
+
+/**
+ * Get some information about the plugins installed on the system.
+ *
+ * @return tring
+ */
+function diagnostics_plugins_hook($hook, $entity_type, $returnvalue, $params) {
+ // @todo this is a really bad idea because of the new plugin system
+ //$returnvalue .= elgg_echo('diagnostics:report:plugins', array(print_r(elgg_get_plugins(), true)));
+
+ return $returnvalue;
+}
+
+/**
+ * Recursively list through a directory tree producing a hash of all installed files
+ *
+ * @param starting dir $dir
+ * @param buffer $buffer
+ */
+function diagnostics_md5_dir($dir) {
+ $extensions_allowed = array('.php', '.js', '.css');
+
+ $buffer = "";
+
+ if (in_array(strrchr(trim($dir, "/"), '.'), $extensions_allowed)) {
+ $dir = rtrim($dir, "/");
+ $buffer .= md5_file($dir). " " . $dir . "\n";
+ } else if (is_dir($dir)) {
+ $handle = opendir($dir);
+ while ($file = readdir($handle)) {
+ if (($file != '.') && ($file != '..')) {
+ $buffer .= diagnostics_md5_dir($dir . $file. "/", $buffer);
+ }
+ }
+
+ closedir($handle);
+ }
+
+ return $buffer;
+}
+
+/**
+ * Get some information about the files installed on a system.
+ *
+ * @return string
+ */
+function diagnostics_sigs_hook($hook, $entity_type, $returnvalue, $params) {
+
+ $base_dir = elgg_get_root_path();
+ $returnvalue .= elgg_echo('diagnostics:report:md5', array(diagnostics_md5_dir($base_dir)));
+
+ return $returnvalue;
+}
+
+/**
+ * Get some information about the php install
+ *
+ * @return string
+ */
+function diagnostics_phpinfo_hook($hook, $entity_type, $returnvalue, $params) {
+
+ ob_start();
+ phpinfo();
+ $phpinfo = array('phpinfo' => array());
+
+ if (preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) {
+
+ foreach ($matches as $match) {
+ if (strlen($match[1])) {
+ $phpinfo[$match[1]] = array();
+ } else if(isset($match[3])) {
+ $phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
+ } else {
+ $phpinfo[end(array_keys($phpinfo))][] = $match[2];
+ }
+ }
+ }
+
+ $returnvalue .= elgg_echo('diagnostics:report:php', array(print_r($phpinfo, true)));
+
+ return $returnvalue;
+}
+
+/**
+ * Get global variables.
+ *
+ * @return string
+ */
+function diagnostics_globals_hook($hook, $entity_type, $returnvalue, $params) {
+ global $CONFIG;
+
+ $output = str_replace($CONFIG->dbpass, '<<DBPASS>>', print_r($GLOBALS, true));
+ $returnvalue .= elgg_echo('diagnostics:report:globals', array($output));
+
+ return $returnvalue;
+}
+
+elgg_register_plugin_hook_handler("diagnostics:report", "system", "diagnostics_basic_hook", 0); // show basics first
+elgg_register_plugin_hook_handler("diagnostics:report", "system", "diagnostics_plugins_hook", 2); // Now the plugins
+elgg_register_plugin_hook_handler("diagnostics:report", "system", "diagnostics_sigs_hook", 1); // Now the signatures
+
+elgg_register_plugin_hook_handler("diagnostics:report", "system", "diagnostics_globals_hook"); // Global variables
+elgg_register_plugin_hook_handler("diagnostics:report", "system", "diagnostics_phpinfo_hook"); // PHP info
diff --git a/mod/diagnostics/views/default/admin/administer_utilities/diagnostics.php b/mod/diagnostics/views/default/admin/administer_utilities/diagnostics.php
new file mode 100644
index 000000000..c7ff3d5fc
--- /dev/null
+++ b/mod/diagnostics/views/default/admin/administer_utilities/diagnostics.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Diagnostics admin page
+ */
+
+$diagnostics_title = elgg_echo('diagnostics:report');
+$diagnostics = '<p>' . elgg_echo('diagnostics:description') .'</p>';
+$params = array(
+ 'text' => elgg_echo('diagnostics:download'),
+ 'href' => 'action/diagnostics/download',
+ 'class' => 'elgg-button elgg-button-submit',
+ 'is_action' => true,
+ 'is_trusted' => true,
+);
+$diagnostics .= '<p>' . elgg_view('output/url', $params) . '</p>';
+
+echo elgg_view_module('inline', $diagnostics_title, $diagnostics, array('class' => 'elgg-form-settings'));
diff --git a/mod/dokuwiki/AUTHORS b/mod/dokuwiki/AUTHORS
new file mode 100644
index 000000000..83b5cf583
--- /dev/null
+++ b/mod/dokuwiki/AUTHORS
@@ -0,0 +1,2 @@
+Pablo Martin <devel@lorea.cc>
+Sem <sembrestels@n-1.cc>
diff --git a/mod/dokuwiki/COPYING b/mod/dokuwiki/COPYING
new file mode 100755
index 000000000..60549be51
--- /dev/null
+++ b/mod/dokuwiki/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/mod/dokuwiki/README b/mod/dokuwiki/README
new file mode 100644
index 000000000..40e1f52ec
--- /dev/null
+++ b/mod/dokuwiki/README
@@ -0,0 +1,31 @@
+Elgg dokuwiki integration
+------------------------
+
+Adds wikis for groups, and integrates the user and permission system of elgg.
+
+NOTES:
+------------------------
+- Although the goal is to be able to use vanilla dokuwiki with maybe some extensions,
+ at the moment we provide a slightly modified version.
+- doku.php globals are not known, and had to be redeclared.
+- $_REQUEST not defined... dont know the reason but its something of elgg. -> yes elgg is mangling it... **had to comment it on elgg core**
+- acl is hardcoded, added a getACL method on the auth class to be able to generate
+ the acl on the fly... also setACL and modified the admin plugin to be able to use the auth backend.
+- uses an 'elgg' auth module, and a special dokuwiki template.
+- dokuwiki defines the javascript $ symbol, which conflicts with elgg usage of jquery, so had to change all usage inside dokuwiki (just a few instances).
+
+LICENSE:
+-----------------------
+- elgg plugin uses GPLv2. dokuwiki and mods (all under vendors/dokuwiki) go with original license to original copyright holders.
+
+REPO:
+-----------------------
+You can follow code changes or submit tickets at: https://github.com/lorea/dokuwiki
+
+TODO:
+------------------------
+- Maybe just one big wiki for the whole site using namespaces?
+
+---
+devel@lorea.cc
+
diff --git a/mod/dokuwiki/index.php b/mod/dokuwiki/index.php
new file mode 100644
index 000000000..e4e039f51
--- /dev/null
+++ b/mod/dokuwiki/index.php
@@ -0,0 +1,17 @@
+<?php
+
+ elgg_push_breadcrumb(elgg_echo('dokuwiki'));
+ $offset = (int)get_input('offset', 0);
+ $title = elgg_echo("dokuwiki:title");
+ $content = elgg_list_entities(array('subtype'=>'dokuwiki', 'offset'=>$offset, 'types'=>'object','full_view'=>false));
+ $body = elgg_view_layout('content', array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => '',
+ ));
+
+ // Finally draw the page
+ echo elgg_view_page($title, $body);
+
+
+?>
diff --git a/mod/dokuwiki/languages/ca.php b/mod/dokuwiki/languages/ca.php
new file mode 100644
index 000000000..ca2c0df1e
--- /dev/null
+++ b/mod/dokuwiki/languages/ca.php
@@ -0,0 +1,18 @@
+<?php
+$language = array (
+ 'dokuwiki:wiki' => 'Wiki',
+ 'dokuwiki:title' => 'Wikis',
+ 'item:object:dokuwiki' => 'Wikis',
+ 'dokuwiki:wikifrom' => 'la wiki de %s',
+ 'dokuwiki:pages' => '%s pàgines',
+ 'dokuwiki:dokuwiki' => 'Wiki',
+ 'dokuwiki:group' => 'Wiki del group',
+ 'dokuwiki:userwiki' => 'La meva Wiki',
+ 'dokuwiki:sidebar' => 'Navegació wiki',
+ 'groups:enabledokuwiki' => 'Activar la wiki del grup',
+ 'groups:enabledokuwiki_frontpage' => 'Mostra la pàgina d\'inici de la wiki a la pàgina principal del grup (només si la wiki està activada)',
+ 'groups:enabledokuwiki_frontsidebar' => 'Mostra la barra lateral de la wiki a la pàgina principal del grup (només si la wiki està activada)',
+ 'dokuwiki' => 'Wikis',
+ 'dokuwiki:river:modified' => '%s ha modificat la pàgina %s el %s',
+);
+add_translation("ca", $language); \ No newline at end of file
diff --git a/mod/dokuwiki/languages/de.php b/mod/dokuwiki/languages/de.php
new file mode 100755
index 000000000..e951d0b41
--- /dev/null
+++ b/mod/dokuwiki/languages/de.php
@@ -0,0 +1,21 @@
+<?php
+
+// Mit dem translation browser generiert
+
+$german = array(
+ 'dokuwiki:wiki' => "Wiki" ,
+ 'dokuwiki:groupwiki' => "GruppenWiki" ,
+ 'dokuwiki:userwiki' => "Mein Wiki" ,
+ 'dokuwiki' => "Wikis" ,
+ 'item:object:dokuwiki' => "Wikis" ,
+ 'dokuwiki:title' => "Wikis" ,
+ 'dokuwiki:wikifrom' => "Wiki von %s" ,
+ 'dokuwiki:pages' => "Seiten von %s" ,
+ 'dokuwiki:dokuwiki' => "Wiki" ,
+ 'groups:enabledokuwiki' => "GruppenWiki einrichten" ,
+ 'dokuwiki:river:modified' => "%s hat die Seite %s im %s bearbeitet"
+);
+
+add_translation('de', $german);
+
+?> \ No newline at end of file
diff --git a/mod/dokuwiki/languages/en.php b/mod/dokuwiki/languages/en.php
new file mode 100755
index 000000000..20b7cb656
--- /dev/null
+++ b/mod/dokuwiki/languages/en.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Elgg spotlight lorea
+ *
+ * @package
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author lorea
+ * @copyright lorea
+ * @link http://lorea.cc
+ */
+
+ $english = array(
+ "dokuwiki:wiki"=>'Wiki',
+ "dokuwiki:title"=>'Wikis',
+ "item:object:dokuwiki"=>'Wikis',
+ "dokuwiki:wikifrom"=>'%s wiki',
+ "dokuwiki:pages"=>'%s pages',
+ "dokuwiki:dokuwiki"=>'Wiki',
+ "dokuwiki:group"=>'Group wiki',
+ "dokuwiki:userwiki"=>'My Wiki',
+ "dokuwiki:sidebar" => 'Wiki navigation',
+ "groups:enabledokuwiki"=>'Enable group wiki',
+ "groups:enabledokuwiki_frontpage"=>'Show main wiki page in the group front page (only if wiki is enabled)',
+ "groups:enabledokuwiki_frontsidebar"=>'Show wiki sidebar in the group front page (only if wiki is enabled)',
+ "dokuwiki"=>'Wikis',
+
+ "dokuwiki:river:modified"=>'%s modified page %s on %s',
+ );
+
+ add_translation("en",$english);
+
+?>
diff --git a/mod/dokuwiki/languages/es.php b/mod/dokuwiki/languages/es.php
new file mode 100644
index 000000000..613d79ba6
--- /dev/null
+++ b/mod/dokuwiki/languages/es.php
@@ -0,0 +1,18 @@
+<?php
+$language = array (
+ 'dokuwiki:wiki' => 'Wiki',
+ 'dokuwiki:title' => 'Wikis',
+ 'item:object:dokuwiki' => 'Wikis',
+ 'dokuwiki:wikifrom' => 'Wiki %s',
+ 'dokuwiki:pages' => 'páginas %s',
+ 'dokuwiki:dokuwiki' => 'Wiki',
+ 'dokuwiki:group' => 'Wiki del grupo',
+ 'dokuwiki:userwiki' => 'Mi wiki',
+ 'dokuwiki:sidebar' => 'Navegación wiki',
+ 'groups:enabledokuwiki' => 'Activar wiki del grupo',
+ 'groups:enabledokuwiki_frontpage' => 'Muestra la página principal de la wiki en la página principal del grupo (sólo si la wiki está activada)',
+ 'groups:enabledokuwiki_frontsidebar' => 'Muestra la barra lateral de wiki en la página principal del grupo (sólo si la wiki está activada)',
+ 'dokuwiki' => 'Wikis',
+ 'dokuwiki:river:modified' => '%s ha modificado la página %s en %s',
+);
+add_translation("es", $language); \ No newline at end of file
diff --git a/mod/dokuwiki/languages/fr.php b/mod/dokuwiki/languages/fr.php
new file mode 100644
index 000000000..dcaa14c00
--- /dev/null
+++ b/mod/dokuwiki/languages/fr.php
@@ -0,0 +1,12 @@
+<?php
+
+// Generate By translationbrowser.
+
+$french = array(
+ 'dokuwiki:userwiki' => "Mon wiki" ,
+ 'groups:enabledokuwiki' => "Habiliter le wiki groupe"
+);
+
+add_translation('fr', $french);
+
+?> \ No newline at end of file
diff --git a/mod/dokuwiki/languages/gl.php b/mod/dokuwiki/languages/gl.php
new file mode 100644
index 000000000..ba67b6f32
--- /dev/null
+++ b/mod/dokuwiki/languages/gl.php
@@ -0,0 +1,23 @@
+<?php
+
+// Xerado por translationbrowser
+
+$galician = array(
+ 'dokuwiki:wiki' => "Wiki" ,
+ 'dokuwiki:groupwiki' => "Wiki do grupo" ,
+ 'dokuwiki:userwiki' => "A miña Wiki" ,
+ 'dokuwiki' => "Wikis" ,
+ 'item:object:dokuwiki' => "Wikis" ,
+ 'dokuwiki:title' => "Wikis" ,
+ 'dokuwiki:wikifrom' => "%s wiki" ,
+ 'dokuwiki:pages' => "%s páxinas" ,
+ 'dokuwiki:dokuwiki' => "Wiki" ,
+ 'groups:enabledokuwiki' => "Habilitar wiki do grupo" ,
+ 'dokuwiki:river:modified' => "%s modificou a páxina %s en %s" ,
+ 'groups:enabledokuwiki_frontpage' => "Amosa la wiki na portada do grupo" ,
+ 'groups:enabledokuwiki_frontsidebar' => "Amosa la barra da wiki na portada do grupo"
+);
+
+add_translation('gl', $galician);
+
+?> \ No newline at end of file
diff --git a/mod/dokuwiki/languages/pl.php b/mod/dokuwiki/languages/pl.php
new file mode 100755
index 000000000..e43e14526
--- /dev/null
+++ b/mod/dokuwiki/languages/pl.php
@@ -0,0 +1,21 @@
+<?php
+
+// Generate By translationbrowser.
+
+$polish = array(
+ 'dokuwiki:wiki' => "Wiki" ,
+ 'dokuwiki:title' => "Wiki" ,
+ 'item:object:dokuwiki' => "Wiki" ,
+ 'dokuwiki:wikifrom' => "%s wiki" ,
+ 'dokuwiki:pages' => "%s strony" ,
+ 'dokuwiki:dokuwiki' => "Wiki" ,
+ 'dokuwiki:groupwiki' => "Wiki Grupy" ,
+ 'dokuwiki:userwiki' => "Twoje Wiki" ,
+ 'groups:enabledokuwiki' => "Włącz wiki grupy" ,
+ 'dokuwiki' => "Wiki" ,
+ 'dokuwiki:river:modified' => "%s modyfikacja strony %s na %s"
+);
+
+add_translation('pl', $polish);
+
+?> \ No newline at end of file
diff --git a/mod/dokuwiki/languages/pt.php b/mod/dokuwiki/languages/pt.php
new file mode 100644
index 000000000..4c067cd52
--- /dev/null
+++ b/mod/dokuwiki/languages/pt.php
@@ -0,0 +1,23 @@
+<?php
+
+// Gerado pelo browser de tradução.
+
+$portuguese = array(
+ 'dokuwiki:wiki' => "Wiki" ,
+ 'dokuwiki:title' => "Wikis" ,
+ 'dokuwiki:wikifrom' => "%s Wiki" ,
+ 'dokuwiki:pages' => "%s páginas" ,
+ 'dokuwiki:dokuwiki' => "Wiki" ,
+ 'dokuwiki:groupwiki' => "Wiki" ,
+ 'dokuwiki:userwiki' => "Minha Wiki" ,
+ 'groups:enabledokuwiki' => "Habilitar Wiki do grupo" ,
+ 'dokuwiki' => "Wikis" ,
+ 'dokuwiki:river:modified' => "%s modificou a página %s em %s" ,
+ 'item:object:dokuwiki' => "Wikis" ,
+ 'groups:enabledokuwiki_frontpage' => "Mostrar a página wiki principal na página principal do grupo (só se a wiki estiver habilitada)" ,
+ 'groups:enabledokuwiki_frontsidebar' => "Mostrar a barra lateral de wiki na página principal do grupo (só se a wiki estiver habilitada)"
+);
+
+add_translation('pt', $portuguese);
+
+?>
diff --git a/mod/dokuwiki/lib/dokuwiki.php b/mod/dokuwiki/lib/dokuwiki.php
new file mode 100644
index 000000000..b49e4d4ee
--- /dev/null
+++ b/mod/dokuwiki/lib/dokuwiki.php
@@ -0,0 +1,60 @@
+<?php
+
+function current_dokuwiki_entity($create = true) {
+ $page_owner = elgg_get_page_owner_guid();
+ $user = elgg_get_logged_in_user_entity();
+ //error_log($page_owner->guid);
+ //error_log($user->guid);
+ if (!$page_owner)
+ $page_owner = 0;
+ $entities = elgg_get_entities(array('types' => 'object', 'subtypes' => 'dokuwiki', 'limit' => 1, 'owner_guid' => $page_owner));
+ if ($entities) {
+ $doku = $entities[0];
+ return $doku;
+ }
+ elseif ($user && $create) {
+ elgg_set_ignore_access(true);
+ $newdoku = new ElggObject();
+ $newdoku->access_id = ACCESS_PUBLIC;
+ $newdoku->owner_guid = $page_owner;
+ $newdoku->subtype = 'dokuwiki';
+ $newdoku->container_guid = $page_owner;
+ $newdoku->save();
+ $acl = array();
+ $acl[] = "# acl.auth.php";
+ $acl[] = '# <?php exit()?\>';
+ $acl[] = "* @ALL 0";
+ $acl[] = "* @user 1";
+ $acl[] = "* @member 8";
+ $acl[] = "* @admin 16";
+ $acl[] = "* @root 255";
+ $newdoku->wiki_acl = implode("\n", $acl)."\n";
+ elgg_set_ignore_access(false);
+ return $newdoku;
+ }
+}
+
+function dokuwiki_recurse_copy($src,$dst) {
+ $dir = opendir($src);
+ @mkdir($dst);
+ while(false !== ( $file = readdir($dir)) ) {
+ if (( $file != '.' ) && ( $file != '..' )) {
+ if ( is_dir($src . '/' . $file) ) {
+ dokuwiki_recurse_copy($src . '/' . $file,$dst . '/' . $file);
+ }
+ else {
+ copy($src . '/' . $file,$dst . '/' . $file);
+ }
+ }
+ }
+ closedir($dir);
+}
+
+function dokuwiki_create_datafolder($path) {
+ if (is_dir($path)) // if it exists must be already created
+ return;
+ mkdir($path, 0700, true);
+ $orig = elgg_get_plugins_path().'dokuwiki/vendors/dokuwiki/data';
+ dokuwiki_recurse_copy($orig, $path);
+
+}
diff --git a/mod/dokuwiki/manifest.xml b/mod/dokuwiki/manifest.xml
new file mode 100644
index 000000000..ed2969216
--- /dev/null
+++ b/mod/dokuwiki/manifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Dokuwiki</name>
+ <author>Lorea developers</author>
+ <version>1.8.0</version>
+ <category>content</category>
+ <description>Dokuwiki integration for Elgg</description>
+ <website>https://lorea.org/</website>
+ <copyright>(C) Lorea 2011-2013</copyright>
+ <license>GNU General Public License, version 2 or later</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <requires>
+ <type>priority</type>
+ <priority>after</priority>
+ <plugin>groups</plugin>
+ </requires>
+ <activate_on_install>true</activate_on_install>
+</plugin_manifest>
diff --git a/mod/dokuwiki/start.php b/mod/dokuwiki/start.php
new file mode 100644
index 000000000..05c7c01f2
--- /dev/null
+++ b/mod/dokuwiki/start.php
@@ -0,0 +1,168 @@
+<?php
+/**
+ * Elgg dokuwiki plugin
+ *
+ * @package
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
+ * @author lorea
+ * @copyright lorea
+ * @link http://lorea.cc
+ */
+
+elgg_register_event_handler('init','system','dokuwiki_init');
+
+function dokuwiki_init(){
+
+ elgg_register_library('elgg:dokuwiki', elgg_get_plugins_path().'dokuwiki/lib/dokuwiki.php');
+
+ elgg_register_entity_type('object','dokuwiki');
+ elgg_register_plugin_hook_handler('entity:icon:url', 'object', 'dokuwiki_icon_hook');
+ elgg_register_entity_url_handler('object', 'dokuwiki', 'dokuwiki_url');
+
+ // add block link to
+ elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'dokuwiki_owner_block_menu');
+
+ elgg_register_page_handler('dokuwiki','dokuwiki_page_handler');
+
+ add_group_tool_option('dokuwiki',elgg_echo('groups:enabledokuwiki'),false);
+ add_group_tool_option('dokuwiki_frontsidebar',elgg_echo('groups:enabledokuwiki_frontsidebar'),false);
+ add_group_tool_option('dokuwiki_frontpage',elgg_echo('groups:enabledokuwiki_frontpage'),false);
+
+ elgg_extend_view('groups/profile/summary','dokuwiki/grouppage');
+ elgg_extend_view('groups/tool_latest','dokuwiki/sidebar');
+
+ // Extending CSS
+ elgg_extend_view('css/elgg', 'dokuwiki/css');
+
+ // add a site navigation item
+ $item = new ElggMenuItem('wiki', elgg_echo('dokuwiki:title'), 'dokuwiki/all');
+ elgg_register_menu_item('site', $item);
+
+ elgg_extend_view("page/elements/head", "dokuwiki/metatags");
+}
+
+ /**
+ * Dispatches dokuwiki pages.
+ * URLs take the form of
+ * All wikis: dokuwiki/all
+ * Group wiki: dokuwiki/<guid>
+ *
+ * @param array $page
+ * @return NULL
+ */
+ function dokuwiki_page_handler($page) {
+
+ elgg_load_library('elgg:dokuwiki');
+
+ if ($page[0] === "all") {
+ elgg_set_context("search");
+ include(elgg_get_plugins_path().'dokuwiki/index.php');
+ return true;
+ }
+
+ elgg_set_context("dokuwiki");
+
+ $dokuwiki_path = elgg_get_plugins_path().'dokuwiki/vendors/dokuwiki/';
+ $doku = current_dokuwiki_entity();
+ if (!$doku) // can fail if there is no user and wiki doesnt exist
+ return false;
+ $parsed_url = parse_url(elgg_get_site_url().'dokuwiki/');
+ $url_base = $parsed_url['path'];
+ if (is_numeric($page[0])) {
+ $entity_guid = $page[0];
+ $ent = get_entity($entity_guid);
+
+ if (($ent && $ent instanceof ElggGroup) && $ent->dokuwiki_enable !== 'yes') {
+ // wiki not activated for this group. bail out.
+ elgg_pop_context();
+ return false;
+ }
+ if ($ent && (/*$ent instanceof ElggUser ||*/ $ent instanceof ElggGroup)) {
+ elgg_set_page_owner_guid($entity_guid);
+ $data_path = elgg_get_data_path().'wikis/'.$entity_guid;
+ } else {
+ // can't see the group
+ elgg_pop_context();
+ return false;
+ }
+ $page = array_slice($page, 1); // pop first element
+ define('DOKU_REL', $url_base.$entity_guid."/");
+ define('DOKU_BASE', $url_base.$entity_guid."/");
+ define('DOKU_URL', elgg_get_site_url().'dokuwiki/'.$entity_guid."/");
+
+ }
+ else {
+ $data_path = elgg_get_data_path().'wiki';
+ define('DOKU_REL', $url_base);
+ define('DOKU_BASE', $url_base);
+ define('DOKU_URL', elgg_get_site_url().'dokuwiki/');
+ }
+ define('DOKU_INC', $dokuwiki_path);
+ define('DOKU_MEDIA', elgg_get_site_url().'mod/dokuwiki/vendors/dokuwiki/');
+ define('DOKU_CONF', $dokuwiki_path."conf/");
+
+ dokuwiki_create_datafolder($data_path);
+ define('DOKU_ELGGDATA',$data_path);
+ if (empty($page) || (count($page)==1 && $page[0] == 'acl')) {
+ $page = array('doku.php');
+ }
+ else if ((count($page)==1 && $page[0] == 'usermanager')) {
+ $page = array('doku.php');
+ }
+ else if ((count($page)==1 && $page[0] == 'plugin')) {
+ $page = array('doku.php');
+ }
+ else if ((count($page)==1 && $page[0] == 'config')) {
+ $page = array('doku.php');
+ }
+ else if ((count($page)==1 && $page[0] == 'revert')) {
+ $page = array('doku.php');
+ }
+ else if ((count($page)==1 && $page[0] == 'popularity')) {
+ $page = array('doku.php');
+ }
+ if (empty($page) || (count($page)==1 && !$page[0])) {
+ $page = array('doku.php');
+ }
+ $_SERVER['PHP_AUTH_USER'] = elgg_get_logged_in_user_entity()->username;
+ $_SERVER['PHP_AUTH_PW'] = elgg_get_logged_in_user_entity()->password;
+ if (count($page) == 1) {
+ $doku_body = elgg_view('dokuwiki/index',array('page'=>$page[0]));
+ echo $doku_body;
+ }
+ else {
+ // avoid inclusion over root
+ $dest = realpath($dokuwiki_path.implode("/",$page));
+ if (strpos($dest, $dokuwiki_path) == 0)
+ $doku_body = elgg_view('dokuwiki/index',array('page'=>implode("/",$page)));
+ echo $doku_body;
+ }
+ return true;
+ }
+
+ /**
+ * Add a menu item to an ownerblock
+ */
+ function dokuwiki_owner_block_menu($hook, $type, $return, $params) {
+ if (elgg_instanceof($params['entity'], 'group') && $params['entity']->dokuwiki_enable == "yes") {
+ $url = "dokuwiki/{$params['entity']->guid}/";
+ $item = new ElggMenuItem('dokuwiki', elgg_echo('dokuwiki:group'), $url);
+ $return[] = $item;
+ }
+ return $return;
+ }
+
+ function dokuwiki_icon_hook($hook, $entity_type, $returnvalue, $params) {
+ if ($hook == 'entity:icon:url' && $params['entity']->getSubtype() == 'dokuwiki') {
+ $owner = get_entity($params['entity']->container_guid);
+ if ($owner)
+ return $owner->getIcon($params['size']);
+ }
+ return $returnvalue;
+ }
+
+ function dokuwiki_url($entity) {
+ return elgg_get_site_url() . "dokuwiki/".$entity->container_guid;
+ }
+
+?>
diff --git a/mod/dokuwiki/vendors/dokuwiki/COPYING b/mod/dokuwiki/vendors/dokuwiki/COPYING
new file mode 100644
index 000000000..d60c31a97
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/mod/dokuwiki/vendors/dokuwiki/README b/mod/dokuwiki/vendors/dokuwiki/README
new file mode 100644
index 000000000..a000bba2b
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/README
@@ -0,0 +1,9 @@
+All documentation for DokuWiki is available online
+at http://www.dokuwiki.org/
+
+For Installation Instructions see
+http://www.dokuwiki.org/install
+
+DokuWiki - 2004-2009 (c) Andreas Gohr <andi@splitbrain.org>
+See COPYING and file headers for license info
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/VERSION b/mod/dokuwiki/vendors/dokuwiki/VERSION
new file mode 100644
index 000000000..157cc6c56
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/VERSION
@@ -0,0 +1 @@
+2009-12-25c "Lemming"
diff --git a/mod/dokuwiki/vendors/dokuwiki/bin/dwpage.php b/mod/dokuwiki/vendors/dokuwiki/bin/dwpage.php
new file mode 100755
index 000000000..f664770bf
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/bin/dwpage.php
@@ -0,0 +1,378 @@
+#!/usr/bin/php
+<?php
+#------------------------------------------------------------------------------
+if ('cli' != php_sapi_name()) die();
+
+ini_set('memory_limit','128M');
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/common.php';
+require_once DOKU_INC.'inc/cliopts.php';
+
+#------------------------------------------------------------------------------
+function usage($action) {
+ switch ( $action ) {
+ case 'checkout':
+ print "Usage: dwpage.php [opts] checkout <wiki:page> [working_file]
+
+ Checks out a file from the repository, using the wiki id and obtaining
+ a lock for the page.
+ If a working_file is specified, this is where the page is copied to.
+ Otherwise defaults to the same as the wiki page in the current
+ working directory.
+
+ EXAMPLE
+ $ ./dwpage.php checkout wiki:syntax ./new_syntax.txt
+
+ OPTIONS
+ -h, --help=<action>: get help
+ -f: force obtaining a lock for the page (generally bad idea)
+";
+ break;
+ case 'commit':
+ print "Usage: dwpage.php [opts] -m \"Msg\" commit <working_file> <wiki:page>
+
+ Checks in the working_file into the repository using the specified
+ wiki id, archiving the previous version.
+
+ EXAMPLE
+ $ ./dwpage.php -m \"Some message\" commit ./new_syntax.txt wiki:syntax
+
+ OPTIONS
+ -h, --help=<action>: get help
+ -f: force obtaining a lock for the page (generally bad idea)
+ -t, trivial: minor change
+ -m (required): Summary message describing the change
+";
+ break;
+ case 'lock':
+ print "Usage: dwpage.php [opts] lock <wiki:page>
+
+ Obtains or updates a lock for a wiki page
+
+ EXAMPLE
+ $ ./dwpage.php lock wiki:syntax
+
+ OPTIONS
+ -h, --help=<action>: get help
+ -f: force obtaining a lock for the page (generally bad idea)
+";
+ break;
+ case 'unlock':
+ print "Usage: dwpage.php [opts] unlock <wiki:page>
+
+ Removes a lock for a wiki page.
+
+ EXAMPLE
+ $ ./dwpage.php unlock wiki:syntax
+
+ OPTIONS
+ -h, --help=<action>: get help
+ -f: force obtaining a lock for the page (generally bad idea)
+";
+ break;
+ default:
+ print "Usage: dwpage.php [opts] <action>
+
+ Utility to help command line Dokuwiki page editing, allow
+ pages to be checked out for editing then committed after changes
+
+ Normal operation would be;
+
+
+
+ ACTIONS
+ checkout: see $ dwpage.php --help=checkout
+ commit: see $ dwpage.php --help=commit
+ lock: see $ dwpage.php --help=lock
+
+ OPTIONS
+ -h, --help=<action>: get help
+ e.g. $ ./dwpage.php -hcommit
+ e.g. $ ./dwpage.php --help=commit
+";
+ break;
+ }
+}
+
+#------------------------------------------------------------------------------
+function getUser() {
+ $user = getenv('USER');
+ if (empty ($username)) {
+ $user = getenv('USERNAME');
+ } else {
+ return $user;
+ }
+ if (empty ($username)) {
+ $user = 'admin';
+ }
+ return $user;
+}
+
+#------------------------------------------------------------------------------
+function getSuppliedArgument($OPTS, $short, $long) {
+ $arg = $OPTS->get($short);
+ if ( is_null($arg) ) {
+ $arg = $OPTS->get($long);
+ }
+ return $arg;
+}
+
+#------------------------------------------------------------------------------
+function obtainLock($WIKI_ID) {
+
+ global $USERNAME;
+
+ if ( !file_exists(wikiFN($WIKI_ID)) ) {
+ fwrite( STDERR, "$WIKI_ID does not yet exist\n");
+ }
+
+ $_SERVER['REMOTE_USER'] = $USERNAME;
+ if ( checklock($WIKI_ID) ) {
+ fwrite( STDERR, "Page $WIKI_ID is already locked by another user\n");
+ exit(1);
+ }
+
+ lock($WIKI_ID);
+
+ $_SERVER['REMOTE_USER'] = '_'.$USERNAME.'_';
+
+ if ( checklock($WIKI_ID) != $USERNAME ) {
+
+ fwrite( STDERR, "Unable to obtain lock for $WIKI_ID\n" );
+ exit(1);
+
+ }
+}
+
+#------------------------------------------------------------------------------
+function clearLock($WIKI_ID) {
+
+ global $USERNAME ;
+
+ if ( !file_exists(wikiFN($WIKI_ID)) ) {
+ fwrite( STDERR, "$WIKI_ID does not yet exist\n");
+ }
+
+ $_SERVER['REMOTE_USER'] = $USERNAME;
+ if ( checklock($WIKI_ID) ) {
+ fwrite( STDERR, "Page $WIKI_ID is locked by another user\n");
+ exit(1);
+ }
+
+ unlock($WIKI_ID);
+
+ if ( file_exists(wikiLockFN($WIKI_ID)) ) {
+ fwrite( STDERR, "Unable to clear lock for $WIKI_ID\n" );
+ exit(1);
+ }
+
+}
+
+#------------------------------------------------------------------------------
+function deleteLock($WIKI_ID) {
+
+ $wikiLockFN = wikiLockFN($WIKI_ID);
+
+ if ( file_exists($wikiLockFN) ) {
+ if ( !unlink($wikiLockFN) ) {
+ fwrite( STDERR, "Unable to delete $wikiLockFN\n" );
+ exit(1);
+ }
+ }
+
+}
+
+#------------------------------------------------------------------------------
+$USERNAME = getUser();
+$CWD = getcwd();
+$SYSTEM_ID = '127.0.0.1';
+
+#------------------------------------------------------------------------------
+$OPTS = Doku_Cli_Opts::getOptions(
+ __FILE__,
+ 'h::fm:u:s:t',
+ array(
+ 'help==',
+ 'user=',
+ 'system=',
+ 'trivial',
+ )
+);
+
+if ( $OPTS->isError() ) {
+ print $OPTS->getMessage()."\n";
+ exit(1);
+}
+
+if ( $OPTS->has('h') or $OPTS->has('help') or !$OPTS->hasArgs() ) {
+ usage(getSuppliedArgument($OPTS,'h','help'));
+ exit(0);
+}
+
+if ( $OPTS->has('u') or $OPTS->has('user') ) {
+ $USERNAME = getSuppliedArgument($OPTS,'u','user');
+}
+
+if ( $OPTS->has('s') or $OPTS->has('system') ) {
+ $SYSTEM_ID = getSuppliedArgument($OPTS,'s','system');
+}
+
+#------------------------------------------------------------------------------
+switch ( $OPTS->arg(0) ) {
+
+ #----------------------------------------------------------------------
+ case 'checkout':
+
+ $WIKI_ID = $OPTS->arg(1);
+
+ if ( !$WIKI_ID ) {
+ fwrite( STDERR, "Wiki page ID required\n");
+ exit(1);
+ }
+
+ $WIKI_FN = wikiFN($WIKI_ID);
+
+ if ( !file_exists($WIKI_FN) ) {
+ fwrite( STDERR, "$WIKI_ID does not yet exist\n");
+ exit(1);
+ }
+
+ $TARGET_FN = $OPTS->arg(2);
+
+ if ( empty($TARGET_FN) ) {
+ $TARGET_FN = getcwd().'/'.basename($WIKI_FN);
+ }
+
+ if ( !file_exists(dirname($TARGET_FN)) ) {
+ fwrite( STDERR, "Directory ".dirname($TARGET_FN)." does not exist\n");
+ exit(1);
+ }
+
+ if ( stristr( realpath(dirname($TARGET_FN)), realpath($conf['datadir']) ) !== false ) {
+ fwrite( STDERR, "Attempt to check out file into data directory - not allowed\n");
+ exit(1);
+ }
+
+ if ( $OPTS->has('f') ) {
+ deleteLock($WIKI_ID);
+ }
+
+ obtainLock($WIKI_ID);
+
+ # Need to lock the file first?
+ if ( !copy($WIKI_FN, $TARGET_FN) ) {
+ fwrite( STDERR, "Unable to copy $WIKI_FN to $TARGET_FN\n");
+ clearLock($WIKI_ID);
+ exit(1);
+ }
+
+ print "$WIKI_ID > $TARGET_FN\n";
+ exit(0);
+
+ break;
+
+ #----------------------------------------------------------------------
+ case 'commit':
+
+ $TARGET_FN = $OPTS->arg(1);
+
+ if ( !$TARGET_FN ) {
+ fwrite( STDERR, "Target filename required\n");
+ exit(1);
+ }
+
+ if ( !file_exists($TARGET_FN) ) {
+ fwrite( STDERR, "$TARGET_FN does not exist\n");
+ exit(1);
+ }
+
+ if ( !is_readable($TARGET_FN) ) {
+ fwrite( STDERR, "Cannot read from $TARGET_FN\n");
+ exit(1);
+ }
+
+ $WIKI_ID = $OPTS->arg(2);
+
+ if ( !$WIKI_ID ) {
+ fwrite( STDERR, "Wiki page ID required\n");
+ exit(1);
+ }
+
+ if ( !$OPTS->has('m') ) {
+ fwrite( STDERR, "Summary message required\n");
+ exit(1);
+ }
+
+ if ( $OPTS->has('f') ) {
+ deleteLock($WIKI_ID);
+ }
+
+ $_SERVER['REMOTE_USER'] = $USERNAME;
+ if ( checklock($WIKI_ID) ) {
+ fwrite( STDERR, "$WIKI_ID is locked by another user\n");
+ exit(1);
+ }
+
+ obtainLock($WIKI_ID);
+
+ saveWikiText($WIKI_ID, file_get_contents($TARGET_FN), $OPTS->get('m'), $OPTS->has('t'));
+
+ clearLock($WIKI_ID);
+
+ exit(0);
+
+ break;
+
+ #----------------------------------------------------------------------
+ case 'lock':
+
+ $WIKI_ID = $OPTS->arg(1);
+
+ if ( !$WIKI_ID ) {
+ fwrite( STDERR, "Wiki page ID required\n");
+ exit(1);
+ }
+
+ if ( $OPTS->has('f') ) {
+ deleteLock($WIKI_ID);
+ }
+
+ obtainLock($WIKI_ID);
+
+ print "Locked : $WIKI_ID\n";
+ exit(0);
+
+ break;
+
+ #----------------------------------------------------------------------
+ case 'unlock':
+
+ $WIKI_ID = $OPTS->arg(1);
+
+ if ( !$WIKI_ID ) {
+ fwrite( STDERR, "Wiki page ID required\n");
+ exit(1);
+ }
+
+ if ( $OPTS->has('f') ) {
+ deleteLock($WIKI_ID);
+ } else {
+ clearLock($WIKI_ID);
+ }
+
+ print "Unlocked : $WIKI_ID\n";
+ exit(0);
+
+ break;
+
+ #----------------------------------------------------------------------
+ default:
+
+ fwrite( STDERR, "Invalid action ".$OPTS->arg(0)."\n" );
+ exit(1);
+
+ break;
+
+}
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/bin/indexer.php b/mod/dokuwiki/vendors/dokuwiki/bin/indexer.php
new file mode 100755
index 000000000..55f3608d5
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/bin/indexer.php
@@ -0,0 +1,172 @@
+#!/usr/bin/php
+<?php
+if ('cli' != php_sapi_name()) die();
+
+ini_set('memory_limit','128M');
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/common.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/search.php');
+require_once(DOKU_INC.'inc/indexer.php');
+require_once(DOKU_INC.'inc/auth.php');
+require_once(DOKU_INC.'inc/cliopts.php');
+session_write_close();
+
+// Version tag used to force rebuild on upgrade
+// Need to keep in sync with lib/exe/indexer.php
+if(!defined('INDEXER_VERSION')) define('INDEXER_VERSION', 2);
+
+// handle options
+$short_opts = 'hcuq';
+$long_opts = array('help', 'clear', 'update', 'quiet');
+$OPTS = Doku_Cli_Opts::getOptions(__FILE__,$short_opts,$long_opts);
+if ( $OPTS->isError() ) {
+ fwrite( STDERR, $OPTS->getMessage() . "\n");
+ _usage();
+ exit(1);
+}
+$CLEAR = false;
+$QUIET = false;
+foreach ($OPTS->options as $key => $val) {
+ switch ($key) {
+ case 'h':
+ case 'help':
+ _usage();
+ exit;
+ case 'c':
+ case 'clear':
+ $CLEAR = true;
+ break;
+ case 'q':
+ case 'quiet':
+ $QUIET = true;
+ break;
+ }
+}
+
+#------------------------------------------------------------------------------
+# Action
+
+if($CLEAR) _clearindex();
+_update();
+
+
+
+#------------------------------------------------------------------------------
+
+function _usage() {
+ print "Usage: indexer.php <options>
+
+ Updates the searchindex by indexing all new or changed pages
+ when the -c option is given the index is cleared first.
+
+ OPTIONS
+ -h, --help show this help and exit
+ -c, --clear clear the index before updating
+ -q, --quiet don't produce any output
+";
+}
+
+function _update(){
+ global $conf;
+
+ // upgrade to version 2
+ if (!@file_exists($conf['indexdir'].'/pageword.idx')){
+ _lock();
+ idx_upgradePageWords();
+ _unlock();
+ }
+
+ $data = array();
+ _quietecho("Searching pages... ");
+ search($data,$conf['datadir'],'search_allpages',array('skipacl' => true));
+ _quietecho(count($data)." pages found.\n");
+
+ foreach($data as $val){
+ _index($val['id']);
+ }
+}
+
+function _index($id){
+ global $CLEAR;
+
+ // if not cleared only update changed and new files
+ if(!$CLEAR){
+ $idxtag = metaFN($id,'.indexed');
+ if(@file_exists($idxtag)){
+ if(io_readFile($idxtag) >= INDEXER_VERSION){
+ $last = @filemtime(metaFN($id,'.indexed'));
+ if($last > @filemtime(wikiFN($id))) return;
+ }
+ }
+ }
+
+ _lock();
+ _quietecho("$id... ");
+ idx_addPage($id);
+ io_saveFile(metaFN($id,'.indexed'),INDEXER_VERSION);
+ _quietecho("done.\n");
+ _unlock();
+}
+
+/**
+ * lock the indexer system
+ */
+function _lock(){
+ global $conf;
+ $lock = $conf['lockdir'].'/_indexer.lock';
+ $said = false;
+ while(!@mkdir($lock, $conf['dmode'])){
+ if(time()-@filemtime($lock) > 60*5){
+ // looks like a stale lock - remove it
+ @rmdir($lock);
+ }else{
+ if($said){
+ _quietecho(".");
+ }else{
+ _quietecho("Waiting for lockfile (max. 5 min)");
+ $said = true;
+ }
+ sleep(15);
+ }
+ }
+ if($conf['dperm']) chmod($lock, $conf['dperm']);
+ if($said) _quietecho("\n");
+}
+
+/**
+ * unlock the indexer sytem
+ */
+function _unlock(){
+ global $conf;
+ $lock = $conf['lockdir'].'/_indexer.lock';
+ @rmdir($lock);
+}
+
+/**
+ * Clear all index files
+ */
+function _clearindex(){
+ global $conf;
+ _lock();
+ _quietecho("Clearing index... ");
+ io_saveFile($conf['indexdir'].'/page.idx','');
+ $dir = @opendir($conf['indexdir']);
+ if($dir!==false){
+ while(($f = readdir($dir)) !== false){
+ if(substr($f,-4)=='.idx' &&
+ (substr($f,0,1)=='i' || substr($f,0,1)=='w'))
+ @unlink($conf['indexdir']."/$f");
+ }
+ }
+ _quietecho("done.\n");
+ _unlock();
+}
+
+function _quietecho($msg) {
+ global $QUIET;
+ if(!$QUIET) echo $msg;
+}
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/mod/dokuwiki/vendors/dokuwiki/bin/wantedpages.php b/mod/dokuwiki/vendors/dokuwiki/bin/wantedpages.php
new file mode 100755
index 000000000..30171fc15
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/bin/wantedpages.php
@@ -0,0 +1,134 @@
+#!/usr/bin/php
+<?php
+if ('cli' != php_sapi_name()) die();
+
+#------------------------------------------------------------------------------
+ini_set('memory_limit','128M');
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/common.php';
+require_once DOKU_INC.'inc/search.php';
+require_once DOKU_INC.'inc/cliopts.php';
+
+#------------------------------------------------------------------------------
+function usage() {
+ print "Usage: wantedpages.php [wiki:namespace]
+
+ Outputs a list of wanted pages (pages which have
+ internal links but do not yet exist).
+
+ If the optional [wiki:namespace] is not provided,
+ defaults to the root wiki namespace
+
+ OPTIONS
+ -h, --help get help
+";
+}
+
+#------------------------------------------------------------------------------
+define ('DW_DIR_CONTINUE',1);
+define ('DW_DIR_NS',2);
+define ('DW_DIR_PAGE',3);
+
+#------------------------------------------------------------------------------
+function dw_dir_filter($entry, $basepath) {
+ if ($entry == '.' || $entry == '..' ) {
+ return DW_DIR_CONTINUE;
+ }
+ if ( is_dir($basepath . '/' . $entry) ) {
+ if ( strpos($entry, '_') === 0 ) {
+ return DW_DIR_CONTINUE;
+ }
+ return DW_DIR_NS;
+ }
+ if ( preg_match('/\.txt$/',$entry) ) {
+ return DW_DIR_PAGE;
+ }
+ return DW_DIR_CONTINUE;
+}
+
+#------------------------------------------------------------------------------
+function dw_get_pages($dir) {
+ static $trunclen = NULL;
+ if ( !$trunclen ) {
+ global $conf;
+ $trunclen = strlen($conf['datadir'].':');
+ }
+
+ if ( !is_dir($dir) ) {
+ fwrite( STDERR, "Unable to read directory $dir\n");
+ exit(1);
+ }
+
+ $pages = array();
+ $dh = opendir($dir);
+ while ( false !== ( $entry = readdir($dh) ) ) {
+ $status = dw_dir_filter($entry, $dir);
+ if ( $status == DW_DIR_CONTINUE ) {
+ continue;
+ } else if ( $status == DW_DIR_NS ) {
+ $pages = array_merge($pages, dw_get_pages($dir . '/' . $entry));
+ } else {
+ $page = array(
+ 'id' => pathID(substr($dir.'/'.$entry,$trunclen)),
+ 'file'=> $dir.'/'.$entry,
+ );
+ $pages[] = $page;
+ }
+ }
+ closedir($dh);
+ return $pages;
+}
+
+#------------------------------------------------------------------------------
+function dw_internal_links($page) {
+ global $conf;
+ $instructions = p_get_instructions(file_get_contents($page['file']));
+ $links = array();
+ $cns = getNS($page['id']);
+ $exists = false;
+ foreach($instructions as $ins){
+ if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink') ){
+ $mid = $ins[1][0];
+ resolve_pageid($cns,$mid,$exists);
+ if ( !$exists ) {
+ list($mid) = explode('#',$mid); //record pages without hashs
+ $links[] = $mid;
+ }
+ }
+ }
+ return $links;
+}
+
+#------------------------------------------------------------------------------
+$OPTS = Doku_Cli_Opts::getOptions(__FILE__,'h',array('help'));
+
+if ( $OPTS->isError() ) {
+ fwrite( STDERR, $OPTS->getMessage() . "\n");
+ exit(1);
+}
+
+if ( $OPTS->has('h') or $OPTS->has('help') ) {
+ usage();
+ exit(0);
+}
+
+$START_DIR = $conf['datadir'];
+
+if ( $OPTS->numArgs() == 1 ) {
+ $START_DIR .= '/' . $OPTS->arg(0);
+}
+
+#------------------------------------------------------------------------------
+$WANTED_PAGES = array();
+
+foreach ( dw_get_pages($START_DIR) as $WIKI_PAGE ) {
+ $WANTED_PAGES = array_merge($WANTED_PAGES,dw_internal_links($WIKI_PAGE));
+}
+$WANTED_PAGES = array_unique($WANTED_PAGES);
+sort($WANTED_PAGES);
+
+foreach ( $WANTED_PAGES as $WANTED_PAGE ) {
+ print $WANTED_PAGE."\n";
+}
+exit(0);
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php b/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php
new file mode 100644
index 000000000..7678e918e
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php
@@ -0,0 +1,24 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Editing this file by hand shouldn't be necessary. Use the ACL
+# Manager interface instead.
+#
+# If your auth backend allows special char like spaces in groups
+# or user names you need to urlencode them (only chars <128, leave
+# UTF-8 multibyte chars as is)
+#
+# none 0
+# read 1
+# edit 2
+# create 4
+# upload 8
+# delete 16
+
+* @ALL 0
+* @user 1
+* @member 8
+* @admin 255
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php.dist b/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php.dist
new file mode 100644
index 000000000..14344d778
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/acl.auth.php.dist
@@ -0,0 +1,21 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Editing this file by hand shouldn't be necessary. Use the ACL
+# Manager interface instead.
+#
+# If your auth backend allows special char like spaces in groups
+# or user names you need to urlencode them (only chars <128, leave
+# UTF-8 multibyte chars as is)
+#
+# none 0
+# read 1
+# edit 2
+# create 4
+# upload 8
+# delete 16
+
+* @ALL 8
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/acronyms.conf b/mod/dokuwiki/vendors/dokuwiki/conf/acronyms.conf
new file mode 100644
index 000000000..13708d2df
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/acronyms.conf
@@ -0,0 +1,143 @@
+# Acronyms.
+
+ACL Access Control List
+AFAICS As far as I can see
+AFAIK As far as I know
+AFAIR As far as I remember
+AJAX Asynchronous JavaScript and XML
+AIM AOL (America Online) Instant Messenger
+AOL America Online
+API Application Programming Interface
+ASAP As soon as possible
+ASCII American Standard Code for Information Interchange
+ASP Active Server Pages
+BTW By the way
+CGI Common Gateway Interface
+CMS Content Management System
+CSS Cascading Style Sheets
+CVS Concurrent Versions System
+DBA Database Administrator
+DHCP Dynamic Host Configuration Protocol
+DHTML Dynamic HyperText Markup Language
+DMCA Digital Millenium Copyright Act
+DNS Domain Name System
+DOM Document Object Model
+DTD Document Type Definition
+EOF End of file
+EOL End of line
+EOM End of message
+EOT End of text
+ESMTP Extended Simple Mail Transfer Protocol
+FAQ Frequently Asked Questions
+FDL GNU Free Documentation License
+FTP File Transfer Protocol
+FOSS Free & Open-Source Software
+FLOSS Free/Libre and Open Source Software
+FUD Fear, Uncertainty, and Doubt
+GB Gigabyte
+GHz Gigahertz
+GIF Graphics Interchange Format
+GPL GNU General Public License
+GUI Graphical User Interface
+HTML HyperText Markup Language
+HTTP Hyper Text Transfer Protocol
+IANAL I am not a lawyer (but)
+ICANN Internet Corporation for Assigned Names and Numbers
+ICQ I seek you (Instant Messenger)
+IE5 Internet Explorer 5
+IE6 Internet Explorer 6
+IE Internet Explorer
+IIRC If I remember correctly
+IIS Internet Information Services
+IMAP Internet Message Access Protocol
+IMHO In my humble opinion
+IMO In my opinion
+IOW In other words
+IRC Internet Relay Chat
+IRL In real life
+ISO International Organization for Standardization
+ISP Internet Service Provider
+JDK Java Development Kit
+JPEG Joint Photographics Experts Group
+JPG Joint Photographics Experts Group
+JS JavaScript
+KISS Keep it simple stupid
+LDAP Lightweight Directory Access Protocol
+LGPL GNU Lesser General Public License
+LOL Laughing out loud
+MathML Mathematical Markup Language
+MB Megabyte
+MHz Megahertz
+MIME Multipurpose Internet Mail Extension
+MIT Massachusetts Institute of Technology
+MML Mathematical Markup Language
+MP3 Motion Picture Experts Group Layer 3
+MPEG Motion Picture Experts Group
+MSDN Microsoft Developer Network
+MS Microsoft
+MSIE Microsoft Internet Explorer
+NIS Network Information Service
+NS4.7 Netscape 4.7
+NS4 Netscape 4
+NS6 Netscape 6
+NS7 Netscape 7
+OMG Oh my God
+OPML Outline Processor Markup Language
+OS Operating System
+OSS Open Source Software
+OTOH On the other hand
+P2P Peer to Peer
+PDA Personal Digital Assistant
+PDF Portable Document Format
+Perl Practical Extraction and Report Language
+PERL Practical Extraction and Report Language
+PHP Hypertext Preprocessor
+PICS Platform for Internet Content Selection
+PIN Personal Identification Number
+PITA Pain in the Ass
+PNG Portable Network Graphics
+POP3 Post Office Protocol 3
+POP Post Office Protocol
+QoS Quality of Service
+RAID Redundant Array of Inexpensive Disks
+RDF Resource Description Framework
+ROTFL Rolling on the floor laughing
+RPC Remote Procedure Call
+RSS Rich Site Summary
+RTFM Read The Fine Manual
+RTF Rich Text File
+SCSI Small Computer System Interface
+SDK Software Development Kit
+SGML Standard General Markup Language
+SMIL Synchronized Multimedia Integration Language
+SMTP Simple Mail Transfer Protocol
+SOAP Simple Object Access Protocol
+spec specification
+SQL Structured Query Language
+SSH Secure Shell
+SSI Server Side Includes
+SSL Secure Sockets Layer
+SVG Scalable Vector Graphics
+TIA Thanks in advance
+TIFF Tagged Image File Format
+TLD Top Level Domain
+TOC Table of Contents
+URI Uniform Resource Identifier
+URL Uniform Resource Locator
+URN Uniform Resource Name
+VBA Visual Basic for Applications
+VB Visual Basic
+W3C World Wide Web Consortium
+WAN Wide Area Network
+WAP Wireless Access Protocol
+WML Wireless Markup Language
+WTF? What the f***
+WWW World Wide Web
+WYSIWYG What You See Is What You Get
+XHTML Extensible HyperText Markup Language
+XML Extensible Markup Language
+XSD XML (Extensible Markup Language) Schema Definition
+XSL Extensible Stylesheet Language
+XSLT Extensible Stylesheet Language Transformations
+XUL XML User Interface Language
+YMMV Your mileage may vary
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/dokuwiki.php b/mod/dokuwiki/vendors/dokuwiki/conf/dokuwiki.php
new file mode 100644
index 000000000..74d95147e
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/dokuwiki.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * This is DokuWiki's Main Configuration file
+ *
+ * All the default values are kept here, you should not modify it but use
+ * a local.php file instead to override the settings from here.
+ *
+ * This is a piece of PHP code so PHP syntax applies!
+ *
+ * For help with the configuration see http://www.splitbrain.org/dokuwiki/wiki:config
+ */
+
+
+/* Datastorage and Permissions */
+
+$conf['fmode'] = 0644; //set file creation mode
+$conf['dmode'] = 0755; //set directory creation mode
+$conf['lang'] = 'en'; //your language
+$conf['basedir'] = ''; //absolute dir from serveroot - blank for autodetection
+$conf['baseurl'] = ''; //URL to server including protocol - blank for autodetect
+$conf['savedir'] = './data'; //where to store all the files
+$conf['allowdebug'] = 0; //allow debug output, enable if needed 0|1
+
+/* Display Options */
+
+$conf['start'] = 'start'; //name of start page
+$conf['title'] = 'DokuWiki'; //what to show in the title
+$conf['template'] = 'default'; //see lib/tpl directory
+$conf['license'] = 'cc-by-nc-sa'; //see conf/license.php
+$conf['fullpath'] = 0; //show full path of the document or relative to datadir only? 0|1
+$conf['recent'] = 20; //how many entries to show in recent
+$conf['breadcrumbs'] = 10; //how many recent visited pages to show
+$conf['youarehere'] = 0; //show "You are here" navigation? 0|1
+$conf['typography'] = 1; //smartquote conversion 0=off, 1=doublequotes, 2=all quotes
+$conf['htmlok'] = 0; //may raw HTML be embedded? This may break layout and XHTML validity 0|1
+$conf['phpok'] = 0; //may PHP code be embedded? Never do this on the internet! 0|1
+$conf['dformat'] = '%Y/%m/%d %H:%M'; //dateformat accepted by PHPs strftime() function
+$conf['signature'] = ' --- //[[@MAIL@|@NAME@]] @DATE@//'; //signature see wiki:config for details
+$conf['toptoclevel'] = 1; //Level starting with and below to include in AutoTOC (max. 5)
+$conf['tocminheads'] = 3; //Minimum amount of headlines that determines if a TOC is built
+$conf['maxtoclevel'] = 3; //Up to which level include into AutoTOC (max. 5)
+$conf['maxseclevel'] = 3; //Up to which level create editable sections (max. 5)
+$conf['camelcase'] = 0; //Use CamelCase for linking? (I don't like it) 0|1
+$conf['deaccent'] = 1; //deaccented chars in pagenames (1) or romanize (2) or keep (0)?
+$conf['useheading'] = 0; //use the first heading in a page as its name
+$conf['refcheck'] = 1; //check for references before deleting media files
+$conf['refshow'] = 0; //how many references should be shown, 5 is a good value
+$conf['showuseras'] = 'loginname'; // 'loginname' users login name
+ // 'username' users full name
+ // 'email' e-mail address (will be obfuscated as per mailguard)
+ // 'email_link' e-mail address as a mailto: link (obfuscated)
+
+/* Antispam Features */
+
+$conf['usewordblock']= 1; //block spam based on words? 0|1
+$conf['indexdelay'] = 60*60*24*5; //allow indexing after this time (seconds) default is 5 days
+$conf['relnofollow'] = 1; //use rel="nofollow" for external links?
+$conf['mailguard'] = 'hex'; //obfuscate email addresses against spam harvesters?
+ //valid entries are:
+ // 'visible' - replace @ with [at], . with [dot] and - with [dash]
+ // 'hex' - use hex entities to encode the mail address
+ // 'none' - do not obfuscate addresses
+$conf['iexssprotect']= 1; // check for JavaScript and HTML in uploaded files 0|1
+
+/* Authentication Options - read http://www.splitbrain.org/dokuwiki/wiki:acl */
+
+$conf['useacl'] = 0; //Use Access Control Lists to restrict access?
+$conf['autopasswd'] = 1; //autogenerate passwords and email them to user
+$conf['authtype'] = 'plain'; //which authentication backend should be used
+$conf['passcrypt'] = 'smd5'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411)
+$conf['defaultgroup']= 'user'; //Default groups new Users are added to
+$conf['superuser'] = '!!not set!!'; //The admin can be user or @group or comma separated list user1,@group1,user2
+$conf['manager'] = '!!not set!!'; //The manager can be user or @group or comma separated list user1,@group1,user2
+$conf['profileconfirm'] = 1; //Require current password to confirm changes to user profile
+$conf['disableactions'] = ''; //comma separated list of actions to disable
+$conf['sneaky_index'] = 0; //check for namespace read permission in index view (0|1) (1 might cause unexpected behavior)
+$conf['auth_security_timeout'] = 900; //time (seconds) auth data is considered valid, set to 0 to recheck on every page view
+$conf['securecookie'] = 1; //never send HTTPS cookies via HTTP
+
+$conf['xmlrpc'] = 0; //Enable/disable XML-RPC interface
+$conf['xmlrpcuser'] = '!!not set!!'; //Restrict XML-RPC access to this groups/users
+
+/* Advanced Options */
+
+$conf['updatecheck'] = 1; //automatically check for new releases?
+$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal
+$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on
+$conf['usedraft'] = 1; //automatically save a draft while editing (0|1)
+$conf['sepchar'] = '_'; //word separator character in page names; may be a
+ // letter, a digit, '_', '-', or '.'.
+$conf['canonical'] = 0; //Should all URLs use full canonical http://... style?
+$conf['autoplural'] = 0; //try (non)plural form of nonexisting files?
+$conf['compression'] = 'gz'; //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip)
+ // bz2 generates smaller files, but needs more cpu-power
+$conf['cachetime'] = 60*60*24; //maximum age for cachefile in seconds (defaults to a day)
+$conf['locktime'] = 15*60; //maximum age for lockfiles (defaults to 15 minutes)
+$conf['fetchsize'] = 0; //maximum size (bytes) fetch.php may download from extern, disabled by default
+$conf['notify'] = ''; //send change info to this email (leave blank for nobody)
+$conf['registernotify'] = ''; //send info about newly registered users to this email (leave blank for nobody)
+$conf['mailfrom'] = ''; //use this email when sending mails
+$conf['gzip_output'] = 0; //use gzip content encodeing for the output xhtml (if allowed by browser)
+$conf['gdlib'] = 2; //the GDlib version (0, 1 or 2) 2 tries to autodetect
+$conf['im_convert'] = ''; //path to ImageMagicks convert (will be used instead of GD)
+$conf['jpg_quality'] = '70'; //quality of compression when scaling jpg images (0-100)
+$conf['subscribers'] = 0; //enable change notice subscription support
+$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0
+$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes
+$conf['send404'] = 0; //Send a HTTP 404 status for non existing pages?
+$conf['sitemap'] = 0; //Create a google sitemap? How often? In days.
+$conf['rss_type'] = 'rss1'; //type of RSS feed to provide, by default:
+ // 'rss' - RSS 0.91
+ // 'rss1' - RSS 1.0
+ // 'rss2' - RSS 2.0
+ // 'atom' - Atom 0.3
+ // 'atom1' - Atom 1.0
+$conf['rss_linkto'] = 'diff'; //what page RSS entries link to:
+ // 'diff' - page showing revision differences
+ // 'page' - the revised page itself
+ // 'rev' - page showing all revisions
+ // 'current' - most recent revision of page
+$conf['rss_content'] = 'abstract'; // what to put in the items by deafult?
+ // 'abstract' - plain text, first paragraph or so
+ // 'diff' - plain text unified diff wrapped in <pre> tags
+ // 'htmldiff' - diff as HTML table
+ // 'html' - the full page rendered in XHTML
+$conf['rss_update'] = 5*60; //Update the RSS feed every n seconds (defaults to 5 minutes)
+$conf['recent_days'] = 7; //How many days of recent changes to keep. (days)
+$conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1
+$conf['broken_iua'] = 0; //Platform with broken ignore_user_abort (IIS+CGI) 0|1
+$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard)
+$conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generation
+$conf['rememberme'] = 1; //Enable/disable remember me on login
+
+//Set target to use when creating links - leave empty for same window
+$conf['target']['wiki'] = '';
+$conf['target']['interwiki'] = '';
+$conf['target']['extern'] = '';
+$conf['target']['media'] = '';
+$conf['target']['windows'] = '';
+
+//Proxy setup - if your Server needs a proxy to access the web set these
+$conf['proxy']['host'] = '';
+$conf['proxy']['port'] = '';
+$conf['proxy']['user'] = '';
+$conf['proxy']['pass'] = '';
+$conf['proxy']['ssl'] = 0;
+
+/* Safemode Hack */
+
+$conf['safemodehack'] = 0; //read http://www.dokuwiki.org/config:safemodehack !
+$conf['ftp']['host'] = 'localhost';
+$conf['ftp']['port'] = '21';
+$conf['ftp']['user'] = 'user';
+$conf['ftp']['pass'] = 'password';
+$conf['ftp']['root'] = '/home/user/htdocs';
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/entities.conf b/mod/dokuwiki/vendors/dokuwiki/conf/entities.conf
new file mode 100644
index 000000000..be9ed6d40
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/entities.conf
@@ -0,0 +1,22 @@
+# Typography replacements
+#
+# Order does matter!
+#
+# You can use HTML entities here, but it is not recomended because it may break
+# non-HTML renderers. Use UTF-8 chars directly instead.
+
+<-> ↔
+-> →
+<- â†
+<=> ⇔
+=> ⇒
+<= â‡
+>> »
+<< «
+--- —
+-- –
+(c) ©
+(tm) â„¢
+(r) ®
+... …
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/interwiki.conf b/mod/dokuwiki/vendors/dokuwiki/conf/interwiki.conf
new file mode 100644
index 000000000..0e855f626
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/interwiki.conf
@@ -0,0 +1,125 @@
+# Each URL may contain one of the placeholders {URL} or {NAME}
+# {URL} is replaced by the URL encoded representation of the wikiname
+# this is the right thing to do in most cases
+# {NAME} this is replaced by the wikiname as given in the document
+# no further encoding is done
+# If no placeholder is defined the urlencoded name is appended to the URL
+
+# You can add more InterWiki shortcuts here.
+
+wp http://en.wikipedia.org/wiki/{NAME}
+wpfr http://fr.wikipedia.org/wiki/{NAME}
+wpde http://de.wikipedia.org/wiki/{NAME}
+wpes http://es.wikipedia.org/wiki/{NAME}
+wppl http://pl.wikipedia.org/wiki/{NAME}
+wpjp http://ja.wikipedia.org/wiki/{NAME}
+wpmeta http://meta.wikipedia.org/wiki/{NAME}
+doku http://www.dokuwiki.org/
+dokubug http://bugs.splitbrain.org/index.php?do=details&amp;task_id=
+rfc http://www.cs.ccu.edu.tw/~chm91u/rfc2html.php?in=
+man http://man.cx/
+amazon http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
+amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
+amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/
+phpfn http://www.php.net/{NAME}
+coral http://{HOST}.{PORT}.nyud.net:8090/{PATH}?{QUERY}
+freecache http://freecache.org/{NAME}
+sb http://www.splitbrain.org/go/
+google.de http://www.google.de/search?q=
+go http://www.google.com/search?q={URL}&amp;btnI=lucky
+
+# Standards from http://usemod.com/intermap.txt follow
+
+AbbeNormal http://www.ourpla.net/cgi-bin/pikie.cgi?
+AcadWiki http://xarch.tu-graz.ac.at/autocad/wiki/
+Acronym http://www.acronymfinder.com/af-query.asp?String=exact&amp;Acronym=
+Advogato http://www.advogato.org/
+AIWiki http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi?
+ALife http://news.alife.org/wiki/index.php?
+AndStuff http://andstuff.org/wiki.php?
+Annotation http://bayle.stanford.edu/crit/nph-med.cgi/
+AnnotationWiki http://www.seedwiki.com/page.cfm?wikiid=368&amp;doc=
+AwarenessWiki http://taoriver.net/aware/
+BenefitsWiki http://www.benefitslink.com/cgi-bin/wiki.cgi?
+BridgesWiki http://c2.com/w2/bridges/
+C2find http://c2.com/cgi/wiki?FindPage&amp;value=
+Cache http://www.google.com/search?q=cache:
+CLiki http://ww.telent.net/cliki/
+CmWiki http://www.ourpla.net/cgi-bin/wiki.pl?
+CreationMatters http://www.ourpla.net/cgi-bin/wiki.pl?
+DejaNews http://www.deja.com/=dnc/getdoc.xp?AN=
+DeWikiPedia http://www.wikipedia.de/wiki.cgi?
+Dictionary http://www.dict.org/bin/Dict?Database=*&amp;Form=Dict1&amp;Strategy=*&amp;Query=
+DiveIntoOsx http://diveintoosx.org/
+DocBook http://docbook.org/wiki/moin.cgi/
+DolphinWiki http://www.object-arts.com/wiki/html/Dolphin/
+EfnetCeeWiki http://purl.net/wiki/c/
+EfnetCppWiki http://purl.net/wiki/cpp/
+EfnetPythonWiki http://purl.net/wiki/python/
+EfnetXmlWiki http://purl.net/wiki/xml/
+EljWiki http://elj.sourceforge.net/phpwiki/index.php/
+EmacsWiki http://www.emacswiki.org/cgi-bin/wiki.pl?
+FinalEmpire http://final-empire.sourceforge.net/cgi-bin/wiki.pl?
+Foldoc http://www.foldoc.org/foldoc/foldoc.cgi?
+FoxWiki http://fox.wikis.com/wc.dll?Wiki~
+FreeBSDman http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;query=
+Google http://www.google.com/search?q=
+GoogleGroups http://groups.google.com/groups?q=
+GreenCheese http://www.greencheese.org/
+HammondWiki http://www.dairiki.org/HammondWiki/index.php3?
+Haribeau http://wiki.haribeau.de/cgi-bin/wiki.pl?
+IAWiki http://www.IAwiki.net/
+IMDB http://us.imdb.com/Title?
+JargonFile http://sunir.org/apps/meta.pl?wiki=JargonFile&amp;redirect=
+JiniWiki http://www.cdegroot.com/cgi-bin/jini?
+JspWiki http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=
+KmWiki http://www.voght.com/cgi-bin/pywiki?
+KnowHow http://www2.iro.umontreal.ca/~paquetse/cgi-bin/wiki.cgi?
+LanifexWiki http://opt.lanifex.com/cgi-bin/wiki.pl?
+LegoWiki http://www.object-arts.com/wiki/html/Lego-Robotics/
+LinuxWiki http://www.linuxwiki.de/
+LugKR http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?
+MathSongsWiki http://SeedWiki.com/page.cfm?wikiid=237&amp;doc=
+MbTest http://www.usemod.com/cgi-bin/mbtest.pl?
+MeatBall http://www.usemod.com/cgi-bin/mb.pl?
+MetaWiki http://sunir.org/apps/meta.pl?
+MetaWikiPedia http://meta.wikipedia.com/wiki/
+MoinMoin http://purl.net/wiki/moin/
+MuWeb http://www.dunstable.com/scripts/MuWebWeb?
+NetVillage http://www.netbros.com/?
+OpenWiki http://openwiki.com/?
+OrgPatterns http://www.bell-labs.com/cgi-user/OrgPatterns/OrgPatterns?
+PangalacticOrg http://www.pangalactic.org/Wiki/
+PersonalTelco http://www.personaltelco.net/index.cgi/
+PhpWiki http://phpwiki.sourceforge.net/phpwiki/index.php?
+Pikie http://pikie.darktech.org/cgi/pikie?
+PPR http://c2.com/cgi/wiki?
+PurlNet http://purl.oclc.org/NET/
+PythonInfo http://www.python.org/cgi-bin/moinmoin/
+PythonWiki http://www.pythonwiki.de/
+PyWiki http://www.voght.com/cgi-bin/pywiki?
+SeaPig http://www.seapig.org/
+SeattleWireless http://seattlewireless.net/?
+SenseisLibrary http://senseis.xmp.net/?
+Shakti http://cgi.algonet.se/htbin/cgiwrap/pgd/ShaktiWiki/
+SourceForge http://sourceforge.net/{NAME}
+Squeak http://minnow.cc.gatech.edu/squeak/
+StrikiWiki http://ch.twi.tudelft.nl/~mostert/striki/teststriki.pl?
+SVGWiki http://www.protocol7.com/svg-wiki/default.asp?
+Tavi http://tavi.sourceforge.net/index.php?
+TmNet http://www.technomanifestos.net/?
+TMwiki http://www.EasyTopicMaps.com/?page=
+TWiki http://twiki.org/cgi-bin/view/{NAME}
+TwistedWiki http://purl.net/wiki/twisted/
+Unreal http://wiki.beyondunreal.com/wiki/
+UseMod http://www.usemod.com/cgi-bin/wiki.pl?
+VisualWorks http://wiki.cs.uiuc.edu/VisualWorks/
+WebDevWikiNL http://www.promo-it.nl/WebDevWiki/index.php?page=
+WebSeitzWiki http://webseitz.fluxent.com/wiki/
+Why http://clublet.com/c/c/why?
+Wiki http://c2.com/cgi/wiki?
+WikiPedia http://www.wikipedia.com/wiki/
+WikiWorld http://WikiWorld.com/wiki/index.php/
+YpsiEyeball http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?
+ZWiki http://www.zwiki.org/
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/license.php b/mod/dokuwiki/vendors/dokuwiki/conf/license.php
new file mode 100644
index 000000000..9a753baa7
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/license.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * This file defines multiple available licenses you can license your
+ * wiki contents under. Do not change this file, but create a
+ * license.local.php instead.
+ */
+
+$license['cc-by'] = array(
+ 'name' => 'CC Attribution 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by/3.0/',
+);
+$license['cc-by-nc'] = array(
+ 'name' => 'CC Attribution-Noncommercial 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-nc/3.0/',
+);
+$license['cc-by-nc-nd'] = array(
+ 'name' => 'CC Attribution-Noncommercial-No Derivative Works 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-nc-nd/3.0/',
+);
+$license['cc-by-nc-sa'] = array(
+ 'name' => 'CC Attribution-Noncommercial-Share Alike 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-nc-sa/3.0/',
+);
+$license['cc-by-nd'] = array(
+ 'name' => 'CC Attribution-No Derivative Works 3.0 Unported',
+ 'url' => 'cc-by-nd',
+);
+$license['cc-by-sa'] = array(
+ 'name' => 'CC Attribution-Share Alike 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-sa/3.0/',
+);
+$license['publicdomain'] = array(
+ 'name' => 'Public Domain',
+ 'url' => 'http://creativecommons.org/licenses/publicdomain/',
+);
+$license['gnufdl'] = array(
+ 'name' => 'GNU Free Documentation License 1.2',
+ 'url' => 'http://www.gnu.org/licenses/fdl-1.2.html',
+);
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/local.php b/mod/dokuwiki/vendors/dokuwiki/conf/local.php
new file mode 100644
index 000000000..74334812b
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/local.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * This is an example of how a local.php coul look like.
+ * Simply copy the options you want to change from dokuwiki.php
+ * to this file and change them.
+ *
+ * When using the installer, a correct local.php file be generated for
+ * you automatically.
+ */
+
+$conf['title'] = 'Elgg Wiki'; //what to show in the title
+$conf['basedir'] = ''; //absolute dir from serveroot - blank for autodetection
+$conf['baseurl'] = ''; //URL to server including protocol - blank for autodetect
+$conf['savedir'] = DOKU_ELGGDATA; //where to store all the files
+
+$conf['useacl'] = 1; //Use Access Control Lists to restrict access?
+$conf['disableactions'] = 'login,logout'; //comma separated list of actions to disable
+
+$conf['updatecheck'] = 0; //automatically check for new releases?
+
+// get language from elgg directly
+$conf['lang'] = get_current_language();
+
+$conf['superuser'] = '@root';
+
+$conf['license'] = 'cc-by-sa'; //see conf/license.php
+
+$conf['pluginmanager'] = 0;
+
+$conf['plugin']['indexmenu']['skip_file']="/(sidebar)/i";
+
+//$conf['superuser'] = 'joe';
+
+/**
+ * The following options are usefull, if you use a MySQL
+ * database as autentication backend. Have a look into
+ * mysql.conf.php too and adjust the options to match
+ * your database installation.
+ */
+$conf['authtype'] = 'elgg';
+//require_once ("mysql.conf.php");
+
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/local.php.dist b/mod/dokuwiki/vendors/dokuwiki/conf/local.php.dist
new file mode 100644
index 000000000..4af6ea594
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/local.php.dist
@@ -0,0 +1,26 @@
+<?php
+/**
+ * This is an example of how a local.php coul look like.
+ * Simply copy the options you want to change from dokuwiki.php
+ * to this file and change them.
+ *
+ * When using the installer, a correct local.php file be generated for
+ * you automatically.
+ */
+
+
+//$conf['title'] = 'My Wiki'; //what to show in the title
+
+//$conf['useacl'] = 1; //Use Access Control Lists to restrict access?
+//$conf['superuser'] = 'joe';
+
+/**
+ * The following options are usefull, if you use a MySQL
+ * database as autentication backend. Have a look into
+ * mysql.conf.php too and adjust the options to match
+ * your database installation.
+ */
+//$conf['authtype'] = 'mysql';
+//require_once ("mysql.conf.php");
+
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/mediameta.php b/mod/dokuwiki/vendors/dokuwiki/conf/mediameta.php
new file mode 100644
index 000000000..ba7117643
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/mediameta.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * This configures which meta data will be editable through
+ * the media manager. Each field of the array is an array with the
+ * following contents:
+ * fieldname - Where data will be saved (EXIF or IPTC field)
+ * label - key to lookup in the $lang var, if not found printed as is
+ * htmltype - 'text' or 'textarea'
+ * lookups - array additional fields to lookup the data (EXIF or IPTC fields)
+ *
+ * The fields are not ordered continously to make inserting additional items
+ * in between simpler.
+ *
+ * This is a PHP snippet, so PHP syntax applies.
+ *
+ * Note: $fields is not a global variable and will not be available to any
+ * other functions or templates later
+ *
+ * You may extend or overwrite this variable in a optional
+ * conf/mediameta.local.php file
+ *
+ * For a list of available EXIF/IPTC fields refer to
+ * http://www.dokuwiki.org/devel:templates:detail.php
+ */
+
+
+$fields = array(
+ 10 => array('Iptc.Headline',
+ 'img_title',
+ 'text'),
+
+ 20 => array('Iptc.Caption',
+ 'img_caption',
+ 'textarea',
+ array('Exif.UserComment',
+ 'Exif.TIFFImageDescription',
+ 'Exif.TIFFUserComment')),
+
+ 30 => array('Iptc.Byline',
+ 'img_artist',
+ 'text',
+ array('Exif.TIFFArtist',
+ 'Exif.Artist',
+ 'Iptc.Credit')),
+
+ 40 => array('Iptc.CopyrightNotice',
+ 'img_copyr',
+ 'text',
+ array('Exif.TIFFCopyright',
+ 'Exif.Copyright')),
+
+ 50 => array('Iptc.Keywords',
+ 'img_keywords',
+ 'text',
+ array('Exif.Category')),
+);
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/mime.conf b/mod/dokuwiki/vendors/dokuwiki/conf/mime.conf
new file mode 100644
index 000000000..2e1ce6bb0
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/mime.conf
@@ -0,0 +1,52 @@
+# Allowed uploadable file extensions and mimetypes are defined here.
+# To extend this file it is recommended to create a mime.local.conf
+# file. Mimetypes that should be downloadable and not be opened in the
+# should be prefixed with a !
+
+jpg image/jpeg
+jpeg image/jpeg
+gif image/gif
+png image/png
+tgz !application/octet-stream
+tar !application/x-gtar
+gz !application/octet-stream
+bz2 !application/octet-stream
+zip !application/zip
+rar !application/rar
+pdf application/pdf
+ps !application/postscript
+doc !application/msword
+xls !application/msexcel
+ppt !application/mspowerpoint
+rtf !application/msword
+swf application/x-shockwave-flash
+
+rpm !application/octet-stream
+deb !application/octet-stream
+
+sxw !application/soffice
+sxc !application/soffice
+sxi !application/soffice
+sxd !application/soffice
+
+odc !application/vnd.oasis.opendocument.chart
+odf !application/vnd.oasis.opendocument.formula
+odg !application/vnd.oasis.opendocument.graphics
+odi !application/vnd.oasis.opendocument.image
+odp !application/vnd.oasis.opendocument.presentation
+ods !application/vnd.oasis.opendocument.spreadsheet
+odt !application/vnd.oasis.opendocument.text
+
+# You should enable HTML and Text uploads only for restricted Wikis.
+# Spammers are known to upload spam pages through unprotected Wikis.
+# Note: Enabling HTML opens Cross Site Scripting vulnerabilities
+# through JavaScript. Only enable this with trusted users. You
+# need to disable the iexssprotect option additionally to
+# adding the mime type here
+#html text/html
+#htm text/html
+#txt text/plain
+#conf text/plain
+#xml text/xml
+
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/msg b/mod/dokuwiki/vendors/dokuwiki/conf/msg
new file mode 100644
index 000000000..38bbb133c
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/msg
@@ -0,0 +1,8 @@
+25
+The first line of this file contains a number, indicating
+which notification messages should not be displayed. This
+is the only information sent to dokuwiki.org when the
+updatecheck option is enabled. You usually don't need to
+change this number as it gets updated when you install the
+new release - but to ignore a certain message set its
+number here.
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/mysql.conf.php.example b/mod/dokuwiki/vendors/dokuwiki/conf/mysql.conf.php.example
new file mode 100644
index 000000000..bd67be82c
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/mysql.conf.php.example
@@ -0,0 +1,253 @@
+<?php
+/*
+ * This is an example configuration for the mysql auth module.
+ *
+ * This SQL statements are optimized for following table structure.
+ * If you use a different one you have to change them accordingly.
+ * See comments of every statement for details.
+ *
+ * TABLE users
+ * uid login pass firstname lastname email
+ *
+ * TABLE groups
+ * gid name
+ *
+ * TABLE usergroup
+ * uid gid
+ *
+ * To use this configuration you have to copy them to local.php
+ * or at least include this file in local.php.
+ */
+
+/* Options to configure database access. You need to set up this
+ * options carefully, otherwise you won't be able to access you
+ * database.
+ */
+$conf['auth']['mysql']['server'] = '';
+$conf['auth']['mysql']['user'] = '';
+$conf['auth']['mysql']['password'] = '';
+$conf['auth']['mysql']['database'] = '';
+
+/* This option enables debug messages in the mysql module. It is
+ * mostly usefull for system admins.
+ */
+$conf['auth']['mysql']['debug'] = 0;
+
+/* Normally password encryption is done by DokuWiki (recommended) but for
+ * some reasons it might be usefull to let the database do the encryption.
+ * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
+ * the database, otherwise the encrypted one.
+ */
+$conf['auth']['mysql']['forwardClearPass'] = 0;
+
+/* Multiple table operations will be protected by locks. This array tolds
+ * the module which tables to lock. If you use any aliases for table names
+ * these array must also contain these aliases. Any unamed alias will cause
+ * a warning during operation. See the example below.
+ */
+$conf['auth']['mysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
+
+/***********************************************************************/
+/* Basic SQL statements for user authentication (required) */
+/***********************************************************************/
+
+/* This statement is used to grant or deny access to the wiki. The result
+ * should be a table with exact one line containing at least the password
+ * of the user. If the result table is empty or contains more than one
+ * row, access will be denied.
+ *
+ * The module access the password as 'pass' so a alias might be necessary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ * %{pass} encrypted or clear text password (depends on 'encryptPass')
+ * %{dgroup} default group name
+ */
+$conf['auth']['mysql']['checkPass'] = "SELECT pass
+ FROM usergroup AS ug
+ JOIN users AS u ON u.uid=ug.uid
+ JOIN groups AS g ON g.gid=ug.gid
+ WHERE login='%{user}'
+ AND name='%{dgroup}'";
+
+/* This statement should return a table with exact one row containing
+ * information about one user. The field needed are:
+ * 'pass' containing the encrypted or clear text password
+ * 'name' the user's full name
+ * 'mail' the user's email address
+ *
+ * Keep in mind that Dokuwiki will access thise information through the
+ * names listed above so aliasses might be neseccary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
+ FROM users
+ WHERE login='%{user}'";
+
+/* This statement is used to get all groups a user is member of. The
+ * result should be a table containing all groups the given user is
+ * member of. The module access the group name as 'group' so a alias
+ * might be nessecary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getGroups'] = "SELECT name as `group`
+ FROM groups g, users u, usergroup ug
+ WHERE u.uid = ug.uid
+ AND g.gid = ug.gid
+ AND u.login='%{user}'";
+
+/***********************************************************************/
+/* Additional minimum SQL statements to use the user manager */
+/***********************************************************************/
+
+/* This statement should return a table containing all user login names
+ * that meet certain filter criteria. The filter expressions will be added
+ * case dependend by the module. At the end a sort expression will be added.
+ * Important is that this list contains no double entries fo a user. Each
+ * user name is only allowed once in the table.
+ *
+ * The login name will be accessed as 'user' to a alias might be neseccary.
+ * No patterns will be replaced in this statement but following patters
+ * will be replaced in the filter expressions:
+ * %{user} in FilterLogin user's login name
+ * %{name} in FilterName user's full name
+ * %{email} in FilterEmail user's email address
+ * %{group} in FilterGroup group name
+ */
+$conf['auth']['mysql']['getUsers'] = "SELECT DISTINCT login AS user
+ FROM users AS u
+ LEFT JOIN usergroup AS ug ON u.uid=ug.uid
+ LEFT JOIN groups AS g ON ug.gid=g.gid";
+$conf['auth']['mysql']['FilterLogin'] = "login LIKE '%{user}'";
+$conf['auth']['mysql']['FilterName'] = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
+$conf['auth']['mysql']['FilterEmail'] = "email LIKE '%{email}'";
+$conf['auth']['mysql']['FilterGroup'] = "name LIKE '%{group}'";
+$conf['auth']['mysql']['SortOrder'] = "ORDER BY login";
+
+/***********************************************************************/
+/* Additional SQL statements to add new users with the user manager */
+/***********************************************************************/
+
+/* This statement should add a user to the database. Minimum information
+ * to store are: login name, password, email address and full name.
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{pass} password (encrypted or clear text, depends on 'encryptPass')
+ * %{email} email address
+ * %{name} user's full name
+ */
+$conf['auth']['mysql']['addUser'] = "INSERT INTO users
+ (login, pass, email, firstname, lastname)
+ VALUES ('%{user}', '%{pass}', '%{email}',
+ SUBSTRING_INDEX('%{name}',' ', 1),
+ SUBSTRING_INDEX('%{name}',' ', -1))";
+
+/* This statement should add a group to the database.
+ * Following patterns will be replaced:
+ * %{group} group name
+ */
+$conf['auth']['mysql']['addGroup'] = "INSERT INTO groups (name)
+ VALUES ('%{group}')";
+
+/* This statement should connect a user to a group (a user become member
+ * of that group).
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
+ VALUES ('%{uid}', '%{gid}')";
+
+/* This statement should remove a group fom the database.
+ * Following patterns will be replaced:
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['delGroup'] = "DELETE FROM groups
+ WHERE gid='%{gid}'";
+
+/* This statement should return the database index of a given user name.
+ * The module will access the index with the name 'id' so a alias might be
+ * necessary.
+ * following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getUserID'] = "SELECT uid AS id
+ FROM users
+ WHERE login='%{user}'";
+
+/***********************************************************************/
+/* Additional SQL statements to delete users with the user manager */
+/***********************************************************************/
+
+/* This statement should remove a user fom the database.
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ */
+$conf['auth']['mysql']['delUser'] = "DELETE FROM users
+ WHERE uid='%{uid}'";
+
+/* This statement should remove all connections from a user to any group
+ * (a user quits membership of all groups).
+ * Following patterns will be replaced:
+ * %{uid} id of a user dataset
+ */
+$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
+ WHERE uid='%{uid}'";
+
+/***********************************************************************/
+/* Additional SQL statements to modify users with the user manager */
+/***********************************************************************/
+
+/* This statements should modify a user entry in the database. The
+ * statements UpdateLogin, UpdatePass, UpdateEmail and UpdateName will be
+ * added to updateUser on demand. Only changed parameters will be used.
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{pass} password (encrypted or clear text, depends on 'encryptPass')
+ * %{email} email address
+ * %{name} user's full name
+ * %{uid} user id that should be updated
+ */
+$conf['auth']['mysql']['updateUser'] = "UPDATE users SET";
+$conf['auth']['mysql']['UpdateLogin'] = "login='%{user}'";
+$conf['auth']['mysql']['UpdatePass'] = "pass='%{pass}'";
+$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
+$conf['auth']['mysql']['UpdateName'] = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
+ lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
+$conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
+
+/* This statement should remove a single connection from a user to a
+ * group (a user quits membership of that group).
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['delUserGroup']= "DELETE FROM usergroup
+ WHERE uid='%{uid}'
+ AND gid='%{gid}'";
+
+/* This statement should return the database index of a given group name.
+ * The module will access the index with the name 'id' so a alias might
+ * be necessary.
+ *
+ * Following patters will be replaced:
+ * %{group} group name
+ */
+$conf['auth']['mysql']['getGroupID'] = "SELECT gid AS id
+ FROM groups
+ WHERE name='%{group}'";
+
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/scheme.conf b/mod/dokuwiki/vendors/dokuwiki/conf/scheme.conf
new file mode 100644
index 000000000..88cb3c44d
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/scheme.conf
@@ -0,0 +1,11 @@
+#Add URL schemes you want to be recognized as links here
+
+http
+https
+telnet
+gopher
+wais
+ftp
+ed2k
+irc
+ldap \ No newline at end of file
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/smileys.conf b/mod/dokuwiki/vendors/dokuwiki/conf/smileys.conf
new file mode 100644
index 000000000..47e4537e2
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/smileys.conf
@@ -0,0 +1,27 @@
+# Smileys configured here will be replaced by the
+# configured images in the smiley directory
+
+8-) icon_cool.gif
+8-O icon_eek.gif
+8-o icon_eek.gif
+:-( icon_sad.gif
+:-) icon_smile.gif
+=) icon_smile2.gif
+:-/ icon_doubt.gif
+:-\ icon_doubt2.gif
+:-? icon_confused.gif
+:-D icon_biggrin.gif
+:-P icon_razz.gif
+:-o icon_surprised.gif
+:-O icon_surprised.gif
+:-x icon_silenced.gif
+:-X icon_silenced.gif
+:-| icon_neutral.gif
+;-) icon_wink.gif
+^_^ icon_fun.gif
+:?: icon_question.gif
+:!: icon_exclaim.gif
+LOL icon_lol.gif
+FIXME fixme.gif
+DELETEME delete.gif
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php b/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php
new file mode 100644
index 000000000..6576eeb5f
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php
@@ -0,0 +1,10 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# user:MD5password:Real Name:email:groups,comma,seperated
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php.dist b/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php.dist
new file mode 100644
index 000000000..6576eeb5f
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/users.auth.php.dist
@@ -0,0 +1,10 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# user:MD5password:Real Name:email:groups,comma,seperated
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/wordblock.conf b/mod/dokuwiki/vendors/dokuwiki/conf/wordblock.conf
new file mode 100644
index 000000000..da7143257
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/wordblock.conf
@@ -0,0 +1,8004 @@
+# This is the URL blacklist from the chongqed.org database
+# it is available from http://blacklist.chongqed.org/
+# You can use each line below as a regular expression
+# that can be tested against URLs on your wiki.
+# The last spammer was added on 2008-09-11 10:14:51
+
+https?:\/\/([^\/]*\.)?-com-boob-sex-sexy\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?0--sex\.com
+https?:\/\/([^\/]*\.)?0-casinos\.org
+https?:\/\/([^\/]*\.)?0-poker\.net
+https?:\/\/([^\/]*\.)?00007\.com
+https?:\/\/([^\/]*\.)?001-mature-teacher\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?007vip\.cn
+https?:\/\/([^\/]*\.)?01incest\.za\.pl
+https?:\/\/([^\/]*\.)?021boy\.com
+https?:\/\/([^\/]*\.)?027168\.com
+https?:\/\/([^\/]*\.)?02incest\.za\.pl
+https?:\/\/([^\/]*\.)?03incest\.za\.pl
+https?:\/\/([^\/]*\.)?086books\.com
+https?:\/\/([^\/]*\.)?0esy-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?0lmz-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?0sxa-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?0tdwrmq8\.org
+https?:\/\/([^\/]*\.)?0x009\.blogspot\.com
+https?:\/\/([^\/]*\.)?1-888-pokermon\.com
+https?:\/\/([^\/]*\.)?1-adipex\.us
+https?:\/\/([^\/]*\.)?1-cialis\.us
+https?:\/\/([^\/]*\.)?1-craps\.net
+https?:\/\/([^\/]*\.)?1-levitra\.us
+https?:\/\/([^\/]*\.)?1-poker-game\.com
+https?:\/\/([^\/]*\.)?1-xenical\.us
+https?:\/\/([^\/]*\.)?10-best-online-casinosx\.blogspot\.com
+https?:\/\/([^\/]*\.)?100-25-ebony-free\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?10med\.com
+https?:\/\/([^\/]*\.)?10pharm\.com
+https?:\/\/([^\/]*\.)?114418523\.blogspot\.com
+https?:\/\/([^\/]*\.)?117000\.com
+https?:\/\/([^\/]*\.)?1177888888\.com
+https?:\/\/([^\/]*\.)?123clips-com-cq03\.blogspot\.com
+https?:\/\/([^\/]*\.)?123clips-com-td\.blogspot\.com
+https?:\/\/([^\/]*\.)?123clips-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?123clips-tp5\.blogspot\.com
+https?:\/\/([^\/]*\.)?126hao\.com
+https?:\/\/([^\/]*\.)?163car\.com
+https?:\/\/([^\/]*\.)?163school\.com\.cn
+https?:\/\/([^\/]*\.)?168chinese\.com
+https?:\/\/([^\/]*\.)?168english\.com
+https?:\/\/([^\/]*\.)?168standard\.com
+https?:\/\/([^\/]*\.)?181st-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?18to19-com-dbo26u\.blogspot\.com
+https?:\/\/([^\/]*\.)?18to19-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?1avoro\.info
+https?:\/\/([^\/]*\.)?1c1garettes-777\.tripod\.com
+https?:\/\/([^\/]*\.)?1centpoker\.us
+https?:\/\/([^\/]*\.)?1clickpoker\.us
+https?:\/\/([^\/]*\.)?1dollarpoker\.us
+https?:\/\/([^\/]*\.)?1ebalo\.org
+https?:\/\/([^\/]*\.)?1freepoker\.us
+https?:\/\/([^\/]*\.)?1gogo\.awardspace\.com
+https?:\/\/([^\/]*\.)?1golod\.org
+https?:\/\/([^\/]*\.)?1i-casino\.com
+https?:\/\/([^\/]*\.)?1jolla\.org
+https?:\/\/([^\/]*\.)?1kaj-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?1min\.us
+https?:\/\/([^\/]*\.)?1onlinepoker\.us
+https?:\/\/([^\/]*\.)?1ringtones\.fateback\.com
+https?:\/\/([^\/]*\.)?1st-in-poker\.us
+https?:\/\/([^\/]*\.)?1st-phentermine\.to\.pl
+https?:\/\/([^\/]*\.)?1st-place-poker\.com
+https?:\/\/([^\/]*\.)?1st-poker\.us
+https?:\/\/([^\/]*\.)?1stpharma\.noads\.biz
+https?:\/\/([^\/]*\.)?1stpharmacy\.rmcinfo\.fr
+https?:\/\/([^\/]*\.)?1stviagra\.coz\.in
+https?:\/\/([^\/]*\.)?1whs\.com
+https?:\/\/([^\/]*\.)?2-poker\.us
+https?:\/\/([^\/]*\.)?2008-web-hosting\.com
+https?:\/\/([^\/]*\.)?2010oa\.com
+https?:\/\/([^\/]*\.)?2228888\.com
+https?:\/\/([^\/]*\.)?24ringtonevme\.blogspot\.com
+https?:\/\/([^\/]*\.)?24x7\.soliday\.org
+https?:\/\/([^\/]*\.)?2apd-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?2cpo-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?30moms-com-dd8h8y1slq\.blogspot\.com
+https?:\/\/([^\/]*\.)?30moms-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?321\.cn
+https?:\/\/([^\/]*\.)?33b\.b33r\.net
+https?:\/\/([^\/]*\.)?33orgy\.org
+https?:\/\/([^\/]*\.)?3mac\.info
+https?:\/\/([^\/]*\.)?3pic-com-ai3\.blogspot\.com
+https?:\/\/([^\/]*\.)?3pic-com-kedet\.blogspot\.com
+https?:\/\/([^\/]*\.)?40inchplus-com-b4\.blogspot\.com
+https?:\/\/([^\/]*\.)?40inchplus-com-toqof\.blogspot\.com
+https?:\/\/([^\/]*\.)?40inchplus-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?4arf-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?4erni-pes\.blogspot\.com
+https?:\/\/([^\/]*\.)?4mednew\.com
+https?:\/\/([^\/]*\.)?4mkat4\.com
+https?:\/\/([^\/]*\.)?4onlinecasino4\.blogspot\.com
+https?:\/\/([^\/]*\.)?4t7e\.info
+https?:\/\/([^\/]*\.)?4tsmiget\.forumzen\.com
+https?:\/\/([^\/]*\.)?4tsutmon\.forumzen\.com
+https?:\/\/([^\/]*\.)?4udf-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?4x2\.net
+https?:\/\/([^\/]*\.)?510sms\.blogbus\.com
+https?:\/\/([^\/]*\.)?5188job\.com
+https?:\/\/([^\/]*\.)?51lac\.com
+https?:\/\/([^\/]*\.)?51lover\.org
+https?:\/\/([^\/]*\.)?51sms\.blogbus\.com
+https?:\/\/([^\/]*\.)?51web\.cn
+https?:\/\/([^\/]*\.)?51wisdom\.com
+https?:\/\/([^\/]*\.)?51wisdom\.com\.cn
+https?:\/\/([^\/]*\.)?51wisdom\.net
+https?:\/\/([^\/]*\.)?520sms\.blogbus\.com
+https?:\/\/([^\/]*\.)?52lac\.net
+https?:\/\/([^\/]*\.)?5417\.cn
+https?:\/\/([^\/]*\.)?54epson\.com
+https?:\/\/([^\/]*\.)?55\.2myip\.com
+https?:\/\/([^\/]*\.)?5588866\.com\.cn
+https?:\/\/([^\/]*\.)?56156\.com
+https?:\/\/([^\/]*\.)?563000\.com
+https?:\/\/([^\/]*\.)?56918\.com
+https?:\/\/([^\/]*\.)?59165\.net
+https?:\/\/([^\/]*\.)?5ijipiao\.com
+https?:\/\/([^\/]*\.)?5up-net-blmpo6qr0\.blogspot\.com
+https?:\/\/([^\/]*\.)?5up-net-wr00skgzbo\.blogspot\.com
+https?:\/\/([^\/]*\.)?63\.217\.31\.49
+https?:\/\/([^\/]*\.)?6717\.com\.cn
+https?:\/\/([^\/]*\.)?69pose\.org
+https?:\/\/([^\/]*\.)?6tvju0a\.nokedem\.com
+https?:\/\/([^\/]*\.)?70678\.com
+https?:\/\/([^\/]*\.)?7171\.blogshot\.nl
+https?:\/\/([^\/]*\.)?72\.net\.cn
+https?:\/\/([^\/]*\.)?77zhong\.com
+https?:\/\/([^\/]*\.)?78\.net\.cn
+https?:\/\/([^\/]*\.)?79179\.com
+https?:\/\/([^\/]*\.)?7982257596\.blogspot\.com
+https?:\/\/([^\/]*\.)?7dftw79\.nokedem\.com
+https?:\/\/([^\/]*\.)?7j5lj\.info
+https?:\/\/([^\/]*\.)?7shg-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?7x7\.ruwe\.net
+https?:\/\/([^\/]*\.)?8-teenies\.freeinsite\.net
+https?:\/\/([^\/]*\.)?80880\.com
+https?:\/\/([^\/]*\.)?8224\.net
+https?:\/\/([^\/]*\.)?86wys\.com
+https?:\/\/([^\/]*\.)?87793798\.cn
+https?:\/\/([^\/]*\.)?888\.web\.com
+https?:\/\/([^\/]*\.)?88by88-ax4nzu\.blogspot\.com
+https?:\/\/([^\/]*\.)?88by88-com-hx06a\.blogspot\.com
+https?:\/\/([^\/]*\.)?88by88-com-nekuk\.blogspot\.com
+https?:\/\/([^\/]*\.)?88tm\.com
+https?:\/\/([^\/]*\.)?8pcg-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?8teenfiles-com-dzlvk\.blogspot\.com
+https?:\/\/([^\/]*\.)?8teenfiles-com-mj6\.blogspot\.com
+https?:\/\/([^\/]*\.)?8teenfiles-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?8thstreetlatinas-com-rw48o84iwl\.blogspot\.com
+https?:\/\/([^\/]*\.)?8vwx-adult-sites\.blogspot\.com
+https?:\/\/([^\/]*\.)?90001\.cn
+https?:\/\/([^\/]*\.)?911\.x24hr\.com
+https?:\/\/([^\/]*\.)?911w\.net
+https?:\/\/([^\/]*\.)?91yg\.com
+https?:\/\/([^\/]*\.)?96china\.com
+https?:\/\/([^\/]*\.)?96china\.net
+https?:\/\/([^\/]*\.)?96d2\.com
+https?:\/\/([^\/]*\.)?98-boot-disk-japanese-window\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?99aids\.com
+https?:\/\/([^\/]*\.)?a-blonde-babe-in-bikini\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?a-milf-video-preview\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?a-onedigitizing\.com
+https?:\/\/([^\/]*\.)?a-oneemb\.com
+https?:\/\/([^\/]*\.)?a-phentermine\.us
+https?:\/\/([^\/]*\.)?a-poker-casino\.com
+https?:\/\/([^\/]*\.)?a-porn-sex-adult-xxx\.com
+https?:\/\/([^\/]*\.)?aaeon\.com\.cn
+https?:\/\/([^\/]*\.)?aalita\.com
+https?:\/\/([^\/]*\.)?aalive\.info
+https?:\/\/([^\/]*\.)?aalop\.info
+https?:\/\/([^\/]*\.)?aamjh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?aaqqywh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ababd1\.com
+https?:\/\/([^\/]*\.)?abasti\.com
+https?:\/\/([^\/]*\.)?abbama\.com
+https?:\/\/([^\/]*\.)?abbc\.edu
+https?:\/\/([^\/]*\.)?abbleg4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?abca\.biz
+https?:\/\/([^\/]*\.)?abcink\.com
+https?:\/\/([^\/]*\.)?abijah\.phpbbx\.de
+https?:\/\/([^\/]*\.)?abijah\.romandie\.com
+https?:\/\/([^\/]*\.)?abito-da-sera\.bb22\.info
+https?:\/\/([^\/]*\.)?about-money-world\.com
+https?:\/\/([^\/]*\.)?aboutinfotech\.com
+https?:\/\/([^\/]*\.)?aboutmitsubishiparts\.cn
+https?:\/\/([^\/]*\.)?abriana\.phpbbx\.de
+https?:\/\/([^\/]*\.)?abrianna\.romandie\.com
+https?:\/\/([^\/]*\.)?absolutely-free-porn-clip-blogyvg\.blogspot\.com
+https?:\/\/([^\/]*\.)?absolutely-free-porn-clip-zone28k\.blogspot\.com
+https?:\/\/([^\/]*\.)?aburri\.com
+https?:\/\/([^\/]*\.)?academics\.smcvt\.edu
+https?:\/\/([^\/]*\.)?acantorr\.forumzen\.com
+https?:\/\/([^\/]*\.)?accounting-degree\.hotmail\.ru
+https?:\/\/([^\/]*\.)?accounting1degre\.chat\.ru
+https?:\/\/([^\/]*\.)?accredited-degre\.hotmail\.ru
+https?:\/\/([^\/]*\.)?accredited1degre\.chat\.ru
+https?:\/\/([^\/]*\.)?accredited2degre\.chat\.ru
+https?:\/\/([^\/]*\.)?acelacacel\.dl\.pl
+https?:\/\/([^\/]*\.)?acelalacel\.blogcu\.com
+https?:\/\/([^\/]*\.)?acelcocna\.lolbb\.com
+https?:\/\/([^\/]*\.)?aceldron\.lightbb\.com
+https?:\/\/([^\/]*\.)?acelgetric\.dl\.pl
+https?:\/\/([^\/]*\.)?acellibo\.dl\.pl
+https?:\/\/([^\/]*\.)?acellitroc\.xa\.pl
+https?:\/\/([^\/]*\.)?acelracer\.graphforum\.com
+https?:\/\/([^\/]*\.)?acelrel\.discutforum\.com
+https?:\/\/([^\/]*\.)?acgetvar\.iphorum\.com
+https?:\/\/([^\/]*\.)?achima\.phpbbx\.de
+https?:\/\/([^\/]*\.)?achima\.romandie\.com
+https?:\/\/([^\/]*\.)?achutsit\.forumzen\.com
+https?:\/\/([^\/]*\.)?acima\.phpbbx\.de
+https?:\/\/([^\/]*\.)?acima\.romandie\.com
+https?:\/\/([^\/]*\.)?acimah\.romandie\.com
+https?:\/\/([^\/]*\.)?aciphexbuy\.chip\.ms
+https?:\/\/([^\/]*\.)?aciphexcheap\.mysite\.de
+https?:\/\/([^\/]*\.)?aciphexcheapbuy\.cut\.by
+https?:\/\/([^\/]*\.)?aciphexgeneric\.redirect\.to
+https?:\/\/([^\/]*\.)?aciphexgenericbuy\.dive\.to
+https?:\/\/([^\/]*\.)?aclyulac\.forumzen\.com
+https?:\/\/([^\/]*\.)?acme-arts\.com
+https?:\/\/([^\/]*\.)?acmonno\.zikforum\.com
+https?:\/\/([^\/]*\.)?acne-medicinebco\.blogspot\.com
+https?:\/\/([^\/]*\.)?acololi\.winnerforum\.net
+https?:\/\/([^\/]*\.)?acouc\.zj\.pl
+https?:\/\/([^\/]*\.)?acrolrel\.blogcu\.com
+https?:\/\/([^\/]*\.)?acscuace\.forumzen\.com
+https?:\/\/([^\/]*\.)?actingland\.com
+https?:\/\/([^\/]*\.)?action-in-lesbian-lover\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?action36-kx8\.blogspot\.com
+https?:\/\/([^\/]*\.)?actonelbuy\.drop\.to
+https?:\/\/([^\/]*\.)?actonelcheap\.notrix\.ch
+https?:\/\/([^\/]*\.)?actonelcheapgeneric\.fanclub\.ms
+https?:\/\/([^\/]*\.)?actonelgeneric\.drop\.to
+https?:\/\/([^\/]*\.)?actonelonline\.drive\.to
+https?:\/\/([^\/]*\.)?acurahost\.cn
+https?:\/\/([^\/]*\.)?acuratrades\.cn
+https?:\/\/([^\/]*\.)?acxza\.szm\.sk
+https?:\/\/([^\/]*\.)?acyclovir\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ad0571\.com
+https?:\/\/([^\/]*\.)?adapturl\.com
+https?:\/\/([^\/]*\.)?adault\.adultserv\.info
+https?:\/\/([^\/]*\.)?adds1\.trafflow\.com
+https?:\/\/([^\/]*\.)?adipex-08pr\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipex-911\.coz\.in
+https?:\/\/([^\/]*\.)?adipex-buyvie\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipex-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipex-phenterminepwf\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipex-wiki\.com
+https?:\/\/([^\/]*\.)?adipex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?adipex\.edu\.tf
+https?:\/\/([^\/]*\.)?adipex\.edublogs\.org
+https?:\/\/([^\/]*\.)?adipex\.health-livening\.com
+https?:\/\/([^\/]*\.)?adipexes\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipexwoq\.blogspot\.com
+https?:\/\/([^\/]*\.)?adipexxdt\.blogspot\.com
+https?:\/\/([^\/]*\.)?adira\.phpbbx\.de
+https?:\/\/([^\/]*\.)?adira\.romandie\.com
+https?:\/\/([^\/]*\.)?adrienneee\.ifrance\.com
+https?:\/\/([^\/]*\.)?adrienneee\.xhostar\.com
+https?:\/\/([^\/]*\.)?adsenseready\.com
+https?:\/\/([^\/]*\.)?adult-clips-com-guqiax1tu\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult-clips-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult-dating-free\.sexnation\.info
+https?:\/\/([^\/]*\.)?adult-dating\.sexnation\.info
+https?:\/\/([^\/]*\.)?adult-free-fucking-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?adult-free-granny-video\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?adult-fx\.info
+https?:\/\/([^\/]*\.)?adult-list-com-wqf4ojq2uk\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult-list-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult-personals\.sexnation\.info
+https?:\/\/([^\/]*\.)?adult-porn-clip-info887\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult-sites-review\.beaffaired\.com
+https?:\/\/([^\/]*\.)?adult\.1foleks\.org
+https?:\/\/([^\/]*\.)?adult1clip\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult1movies\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult1video\.blogspot\.com
+https?:\/\/([^\/]*\.)?adult69club\.tripod\.com
+https?:\/\/([^\/]*\.)?adultbuffet-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?adultpersonalsxgj\.blogspot\.com
+https?:\/\/([^\/]*\.)?adultpersonalz\.net
+https?:\/\/([^\/]*\.)?adultsexvideo\.blogspot\.com
+https?:\/\/([^\/]*\.)?adultsitefind\.info
+https?:\/\/([^\/]*\.)?adultsiteshop\.info
+https?:\/\/([^\/]*\.)?adultsss\.cafe150\.com
+https?:\/\/([^\/]*\.)?adultsss\.freehostia\.com
+https?:\/\/([^\/]*\.)?adust\.my10gb\.com
+https?:\/\/([^\/]*\.)?advanceloanfast\.info
+https?:\/\/([^\/]*\.)?adventure-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?advice-kissing\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?adviser-financial-friendly-gay\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?adviser\.8888mb\.com
+https?:\/\/([^\/]*\.)?adwareremoval\.myinfo\.ws
+https?:\/\/([^\/]*\.)?ae\.siam\.edu
+https?:\/\/([^\/]*\.)?aebn-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?aezat\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?afdtf\.szm\.sk
+https?:\/\/([^\/]*\.)?affishe\.hostcroc\.com
+https?:\/\/([^\/]*\.)?affishe\.webmelia\.com
+https?:\/\/([^\/]*\.)?afraima\.phpbbx\.de
+https?:\/\/([^\/]*\.)?african-american-lesbian-personals\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?africanvagina-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?aftworld\.com
+https?:\/\/([^\/]*\.)?afxbmx\.info
+https?:\/\/([^\/]*\.)?agbht\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?agclore\.dl\.pl
+https?:\/\/([^\/]*\.)?agcw-com-cme2qnyzyt\.blogspot\.com
+https?:\/\/([^\/]*\.)?agcw-com-r10opb\.blogspot\.com
+https?:\/\/([^\/]*\.)?agcw-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?agentlovelette\.250free\.com
+https?:\/\/([^\/]*\.)?aghas\.info
+https?:\/\/([^\/]*\.)?agmy3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?agrrjd4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?agylavu\.org
+https?:\/\/([^\/]*\.)?ah-me-com-af7ipw\.blogspot\.com
+https?:\/\/([^\/]*\.)?ah-me-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?ah-me-t7o\.blogspot\.com
+https?:\/\/([^\/]*\.)?ahava\.phpbbx\.de
+https?:\/\/([^\/]*\.)?ahuva\.phpbbx\.de
+https?:\/\/([^\/]*\.)?aidlov\.com
+https?:\/\/([^\/]*\.)?aids-china\.com
+https?:\/\/([^\/]*\.)?aids\.ik8\.com
+https?:\/\/([^\/]*\.)?aids1\.zj\.com
+https?:\/\/([^\/]*\.)?aids333\.net
+https?:\/\/([^\/]*\.)?aikn3\.szm\.sk
+https?:\/\/([^\/]*\.)?air520\.com
+https?:\/\/([^\/]*\.)?airfarelowest\.net
+https?:\/\/([^\/]*\.)?airline-ticket-now\.com
+https?:\/\/([^\/]*\.)?airline-ticket\.globaltr\.info
+https?:\/\/([^\/]*\.)?ajneuas\.com
+https?:\/\/([^\/]*\.)?akbxb\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?akissbetweenthelegs-com-hesel\.blogspot\.com
+https?:\/\/([^\/]*\.)?akissbetweenthelegs-com-tsawya560\.blogspot\.com
+https?:\/\/([^\/]*\.)?akissbetweenthelegs-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?al-femminile\.freespase\.info
+https?:\/\/([^\/]*\.)?al4a-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?alabamamortgage-x\.com
+https?:\/\/([^\/]*\.)?alalal\.myrealboard\.com
+https?:\/\/([^\/]*\.)?alaldalli\.naturalforum\.net
+https?:\/\/([^\/]*\.)?alanthomashairsalon\.com
+https?:\/\/([^\/]*\.)?alarcit\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?alaskamortgage-x\.com
+https?:\/\/([^\/]*\.)?alba-boob-jessica-slip\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?albergo-economici-rimini\.ll33\.info
+https?:\/\/([^\/]*\.)?albergo-parigi\.freespase\.info
+https?:\/\/([^\/]*\.)?albums-proshots\.com
+https?:\/\/([^\/]*\.)?alchita\.goodforum\.net
+https?:\/\/([^\/]*\.)?alchita\.grafbb\.com
+https?:\/\/([^\/]*\.)?aldabridgeman\.site\.io
+https?:\/\/([^\/]*\.)?aldarta\.discutforum\.com
+https?:\/\/([^\/]*\.)?aldomc\.jc\.pl
+https?:\/\/([^\/]*\.)?aldronboc\.lightbb\.com
+https?:\/\/([^\/]*\.)?aleluja\.asp2\.cz
+https?:\/\/([^\/]*\.)?alerou\.su\.pl
+https?:\/\/([^\/]*\.)?aleteta\.com
+https?:\/\/([^\/]*\.)?alexaner\.etowns\.net
+https?:\/\/([^\/]*\.)?alexmovies-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?alhilalb\.forumzen\.com
+https?:\/\/([^\/]*\.)?alias\.asp2\.cz
+https?:\/\/([^\/]*\.)?aliyah\.phpbbx\.de
+https?:\/\/([^\/]*\.)?aliza\.phpbbx\.de
+https?:\/\/([^\/]*\.)?all-rnb\.com
+https?:\/\/([^\/]*\.)?all4sexonline\.biz
+https?:\/\/([^\/]*\.)?allabout-casino\.com
+https?:\/\/([^\/]*\.)?allabout-poker\.com
+https?:\/\/([^\/]*\.)?allabout-poker\.net
+https?:\/\/([^\/]*\.)?allabout\.onplex\.de
+https?:\/\/([^\/]*\.)?allaboutx\.freeasyhost\.com
+https?:\/\/([^\/]*\.)?allaboutx\.hostingclub\.de
+https?:\/\/([^\/]*\.)?allaboutx\.m5t\.de
+https?:\/\/([^\/]*\.)?allall\.org
+https?:\/\/([^\/]*\.)?allcamsguide\.info
+https?:\/\/([^\/]*\.)?allcars\.digitalzones\.com
+https?:\/\/([^\/]*\.)?allcheapchat\.info
+https?:\/\/([^\/]*\.)?alldep\.com
+https?:\/\/([^\/]*\.)?allearjah\.com
+https?:\/\/([^\/]*\.)?alledasar\.com
+https?:\/\/([^\/]*\.)?allegra\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?allegradgeneric\.sblog\.cz
+https?:\/\/([^\/]*\.)?allen-edmonds-shoes\.info
+https?:\/\/([^\/]*\.)?allergy\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?allforsale\.org
+https?:\/\/([^\/]*\.)?allgoods\.be
+https?:\/\/([^\/]*\.)?allkinds-pills\.com
+https?:\/\/([^\/]*\.)?allkoholik\.php5\.cz
+https?:\/\/([^\/]*\.)?alllb\.com
+https?:\/\/([^\/]*\.)?alllf\.com
+https?:\/\/([^\/]*\.)?alllk\.com
+https?:\/\/([^\/]*\.)?alllm\.com
+https?:\/\/([^\/]*\.)?allln\.com
+https?:\/\/([^\/]*\.)?alllp\.com
+https?:\/\/([^\/]*\.)?allnewfilm\.com
+https?:\/\/([^\/]*\.)?allprintposters\.com
+https?:\/\/([^\/]*\.)?allsitesaccess-com-awfxbo7d\.blogspot\.com
+https?:\/\/([^\/]*\.)?alltel-ringtonedyd\.blogspot\.com
+https?:\/\/([^\/]*\.)?allvids-net-k0bdg\.blogspot\.com
+https?:\/\/([^\/]*\.)?allvids-net-kd0pe5\.blogspot\.com
+https?:\/\/([^\/]*\.)?allweb2006\.info
+https?:\/\/([^\/]*\.)?almgarc\.com
+https?:\/\/([^\/]*\.)?alneja\.goodbb\.net
+https?:\/\/([^\/]*\.)?alnm5\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?alona\.phpbbx\.de
+https?:\/\/([^\/]*\.)?alonso\.stabilt\.se
+https?:\/\/([^\/]*\.)?alphabadgirls\.info
+https?:\/\/([^\/]*\.)?alprazolam-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?alprazolam-xanax\.com
+https?:\/\/([^\/]*\.)?alpy01\.republika\.pl
+https?:\/\/([^\/]*\.)?alracmon\.zikforum\.com
+https?:\/\/([^\/]*\.)?altacebuy\.page\.to
+https?:\/\/([^\/]*\.)?altacebuycheap\.gameday\.de
+https?:\/\/([^\/]*\.)?altacebuygeneric\.cut\.by
+https?:\/\/([^\/]*\.)?altacegeneric\.dive\.to
+https?:\/\/([^\/]*\.)?altacegenericcheap\.notrix\.at
+https?:\/\/([^\/]*\.)?altazel\.blogcu\.com
+https?:\/\/([^\/]*\.)?altrocvi\.jc\.pl
+https?:\/\/([^\/]*\.)?altse\.com
+https?:\/\/([^\/]*\.)?always-credit\.com
+https?:\/\/([^\/]*\.)?always-drugs\.com
+https?:\/\/([^\/]*\.)?always-medications\.com
+https?:\/\/([^\/]*\.)?alyssa-teen\.freeinsite\.net
+https?:\/\/([^\/]*\.)?amal-fucking-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-ass-free-gallery\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-atk-hairy-heather-natural\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-black-naked\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-blonde-cock\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-boob-bouncing\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-contacto-sexo\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-cum-queen\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-foto-free-nude\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-free-erotic\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-free-grannie-picture-xxx\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-free-indian-page-sex\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?amateur-free-man-naked\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-free-sex-xxx\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?amateur-fucking-milf\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-fucking-public\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-hard-com-a4w\.blogspot\.com
+https?:\/\/([^\/]*\.)?amateur-home-photo\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-index-nude\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-interracial-porn\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-man-naked\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-model-for-hire\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-nympho-wife-site\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-pages-porn\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?amateur-porn-clip-blog446\.blogspot\.com
+https?:\/\/([^\/]*\.)?amateur-porn-clip-blogqh1\.blogspot\.com
+https?:\/\/([^\/]*\.)?amateur-porn-clip-blogrv6\.blogspot\.com
+https?:\/\/([^\/]*\.)?amateur-porn-xxx\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-pussy-redhead\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?amateur-teen-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?amateur-teen-sex-movie\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?amateurcurves-com-silib\.blogspot\.com
+https?:\/\/([^\/]*\.)?amateurcurves-com-t7zh3\.blogspot\.com
+https?:\/\/([^\/]*\.)?amazingcum-com-bd7uu0\.blogspot\.com
+https?:\/\/([^\/]*\.)?ambien-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?ambien\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ambien\.conto\.pl
+https?:\/\/([^\/]*\.)?ambien\.esguay\.com
+https?:\/\/([^\/]*\.)?ambien\.fws1\.com
+https?:\/\/([^\/]*\.)?ambien\.goodpharm\.info
+https?:\/\/([^\/]*\.)?ambien\.hav\.pl
+https?:\/\/([^\/]*\.)?ambien\.presteert\.nl
+https?:\/\/([^\/]*\.)?ambien\.skocz\.net
+https?:\/\/([^\/]*\.)?ambiena\.myblogvoice\.com
+https?:\/\/([^\/]*\.)?ambienpills\.coz\.in
+https?:\/\/([^\/]*\.)?ambienrx\.weboficial\.com
+https?:\/\/([^\/]*\.)?ambiens\.ru\.tf
+https?:\/\/([^\/]*\.)?amcq8\.szm\.sk
+https?:\/\/([^\/]*\.)?amenities\.8tt\.org
+https?:\/\/([^\/]*\.)?americansrebuildingneworleans\.com
+https?:\/\/([^\/]*\.)?amicizia-incontri\.bb22\.info
+https?:\/\/([^\/]*\.)?amico-maria\.freespase\.info
+https?:\/\/([^\/]*\.)?amidnitesunset\.blogspot\.com
+https?:\/\/([^\/]*\.)?amino-vera\.blogspot\.com
+https?:\/\/([^\/]*\.)?amira\.phpbbx\.de
+https?:\/\/([^\/]*\.)?amjrs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?amoxil-500mg\.micrositehosting\.info
+https?:\/\/([^\/]*\.)?ampposo\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?amstre\.com
+https?:\/\/([^\/]*\.)?amyhunt\.com
+https?:\/\/([^\/]*\.)?amyjkb\.blogspot\.com
+https?:\/\/([^\/]*\.)?anacondasex\.info
+https?:\/\/([^\/]*\.)?anal-bareback-cum-fucking-shot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?anal-coks-fuck-huge-mega\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?anal-cum-farting\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?anal-cum-fuck\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?anal-dildo-bondage\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-ebony-free-pic\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-ebony-fucking\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-first-pic-time\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-first-time\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-free-mature-sex\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?anal-g\.com
+https?:\/\/([^\/]*\.)?anal-gang-bang-xxx\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-hard-male\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-hardcore-max-sex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?anal-painful-virgin\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?anal-self-penetration\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?anal-sex-teen-tgp\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?anal-sex-video-x-g-g\.blogspot\.com
+https?:\/\/([^\/]*\.)?anal-sex-virgin\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?anal-shemale-site\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?analsexeum\.blogspot\.com
+https?:\/\/([^\/]*\.)?anath\.phpbbx\.de
+https?:\/\/([^\/]*\.)?anbipbm\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?andrewsaluk\.com
+https?:\/\/([^\/]*\.)?andy-roddick-dick\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?angelcakez\.blogspot\.com
+https?:\/\/([^\/]*\.)?angry-sister\.blogspot\.com
+https?:\/\/([^\/]*\.)?anicke\.republika\.pl
+https?:\/\/([^\/]*\.)?anime-art-gay\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?anime-free-hardcore-info-remember\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?anime-porn-clip-blog5a7\.blogspot\.com
+https?:\/\/([^\/]*\.)?ann-angel-tpi\.blogspot\.com
+https?:\/\/([^\/]*\.)?anna-morgan\.blogspot\.com
+https?:\/\/([^\/]*\.)?annqy\.szm\.sk
+https?:\/\/([^\/]*\.)?annugel--h\.blogspot\.com
+https?:\/\/([^\/]*\.)?annuncio-lavoro-milano\.host24h\.info
+https?:\/\/([^\/]*\.)?annuncio-lavoro-segretaria\.freehostss\.info
+https?:\/\/([^\/]*\.)?annuncio-online\.heroez\.info
+https?:\/\/([^\/]*\.)?anteyi\.cn
+https?:\/\/([^\/]*\.)?anthemboy8\.blogspot\.com
+https?:\/\/([^\/]*\.)?anti-aging-skin\.hotmail\.ru
+https?:\/\/([^\/]*\.)?anti_agin_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?anti_aging_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?antidepressants\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?anus-lick-right-way\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?anw66\.blogspot\.com
+https?:\/\/([^\/]*\.)?anxiety\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?anylight4u\.com
+https?:\/\/([^\/]*\.)?aosk\.com
+https?:\/\/([^\/]*\.)?apesapoppin\.blogspot\.com
+https?:\/\/([^\/]*\.)?apextwin\.ifrance\.com
+https?:\/\/([^\/]*\.)?apextwin\.php5\.cz
+https?:\/\/([^\/]*\.)?aponte\.net
+https?:\/\/([^\/]*\.)?appartamento-roma-vacanza\.ll11\.info
+https?:\/\/([^\/]*\.)?applyforit\.ucsd\.edu
+https?:\/\/([^\/]*\.)?apxgmlp\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?arbundar\.forumzen\.com
+https?:\/\/([^\/]*\.)?arcade\.ya\.com
+https?:\/\/([^\/]*\.)?areaseo\.com
+https?:\/\/([^\/]*\.)?arent-boot-made-these-walkin\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?argentina-gay-travel\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ariella\.phpbbx\.de
+https?:\/\/([^\/]*\.)?arielle\.phpbbx\.de
+https?:\/\/([^\/]*\.)?arinastes\.com
+https?:\/\/([^\/]*\.)?aristocort\.4\.pl
+https?:\/\/([^\/]*\.)?arizonamortgage-x\.com
+https?:\/\/([^\/]*\.)?arjj2\.szm\.sk
+https?:\/\/([^\/]*\.)?arketon24\.blogspot\.com
+https?:\/\/([^\/]*\.)?armyanch\.galeon\.com
+https?:\/\/([^\/]*\.)?arosson\.com
+https?:\/\/([^\/]*\.)?arsrz\.szm\.sk
+https?:\/\/([^\/]*\.)?art-xxx\.com
+https?:\/\/([^\/]*\.)?artbennett\.net
+https?:\/\/([^\/]*\.)?arthuriacasino\.com
+https?:\/\/([^\/]*\.)?artnposter\.com
+https?:\/\/([^\/]*\.)?arwuudes\.forumzen\.com
+https?:\/\/([^\/]*\.)?arwuuzet\.forumzen\.com
+https?:\/\/([^\/]*\.)?aryls\.info
+https?:\/\/([^\/]*\.)?asaearh\.blogspot\.com
+https?:\/\/([^\/]*\.)?asaia\.blogspot\.com
+https?:\/\/([^\/]*\.)?asas3\.com
+https?:\/\/([^\/]*\.)?ascht\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?asdiaalr\.forumzen\.com
+https?:\/\/([^\/]*\.)?aselfbas\.forumzen\.com
+https?:\/\/([^\/]*\.)?asfreyl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ashkenazi\.phpbbx\.de
+https?:\/\/([^\/]*\.)?ashlee--serena\.freeinsite\.net
+https?:\/\/([^\/]*\.)?ashlee-clip-free-hand-job\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?asian-bang-gang\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?asian-cum-sucker\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?asian-download-free-porn-video\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?asian-facial\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?asian-fucking-man-woman\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?asian-girl-anal\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?asian-giving-blow-job\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?asian-mmf\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?asian-porn-clip-info6g5\.blogspot\.com
+https?:\/\/([^\/]*\.)?asian-pussysjy\.blogspot\.com
+https?:\/\/([^\/]*\.)?asian-spread-leg\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?asian-teens\.freeinsite\.net
+https?:\/\/([^\/]*\.)?asiansexpvx\.blogspot\.com
+https?:\/\/([^\/]*\.)?asjnquaq\.com
+https?:\/\/([^\/]*\.)?asnmeq\.com
+https?:\/\/([^\/]*\.)?asrendes\.forumzen\.com
+https?:\/\/([^\/]*\.)?asricrac\.forumzen\.com
+https?:\/\/([^\/]*\.)?ass-bare-screensaver-sexy\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?ass-big-black-pussy\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ass-big-free-woman\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?ass-bitch-hot\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?ass-cock-large-nice-tit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?ass-cum-gay-hole\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ass-cute-fat\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ass-day-great-its-somebodys-whop\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ass-dildo-in-man-use\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ass-free-huge-movie-phat-tit\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?ass-free-mature-photo\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?ass-free-naked\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?ass-fucked-porn-star\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ass-hit-up-yo\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?ass-hole-test\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?ass-lick-slut-that\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?ass-man-photo-rumprater-com-woman\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ass-naked-pic-woman-young\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?ass-sa\.com
+https?:\/\/([^\/]*\.)?ass-traffic-thumb\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?assfilled-cofon\.blogspot\.com
+https?:\/\/([^\/]*\.)?assfucking-video\.hereandnow0\.com
+https?:\/\/([^\/]*\.)?assicurazione-moto\.freehostss\.info
+https?:\/\/([^\/]*\.)?asslick-free\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?associate1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?assparade-com-cdr6rm3\.blogspot\.com
+https?:\/\/([^\/]*\.)?astmiv\.com
+https?:\/\/([^\/]*\.)?astsam\.com
+https?:\/\/([^\/]*\.)?aswsu-ddp\.wsu\.edu
+https?:\/\/([^\/]*\.)?atar5\.szm\.sk
+https?:\/\/([^\/]*\.)?atashi-tada\.blogspot\.com
+https?:\/\/([^\/]*\.)?atchina\.com\.cn
+https?:\/\/([^\/]*\.)?atenololhqs\.blogspot\.com
+https?:\/\/([^\/]*\.)?atetech\.com\.cn
+https?:\/\/([^\/]*\.)?athenaindia\.com
+https?:\/\/([^\/]*\.)?ativan\.hav\.pl
+https?:\/\/([^\/]*\.)?ativan1\.skocz\.net
+https?:\/\/([^\/]*\.)?ativans\.eu\.tf
+https?:\/\/([^\/]*\.)?atkmodels-com-g2mc2j\.blogspot\.com
+https?:\/\/([^\/]*\.)?atkmodels-h6\.blogspot\.com
+https?:\/\/([^\/]*\.)?atmoc\.com
+https?:\/\/([^\/]*\.)?atrapy\.pl
+https?:\/\/([^\/]*\.)?auabkc3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?audibookclub\.info
+https?:\/\/([^\/]*\.)?audition-mature-sexy-video-woman\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?audx4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?auejds\.com
+https?:\/\/([^\/]*\.)?aufx8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?augmentin\.4\.pl
+https?:\/\/([^\/]*\.)?augmentinbuy\.megapage\.de
+https?:\/\/([^\/]*\.)?augmentinbuygeneric\.playsite\.de
+https?:\/\/([^\/]*\.)?augmentincheapbuy\.mine\.at
+https?:\/\/([^\/]*\.)?augmentincheapgeneric\.vacations\.to
+https?:\/\/([^\/]*\.)?augmentingeneric\.dive\.to
+https?:\/\/([^\/]*\.)?aumkryl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?auntmia-ivmo1ckhbf\.blogspot\.com
+https?:\/\/([^\/]*\.)?auqkz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?aurar\.info
+https?:\/\/([^\/]*\.)?aurney\.blogspot\.com
+https?:\/\/([^\/]*\.)?aurora-snow-double-anal\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?auto-insurance-2007\.com
+https?:\/\/([^\/]*\.)?auto-insurance-quote\.100freemb\.com
+https?:\/\/([^\/]*\.)?auto-occasioni\.bb22\.info
+https?:\/\/([^\/]*\.)?autoere\.info
+https?:\/\/([^\/]*\.)?autoinsurancevyo\.blogspot\.com
+https?:\/\/([^\/]*\.)?automobileliberty\.cn
+https?:\/\/([^\/]*\.)?ava-devine-friend-hot-mom\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?avalonhyip\.com
+https?:\/\/([^\/]*\.)?avenue-x\.cn
+https?:\/\/([^\/]*\.)?avoidcar\.info
+https?:\/\/([^\/]*\.)?awardspace\.biz
+https?:\/\/([^\/]*\.)?awardspace\.info
+https?:\/\/([^\/]*\.)?awerda\.com
+https?:\/\/([^\/]*\.)?aweu\.cabspace\.com
+https?:\/\/([^\/]*\.)?axfa5\.szm\.sk
+https?:\/\/([^\/]*\.)?axnc0\.szm\.sk
+https?:\/\/([^\/]*\.)?axqui\.szm\.sk
+https?:\/\/([^\/]*\.)?axtu7\.szm\.sk
+https?:\/\/([^\/]*\.)?ayann\.dl\.pl
+https?:\/\/([^\/]*\.)?aynippa\.blogspot\.com
+https?:\/\/([^\/]*\.)?azn-chickadee\.blogspot\.com
+https?:\/\/([^\/]*\.)?azu-erlove\.blogspot\.com
+https?:\/\/([^\/]*\.)?azur3skye\.blogspot\.com
+https?:\/\/([^\/]*\.)?azzacash\.com
+https?:\/\/([^\/]*\.)?b-b-free-hentai-movie-j\.blogspot\.com
+https?:\/\/([^\/]*\.)?b-d-download-porn-movie-n\.blogspot\.com
+https?:\/\/([^\/]*\.)?b\.cn01\.hn\.org
+https?:\/\/([^\/]*\.)?babe-cam-filipina-web\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?babe-dutch-erotic-lingerie\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?babe-forum-picture-porn-star\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?babe-hot-mature\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?babesglamour-com-jotut\.blogspot\.com
+https?:\/\/([^\/]*\.)?babesglamour-com-mp21gz\.blogspot\.com
+https?:\/\/([^\/]*\.)?babibian\.dl\.pl
+https?:\/\/([^\/]*\.)?babooth\.ifrance\.com
+https?:\/\/([^\/]*\.)?babyhere\.net
+https?:\/\/([^\/]*\.)?bachelor1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?back-bare-cum-dripping-fucked-humiliated-pussy-wealthy-woman\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?backroom-facial-margarita\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bad-butt-byron-rub\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bad-butt-byrons-rub\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?bad-credit-home-loanksl\.blogspot\.com
+https?:\/\/([^\/]*\.)?badassteens-com-gnvrh6\.blogspot\.com
+https?:\/\/([^\/]*\.)?badassteens-com-gyhb23dyw\.blogspot\.com
+https?:\/\/([^\/]*\.)?badgirlsblog-com-dcfmx8n2p\.blogspot\.com
+https?:\/\/([^\/]*\.)?badipex\.gog\.pl
+https?:\/\/([^\/]*\.)?bahatoca\.org
+https?:\/\/([^\/]*\.)?baikal-guide\.com
+https?:\/\/([^\/]*\.)?baikal-hotel\.info
+https?:\/\/([^\/]*\.)?baikal-shop\.com
+https?:\/\/([^\/]*\.)?baikal-tour\.biz
+https?:\/\/([^\/]*\.)?baikalguide\.com
+https?:\/\/([^\/]*\.)?baikalshop\.info
+https?:\/\/([^\/]*\.)?bakadeshi\.ifrance\.com
+https?:\/\/([^\/]*\.)?bakamandy\.blogspot\.com
+https?:\/\/([^\/]*\.)?bambulka\.info
+https?:\/\/([^\/]*\.)?bamigreenhouse\.com\.cn
+https?:\/\/([^\/]*\.)?bamima\.com
+https?:\/\/([^\/]*\.)?bandaoti\.dzsc\.com
+https?:\/\/([^\/]*\.)?bang-clip-gang-gang-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?bang-gallery-gang-mature-woman\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?bang-gang-sex-tokyo\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?bank-of-america-credit-cardtja\.blogspot\.com
+https?:\/\/([^\/]*\.)?bank-of-fetish-resource\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?banns\.info
+https?:\/\/([^\/]*\.)?baqaek9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?baquma\.com
+https?:\/\/([^\/]*\.)?bareback-fuck-gay\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?barefootmaniacs-com-rpw1i1\.blogspot\.com
+https?:\/\/([^\/]*\.)?barely18-teens-com-sin\.blogspot\.com
+https?:\/\/([^\/]*\.)?barrystickets\.com
+https?:\/\/([^\/]*\.)?bartik\.asp2\.cz
+https?:\/\/([^\/]*\.)?barulena\.jconserv\.net
+https?:\/\/([^\/]*\.)?basalvar\.dl\.pl
+https?:\/\/([^\/]*\.)?basdeler\.su\.pl
+https?:\/\/([^\/]*\.)?basdombo\.dl\.pl
+https?:\/\/([^\/]*\.)?baslachi\.lightbb\.com
+https?:\/\/([^\/]*\.)?baslalhi\.myrealboard\.com
+https?:\/\/([^\/]*\.)?baslarol\.dl\.pl
+https?:\/\/([^\/]*\.)?basmonzel\.dl\.pl
+https?:\/\/([^\/]*\.)?baspaser\.zikforum\.com
+https?:\/\/([^\/]*\.)?baspasrac\.dl\.pl
+https?:\/\/([^\/]*\.)?baspasvi\.cultureforum\.net
+https?:\/\/([^\/]*\.)?basracchi\.dl\.pl
+https?:\/\/([^\/]*\.)?basteg\.com
+https?:\/\/([^\/]*\.)?bastim\.com
+https?:\/\/([^\/]*\.)?bastnecli\.frbb\.net
+https?:\/\/([^\/]*\.)?bastre\.com
+https?:\/\/([^\/]*\.)?bastru\.com
+https?:\/\/([^\/]*\.)?basuma\.com
+https?:\/\/([^\/]*\.)?bath-hardcore-teen\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bath-product\.hotmail\.ru
+https?:\/\/([^\/]*\.)?bath-product\.pochta\.ru
+https?:\/\/([^\/]*\.)?bath_product\.chat\.ru
+https?:\/\/([^\/]*\.)?bathroom-fuck\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?bbcialis\.ovp\.pl
+https?:\/\/([^\/]*\.)?bbfast\.com
+https?:\/\/([^\/]*\.)?bbndsxtg-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?bbs\.cuesta\.edu
+https?:\/\/([^\/]*\.)?bbsporn\.com
+https?:\/\/([^\/]*\.)?bbuybaliumonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?bbuycialisonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?bbuylevitraonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?bbuytram\.blogcu\.com
+https?:\/\/([^\/]*\.)?bbuytramadolonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?bbuyviagraonlin\.forumlivre\.com
+https?:\/\/([^\/]*\.)?bbw-busty\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?bbw-club-in-san-diego\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bbw-old\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bbw-porn-clip-infotir\.blogspot\.com
+https?:\/\/([^\/]*\.)?bcam8\.szm\.sk
+https?:\/\/([^\/]*\.)?bcdh\.cn
+https?:\/\/([^\/]*\.)?bcialis\.c24\.pl
+https?:\/\/([^\/]*\.)?bcxz8\.szm\.sk
+https?:\/\/([^\/]*\.)?bdsm-lesbian-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?bdsm-personals-houston\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?bdsm-toy\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bdsm-video\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bdsm-vintage\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?bdsmvideos-net-wb55nc\.blogspot\.com
+https?:\/\/([^\/]*\.)?bdsmvideos-net-wfa5qu\.blogspot\.com
+https?:\/\/([^\/]*\.)?bdsmvideos-net-wvckcgq2o\.blogspot\.com
+https?:\/\/([^\/]*\.)?beaffaired\.com
+https?:\/\/([^\/]*\.)?bear-build-gay\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bear-chubby-young\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?bear-terry\.blogspot\.com
+https?:\/\/([^\/]*\.)?beastiality-live\.com
+https?:\/\/([^\/]*\.)?beautiful-ass-pic\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?beautiful-blonde-pole-dancer\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?beautifulzdrawing\.sex-systems\.com
+https?:\/\/([^\/]*\.)?beautyass-com-e1ca\.blogspot\.com
+https?:\/\/([^\/]*\.)?becloudsiss\.thehostcity\.com
+https?:\/\/([^\/]*\.)?bedspread-king\.keckins\.be
+https?:\/\/([^\/]*\.)?begcrucial\.justfree\.com
+https?:\/\/([^\/]*\.)?beginninghouse\.com
+https?:\/\/([^\/]*\.)?begot\.info
+https?:\/\/([^\/]*\.)?beijing-door\.cn
+https?:\/\/([^\/]*\.)?beijingimpression\.com
+https?:\/\/([^\/]*\.)?bekahboo3\.blogspot\.com
+https?:\/\/([^\/]*\.)?beldam\.dns1\.us
+https?:\/\/([^\/]*\.)?bemix\.info
+https?:\/\/([^\/]*\.)?benixon\.dl\.pl
+https?:\/\/([^\/]*\.)?benoit-r86\.blogspot\.com
+https?:\/\/([^\/]*\.)?benson-g68a\.blogspot\.com
+https?:\/\/([^\/]*\.)?benz-h51\.blogspot\.com
+https?:\/\/([^\/]*\.)?beqy\.org
+https?:\/\/([^\/]*\.)?berenupa\.info
+https?:\/\/([^\/]*\.)?berkeley-mdi56f\.blogspot\.com
+https?:\/\/([^\/]*\.)?berlin-o3g\.blogspot\.com
+https?:\/\/([^\/]*\.)?bernie-b18\.blogspot\.com
+https?:\/\/([^\/]*\.)?berrycow\.blogspot\.com
+https?:\/\/([^\/]*\.)?beryl-c3\.blogspot\.com
+https?:\/\/([^\/]*\.)?best-hotels-inns\.com
+https?:\/\/([^\/]*\.)?best-porn-clip-zone0mp\.blogspot\.com
+https?:\/\/([^\/]*\.)?best2006\.info
+https?:\/\/([^\/]*\.)?best568\.com
+https?:\/\/([^\/]*\.)?bestaftor\.com
+https?:\/\/([^\/]*\.)?bestallmed\.info
+https?:\/\/([^\/]*\.)?bestbuyonlinebooks\.com
+https?:\/\/([^\/]*\.)?bestcityhal\.com
+https?:\/\/([^\/]*\.)?bestcyberfish\.com
+https?:\/\/([^\/]*\.)?bestfreegift\.com
+https?:\/\/([^\/]*\.)?bestgames-winner\.com
+https?:\/\/([^\/]*\.)?besthallet\.com
+https?:\/\/([^\/]*\.)?bestinternetexplorer\.info
+https?:\/\/([^\/]*\.)?bestlowmortgagerates\.com
+https?:\/\/([^\/]*\.)?bestmaiden\.com
+https?:\/\/([^\/]*\.)?bestmercedesbez\.info
+https?:\/\/([^\/]*\.)?bestmitsubishiparts\.info
+https?:\/\/([^\/]*\.)?bestmp3online\.com
+https?:\/\/([^\/]*\.)?bestmp3online\.net
+https?:\/\/([^\/]*\.)?bestofe\.com
+https?:\/\/([^\/]*\.)?bestonline-medication\.com
+https?:\/\/([^\/]*\.)?bestonline-shopping\.com
+https?:\/\/([^\/]*\.)?bestorlean\.com
+https?:\/\/([^\/]*\.)?bestpricebentley\.info
+https?:\/\/([^\/]*\.)?bestsellsite\.com
+https?:\/\/([^\/]*\.)?bestxxxanal-1\.tripod\.com
+https?:\/\/([^\/]*\.)?bestyourown\.info
+https?:\/\/([^\/]*\.)?beta-dg174ivc\.blogspot\.com
+https?:\/\/([^\/]*\.)?beth-t6h6\.blogspot\.com
+https?:\/\/([^\/]*\.)?bethany-ezjn\.blogspot\.com
+https?:\/\/([^\/]*\.)?betsie-w4080\.blogspot\.com
+https?:\/\/([^\/]*\.)?betsy-rgxm2e\.blogspot\.com
+https?:\/\/([^\/]*\.)?better\.ws
+https?:\/\/([^\/]*\.)?betty-gy\.blogspot\.com
+https?:\/\/([^\/]*\.)?beverly-hax82jc3md\.blogspot\.com
+https?:\/\/([^\/]*\.)?bevjy\.szm\.sk
+https?:\/\/([^\/]*\.)?beyonce-knowles-nude\.blogspot\.com
+https?:\/\/([^\/]*\.)?bfekd\.szm\.sk
+https?:\/\/([^\/]*\.)?bfgtxs4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?bfi-k5xk7bnu\.blogspot\.com
+https?:\/\/([^\/]*\.)?bfnh2\.szm\.sk
+https?:\/\/([^\/]*\.)?bfqn\.com
+https?:\/\/([^\/]*\.)?bfvsa\.szm\.sk
+https?:\/\/([^\/]*\.)?bgpkvcr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?bhncvw-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?bhqay\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?bi-britney-spears-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?bi-whales\.blogspot\.com
+https?:\/\/([^\/]*\.)?bi-xxx-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?bianca-i7yj\.blogspot\.com
+https?:\/\/([^\/]*\.)?bianpinqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?bicx7\.szm\.sk
+https?:\/\/([^\/]*\.)?bid-sohardcore-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?bidsex\.net
+https?:\/\/([^\/]*\.)?big-big-clit-tit\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?big-bitch-booty-fucked-getting\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?big-black-cock-movie-clip\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?big-black-cock-pic\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?big-black-dick-fat-long\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?big-blonde-mature-tit\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-blonde-teen-tit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-body-fuck\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?big-boob-huge-large\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?big-bouncing-boob-movie\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?big-butt-shemale\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?big-cock-gay-guy-have\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?big-cock-hard-sex\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-cum-cum-shot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?big-cum-movie-swallow-tit-xxx\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-dick-fuck-hot-love-sexy-shemale-that\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?big-ebony-free-gallery-tit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-fat-boob\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-free-lesbian-movie-online-porn\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?big-huge-gigantic-boob\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?big-leg-babes\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?big-leg-nice\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?big-okfl\.blogspot\.com
+https?:\/\/([^\/]*\.)?big-strap-on-dildo\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?big-tit-round-ass-jasmine\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?big-tit-round-ass-maria\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?big-tit-round-ass-picture\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?big-tits\.100freemb\.com
+https?:\/\/([^\/]*\.)?big-titted-bitch\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big-titts-round-ass\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?big-young-cock\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?big\.de\.com
+https?:\/\/([^\/]*\.)?bigapple\.dtdns\.net
+https?:\/\/([^\/]*\.)?bigassadventure-com-g4lvyk\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigbird-aus\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigbreastlovers-com-suqoq\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigcockteenaddiction-com-km\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigcockteenaddiction-com-kpqf40\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigdog-b14q6mwev\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigfoot-c7l\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigfreesex-com-i2csy2\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigfreesex-com-subub\.blogspot\.com
+https?:\/\/([^\/]*\.)?biggest-cock-thickest\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?biggest-dildo-fuck-world\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?biggiebestparis\.com
+https?:\/\/([^\/]*\.)?biglietti-auguri\.net
+https?:\/\/([^\/]*\.)?biglietto-augurio\.freehostss\.info
+https?:\/\/([^\/]*\.)?bigmac-detr0i6y\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigman-tycdhe62d\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigmouthfuls-com-rvl7ep\.blogspot\.com
+https?:\/\/([^\/]*\.)?bignaturals-com-w0\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigpenis\.digitalzones\.com
+https?:\/\/([^\/]*\.)?bigtitpatrol-com-bub8db06d\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigtitsfans-com-rxc3ya\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigtitsroundasses-com-b6auqkd60\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigtitsroundasses-com-redeg\.blogspot\.com
+https?:\/\/([^\/]*\.)?bigtitsroundasses-com-rj85t35x3\.blogspot\.com
+https?:\/\/([^\/]*\.)?biib4\.szm\.sk
+https?:\/\/([^\/]*\.)?bike-boot-dirt-riding\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bike-night\.grimgoe\.be
+https?:\/\/([^\/]*\.)?bikini-wax\.phpbb2\.us
+https?:\/\/([^\/]*\.)?bikinixxx-777now\.tripod\.com
+https?:\/\/([^\/]*\.)?bilbo-ea47j\.blogspot\.com
+https?:\/\/([^\/]*\.)?billy-r4negy1zwm\.blogspot\.com
+https?:\/\/([^\/]*\.)?binky-hu\.blogspot\.com
+https?:\/\/([^\/]*\.)?bio\.research\.ucsc\.edu
+https?:\/\/([^\/]*\.)?biopharmasite\.biz
+https?:\/\/([^\/]*\.)?biperq\.com
+https?:\/\/([^\/]*\.)?bird-iay2s\.blogspot\.com
+https?:\/\/([^\/]*\.)?birdie\.101freehost\.com
+https?:\/\/([^\/]*\.)?birth-control\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?bisexual-cartoon-sex\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?bisexuals-cyber-fuck-horny-lesbian-lezzies-sex\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?bisson\.onthenet\.as
+https?:\/\/([^\/]*\.)?bit-tit-lesbian\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?bitch-fat-hot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?bituka\.com
+https?:\/\/([^\/]*\.)?bivxr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?bizaffiliatecenter\.com
+https?:\/\/([^\/]*\.)?bizarre-love-triangle-lyric-by-frente\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bizarre-sex-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?bizhat\.com
+https?:\/\/([^\/]*\.)?bizhome\.org
+https?:\/\/([^\/]*\.)?bj-trj\.com
+https?:\/\/([^\/]*\.)?bjaoyunhui\.com
+https?:\/\/([^\/]*\.)?bjcee\.com
+https?:\/\/([^\/]*\.)?bjicp\.com
+https?:\/\/([^\/]*\.)?bjicp\.freewebpage\.org
+https?:\/\/([^\/]*\.)?bjicp\.net
+https?:\/\/([^\/]*\.)?bjicp\.org
+https?:\/\/([^\/]*\.)?bjjinhan\.com
+https?:\/\/([^\/]*\.)?bjlzhh\.com
+https?:\/\/([^\/]*\.)?bjocmc3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?bjqmzx\.com
+https?:\/\/([^\/]*\.)?bjrfinfo\.com
+https?:\/\/([^\/]*\.)?bjsscc\.com\.cn
+https?:\/\/([^\/]*\.)?bjtranslate\.com
+https?:\/\/([^\/]*\.)?bjwczx\.com
+https?:\/\/([^\/]*\.)?bjxiongfei\.com
+https?:\/\/([^\/]*\.)?bjxunda\.com
+https?:\/\/([^\/]*\.)?bjzktd\.com
+https?:\/\/([^\/]*\.)?bkclamcp\.t35\.com
+https?:\/\/([^\/]*\.)?bksar\.szm\.sk
+https?:\/\/([^\/]*\.)?bkzor\.szm\.sk
+https?:\/\/([^\/]*\.)?black-amateur-movie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-asian-anal\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?black-boob-sex\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?black-booty-movies-com-i0\.blogspot\.com
+https?:\/\/([^\/]*\.)?black-butt-fat-gay-man\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?black-chick-fuck\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?black-chubby-ebony\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?black-clip-free-full-porn-blog4t5\.blogspot\.com
+https?:\/\/([^\/]*\.)?black-cock-facial\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?black-cock-monster\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?black-cock-white-cunt\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?black-cum-shot-movie\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-domination-female-free-picture-teen\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?black-ebony-free-spreading-tgp\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?black-fat-boob\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?black-free-gay-man-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?black-gay-club\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?black-gay-sex-site\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?black-gay-teen-sex\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?black-hoe-hardcore-sex-gallery\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?black-hoe-that-suck-dick\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?black-jack-4u\.net
+https?:\/\/([^\/]*\.)?black-jack-black\.blogspot\.com
+https?:\/\/([^\/]*\.)?black-jacks\.us
+https?:\/\/([^\/]*\.)?black-jeweler\.org
+https?:\/\/([^\/]*\.)?black-leg-open-wide\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-lesbian-story\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?black-man-fucking-white-sluts\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-monster-boob\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-monster-cock-mpeg\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-on-blonde-sex-picture\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?black-porn-clip-news8bn\.blogspot\.com
+https?:\/\/([^\/]*\.)?black-white-boob\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?black-wide-leg-pants\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?black-woman-sucking-dick\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blackmisheru\.50webs\.org
+https?:\/\/([^\/]*\.)?blade\.host-page\.com
+https?:\/\/([^\/]*\.)?blade1\.host-page\.com
+https?:\/\/([^\/]*\.)?blade10\.host-page\.com
+https?:\/\/([^\/]*\.)?blade2\.host-page\.com
+https?:\/\/([^\/]*\.)?blade4\.host-page\.com
+https?:\/\/([^\/]*\.)?blade5\.host-page\.com
+https?:\/\/([^\/]*\.)?blade6\.host-page\.com
+https?:\/\/([^\/]*\.)?blade7\.host-page\.com
+https?:\/\/([^\/]*\.)?blade8\.host-page\.com
+https?:\/\/([^\/]*\.)?blade9\.host-page\.com
+https?:\/\/([^\/]*\.)?blagoslovenie\.rovno\.ua
+https?:\/\/([^\/]*\.)?blanca-tf50a\.blogspot\.com
+https?:\/\/([^\/]*\.)?blapt\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?blathe\.com
+https?:\/\/([^\/]*\.)?blazer-wwn\.blogspot\.com
+https?:\/\/([^\/]*\.)?blbdg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?blboys-com-wsq27\.blogspot\.com
+https?:\/\/([^\/]*\.)?blbthxw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?blendermedia\.com
+https?:\/\/([^\/]*\.)?blevitra\.ovp\.pl
+https?:\/\/([^\/]*\.)?blmurphy\.dl\.pl
+https?:\/\/([^\/]*\.)?blog-broken-leg\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?blog\.chinaz\.com
+https?:\/\/([^\/]*\.)?blog\.donews\.com
+https?:\/\/([^\/]*\.)?blog\.welover\.org
+https?:\/\/([^\/]*\.)?blog\.yam\.com
+https?:\/\/([^\/]*\.)?blog67\.fc2\.com
+https?:\/\/([^\/]*\.)?blond\.12gbfree\.com
+https?:\/\/([^\/]*\.)?blonde-bald-pussy\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?blonde-blow-job-mpeg\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?blonde-blow-job-tgp\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?blonde-boob-xxx\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blonde-color-hair-platinum\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?blonde-cunt-hair\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?blonde-dumb-not\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?blonde-firework-joke\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?blonde-lesbian-picture\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blonde-long-mature\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?blonde-model-twin\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?blonde-model-wallpaper\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?blonde-teen-bitch\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?blonde-who-fuck\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blonde-with-pink-dildo\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?blonde-xxx-trailer\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?blondie-g7hbdel\.blogspot\.com
+https?:\/\/([^\/]*\.)?blondy-zipper\.iespana\.es
+https?:\/\/([^\/]*\.)?blood-clots-cramp-leg\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?blotrer\.com
+https?:\/\/([^\/]*\.)?blow-deep-free-job-throat\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?blow-free-gallery-in-job-place-public\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blow-gagging-job-pissing-sex\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?blow-job-movie-monster\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?blow-job-video-h-g-b\.blogspot\.com
+https?:\/\/([^\/]*\.)?blowy\.info
+https?:\/\/([^\/]*\.)?blskill\.dl\.pl
+https?:\/\/([^\/]*\.)?blue-phentermine\.coz\.in
+https?:\/\/([^\/]*\.)?bluebird-ki1h06\.blogspot\.com
+https?:\/\/([^\/]*\.)?bluethumbs-com-wn7zce4\.blogspot\.com
+https?:\/\/([^\/]*\.)?blurs\.info
+https?:\/\/([^\/]*\.)?blurzed\.com
+https?:\/\/([^\/]*\.)?bmoer\.szm\.sk
+https?:\/\/([^\/]*\.)?bmoon-tech\.com
+https?:\/\/([^\/]*\.)?bmzz6\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?bnhaq\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?bnme5\.szm\.sk
+https?:\/\/([^\/]*\.)?bnsal\.szm\.sk
+https?:\/\/([^\/]*\.)?bo-wheeling\.blogspot\.com
+https?:\/\/([^\/]*\.)?boatf\.hostpresso\.com
+https?:\/\/([^\/]*\.)?bob-mh5rq0\.blogspot\.com
+https?:\/\/([^\/]*\.)?bobcat-asfz\.blogspot\.com
+https?:\/\/([^\/]*\.)?bobcat-qete\.blogspot\.com
+https?:\/\/([^\/]*\.)?boboczel\.fr-bb\.com
+https?:\/\/([^\/]*\.)?boboer\.heavenforum\.com
+https?:\/\/([^\/]*\.)?bocac\.blogcu\.com
+https?:\/\/([^\/]*\.)?bocalolo\.bbgraf\.com
+https?:\/\/([^\/]*\.)?bocbasdom\.su\.pl
+https?:\/\/([^\/]*\.)?bocbasget\.bbfr\.net
+https?:\/\/([^\/]*\.)?bocchiolo\.zj\.pl
+https?:\/\/([^\/]*\.)?bocerleto\.winnerforum\.net
+https?:\/\/([^\/]*\.)?bocletoget\.cultureforum\.net
+https?:\/\/([^\/]*\.)?bocmonel\.lolforum\.net
+https?:\/\/([^\/]*\.)?boctrocleto\.xa\.pl
+https?:\/\/([^\/]*\.)?bodelel\.goodbb\.net
+https?:\/\/([^\/]*\.)?bodsforthemods-com-txb\.blogspot\.com
+https?:\/\/([^\/]*\.)?body-jewellery-piercing-4u\.com
+https?:\/\/([^\/]*\.)?bodybuilding\.ncedly\.be
+https?:\/\/([^\/]*\.)?bof-xxxvogue-net\.blogspot\.com
+https?:\/\/([^\/]*\.)?bofuno-free-amateur-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?bogetric\.td\.pl
+https?:\/\/([^\/]*\.)?bolds\.info
+https?:\/\/([^\/]*\.)?bolgatalt\.naturalforum\.net
+https?:\/\/([^\/]*\.)?bolle-xeno\.keckins\.be
+https?:\/\/([^\/]*\.)?bologjack\.8tt\.org
+https?:\/\/([^\/]*\.)?bomb9\.szm\.sk
+https?:\/\/([^\/]*\.)?bon-rassi\.com
+https?:\/\/([^\/]*\.)?bondage\.coz\.in
+https?:\/\/([^\/]*\.)?bondagepaper-com-hzt1gq2iw\.blogspot\.com
+https?:\/\/([^\/]*\.)?bondich\.blogspot\.com
+https?:\/\/([^\/]*\.)?boneme-wn\.blogspot\.com
+https?:\/\/([^\/]*\.)?boneprone-com-g0h\.blogspot\.com
+https?:\/\/([^\/]*\.)?boner-dujo\.blogspot\.com
+https?:\/\/([^\/]*\.)?bong-cx0\.blogspot\.com
+https?:\/\/([^\/]*\.)?bong-tedo\.blogspot\.com
+https?:\/\/([^\/]*\.)?bonjour-toxi\.blogspot\.com
+https?:\/\/([^\/]*\.)?bonnie-pequ\.blogspot\.com
+https?:\/\/([^\/]*\.)?bonnie-t00pf3j6\.blogspot\.com
+https?:\/\/([^\/]*\.)?bonota\.blogcu\.com
+https?:\/\/([^\/]*\.)?bonozel\.dl\.pl
+https?:\/\/([^\/]*\.)?bontril\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?bontril\.1k\.pl
+https?:\/\/([^\/]*\.)?boob-dome-com-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?boob-free-large-natural-teen\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boob-little-monster-vicki\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?boob-little-monster-vicki\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?boob-movie-piqe\.blogspot\.com
+https?:\/\/([^\/]*\.)?boob-myspace-com-naked-site\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?boob-nude-pic-small\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boob-video-bb-bb-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?booble-com-orahxf\.blogspot\.com
+https?:\/\/([^\/]*\.)?booble-com-ouq\.blogspot\.com
+https?:\/\/([^\/]*\.)?booger-sure\.blogspot\.com
+https?:\/\/([^\/]*\.)?boogie-sexu\.blogspot\.com
+https?:\/\/([^\/]*\.)?boogie-wy64qty4x\.blogspot\.com
+https?:\/\/([^\/]*\.)?bookcq\.com
+https?:\/\/([^\/]*\.)?bookit-liwe\.blogspot\.com
+https?:\/\/([^\/]*\.)?boole\.cs\.iastate\.edu
+https?:\/\/([^\/]*\.)?boomer-hodo\.blogspot\.com
+https?:\/\/([^\/]*\.)?booster-leto\.blogspot\.com
+https?:\/\/([^\/]*\.)?boot-by-jessica-lyric-made-simpson-walking\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boot-camp-fitness-georgia-summer\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?boot-camp-for-out-of-control-teen\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?boot-cranston-shoes\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?boot-davidson-harley-riding\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?boot-disk-file\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?boot-dress-womens\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?boot-i-in-like-man-rubber\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boot-in-lancashire-maker-shoes\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boot-made-these-video-walkin-watch\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?boot-made-these-walking-who-wrote\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?boot-outlet-timberland\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?boot-riding-supplier\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?boot-these-walking\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bootsie-bihe\.blogspot\.com
+https?:\/\/([^\/]*\.)?bootsie-ku10yu\.blogspot\.com
+https?:\/\/([^\/]*\.)?booty-ebony-gallery\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?booty-ebony-info-remember-video\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?bootycollection-com-cf36tiy45\.blogspot\.com
+https?:\/\/([^\/]*\.)?bootycollection-com-rekiz\.blogspot\.com
+https?:\/\/([^\/]*\.)?boracboc\.su\.pl
+https?:\/\/([^\/]*\.)?borelco\.dl\.pl
+https?:\/\/([^\/]*\.)?borgshare\.org
+https?:\/\/([^\/]*\.)?borjone\.com
+https?:\/\/([^\/]*\.)?borncompany\.com
+https?:\/\/([^\/]*\.)?boryc\.com
+https?:\/\/([^\/]*\.)?boss-bitch-2\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?boss-coerced-fucking-into-wife\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?boss-suno\.blogspot\.com
+https?:\/\/([^\/]*\.)?boston-hardcore-site-myspace-com\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?boston-heqe\.blogspot\.com
+https?:\/\/([^\/]*\.)?bostvndaoe\.blogspot\.com
+https?:\/\/([^\/]*\.)?botaer\.dl\.pl
+https?:\/\/([^\/]*\.)?botast\.com
+https?:\/\/([^\/]*\.)?botrdar\.goodforum\.net
+https?:\/\/([^\/]*\.)?botrdar\.grafbb\.com
+https?:\/\/([^\/]*\.)?boulder-facial-plastic-surgery\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?bov-smut-house-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?bovaral\.naturalforum\.net
+https?:\/\/([^\/]*\.)?bowse\.info
+https?:\/\/([^\/]*\.)?bowtrol\.ventilacia\.yi\.org
+https?:\/\/([^\/]*\.)?bowtrolcoloncleanse\.vlocka\.yi\.org
+https?:\/\/([^\/]*\.)?boy-boy-gay-young\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?boysfirsttime-com-ele2y\.blogspot\.com
+https?:\/\/([^\/]*\.)?bphentermine\.c24\.pl
+https?:\/\/([^\/]*\.)?bphentermine\.ovp\.pl
+https?:\/\/([^\/]*\.)?bqtcfu7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?braburka\.ifrance\.com
+https?:\/\/([^\/]*\.)?bradley-fitu\.blogspot\.com
+https?:\/\/([^\/]*\.)?brahma-steel-toe-boot\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?brandi-a5tds\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandi-vuwi\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandibelle-com-mzqj8l\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandibelle-com-ti\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandon-duso\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandy-cnz56l\.blogspot\.com
+https?:\/\/([^\/]*\.)?brandy-dobu\.blogspot\.com
+https?:\/\/([^\/]*\.)?brasil-pire\.blogspot\.com
+https?:\/\/([^\/]*\.)?brat-nikodim\.blogspot\.com
+https?:\/\/([^\/]*\.)?braves-t7\.blogspot\.com
+https?:\/\/([^\/]*\.)?braves-tuku\.blogspot\.com
+https?:\/\/([^\/]*\.)?bravogirls-com-a7nbqd\.blogspot\.com
+https?:\/\/([^\/]*\.)?bravogirls-com-w12\.blogspot\.com
+https?:\/\/([^\/]*\.)?bravoteens-com-d0v\.blogspot\.com
+https?:\/\/([^\/]*\.)?bravovids-com-rouqs0py\.blogspot\.com
+https?:\/\/([^\/]*\.)?bravovids-r55rxyszt0\.blogspot\.com
+https?:\/\/([^\/]*\.)?brazil-butt-thong\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?brazil-gevo\.blogspot\.com
+https?:\/\/([^\/]*\.)?brazilian-butt-lift-plastic-surgery\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?brb\.pl
+https?:\/\/([^\/]*\.)?breana-foki\.blogspot\.com
+https?:\/\/([^\/]*\.)?breana-wvqscvo5u\.blogspot\.com
+https?:\/\/([^\/]*\.)?breanna-kiwu\.blogspot\.com
+https?:\/\/([^\/]*\.)?breanne-leri\.blogspot\.com
+https?:\/\/([^\/]*\.)?breeanna-quhu\.blogspot\.com
+https?:\/\/([^\/]*\.)?breiana-quhe\.blogspot\.com
+https?:\/\/([^\/]*\.)?brenda-i5z8n4zkb7\.blogspot\.com
+https?:\/\/([^\/]*\.)?brenda-rezo\.blogspot\.com
+https?:\/\/([^\/]*\.)?brenna-xivo\.blogspot\.com
+https?:\/\/([^\/]*\.)?brewster-opqnec8v\.blogspot\.com
+https?:\/\/([^\/]*\.)?brfq6\.szm\.sk
+https?:\/\/([^\/]*\.)?brian-bchd\.blogspot\.com
+https?:\/\/([^\/]*\.)?brianna-dc04k04ivu\.blogspot\.com
+https?:\/\/([^\/]*\.)?brianne-ejv40\.blogspot\.com
+https?:\/\/([^\/]*\.)?brick55\.5gbfree\.com
+https?:\/\/([^\/]*\.)?brickes\.8888mb\.com
+https?:\/\/([^\/]*\.)?bricktilemachine\.com\.cn
+https?:\/\/([^\/]*\.)?bridgette-rjc3pbx6\.blogspot\.com
+https?:\/\/([^\/]*\.)?brightflashes\.blogspot\.com
+https?:\/\/([^\/]*\.)?brionna-hl530r3fe\.blogspot\.com
+https?:\/\/([^\/]*\.)?brisbeck\.com
+https?:\/\/([^\/]*\.)?britney-spear-sexy-ass\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?britney-spears-0\.blogspot\.com
+https?:\/\/([^\/]*\.)?britney-spears-sex-video-t-j-g\.blogspot\.com
+https?:\/\/([^\/]*\.)?brittany-i7ekj3hll\.blogspot\.com
+https?:\/\/([^\/]*\.)?broadcaster-crazy-popular\.freehostss\.info
+https?:\/\/([^\/]*\.)?broadway-ow\.blogspot\.com
+https?:\/\/([^\/]*\.)?brokenbond\.blogspot\.com
+https?:\/\/([^\/]*\.)?bronc\.info
+https?:\/\/([^\/]*\.)?brooke-bejuzava\.blogspot\.com
+https?:\/\/([^\/]*\.)?brooklynn-du\.blogspot\.com
+https?:\/\/([^\/]*\.)?brooks-rare\.lkerfocu\.be
+https?:\/\/([^\/]*\.)?brplank\.ifrance\.com
+https?:\/\/([^\/]*\.)?brrddd\.org
+https?:\/\/([^\/]*\.)?bruce-egqva1m\.blogspot\.com
+https?:\/\/([^\/]*\.)?brunettesexwrl\.blogspot\.com
+https?:\/\/([^\/]*\.)?brush\.hostaim\.com
+https?:\/\/([^\/]*\.)?brutlag\.stanford\.edu
+https?:\/\/([^\/]*\.)?bryan-rdu\.blogspot\.com
+https?:\/\/([^\/]*\.)?bs21sa\.com
+https?:\/\/([^\/]*\.)?bsd-hd\.blogspot\.com
+https?:\/\/([^\/]*\.)?bsoma\.c24\.pl
+https?:\/\/([^\/]*\.)?bsoma\.ovp\.pl
+https?:\/\/([^\/]*\.)?bsri3\.szm\.sk
+https?:\/\/([^\/]*\.)?btipu\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?btix\.combasketball-tickets
+https?:\/\/([^\/]*\.)?btqvb\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?btramadol\.c24\.pl
+https?:\/\/([^\/]*\.)?bubba1-i2pblfp2m\.blogspot\.com
+https?:\/\/([^\/]*\.)?bublifuk\.php5\.cz
+https?:\/\/([^\/]*\.)?bucina\.asp2\.cz
+https?:\/\/([^\/]*\.)?buck-o1i5bt\.blogspot\.com
+https?:\/\/([^\/]*\.)?buddy-bqam83yt\.blogspot\.com
+https?:\/\/([^\/]*\.)?budget7i\.info
+https?:\/\/([^\/]*\.)?buff-com-es-gay-porn-site-l-s-g\.blogspot\.com
+https?:\/\/([^\/]*\.)?bug\.phil\.cmu\.edu
+https?:\/\/([^\/]*\.)?buildercareer\.us
+https?:\/\/([^\/]*\.)?bukicon-free-bisexual-s-b\.blogspot\.com
+https?:\/\/([^\/]*\.)?bukkake-cum-facial-shot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?bulldog-dc86aq4l\.blogspot\.com
+https?:\/\/([^\/]*\.)?bumast\.com
+https?:\/\/([^\/]*\.)?bumins\.com
+https?:\/\/([^\/]*\.)?bunnyteens-com-clpxyq6of\.blogspot\.com
+https?:\/\/([^\/]*\.)?bunnyteens-com-gz7\.blogspot\.com
+https?:\/\/([^\/]*\.)?bupropion-hcl\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?buruan\.dl\.pl
+https?:\/\/([^\/]*\.)?business-brokers\.lkerfocu\.be
+https?:\/\/([^\/]*\.)?business-school\.hotmail\.ru
+https?:\/\/([^\/]*\.)?business-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?business1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?business2school\.chat\.ru
+https?:\/\/([^\/]*\.)?businessitaly\.info
+https?:\/\/([^\/]*\.)?businesx\.atspace\.com
+https?:\/\/([^\/]*\.)?buspar\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?buspirone\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?busstopwhores-com-c0f\.blogspot\.com
+https?:\/\/([^\/]*\.)?busstopwhores-com-ki7\.blogspot\.com
+https?:\/\/([^\/]*\.)?busty-blonde-bomb-shell\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?busty-blonde-fuck\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?busty-escort-porn\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?busty-horny-milf\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?busty-little-girl\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?busty-mature-red-head\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?busty-sex-star\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?busty-super-girl\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?busty-thick-ebony\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?bustyadventures-com-oh518h8l\.blogspot\.com
+https?:\/\/([^\/]*\.)?bustyisland-com-au\.blogspot\.com
+https?:\/\/([^\/]*\.)?bustyisland-mdjgr6khy\.blogspot\.com
+https?:\/\/([^\/]*\.)?bustypassion-com-bpe84\.blogspot\.com
+https?:\/\/([^\/]*\.)?butalbital-apap\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?butalbital\.ru\.tf
+https?:\/\/([^\/]*\.)?butler-h3bpdq\.blogspot\.com
+https?:\/\/([^\/]*\.)?butseriouslyimprov\.com
+https?:\/\/([^\/]*\.)?butt-community-type-white\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?butt-face-fat-her-kong-love-picture-queen-sit\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?butt-fucking-teen\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?butt-girl-rate\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?buttons-iveta\.blogspot\.com
+https?:\/\/([^\/]*\.)?buwelch\.dl\.pl
+https?:\/\/([^\/]*\.)?buwu-admin\.blogspot\.com
+https?:\/\/([^\/]*\.)?buy-ambien-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-ambien\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-ativan\.fil\.ph
+https?:\/\/([^\/]*\.)?buy-bontril\.contact\.cc
+https?:\/\/([^\/]*\.)?buy-carisoprodol\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-celebrex\.bigsitecity\.com
+https?:\/\/([^\/]*\.)?buy-cialis-online\.bigsitecity\.com
+https?:\/\/([^\/]*\.)?buy-cialis\.1k\.pl
+https?:\/\/([^\/]*\.)?buy-cialis\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-cialis\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-cialis20\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-cialishhb\.blogspot\.com
+https?:\/\/([^\/]*\.)?buy-cialisklx\.blogspot\.com
+https?:\/\/([^\/]*\.)?buy-hydrocodone-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?buy-hydrocodone-gs\.net\.tc
+https?:\/\/([^\/]*\.)?buy-hydrocodone\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-hydrocodone\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-levitra\.1k\.pl
+https?:\/\/([^\/]*\.)?buy-levitra\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-lipitor\.contact\.cc
+https?:\/\/([^\/]*\.)?buy-lortab-911\.jo\.pl
+https?:\/\/([^\/]*\.)?buy-online-tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?buy-pharmacy\.blogspot\.com
+https?:\/\/([^\/]*\.)?buy-phentermine-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?buy-phentermine-gs\.net\.tc
+https?:\/\/([^\/]*\.)?buy-phentermine\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-phentermine\.health-livening\.com
+https?:\/\/([^\/]*\.)?buy-phentermine\.hem\.nu
+https?:\/\/([^\/]*\.)?buy-phentermine\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-phentermine20\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-prozac-online\.com
+https?:\/\/([^\/]*\.)?buy-soma\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-tennis-shoes\.info
+https?:\/\/([^\/]*\.)?buy-tramadol-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?buy-tramadol-gs\.net\.tc
+https?:\/\/([^\/]*\.)?buy-tramadol-online911\.jo\.pl
+https?:\/\/([^\/]*\.)?buy-tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?buy-tramadol\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-tramadol\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-tramadol20\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-ultram\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-valium\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-viagra-online\.health-livening\.com
+https?:\/\/([^\/]*\.)?buy-viagra\.esguay\.com
+https?:\/\/([^\/]*\.)?buy-viagra\.health-livening\.com
+https?:\/\/([^\/]*\.)?buy-viagra\.presteert\.nl
+https?:\/\/([^\/]*\.)?buy-viagra20\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy-xanax20\.bravehost\.com
+https?:\/\/([^\/]*\.)?buy4levitra\.blogspot\.com
+https?:\/\/([^\/]*\.)?buy4viagra\.blogspot\.com
+https?:\/\/([^\/]*\.)?buyambien\.blog\.hr
+https?:\/\/([^\/]*\.)?buyambien\.guu\.pl
+https?:\/\/([^\/]*\.)?buybuspar\.4\.pl
+https?:\/\/([^\/]*\.)?buycialisonline\.forumlivre\.com
+https?:\/\/([^\/]*\.)?buycialisonline\.sprayblog\.se
+https?:\/\/([^\/]*\.)?buycialisonline\.sulekha\.com
+https?:\/\/([^\/]*\.)?buycialispills00\.blogspot\.com
+https?:\/\/([^\/]*\.)?buycialiss\.blogsome\.com
+https?:\/\/([^\/]*\.)?buycialiss\.ovp\.pl
+https?:\/\/([^\/]*\.)?buycipro\.4\.pl
+https?:\/\/([^\/]*\.)?buyeffexor\.4\.pl
+https?:\/\/([^\/]*\.)?buyhydrocodone\.blog\.hr
+https?:\/\/([^\/]*\.)?buylevitra\.blog\.hr
+https?:\/\/([^\/]*\.)?buylevitra\.forospace\.com
+https?:\/\/([^\/]*\.)?buylevitraonlin\.forumlivre\.com
+https?:\/\/([^\/]*\.)?buylevitraonline\.sprayblog\.se
+https?:\/\/([^\/]*\.)?buymeridia\.blog\.hr
+https?:\/\/([^\/]*\.)?buyonlineorder\.com
+https?:\/\/([^\/]*\.)?buypaxil\.blog\.hr
+https?:\/\/([^\/]*\.)?buyphentermine2\.livelog\.com
+https?:\/\/([^\/]*\.)?buyphenterminee\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyphenterminez\.blog\.hr
+https?:\/\/([^\/]*\.)?buypropecia\.blog\.hr
+https?:\/\/([^\/]*\.)?buyprozac\.blog\.hr
+https?:\/\/([^\/]*\.)?buyrosebowltickets\.com
+https?:\/\/([^\/]*\.)?buysoma\.1majorhost\.com
+https?:\/\/([^\/]*\.)?buysoma\.cay\.pl
+https?:\/\/([^\/]*\.)?buysomaaonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?buysomaonline\.forospace\.com
+https?:\/\/([^\/]*\.)?buysomaonlinez\.blogsome\.com
+https?:\/\/([^\/]*\.)?buytramadolonli\.forumlivre\.com
+https?:\/\/([^\/]*\.)?buytramadolonline\.sprayblog\.se
+https?:\/\/([^\/]*\.)?buytramadolz\.jubiiblog\.de
+https?:\/\/([^\/]*\.)?buytrazodone\.eamped\.com
+https?:\/\/([^\/]*\.)?buyultram\.forospace\.com
+https?:\/\/([^\/]*\.)?buyultram\.ir\.pl
+https?:\/\/([^\/]*\.)?buyultramonline\.ir\.pl
+https?:\/\/([^\/]*\.)?buyultramxp\.cay\.pl
+https?:\/\/([^\/]*\.)?buyvalium\.one2you\.info
+https?:\/\/([^\/]*\.)?buyvaliumonline\.forumlivre\.com
+https?:\/\/([^\/]*\.)?buyvaliumonline\.jubiiblog\.de
+https?:\/\/([^\/]*\.)?buyvaliumonline\.sprayblog\.se
+https?:\/\/([^\/]*\.)?buyviagra\.seesaa\.net
+https?:\/\/([^\/]*\.)?buyviagraa\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyviagraonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyviagraonline\.sprayblog\.se
+https?:\/\/([^\/]*\.)?buyviagraxp\.cay\.pl
+https?:\/\/([^\/]*\.)?buyvicodinxp\.cay\.pl
+https?:\/\/([^\/]*\.)?buyvvalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyxanax\.5u\.com
+https?:\/\/([^\/]*\.)?buyxanaxxonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyxanaxxp\.cay\.pl
+https?:\/\/([^\/]*\.)?buyxenical\.blog\.hr
+https?:\/\/([^\/]*\.)?buyxenical\.ir\.pl
+https?:\/\/([^\/]*\.)?buyxenicalonline\.ir\.pl
+https?:\/\/([^\/]*\.)?buyxxenical\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyxxenicalonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyycelexa\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyycialis\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyymeridiaonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyyphentermine\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyysoma\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyyviagra\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyyzithromax\.ovp\.pl
+https?:\/\/([^\/]*\.)?buyzoloft\.blog\.hr
+https?:\/\/([^\/]*\.)?buyzyban\.coz\.in
+https?:\/\/([^\/]*\.)?buzerave\.com
+https?:\/\/([^\/]*\.)?bvalium\.c24\.pl
+https?:\/\/([^\/]*\.)?bvalium\.fuks\.pl
+https?:\/\/([^\/]*\.)?bvalium1\.forumup\.org
+https?:\/\/([^\/]*\.)?bviagra\.ovp\.pl
+https?:\/\/([^\/]*\.)?bviagra1\.forumup\.org
+https?:\/\/([^\/]*\.)?bvse1\.szm\.sk
+https?:\/\/([^\/]*\.)?bwmi0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?bwzf6\.szm\.sk
+https?:\/\/([^\/]*\.)?bx6\.blrf\.net
+https?:\/\/([^\/]*\.)?bxanax\.c24\.pl
+https?:\/\/([^\/]*\.)?bxanax\.gog\.pl
+https?:\/\/([^\/]*\.)?bxanax1\.forumup\.org
+https?:\/\/([^\/]*\.)?byhydrocodone\.blog\.espresso\.repubblica\.it
+https?:\/\/([^\/]*\.)?bzxs\.org\.ua
+https?:\/\/([^\/]*\.)?c-canada\.com
+https?:\/\/([^\/]*\.)?c4taldron\.uy\.pl
+https?:\/\/([^\/]*\.)?c4tcaget\.blogcu\.com
+https?:\/\/([^\/]*\.)?c4tcoli\.td\.pl
+https?:\/\/([^\/]*\.)?c4tdarrel\.dl\.pl
+https?:\/\/([^\/]*\.)?c4tdronrel\.goodforum\.net
+https?:\/\/([^\/]*\.)?c4tdronrel\.grafbb\.com
+https?:\/\/([^\/]*\.)?c4tvarcna\.dl\.pl
+https?:\/\/([^\/]*\.)?ca57sgr0h\.org
+https?:\/\/([^\/]*\.)?cable-connection\.keckins\.be
+https?:\/\/([^\/]*\.)?caboboc\.blogcu\.com
+https?:\/\/([^\/]*\.)?cacalife\.com
+https?:\/\/([^\/]*\.)?cacas\.info
+https?:\/\/([^\/]*\.)?caculall\.forumzen\.com
+https?:\/\/([^\/]*\.)?cadiucna\.forumzen\.com
+https?:\/\/([^\/]*\.)?caeserch\.com
+https?:\/\/([^\/]*\.)?cafasc\.com
+https?:\/\/([^\/]*\.)?caguyea\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cahn\.mnsu\.edu
+https?:\/\/([^\/]*\.)?caitlyn-d66tmgwi1\.blogspot\.com
+https?:\/\/([^\/]*\.)?caked\.info
+https?:\/\/([^\/]*\.)?calciatore-nudo\.hostzz\.info
+https?:\/\/([^\/]*\.)?calcio-arbitri\.com
+https?:\/\/([^\/]*\.)?calcio-watch\.com
+https?:\/\/([^\/]*\.)?calcolo-rata-finanziamento\.ll33\.info
+https?:\/\/([^\/]*\.)?calendario-vari\.freespase\.info
+https?:\/\/([^\/]*\.)?calgary-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?californiamortgage-x\.com
+https?:\/\/([^\/]*\.)?call-kelly-com-ky\.blogspot\.com
+https?:\/\/([^\/]*\.)?call-kelly-com-tnm5k7042\.blogspot\.com
+https?:\/\/([^\/]*\.)?callie-es\.blogspot\.com
+https?:\/\/([^\/]*\.)?callsecurity\.blogspot\.com
+https?:\/\/([^\/]*\.)?camaro-r21nu37q\.blogspot\.com
+https?:\/\/([^\/]*\.)?camcrush-com-eudifxp82\.blogspot\.com
+https?:\/\/([^\/]*\.)?camcrush-com-igzig\.blogspot\.com
+https?:\/\/([^\/]*\.)?camcrush-com-my1v8l4\.blogspot\.com
+https?:\/\/([^\/]*\.)?camel-cigarettes\.s5\.com
+https?:\/\/([^\/]*\.)?camelclips-com-budun\.blogspot\.com
+https?:\/\/([^\/]*\.)?camelclips-com-d3s6o2\.blogspot\.com
+https?:\/\/([^\/]*\.)?camelclips-com-h6a5l\.blogspot\.com
+https?:\/\/([^\/]*\.)?camelmenthe\.blogspot\.com
+https?:\/\/([^\/]*\.)?cameralover\.net
+https?:\/\/([^\/]*\.)?camerascams\.info
+https?:\/\/([^\/]*\.)?cameron-h184o7b\.blogspot\.com
+https?:\/\/([^\/]*\.)?camini\.freehostss\.info
+https?:\/\/([^\/]*\.)?canada-birthday\.acb\.pl
+https?:\/\/([^\/]*\.)?canadian-pharmacyfur\.blogspot\.com
+https?:\/\/([^\/]*\.)?canadian-pharmacyyof\.blogspot\.com
+https?:\/\/([^\/]*\.)?cancer-skin\.nm\.ru
+https?:\/\/([^\/]*\.)?cancer-skin\.pochta\.ru
+https?:\/\/([^\/]*\.)?cancer_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?candi-door-hot-mom-next\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?candylist-com-dib\.blogspot\.com
+https?:\/\/([^\/]*\.)?candylist-com-ip72g5\.blogspot\.com
+https?:\/\/([^\/]*\.)?canjipiao\.com
+https?:\/\/([^\/]*\.)?cantante-arabe-sexy\.hostzz\.info
+https?:\/\/([^\/]*\.)?cantor-dz1h733\.blogspot\.com
+https?:\/\/([^\/]*\.)?caorzel\.discutforum\.com
+https?:\/\/([^\/]*\.)?capasdar\.td\.pl
+https?:\/\/([^\/]*\.)?car-free-insurance-quoteqch\.blogspot\.com
+https?:\/\/([^\/]*\.)?car-insurance-\.blogspot\.com
+https?:\/\/([^\/]*\.)?car-insurance-club\.com
+https?:\/\/([^\/]*\.)?car-insurance-p4zw\.blogspot\.com
+https?:\/\/([^\/]*\.)?car-insurance-ratsvex\.blogspot\.com
+https?:\/\/([^\/]*\.)?car-loan-newdma\.blogspot\.com
+https?:\/\/([^\/]*\.)?car-loan-neweei\.blogspot\.com
+https?:\/\/([^\/]*\.)?car1home\.info
+https?:\/\/([^\/]*\.)?carabidule\.net
+https?:\/\/([^\/]*\.)?carbest2006\.info
+https?:\/\/([^\/]*\.)?cardura-rapid-heartbeat\.tlg\.pl
+https?:\/\/([^\/]*\.)?care-skin\.pochta\.ru
+https?:\/\/([^\/]*\.)?career-business\.net
+https?:\/\/([^\/]*\.)?carepharmasite\.info
+https?:\/\/([^\/]*\.)?caribxpressparts\.com
+https?:\/\/([^\/]*\.)?caricc4t\.xa\.pl
+https?:\/\/([^\/]*\.)?carinsurance-x\.com
+https?:\/\/([^\/]*\.)?carinsuranceshh\.blogspot\.com
+https?:\/\/([^\/]*\.)?carisoprodol-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?carisoprodol\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?carisoprodol\.269g\.net
+https?:\/\/([^\/]*\.)?carisoprodol\.47\.pl
+https?:\/\/([^\/]*\.)?carisoprodol\.goodpharm\.info
+https?:\/\/([^\/]*\.)?carisoprodol\.hav\.pl
+https?:\/\/([^\/]*\.)?carisoprodol\.presteert\.nl
+https?:\/\/([^\/]*\.)?carisoprodol\.seesaa\.net
+https?:\/\/([^\/]*\.)?carisoprodol\.skocz\.net
+https?:\/\/([^\/]*\.)?carisoprodolrx\.weboficial\.com
+https?:\/\/([^\/]*\.)?carisoprodols\.blogspot\.com
+https?:\/\/([^\/]*\.)?carley-m3ia3\.blogspot\.com
+https?:\/\/([^\/]*\.)?carlie-a2s405\.blogspot\.com
+https?:\/\/([^\/]*\.)?carol-txxhdpnt\.blogspot\.com
+https?:\/\/([^\/]*\.)?carolina-w2aoe4xx\.blogspot\.com
+https?:\/\/([^\/]*\.)?carolyn-gp2s5\.blogspot\.com
+https?:\/\/([^\/]*\.)?carovi\.su\.pl
+https?:\/\/([^\/]*\.)?carson-ko8z7\.blogspot\.com
+https?:\/\/([^\/]*\.)?carspoker\.u288\.com
+https?:\/\/([^\/]*\.)?cartolina-pasqua\.host24h\.info
+https?:\/\/([^\/]*\.)?cartoon-free-gallery-gay\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cartoon-porn-clip-bloghvn\.blogspot\.com
+https?:\/\/([^\/]*\.)?carxm\.info
+https?:\/\/([^\/]*\.)?casaviva\.19mb\.info
+https?:\/\/([^\/]*\.)?cascq\.szm\.sk
+https?:\/\/([^\/]*\.)?casetvar\.forumzen\.com
+https?:\/\/([^\/]*\.)?cashadvance-x\.com
+https?:\/\/([^\/]*\.)?cashing-view\.com
+https?:\/\/([^\/]*\.)?casing\.dyndns\.dk
+https?:\/\/([^\/]*\.)?casino-555\.com
+https?:\/\/([^\/]*\.)?casino-attraction\.com
+https?:\/\/([^\/]*\.)?casino-games-wiki\.com
+https?:\/\/([^\/]*\.)?casino-magyck\.mutogen\.be
+https?:\/\/([^\/]*\.)?casino-ppp\.com
+https?:\/\/([^\/]*\.)?casino-startup\.com
+https?:\/\/([^\/]*\.)?casino-theory\.com
+https?:\/\/([^\/]*\.)?casino\.requirements\.be
+https?:\/\/([^\/]*\.)?casino1\.forumup\.org
+https?:\/\/([^\/]*\.)?casinos-new\.com
+https?:\/\/([^\/]*\.)?casinostates\.com
+https?:\/\/([^\/]*\.)?casper-a3r1z2a0\.blogspot\.com
+https?:\/\/([^\/]*\.)?cassay\.net
+https?:\/\/([^\/]*\.)?casual-boots\.massioni\.be
+https?:\/\/([^\/]*\.)?catch-c-teens\.blogspot\.com
+https?:\/\/([^\/]*\.)?catherine-tu75h6w\.blogspot\.com
+https?:\/\/([^\/]*\.)?catrelet\.forumzen\.com
+https?:\/\/([^\/]*\.)?cats-wjbreb7e\.blogspot\.com
+https?:\/\/([^\/]*\.)?cayuga-g2legvldk2\.blogspot\.com
+https?:\/\/([^\/]*\.)?cazelmon\.lolforum\.net
+https?:\/\/([^\/]*\.)?cazelolo\.dl\.pl
+https?:\/\/([^\/]*\.)?cbbi\.cn
+https?:\/\/([^\/]*\.)?cbhi8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cbkf0\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?cbwgkm8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cc5f\.dnyp\.com
+https?:\/\/([^\/]*\.)?ccak1\.szm\.sk
+https?:\/\/([^\/]*\.)?ccal\.cultureforum\.net
+https?:\/\/([^\/]*\.)?ccclfak\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ccheapcelexa\.ovp\.pl
+https?:\/\/([^\/]*\.)?ccheapvaliumonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ccline\.info
+https?:\/\/([^\/]*\.)?ccnarac\.uy\.pl
+https?:\/\/([^\/]*\.)?ccobhv7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cdq\.dzsbcn\.com
+https?:\/\/([^\/]*\.)?cdsmart\.info
+https?:\/\/([^\/]*\.)?cdzhs\.szm\.sk
+https?:\/\/([^\/]*\.)?ceasius\.blogspot\.com
+https?:\/\/([^\/]*\.)?cecily-koj\.blogspot\.com
+https?:\/\/([^\/]*\.)?ceclor\.tlg\.pl
+https?:\/\/([^\/]*\.)?celeb-filipina-movie-site\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?celebrex-911\.coz\.in
+https?:\/\/([^\/]*\.)?celebrex-celecoxib-200mg\.tlg\.pl
+https?:\/\/([^\/]*\.)?celebrex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?celebrity-sex-video-n-q-x\.blogspot\.com
+https?:\/\/([^\/]*\.)?celebrity-sex-video\.0800-porn\.com
+https?:\/\/([^\/]*\.)?celebrityprofiler\.com
+https?:\/\/([^\/]*\.)?celelt\.dl\.pl
+https?:\/\/([^\/]*\.)?celeste-mi8q701\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexa\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?celexa\.269g\.net
+https?:\/\/([^\/]*\.)?celexafcy\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexaodt\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexavby\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexavcc\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexazer\.blogspot\.com
+https?:\/\/([^\/]*\.)?celexxaonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?celine-ajha0vxo6\.blogspot\.com
+https?:\/\/([^\/]*\.)?celtic-frost-ringtonedbg\.blogspot\.com
+https?:\/\/([^\/]*\.)?celtic-frost-ringtonepxe\.blogspot\.com
+https?:\/\/([^\/]*\.)?celtic-ring\.boom\.ru
+https?:\/\/([^\/]*\.)?celtic1ring\.chat\.ru
+https?:\/\/([^\/]*\.)?cemast\.com
+https?:\/\/([^\/]*\.)?center-csy73nq1\.blogspot\.com
+https?:\/\/([^\/]*\.)?century-21\.co\.jp
+https?:\/\/([^\/]*\.)?cephalexin\.dynalias\.net
+https?:\/\/([^\/]*\.)?cephalexin\.kicks-ass\.net
+https?:\/\/([^\/]*\.)?cephalexinvyp\.blogspot\.com
+https?:\/\/([^\/]*\.)?ceremi\.com
+https?:\/\/([^\/]*\.)?cerveza\.republika\.pl
+https?:\/\/([^\/]*\.)?cetki\.blogspot\.com
+https?:\/\/([^\/]*\.)?cetuna\.com
+https?:\/\/([^\/]*\.)?cfhc2\.szm\.sk
+https?:\/\/([^\/]*\.)?cfi-tp\.blogspot\.com
+https?:\/\/([^\/]*\.)?cgj-wmkd0p54ap\.blogspot\.com
+https?:\/\/([^\/]*\.)?chain\.webmelia\.com
+https?:\/\/([^\/]*\.)?champion-ghdm2p\.blogspot\.com
+https?:\/\/([^\/]*\.)?chancec-i0\.blogspot\.com
+https?:\/\/([^\/]*\.)?chandler-ozbi2l\.blogspot\.com
+https?:\/\/([^\/]*\.)?chanel-ag2w\.blogspot\.com
+https?:\/\/([^\/]*\.)?charity-eu\.blogspot\.com
+https?:\/\/([^\/]*\.)?charles-rp7s\.blogspot\.com
+https?:\/\/([^\/]*\.)?charlie-gl3ig\.blogspot\.com
+https?:\/\/([^\/]*\.)?charming-kbatna2k\.blogspot\.com
+https?:\/\/([^\/]*\.)?charvis-mj35\.blogspot\.com
+https?:\/\/([^\/]*\.)?chase-online-bankingdir\.blogspot\.com
+https?:\/\/([^\/]*\.)?chasehunt\.com
+https?:\/\/([^\/]*\.)?chasity-oy2mgww10\.blogspot\.com
+https?:\/\/([^\/]*\.)?chat-a7gdn35u\.blogspot\.com
+https?:\/\/([^\/]*\.)?chat-gay-ohio-room\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?chat\.infty\.net
+https?:\/\/([^\/]*\.)?chatelaine-free-lipstick\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?chatou\.dzsc\.com
+https?:\/\/([^\/]*\.)?chatsky\.cn
+https?:\/\/([^\/]*\.)?chaucer\.umuc\.edu
+https?:\/\/([^\/]*\.)?chayse-c0z2untnw\.blogspot\.com
+https?:\/\/([^\/]*\.)?chazuo\.dzsc\.com
+https?:\/\/([^\/]*\.)?chazz-d86hk\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheap-cialis\.presteert\.nl
+https?:\/\/([^\/]*\.)?cheap-hydrocodone\.presteert\.nl
+https?:\/\/([^\/]*\.)?cheap-phentermine\.cheapills\.info
+https?:\/\/([^\/]*\.)?cheap-phentermine\.esguay\.com
+https?:\/\/([^\/]*\.)?cheap-phentermine\.health-livening\.com
+https?:\/\/([^\/]*\.)?cheap-phentermine\.presteert\.nl
+https?:\/\/([^\/]*\.)?cheap-rocky-boot\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?cheap-soma-online\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheap-tramadol-onlin\.zikforum\.com
+https?:\/\/([^\/]*\.)?cheap-tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?cheap-tramadol\.cheapills\.info
+https?:\/\/([^\/]*\.)?cheap-tramadol\.presteert\.nl
+https?:\/\/([^\/]*\.)?cheap-trashy-lingerie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cheap-travel-deal\.globaltr\.info
+https?:\/\/([^\/]*\.)?cheap-valium\.cheapills\.info
+https?:\/\/([^\/]*\.)?cheap-viagra\.health-livening\.com
+https?:\/\/([^\/]*\.)?cheap-viagra\.presteert\.nl
+https?:\/\/([^\/]*\.)?cheap-xanax\.us\.tf
+https?:\/\/([^\/]*\.)?cheapcialiss\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapest-pills\.org
+https?:\/\/([^\/]*\.)?cheapest-viagra-source\.com
+https?:\/\/([^\/]*\.)?cheapestlakerstickets\.com
+https?:\/\/([^\/]*\.)?cheaplakertickets\.com
+https?:\/\/([^\/]*\.)?cheappcialis\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapphentermine\.livelog\.com
+https?:\/\/([^\/]*\.)?cheapphenterminee\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapphntermine\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheappvalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheappviagra\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapsuperbowltickets\.com
+https?:\/\/([^\/]*\.)?cheaptramadol\.forospace\.com
+https?:\/\/([^\/]*\.)?cheaptramadols\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheaptramadolz\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapvaliumm\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapvvalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapxanaxx\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheapxxanax\.ovp\.pl
+https?:\/\/([^\/]*\.)?cheater-t3si78zbf\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheats-e2p3o7nhm\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheaviagra\.blogsome\.com
+https?:\/\/([^\/]*\.)?checkers-wn88\.blogspot\.com
+https?:\/\/([^\/]*\.)?checkproxy\.com
+https?:\/\/([^\/]*\.)?cheerleader-child-photo\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cheerleader-dolphin\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cheerleader-gallery-naughty\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?cheerleader-upskirt-picture\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?cheese-ratzl\.blogspot\.com
+https?:\/\/([^\/]*\.)?chellam-g2w\.blogspot\.com
+https?:\/\/([^\/]*\.)?chelsey-kifs\.blogspot\.com
+https?:\/\/([^\/]*\.)?chem-iv1c82\.blogspot\.com
+https?:\/\/([^\/]*\.)?chemistry-mrrx5e\.blogspot\.com
+https?:\/\/([^\/]*\.)?chemistry\.org\.ua
+https?:\/\/([^\/]*\.)?cheng-o08if\.blogspot\.com
+https?:\/\/([^\/]*\.)?chenglong\.com\.cn
+https?:\/\/([^\/]*\.)?cher-aorxm1s3j7\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheryl-b8\.blogspot\.com
+https?:\/\/([^\/]*\.)?chess-cy\.blogspot\.com
+https?:\/\/([^\/]*\.)?chester1-tfkfl51eb\.blogspot\.com
+https?:\/\/([^\/]*\.)?chevroletcam\.cn
+https?:\/\/([^\/]*\.)?chevy-ekv8ph\.blogspot\.com
+https?:\/\/([^\/]*\.)?chevy1-wwok0ww55\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheyanne-rnriiwno6l\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheyenne-g3l5fa87\.blogspot\.com
+https?:\/\/([^\/]*\.)?cheyne-hm7aik5u\.blogspot\.com
+https?:\/\/([^\/]*\.)?chfielde\.ifrance\.com
+https?:\/\/([^\/]*\.)?chic-ks\.blogspot\.com
+https?:\/\/([^\/]*\.)?chicago-kou3c7e58\.blogspot\.com
+https?:\/\/([^\/]*\.)?chick-gay-kissing\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?chicken-i66t8z76\.blogspot\.com
+https?:\/\/([^\/]*\.)?chico-myg8bv\.blogspot\.com
+https?:\/\/([^\/]*\.)?chidneuer\.frbb\.net
+https?:\/\/([^\/]*\.)?chidronrac\.ephpbb\.com
+https?:\/\/([^\/]*\.)?chidronrec\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?chiefs-oob\.blogspot\.com
+https?:\/\/([^\/]*\.)?chilacna\.td\.pl
+https?:\/\/([^\/]*\.)?child-leg-pain\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?chilton-b82sebrrue\.blogspot\.com
+https?:\/\/([^\/]*\.)?chimp-cu4gvwsceg\.blogspot\.com
+https?:\/\/([^\/]*\.)?china--magnet\.com
+https?:\/\/([^\/]*\.)?china-dwcuzqft6\.blogspot\.com
+https?:\/\/([^\/]*\.)?china-made-door\.com\.cn
+https?:\/\/([^\/]*\.)?china01\.52blog\.net
+https?:\/\/([^\/]*\.)?china02\.52blog\.net
+https?:\/\/([^\/]*\.)?china1\.52blog\.net
+https?:\/\/([^\/]*\.)?china1\.yculblog\.com
+https?:\/\/([^\/]*\.)?china2\.52blog\.net
+https?:\/\/([^\/]*\.)?china2\.yculblog\.com
+https?:\/\/([^\/]*\.)?china3\.yculblog\.com
+https?:\/\/([^\/]*\.)?chinacarcenter\.net
+https?:\/\/([^\/]*\.)?chinacid\.com
+https?:\/\/([^\/]*\.)?chinafoo\.com
+https?:\/\/([^\/]*\.)?chinafurnace\.net
+https?:\/\/([^\/]*\.)?chinakj\.net
+https?:\/\/([^\/]*\.)?chinalhcz\.com
+https?:\/\/([^\/]*\.)?chinaprojectors\.com
+https?:\/\/([^\/]*\.)?chinatranslation\.net
+https?:\/\/([^\/]*\.)?chinayoujiu\.com
+https?:\/\/([^\/]*\.)?chinese-google\.com
+https?:\/\/([^\/]*\.)?chineseaids\.com
+https?:\/\/([^\/]*\.)?chineseaids\.net
+https?:\/\/([^\/]*\.)?chinesezhouyi\.com
+https?:\/\/([^\/]*\.)?chip-thz\.blogspot\.com
+https?:\/\/([^\/]*\.)?chipper-eusa\.blogspot\.com
+https?:\/\/([^\/]*\.)?chippewa-work-boot\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?chiquita-wqok0t741\.blogspot\.com
+https?:\/\/([^\/]*\.)?chiricc4t\.zj\.pl
+https?:\/\/([^\/]*\.)?chiricdel\.fr-bb\.com
+https?:\/\/([^\/]*\.)?chitr\.discutforum\.com
+https?:\/\/([^\/]*\.)?chizelc\.goodforum\.net
+https?:\/\/([^\/]*\.)?chizelc\.grafbb\.com
+https?:\/\/([^\/]*\.)?chizelno\.cultureforum\.net
+https?:\/\/([^\/]*\.)?chkawai\.cn
+https?:\/\/([^\/]*\.)?chocolat-g4\.blogspot\.com
+https?:\/\/([^\/]*\.)?chocolate\.my10gb\.com
+https?:\/\/([^\/]*\.)?chongdianqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?chops-hg47n04tvi\.blogspot\.com
+https?:\/\/([^\/]*\.)?choudoufu\.com
+https?:\/\/([^\/]*\.)?chris-ks6u6dj\.blogspot\.com
+https?:\/\/([^\/]*\.)?chrissy-oyo8z\.blogspot\.com
+https?:\/\/([^\/]*\.)?christ-acczbi1t\.blogspot\.com
+https?:\/\/([^\/]*\.)?christen-bttdc0kn\.blogspot\.com
+https?:\/\/([^\/]*\.)?christeta\.com
+https?:\/\/([^\/]*\.)?christia-ccf2e6\.blogspot\.com
+https?:\/\/([^\/]*\.)?christiaan-dvb\.blogspot\.com
+https?:\/\/([^\/]*\.)?christianj-t3e1j3\.blogspot\.com
+https?:\/\/([^\/]*\.)?christin-ee1qjx\.blogspot\.com
+https?:\/\/([^\/]*\.)?christina-aguilera-pic\.blogspot\.com
+https?:\/\/([^\/]*\.)?christina-wf\.blogspot\.com
+https?:\/\/([^\/]*\.)?christine-rgosvndiqw\.blogspot\.com
+https?:\/\/([^\/]*\.)?christoffe-g4e\.blogspot\.com
+https?:\/\/([^\/]*\.)?christop-hqhff\.blogspot\.com
+https?:\/\/([^\/]*\.)?christy-kflb274n\.blogspot\.com
+https?:\/\/([^\/]*\.)?chrome-it8j\.blogspot\.com
+https?:\/\/([^\/]*\.)?chrykne\.info
+https?:\/\/([^\/]*\.)?chrystian-mgxw3jyfb1\.blogspot\.com
+https?:\/\/([^\/]*\.)?chuanganqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?chubby-bear-pic\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?chubby-chick\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?chubby-cum\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?chubby-teens-tus\.blogspot\.com
+https?:\/\/([^\/]*\.)?chuck-oh\.blogspot\.com
+https?:\/\/([^\/]*\.)?chucky-aklnscme\.blogspot\.com
+https?:\/\/([^\/]*\.)?chulyt\.com
+https?:\/\/([^\/]*\.)?church-b0w4\.blogspot\.com
+https?:\/\/([^\/]*\.)?chuvak-org\.blogspot\.com
+https?:\/\/([^\/]*\.)?chvpqa7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?chyna-c2\.blogspot\.com
+https?:\/\/([^\/]*\.)?ci-video-pornograficos-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?cialis-for-sale\.com
+https?:\/\/([^\/]*\.)?cialis-ok-1\.blogspot\.com
+https?:\/\/([^\/]*\.)?cialis-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?cialis-pharma\.tripod\.com
+https?:\/\/([^\/]*\.)?cialis-soft-tabs\.com
+https?:\/\/([^\/]*\.)?cialis\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?cialis\.esguay\.com
+https?:\/\/([^\/]*\.)?cialis\.fws1\.com
+https?:\/\/([^\/]*\.)?cialis\.goodpharm\.info
+https?:\/\/([^\/]*\.)?cialis\.page\.tl
+https?:\/\/([^\/]*\.)?cialis\.presteert\.nl
+https?:\/\/([^\/]*\.)?cialis\.rx4\.org
+https?:\/\/([^\/]*\.)?cialis\.seesaa\.net
+https?:\/\/([^\/]*\.)?cialis\.skocz\.net
+https?:\/\/([^\/]*\.)?cialises\.us\.tf
+https?:\/\/([^\/]*\.)?cialisjiq\.blogspot\.com
+https?:\/\/([^\/]*\.)?cialispills\.blog\.hr
+https?:\/\/([^\/]*\.)?cialisrx\.weboficial\.com
+https?:\/\/([^\/]*\.)?cialisx\.host-page\.com
+https?:\/\/([^\/]*\.)?ciara-d0\.blogspot\.com
+https?:\/\/([^\/]*\.)?cierra-t1f0hy\.blogspot\.com
+https?:\/\/([^\/]*\.)?cigar-ekelo\.blogspot\.com
+https?:\/\/([^\/]*\.)?cigarettes-smoking-online\.com
+https?:\/\/([^\/]*\.)?cigarettes\.4\.pl
+https?:\/\/([^\/]*\.)?cilmer\.com
+https?:\/\/([^\/]*\.)?cinast\.com
+https?:\/\/([^\/]*\.)?cincydj\.ifrance\.com
+https?:\/\/([^\/]*\.)?cinder-w6\.blogspot\.com
+https?:\/\/([^\/]*\.)?cindi-ruo8\.blogspot\.com
+https?:\/\/([^\/]*\.)?cindy-gdhs2i21u6\.blogspot\.com
+https?:\/\/([^\/]*\.)?cinem4\.com
+https?:\/\/([^\/]*\.)?cingularringtones\.269g\.net
+https?:\/\/([^\/]*\.)?ciplactin\.tlg\.pl
+https?:\/\/([^\/]*\.)?ciprobuy\.hop\.to
+https?:\/\/([^\/]*\.)?ciprobuycheap\.firstpage\.de
+https?:\/\/([^\/]*\.)?ciprobuygeneric\.move\.to
+https?:\/\/([^\/]*\.)?ciprocheap\.dive\.to
+https?:\/\/([^\/]*\.)?ciprofloxacin\.xwiki\.com
+https?:\/\/([^\/]*\.)?ciprogeneric\.i\.am
+https?:\/\/([^\/]*\.)?citdokcna\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?citeccit\.forumculture\.net
+https?:\/\/([^\/]*\.)?citpocit\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?civisi\.com
+https?:\/\/([^\/]*\.)?cixingcailiao\.dzsc\.com
+https?:\/\/([^\/]*\.)?cjhx6\.szm\.sk
+https?:\/\/([^\/]*\.)?ckalv\.szm\.sk
+https?:\/\/([^\/]*\.)?ckfhhw4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ckqabl1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?claca\.blogcu\.com
+https?:\/\/([^\/]*\.)?claire-k6kkha\.blogspot\.com
+https?:\/\/([^\/]*\.)?clancy-i1ib\.blogspot\.com
+https?:\/\/([^\/]*\.)?clara-mj6ts\.blogspot\.com
+https?:\/\/([^\/]*\.)?clarissa-o14r\.blogspot\.com
+https?:\/\/([^\/]*\.)?clark-asa0i3mfvr\.blogspot\.com
+https?:\/\/([^\/]*\.)?classic-porn-clip-zoneykt\.blogspot\.com
+https?:\/\/([^\/]*\.)?claude-blw\.blogspot\.com
+https?:\/\/([^\/]*\.)?claudia-c7ut8jj4\.blogspot\.com
+https?:\/\/([^\/]*\.)?clay-e-facial-mask-vitamin\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cleaner-ddiggwqy1t\.blogspot\.com
+https?:\/\/([^\/]*\.)?clearmp3\.net
+https?:\/\/([^\/]*\.)?clerk\.lir\.dk
+https?:\/\/([^\/]*\.)?cletoac\.lolbb\.com
+https?:\/\/([^\/]*\.)?cleveland-txjimr\.blogspot\.com
+https?:\/\/([^\/]*\.)?clickhere2\.net
+https?:\/\/([^\/]*\.)?clior\.graphforum\.com
+https?:\/\/([^\/]*\.)?clip-ebony-lesbian-porn\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?clip-ebony-porn\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?clip-free-hand-job-movie-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?clip-free-porn-psp-newsy66\.blogspot\.com
+https?:\/\/([^\/]*\.)?clip-hentai\.dreamsuit\.net
+https?:\/\/([^\/]*\.)?clip-hunter-porn-blogctv\.blogspot\.com
+https?:\/\/([^\/]*\.)?clip-hunter-porn-zone8y6\.blogspot\.com
+https?:\/\/([^\/]*\.)?clip-malay-porn-newsgrq\.blogspot\.com
+https?:\/\/([^\/]*\.)?clip-malay-porn-zone1w3\.blogspot\.com
+https?:\/\/([^\/]*\.)?clipgalaxy-com-i4z645\.blogspot\.com
+https?:\/\/([^\/]*\.)?clipgalaxy-com-io8ncz\.blogspot\.com
+https?:\/\/([^\/]*\.)?clipper-e2buyg\.blogspot\.com
+https?:\/\/([^\/]*\.)?clirol\.dl\.pl
+https?:\/\/([^\/]*\.)?clit-huge-real\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?cllivers\.dl\.pl
+https?:\/\/([^\/]*\.)?clobetasol-propionate\.tlg\.pl
+https?:\/\/([^\/]*\.)?cloclo-w046r\.blogspot\.com
+https?:\/\/([^\/]*\.)?clonazepam\.us\.tf
+https?:\/\/([^\/]*\.)?clonazepamscz\.blogspot\.com
+https?:\/\/([^\/]*\.)?clonazepamuej\.blogspot\.com
+https?:\/\/([^\/]*\.)?clonsex\.info
+https?:\/\/([^\/]*\.)?closeout-womens-rain-boot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?clothes-newborns\.loretic\.be
+https?:\/\/([^\/]*\.)?cloudydayshadow\.blogspot\.com
+https?:\/\/([^\/]*\.)?clover-rs04\.blogspot\.com
+https?:\/\/([^\/]*\.)?clowns-gloi\.blogspot\.com
+https?:\/\/([^\/]*\.)?clu\.cn
+https?:\/\/([^\/]*\.)?clumsy-hl0fwl1k\.blogspot\.com
+https?:\/\/([^\/]*\.)?cluster-k4ovd06ibi\.blogspot\.com
+https?:\/\/([^\/]*\.)?clwilbur\.ifrance\.com
+https?:\/\/([^\/]*\.)?clyaod2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cmauq\.com
+https?:\/\/([^\/]*\.)?cmnanwe\.com
+https?:\/\/([^\/]*\.)?cmsrt\.szm\.sk
+https?:\/\/([^\/]*\.)?cmubroadway\.blogspot\.com
+https?:\/\/([^\/]*\.)?cnaalget\.graphforum\.com
+https?:\/\/([^\/]*\.)?cnaalget\.highforum\.net
+https?:\/\/([^\/]*\.)?cnac4t-or\.bbgraf\.com
+https?:\/\/([^\/]*\.)?cnadel6or6\.dl\.pl
+https?:\/\/([^\/]*\.)?cnaeltbo\.discutforum\.com
+https?:\/\/([^\/]*\.)?cnaeltdron\.bb-fr\.com
+https?:\/\/([^\/]*\.)?cnapasou\.graphforum\.com
+https?:\/\/([^\/]*\.)?cnatral\.xa\.pl
+https?:\/\/([^\/]*\.)?cnbess\.com
+https?:\/\/([^\/]*\.)?cnbf2\.szm\.sk
+https?:\/\/([^\/]*\.)?cncarcenter\.com
+https?:\/\/([^\/]*\.)?cnfibernet\.com\.cn
+https?:\/\/([^\/]*\.)?cnmarketingresearch\.com
+https?:\/\/([^\/]*\.)?cnplayhome\.cn
+https?:\/\/([^\/]*\.)?cnticket\.net
+https?:\/\/([^\/]*\.)?co-alf\.blogspot\.com
+https?:\/\/([^\/]*\.)?co-video-de-sexo-gratis-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?co6or6bo\.dl\.pl
+https?:\/\/([^\/]*\.)?coacdar\.bbfr\.net
+https?:\/\/([^\/]*\.)?coachescorner\.com
+https?:\/\/([^\/]*\.)?cock-and-ball-punishment\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cock-deep-huge-throat\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cock-love-teen\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?cock-petite-sucker\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?cock-roaches-picture\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?cock-sexy-sucker\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?cock-story-sucker\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cocnacna\.dl\.pl
+https?:\/\/([^\/]*\.)?cocoel\.lightbb\.com
+https?:\/\/([^\/]*\.)?coconel\.frbb\.net
+https?:\/\/([^\/]*\.)?codarget\.dl\.pl
+https?:\/\/([^\/]*\.)?codigodor\.blogspot\.com
+https?:\/\/([^\/]*\.)?coiqen\.com
+https?:\/\/([^\/]*\.)?cold-hard-bitch-lyric\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?college-fucking-video-free\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?college1-degree\.boom\.ru
+https?:\/\/([^\/]*\.)?college1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?college1degree1p\.chat\.ru
+https?:\/\/([^\/]*\.)?colodom\.frbb\.net
+https?:\/\/([^\/]*\.)?colorado\.edu
+https?:\/\/([^\/]*\.)?coloradomortgage-x\.com
+https?:\/\/([^\/]*\.)?com-dick-fick-n-suck\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?comic-fetish-info-remember\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?comic-hardcore-info-remember-sex\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?comicvmarriage\.spycams777\.com
+https?:\/\/([^\/]*\.)?commercialleaseonline\.info
+https?:\/\/([^\/]*\.)?communicationagency\.com
+https?:\/\/([^\/]*\.)?comontr\.bb-fr\.com
+https?:\/\/([^\/]*\.)?companyforyou\.com
+https?:\/\/([^\/]*\.)?competitio\.ifrance\.com
+https?:\/\/([^\/]*\.)?computer-desk\.fromru\.com
+https?:\/\/([^\/]*\.)?computer1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?computerxchange\.com
+https?:\/\/([^\/]*\.)?comradealtmer\.blogspot\.com
+https?:\/\/([^\/]*\.)?condition-skin\.newmail\.ru
+https?:\/\/([^\/]*\.)?condition_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?condom-delivered-free-free-uk\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?condom-picture-penis\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?connecticutmortgage-x\.com
+https?:\/\/([^\/]*\.)?conor2k\.007webpro\.com
+https?:\/\/([^\/]*\.)?consistmay\.tripod\.com
+https?:\/\/([^\/]*\.)?consolidation-loan-studentqdl\.blogspot\.com
+https?:\/\/([^\/]*\.)?consultanthub\.com
+https?:\/\/([^\/]*\.)?cooking-crazy\.com
+https?:\/\/([^\/]*\.)?cool-mp3\.biz
+https?:\/\/([^\/]*\.)?coolhost\.biz
+https?:\/\/([^\/]*\.)?copasleto\.zj\.pl
+https?:\/\/([^\/]*\.)?copyok\.net
+https?:\/\/([^\/]*\.)?coricidin\.tlg\.pl
+https?:\/\/([^\/]*\.)?cornut\.ipupdater\.com
+https?:\/\/([^\/]*\.)?coro-aaliyah\.blogspot\.com
+https?:\/\/([^\/]*\.)?corporategifts-guide\.com
+https?:\/\/([^\/]*\.)?corsv\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?cortech\.cn
+https?:\/\/([^\/]*\.)?cositbo\.bbgraf\.com
+https?:\/\/([^\/]*\.)?cosmiboe\.forumzen\.com
+https?:\/\/([^\/]*\.)?cosmicray\.umd\.edu
+https?:\/\/([^\/]*\.)?coswishe\.dl\.pl
+https?:\/\/([^\/]*\.)?cotton-gloves\.loretic\.be
+https?:\/\/([^\/]*\.)?counciloflight\.com
+https?:\/\/([^\/]*\.)?couple-fucking-photo\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?couple-kissing-pic\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?couponmountain\.com
+https?:\/\/([^\/]*\.)?courses\.csusm\.edu
+https?:\/\/([^\/]*\.)?courtinfroggie\.blogspot\.com
+https?:\/\/([^\/]*\.)?covarou\.su\.pl
+https?:\/\/([^\/]*\.)?cowei\.net
+https?:\/\/([^\/]*\.)?cowlist-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?cozaar\.4\.pl
+https?:\/\/([^\/]*\.)?cozaarbuy\.hello\.to
+https?:\/\/([^\/]*\.)?cozaarcheap\.mysite\.de
+https?:\/\/([^\/]*\.)?cozaarcheapgeneric\.warp9\.to
+https?:\/\/([^\/]*\.)?cozaargeneric\.everything\.at
+https?:\/\/([^\/]*\.)?cozaargenericcheap\.dive\.to
+https?:\/\/([^\/]*\.)?cpayscom\.xwiki\.com
+https?:\/\/([^\/]*\.)?cpkna\.szm\.sk
+https?:\/\/([^\/]*\.)?cpsyy\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?cpyngke\.com
+https?:\/\/([^\/]*\.)?cqbhn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cqfmz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cqjbjx1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cr4ix7\.com
+https?:\/\/([^\/]*\.)?crabs\.isgre\.at
+https?:\/\/([^\/]*\.)?cramp-hand-leg\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?crashdome\.info
+https?:\/\/([^\/]*\.)?crazyvirgin\.info
+https?:\/\/([^\/]*\.)?crbackus\.dl\.pl
+https?:\/\/([^\/]*\.)?crcather\.dl\.pl
+https?:\/\/([^\/]*\.)?cream-facial-pie\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cream-hairy-mature-movie-pie-pussy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?creampie\.coz\.in
+https?:\/\/([^\/]*\.)?creating-a-boot-cd\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?credit-dreams\.com
+https?:\/\/([^\/]*\.)?creditcards-x\.com
+https?:\/\/([^\/]*\.)?credoninc\.com
+https?:\/\/([^\/]*\.)?crestor-rx\.one2you\.info
+https?:\/\/([^\/]*\.)?crestor\.dynalias\.net
+https?:\/\/([^\/]*\.)?criminal-j-degre\.boom\.ru
+https?:\/\/([^\/]*\.)?crimson-teens\.freeinsite\.net
+https?:\/\/([^\/]*\.)?cristal-fenix\.isuisse\.com
+https?:\/\/([^\/]*\.)?crookedscud\.myfreewebs\.net
+https?:\/\/([^\/]*\.)?crossed-leg-gallery\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?crossed-leg-short-skirt-stocking-top\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?crrenee\.dl\.pl
+https?:\/\/([^\/]*\.)?crsundke\.dl\.pl
+https?:\/\/([^\/]*\.)?cruise-guide\.org
+https?:\/\/([^\/]*\.)?cruise-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?crzvh\.szm\.sk
+https?:\/\/([^\/]*\.)?cscla\.net
+https?:\/\/([^\/]*\.)?cscserver\.cc\.edu
+https?:\/\/([^\/]*\.)?csitdom\.bbgraf\.com
+https?:\/\/([^\/]*\.)?csmwui11\.com
+https?:\/\/([^\/]*\.)?csosandbox\.clemson\.edu
+https?:\/\/([^\/]*\.)?ctdq0\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ctl\.csudh\.edu
+https?:\/\/([^\/]*\.)?ctusxc4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?cubaka\.yi\.org
+https?:\/\/([^\/]*\.)?cufgq\.szm\.sk
+https?:\/\/([^\/]*\.)?cuicui\.monblog\.ch
+https?:\/\/([^\/]*\.)?cuiugcg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?culinary-school\.newmail\.ru
+https?:\/\/([^\/]*\.)?culinary1school\.chat\.ru
+https?:\/\/([^\/]*\.)?cum-drenched-pantie\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-drink-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-dvd-face-private-private-rip-vcd\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?cum-ebony-face\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?cum-face-asian\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?cum-face-pic\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-face-picture\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-facial-messy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?cum-facial-video-free-clip\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cum-filled-pussy-picture\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-kiss-lick-shoes-suck-worship\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cum-mouth-ebony\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cum-nurse-sex-shot\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?cum-se-face-sex\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?cum-shot-movie\.dreamsuit\.net
+https?:\/\/([^\/]*\.)?cum-swallow-vids\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?cuola\.goodforum\.net
+https?:\/\/([^\/]*\.)?cut-xmeup-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?cute-ebony-girl\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?cute-girldzy\.blogspot\.com
+https?:\/\/([^\/]*\.)?cutgetolo\.zikforum\.com
+https?:\/\/([^\/]*\.)?cutvili\.winnerforum\.net
+https?:\/\/([^\/]*\.)?cvep2\.szm\.sk
+https?:\/\/([^\/]*\.)?cvipm\.com
+https?:\/\/([^\/]*\.)?cxolt\.szm\.sk
+https?:\/\/([^\/]*\.)?cyberlinx\.us
+https?:\/\/([^\/]*\.)?cycleworldsuzuki\.info
+https?:\/\/([^\/]*\.)?cyclobenzaprine\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?cysrf\.szm\.sk
+https?:\/\/([^\/]*\.)?cytonrok\.forumculture\.net
+https?:\/\/([^\/]*\.)?czelvar\.su\.pl
+https?:\/\/([^\/]*\.)?czis0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?d-z-free-lesbian-movie-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?daddy-bear-gay\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?daddy-long-leg-venom\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?daily-porn-clip-news0we\.blogspot\.com
+https?:\/\/([^\/]*\.)?dailybasis-com-cky8ax\.blogspot\.com
+https?:\/\/([^\/]*\.)?dami3\.com
+https?:\/\/([^\/]*\.)?danazol\.4\.pl
+https?:\/\/([^\/]*\.)?dance-instruction\.lkerfocu\.be
+https?:\/\/([^\/]*\.)?danga4ka\.blogspot\.com
+https?:\/\/([^\/]*\.)?dansmovies-com-mu2ywho24d\.blogspot\.com
+https?:\/\/([^\/]*\.)?daractr\.goodbb\.net
+https?:\/\/([^\/]*\.)?darboboc\.dl\.pl
+https?:\/\/([^\/]*\.)?darboctroc\.dl\.pl
+https?:\/\/([^\/]*\.)?darcnaec\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?darcoca\.dl\.pl
+https?:\/\/([^\/]*\.)?dardomcna\.blogcu\.com
+https?:\/\/([^\/]*\.)?dardomdom\.darkbb\.com
+https?:\/\/([^\/]*\.)?dardomzel\.blogcu\.com
+https?:\/\/([^\/]*\.)?dare-poker\.com
+https?:\/\/([^\/]*\.)?darelttr\.dl\.pl
+https?:\/\/([^\/]*\.)?dargetou\.darkbb\.com
+https?:\/\/([^\/]*\.)?darladom\.td\.pl
+https?:\/\/([^\/]*\.)?darlala\.winnerforum\.net
+https?:\/\/([^\/]*\.)?darlina-a1vds\.blogspot\.com
+https?:\/\/([^\/]*\.)?darlina-akp4\.blogspot\.com
+https?:\/\/([^\/]*\.)?darlina-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?darlina-tcifizmx\.blogspot\.com
+https?:\/\/([^\/]*\.)?darmonrol\.zj\.pl
+https?:\/\/([^\/]*\.)?darricer\.fr-bb\.com
+https?:\/\/([^\/]*\.)?darzeltroc\.dl\.pl
+https?:\/\/([^\/]*\.)?dasepluv\.dl\.pl
+https?:\/\/([^\/]*\.)?dashulya\.blogspot\.com
+https?:\/\/([^\/]*\.)?dastino\.republika\.pl
+https?:\/\/([^\/]*\.)?data-mining\.massioni\.be
+https?:\/\/([^\/]*\.)?datangid\.com
+https?:\/\/([^\/]*\.)?datasol\.org
+https?:\/\/([^\/]*\.)?dating-advice\.sexnation\.info
+https?:\/\/([^\/]*\.)?dating-direct\.sexnation\.info
+https?:\/\/([^\/]*\.)?dating\.sexnation\.info
+https?:\/\/([^\/]*\.)?dave-hollister-ringtoneezm\.blogspot\.com
+https?:\/\/([^\/]*\.)?dave-hollister-ringtonefoi\.blogspot\.com
+https?:\/\/([^\/]*\.)?dave-hollister-ringtonewqs\.blogspot\.com
+https?:\/\/([^\/]*\.)?davejackson\.com
+https?:\/\/([^\/]*\.)?davte\.info
+https?:\/\/([^\/]*\.)?dawsonanddadrealty\.com
+https?:\/\/([^\/]*\.)?dayzve4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dbxbqb7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dc-escort-gay\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?dcuoo\.szm\.sk
+https?:\/\/([^\/]*\.)?dcx\.org\.ua
+https?:\/\/([^\/]*\.)?ddfz1\.szm\.sk
+https?:\/\/([^\/]*\.)?ddlive\.info
+https?:\/\/([^\/]*\.)?ddovj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ddpb6\.szm\.sk
+https?:\/\/([^\/]*\.)?de-foto-gay-gratis-negros\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?dead-sea-product\.com
+https?:\/\/([^\/]*\.)?deadsex\.info
+https?:\/\/([^\/]*\.)?deadums\.blogspot\.com
+https?:\/\/([^\/]*\.)?debk6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?debt-consolidation-care\.com
+https?:\/\/([^\/]*\.)?debt-consolidation\.dd\.vg
+https?:\/\/([^\/]*\.)?debtconsolidation-today\.com
+https?:\/\/([^\/]*\.)?deepthroat\.coz\.in
+https?:\/\/([^\/]*\.)?deerdeji\.forumzen\.com
+https?:\/\/([^\/]*\.)?defacialize-com-td32\.blogspot\.com
+https?:\/\/([^\/]*\.)?defi-adrian\.blogspot\.com
+https?:\/\/([^\/]*\.)?degree-program\.hotmail\.ru
+https?:\/\/([^\/]*\.)?degree2program\.chat\.ru
+https?:\/\/([^\/]*\.)?dejablu503\.50webs\.org
+https?:\/\/([^\/]*\.)?dela88\.com
+https?:\/\/([^\/]*\.)?delacmon\.discutforum\.com
+https?:\/\/([^\/]*\.)?delawaremortgage-x\.com
+https?:\/\/([^\/]*\.)?delbocer\.dl\.pl
+https?:\/\/([^\/]*\.)?delcnacna\.lolbb\.com
+https?:\/\/([^\/]*\.)?delletopas\.su\.pl
+https?:\/\/([^\/]*\.)?delliric\.dl\.pl
+https?:\/\/([^\/]*\.)?delordel\.blogcu\.com
+https?:\/\/([^\/]*\.)?delricchi\.goodforum\.net
+https?:\/\/([^\/]*\.)?delricchi\.grafbb\.com
+https?:\/\/([^\/]*\.)?delricou\.dl\.pl
+https?:\/\/([^\/]*\.)?delserch\.com
+https?:\/\/([^\/]*\.)?deltasone\.4\.pl
+https?:\/\/([^\/]*\.)?deltnecca\.goodbb\.net
+https?:\/\/([^\/]*\.)?delzelleto\.dl\.pl
+https?:\/\/([^\/]*\.)?demingpower\.com
+https?:\/\/([^\/]*\.)?denocel\.blogcu\.com
+https?:\/\/([^\/]*\.)?dental-guide\.org
+https?:\/\/([^\/]*\.)?dental\.gulfcoast\.edu
+https?:\/\/([^\/]*\.)?dentalplans-x\.com
+https?:\/\/([^\/]*\.)?deomnoou\.jconserv\.net
+https?:\/\/([^\/]*\.)?depamu\.com
+https?:\/\/([^\/]*\.)?depstore\.milan\.jp
+https?:\/\/([^\/]*\.)?derast\.com
+https?:\/\/([^\/]*\.)?derimc\.com
+https?:\/\/([^\/]*\.)?description\.hostonmars\.com
+https?:\/\/([^\/]*\.)?desent\.8tt\.org
+https?:\/\/([^\/]*\.)?design4italy\.org
+https?:\/\/([^\/]*\.)?designatchina\.com
+https?:\/\/([^\/]*\.)?designer-purses\.blogspot\.com
+https?:\/\/([^\/]*\.)?desk-teen-d\.blogspot\.com
+https?:\/\/([^\/]*\.)?desyrel\.4\.pl
+https?:\/\/([^\/]*\.)?detriot\.dtdns\.net
+https?:\/\/([^\/]*\.)?deutschland-heute\.de\.tl
+https?:\/\/([^\/]*\.)?devine-friend-hot-mom\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?dewall\.info
+https?:\/\/([^\/]*\.)?dg\.188info\.com
+https?:\/\/([^\/]*\.)?dgvy5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dial3\.szm\.sk
+https?:\/\/([^\/]*\.)?diamond73\.50webs\.com
+https?:\/\/([^\/]*\.)?dianchi\.dzsc\.com
+https?:\/\/([^\/]*\.)?diandongji\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianganqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianluban\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianre\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianrong\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianweiqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianyuan\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianziguan\.dzsc\.com
+https?:\/\/([^\/]*\.)?dianzu\.dzsc\.com
+https?:\/\/([^\/]*\.)?diazepam\.47\.pl
+https?:\/\/([^\/]*\.)?diazepam\.skocz\.net
+https?:\/\/([^\/]*\.)?diazepam2\.forospace\.com
+https?:\/\/([^\/]*\.)?diazepams\.ru\.tf
+https?:\/\/([^\/]*\.)?dick-butkus-football-player\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?dick-donkey-sucking-woman\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?dick-fat-in-pussy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?dick-head-john-kerry\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?dick-hot-man-video\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?dicks-sporting-goods-web-site\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?didrex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?didrex\.int\.tf
+https?:\/\/([^\/]*\.)?diebart\.asp2\.cz
+https?:\/\/([^\/]*\.)?diesite\.com
+https?:\/\/([^\/]*\.)?diet-pills-phentermine-pill-buy-cheap-online\.com
+https?:\/\/([^\/]*\.)?diet-pills911\.com
+https?:\/\/([^\/]*\.)?diffusersudan\.org
+https?:\/\/([^\/]*\.)?diflucanbuycheap\.top\.ms
+https?:\/\/([^\/]*\.)?diflucancheapbuy\.drop\.to
+https?:\/\/([^\/]*\.)?diflucancheapgeneric\.notrix\.net
+https?:\/\/([^\/]*\.)?diflucangeneric\.hey\.to
+https?:\/\/([^\/]*\.)?diflucangenericbuy\.hp\.ms
+https?:\/\/([^\/]*\.)?digilander\.libero\.it
+https?:\/\/([^\/]*\.)?digital-glamour\.com
+https?:\/\/([^\/]*\.)?digitalpoimt\.com
+https?:\/\/([^\/]*\.)?dildo-extreme-free-movie\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?dildo-in-guys-ass\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?dilhbi7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dionysios-r\.blogspot\.com
+https?:\/\/([^\/]*\.)?dir\.opank\.com
+https?:\/\/([^\/]*\.)?dirare\.com
+https?:\/\/([^\/]*\.)?directonlineguide\.com
+https?:\/\/([^\/]*\.)?dirty-blonde-teen\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?dirty-ru-lenta\.blogspot\.com
+https?:\/\/([^\/]*\.)?dirtyrhino-com-iy5ps48s\.blogspot\.com
+https?:\/\/([^\/]*\.)?dirtyrhino-com-rjrotse3\.blogspot\.com
+https?:\/\/([^\/]*\.)?discasegeta\.0moola\.com
+https?:\/\/([^\/]*\.)?discontinued-chanel-lipstick\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?discount-femina-lingerie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?discount-phentermine\.health-livening\.com
+https?:\/\/([^\/]*\.)?discount-phentermine\.presteert\.nl
+https?:\/\/([^\/]*\.)?discounted-medications\.com
+https?:\/\/([^\/]*\.)?discountphentermine\.livelog\.com
+https?:\/\/([^\/]*\.)?discussions\.csbsju\.edu
+https?:\/\/([^\/]*\.)?dissected-voice\.blogspot\.com
+https?:\/\/([^\/]*\.)?diuvw\.szm\.sk
+https?:\/\/([^\/]*\.)?diva-58\.site\.voila\.fr
+https?:\/\/([^\/]*\.)?divtab\.com
+https?:\/\/([^\/]*\.)?dixe-alayna\.blogspot\.com
+https?:\/\/([^\/]*\.)?dixiecuties-com-av\.blogspot\.com
+https?:\/\/([^\/]*\.)?dixiecuties-com-wpf1g2a\.blogspot\.com
+https?:\/\/([^\/]*\.)?dka2e\.nokedem\.com
+https?:\/\/([^\/]*\.)?dlaners\.blogspot\.com
+https?:\/\/([^\/]*\.)?dljs5\.szm\.sk
+https?:\/\/([^\/]*\.)?dltz4\.szm\.sk
+https?:\/\/([^\/]*\.)?dlwlh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dlzgn\.szm\.sk
+https?:\/\/([^\/]*\.)?dm-cqsf\.cn
+https?:\/\/([^\/]*\.)?dm-soft\.com
+https?:\/\/([^\/]*\.)?dmnft\.net
+https?:\/\/([^\/]*\.)?dnk-design\.com
+https?:\/\/([^\/]*\.)?do-ali\.blogspot\.com
+https?:\/\/([^\/]*\.)?do-hot-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?doctorpinkerton\.ifrance\.com
+https?:\/\/([^\/]*\.)?doenertreff\.de
+https?:\/\/([^\/]*\.)?dogdead\.50webs\.com
+https?:\/\/([^\/]*\.)?dogider-big-tit-round-a-p\.blogspot\.com
+https?:\/\/([^\/]*\.)?dogzilla30\.blogspot\.com
+https?:\/\/([^\/]*\.)?dohr\.joolo\.com
+https?:\/\/([^\/]*\.)?dokrichi\.forumculture\.net
+https?:\/\/([^\/]*\.)?dokuno-porn-clip\.blogspot\.com
+https?:\/\/([^\/]*\.)?dollmovies-com-e7lqyhq\.blogspot\.com
+https?:\/\/([^\/]*\.)?dom-or-dron\.jc\.pl
+https?:\/\/([^\/]*\.)?domdronno\.xa\.pl
+https?:\/\/([^\/]*\.)?dome-ebony-foot-herbies\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?domelc4t\.dl\.pl
+https?:\/\/([^\/]*\.)?domest1co\.info
+https?:\/\/([^\/]*\.)?domestic0\.info
+https?:\/\/([^\/]*\.)?domnoor\.blogcu\.com
+https?:\/\/([^\/]*\.)?domorca\.darkbb\.com
+https?:\/\/([^\/]*\.)?dompasvi\.alkablog\.com
+https?:\/\/([^\/]*\.)?domrelou\.discutfree\.com
+https?:\/\/([^\/]*\.)?domtadom\.blogcu\.com
+https?:\/\/([^\/]*\.)?domtael\.dl\.pl
+https?:\/\/([^\/]*\.)?don-search\.com
+https?:\/\/([^\/]*\.)?dong-sheng\.com
+https?:\/\/([^\/]*\.)?dono-alaska\.blogspot\.com
+https?:\/\/([^\/]*\.)?doodlepets\.net
+https?:\/\/([^\/]*\.)?doormat\.ncedly\.be
+https?:\/\/([^\/]*\.)?dorank\.com
+https?:\/\/([^\/]*\.)?dorintop\.9999mb\.com
+https?:\/\/([^\/]*\.)?dotbusinessbroker\.info
+https?:\/\/([^\/]*\.)?dottorstranamore\.com
+https?:\/\/([^\/]*\.)?dotwirelessinternet\.info
+https?:\/\/([^\/]*\.)?double-anal-insertion\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?doubledrilled-com-ru\.blogspot\.com
+https?:\/\/([^\/]*\.)?douglasgenetic\.org
+https?:\/\/([^\/]*\.)?download-fisting-free-movie-pussy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?download-free-porn-clip-zone186\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-porn-movie-bb-bb-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-ringtonebso\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-ringtonekdw\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-ringtonekfb\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-ringtoneoug\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-free-ringtonesasd\.blogspot\.com
+https?:\/\/([^\/]*\.)?download-ringtonevnr\.blogspot\.com
+https?:\/\/([^\/]*\.)?downloadfreeringtonengp\.blogspot\.com
+https?:\/\/([^\/]*\.)?downsms\.blogbus\.com
+https?:\/\/([^\/]*\.)?dpfanatics-com-t7nqv\.blogspot\.com
+https?:\/\/([^\/]*\.)?dqezl\.szm\.sk
+https?:\/\/([^\/]*\.)?draghi\.ll11\.info
+https?:\/\/([^\/]*\.)?dragonballxxx-gratis\.19mb\.info
+https?:\/\/([^\/]*\.)?dragonmovies-dd2bm5sn\.blogspot\.com
+https?:\/\/([^\/]*\.)?dragonmovies-rwng8vm7j\.blogspot\.com
+https?:\/\/([^\/]*\.)?drbizzaro-com-r5\.blogspot\.com
+https?:\/\/([^\/]*\.)?drdos\.50webs\.org
+https?:\/\/([^\/]*\.)?dreamathk\.com
+https?:\/\/([^\/]*\.)?dreamatsh\.com
+https?:\/\/([^\/]*\.)?dreamhk\.org
+https?:\/\/([^\/]*\.)?dress-jacket\.haemati\.be
+https?:\/\/([^\/]*\.)?drithle\.com
+https?:\/\/([^\/]*\.)?driving-school\.hotmail\.ru
+https?:\/\/([^\/]*\.)?driving2school\.chat\.ru
+https?:\/\/([^\/]*\.)?dronaceldar\.darkbb\.com
+https?:\/\/([^\/]*\.)?dronc4tta\.blogcu\.com
+https?:\/\/([^\/]*\.)?droncaca\.blogcu\.com
+https?:\/\/([^\/]*\.)?dronchitr\.blogcu\.com
+https?:\/\/([^\/]*\.)?drondomrac\.bb-fr\.com
+https?:\/\/([^\/]*\.)?drondrontr\.zikforum\.com
+https?:\/\/([^\/]*\.)?dronladar\.discutfree\.com
+https?:\/\/([^\/]*\.)?dronladar\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?dronrelco\.td\.pl
+https?:\/\/([^\/]*\.)?drownedmagenta\.50webs\.org
+https?:\/\/([^\/]*\.)?drug\.prtime\.ru
+https?:\/\/([^\/]*\.)?drunkgirls\.coz\.in
+https?:\/\/([^\/]*\.)?dry-skin\.boom\.ru
+https?:\/\/([^\/]*\.)?dry1skin\.chat\.ru
+https?:\/\/([^\/]*\.)?dscw0\.szm\.sk
+https?:\/\/([^\/]*\.)?dtmpdpxmsu-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?du-alice\.blogspot\.com
+https?:\/\/([^\/]*\.)?duaroti\.50webs\.com
+https?:\/\/([^\/]*\.)?dub-dom-adu\.blogspot\.com
+https?:\/\/([^\/]*\.)?duckyporn-ifl4u28p\.blogspot\.com
+https?:\/\/([^\/]*\.)?ducpjo3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dudoctor\.com
+https?:\/\/([^\/]*\.)?dudubilz\.dl\.pl
+https?:\/\/([^\/]*\.)?dumtrric\.forumzen\.com
+https?:\/\/([^\/]*\.)?duncemoney\.com
+https?:\/\/([^\/]*\.)?dunham-hiking-boot\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?dup-xxxfolder-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?dupiwu\.com
+https?:\/\/([^\/]*\.)?duptv\.szm\.sk
+https?:\/\/([^\/]*\.)?dushen\.net\.cn
+https?:\/\/([^\/]*\.)?dusts\.info
+https?:\/\/([^\/]*\.)?dutbm\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?duxbd\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?duxfhgz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dvd-vergini-economici-r\.host24h\.info
+https?:\/\/([^\/]*\.)?dvdunwritten\.toplog\.nl
+https?:\/\/([^\/]*\.)?dwaeaz-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?dwsyv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?dxjyb\.szm\.sk
+https?:\/\/([^\/]*\.)?dykzozqlpt-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?dzb\.com\.cn
+https?:\/\/([^\/]*\.)?dzgzm\.cn
+https?:\/\/([^\/]*\.)?dzjp\.left-page\.com
+https?:\/\/([^\/]*\.)?dzjp\.zxvo\.com
+https?:\/\/([^\/]*\.)?dzsb\.com
+https?:\/\/([^\/]*\.)?dzsc\.com
+https?:\/\/([^\/]*\.)?e-dishnetworks\.com
+https?:\/\/([^\/]*\.)?e-fanyi\.org
+https?:\/\/([^\/]*\.)?e-holdem\.net
+https?:\/\/([^\/]*\.)?e\.kth\.se
+https?:\/\/([^\/]*\.)?e16\.info
+https?:\/\/([^\/]*\.)?e93\.iitalia\.com
+https?:\/\/([^\/]*\.)?eaby2\.szm\.sk
+https?:\/\/([^\/]*\.)?eacome\.com
+https?:\/\/([^\/]*\.)?eafg6\.szm\.sk
+https?:\/\/([^\/]*\.)?eaglechief\.com
+https?:\/\/([^\/]*\.)?eamon-fuck-it-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?eappf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?earticlesonline\.com
+https?:\/\/([^\/]*\.)?easy-furniture\.org
+https?:\/\/([^\/]*\.)?easygals-com-h4\.blogspot\.com
+https?:\/\/([^\/]*\.)?easypic-com-if7pnmrbxd\.blogspot\.com
+https?:\/\/([^\/]*\.)?easypornstars-com-b8k4y\.blogspot\.com
+https?:\/\/([^\/]*\.)?easypornstars-com-subut\.blogspot\.com
+https?:\/\/([^\/]*\.)?easysail\.net\.cn
+https?:\/\/([^\/]*\.)?eating-free-lesbian-pussy\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?eating-lesbian-pussy\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?ebackground-checks\.com
+https?:\/\/([^\/]*\.)?ebdoc\.com
+https?:\/\/([^\/]*\.)?ebnjj\.info
+https?:\/\/([^\/]*\.)?ebony-free-woman\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ebony-fuck-tit\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ebony-horny-hot-woman\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?ebony-hot-outdoor\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?ebony-info-photo-remember-sexy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?ebony-info-remember-tit\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?ebony-party-sex\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ebony-porn-trailer\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?ebony-sex-com\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?ebony-teen-pic\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?ebony-teen-tgp\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?ebonyblack-net-gf\.blogspot\.com
+https?:\/\/([^\/]*\.)?ebonyblack-net-m3dy7kn\.blogspot\.com
+https?:\/\/([^\/]*\.)?ebonybooty\.wehostporno\.com
+https?:\/\/([^\/]*\.)?ebusiness-cards\.org
+https?:\/\/([^\/]*\.)?ecar-rentals\.com
+https?:\/\/([^\/]*\.)?eccellente\.info
+https?:\/\/([^\/]*\.)?ececu\.com
+https?:\/\/([^\/]*\.)?echayka\.com
+https?:\/\/([^\/]*\.)?eclexion\.net
+https?:\/\/([^\/]*\.)?eclissi-di-luna\.host24h\.info
+https?:\/\/([^\/]*\.)?ecomm1\.csug\.rochester\.edu
+https?:\/\/([^\/]*\.)?econtact-lens\.com
+https?:\/\/([^\/]*\.)?ed2k\.net\.ua
+https?:\/\/([^\/]*\.)?edasim\.com
+https?:\/\/([^\/]*\.)?eddiereva\.com
+https?:\/\/([^\/]*\.)?edetrali\.jconserv\.net
+https?:\/\/([^\/]*\.)?edomerna\.jconserv\.net
+https?:\/\/([^\/]*\.)?edonline\.ua\.edu
+https?:\/\/([^\/]*\.)?edqlzct\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?education\.beta\.edgewood\.edu
+https?:\/\/([^\/]*\.)?education\.uncc\.edu
+https?:\/\/([^\/]*\.)?education1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?ee3\.be
+https?:\/\/([^\/]*\.)?eelive\.info
+https?:\/\/([^\/]*\.)?eenxn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ees\.ufl\.edu
+https?:\/\/([^\/]*\.)?eesg8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?eeshq\.com
+https?:\/\/([^\/]*\.)?eetop\.info
+https?:\/\/([^\/]*\.)?eevjgn7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?effexor-xr\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?effexor\.b0ne\.com
+https?:\/\/([^\/]*\.)?egciz\.szm\.sk
+https?:\/\/([^\/]*\.)?egnadn-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?egnpgno\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?egoldhyip\.athost\.net
+https?:\/\/([^\/]*\.)?egoldhyip\.sitesfree\.com
+https?:\/\/([^\/]*\.)?egunteronline\.com
+https?:\/\/([^\/]*\.)?eightalya\.blogspot\.com
+https?:\/\/([^\/]*\.)?eighty-8088\.blogspot\.com
+https?:\/\/([^\/]*\.)?eijy7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ejeesf2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ejreoonster\.blogspot\.com
+https?:\/\/([^\/]*\.)?ejvyd\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ejyt9\.szm\.sk
+https?:\/\/([^\/]*\.)?ekajl\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ekjms\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ekttsaj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ekviceaia\.blogspot\.com
+https?:\/\/([^\/]*\.)?ekxkfyz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?el-ladies-com-m4ayb\.blogspot\.com
+https?:\/\/([^\/]*\.)?elacelal\.informe\.com
+https?:\/\/([^\/]*\.)?elbasbo\.dl\.pl
+https?:\/\/([^\/]*\.)?elbocboc\.bbgraf\.com
+https?:\/\/([^\/]*\.)?elbows-at\.blogspot\.com
+https?:\/\/([^\/]*\.)?elbtoy\.realpornstar\.net
+https?:\/\/([^\/]*\.)?elcnaac\.cultureforum\.net
+https?:\/\/([^\/]*\.)?electric-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?electric1scooter\.chat\.ru
+https?:\/\/([^\/]*\.)?electricscooterland\.com
+https?:\/\/([^\/]*\.)?elephantlist-com-hozhkwuac6\.blogspot\.com
+https?:\/\/([^\/]*\.)?elephantlist-com-kedi0pfbp\.blogspot\.com
+https?:\/\/([^\/]*\.)?elerc4t\.blogcu\.com
+https?:\/\/([^\/]*\.)?eleven-heaven0a\.blogspot\.com
+https?:\/\/([^\/]*\.)?elevtenl\.blogspot\.com
+https?:\/\/([^\/]*\.)?elishacuthbertfansite\.com
+https?:\/\/([^\/]*\.)?eliteclips-com-c0hwm3fji\.blogspot\.com
+https?:\/\/([^\/]*\.)?eliteclips-com-k5hkm6yi\.blogspot\.com
+https?:\/\/([^\/]*\.)?eliteclips-com-kzjz30a5k4\.blogspot\.com
+https?:\/\/([^\/]*\.)?elixirium\.ifrance\.com
+https?:\/\/([^\/]*\.)?eloloac\.bbgraf\.com
+https?:\/\/([^\/]*\.)?eloudar\.discutforum\.com
+https?:\/\/([^\/]*\.)?elovejob\.info
+https?:\/\/([^\/]*\.)?elpos\.szm\.sk
+https?:\/\/([^\/]*\.)?eltalchi\.bbfr\.net
+https?:\/\/([^\/]*\.)?eltalli\.zj\.pl
+https?:\/\/([^\/]*\.)?eltbuzel\.forumzen\.com
+https?:\/\/([^\/]*\.)?eltcer\.winnerforum\.net
+https?:\/\/([^\/]*\.)?eltgetric\.uy\.pl
+https?:\/\/([^\/]*\.)?eltrelboc\.bbfr\.net
+https?:\/\/([^\/]*\.)?eltrical\.uy\.pl
+https?:\/\/([^\/]*\.)?eltroboc\.lolforum\.net
+https?:\/\/([^\/]*\.)?eltrolpas\.winnerforum\.net
+https?:\/\/([^\/]*\.)?elttaacel\.heavenforum\.com
+https?:\/\/([^\/]*\.)?elttaacel\.highforum\.net
+https?:\/\/([^\/]*\.)?elttrocpas\.discutforum\.com
+https?:\/\/([^\/]*\.)?elwg0\.szm\.sk
+https?:\/\/([^\/]*\.)?elysium-ringtonebub\.blogspot\.com
+https?:\/\/([^\/]*\.)?elysium-ringtonemzb\.blogspot\.com
+https?:\/\/([^\/]*\.)?elzelchi\.cultureforum\.net
+https?:\/\/([^\/]*\.)?emails\.ncedly\.be
+https?:\/\/([^\/]*\.)?emea-consulting\.net
+https?:\/\/([^\/]*\.)?emily\.slyip\.com
+https?:\/\/([^\/]*\.)?eminem-suck-my-dick\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?eminem-veyb\.blogspot\.com
+https?:\/\/([^\/]*\.)?eminen-lyric-ass-like-that\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?empire-holdem\.com
+https?:\/\/([^\/]*\.)?empire-holdem\.net
+https?:\/\/([^\/]*\.)?empire-holdem\.us
+https?:\/\/([^\/]*\.)?empire-poker\.black-poker\.com
+https?:\/\/([^\/]*\.)?empirepoker\.u288\.com
+https?:\/\/([^\/]*\.)?emxk0\.szm\.sk
+https?:\/\/([^\/]*\.)?ena-free-show\.net
+https?:\/\/([^\/]*\.)?enchanted1312\.blogspot\.com
+https?:\/\/([^\/]*\.)?end14april\.ifrance\.com
+https?:\/\/([^\/]*\.)?enema-fetish-free-picture\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?energo\.us
+https?:\/\/([^\/]*\.)?enetdrugsonline\.org
+https?:\/\/([^\/]*\.)?enfoldrevel\.epinoy\.com
+https?:\/\/([^\/]*\.)?engineerin2degre\.chat\.ru
+https?:\/\/([^\/]*\.)?engs\.info
+https?:\/\/([^\/]*\.)?enpresse\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?enteworld\.com
+https?:\/\/([^\/]*\.)?eoglu\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?eour8\.szm\.sk
+https?:\/\/([^\/]*\.)?ephedra\.269g\.net
+https?:\/\/([^\/]*\.)?ephedraproduct\.seesaa\.net
+https?:\/\/([^\/]*\.)?epiqq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?epointer\.freewebpage\.org
+https?:\/\/([^\/]*\.)?eprom-dresses\.com
+https?:\/\/([^\/]*\.)?epxxw\.szm\.sk
+https?:\/\/([^\/]*\.)?erasser\.8tt\.org
+https?:\/\/([^\/]*\.)?erbocco\.discutforum\.com
+https?:\/\/([^\/]*\.)?erc4tget\.blogcu\.com
+https?:\/\/([^\/]*\.)?erdomrol\.heavenforum\.com
+https?:\/\/([^\/]*\.)?erdomrol\.highforum\.net
+https?:\/\/([^\/]*\.)?ereaa\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?erealtystore\.com
+https?:\/\/([^\/]*\.)?erelleta\.forumzen\.com
+https?:\/\/([^\/]*\.)?eremat\.com
+https?:\/\/([^\/]*\.)?erjiguan\.dzsc\.com
+https?:\/\/([^\/]*\.)?erlitroc\.xa\.pl
+https?:\/\/([^\/]*\.)?ernvmf7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?erotic-gay-male-sex-story\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?erotic-story-fem-dom\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?ertral\.alkablog\.com
+https?:\/\/([^\/]*\.)?erw1r\.info
+https?:\/\/([^\/]*\.)?escher\.isis\.vanderbilt\.edu
+https?:\/\/([^\/]*\.)?eseo\.cn
+https?:\/\/([^\/]*\.)?esgic\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?eshilzet\.forumzen\.com
+https?:\/\/([^\/]*\.)?esino\.info
+https?:\/\/([^\/]*\.)?esiti-gara\.hostzz\.info
+https?:\/\/([^\/]*\.)?esjpd\.szm\.sk
+https?:\/\/([^\/]*\.)?esmpa\.com
+https?:\/\/([^\/]*\.)?esportswave\.com
+https?:\/\/([^\/]*\.)?esraj\.com
+https?:\/\/([^\/]*\.)?esseiwer\.dl\.pl
+https?:\/\/([^\/]*\.)?estarcollector\.blogspot\.com
+https?:\/\/([^\/]*\.)?etac4\.szm\.sk
+https?:\/\/([^\/]*\.)?etcoq\.szm\.sk
+https?:\/\/([^\/]*\.)?etgelcca\.forumzen\.com
+https?:\/\/([^\/]*\.)?ethnicpassion-com-db5\.blogspot\.com
+https?:\/\/([^\/]*\.)?ethnicpassion-com-ik80lyfnd\.blogspot\.com
+https?:\/\/([^\/]*\.)?ethnicpassion-com-iqa3gt\.blogspot\.com
+https?:\/\/([^\/]*\.)?ethnicpassion-com-itw\.blogspot\.com
+https?:\/\/([^\/]*\.)?etjhechi\.forumzen\.com
+https?:\/\/([^\/]*\.)?etjhetrd\.forumzen\.com
+https?:\/\/([^\/]*\.)?etkrudom\.forumzen\.com
+https?:\/\/([^\/]*\.)?etlitvir\.forumzen\.com
+https?:\/\/([^\/]*\.)?etlurlir\.forumzen\.com
+https?:\/\/([^\/]*\.)?etmuhlie\.forumzen\.com
+https?:\/\/([^\/]*\.)?etnuidet\.forumzen\.com
+https?:\/\/([^\/]*\.)?etofas\.com
+https?:\/\/([^\/]*\.)?etrart\.com
+https?:\/\/([^\/]*\.)?etrewlia\.forumzen\.com
+https?:\/\/([^\/]*\.)?etshalir\.forumzen\.com
+https?:\/\/([^\/]*\.)?ettamlet\.forumzen\.com
+https?:\/\/([^\/]*\.)?ettimera\.forumzen\.com
+https?:\/\/([^\/]*\.)?etwhiett\.forumzen\.com
+https?:\/\/([^\/]*\.)?etwhiolo\.forumzen\.com
+https?:\/\/([^\/]*\.)?etzvg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?etzyrpk\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?eubaspro\.com
+https?:\/\/([^\/]*\.)?eudrayv\.blogspot\.com
+https?:\/\/([^\/]*\.)?eueyniqott-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?euomtrna\.jconserv\.net
+https?:\/\/([^\/]*\.)?eurosexparties-com-jezun\.blogspot\.com
+https?:\/\/([^\/]*\.)?eurosexparties-com-mmnl2m\.blogspot\.com
+https?:\/\/([^\/]*\.)?eva-irina\.isuisse\.com
+https?:\/\/([^\/]*\.)?evamiee\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?eveqx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?everywhere-com-tpovy8exl\.blogspot\.com
+https?:\/\/([^\/]*\.)?evfegl9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?evhp2\.szm\.sk
+https?:\/\/([^\/]*\.)?evil-gummiworm\.blogspot\.com
+https?:\/\/([^\/]*\.)?ewdnqb4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?exchange-lingerie-link-womens\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?exciting-casino\.com
+https?:\/\/([^\/]*\.)?exhuq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?extrarx\.kvkb\.com
+https?:\/\/([^\/]*\.)?extremeapril-com-adsm\.blogspot\.com
+https?:\/\/([^\/]*\.)?extremeapril-com-woje\.blogspot\.com
+https?:\/\/([^\/]*\.)?extremeapril-dhx1z\.blogspot\.com
+https?:\/\/([^\/]*\.)?ez\.asn\.und\.edu
+https?:\/\/([^\/]*\.)?ezjor\.com
+https?:\/\/([^\/]*\.)?ezkes\.com
+https?:\/\/([^\/]*\.)?ezxwc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?f-download-free-sex-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?f-z-a\.com
+https?:\/\/([^\/]*\.)?faadney\.dl\.pl
+https?:\/\/([^\/]*\.)?fabrizio-corona\.freehostss\.info
+https?:\/\/([^\/]*\.)?face-lick-lickable-licker-tongue\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?facial-abuse--com\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?facial-hair-remover\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?facial-paralysis-treatment\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?facial-plastic-surgery-manhattan\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?facial-whore\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?faculty\.etsu\.edu
+https?:\/\/([^\/]*\.)?faculty\.hope\.edu
+https?:\/\/([^\/]*\.)?faculty\.oxy\.edu
+https?:\/\/([^\/]*\.)?faculty\.ugf\.edu
+https?:\/\/([^\/]*\.)?faculty\.whatcom\.ctc\.edu
+https?:\/\/([^\/]*\.)?facweb\.cs\.depaul\.edu
+https?:\/\/([^\/]*\.)?fadianji\.dzsc\.com
+https?:\/\/([^\/]*\.)?fagin\.info
+https?:\/\/([^\/]*\.)?fairy\.8888mb\.com
+https?:\/\/([^\/]*\.)?faleake\.dl\.pl
+https?:\/\/([^\/]*\.)?falling-anvil\.blogspot\.com
+https?:\/\/([^\/]*\.)?family-viagra\.com
+https?:\/\/([^\/]*\.)?famouspornstars-com-o020ss18d8\.blogspot\.com
+https?:\/\/([^\/]*\.)?famvir\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?fangdaqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?fantasticnudes-com-bol80a\.blogspot\.com
+https?:\/\/([^\/]*\.)?fantasticnudes-com-by8gook\.blogspot\.com
+https?:\/\/([^\/]*\.)?fantasticnudes-com-qic\.blogspot\.com
+https?:\/\/([^\/]*\.)?fantasticnudes-com-r60\.blogspot\.com
+https?:\/\/([^\/]*\.)?fantasy-hand-job-teen\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?farmius\.org
+https?:\/\/([^\/]*\.)?fascination\.my10gb\.com
+https?:\/\/([^\/]*\.)?fasnty\.com
+https?:\/\/([^\/]*\.)?fasoft\.com\.cn
+https?:\/\/([^\/]*\.)?fast-loaneqh\.blogspot\.com
+https?:\/\/([^\/]*\.)?fastmovers\.org
+https?:\/\/([^\/]*\.)?fat-banging\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?fat-blonde-woman\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?fat-fuck-video\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?fat-porn-clip-infoecm\.blogspot\.com
+https?:\/\/([^\/]*\.)?fat-porn-clip-infomyi\.blogspot\.com
+https?:\/\/([^\/]*\.)?fat-tgp-com-ee\.blogspot\.com
+https?:\/\/([^\/]*\.)?fat-tgp-com-g654ywug\.blogspot\.com
+https?:\/\/([^\/]*\.)?fatfucks-com-kdy41nn4fr\.blogspot\.com
+https?:\/\/([^\/]*\.)?fatfucks-com-t232q4\.blogspot\.com
+https?:\/\/([^\/]*\.)?fatfucks-com-tf0v115rm\.blogspot\.com
+https?:\/\/([^\/]*\.)?fatfucks-com-thr8\.blogspot\.com
+https?:\/\/([^\/]*\.)?fathut-com-db66nw2a\.blogspot\.com
+https?:\/\/([^\/]*\.)?fathut-com-hqloar2t8\.blogspot\.com
+https?:\/\/([^\/]*\.)?fattythumbs-com-el24t2\.blogspot\.com
+https?:\/\/([^\/]*\.)?fattythumbs-com-iq1\.blogspot\.com
+https?:\/\/([^\/]*\.)?fau75\.blogspot\.com
+https?:\/\/([^\/]*\.)?favorite-casino\.com
+https?:\/\/([^\/]*\.)?fawninglace\.freehostingz\.com
+https?:\/\/([^\/]*\.)?fbcjr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fbugy\.szm\.sk
+https?:\/\/([^\/]*\.)?fcpx5\.szm\.sk
+https?:\/\/([^\/]*\.)?fcuml\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fcup3\.szm\.sk
+https?:\/\/([^\/]*\.)?fdjcz\.sunp\.com
+https?:\/\/([^\/]*\.)?fdxyp\.szm\.sk
+https?:\/\/([^\/]*\.)?fe-algebra\.blogspot\.com
+https?:\/\/([^\/]*\.)?fe-whateve\.blogspot\.com
+https?:\/\/([^\/]*\.)?fedems\.com
+https?:\/\/([^\/]*\.)?feeltime\.cn
+https?:\/\/([^\/]*\.)?feeltime\.com
+https?:\/\/([^\/]*\.)?fehpks4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?feidenfurniture\.com
+https?:\/\/([^\/]*\.)?fejwh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fem-dom-art-and-drawing\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?female-ass-worship\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?female-condom-sex\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?female-v\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?femdog\.blogspot\.com
+https?:\/\/([^\/]*\.)?feq-tugjobs-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?ferda111\.php5\.cz
+https?:\/\/([^\/]*\.)?ferer\.superprovider\.de
+https?:\/\/([^\/]*\.)?feretuc\.forumculture\.net
+https?:\/\/([^\/]*\.)?ferrarimaser\.info
+https?:\/\/([^\/]*\.)?fest-frat-fuck\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fetish-club-in-ipswitch-uk\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?fetish-hardcore-lesbian-more\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?fetish-heel-high-in-nylon-pretty-toe\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fetish-pantie-white\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?fetus-free-sex-video-l\.blogspot\.com
+https?:\/\/([^\/]*\.)?ffhi7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fflive\.info
+https?:\/\/([^\/]*\.)?fge-teens-links-0\.blogspot\.com
+https?:\/\/([^\/]*\.)?fghrf\.8888mb\.com
+https?:\/\/([^\/]*\.)?fgvan\.info
+https?:\/\/([^\/]*\.)?fgvzq\.szm\.sk
+https?:\/\/([^\/]*\.)?fhbi5\.szm\.sk
+https?:\/\/([^\/]*\.)?fhmms\.szm\.sk
+https?:\/\/([^\/]*\.)?fhwl-com-dy1tbi5l\.blogspot\.com
+https?:\/\/([^\/]*\.)?fhwl-com-mn8ni\.blogspot\.com
+https?:\/\/([^\/]*\.)?fhwl-com-wc\.blogspot\.com
+https?:\/\/([^\/]*\.)?fhwl-com-wgrog\.blogspot\.com
+https?:\/\/([^\/]*\.)?fibiger\.org
+https?:\/\/([^\/]*\.)?fifa2007it\.org
+https?:\/\/([^\/]*\.)?fihqquj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?filipina-lesbian-teen\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?fillchill\.mybbland\.com
+https?:\/\/([^\/]*\.)?film-da-scaricare\.host24h\.info
+https?:\/\/([^\/]*\.)?finalteens-com-c6o0080y\.blogspot\.com
+https?:\/\/([^\/]*\.)?finalteens-com-kpngsoxf\.blogspot\.com
+https?:\/\/([^\/]*\.)?finanziamento-on-line\.19mb\.info
+https?:\/\/([^\/]*\.)?finanziamento-personale\.hostzz\.info
+https?:\/\/([^\/]*\.)?finanziamento-treviso\.host24h\.info
+https?:\/\/([^\/]*\.)?findbabychick\.info
+https?:\/\/([^\/]*\.)?findbabygirl\.info
+https?:\/\/([^\/]*\.)?findvic\.com
+https?:\/\/([^\/]*\.)?fine-lingerie-online-sexy\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?finger-fuck-clip\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fioricet\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?fioricet\.47\.pl
+https?:\/\/([^\/]*\.)?fioricet\.edu\.tf
+https?:\/\/([^\/]*\.)?fioricet\.hav\.pl
+https?:\/\/([^\/]*\.)?fioricet\.skocz\.net
+https?:\/\/([^\/]*\.)?fioricetrx\.weboficial\.com
+https?:\/\/([^\/]*\.)?fioricets\.blogspot\.com
+https?:\/\/([^\/]*\.)?firejedi\.blogspot\.com
+https?:\/\/([^\/]*\.)?first-free-fuck-time-video\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?first-lesbian-experience-story\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?first-lesbian-video-xxx\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?first-porn\.futureblog\.org
+https?:\/\/([^\/]*\.)?firstchristianbank\.info
+https?:\/\/([^\/]*\.)?firstdrugstorezone\.info
+https?:\/\/([^\/]*\.)?firstfriends\.us
+https?:\/\/([^\/]*\.)?firsthorizonmtg\.com
+https?:\/\/([^\/]*\.)?firstnightcharleston\.com
+https?:\/\/([^\/]*\.)?firsttimeauditions-com-asq5m\.blogspot\.com
+https?:\/\/([^\/]*\.)?firsttimeauditions-com-gxs\.blogspot\.com
+https?:\/\/([^\/]*\.)?fishdor\.joolo\.com
+https?:\/\/([^\/]*\.)?fishing-rod\.247ihost\.com
+https?:\/\/([^\/]*\.)?fishing-rod\.hostpresso\.com
+https?:\/\/([^\/]*\.)?fishing-rod\.joolo\.com
+https?:\/\/([^\/]*\.)?fishins\.247ihost\.com
+https?:\/\/([^\/]*\.)?fishman\.freewebhosting360\.com
+https?:\/\/([^\/]*\.)?fishmpegs-com-oet5\.blogspot\.com
+https?:\/\/([^\/]*\.)?fishmpegs-com-r5\.blogspot\.com
+https?:\/\/([^\/]*\.)?fishmpegs-com-r87f7ui\.blogspot\.com
+https?:\/\/([^\/]*\.)?fisting-gay-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?fisting-group-sex\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fisting-lesbian-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?fisting-lesson-maya\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?fistinglessons-com-dmskwfs\.blogspot\.com
+https?:\/\/([^\/]*\.)?fistinglessons-com-i03p\.blogspot\.com
+https?:\/\/([^\/]*\.)?fitofarm\.com
+https?:\/\/([^\/]*\.)?fitvzj-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?fjp\.left-page\.com
+https?:\/\/([^\/]*\.)?fjp\.zxvo\.com
+https?:\/\/([^\/]*\.)?fkcvlna\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fkvvp\.szm\.sk
+https?:\/\/([^\/]*\.)?flandra\.php5\.cz
+https?:\/\/([^\/]*\.)?flawformed\.hostonmars\.com
+https?:\/\/([^\/]*\.)?flexeril\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?flextra\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?flkkmex\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fllood\.blogspot\.com
+https?:\/\/([^\/]*\.)?fllwlv6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?flnet\.org
+https?:\/\/([^\/]*\.)?flonase\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?flooring-guide\.org
+https?:\/\/([^\/]*\.)?floridamortgage-x\.com
+https?:\/\/([^\/]*\.)?floridian-love\.blogspot\.com
+https?:\/\/([^\/]*\.)?flower\.hostonmars\.com
+https?:\/\/([^\/]*\.)?flowerdive\.info
+https?:\/\/([^\/]*\.)?flqcjnw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fluffy\.hostcroc\.com
+https?:\/\/([^\/]*\.)?fluoxetine\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?fnhtgggv\.t35\.com
+https?:\/\/([^\/]*\.)?fnxsj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?foecedh3artbrat\.blogspot\.com
+https?:\/\/([^\/]*\.)?foedu-de-solnil\.blogspot\.com
+https?:\/\/([^\/]*\.)?folast\.com
+https?:\/\/([^\/]*\.)?folcan\.my10gb\.com
+https?:\/\/([^\/]*\.)?fondi-italiano\.hostzz\.info
+https?:\/\/([^\/]*\.)?for-whorevideos-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?forbestcare\.info
+https?:\/\/([^\/]*\.)?forensic1nursing\.chat\.ru
+https?:\/\/([^\/]*\.)?forex\.fasthost\.pl
+https?:\/\/([^\/]*\.)?fork-hief\.ibelgique\.com
+https?:\/\/([^\/]*\.)?formulam\.net
+https?:\/\/([^\/]*\.)?fortune-slots\.com
+https?:\/\/([^\/]*\.)?forum\.kharkiv\.edu
+https?:\/\/([^\/]*\.)?fos-sologals-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?foto-sabrina-ferilli\.host24h\.info
+https?:\/\/([^\/]*\.)?foxeykie\.iespana\.es
+https?:\/\/([^\/]*\.)?fozq6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fpa7kctb\.t35\.com
+https?:\/\/([^\/]*\.)?fqred\.com
+https?:\/\/([^\/]*\.)?fragolla\.blogspot\.com
+https?:\/\/([^\/]*\.)?frbarber\.dl\.pl
+https?:\/\/([^\/]*\.)?frbracco\.dl\.pl
+https?:\/\/([^\/]*\.)?freakthumbs-com-bp\.blogspot\.com
+https?:\/\/([^\/]*\.)?freakthumbs-com-hcmkk\.blogspot\.com
+https?:\/\/([^\/]*\.)?frebnet\.com
+https?:\/\/([^\/]*\.)?fredd0\.info
+https?:\/\/([^\/]*\.)?free-access\.freeinsite\.net
+https?:\/\/([^\/]*\.)?free-adult-porn-clip-info43c\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-adult-porn-clip-infopqk\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-amateur-hardcore-pic\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-amateur-submitted-photo\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-amateur-video-e2843\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-anal-blonde-sex-pic\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-anal-porn-clip\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-anal-xxx-clip\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-anime-porn-clip-info6tn\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-anime-porn-clips-newsyby\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-asian-lesbian-sex-video\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-bbw-porn-clip-blog4wm\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-big-ass-porn\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-big-boob-porn-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-big-boob\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-bizarre-insertion-pic\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-bizarre-porn-pic\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-black-amateur\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-black-porn-clip-blogo7t\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-black-porn-movie-kebi\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-black-porn-video-clip-newsjqj\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-busty-asian-movie\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-busty-blonde-pic\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-busty-porn-movie\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-busty-redhead-pic\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-butt-fucking-video\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-cartoon-porn-clip-zoneikt\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-cartoon-porn-clip-zonewpm\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-celebrity-porn-clip-infowuz\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-celebrity-porn-video-bo\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-chubby-girl-pic\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-cock-sucking-slut-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-college-fuck-fest-gallery\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-cum-blow-job-gallery\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-cum-in-mouth-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-cum-swap-video\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-ebony-porn-clip-zonek7c\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-ebony-porn-clip-zonelcy\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-ebony-pussy-pic\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-ebony-sex-video-di\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-fat-porn-clip-infotno\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-fem-dom-thumb\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-female-orgasm-video-bb-bb-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-filipina-sex-movie\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-first-time-lesbian-sex-story\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-fisting-mpeg\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-fisting-sex-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-fucking-bitch\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-fucking-gallery-hardcore\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-fucking-sex-porn-site\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-full-length-porn-mov-bb-bb-w\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gang-bang-sample\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-gay-hunk-male-movie-muscled-stud-video\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-gay-muscle\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-gay-picture-sex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-gay-porn-clips-info35a\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-porn-movie-clip-bloglor\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-porn-movie-p-d-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-porn-video-clip-newsa83\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-porn-video-p-v-p\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-porn-web-site\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-gay-sex-movie-bb-bb-s\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-gay-sex-teen-trailer\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-gay-trailer\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-granny-lesbian\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-granny-movie-old\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-granny-pic-woman\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-group-lesbian-preview-sex-video\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-hand-job-movie-bb-bb-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-hand-job-video-clip-bb-bb-c\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-hardcore-movie-gallery-xxx\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-hardcore-porn-clip-blog07a\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-hardcore-porn-clip-blogi4k\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-hardcore-porn-star-picture\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-hardcore-sex-mpeg\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-heel-high-leg-pic-stilettos-stocking\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-homemade-porn-clip-news22n\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-homemade-porn-clip-news7ro\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-hot-blonde-nude-pic\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-hot-leg-nude-wallpaper-woman\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-hot-mom\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-hot-web-cam-video-h-s-f\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-huge-black-gay-cock\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-in-lesbian-movie-nylons\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-indian-porn-clip-infok6x\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-interracial-sex-video-ko\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-latin-ass\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-lesbian-cam-chat\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-lesbian-clip-zuxi\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-lesbian-hentai-movie\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-lesbian-licking-pic\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-lesbian-mature-sex-video-young\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-lesbian-movie-gjqvl\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-lesbian-porn-clips-blogagm\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-lesbian-porn-video-clip-newsidt\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-lesbian-video-a7e8t\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-lesbian-xxx-picture\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-long-porn-clip-info2fo\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-long-porn-clip-info7pr\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-long-porn-movie-clip-blogxn2\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-long-porn-movie-clip-zoneq4f\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-long-porn-video-wi\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-male-bisexual-porn\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-mature-porn-clip-zone5bz\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-mature-sex-clip\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-mature-sex-story\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-mature-thumbnail-post\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?free-milf-porn-clip-zonenqn\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-milf-video-bb-bb-n\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-mmf-bisex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-naked-mature-lady\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?free-nude-bitch\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-nude-blonde-gallery\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-older-woman-fucking\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-online-poker-000\.biz
+https?:\/\/([^\/]*\.)?free-orgasm-clip-supi\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-paris-hilton-porn-clip-infolah\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-personal-gay-links-tommys-favorite\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-pic-of-big-dicks\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-pic-of-busty-babes\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-pic-of-woman-kissing\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-picture-hardcore-anal\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-picture-hardcore-anal\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-picture-huge-clit\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?free-porn-chwd\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clip-nep\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clip-trailer-infog42\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clip-zoneil5\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clip-zonek61\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clip-zoneu7t\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-clips-newsid3\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-movie-to0r5\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-movie-zet\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-psp-video-po\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-sample-clip-infodwd\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-sample-clip-newsb26\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-sex-clip-zoneavj\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-star-movie-bb-bb-h\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-star-video-clip-blog81e\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-clip-info7km\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-clip-infoixk\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-clip-sample-newsw3t\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-clips-infooem\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-porn-clip-blogiep\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-porn-clip-zonepqd\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn-video-puz\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-porn\.xa\.pl
+https?:\/\/([^\/]*\.)?free-pussy-fucking-movie\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?free-ringtones\.269g\.net
+https?:\/\/([^\/]*\.)?free-ringtones\.aqhhhh\.info
+https?:\/\/([^\/]*\.)?free-ringtoneten\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sex-clip-ceb\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sex-movie-pow\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sex-video-clip-kog\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sex-video-hup\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sex-video\.hostithere\.org
+https?:\/\/([^\/]*\.)?free-sexy-leg-video\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-shemale-fucking-woman-movie\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?free-shemale-movie-w-r-s\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-skin\.newmail\.ru
+https?:\/\/([^\/]*\.)?free-skin\.pochta\.ru
+https?:\/\/([^\/]*\.)?free-spase\.info
+https?:\/\/([^\/]*\.)?free-sprint-ringtoneija\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-sprint-ringtonesrha\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-t-mobile-ringtonehvh\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-teen-movie-cock-sucking\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?free-teen-porn-clip-blogpmw\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-teen-porn-clip-infohxv\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-teen-porn-video-clip-newsi5v\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-teens-porn-com-wod\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-video-sex-chat-ki\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-xxx-amateur-web-cam\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free-xxx-porn-clip-infoibv\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-xxx-porn-video-clip-infopij\.blogspot\.com
+https?:\/\/([^\/]*\.)?free-young-lesbian-movie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?free2peek-com-c1iicr\.blogspot\.com
+https?:\/\/([^\/]*\.)?free2peek-com-co8g24x0ee\.blogspot\.com
+https?:\/\/([^\/]*\.)?free2peek-com-gi6v\.blogspot\.com
+https?:\/\/([^\/]*\.)?free_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?freebigmovies-com-b25i040z\.blogspot\.com
+https?:\/\/([^\/]*\.)?freebigmovies-com-bxf440\.blogspot\.com
+https?:\/\/([^\/]*\.)?freebigmovies-com-rst\.blogspot\.com
+https?:\/\/([^\/]*\.)?freebloger\.com
+https?:\/\/([^\/]*\.)?freecooktop\.info
+https?:\/\/([^\/]*\.)?freedirectoryv\.com
+https?:\/\/([^\/]*\.)?freeforumbuilder\.com
+https?:\/\/([^\/]*\.)?freegonzo-com-du\.blogspot\.com
+https?:\/\/([^\/]*\.)?freegonzo-com-e8n\.blogspot\.com
+https?:\/\/([^\/]*\.)?freegonzo-com-og5mpk\.blogspot\.com
+https?:\/\/([^\/]*\.)?freegonzo-od5evmn\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeheaven-com-ap22\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeheaven-com-w1kx4ymi\.blogspot\.com
+https?:\/\/([^\/]*\.)?freehost\.ag
+https?:\/\/([^\/]*\.)?freehugemovies-com-dr\.blogspot\.com
+https?:\/\/([^\/]*\.)?freehugemovies-com-hi3\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeinsite\.net
+https?:\/\/([^\/]*\.)?freeinternetplus\.info
+https?:\/\/([^\/]*\.)?freenextelringtonesupf\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeones-com-amrmdwb\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeones-com-m1fc\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeones-com-mb70w6\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeones-com-mqdm\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeones-com-tfirm5smvh\.blogspot\.com
+https?:\/\/([^\/]*\.)?freepaintballgun\.com
+https?:\/\/([^\/]*\.)?freepicseries-com-kb1\.blogspot\.com
+https?:\/\/([^\/]*\.)?freepicseries-com-tfct6n\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeportalnow\.com
+https?:\/\/([^\/]*\.)?freeringtonedgf\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeringtones\.seesaa\.net
+https?:\/\/([^\/]*\.)?freeringtonesptl\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeringtoness\.fr\.funpic\.de
+https?:\/\/([^\/]*\.)?frees--123clips-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--8teenfiles-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--africanvagina-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--ah-me-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--akissbetweenthelegs-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--allsitesaccess-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--amateurcurves-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--asssupply-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--atkmodels-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--auntmia-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--bigtitspalace-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--boneme-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--bootycollection-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--bustyadventures-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--camcrush-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--camelclips-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--caughtnude-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--celebrityscandal-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--cliphunter-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--cowlist-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--dirtydaughter-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--easygals-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--ebonyblack-net\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--el-ladies-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--eurosexparties-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--fuckingfreemovies-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--gallfree-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--girlfur-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--grannyplanet-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--greentits-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--hanksgalleries-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--hereistheporn-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--hornybanana-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--idealbabes-net\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--indianpassion-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?frees--ispycameltoe-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?freespaces\.com
+https?:\/\/([^\/]*\.)?freesprintringtoneenx\.blogspot\.com
+https?:\/\/([^\/]*\.)?freesprintringtoneswkd\.blogspot\.com
+https?:\/\/([^\/]*\.)?freestyman\.com
+https?:\/\/([^\/]*\.)?freetmobileringtonekaw\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeverizonringtonevol\.blogspot\.com
+https?:\/\/([^\/]*\.)?freewebsitehosting\.net
+https?:\/\/([^\/]*\.)?freexmovies-com-i1xi8s\.blogspot\.com
+https?:\/\/([^\/]*\.)?freexmovies-com-ojxc1k\.blogspot\.com
+https?:\/\/([^\/]*\.)?freeyaho\.com
+https?:\/\/([^\/]*\.)?french-kissing-my-sister\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?french-kissing\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?french-lick-child-family-entertainment\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?french-tickler-condom\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?french168\.com
+https?:\/\/([^\/]*\.)?frenchcum-btb\.blogspot\.com
+https?:\/\/([^\/]*\.)?frenchcum-com-mzqj8hpm\.blogspot\.com
+https?:\/\/([^\/]*\.)?frenchcum-com-w07ua1w7z\.blogspot\.com
+https?:\/\/([^\/]*\.)?fresh-sex\.futureblog\.org
+https?:\/\/([^\/]*\.)?friendsgrabber\.com
+https?:\/\/([^\/]*\.)?fripcn9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?frog-sexgtw\.blogspot\.com
+https?:\/\/([^\/]*\.)?frog-sexlfe\.blogspot\.com
+https?:\/\/([^\/]*\.)?frogm\.info
+https?:\/\/([^\/]*\.)?frogsex-com-ev4zmddt\.blogspot\.com
+https?:\/\/([^\/]*\.)?frogsex-com-ivtcaqfsx\.blogspot\.com
+https?:\/\/([^\/]*\.)?frogsex-gnle04e\.blogspot\.com
+https?:\/\/([^\/]*\.)?frt3\.org\.ua
+https?:\/\/([^\/]*\.)?fsxhl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fsyflower\.com
+https?:\/\/([^\/]*\.)?ft568\.com
+https?:\/\/([^\/]*\.)?ftffo\.szm\.sk
+https?:\/\/([^\/]*\.)?fthaop1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ftntg\.szm\.sk
+https?:\/\/([^\/]*\.)?fu-alexus\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuck-gallery-picture\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?fuck-her-in-mouth\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fuck-lesbian-pussy\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?fuck-pussy-suck-swallow\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?fuck-sexy-slut\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?fuck-the-maidens\.info
+https?:\/\/([^\/]*\.)?fuckfromass\.info
+https?:\/\/([^\/]*\.)?fucking-hardcore-japanese-slut\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?fucking-lesbian-licking-pussy\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?fucking-machine-thumbnail\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?fucking-preity-sucking-zinta\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?fucking-teen-party\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?fuckingfreemovies-com-gvps\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckingfreemovies-com-gy2\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckingfreemovies-com-qogog\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckingmachines-com-b4glo\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckingmachines-com-h3\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckingmachines-com-hqrbqh4\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckk-com-ot8wc\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckk-com-r6\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuckk-com-rw5485\.blogspot\.com
+https?:\/\/([^\/]*\.)?fucksakes-com-ks7uskz64\.blogspot\.com
+https?:\/\/([^\/]*\.)?fufpyl5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?funberry-com-meft\.blogspot\.com
+https?:\/\/([^\/]*\.)?funberry-com-mkjvxl\.blogspot\.com
+https?:\/\/([^\/]*\.)?funberry-com-tz8\.blogspot\.com
+https?:\/\/([^\/]*\.)?funkall\.us
+https?:\/\/([^\/]*\.)?funny-stuff\.3ae6ucb\.info
+https?:\/\/([^\/]*\.)?funpelv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fuohcbq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?furama\.dtdns\.net
+https?:\/\/([^\/]*\.)?furrysoap\.ifrance\.com
+https?:\/\/([^\/]*\.)?fuvo-aimee\.blogspot\.com
+https?:\/\/([^\/]*\.)?fuyinj\.ebloggy\.com
+https?:\/\/([^\/]*\.)?fvinc\.4t\.com
+https?:\/\/([^\/]*\.)?fvjz5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fwbhexo\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fweroze\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fwvsp\.szm\.sk
+https?:\/\/([^\/]*\.)?fx120\.com
+https?:\/\/([^\/]*\.)?fx120\.net
+https?:\/\/([^\/]*\.)?fxxb5\.szm\.sk
+https?:\/\/([^\/]*\.)?fyisy\.szm\.sk
+https?:\/\/([^\/]*\.)?fylfw\.szm\.sk
+https?:\/\/([^\/]*\.)?fyyvb\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?fzdlcfzh-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?g-maste\.com
+https?:\/\/([^\/]*\.)?g2c2rtc\.info
+https?:\/\/([^\/]*\.)?g3eros\.info
+https?:\/\/([^\/]*\.)?g76\.be
+https?:\/\/([^\/]*\.)?gadkj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gaeq2\.szm\.sk
+https?:\/\/([^\/]*\.)?gafdyq9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gagase\.com
+https?:\/\/([^\/]*\.)?gailc\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?galleries4free-com-e1ew\.blogspot\.com
+https?:\/\/([^\/]*\.)?galleries4free-com-o8\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallery-jenna-jameson-blonde\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gallery-kissing-woman-woman\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gallery-lesson-milf\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?gallery-lingerie-see-teen-thru\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?gallery-mature-stocking\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?gallfree-com-b0uf2q0\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallfree-com-ra5f1d7\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallfree-com-teruq\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallview-com-a2wqsk\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallview-com-ahasx\.blogspot\.com
+https?:\/\/([^\/]*\.)?gallview-com-wa6froqpl\.blogspot\.com
+https?:\/\/([^\/]*\.)?gambling-online-theory\.com
+https?:\/\/([^\/]*\.)?gamenase\.com
+https?:\/\/([^\/]*\.)?gamez4less\.com
+https?:\/\/([^\/]*\.)?gang-bang-free-pic-gallery\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gangsheng\.home4u\.china\.com
+https?:\/\/([^\/]*\.)?gaping-ass-sex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gaqx6\.szm\.sk
+https?:\/\/([^\/]*\.)?garid\.biz
+https?:\/\/([^\/]*\.)?garlic\.hostonmars\.com
+https?:\/\/([^\/]*\.)?garter\.nocostwebhosting\.com
+https?:\/\/([^\/]*\.)?gastrointestinal\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?gastrw\.com
+https?:\/\/([^\/]*\.)?gatalgat\.myrealboard\.com
+https?:\/\/([^\/]*\.)?gatloral\.myrealboard\.com
+https?:\/\/([^\/]*\.)?gatx10258\.blogspot\.com
+https?:\/\/([^\/]*\.)?gay-bareback-story\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?gay-big-cock-video-clip\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gay-black-blow-job\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-blonde-twinks\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gay-cum-eater\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-gang-bang-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?gay-girl-kissing\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?gay-girl-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-hispanic-man-naked\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-hot-latinos\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-huge-thick-cock\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-hunk-sex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-man-hardcore\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gay-man-man-sex\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-man-mature-old-picture\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?gay-man-naked-wrestling\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?gay-marriage-benefit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-photo-personals\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?gay-porn-clip-zonehyx\.blogspot\.com
+https?:\/\/([^\/]*\.)?gay-porn-video-clip-news8dd\.blogspot\.com
+https?:\/\/([^\/]*\.)?gay-pride-week-in-florida\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-sex-video-on-demand\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?gay-teen-man\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-teen-sex-clip\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-themed-movie\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?gay-twinks-fucking\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gay-web-cam-site\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gay-woman-chat-rooms\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?gazwc\.szm\.sk
+https?:\/\/([^\/]*\.)?gbapc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gbd-amy\.hostithere\.org
+https?:\/\/([^\/]*\.)?gbtw1\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?gbvgxus\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gceaq\.szm\.sk
+https?:\/\/([^\/]*\.)?gcqqkhx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gd-r\.com
+https?:\/\/([^\/]*\.)?gdfea\.szm\.sk
+https?:\/\/([^\/]*\.)?geb0cs\.nokedem\.com
+https?:\/\/([^\/]*\.)?gebu-aeh\.blogspot\.com
+https?:\/\/([^\/]*\.)?geddesvicente\.info
+https?:\/\/([^\/]*\.)?geflamio\.dl\.pl
+https?:\/\/([^\/]*\.)?genaholincorporated\.com
+https?:\/\/([^\/]*\.)?generic-paxil\.contact\.cc
+https?:\/\/([^\/]*\.)?genericbuy\.o-f\.com
+https?:\/\/([^\/]*\.)?genoux\.dnsrd\.com
+https?:\/\/([^\/]*\.)?georgiamortgage-x\.com
+https?:\/\/([^\/]*\.)?germani4\.blogspot\.com
+https?:\/\/([^\/]*\.)?gesrju\.com
+https?:\/\/([^\/]*\.)?get6or6li\.dl\.pl
+https?:\/\/([^\/]*\.)?getaer\.forumculture\.net
+https?:\/\/([^\/]*\.)?getbankruptcylaw\.info
+https?:\/\/([^\/]*\.)?getdeerelt\.forumzen\.com
+https?:\/\/([^\/]*\.)?getdelsit\.zj\.pl
+https?:\/\/([^\/]*\.)?getdomsit\.blogcu\.com
+https?:\/\/([^\/]*\.)?getfemon\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?getgetvi\.lolbb\.com
+https?:\/\/([^\/]*\.)?gethelp24x7\.net
+https?:\/\/([^\/]*\.)?getkuric\.blogcu\.com
+https?:\/\/([^\/]*\.)?getletovi\.winnerforum\.net
+https?:\/\/([^\/]*\.)?getlimon\.discutfree\.com
+https?:\/\/([^\/]*\.)?getowson\.dl\.pl
+https?:\/\/([^\/]*\.)?gettaer\.ephpbb\.com
+https?:\/\/([^\/]*\.)?getzelvi\.goodbb\.net
+https?:\/\/([^\/]*\.)?gezu-alaina\.blogspot\.com
+https?:\/\/([^\/]*\.)?gfd69\.tripod\.com
+https?:\/\/([^\/]*\.)?gg0\.be
+https?:\/\/([^\/]*\.)?ggfix\.com
+https?:\/\/([^\/]*\.)?gglive\.info
+https?:\/\/([^\/]*\.)?gguu\.com
+https?:\/\/([^\/]*\.)?ggww\.dtdns\.net
+https?:\/\/([^\/]*\.)?ggzhm\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ghhdh\.szm\.sk
+https?:\/\/([^\/]*\.)?ghiacci0\.info
+https?:\/\/([^\/]*\.)?ghnakjwcjp-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?ghrvu\.szm\.sk
+https?:\/\/([^\/]*\.)?ghvd7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?giant-cock-shemale\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?giant-dick-sucking\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?giant-dildo-in-pussy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gifo-administrator\.blogspot\.com
+https?:\/\/([^\/]*\.)?gigablast\.republika\.pl
+https?:\/\/([^\/]*\.)?gigagalleries-com-c1ylawg\.blogspot\.com
+https?:\/\/([^\/]*\.)?gigagalleries-com-cn4\.blogspot\.com
+https?:\/\/([^\/]*\.)?gigagalleries-com-gd0a\.blogspot\.com
+https?:\/\/([^\/]*\.)?gigavids-com-wcmck\.blogspot\.com
+https?:\/\/([^\/]*\.)?gimps\.info
+https?:\/\/([^\/]*\.)?giochi-java\.heroez\.info
+https?:\/\/([^\/]*\.)?gioco-avventura-vari\.bb22\.info
+https?:\/\/([^\/]*\.)?gioco-online-picchiaduro\.nnme\.info
+https?:\/\/([^\/]*\.)?gipolit\.asp2\.cz
+https?:\/\/([^\/]*\.)?girl-butt-in-tight-jeans\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?girl-guy-kissing\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?girl-kissing-video-bb-bb-j\.blogspot\.com
+https?:\/\/([^\/]*\.)?girl-playing-with-dildo\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?girl-showing-there-boob\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?girl-with-big-dildo\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?girlfur-com-ga\.blogspot\.com
+https?:\/\/([^\/]*\.)?girlfur-com-pisij\.blogspot\.com
+https?:\/\/([^\/]*\.)?gisogenu\.org
+https?:\/\/([^\/]*\.)?give-me-baby\.info
+https?:\/\/([^\/]*\.)?gjjf\.com
+https?:\/\/([^\/]*\.)?gjjp\.left-page\.com
+https?:\/\/([^\/]*\.)?gjjp\.zxvo\.com
+https?:\/\/([^\/]*\.)?gjqgec8\.info
+https?:\/\/([^\/]*\.)?gkjxcs1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gkwzrz8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?glamouronline\.info
+https?:\/\/([^\/]*\.)?glebo\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo1\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo2\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo3\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo4\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo5\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo6\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo7\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo8\.host-page\.com
+https?:\/\/([^\/]*\.)?glebo9\.host-page\.com
+https?:\/\/([^\/]*\.)?glmv6\.szm\.sk
+https?:\/\/([^\/]*\.)?globalbartertrade\.info
+https?:\/\/([^\/]*\.)?globalflights\.org
+https?:\/\/([^\/]*\.)?globalrecreationguide\.com
+https?:\/\/([^\/]*\.)?globegarment\.com\.cn
+https?:\/\/([^\/]*\.)?glodgreen\.info
+https?:\/\/([^\/]*\.)?gloryhole\.coz\.in
+https?:\/\/([^\/]*\.)?glovebox\.freewebpage\.org
+https?:\/\/([^\/]*\.)?gloveboxes\.cn
+https?:\/\/([^\/]*\.)?gloveboxes\.com\.cn
+https?:\/\/([^\/]*\.)?glover\.host-page\.com
+https?:\/\/([^\/]*\.)?glover1\.host-page\.com
+https?:\/\/([^\/]*\.)?glover2\.host-page\.com
+https?:\/\/([^\/]*\.)?glover3\.host-page\.com
+https?:\/\/([^\/]*\.)?glover4\.host-page\.com
+https?:\/\/([^\/]*\.)?glover5\.host-page\.com
+https?:\/\/([^\/]*\.)?glover6\.host-page\.com
+https?:\/\/([^\/]*\.)?glover7\.host-page\.com
+https?:\/\/([^\/]*\.)?glover8\.host-page\.com
+https?:\/\/([^\/]*\.)?glover9\.host-page\.com
+https?:\/\/([^\/]*\.)?gmldsb\.com
+https?:\/\/([^\/]*\.)?gnsgs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?go-ansna\.ibelgique\.com
+https?:\/\/([^\/]*\.)?goaie\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?goatlist-com-dk15cne\.blogspot\.com
+https?:\/\/([^\/]*\.)?goatlist-com-hi\.blogspot\.com
+https?:\/\/([^\/]*\.)?goatlist-com-o5\.blogspot\.com
+https?:\/\/([^\/]*\.)?gobabo\.nocostwebhosting\.com
+https?:\/\/([^\/]*\.)?gobald\.dtdns\.net
+https?:\/\/([^\/]*\.)?gobu4\.szm\.sk
+https?:\/\/([^\/]*\.)?gogllefr\.125mb\.com
+https?:\/\/([^\/]*\.)?gokletvi\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?goko-adeline\.blogspot\.com
+https?:\/\/([^\/]*\.)?gold-watch\.grimgoe\.be
+https?:\/\/([^\/]*\.)?gold\.fathippohosting\.com
+https?:\/\/([^\/]*\.)?goldsexcity\.info
+https?:\/\/([^\/]*\.)?goldshop\.freehostia\.com
+https?:\/\/([^\/]*\.)?golenord\.dl\.pl
+https?:\/\/([^\/]*\.)?goler-sor1z\.blogspot\.com
+https?:\/\/([^\/]*\.)?golfhq\.org
+https?:\/\/([^\/]*\.)?golfshoot\.com
+https?:\/\/([^\/]*\.)?gololed\.blogspot\.com
+https?:\/\/([^\/]*\.)?gomy0\.szm\.sk
+https?:\/\/([^\/]*\.)?gonzo-movies-com-ez\.blogspot\.com
+https?:\/\/([^\/]*\.)?gonzo-movies-rkk5jq\.blogspot\.com
+https?:\/\/([^\/]*\.)?good568\.com
+https?:\/\/([^\/]*\.)?goodhealthjobs\.info
+https?:\/\/([^\/]*\.)?goodticket\.org
+https?:\/\/([^\/]*\.)?google-pharmacy\.com
+https?:\/\/([^\/]*\.)?google110\.yculblog\.com
+https?:\/\/([^\/]*\.)?googlepaiming\.ebloggy\.com
+https?:\/\/([^\/]*\.)?googletosh\.org
+https?:\/\/([^\/]*\.)?goporn\.info
+https?:\/\/([^\/]*\.)?gopremen\.dl\.pl
+https?:\/\/([^\/]*\.)?gor-richards-realm-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?gorillalinks-com-t77\.blogspot\.com
+https?:\/\/([^\/]*\.)?gorillashaman\.blogspot\.com
+https?:\/\/([^\/]*\.)?gorlum\.t35\.com
+https?:\/\/([^\/]*\.)?gorunger\.com
+https?:\/\/([^\/]*\.)?goxzk\.szm\.sk
+https?:\/\/([^\/]*\.)?gpdmr\.szm\.sk
+https?:\/\/([^\/]*\.)?gphv0\.szm\.sk
+https?:\/\/([^\/]*\.)?gplea\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gqnzzlu\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?graduate-schools\.hotmail\.ru
+https?:\/\/([^\/]*\.)?graduate1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?graduate2schools\.chat\.ru
+https?:\/\/([^\/]*\.)?graf\.pp\.ru
+https?:\/\/([^\/]*\.)?grammatica-inglese\.bb11\.info
+https?:\/\/([^\/]*\.)?gran-roques\.forumhst\.info
+https?:\/\/([^\/]*\.)?granny-boy-free-pic\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?granny-movie-thumb\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?grannyorgies-com-o1w34\.blogspot\.com
+https?:\/\/([^\/]*\.)?grannyorgies-com-ormpubp\.blogspot\.com
+https?:\/\/([^\/]*\.)?grannyorgies-com-r2on\.blogspot\.com
+https?:\/\/([^\/]*\.)?grannypictures-com-a2w1\.blogspot\.com
+https?:\/\/([^\/]*\.)?grannypictures-com-ak6273j85t\.blogspot\.com
+https?:\/\/([^\/]*\.)?grannyplanet-com-k1bea\.blogspot\.com
+https?:\/\/([^\/]*\.)?great-ass-gallery\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?greataftorless\.com
+https?:\/\/([^\/]*\.)?greatbmwclub\.cn
+https?:\/\/([^\/]*\.)?greatbmwparts\.cn
+https?:\/\/([^\/]*\.)?greatbudgetinn\.info
+https?:\/\/([^\/]*\.)?greathal\.com
+https?:\/\/([^\/]*\.)?greatinsurancedirect\.info
+https?:\/\/([^\/]*\.)?greatmercedescar\.info
+https?:\/\/([^\/]*\.)?greatpsychology\.info
+https?:\/\/([^\/]*\.)?greatusainternet\.info
+https?:\/\/([^\/]*\.)?green-gradens\.org
+https?:\/\/([^\/]*\.)?green-tea-300\.co\.nr
+https?:\/\/([^\/]*\.)?green-tea\.co\.nr
+https?:\/\/([^\/]*\.)?greentits-com-kr3h3787pt\.blogspot\.com
+https?:\/\/([^\/]*\.)?greentits-com-t8xf3x5\.blogspot\.com
+https?:\/\/([^\/]*\.)?greentits-com-tr242sh16\.blogspot\.com
+https?:\/\/([^\/]*\.)?greet\.ipupdater\.net
+https?:\/\/([^\/]*\.)?grgul\.szm\.sk
+https?:\/\/([^\/]*\.)?griev\.ipupdater\.com
+https?:\/\/([^\/]*\.)?griffeylaw\.com
+https?:\/\/([^\/]*\.)?grimasa\.republika\.pl
+https?:\/\/([^\/]*\.)?groovybus-com-cv8ry83\.blogspot\.com
+https?:\/\/([^\/]*\.)?groovybus-com-gy1258kur3\.blogspot\.com
+https?:\/\/([^\/]*\.)?groupforums\.com
+https?:\/\/([^\/]*\.)?groups-msn-com-masturbating-site-woman\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?groups\.ku\.edu
+https?:\/\/([^\/]*\.)?grrualca\.jconserv\.net
+https?:\/\/([^\/]*\.)?gsaxz\.szm\.sk
+https?:\/\/([^\/]*\.)?gsebook\.org
+https?:\/\/([^\/]*\.)?gsloi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gsuyfy2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gsxez\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gu-amateur-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?guangdianyuanjian\.dzsc\.com
+https?:\/\/([^\/]*\.)?gudtk\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?guess76\.blogspot\.com
+https?:\/\/([^\/]*\.)?guilty-until-proven-innocent\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?gumaxxx-com-e3748i87g\.blogspot\.com
+https?:\/\/([^\/]*\.)?gumaxxx-com-ow774pk74m\.blogspot\.com
+https?:\/\/([^\/]*\.)?gumybear\.php5\.cz
+https?:\/\/([^\/]*\.)?gunterdirect\.com
+https?:\/\/([^\/]*\.)?gunterlawoffice\.com
+https?:\/\/([^\/]*\.)?guruful\.stabilt\.se
+https?:\/\/([^\/]*\.)?guys-butt-fucking\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?gvfefn3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gwebsearch\.org
+https?:\/\/([^\/]*\.)?gwjsx\.szm\.sk
+https?:\/\/([^\/]*\.)?gxrd3\.szm\.sk
+https?:\/\/([^\/]*\.)?gyig3\.szm\.sk
+https?:\/\/([^\/]*\.)?gym-equipments\.org
+https?:\/\/([^\/]*\.)?gyzvpxl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gzmayz6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?gzvwa\.szm\.sk
+https?:\/\/([^\/]*\.)?h0vutok\.nokedem\.com
+https?:\/\/([^\/]*\.)?h15\.ru
+https?:\/\/([^\/]*\.)?h3as88dw\.info
+https?:\/\/([^\/]*\.)?habromjw\.dl\.pl
+https?:\/\/([^\/]*\.)?haemcurio\.0moola\.com
+https?:\/\/([^\/]*\.)?hahas\.info
+https?:\/\/([^\/]*\.)?hairy-ass-hole\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?hairy-chubby-gallery\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?hairy-leg-pic-woman\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hairy-milf-movie\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?hairydivas-com-hg2gvyc\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairydivas-t150c5gmf8\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairyerotica-com-i4fl2x\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairypinktacos-com-djl\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairypinktacos-com-hlnfq3rea2\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairypussypost-com-mk0ymrj\.blogspot\.com
+https?:\/\/([^\/]*\.)?hairypussypost-com-w6\.blogspot\.com
+https?:\/\/([^\/]*\.)?hal\.engr\.smu\.edu
+https?:\/\/([^\/]*\.)?halloween2006\.info
+https?:\/\/([^\/]*\.)?halx8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hamalo\.com
+https?:\/\/([^\/]*\.)?hamas2007\.republika\.pl
+https?:\/\/([^\/]*\.)?hand-job-movie-x-x-d\.blogspot\.com
+https?:\/\/([^\/]*\.)?hand-stained-xx\.blogspot\.com
+https?:\/\/([^\/]*\.)?hangzhau\.cn
+https?:\/\/([^\/]*\.)?hanksgalleries-com-b73flku8\.blogspot\.com
+https?:\/\/([^\/]*\.)?hanksgalleries-com-rtuvbgdl\.blogspot\.com
+https?:\/\/([^\/]*\.)?hanry\.stabilt\.se
+https?:\/\/([^\/]*\.)?haole\.cn
+https?:\/\/([^\/]*\.)?happy-pharma\.com
+https?:\/\/([^\/]*\.)?hard-disk-esterno\.hostzz\.info
+https?:\/\/([^\/]*\.)?hard-disk-esterno\.ll11\.info
+https?:\/\/([^\/]*\.)?hardbabes-com-e061obbg\.blogspot\.com
+https?:\/\/([^\/]*\.)?hardbabes-com-e588iqk\.blogspot\.com
+https?:\/\/([^\/]*\.)?hardcore-amateur-thumbnail\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hardcore-asian-anal\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?hardcore-dancing-site-myspace-com\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hardcore-free-porn-xx\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?hardcore-lesbian-pussy-eating\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hardcore-mature-sex-young\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?hardcore-porn-clip-info73q\.blogspot\.com
+https?:\/\/([^\/]*\.)?hardcore-sex-black-on-white\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?hardcore-xxx-video\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hardcoregangstas\.hrable\.dtdns\.net
+https?:\/\/([^\/]*\.)?hardhut-com-ao8renz\.blogspot\.com
+https?:\/\/([^\/]*\.)?hardhut-com-tgi\.blogspot\.com
+https?:\/\/([^\/]*\.)?hardhut-com-wb8m8\.blogspot\.com
+https?:\/\/([^\/]*\.)?hargd\.szm\.sk
+https?:\/\/([^\/]*\.)?harley-davidson-womens-boot\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?harted\.hostpresso\.com
+https?:\/\/([^\/]*\.)?haungsanok\.com
+https?:\/\/([^\/]*\.)?hawaiimortgage-x\.com
+https?:\/\/([^\/]*\.)?hawbij4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hawkesnest\.com
+https?:\/\/([^\/]*\.)?hazell-keeley-sex-video-bb-bb-f\.blogspot\.com
+https?:\/\/([^\/]*\.)?hbyfq\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?hcgs\.unh\.edu
+https?:\/\/([^\/]*\.)?hclt-events\.blogspot\.com
+https?:\/\/([^\/]*\.)?hdbj\.com\.cn
+https?:\/\/([^\/]*\.)?hdchina\.com
+https?:\/\/([^\/]*\.)?hdlwc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hdndeuw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?he-wells\.blogspot\.com
+https?:\/\/([^\/]*\.)?he-wendy\.blogspot\.com
+https?:\/\/([^\/]*\.)?head-masturbating-shower-woman\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?health-insurance-0\.blogspot\.com
+https?:\/\/([^\/]*\.)?health-insurance-save\.com
+https?:\/\/([^\/]*\.)?health-jack\.com
+https?:\/\/([^\/]*\.)?healthinsurance-x\.com
+https?:\/\/([^\/]*\.)?healthprocare\.info
+https?:\/\/([^\/]*\.)?hebei-railings\.cn
+https?:\/\/([^\/]*\.)?hecarabi\.info
+https?:\/\/([^\/]*\.)?hefo-adrianna\.blogspot\.com
+https?:\/\/([^\/]*\.)?hek-tshirthell-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?hellim\.3x\.ro
+https?:\/\/([^\/]*\.)?heloween\.php5\.cz
+https?:\/\/([^\/]*\.)?hemilton\.stabilt\.se
+https?:\/\/([^\/]*\.)?hengxinbanjia\.com
+https?:\/\/([^\/]*\.)?her-first-anal-fucking\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?her-first-cum\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?her-first-lesbian-sex-kylie\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?her-first-small-dick\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?her-sweet-ass\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?here\.com\.cn
+https?:\/\/([^\/]*\.)?hereandnow0\.com
+https?:\/\/([^\/]*\.)?hereistheporn-com-abg\.blogspot\.com
+https?:\/\/([^\/]*\.)?hereistheporn-com-wxu4\.blogspot\.com
+https?:\/\/([^\/]*\.)?herpes\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?herufip\.info
+https?:\/\/([^\/]*\.)?heschlos\.dl\.pl
+https?:\/\/([^\/]*\.)?hevo-alannah\.blogspot\.com
+https?:\/\/([^\/]*\.)?hexingqc\.com
+https?:\/\/([^\/]*\.)?hfpm\.com
+https?:\/\/([^\/]*\.)?hfsflm0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hfslink\.com
+https?:\/\/([^\/]*\.)?hgdpy\.szm\.sk
+https?:\/\/([^\/]*\.)?hgh\.rx4\.org
+https?:\/\/([^\/]*\.)?hgqz5\.szm\.sk
+https?:\/\/([^\/]*\.)?hguldxxe-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?hgyxs\.szm\.sk
+https?:\/\/([^\/]*\.)?hhcoh\.szm\.sk
+https?:\/\/([^\/]*\.)?hhlive\.info
+https?:\/\/([^\/]*\.)?hhpump\.com
+https?:\/\/([^\/]*\.)?hiadadar\.forumzen\.com
+https?:\/\/([^\/]*\.)?higarret\.forumzen\.com
+https?:\/\/([^\/]*\.)?high-heel-western-boot\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?high-school-diploma\.hotmail\.ru
+https?:\/\/([^\/]*\.)?high1school4dipl\.chat\.ru
+https?:\/\/([^\/]*\.)?highclassblogs\.com
+https?:\/\/([^\/]*\.)?hilarykallin\.50webs\.org
+https?:\/\/([^\/]*\.)?hilipa\.com
+https?:\/\/([^\/]*\.)?hilipy\.com
+https?:\/\/([^\/]*\.)?hillery\.republika\.pl
+https?:\/\/([^\/]*\.)?himd4\.szm\.sk
+https?:\/\/([^\/]*\.)?himp3\.biz
+https?:\/\/([^\/]*\.)?hinn8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hioctane-com-dlmv6g7y\.blogspot\.com
+https?:\/\/([^\/]*\.)?hioctane-com-dq4opea\.blogspot\.com
+https?:\/\/([^\/]*\.)?hioctane-com-h0un\.blogspot\.com
+https?:\/\/([^\/]*\.)?hioctane-com-toxuz\.blogspot\.com
+https?:\/\/([^\/]*\.)?hipoldlady\.com
+https?:\/\/([^\/]*\.)?hirudaco\.forumzen\.com
+https?:\/\/([^\/]*\.)?his13lessings\.blogspot\.com
+https?:\/\/([^\/]*\.)?history-of-condom\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?hisyma\.dl\.pl
+https?:\/\/([^\/]*\.)?hitm4n\.blogspot\.com
+https?:\/\/([^\/]*\.)?hiv123\.com
+https?:\/\/([^\/]*\.)?hiv987\.zj\.com
+https?:\/\/([^\/]*\.)?hjia\.ebloggy\.com
+https?:\/\/([^\/]*\.)?hjolmed\.com
+https?:\/\/([^\/]*\.)?hkcompanyforyou\.cn
+https?:\/\/([^\/]*\.)?hkfeng\.com
+https?:\/\/([^\/]*\.)?hkwei\.com\.cn
+https?:\/\/([^\/]*\.)?hlemizd\.republika\.pl
+https?:\/\/([^\/]*\.)?hlusky\.republika\.pl
+https?:\/\/([^\/]*\.)?hlxn6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hmppbw-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?hnxsv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ho-big-clip-tit-video-hox\.blogspot\.com
+https?:\/\/([^\/]*\.)?hobaysin\.ifrance\.com
+https?:\/\/([^\/]*\.)?hocohn\.dl\.pl
+https?:\/\/([^\/]*\.)?hohoo\.cn
+https?:\/\/([^\/]*\.)?hold-em-play\.com
+https?:\/\/([^\/]*\.)?hold-em-play\.net
+https?:\/\/([^\/]*\.)?hold-em-winner\.us
+https?:\/\/([^\/]*\.)?home-made-porn-clip-blogt7y\.blogspot\.com
+https?:\/\/([^\/]*\.)?home-mortgages\.bigsitecity\.com
+https?:\/\/([^\/]*\.)?home-sauna\.boom\.ru
+https?:\/\/([^\/]*\.)?home-secure\.org
+https?:\/\/([^\/]*\.)?home-sex-video-t1ux7\.blogspot\.com
+https?:\/\/([^\/]*\.)?home-spire\.com
+https?:\/\/([^\/]*\.)?home\.graffiti\.net
+https?:\/\/([^\/]*\.)?home\.sailormoon\.com
+https?:\/\/([^\/]*\.)?home2-school\.boom\.ru
+https?:\/\/([^\/]*\.)?homeequitylineofcredit-x\.com
+https?:\/\/([^\/]*\.)?homeequitylineofcreditlenders\.com
+https?:\/\/([^\/]*\.)?homeequityloan-now\.com
+https?:\/\/([^\/]*\.)?homeequityloans-now\.com
+https?:\/\/([^\/]*\.)?homeequityloans-x\.com
+https?:\/\/([^\/]*\.)?homefinance-x\.com
+https?:\/\/([^\/]*\.)?homeloan-now\.com
+https?:\/\/([^\/]*\.)?homeloanlogic\.com
+https?:\/\/([^\/]*\.)?homeloans-now\.com
+https?:\/\/([^\/]*\.)?homemade-mature-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?homemade-porn-clip-infoywx\.blogspot\.com
+https?:\/\/([^\/]*\.)?homesafterbankruptcy\.info
+https?:\/\/([^\/]*\.)?homesbysellers\.com
+https?:\/\/([^\/]*\.)?homesbysellers\.net
+https?:\/\/([^\/]*\.)?homesexvideo\.org
+https?:\/\/([^\/]*\.)?hometowngirls\.be
+https?:\/\/([^\/]*\.)?hometwat-com-hrmml\.blogspot\.com
+https?:\/\/([^\/]*\.)?homos\.php5\.cz
+https?:\/\/([^\/]*\.)?homunkulus\.info
+https?:\/\/([^\/]*\.)?homunkulus\.republika\.pl
+https?:\/\/([^\/]*\.)?homy\.etowns\.net
+https?:\/\/([^\/]*\.)?honba\.republika\.pl
+https?:\/\/([^\/]*\.)?honey99\.cn
+https?:\/\/([^\/]*\.)?honey99\.com
+https?:\/\/([^\/]*\.)?hongjianlaw\.com
+https?:\/\/([^\/]*\.)?hongqi120\.com
+https?:\/\/([^\/]*\.)?hoodia\.269g\.net
+https?:\/\/([^\/]*\.)?hoodiadiet\.269g\.net
+https?:\/\/([^\/]*\.)?hopemarry\.com
+https?:\/\/([^\/]*\.)?horizondrugs\.zaclona\.yi\.org
+https?:\/\/([^\/]*\.)?hornina\.net
+https?:\/\/([^\/]*\.)?horny-butt-sex\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?horny-grannysex-bipiw\.blogspot\.com
+https?:\/\/([^\/]*\.)?horny-hailey\.hostithere\.org
+https?:\/\/([^\/]*\.)?hornybanana-com-mg\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornybanana-com-to0b\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornycrocodile-com-c37c85\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornycrocodile-com-gmb5ev\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornycrocodile-com-gv3x3oxt\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornyduck-com-esta\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornyduck-com-oix7y2v\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornykaren-com-b16sk5\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornykaren-com-bl4rw4\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornykaren-com-rg034\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornyspanishflies-com-c0cx6a3bo\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornyspanishflies-com-ks5856vf77\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornytiger-com-d3\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornytiger-com-il0x678fwr\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornywolf-com-m27\.blogspot\.com
+https?:\/\/([^\/]*\.)?hornywolf-com-tqwaj\.blogspot\.com
+https?:\/\/([^\/]*\.)?hospitalonline\.cn
+https?:\/\/([^\/]*\.)?host-page\.com
+https?:\/\/([^\/]*\.)?hosting1999\.com
+https?:\/\/([^\/]*\.)?hosting41\.com
+https?:\/\/([^\/]*\.)?hot-anal-sex-com\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hot-asian-cock\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?hot-ass-anal\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?hot-blonde-babe-gallery\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?hot-brazilian-ass\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?hot-bubble-butt-girl\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?hot-cheerleader-getting-fucked\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?hot-dating-chat\.ifastnet\.com
+https?:\/\/([^\/]*\.)?hot-latino-ass\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?hot-mature-sex-uk-woman\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?hot-mature-xxx\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?hot-mom-site-myspace-com\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?hot-nude-blonde-chick\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?hot-pussy-tit-ass\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?hot-sex-video-bb-bb-v\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotbigmovies-com-cd\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotbigmovies-com-k62que75im\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotchina\.org
+https?:\/\/([^\/]*\.)?hotel-centro-benessere\.host24h\.info
+https?:\/\/([^\/]*\.)?hotel-offerta\.nnme\.info
+https?:\/\/([^\/]*\.)?hotel-shop\.info
+https?:\/\/([^\/]*\.)?hotelsaccommodations\.info
+https?:\/\/([^\/]*\.)?hotfunhouse-com-pevuv\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotfunhouse-com-r5530\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotgirlsplayroom-com-dl0q21\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotgirlsplayroom-com-isnkeded\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotmoko\.info
+https?:\/\/([^\/]*\.)?hotorange-net-ms\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotpapai-com-hoc3g\.blogspot\.com
+https?:\/\/([^\/]*\.)?hotty-x\.com
+https?:\/\/([^\/]*\.)?hottystop-com-a252gugtk\.blogspot\.com
+https?:\/\/([^\/]*\.)?hottystop-com-grn\.blogspot\.com
+https?:\/\/([^\/]*\.)?house-15\.jeepsyc\.be
+https?:\/\/([^\/]*\.)?houses-bahamas\.ligamic\.be
+https?:\/\/([^\/]*\.)?housewifeaction-com-evv\.blogspot\.com
+https?:\/\/([^\/]*\.)?housewifeaction-com-o6z0yrnat\.blogspot\.com
+https?:\/\/([^\/]*\.)?housewifeaction-com-ob85\.blogspot\.com
+https?:\/\/([^\/]*\.)?hovadko\.isuisse\.com
+https?:\/\/([^\/]*\.)?hovass\.com
+https?:\/\/([^\/]*\.)?hovi-albatross\.blogspot\.com
+https?:\/\/([^\/]*\.)?how-to-catch-a-cheating-spouse\.com
+https?:\/\/([^\/]*\.)?how-to-make-a-boot-disk-on-win-xp\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?how-to-make-a-boot-disk\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?how-to-make-a-cock-ring\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?hppr7\.szm\.sk
+https?:\/\/([^\/]*\.)?hpua6\.szm\.sk
+https?:\/\/([^\/]*\.)?hpwe6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hq-casino\.org
+https?:\/\/([^\/]*\.)?hq-teens-com-aq\.blogspot\.com
+https?:\/\/([^\/]*\.)?hq-teens-com-w2opp2\.blogspot\.com
+https?:\/\/([^\/]*\.)?hq\.left-page\.com
+https?:\/\/([^\/]*\.)?hqgal-com-eu7gbk1o\.blogspot\.com
+https?:\/\/([^\/]*\.)?hqgal-com-ilxpxi0\.blogspot\.com
+https?:\/\/([^\/]*\.)?hqmovs-com-k31h4x37df\.blogspot\.com
+https?:\/\/([^\/]*\.)?hqmovs-com-tiou81\.blogspot\.com
+https?:\/\/([^\/]*\.)?hqmovs-com-ts5\.blogspot\.com
+https?:\/\/([^\/]*\.)?hrable\.ostabil\.nu
+https?:\/\/([^\/]*\.)?hrhbchj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hromotlk\.asp2\.cz
+https?:\/\/([^\/]*\.)?hrusky\.dtdns\.net
+https?:\/\/([^\/]*\.)?hscrza1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ht120\.com
+https?:\/\/([^\/]*\.)?htejj\.szm\.sk
+https?:\/\/([^\/]*\.)?huaeq\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?huapatossu\.blogspot\.com
+https?:\/\/([^\/]*\.)?huataix\.net
+https?:\/\/([^\/]*\.)?hubo-aileen\.blogspot\.com
+https?:\/\/([^\/]*\.)?huem-polbu\.netfirms\.com
+https?:\/\/([^\/]*\.)?huge-cock-shemale\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?huge-dick-anal\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?huge-dildo-fucking\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?huge-mexican-ass\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?huge-sexy-boob\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?huge-white-dick\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?hulio\.asp2\.cz
+https?:\/\/([^\/]*\.)?hulks\.info
+https?:\/\/([^\/]*\.)?hummerworldusa\.info
+https?:\/\/([^\/]*\.)?hupa4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hurvinek\.isuisse\.com
+https?:\/\/([^\/]*\.)?huspinina\.com
+https?:\/\/([^\/]*\.)?hutwistina\.com
+https?:\/\/([^\/]*\.)?huynani\.mpage\.jp
+https?:\/\/([^\/]*\.)?hvebjr2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hver5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hvlnb\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?hwantiig-yg\.blogspot\.com
+https?:\/\/([^\/]*\.)?hwcw4\.szm\.sk
+https?:\/\/([^\/]*\.)?hwhhw\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?hwkxt\.szm\.sk
+https?:\/\/([^\/]*\.)?hxbqpz3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?hxlll\.net
+https?:\/\/([^\/]*\.)?hydrochloride-tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?hydrocodone-911\.coz\.in
+https?:\/\/([^\/]*\.)?hydrocodone-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?hydrocodone-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?hydrocodone-gs\.net\.tc
+https?:\/\/([^\/]*\.)?hydrocodone-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?hydrocodone\.cheapills\.info
+https?:\/\/([^\/]*\.)?hydrocodone\.conto\.pl
+https?:\/\/([^\/]*\.)?hydrocodone\.esguay\.com
+https?:\/\/([^\/]*\.)?hydrocodone\.fws1\.com
+https?:\/\/([^\/]*\.)?hydrocodone\.guu\.pl
+https?:\/\/([^\/]*\.)?hydrocodone\.presteert\.nl
+https?:\/\/([^\/]*\.)?hydrocodone\.slyip\.net
+https?:\/\/([^\/]*\.)?hydrocodonebxs\.blogspot\.com
+https?:\/\/([^\/]*\.)?hydrocodoneq\.phpbbx\.de
+https?:\/\/([^\/]*\.)?hydrocodonerx\.weboficial\.com
+https?:\/\/([^\/]*\.)?hyip\.fanforum\.cc
+https?:\/\/([^\/]*\.)?hz7\.org
+https?:\/\/([^\/]*\.)?hzkap\.szm\.sk
+https?:\/\/([^\/]*\.)?hzmeitai\.com
+https?:\/\/([^\/]*\.)?hzui8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?i-truepoker\.com
+https?:\/\/([^\/]*\.)?iactive\.com\.cn
+https?:\/\/([^\/]*\.)?iapon\.galeon\.com
+https?:\/\/([^\/]*\.)?ibizababes-com-tr\.blogspot\.com
+https?:\/\/([^\/]*\.)?ic37\.com
+https?:\/\/([^\/]*\.)?icdufetc\.forumzen\.com
+https?:\/\/([^\/]*\.)?ickaboo\.com
+https?:\/\/([^\/]*\.)?icnfr\.szm\.sk
+https?:\/\/([^\/]*\.)?ict\.188info\.com
+https?:\/\/([^\/]*\.)?idahomortgage-x\.com
+https?:\/\/([^\/]*\.)?idc2008\.cn
+https?:\/\/([^\/]*\.)?idealbabes-net-r5x1puaah0\.blogspot\.com
+https?:\/\/([^\/]*\.)?iditarodhumor\.info
+https?:\/\/([^\/]*\.)?iehf\.blogspot\.com
+https?:\/\/([^\/]*\.)?iehffy8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?iehzup8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ifdbx\.szm\.sk
+https?:\/\/([^\/]*\.)?ifmnqm6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ifyj2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ihavenourl\.com
+https?:\/\/([^\/]*\.)?ihomebroker\.com
+https?:\/\/([^\/]*\.)?ihrd\.blogspot\.com
+https?:\/\/([^\/]*\.)?iiak2\.szm\.sk
+https?:\/\/([^\/]*\.)?iio91\.net
+https?:\/\/([^\/]*\.)?iisqvkk\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?iitop\.info
+https?:\/\/([^\/]*\.)?ikoxf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?il4unu\.com
+https?:\/\/([^\/]*\.)?ilflz\.szm\.sk
+https?:\/\/([^\/]*\.)?ilfwvf2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?illcom\.com
+https?:\/\/([^\/]*\.)?illinoismortgage-x\.com
+https?:\/\/([^\/]*\.)?ilove-movies-com-w5nx\.blogspot\.com
+https?:\/\/([^\/]*\.)?ilove-movies-com-wrde\.blogspot\.com
+https?:\/\/([^\/]*\.)?iloveubaby\.info
+https?:\/\/([^\/]*\.)?iltbl\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?im-really-cool\.blogspot\.com
+https?:\/\/([^\/]*\.)?imitrex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?imitrexinjections\.sblog\.cz
+https?:\/\/([^\/]*\.)?immagine-sfondo-hello-kitty\.i111i\.info
+https?:\/\/([^\/]*\.)?imposingimo\.com
+https?:\/\/([^\/]*\.)?impossiblemale61\.blogspot\.com
+https?:\/\/([^\/]*\.)?imteen\.attacke\.ch
+https?:\/\/([^\/]*\.)?incontri-amore\.19mb\.info
+https?:\/\/([^\/]*\.)?incontri-amore\.you-bizz\.info
+https?:\/\/([^\/]*\.)?indian-porn-clip-zone5j4\.blogspot\.com
+https?:\/\/([^\/]*\.)?indian-porn-video-zo\.blogspot\.com
+https?:\/\/([^\/]*\.)?indian-sex-fuck\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?indianamortgage-x\.com
+https?:\/\/([^\/]*\.)?indienudes-com-h4owj60\.blogspot\.com
+https?:\/\/([^\/]*\.)?infinitemonies\.com
+https?:\/\/([^\/]*\.)?infinitieyewear\.info
+https?:\/\/([^\/]*\.)?infinitims\.info
+https?:\/\/([^\/]*\.)?infinitipianeta\.info
+https?:\/\/([^\/]*\.)?infoarena\.info
+https?:\/\/([^\/]*\.)?infospm\.21publish\.de
+https?:\/\/([^\/]*\.)?infty\.net
+https?:\/\/([^\/]*\.)?injecfu\.com
+https?:\/\/([^\/]*\.)?injxx\.szm\.sk
+https?:\/\/([^\/]*\.)?innocent-ass\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?innocent-busty-teen\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?innocent-eve-pic\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?innocentdream-com-da\.blogspot\.com
+https?:\/\/([^\/]*\.)?inqygjz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?inrhqi3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?insidethecloset\.com
+https?:\/\/([^\/]*\.)?inspectorgalleries-com-k5\.blogspot\.com
+https?:\/\/([^\/]*\.)?insurance-leader\.com
+https?:\/\/([^\/]*\.)?insurance-top\.com
+https?:\/\/([^\/]*\.)?insurance\.topforyou\.net
+https?:\/\/([^\/]*\.)?internal-ass-cum-shot\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?international-dating\.sexnation\.info
+https?:\/\/([^\/]*\.)?interracial-gang-bang-crew\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?interracial-gay-anal-sex\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?interracial-lesbian-domination\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?interracial-teen-fucking\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?interracialpicsuux\.blogspot\.com
+https?:\/\/([^\/]*\.)?intersea-fdn\.com
+https?:\/\/([^\/]*\.)?inthevip-com-bc1b0kb0\.blogspot\.com
+https?:\/\/([^\/]*\.)?inthevip-com-bvw\.blogspot\.com
+https?:\/\/([^\/]*\.)?inthevip-com-rso\.blogspot\.com
+https?:\/\/([^\/]*\.)?intll\.com
+https?:\/\/([^\/]*\.)?intra\.som\.umass\.edu
+https?:\/\/([^\/]*\.)?intranet\.education\.umn\.edu
+https?:\/\/([^\/]*\.)?invest1\.org\.ua
+https?:\/\/([^\/]*\.)?ioauaq0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ionamin\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ionizatorit\.info
+https?:\/\/([^\/]*\.)?iowamortgage-x\.com
+https?:\/\/([^\/]*\.)?ipeddle\.com
+https?:\/\/([^\/]*\.)?ipha4\.szm\.sk
+https?:\/\/([^\/]*\.)?ipod-application\.info
+https?:\/\/([^\/]*\.)?ipokea\.com
+https?:\/\/([^\/]*\.)?iqzyk\.szm\.sk
+https?:\/\/([^\/]*\.)?iradorame\.site\.voila\.fr
+https?:\/\/([^\/]*\.)?ircv6\.szm\.sk
+https?:\/\/([^\/]*\.)?irenefah-gijul\.blogspot\.com
+https?:\/\/([^\/]*\.)?irishlover\.info
+https?:\/\/([^\/]*\.)?iron-island\.blogspot\.com
+https?:\/\/([^\/]*\.)?ironing-boards\.haemati\.be
+https?:\/\/([^\/]*\.)?irqs8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?isceby0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?islands-tour\.globaltr\.info
+https?:\/\/([^\/]*\.)?isoway-yoga\.com
+https?:\/\/([^\/]*\.)?ispycameltoe-com-cugh6n\.blogspot\.com
+https?:\/\/([^\/]*\.)?ispycameltoe-com-g4s2f7vevs\.blogspot\.com
+https?:\/\/([^\/]*\.)?italiagame\.org
+https?:\/\/([^\/]*\.)?italianosito\.info
+https?:\/\/([^\/]*\.)?italika\.info
+https?:\/\/([^\/]*\.)?italizzhot\.info
+https?:\/\/([^\/]*\.)?italoman\.info
+https?:\/\/([^\/]*\.)?italytraffic\.info
+https?:\/\/([^\/]*\.)?itchy-skin\.nm\.ru
+https?:\/\/([^\/]*\.)?itchy_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?itcweb\.ecsu\.edu
+https?:\/\/([^\/]*\.)?itdk0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?item4u\.com
+https?:\/\/([^\/]*\.)?itgeecna\.forumzen\.com
+https?:\/\/([^\/]*\.)?itp\.nyu\.edu
+https?:\/\/([^\/]*\.)?itpvewa\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?itsum\.com\.cn
+https?:\/\/([^\/]*\.)?ityh1\.szm\.sk
+https?:\/\/([^\/]*\.)?iugfsvv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?iuzjbpu\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ivana-fuck-a-lot\.hoffer\.ipupdater\.com
+https?:\/\/([^\/]*\.)?ivoyt\.blogspot\.com
+https?:\/\/([^\/]*\.)?ivs\.com\.cn
+https?:\/\/([^\/]*\.)?iwahigux\.info
+https?:\/\/([^\/]*\.)?iwantmature-com-mme\.blogspot\.com
+https?:\/\/([^\/]*\.)?iwuy8\.szm\.sk
+https?:\/\/([^\/]*\.)?ixiixi-com-guy\.blogspot\.com
+https?:\/\/([^\/]*\.)?ixllvdi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ixnl4\.szm\.sk
+https?:\/\/([^\/]*\.)?ixth4\.szm\.sk
+https?:\/\/([^\/]*\.)?izizyu-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?izui7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ja-rule-ringtonezad\.blogspot\.com
+https?:\/\/([^\/]*\.)?jablicko\.yi\.org
+https?:\/\/([^\/]*\.)?jablonec\.republika\.pl
+https?:\/\/([^\/]*\.)?jadelrel\.goodbb\.net
+https?:\/\/([^\/]*\.)?jagast\.com
+https?:\/\/([^\/]*\.)?jahmpf3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jaja-jak-globusy\.com
+https?:\/\/([^\/]*\.)?jajpip5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jamies-galleries-com-dr7itf8c\.blogspot\.com
+https?:\/\/([^\/]*\.)?jamm\.host-page\.com
+https?:\/\/([^\/]*\.)?janelolo\.fr-bb\.com
+https?:\/\/([^\/]*\.)?janet-jackson-boob-picture\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?janisy\.republika\.pl
+https?:\/\/([^\/]*\.)?jantiq\.com
+https?:\/\/([^\/]*\.)?jaoqmw1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?japan-girl-sex\.com
+https?:\/\/([^\/]*\.)?japan-whores-com-e28dwa2vvb\.blogspot\.com
+https?:\/\/([^\/]*\.)?japan-whores-com-elay3rzsu\.blogspot\.com
+https?:\/\/([^\/]*\.)?japanese-geisha-girl\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?japanese-teacher-fuck\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?japanese158\.com
+https?:\/\/([^\/]*\.)?japanshanye\.com
+https?:\/\/([^\/]*\.)?jarella\.goodbb\.net
+https?:\/\/([^\/]*\.)?jasara-com-t6fn6k8\.blogspot\.com
+https?:\/\/([^\/]*\.)?jasara-com-two5\.blogspot\.com
+https?:\/\/([^\/]*\.)?jasara-com-wibeh\.blogspot\.com
+https?:\/\/([^\/]*\.)?jastim\.com
+https?:\/\/([^\/]*\.)?jbixc\.szm\.sk
+https?:\/\/([^\/]*\.)?jblt7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jcbbxb0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jdmz\.com\.cn
+https?:\/\/([^\/]*\.)?jeanniexong\.blogspot\.com
+https?:\/\/([^\/]*\.)?jebmd\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?jed-two-lips-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?jeffrorocks21\.blogspot\.com
+https?:\/\/([^\/]*\.)?jelatko\.republika\.pl
+https?:\/\/([^\/]*\.)?jelito\.stabilt\.se
+https?:\/\/([^\/]*\.)?jennifer-lopez-music-photo\.blogspot\.com
+https?:\/\/([^\/]*\.)?jennifer-lopez-ringtoneqnf\.blogspot\.com
+https?:\/\/([^\/]*\.)?jennysbookmarks-com-kcr\.blogspot\.com
+https?:\/\/([^\/]*\.)?jessica-alba-jly9\.blogspot\.com
+https?:\/\/([^\/]*\.)?jessiethebestie\.blogspot\.com
+https?:\/\/([^\/]*\.)?jesuisleflet\.blogspot\.com
+https?:\/\/([^\/]*\.)?jet-cold-hard-bitch-album-version-lyric\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?jetoo\.cn
+https?:\/\/([^\/]*\.)?jeun\.fr
+https?:\/\/([^\/]*\.)?jewels667\.blogspot\.com
+https?:\/\/([^\/]*\.)?jezgy\.szm\.sk
+https?:\/\/([^\/]*\.)?jfmr\.com
+https?:\/\/([^\/]*\.)?jgeqhqa\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jhrxa\.szm\.sk
+https?:\/\/([^\/]*\.)?jhsy0\.szm\.sk
+https?:\/\/([^\/]*\.)?jiahuajipiao\.com
+https?:\/\/([^\/]*\.)?jiaju88\.com
+https?:\/\/([^\/]*\.)?jianfei\.cc
+https?:\/\/([^\/]*\.)?jianzhi168\.com
+https?:\/\/([^\/]*\.)?jiaza\.szm\.sk
+https?:\/\/([^\/]*\.)?jiboki-free-lesbian-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?jichengdianlu\.dzsc\.com
+https?:\/\/([^\/]*\.)?jidianqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?jieyan\.com\.cn
+https?:\/\/([^\/]*\.)?jiguang\.org
+https?:\/\/([^\/]*\.)?jijijo\.com
+https?:\/\/([^\/]*\.)?jimbo\.php5\.cz
+https?:\/\/([^\/]*\.)?jimmccarthy\.org\.uk
+https?:\/\/([^\/]*\.)?jimmini\.blogspot\.com
+https?:\/\/([^\/]*\.)?jinchengjipiao\.com
+https?:\/\/([^\/]*\.)?jinghuigift\.com
+https?:\/\/([^\/]*\.)?jingzhi-life\.com
+https?:\/\/([^\/]*\.)?jipiao\.51mp4mp3\.com
+https?:\/\/([^\/]*\.)?jipiaoweb\.co
+https?:\/\/([^\/]*\.)?jipiaoweb\.com
+https?:\/\/([^\/]*\.)?jiuwu\.com
+https?:\/\/([^\/]*\.)?jizzhut-com-oq4zf\.blogspot\.com
+https?:\/\/([^\/]*\.)?jizzonline-com-a3h52c1\.blogspot\.com
+https?:\/\/([^\/]*\.)?jizzonline-cz0h5y1nm\.blogspot\.com
+https?:\/\/([^\/]*\.)?jjfchljumf-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?jjuwt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jkpotv-free-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?jlhtj\.szm\.sk
+https?:\/\/([^\/]*\.)?jlibhe9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jmjx7\.szm\.sk
+https?:\/\/([^\/]*\.)?jnbxqy5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jnk713\.ifrance\.com
+https?:\/\/([^\/]*\.)?jnxx3\.szm\.sk
+https?:\/\/([^\/]*\.)?jobecraf\.dl\.pl
+https?:\/\/([^\/]*\.)?jobruler\.com
+https?:\/\/([^\/]*\.)?jocdy\.szm\.sk
+https?:\/\/([^\/]*\.)?jodofiv-free-fat-ass-mo-t\.blogspot\.com
+https?:\/\/([^\/]*\.)?johatch\.ifrance\.com
+https?:\/\/([^\/]*\.)?joia\.com
+https?:\/\/([^\/]*\.)?jointroompia\.com
+https?:\/\/([^\/]*\.)?jokerupot\.blogspot\.com
+https?:\/\/([^\/]*\.)?jon-a-ross\.blogspot\.com
+https?:\/\/([^\/]*\.)?jonn22\.com
+https?:\/\/([^\/]*\.)?jonsmovies-com-b23k3tx4h\.blogspot\.com
+https?:\/\/([^\/]*\.)?joperan\.org
+https?:\/\/([^\/]*\.)?journal\.eepis-its\.edu
+https?:\/\/([^\/]*\.)?joycclx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jozin\.php5\.cz
+https?:\/\/([^\/]*\.)?jp\.zxvo\.com
+https?:\/\/([^\/]*\.)?jpeghunter-com-h6rb6\.blogspot\.com
+https?:\/\/([^\/]*\.)?jpeghunter-com-hsa0g47vew\.blogspot\.com
+https?:\/\/([^\/]*\.)?jpha9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jplm\.cn
+https?:\/\/([^\/]*\.)?jptrip\.org
+https?:\/\/([^\/]*\.)?jqri2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?jrcreations\.com
+https?:\/\/([^\/]*\.)?jrqzje5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jsjgdpg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jsyuanyang\.com
+https?:\/\/([^\/]*\.)?jtdh\.fuwuqituoguan\.com
+https?:\/\/([^\/]*\.)?jtgq3\.szm\.sk
+https?:\/\/([^\/]*\.)?jtoph\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?jtut6\.szm\.sk
+https?:\/\/([^\/]*\.)?ju-alexis\.blogspot\.com
+https?:\/\/([^\/]*\.)?ju-free-porn-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?juanyuancailiao\.dzsc\.com
+https?:\/\/([^\/]*\.)?juggcrew-com-r4xwgs\.blogspot\.com
+https?:\/\/([^\/]*\.)?jugni\.50webs\.org
+https?:\/\/([^\/]*\.)?juicygals-com-c8o\.blogspot\.com
+https?:\/\/([^\/]*\.)?juliatalbot\.50webs\.org
+https?:\/\/([^\/]*\.)?julietsold\.info
+https?:\/\/([^\/]*\.)?jumasd\.com
+https?:\/\/([^\/]*\.)?jumtan\.com
+https?:\/\/([^\/]*\.)?junenanney\.site\.io
+https?:\/\/([^\/]*\.)?junky\.phpbb2\.us
+https?:\/\/([^\/]*\.)?junyuan\.com\.cn
+https?:\/\/([^\/]*\.)?jupka97\.blogspot\.com
+https?:\/\/([^\/]*\.)?juruortr\.jconserv\.net
+https?:\/\/([^\/]*\.)?juse-active\.blogspot\.com
+https?:\/\/([^\/]*\.)?justanotherebel\.blogspot\.com
+https?:\/\/([^\/]*\.)?justkor\.com
+https?:\/\/([^\/]*\.)?juyi6\.szm\.sk
+https?:\/\/([^\/]*\.)?jwfj8\.szm\.sk
+https?:\/\/([^\/]*\.)?jwk\.cn
+https?:\/\/([^\/]*\.)?jxxfl\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?jytpn\.szm\.sk
+https?:\/\/([^\/]*\.)?jzllteva-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?jzoqn\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?k-teens-more\.blogspot\.com
+https?:\/\/([^\/]*\.)?k98you\.info
+https?:\/\/([^\/]*\.)?kabierac\.blogspot\.com
+https?:\/\/([^\/]*\.)?kaejsi\.com
+https?:\/\/([^\/]*\.)?kaiguan\.dzsc\.com
+https?:\/\/([^\/]*\.)?kaimitech\.com
+https?:\/\/([^\/]*\.)?kaizokukitsune\.blogspot\.com
+https?:\/\/([^\/]*\.)?kakaloo\.dtdns\.net
+https?:\/\/([^\/]*\.)?kalbongzig64\.blogspot\.com
+https?:\/\/([^\/]*\.)?kamachair\.info
+https?:\/\/([^\/]*\.)?kansasmortgage-x\.com
+https?:\/\/([^\/]*\.)?kaopowh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kardashian\.6\.forumer\.com
+https?:\/\/([^\/]*\.)?karwee\.com\.tw
+https?:\/\/([^\/]*\.)?katal0g\.ru
+https?:\/\/([^\/]*\.)?kates-playground-cjs61770aq\.blogspot\.com
+https?:\/\/([^\/]*\.)?kates-playground-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?katie-fey-m8inou71nk\.blogspot\.com
+https?:\/\/([^\/]*\.)?katie-fey\.hostithere\.org
+https?:\/\/([^\/]*\.)?katsmovies-com-a4k0cr\.blogspot\.com
+https?:\/\/([^\/]*\.)?kc-generator\.com
+https?:\/\/([^\/]*\.)?kc\.vanderbilt\.edu
+https?:\/\/([^\/]*\.)?kchaiguang\.com
+https?:\/\/([^\/]*\.)?kdmj1\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?kedew-free-porn-movie-c\.blogspot\.com
+https?:\/\/([^\/]*\.)?kedrp\.szm\.sk
+https?:\/\/([^\/]*\.)?keflexbuy\.easy\.to
+https?:\/\/([^\/]*\.)?keflexbuycheap\.everything\.at
+https?:\/\/([^\/]*\.)?keflexcheap\.notrix\.at
+https?:\/\/([^\/]*\.)?keflexcheapgeneric\.drop\.to
+https?:\/\/([^\/]*\.)?keflexgeneric\.firstpage\.de
+https?:\/\/([^\/]*\.)?kelley\.iu\.edu
+https?:\/\/([^\/]*\.)?kellyfind-com-i1\.blogspot\.com
+https?:\/\/([^\/]*\.)?kellyslovespells\.com
+https?:\/\/([^\/]*\.)?kelvinova\.com
+https?:\/\/([^\/]*\.)?kenji-no-sorata\.blogspot\.com
+https?:\/\/([^\/]*\.)?kentuckymortgage-x\.com
+https?:\/\/([^\/]*\.)?kenwoodexcelon\.com
+https?:\/\/([^\/]*\.)?keps\.info
+https?:\/\/([^\/]*\.)?kesdirect\.com
+https?:\/\/([^\/]*\.)?keshome\.com
+https?:\/\/([^\/]*\.)?kewl-links\.com
+https?:\/\/([^\/]*\.)?keysplus\.com
+https?:\/\/([^\/]*\.)?keyword\.net\.cn
+https?:\/\/([^\/]*\.)?kfwd7\.szm\.sk
+https?:\/\/([^\/]*\.)?kgbsearch\.org
+https?:\/\/([^\/]*\.)?khawkslaxfan51\.blogspot\.com
+https?:\/\/([^\/]*\.)?khlnbo3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ki-westly\.blogspot\.com
+https?:\/\/([^\/]*\.)?kiboric\.net
+https?:\/\/([^\/]*\.)?kicfmaudio\.com
+https?:\/\/([^\/]*\.)?kicklikegirls\.info
+https?:\/\/([^\/]*\.)?kijub-free-porn-video-v\.blogspot\.com
+https?:\/\/([^\/]*\.)?kingdom\.webmelia\.com
+https?:\/\/([^\/]*\.)?kingofpics-com-beib6jsm5d\.blogspot\.com
+https?:\/\/([^\/]*\.)?kingofpics-com-c8f1bag\.blogspot\.com
+https?:\/\/([^\/]*\.)?kipredinstitute\.org
+https?:\/\/([^\/]*\.)?kiqi-airplane\.blogspot\.com
+https?:\/\/([^\/]*\.)?kirsten-dunst-boob-slip\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?kiska2\.com
+https?:\/\/([^\/]*\.)?kissing-foot\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?kissing-her-ass\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?kitchen-apron\.keckins\.be
+https?:\/\/([^\/]*\.)?kitchenrebuilding\.com
+https?:\/\/([^\/]*\.)?kiudcb0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kjbz0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kjor4\.szm\.sk
+https?:\/\/([^\/]*\.)?kkkpd\.szm\.sk
+https?:\/\/([^\/]*\.)?kkvalve\.com\.cn
+https?:\/\/([^\/]*\.)?klacim\.yi\.org
+https?:\/\/([^\/]*\.)?klasik111\.php5\.cz
+https?:\/\/([^\/]*\.)?kleinerachel\.blogspot\.com
+https?:\/\/([^\/]*\.)?klohy\.info
+https?:\/\/([^\/]*\.)?kmxab\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?knkbact\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?knzfpca\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ko-paris-hilton-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?koberec\.com
+https?:\/\/([^\/]*\.)?koled-porn-video-z\.blogspot\.com
+https?:\/\/([^\/]*\.)?kom4um\.com
+https?:\/\/([^\/]*\.)?koncatina\.dtdns\.net
+https?:\/\/([^\/]*\.)?konstantine01\.blogspot\.com
+https?:\/\/([^\/]*\.)?kordirect\.com
+https?:\/\/([^\/]*\.)?kos123\.dtdns\.net
+https?:\/\/([^\/]*\.)?kostya\.cabspace\.com
+https?:\/\/([^\/]*\.)?kpdsvd9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kpqf2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kpzq6\.szm\.sk
+https?:\/\/([^\/]*\.)?krakatoa\.slyip\.com
+https?:\/\/([^\/]*\.)?krakon\.republika\.pl
+https?:\/\/([^\/]*\.)?krasnota\.flnet\.org
+https?:\/\/([^\/]*\.)?krbd2\.szm\.sk
+https?:\/\/([^\/]*\.)?kreco\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ksbj5\.szm\.sk
+https?:\/\/([^\/]*\.)?ksiegagosci\.info
+https?:\/\/([^\/]*\.)?ktbug1373\.blogspot\.com
+https?:\/\/([^\/]*\.)?ktrv2\.szm\.sk
+https?:\/\/([^\/]*\.)?ku-whatnot\.blogspot\.com
+https?:\/\/([^\/]*\.)?kucitok\.forumculture\.net
+https?:\/\/([^\/]*\.)?kulhain\.blogspot\.com
+https?:\/\/([^\/]*\.)?kunshalawyer\.com
+https?:\/\/([^\/]*\.)?kvehuj8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kvywc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kwscx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kwvi\.com
+https?:\/\/([^\/]*\.)?kybel\.fetftp\.nu
+https?:\/\/([^\/]*\.)?kybele\.psych\.cornell\.edu
+https?:\/\/([^\/]*\.)?kyjcz\.sunp\.com
+https?:\/\/([^\/]*\.)?kymnruw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?kymyn\.info
+https?:\/\/([^\/]*\.)?l-paris-hilton-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?l\.0s48\.info
+https?:\/\/([^\/]*\.)?l1ttleblacky\.blogspot\.com
+https?:\/\/([^\/]*\.)?la-ringtones\.com
+https?:\/\/([^\/]*\.)?laaceler\.blogcu\.com
+https?:\/\/([^\/]*\.)?labelprinter\.printer\.net\.cn
+https?:\/\/([^\/]*\.)?labladar\.forumzen\.com
+https?:\/\/([^\/]*\.)?lacchi\.lolforum\.net
+https?:\/\/([^\/]*\.)?laconia4\.info
+https?:\/\/([^\/]*\.)?ladylike\.hostcroc\.com
+https?:\/\/([^\/]*\.)?lake-baikal\.info
+https?:\/\/([^\/]*\.)?laked\.info
+https?:\/\/([^\/]*\.)?lalisit\.heavenforum\.com
+https?:\/\/([^\/]*\.)?lalisit\.highforum\.net
+https?:\/\/([^\/]*\.)?lamalinks-com-ceefq\.blogspot\.com
+https?:\/\/([^\/]*\.)?lamisilbuy\.drive\.to
+https?:\/\/([^\/]*\.)?lamisilbuygeneric\.dive\.to
+https?:\/\/([^\/]*\.)?lamisilcheap\.drink\.to
+https?:\/\/([^\/]*\.)?lamisilgeneric\.drop\.to
+https?:\/\/([^\/]*\.)?lamisilgenericcheap\.dive\.to
+https?:\/\/([^\/]*\.)?lanasbigboobs-com-mxm7\.blogspot\.com
+https?:\/\/([^\/]*\.)?lanasbigboobs-com-repif\.blogspot\.com
+https?:\/\/([^\/]*\.)?laorer\.ephpbb\.com
+https?:\/\/([^\/]*\.)?lapelcna\.forumzen\.com
+https?:\/\/([^\/]*\.)?lapoer\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?large-lingerie-naughty-woman\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?las-vegas-gay-night-club\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?las-vegas-house\.nm\.ru
+https?:\/\/([^\/]*\.)?laser-drilled-diamonds\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?laser-wave\.com
+https?:\/\/([^\/]*\.)?laskai\.com
+https?:\/\/([^\/]*\.)?lasmercedessite\.info
+https?:\/\/([^\/]*\.)?lassie\.webmelia\.com
+https?:\/\/([^\/]*\.)?last-minute-travel\.ebem\.info
+https?:\/\/([^\/]*\.)?latex-ass\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?latex-dress\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?latex-foam-mattress-toppers\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?latex-mistress\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?latex-sluts\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?latex-swim-wear\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?latin\.hostaim\.com
+https?:\/\/([^\/]*\.)?latina-porn-clip-blog11q\.blogspot\.com
+https?:\/\/([^\/]*\.)?latina-porn-clip-blogden\.blogspot\.com
+https?:\/\/([^\/]*\.)?latinata\.galeon\.com
+https?:\/\/([^\/]*\.)?latoarril\.myrealboard\.com
+https?:\/\/([^\/]*\.)?laus-rmore\.blogspot\.com
+https?:\/\/([^\/]*\.)?lavemi\.com
+https?:\/\/([^\/]*\.)?lavender-dove\.blogspot\.com
+https?:\/\/([^\/]*\.)?lavor0\.info
+https?:\/\/([^\/]*\.)?law-school\.hotmail\.ru
+https?:\/\/([^\/]*\.)?law1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?law2school\.chat\.ru
+https?:\/\/([^\/]*\.)?lawrencegillies\.blogspot\.com
+https?:\/\/([^\/]*\.)?lawyer\.ebloggy\.com
+https?:\/\/([^\/]*\.)?laynamarya\.blogspot\.com
+https?:\/\/([^\/]*\.)?laythekatcom\.pupava\.dtdns\.net
+https?:\/\/([^\/]*\.)?lbgetm9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lbrnrme\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lczjunf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ldrdf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?le-alma\.blogspot\.com
+https?:\/\/([^\/]*\.)?le-big-free-movie-porn-cek\.blogspot\.com
+https?:\/\/([^\/]*\.)?leadora\.blogspot\.com
+https?:\/\/([^\/]*\.)?leannrae85\.blogspot\.com
+https?:\/\/([^\/]*\.)?lebu-adidas\.blogspot\.com
+https?:\/\/([^\/]*\.)?ledego\.com
+https?:\/\/([^\/]*\.)?ledgiest\.xhostar\.com
+https?:\/\/([^\/]*\.)?ledkrx\.com
+https?:\/\/([^\/]*\.)?ledled\.nease\.net
+https?:\/\/([^\/]*\.)?leebuc\.forumzen\.com
+https?:\/\/([^\/]*\.)?leeticarus\.blogspot\.com
+https?:\/\/([^\/]*\.)?leetvilt\.jconserv\.net
+https?:\/\/([^\/]*\.)?left-leg-numbness\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?leg-exercise\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?leg-in-stocking\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?leg-in-tan-pantie-hose\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?leg-neurontin-restless-syndrome\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?leg-preteen-spread\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?leg-shaved-spread\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?leisure-suit-larry-magna-cum-laude-nudity-patch\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?leisure-suit-larry-magna-cum-laude-uncut-and-uncensored\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?leo-the-bastet\.site\.voila\.fr
+https?:\/\/([^\/]*\.)?leopard-lady\.blogspot\.com
+https?:\/\/([^\/]*\.)?leroyhotel\.com
+https?:\/\/([^\/]*\.)?lesbian-anal-porn\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?lesbian-fisting-dvd\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lesbian-fucking-eachother\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?lesbian-girl-scout\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?lesbian-group-masturbation\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lesbian-oral-sex\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?lesbian-personals-ads\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?lesbian-personals-yahoo\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?lesbian-porn-clip-blog6e5\.blogspot\.com
+https?:\/\/([^\/]*\.)?lesbian-sex-teen\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?lesbian-sharing-dildo\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lesbian-tit-bondage\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lesbian-web-chat-and-cam\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?lesbians\.coz\.in
+https?:\/\/([^\/]*\.)?letoacel-or\.xa\.pl
+https?:\/\/([^\/]*\.)?letobocpas\.frbb\.net
+https?:\/\/([^\/]*\.)?letocvi\.goodbb\.net
+https?:\/\/([^\/]*\.)?letomon\.graphforum\.com
+https?:\/\/([^\/]*\.)?letorelpas\.xa\.pl
+https?:\/\/([^\/]*\.)?lettera-di-presentazione\.zoom4x\.info
+https?:\/\/([^\/]*\.)?lettersof-love\.blogspot\.com
+https?:\/\/([^\/]*\.)?levitra\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?levitra\.rx4\.org
+https?:\/\/([^\/]*\.)?levitra\.seesaa\.net
+https?:\/\/([^\/]*\.)?levitra\.skocz\.net
+https?:\/\/([^\/]*\.)?levitraejv\.blogspot\.com
+https?:\/\/([^\/]*\.)?levitras\.eu\.tf
+https?:\/\/([^\/]*\.)?levitraxpb\.blogspot\.com
+https?:\/\/([^\/]*\.)?lex-interracial\.hoffer\.ipupdater\.com
+https?:\/\/([^\/]*\.)?lexapro\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?lexaprobuyonline\.buzznet\.com
+https?:\/\/([^\/]*\.)?lexpov-com\.cornut\.ipupdater\.com
+https?:\/\/([^\/]*\.)?leyeager\.ifrance\.com
+https?:\/\/([^\/]*\.)?lezbomovies-com-dp3256w4cb\.blogspot\.com
+https?:\/\/([^\/]*\.)?lezbomovies-com-duvuv\.blogspot\.com
+https?:\/\/([^\/]*\.)?lezbomovies-com-dw7q2s6l\.blogspot\.com
+https?:\/\/([^\/]*\.)?lf-pm\.com
+https?:\/\/([^\/]*\.)?lfamas\.com
+https?:\/\/([^\/]*\.)?lhbtx\.szm\.sk
+https?:\/\/([^\/]*\.)?lhnzkp9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?li-adult-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?li6or6olo\.dl\.pl
+https?:\/\/([^\/]*\.)?lianjieqi\.dzsc\.com
+https?:\/\/([^\/]*\.)?liaozhi\.org
+https?:\/\/([^\/]*\.)?libasac\.ephpbb\.com
+https?:\/\/([^\/]*\.)?libertyliga\.com
+https?:\/\/([^\/]*\.)?library\.cshl\.edu
+https?:\/\/([^\/]*\.)?libraryofthumbs-com-oyz1qboq\.blogspot\.com
+https?:\/\/([^\/]*\.)?licecile\.dl\.pl
+https?:\/\/([^\/]*\.)?licnarol\.dl\.pl
+https?:\/\/([^\/]*\.)?lidaror\.blogcu\.com
+https?:\/\/([^\/]*\.)?lidiarac\.forumzen\.com
+https?:\/\/([^\/]*\.)?lidomca\.graphforum\.com
+https?:\/\/([^\/]*\.)?lidomca\.highforum\.net
+https?:\/\/([^\/]*\.)?lidompas\.td\.pl
+https?:\/\/([^\/]*\.)?lidomta\.frbb\.net
+https?:\/\/([^\/]*\.)?lidupett\.forumzen\.com
+https?:\/\/([^\/]*\.)?lifeinsurance-x\.com
+https?:\/\/([^\/]*\.)?lifewave\.com
+https?:\/\/([^\/]*\.)?ligettr\.dl\.pl
+https?:\/\/([^\/]*\.)?light365\.com
+https?:\/\/([^\/]*\.)?lightspeed-state\.hostithere\.org
+https?:\/\/([^\/]*\.)?lihach\.com
+https?:\/\/([^\/]*\.)?lijoho-video-porn-gratis\.blogspot\.com
+https?:\/\/([^\/]*\.)?likozrut\.stabilt\.se
+https?:\/\/([^\/]*\.)?lilaleemcrightrealty\.com
+https?:\/\/([^\/]*\.)?lilaliko\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?lile\.asp2\.cz
+https?:\/\/([^\/]*\.)?lilett\.blogspot\.com
+https?:\/\/([^\/]*\.)?lilhaq\.blogspot\.com
+https?:\/\/([^\/]*\.)?lilo-n\.blogspot\.com
+https?:\/\/([^\/]*\.)?lilotu\.com
+https?:\/\/([^\/]*\.)?linarcbo\.forumzen\.com
+https?:\/\/([^\/]*\.)?lincweb\.cacs\.louisiana\.edu
+https?:\/\/([^\/]*\.)?lindsaylife\.com
+https?:\/\/([^\/]*\.)?lineance-facial-hair-removal-cream\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?linefreeinternet\.info
+https?:\/\/([^\/]*\.)?linemd\.com
+https?:\/\/([^\/]*\.)?lingerie-babes-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?lingerie-girl-pic\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lingerie-guide\.org
+https?:\/\/([^\/]*\.)?lingerie-sex-photo\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?lingerie-videos-com-wcu8\.blogspot\.com
+https?:\/\/([^\/]*\.)?lingshengdown\.com
+https?:\/\/([^\/]*\.)?lingua-francese\.host24h\.info
+https?:\/\/([^\/]*\.)?link-o-rama-com-t5xhd\.blogspot\.com
+https?:\/\/([^\/]*\.)?link-o-rama-com-toz5x8i2ez\.blogspot\.com
+https?:\/\/([^\/]*\.)?linserch\.com
+https?:\/\/([^\/]*\.)?lioral\.dl\.pl
+https?:\/\/([^\/]*\.)?lioumon\.lolforum\.net
+https?:\/\/([^\/]*\.)?lipitor\.skocz\.net
+https?:\/\/([^\/]*\.)?lipstick-love\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?lipstick-mac\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?lipus\.org
+https?:\/\/([^\/]*\.)?lirolbo\.goodforum\.net
+https?:\/\/([^\/]*\.)?lirolbo\.grafbb\.com
+https?:\/\/([^\/]*\.)?lisinopril\.no-ip\.info
+https?:\/\/([^\/]*\.)?list\.eng\.utah\.edu
+https?:\/\/([^\/]*\.)?listinna772\.galeon\.com
+https?:\/\/([^\/]*\.)?listpharm\.com
+https?:\/\/([^\/]*\.)?lists\.gatech\.edu
+https?:\/\/([^\/]*\.)?litaacel\.lolforum\.net
+https?:\/\/([^\/]*\.)?litadal\.myrealboard\.com
+https?:\/\/([^\/]*\.)?litayj0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?literotica-com-t3yx\.blogspot\.com
+https?:\/\/([^\/]*\.)?literotica-com-tkncy\.blogspot\.com
+https?:\/\/([^\/]*\.)?litrget\.jc\.pl
+https?:\/\/([^\/]*\.)?little-april-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?little-april-masturbating-movie\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?little-dicks-bay\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?little-teen-fuck\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?littledevildoubt\.com
+https?:\/\/([^\/]*\.)?littlesunshine\.50webs\.org
+https?:\/\/([^\/]*\.)?litumdet\.forumzen\.com
+https?:\/\/([^\/]*\.)?liupy\.110mb\.com
+https?:\/\/([^\/]*\.)?live-gay-video-chat\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?live-jasmine-cams\.com
+https?:\/\/([^\/]*\.)?livejasmin-com-abc\.blogspot\.com
+https?:\/\/([^\/]*\.)?livejasmin-com-abz\.blogspot\.com
+https?:\/\/([^\/]*\.)?livejasmin-com-aky\.blogspot\.com
+https?:\/\/([^\/]*\.)?livejasmin-com-qujef\.blogspot\.com
+https?:\/\/([^\/]*\.)?livescore\.esguay\.com
+https?:\/\/([^\/]*\.)?livescore\.ven\.bz
+https?:\/\/([^\/]*\.)?livesupportpal\.com
+https?:\/\/([^\/]*\.)?liviral\.myrealboard\.com
+https?:\/\/([^\/]*\.)?lixin642\.com
+https?:\/\/([^\/]*\.)?liymcc0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lizardofoz\.com
+https?:\/\/([^\/]*\.)?lizas\.asp2\.cz
+https?:\/\/([^\/]*\.)?lizscottrawson\.com
+https?:\/\/([^\/]*\.)?lkrzfkg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ll-four-sterto\.blogspot\.com
+https?:\/\/([^\/]*\.)?llillith\.blogspot\.com
+https?:\/\/([^\/]*\.)?lll1l\.info
+https?:\/\/([^\/]*\.)?llline\.info
+https?:\/\/([^\/]*\.)?llpcoil\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?llsky\.net
+https?:\/\/([^\/]*\.)?lm4nmu\.com
+https?:\/\/([^\/]*\.)?lmyzm\.szm\.sk
+https?:\/\/([^\/]*\.)?lnalpas\.myrealboard\.com
+https?:\/\/([^\/]*\.)?lnki9\.szm\.sk
+https?:\/\/([^\/]*\.)?lnqfa\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?lnqixlz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?loan-unsecuredcxp\.blogspot\.com
+https?:\/\/([^\/]*\.)?loans-insurance\.net
+https?:\/\/([^\/]*\.)?lodge\.webmelia\.com
+https?:\/\/([^\/]*\.)?lodita-com-dya6s22zu\.blogspot\.com
+https?:\/\/([^\/]*\.)?lodita-com-dz\.blogspot\.com
+https?:\/\/([^\/]*\.)?loestrin\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?logast\.com
+https?:\/\/([^\/]*\.)?logowap\.com
+https?:\/\/([^\/]*\.)?lojlo\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lojunbas\.forumzen\.com
+https?:\/\/([^\/]*\.)?lola-providence\.blogspot\.com
+https?:\/\/([^\/]*\.)?lolabear1121\.blogspot\.com
+https?:\/\/([^\/]*\.)?lolaparris\.freetzi\.com
+https?:\/\/([^\/]*\.)?loliti-com-c5m8mt\.blogspot\.com
+https?:\/\/([^\/]*\.)?lolovi\.naturalforum\.net
+https?:\/\/([^\/]*\.)?lomsts\.com
+https?:\/\/([^\/]*\.)?londra-ristorante\.freehostss\.info
+https?:\/\/([^\/]*\.)?lonely-wolf-com-rjqlm1d6\.blogspot\.com
+https?:\/\/([^\/]*\.)?long-porn-clip-info67s\.blogspot\.com
+https?:\/\/([^\/]*\.)?long-porn-clip-infosm4\.blogspot\.com
+https?:\/\/([^\/]*\.)?longestlist-com-b6\.blogspot\.com
+https?:\/\/([^\/]*\.)?longestlist-com-b683g4ik\.blogspot\.com
+https?:\/\/([^\/]*\.)?longestlist-hb\.blogspot\.com
+https?:\/\/([^\/]*\.)?longestlist-hohen\.blogspot\.com
+https?:\/\/([^\/]*\.)?longonline\.net
+https?:\/\/([^\/]*\.)?longvideos-net-gq78qyba\.blogspot\.com
+https?:\/\/([^\/]*\.)?longxiong\.ebloggy\.com
+https?:\/\/([^\/]*\.)?lony\.info
+https?:\/\/([^\/]*\.)?look-at-his-dick\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lookcity\.com
+https?:\/\/([^\/]*\.)?lopata\.snusk\.nu
+https?:\/\/([^\/]*\.)?lopressorhct\.sblog\.cz
+https?:\/\/([^\/]*\.)?lorazepams\.ru\.tf
+https?:\/\/([^\/]*\.)?lortab-911\.coz\.in
+https?:\/\/([^\/]*\.)?lortab\.xwiki\.com
+https?:\/\/([^\/]*\.)?losangelestickets\.org
+https?:\/\/([^\/]*\.)?lotausch\.ifrance\.com
+https?:\/\/([^\/]*\.)?loudmp3\.net
+https?:\/\/([^\/]*\.)?louisianamortgage-x\.com
+https?:\/\/([^\/]*\.)?lovefuckk-com-eg7gx\.blogspot\.com
+https?:\/\/([^\/]*\.)?lovefuckk-com-et2x2g1sk\.blogspot\.com
+https?:\/\/([^\/]*\.)?lovefuckk-com-setos\.blogspot\.com
+https?:\/\/([^\/]*\.)?lovegirlsonline\.info
+https?:\/\/([^\/]*\.)?lovejuliet3\.blogspot\.com
+https?:\/\/([^\/]*\.)?lovetgp-com-d74h1ed3o\.blogspot\.com
+https?:\/\/([^\/]*\.)?lowbudgetsuccess\.info
+https?:\/\/([^\/]*\.)?lqsbjau\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lrff5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lriwaq-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?lrlep\.szm\.sk
+https?:\/\/([^\/]*\.)?ltfl5\.szm\.sk
+https?:\/\/([^\/]*\.)?ltntp\.szm\.sk
+https?:\/\/([^\/]*\.)?lu-porn-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?lucking\.com\.cn
+https?:\/\/([^\/]*\.)?lucqt\.szm\.sk
+https?:\/\/([^\/]*\.)?luridess\.125mb\.com
+https?:\/\/([^\/]*\.)?lusi-ada\.blogspot\.com
+https?:\/\/([^\/]*\.)?lustjob\.info
+https?:\/\/([^\/]*\.)?lustwork\.info
+https?:\/\/([^\/]*\.)?lusvqm-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?lutaltli\.naturalforum\.net
+https?:\/\/([^\/]*\.)?lutrilar\.naturalforum\.net
+https?:\/\/([^\/]*\.)?lutzalvi\.naturalforum\.net
+https?:\/\/([^\/]*\.)?lvanrts\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lvsi\.ebloggy\.com
+https?:\/\/([^\/]*\.)?lwdf2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lwkmewp\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lycosss\.com
+https?:\/\/([^\/]*\.)?lyganbaili\.com
+https?:\/\/([^\/]*\.)?lyhbs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?lying-facial-expression\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?lyndawyllie\.com
+https?:\/\/([^\/]*\.)?lzouv\.szm\.sk
+https?:\/\/([^\/]*\.)?m-i-a-s-m-a\.blogspot\.com
+https?:\/\/([^\/]*\.)?m-sr\.net
+https?:\/\/([^\/]*\.)?m-teens-000\.blogspot\.com
+https?:\/\/([^\/]*\.)?m\.domaindlx\.com
+https?:\/\/([^\/]*\.)?m2mvc\.com
+https?:\/\/([^\/]*\.)?machi-neko\.blogspot\.com
+https?:\/\/([^\/]*\.)?mackenzie-kayne\.hostingtree\.org
+https?:\/\/([^\/]*\.)?macromob\.com
+https?:\/\/([^\/]*\.)?madesukadana\.com
+https?:\/\/([^\/]*\.)?madthumbs-com-hcq1m1\.blogspot\.com
+https?:\/\/([^\/]*\.)?mafy69\.blogspot\.com
+https?:\/\/([^\/]*\.)?magical-casino\.com
+https?:\/\/([^\/]*\.)?magneticwoman88\.blogspot\.com
+https?:\/\/([^\/]*\.)?maidenpeace\.com
+https?:\/\/([^\/]*\.)?main\.g2\.bx\.psu\.edu
+https?:\/\/([^\/]*\.)?mainemortgage-x\.com
+https?:\/\/([^\/]*\.)?maitybaba\.blogspot\.com
+https?:\/\/([^\/]*\.)?makaky\.dtdns\.net
+https?:\/\/([^\/]*\.)?makblxn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?make-my-dick-hard\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?makemoneyfast\.us
+https?:\/\/([^\/]*\.)?makeup\.ifreehosts\.net
+https?:\/\/([^\/]*\.)?male-hairy-leg\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?malinka\.b0b\.org
+https?:\/\/([^\/]*\.)?mama-rachelbeth\.blogspot\.com
+https?:\/\/([^\/]*\.)?mamaswarm\.sultryserver\.com
+https?:\/\/([^\/]*\.)?man-caught-wearing-womens-lingerie\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?man-ring\.boom\.ru
+https?:\/\/([^\/]*\.)?man-rings\.boom\.ru
+https?:\/\/([^\/]*\.)?man-skin\.nightmail\.ru
+https?:\/\/([^\/]*\.)?man-skin\.nm\.ru
+https?:\/\/([^\/]*\.)?man-woman-fucking-video-clip\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?man_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?managementproperty\.us
+https?:\/\/([^\/]*\.)?manka-kapak\.blogspot\.com
+https?:\/\/([^\/]*\.)?manoke\.cn
+https?:\/\/([^\/]*\.)?map4um\.com
+https?:\/\/([^\/]*\.)?mapas6\.com
+https?:\/\/([^\/]*\.)?maradona\.stabilt\.se
+https?:\/\/([^\/]*\.)?marhula\.weedns\.com
+https?:\/\/([^\/]*\.)?marinol\.xwiki\.com
+https?:\/\/([^\/]*\.)?mario-lopez-gayfgg\.blogspot\.com
+https?:\/\/([^\/]*\.)?marketing1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?marklar\.republika\.pl
+https?:\/\/([^\/]*\.)?marti-adp\.iespana\.es
+https?:\/\/([^\/]*\.)?marucollet\.jp
+https?:\/\/([^\/]*\.)?maryannec\.com
+https?:\/\/([^\/]*\.)?marylandmortgage-x\.com
+https?:\/\/([^\/]*\.)?masfac\.com
+https?:\/\/([^\/]*\.)?masiki\.110mb\.com
+https?:\/\/([^\/]*\.)?masiti\.com
+https?:\/\/([^\/]*\.)?massachusetts-hs\.newmail\.ru
+https?:\/\/([^\/]*\.)?massachusettsmortgage-x\.com
+https?:\/\/([^\/]*\.)?mast3t\.com
+https?:\/\/([^\/]*\.)?master-z-great\.blogspot\.com
+https?:\/\/([^\/]*\.)?master1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?master2005degree\.chat\.ru
+https?:\/\/([^\/]*\.)?masterboat\.ru
+https?:\/\/([^\/]*\.)?mastun\.com
+https?:\/\/([^\/]*\.)?masturbating-shemale-video\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?masturbation-techniques1\.notlong\.com
+https?:\/\/([^\/]*\.)?masvit\.com
+https?:\/\/([^\/]*\.)?matching-mom-and-baby-outfit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?matrac\.loopback\.nu
+https?:\/\/([^\/]*\.)?mattsvids-com-aqjt\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-bitches-com-ccvi3l\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-black-female\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?mature-blonde-fuck\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?mature-blonde-movie\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?mature-blonde-toying\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?mature-british-granny\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?mature-clip\.babubi\.net
+https?:\/\/([^\/]*\.)?mature-for-you-com-mt66\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-gang-bang\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature-gay-black\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature-gay-man-gallery\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?mature-man-photo\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?mature-man-picture\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?mature-milf-milfmuffin-com\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature-nl-kss7\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-pantie-upskirt\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature-pic-post\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?mature-porn-clip-newsj8c\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-porn-clip-zone5s0\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-porn-movie-sihu\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-porn-video-ku\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-post-com-iecsmld78\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-redhead\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?mature-secret-com-r6t85u5\.blogspot\.com
+https?:\/\/([^\/]*\.)?mature-sex-orgy\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?mature-sex-thumb\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature-throat-fuck\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?mature-wife-in-pantie-hose\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?mature-woman-vs-young\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?mature\.coz\.in
+https?:\/\/([^\/]*\.)?matureandyoung-com-bgf1\.blogspot\.com
+https?:\/\/([^\/]*\.)?maturedaily-net-oipq5\.blogspot\.com
+https?:\/\/([^\/]*\.)?maturedaily-net-oywdf7pj0\.blogspot\.com
+https?:\/\/([^\/]*\.)?maturehit-com-w8\.blogspot\.com
+https?:\/\/([^\/]*\.)?maturehit-com-zifid\.blogspot\.com
+https?:\/\/([^\/]*\.)?maximumsearch\.net
+https?:\/\/([^\/]*\.)?maybachexelero\.org
+https?:\/\/([^\/]*\.)?mayphyoe\.blogspot\.com
+https?:\/\/([^\/]*\.)?maypopmusic\.cn
+https?:\/\/([^\/]*\.)?mazda-6\.keckins\.be
+https?:\/\/([^\/]*\.)?mazdamaindealer\.cn
+https?:\/\/([^\/]*\.)?mazecreatorhosting\.net
+https?:\/\/([^\/]*\.)?mba1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?mbiu1\.szm\.sk
+https?:\/\/([^\/]*\.)?mbkxs\.szm\.sk
+https?:\/\/([^\/]*\.)?mbsz0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mcfontai\.dl\.pl
+https?:\/\/([^\/]*\.)?mciicvn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mckeithl\.ifrance\.com
+https?:\/\/([^\/]*\.)?mcynwst\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mdfo2\.szm\.sk
+https?:\/\/([^\/]*\.)?mdna8\.szm\.sk
+https?:\/\/([^\/]*\.)?mdoq5\.szm\.sk
+https?:\/\/([^\/]*\.)?meadelante\.blogspot\.com
+https?:\/\/([^\/]*\.)?med-ph\.com
+https?:\/\/([^\/]*\.)?medbig\.com
+https?:\/\/([^\/]*\.)?medgarsting\.info
+https?:\/\/([^\/]*\.)?medhls\.com
+https?:\/\/([^\/]*\.)?medic\.kilu\.de
+https?:\/\/([^\/]*\.)?medication-cheap\.com
+https?:\/\/([^\/]*\.)?meds-today\.com
+https?:\/\/([^\/]*\.)?megadyneinc\.com
+https?:\/\/([^\/]*\.)?megan-qt-cjg\.blogspot\.com
+https?:\/\/([^\/]*\.)?megaupkoad\.com
+https?:\/\/([^\/]*\.)?meindies\.com
+https?:\/\/([^\/]*\.)?melatrol\.podstavec\.yi\.org
+https?:\/\/([^\/]*\.)?melissa-doll\.cornut\.ipupdater\.com
+https?:\/\/([^\/]*\.)?melsner\.blogspot\.com
+https?:\/\/([^\/]*\.)?mens\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?menshealth\.110mb\.com
+https?:\/\/([^\/]*\.)?meoqwzr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?meridasexo\.com
+https?:\/\/([^\/]*\.)?meridia\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?meridia\.edu\.tf
+https?:\/\/([^\/]*\.)?meridia\.hav\.pl
+https?:\/\/([^\/]*\.)?meridia\.skocz\.net
+https?:\/\/([^\/]*\.)?meridiager\.queroumforum\.com
+https?:\/\/([^\/]*\.)?meryland\.dtdns\.net
+https?:\/\/([^\/]*\.)?mesothelioma-lawyer-help\.org
+https?:\/\/([^\/]*\.)?meweb\.ecn\.purdue\.edu
+https?:\/\/([^\/]*\.)?mewqsd\.org
+https?:\/\/([^\/]*\.)?mgnzupi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mi-kkiechang\.ifrance\.com
+https?:\/\/([^\/]*\.)?mia-movies-com-g2g1\.blogspot\.com
+https?:\/\/([^\/]*\.)?mia-movies-e86q7ic4y7\.blogspot\.com
+https?:\/\/([^\/]*\.)?miami-cose-fare\.hostzz\.info
+https?:\/\/([^\/]*\.)?michelepug\.org
+https?:\/\/([^\/]*\.)?michiganmortgage-x\.com
+https?:\/\/([^\/]*\.)?midaslubbock\.com
+https?:\/\/([^\/]*\.)?midnis\.com
+https?:\/\/([^\/]*\.)?migree\.com
+https?:\/\/([^\/]*\.)?mihaso\.com
+https?:\/\/([^\/]*\.)?mikeinbrazil-com-k1s8higm1o\.blogspot\.com
+https?:\/\/([^\/]*\.)?mikeinbrazil-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?mikesapartment-com-iwb02e1v\.blogspot\.com
+https?:\/\/([^\/]*\.)?mikesapartment-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?mikewsd\.org
+https?:\/\/([^\/]*\.)?miks1\.szm\.sk
+https?:\/\/([^\/]*\.)?miku-thu-vilu\.110mb\.com
+https?:\/\/([^\/]*\.)?mildew\.789mb\.com
+https?:\/\/([^\/]*\.)?milf-blow-job-gallery\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?milf-busty-fucking\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?milf-hunter-kate\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?milf-mature-big-tit\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?milf-tgp-wife\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?milfhunter-com-h2a7q51\.blogspot\.com
+https?:\/\/([^\/]*\.)?milflessons-com-bh6\.blogspot\.com
+https?:\/\/([^\/]*\.)?milfnextdoor-bk23v2p4\.blogspot\.com
+https?:\/\/([^\/]*\.)?milfnextdoor-w3ii\.blogspot\.com
+https?:\/\/([^\/]*\.)?milkmanbook-com-o7\.blogspot\.com
+https?:\/\/([^\/]*\.)?milkmanbook-com-rrup5f\.blogspot\.com
+https?:\/\/([^\/]*\.)?milkmanbook-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?milkmanbook-ods016\.blogspot\.com
+https?:\/\/([^\/]*\.)?milton-twins-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?mimija\.com
+https?:\/\/([^\/]*\.)?miniurl\.pl
+https?:\/\/([^\/]*\.)?minnesotamortgage-x\.com
+https?:\/\/([^\/]*\.)?minzec\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?missensign\.blogspot\.com
+https?:\/\/([^\/]*\.)?mississippimortgage-x\.com
+https?:\/\/([^\/]*\.)?missourimortgage-x\.com
+https?:\/\/([^\/]*\.)?mitsubishicarhire\.cn
+https?:\/\/([^\/]*\.)?mj-net\.jp
+https?:\/\/([^\/]*\.)?mj\.left-page\.com
+https?:\/\/([^\/]*\.)?mjlvan4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mjqnxn1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mjspb\.szm\.sk
+https?:\/\/([^\/]*\.)?mkia3\.szm\.sk
+https?:\/\/([^\/]*\.)?mkiss47346\.blogspot\.com
+https?:\/\/([^\/]*\.)?mksahf-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?mkzvni8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mlgta\.szm\.sk
+https?:\/\/([^\/]*\.)?mlm-business-leader\.com
+https?:\/\/([^\/]*\.)?mlvej\.szm\.sk
+https?:\/\/([^\/]*\.)?mmm100-com-aj\.blogspot\.com
+https?:\/\/([^\/]*\.)?mmm100-com-cisec\.blogspot\.com
+https?:\/\/([^\/]*\.)?mmm100-com-tql1xojt\.blogspot\.com
+https?:\/\/([^\/]*\.)?mnsp\.cn
+https?:\/\/([^\/]*\.)?mobfiller\.com
+https?:\/\/([^\/]*\.)?mobic\.sytes\.net
+https?:\/\/([^\/]*\.)?mobile-phone-dealoft\.blogspot\.com
+https?:\/\/([^\/]*\.)?mobile-phone-shopmgl\.blogspot\.com
+https?:\/\/([^\/]*\.)?mobile-phonegsn\.blogspot\.com
+https?:\/\/([^\/]*\.)?mobilefamilydental\.com
+https?:\/\/([^\/]*\.)?mobilewallpaperkre\.blogspot\.com
+https?:\/\/([^\/]*\.)?mobility-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?mobility2scooter\.chat\.ru
+https?:\/\/([^\/]*\.)?mobprofile\.com
+https?:\/\/([^\/]*\.)?modelsgroup-com-wrx\.blogspot\.com
+https?:\/\/([^\/]*\.)?modelsgroup-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?modlang\.boisestate\.edu
+https?:\/\/([^\/]*\.)?moju\.net\.cn
+https?:\/\/([^\/]*\.)?mol-ch\.com
+https?:\/\/([^\/]*\.)?mom-and-son-song\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?mom-music-video\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?mom-n-son\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?mom-vs-young\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?mommia-com-h32\.blogspot\.com
+https?:\/\/([^\/]*\.)?mommia-com-hvr6wy\.blogspot\.com
+https?:\/\/([^\/]*\.)?mommia-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?moms-teaching-teens-ceb\.blogspot\.com
+https?:\/\/([^\/]*\.)?monbocchi\.zikforum\.com
+https?:\/\/([^\/]*\.)?moncnamon\.ephpbb\.com
+https?:\/\/([^\/]*\.)?moncnamon\.forumculture\.net
+https?:\/\/([^\/]*\.)?monctr\.cultureforum\.net
+https?:\/\/([^\/]*\.)?mondelacel\.dl\.pl
+https?:\/\/([^\/]*\.)?monelal\.discutfree\.com
+https?:\/\/([^\/]*\.)?moneta-algeria\.hostzz\.info
+https?:\/\/([^\/]*\.)?monjco\.blogcu\.com
+https?:\/\/([^\/]*\.)?monletochi\.bbgraf\.com
+https?:\/\/([^\/]*\.)?monokal\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?monorget\.lolbb\.com
+https?:\/\/([^\/]*\.)?monpasrel\.dl\.pl
+https?:\/\/([^\/]*\.)?monster-cock-movie-big\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?monstersofcock-com-rvdurm2\.blogspot\.com
+https?:\/\/([^\/]*\.)?montana-flugsport\.com
+https?:\/\/([^\/]*\.)?montanamortgage-x\.com
+https?:\/\/([^\/]*\.)?montessori-spielzeug\.com
+https?:\/\/([^\/]*\.)?moody-immortal2\.blogspot\.com
+https?:\/\/([^\/]*\.)?morekes\.com
+https?:\/\/([^\/]*\.)?moremoms-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?moremoms-rj8f2r\.blogspot\.com
+https?:\/\/([^\/]*\.)?mortgage-911\.net
+https?:\/\/([^\/]*\.)?mortgagebrokers-x\.com
+https?:\/\/([^\/]*\.)?mortgagecompanies-x\.com
+https?:\/\/([^\/]*\.)?mortgagelenders-x\.com
+https?:\/\/([^\/]*\.)?mortgageloan-x\.com
+https?:\/\/([^\/]*\.)?mortgageloans-x\.com
+https?:\/\/([^\/]*\.)?mortgagerates-x\.com
+https?:\/\/([^\/]*\.)?mortgagerefinance-x\.com
+https?:\/\/([^\/]*\.)?mortgagerefinancing-x\.com
+https?:\/\/([^\/]*\.)?mortgages-411\.com
+https?:\/\/([^\/]*\.)?mortgagesnrefinance\.com
+https?:\/\/([^\/]*\.)?mosquito-ringtoneaee\.blogspot\.com
+https?:\/\/([^\/]*\.)?mosquitoringtonewmf\.blogspot\.com
+https?:\/\/([^\/]*\.)?mothershope\.com
+https?:\/\/([^\/]*\.)?mothrinventor\.blogspot\.com
+https?:\/\/([^\/]*\.)?motnolado\.org
+https?:\/\/([^\/]*\.)?motor-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?motorized-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?motorizedscooter\.chat\.ru
+https?:\/\/([^\/]*\.)?motorolaringtonesfreeucq\.blogspot\.com
+https?:\/\/([^\/]*\.)?motorolaringtoneskvp\.blogspot\.com
+https?:\/\/([^\/]*\.)?motorolaringtonesym\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviegalleries-com-gl8\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviepost-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviepost-h4s2iin\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviesarena-com-r42rng0\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviesarena-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviesgold-com-ig86ukjw\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviesgold-com-k0\.blogspot\.com
+https?:\/\/([^\/]*\.)?movieshark-d0vdon27\.blogspot\.com
+https?:\/\/([^\/]*\.)?moviesparade-com-a3hxnn6\.blogspot\.com
+https?:\/\/([^\/]*\.)?movietitan-com-i6shde\.blogspot\.com
+https?:\/\/([^\/]*\.)?movietitan-o6i14o0\.blogspot\.com
+https?:\/\/([^\/]*\.)?mozzarell\.republika\.pl
+https?:\/\/([^\/]*\.)?mp3ringtonerxw\.blogspot\.com
+https?:\/\/([^\/]*\.)?mp3sunrise\.com
+https?:\/\/([^\/]*\.)?mpdtbq8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mpeghunter-com-cyc0bec7k\.blogspot\.com
+https?:\/\/([^\/]*\.)?mqirai4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mrako4\.com
+https?:\/\/([^\/]*\.)?mrchewsasianbeaver-bwhmc0sk\.blogspot\.com
+https?:\/\/([^\/]*\.)?mrchewsasianbeaver-com-omazvpr\.blogspot\.com
+https?:\/\/([^\/]*\.)?mrntf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mrs-vette-hot-mom\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?mrwolfy49\.blogspot\.com
+https?:\/\/([^\/]*\.)?ms-dos-boot-disk\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?mster6\.com
+https?:\/\/([^\/]*\.)?mtaa5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mthelen\.250free\.com
+https?:\/\/([^\/]*\.)?muecst9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mughalbank\.com
+https?:\/\/([^\/]*\.)?mumms\.info
+https?:\/\/([^\/]*\.)?murdersoul\.blogspot\.com
+https?:\/\/([^\/]*\.)?murku-gunush\.110mb\.com
+https?:\/\/([^\/]*\.)?mus1ca\.info
+https?:\/\/([^\/]*\.)?muscle-pain-leg-cause\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?muscle-relaxers\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?music\.spacepur\.de
+https?:\/\/([^\/]*\.)?musicguild\.bc\.edu
+https?:\/\/([^\/]*\.)?mutantalias\.blogspot\.com
+https?:\/\/([^\/]*\.)?muwn9\.szm\.sk
+https?:\/\/([^\/]*\.)?muzyr\.szm\.sk
+https?:\/\/([^\/]*\.)?mvoht\.szm\.sk
+https?:\/\/([^\/]*\.)?mvsyonh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mwqbg\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?mwwkps6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mxmva\.szm\.sk
+https?:\/\/([^\/]*\.)?mxqwnn2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?my-cashadvance\.com
+https?:\/\/([^\/]*\.)?my-first-sex-teacherlbp\.blogspot\.com
+https?:\/\/([^\/]*\.)?my-friends-hot-mom-free-pic\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?my-friends-hot-mom-lesbian\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?my-friends-hot-mom-mrs-lee\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?my-host-space\.com
+https?:\/\/([^\/]*\.)?my-land\.bravehost\.com
+https?:\/\/([^\/]*\.)?my-mortgagerates\.com
+https?:\/\/([^\/]*\.)?my-summit\.com
+https?:\/\/([^\/]*\.)?my-teensex-wikes\.blogspot\.com
+https?:\/\/([^\/]*\.)?myfgj\.info
+https?:\/\/([^\/]*\.)?myhost\.gb\.com
+https?:\/\/([^\/]*\.)?mymitsubishiparts\.cn
+https?:\/\/([^\/]*\.)?mymr\.net
+https?:\/\/([^\/]*\.)?mynet-poker\.com
+https?:\/\/([^\/]*\.)?myprintworks\.com
+https?:\/\/([^\/]*\.)?myrotunda\.com
+https?:\/\/([^\/]*\.)?mysecretmovies-com-tul73\.blogspot\.com
+https?:\/\/([^\/]*\.)?myseo\.com\.cn
+https?:\/\/([^\/]*\.)?myshcompany\.com
+https?:\/\/([^\/]*\.)?mysmetrix\.asp2\.cz
+https?:\/\/([^\/]*\.)?myspace-myspace-my\.blogspot\.com
+https?:\/\/([^\/]*\.)?myteepo-3\.blogspot\.com
+https?:\/\/([^\/]*\.)?myts\.vip\.sina\.com
+https?:\/\/([^\/]*\.)?mywaybackwhen\.blogspot\.com
+https?:\/\/([^\/]*\.)?mzaxl\.szm\.sk
+https?:\/\/([^\/]*\.)?mzayxt2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mzlurz8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?mzwbifn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?n-free-porn-video-sample\.blogspot\.com
+https?:\/\/([^\/]*\.)?n-free-video-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?na-hummer\.jot\.com
+https?:\/\/([^\/]*\.)?naacpncnetwork\.org
+https?:\/\/([^\/]*\.)?naarttrl\.forumzen\.com
+https?:\/\/([^\/]*\.)?naffpqh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?naomiserge\.info
+https?:\/\/([^\/]*\.)?napalerd\.forumzen\.com
+https?:\/\/([^\/]*\.)?napas5\.com
+https?:\/\/([^\/]*\.)?naprosyn500mg\.sblog\.cz
+https?:\/\/([^\/]*\.)?naproxen\.zapto\.org
+https?:\/\/([^\/]*\.)?naqowp1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nariclet\.forumzen\.com
+https?:\/\/([^\/]*\.)?nas7fk\.com
+https?:\/\/([^\/]*\.)?nasacort\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?nasonex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?nastyalien-com-dk0wnd58i\.blogspot\.com
+https?:\/\/([^\/]*\.)?nastyalien-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?nastyrat-b7\.blogspot\.com
+https?:\/\/([^\/]*\.)?nastyrat-com-b8mu31h87m\.blogspot\.com
+https?:\/\/([^\/]*\.)?nastyrat-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?natskam\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?natural-skin\.nm\.ru
+https?:\/\/([^\/]*\.)?natural-tit-cum\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?natural_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?naughty-com-wdk\.blogspot\.com
+https?:\/\/([^\/]*\.)?naughty-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?navse\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nbay2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nbikkpb\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nbmhvbv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nbxc3\.szm\.sk
+https?:\/\/([^\/]*\.)?nchqqi4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ncpx5\.szm\.sk
+https?:\/\/([^\/]*\.)?ncwash\.com
+https?:\/\/([^\/]*\.)?nd-tli\.com
+https?:\/\/([^\/]*\.)?ndarj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ndnwrby\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nebraskamortgage-x\.com
+https?:\/\/([^\/]*\.)?nedneutr\.goodbb\.net
+https?:\/\/([^\/]*\.)?nedpbi3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?need-site\.com
+https?:\/\/([^\/]*\.)?nefariouswraith\.blogspot\.com
+https?:\/\/([^\/]*\.)?negozio-strumento-musicale\.19mb\.info
+https?:\/\/([^\/]*\.)?nejqssk\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?neko-adg\.blogspot\.com
+https?:\/\/([^\/]*\.)?nekoo\.cn
+https?:\/\/([^\/]*\.)?nekostar3\.blogspot\.com
+https?:\/\/([^\/]*\.)?nelaidla\.ifrance\.com
+https?:\/\/([^\/]*\.)?nelcala\.fr-bb\.com
+https?:\/\/([^\/]*\.)?nelior\.goodbb\.net
+https?:\/\/([^\/]*\.)?neri-albany\.blogspot\.com
+https?:\/\/([^\/]*\.)?neroj\.szm\.sk
+https?:\/\/([^\/]*\.)?nerve\.zyns\.com
+https?:\/\/([^\/]*\.)?net0551\.com
+https?:\/\/([^\/]*\.)?netbank\.cn
+https?:\/\/([^\/]*\.)?nethams\.pp\.ru
+https?:\/\/([^\/]*\.)?netinternetbanking\.info
+https?:\/\/([^\/]*\.)?netteak\.pp\.ru
+https?:\/\/([^\/]*\.)?nettyre\.pp\.ru
+https?:\/\/([^\/]*\.)?neux9\.szm\.sk
+https?:\/\/([^\/]*\.)?nevadamortgage-x\.com
+https?:\/\/([^\/]*\.)?nevados-hiking-boot\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?nevulo-teen-sex-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?new-ringtonesou\.blogspot\.com
+https?:\/\/([^\/]*\.)?new-watches\.fasthost\.tv
+https?:\/\/([^\/]*\.)?newae\.info
+https?:\/\/([^\/]*\.)?newaf\.info
+https?:\/\/([^\/]*\.)?newah\.info
+https?:\/\/([^\/]*\.)?newai\.info
+https?:\/\/([^\/]*\.)?newaq\.info
+https?:\/\/([^\/]*\.)?newar\.info
+https?:\/\/([^\/]*\.)?newau\.info
+https?:\/\/([^\/]*\.)?newbabyface\.net
+https?:\/\/([^\/]*\.)?newboyu\.com
+https?:\/\/([^\/]*\.)?newdietpills\.bravehost\.com
+https?:\/\/([^\/]*\.)?newgals-com-ean\.blogspot\.com
+https?:\/\/([^\/]*\.)?newhampshiremortgage-x\.com
+https?:\/\/([^\/]*\.)?newjerseymortgage-x\.com
+https?:\/\/([^\/]*\.)?newmexicomortgage-x\.com
+https?:\/\/([^\/]*\.)?newnewsonline\.info
+https?:\/\/([^\/]*\.)?newob\.info
+https?:\/\/([^\/]*\.)?newoc\.info
+https?:\/\/([^\/]*\.)?newom\.info
+https?:\/\/([^\/]*\.)?newov\.info
+https?:\/\/([^\/]*\.)?newox\.info
+https?:\/\/([^\/]*\.)?newoz\.info
+https?:\/\/([^\/]*\.)?news\.101freehost\.com
+https?:\/\/([^\/]*\.)?news\.engin\.brown\.edu
+https?:\/\/([^\/]*\.)?newwesthonda\.info
+https?:\/\/([^\/]*\.)?newworldmen\.com
+https?:\/\/([^\/]*\.)?newyorkmortgage-x\.com
+https?:\/\/([^\/]*\.)?nexium\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?nexiumbuy\.on\.to
+https?:\/\/([^\/]*\.)?nexiumbuygeneric\.snap\.to
+https?:\/\/([^\/]*\.)?nexiumcheap\.notrix\.ch
+https?:\/\/([^\/]*\.)?nexiumcheapbuy\.notrix\.de
+https?:\/\/([^\/]*\.)?nexiumgeneric\.dive\.to
+https?:\/\/([^\/]*\.)?nexxx-com-r138wgeob5\.blogspot\.com
+https?:\/\/([^\/]*\.)?nexxx-kc113s775\.blogspot\.com
+https?:\/\/([^\/]*\.)?nfbwx\.szm\.sk
+https?:\/\/([^\/]*\.)?nffnj\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nfl-cheerleader-outfit\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?nfme8\.szm\.sk
+https?:\/\/([^\/]*\.)?nfpg4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nfyxtime\.com
+https?:\/\/([^\/]*\.)?nggleb0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nginju3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nhqkyun\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nibko\.info
+https?:\/\/([^\/]*\.)?nice-asian-ass-and-sex\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?nice-boob-picture\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?niche-porn-sites\.org
+https?:\/\/([^\/]*\.)?nickdarula\.com
+https?:\/\/([^\/]*\.)?nicwan\.com
+https?:\/\/([^\/]*\.)?nidarim\.com
+https?:\/\/([^\/]*\.)?niebn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nifedipine-solubility\.tlg\.pl
+https?:\/\/([^\/]*\.)?nifjv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?niharpe\.dl\.pl
+https?:\/\/([^\/]*\.)?nihosi\.com
+https?:\/\/([^\/]*\.)?nika-ru\.blogspot\.com
+https?:\/\/([^\/]*\.)?nikkie-cole\.blogspot\.com
+https?:\/\/([^\/]*\.)?nimast\.com
+https?:\/\/([^\/]*\.)?nimit-zood\.ibelgique\.com
+https?:\/\/([^\/]*\.)?ninenailteen\.blogspot\.com
+https?:\/\/([^\/]*\.)?ninjasidestep\.com
+https?:\/\/([^\/]*\.)?ninostarto\.blogspot\.com
+https?:\/\/([^\/]*\.)?ninuni\.com
+https?:\/\/([^\/]*\.)?nipples-puffy-teenage\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?nipverify\.icspace\.net
+https?:\/\/([^\/]*\.)?nissan-240sx\.newmail\.ru
+https?:\/\/([^\/]*\.)?nissan-dealer\.newmail\.ru
+https?:\/\/([^\/]*\.)?nissan-frontier\.nm\.ru
+https?:\/\/([^\/]*\.)?nissan-motor\.nm\.ru
+https?:\/\/([^\/]*\.)?nissan-murano\.newmail\.ru
+https?:\/\/([^\/]*\.)?nissan-part\.nightmail\.ru
+https?:\/\/([^\/]*\.)?nissan-pathfinder\.hotmail\.ru
+https?:\/\/([^\/]*\.)?nissan-sentra\.hotmail\.ru
+https?:\/\/([^\/]*\.)?nissan-titan\.hotmail\.ru
+https?:\/\/([^\/]*\.)?nissan-truck\.hotmail\.ru
+https?:\/\/([^\/]*\.)?nissan-xterra\.hotmail\.ru
+https?:\/\/([^\/]*\.)?nissan_240sx\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_dealer\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_frontier\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_motor\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_murano1\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_part\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_pathfind\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_sentra\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_titan\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_truck\.chat\.ru
+https?:\/\/([^\/]*\.)?nissan_xterra\.chat\.ru
+https?:\/\/([^\/]*\.)?nixve\.blogspot\.com
+https?:\/\/([^\/]*\.)?njfc\.nease\.net
+https?:\/\/([^\/]*\.)?njhk\.jiuwu\.com
+https?:\/\/([^\/]*\.)?njhk\.yushantang\.com
+https?:\/\/([^\/]*\.)?njuta78\.125mb\.com
+https?:\/\/([^\/]*\.)?njzthvq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nkkqq\.szm\.sk
+https?:\/\/([^\/]*\.)?nkxow\.szm\.sk
+https?:\/\/([^\/]*\.)?nkzzm\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nlexc\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nmagiietending\.blogspot\.com
+https?:\/\/([^\/]*\.)?nmwj5\.szm\.sk
+https?:\/\/([^\/]*\.)?nnline\.info
+https?:\/\/([^\/]*\.)?no-deposit-casino-bonus\.any\.pl
+https?:\/\/([^\/]*\.)?no-faxing-payday--loan\.blogspot\.com
+https?:\/\/([^\/]*\.)?no-free-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?no1babes-com-juquj\.blogspot\.com
+https?:\/\/([^\/]*\.)?noalzel\.blogcu\.com
+https?:\/\/([^\/]*\.)?nobocli\.bbfr\.net
+https?:\/\/([^\/]*\.)?nobullhardcore-com-i7mpf5i83t\.blogspot\.com
+https?:\/\/([^\/]*\.)?nodb0\.szm\.sk
+https?:\/\/([^\/]*\.)?noelchi\.td\.pl
+https?:\/\/([^\/]*\.)?noeldar\.td\.pl
+https?:\/\/([^\/]*\.)?nofatonline\.com
+https?:\/\/([^\/]*\.)?nolamon\.naturalforum\.net
+https?:\/\/([^\/]*\.)?noletoolo\.dl\.pl
+https?:\/\/([^\/]*\.)?nomote4\.blogspot\.com
+https?:\/\/([^\/]*\.)?nopasrol\.myrealboard\.com
+https?:\/\/([^\/]*\.)?nord9maedchen73\.blogspot\.com
+https?:\/\/([^\/]*\.)?nordette\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?norflex100mg\.sblog\.cz
+https?:\/\/([^\/]*\.)?normanburke\.blogspot\.com
+https?:\/\/([^\/]*\.)?noro-alanis\.blogspot\.com
+https?:\/\/([^\/]*\.)?northcarolinamortgage-x\.com
+https?:\/\/([^\/]*\.)?northdakotamortgage-x\.com
+https?:\/\/([^\/]*\.)?norvasc\.coz\.in
+https?:\/\/([^\/]*\.)?norwichwriters\.org
+https?:\/\/([^\/]*\.)?noscudom\.forumzen\.com
+https?:\/\/([^\/]*\.)?noseypets\.com
+https?:\/\/([^\/]*\.)?nostawnevets53\.blogspot\.com
+https?:\/\/([^\/]*\.)?not-another-teen-movie-ddw5x\.blogspot\.com
+https?:\/\/([^\/]*\.)?notelymphatic\.org
+https?:\/\/([^\/]*\.)?notereport\.info
+https?:\/\/([^\/]*\.)?notrocli\.zj\.pl
+https?:\/\/([^\/]*\.)?novanasa\.php5\.cz
+https?:\/\/([^\/]*\.)?novar\.darkbb\.com
+https?:\/\/([^\/]*\.)?noviac\.jc\.pl
+https?:\/\/([^\/]*\.)?nox-teeniefiles-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?npchwp9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nqfahsc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nqkt4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nqllo\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nqlp7\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nqod6\.szm\.sk
+https?:\/\/([^\/]*\.)?nqquc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nqyz6\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?nsstc\.uah\.edu
+https?:\/\/([^\/]*\.)?nsxslk5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nthfind\.com
+https?:\/\/([^\/]*\.)?nu-alicia\.blogspot\.com
+https?:\/\/([^\/]*\.)?nucs2\.szm\.sk
+https?:\/\/([^\/]*\.)?nuddxy-free-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?nude-ass-video\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?nude-lingerie-model-photo\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?nude-little-ass\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?nude-teacher\.com
+https?:\/\/([^\/]*\.)?nudecelebritypictures-c6ob080\.blogspot\.com
+https?:\/\/([^\/]*\.)?nudecelebritypictures-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?nudecelebritypictures-nu-hqb65kdn\.blogspot\.com
+https?:\/\/([^\/]*\.)?nudestarz-com-xurig\.blogspot\.com
+https?:\/\/([^\/]*\.)?nudistlog-com-oygsrji75\.blogspot\.com
+https?:\/\/([^\/]*\.)?nugo-aerobics\.blogspot\.com
+https?:\/\/([^\/]*\.)?nuje9\.szm\.sk
+https?:\/\/([^\/]*\.)?numbness-in-right-leg\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?numimb\.com
+https?:\/\/([^\/]*\.)?numr2\.szm\.sk
+https?:\/\/([^\/]*\.)?nunikal\.stabilt\.se
+https?:\/\/([^\/]*\.)?nuqfz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nurglesnymphs-com-nuxow\.blogspot\.com
+https?:\/\/([^\/]*\.)?nurs-employment\.boom\.ru
+https?:\/\/([^\/]*\.)?nurs2employment\.chat\.ru
+https?:\/\/([^\/]*\.)?nurse-fucking-video\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?nursi2-education\.boom\.ru
+https?:\/\/([^\/]*\.)?nursin-education\.boom\.ru
+https?:\/\/([^\/]*\.)?nursin2education\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing-career\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-college\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-degree\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-degree\.fromru\.com
+https?:\/\/([^\/]*\.)?nursing-degree\.pochta\.ru
+https?:\/\/([^\/]*\.)?nursing-home\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-home\.land\.ru
+https?:\/\/([^\/]*\.)?nursing-home\.pochta\.ru
+https?:\/\/([^\/]*\.)?nursing-job\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-job\.land\.ru
+https?:\/\/([^\/]*\.)?nursing-job\.pochta\.ru
+https?:\/\/([^\/]*\.)?nursing-school\.fromru\.com
+https?:\/\/([^\/]*\.)?nursing-school\.pochta\.ru
+https?:\/\/([^\/]*\.)?nursing-scrubs\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing-uniform\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing2-school\.boom\.ru
+https?:\/\/([^\/]*\.)?nursing2college\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing2school\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing2scrubs\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing4career\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing4degree\.chat\.ru
+https?:\/\/([^\/]*\.)?nursing4job\.chat\.ru
+https?:\/\/([^\/]*\.)?nursingeducation\.chat\.ru
+https?:\/\/([^\/]*\.)?nutramigen-lipil\.leg4is\.be
+https?:\/\/([^\/]*\.)?nvdwc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nwxnv\.szm\.sk
+https?:\/\/([^\/]*\.)?nxbbyhc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nxnmwlh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?nxsq0\.szm\.sk
+https?:\/\/([^\/]*\.)?o-medic\.tripod\.com
+https?:\/\/([^\/]*\.)?o8\.aus\.cc
+https?:\/\/([^\/]*\.)?oa18\.cc
+https?:\/\/([^\/]*\.)?oa2010\.com
+https?:\/\/([^\/]*\.)?oalink\.cn
+https?:\/\/([^\/]*\.)?obesity-check\.com
+https?:\/\/([^\/]*\.)?obosra\.com
+https?:\/\/([^\/]*\.)?obrazok\.dtdns\.net
+https?:\/\/([^\/]*\.)?obsque\.cn
+https?:\/\/([^\/]*\.)?ocapk\.szm\.sk
+https?:\/\/([^\/]*\.)?oceshdes\.forumzen\.com
+https?:\/\/([^\/]*\.)?ockulpas\.forumzen\.com
+https?:\/\/([^\/]*\.)?ocleelia\.forumzen\.com
+https?:\/\/([^\/]*\.)?ocscrtro\.forumzen\.com
+https?:\/\/([^\/]*\.)?oczt4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?odfxci8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?odmi1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?odqw4\.szm\.sk
+https?:\/\/([^\/]*\.)?oechnxln\.tripod\.com
+https?:\/\/([^\/]*\.)?oecx6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?oeqls\.szm\.sk
+https?:\/\/([^\/]*\.)?offerta-volo-madrid\.19mb\.info
+https?:\/\/([^\/]*\.)?officialkes\.com
+https?:\/\/([^\/]*\.)?ogooch\.ifrance\.com
+https?:\/\/([^\/]*\.)?ogzx4\.szm\.sk
+https?:\/\/([^\/]*\.)?ohgood-com-dv8l\.blogspot\.com
+https?:\/\/([^\/]*\.)?ohgood-com-isxvi72\.blogspot\.com
+https?:\/\/([^\/]*\.)?ohgood-com-rv0\.blogspot\.com
+https?:\/\/([^\/]*\.)?ohiomortgage-x\.com
+https?:\/\/([^\/]*\.)?ohmybaby\.net
+https?:\/\/([^\/]*\.)?oilpaintingkingdom\.com
+https?:\/\/([^\/]*\.)?oily-skin\.newmail\.ru
+https?:\/\/([^\/]*\.)?oily_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?oip\.org\.ua
+https?:\/\/([^\/]*\.)?oirwt\.szm\.sk
+https?:\/\/([^\/]*\.)?ojdo0\.szm\.sk
+https?:\/\/([^\/]*\.)?ojdx7\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?okayhotels\.com
+https?:\/\/([^\/]*\.)?okcompany\.org
+https?:\/\/([^\/]*\.)?oklahomamortgage-x\.com
+https?:\/\/([^\/]*\.)?okrentcar\.org
+https?:\/\/([^\/]*\.)?old-lady-fuck\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?old-lady-suck-dick\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?old69-com-mdt71k\.blogspot\.com
+https?:\/\/([^\/]*\.)?old69-k40bqc\.blogspot\.com
+https?:\/\/([^\/]*\.)?older-mature-tgp\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?oldon\.info
+https?:\/\/([^\/]*\.)?oldp9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?oldreboc\.forumzen\.com
+https?:\/\/([^\/]*\.)?olijanko\.republika\.pl
+https?:\/\/([^\/]*\.)?olml2\.szm\.sk
+https?:\/\/([^\/]*\.)?olnnt\.szm\.sk
+https?:\/\/([^\/]*\.)?olocnamon\.cultureforum\.net
+https?:\/\/([^\/]*\.)?olocobo\.goodforum\.net
+https?:\/\/([^\/]*\.)?olocobo\.grafbb\.com
+https?:\/\/([^\/]*\.)?olodarelt\.heavenforum\.com
+https?:\/\/([^\/]*\.)?olodarelt\.highforum\.net
+https?:\/\/([^\/]*\.)?olodronric\.su\.pl
+https?:\/\/([^\/]*\.)?olodronro\.blogcu\.com
+https?:\/\/([^\/]*\.)?oloolovi\.ephpbb\.com
+https?:\/\/([^\/]*\.)?oloorrac\.blogcu\.com
+https?:\/\/([^\/]*\.)?olorelrel\.blogcu\.com
+https?:\/\/([^\/]*\.)?olorodom\.blogcu\.com
+https?:\/\/([^\/]*\.)?oltcha\.blogspot\.com
+https?:\/\/([^\/]*\.)?olyelzet\.forumzen\.com
+https?:\/\/([^\/]*\.)?omchades\.forumzen\.com
+https?:\/\/([^\/]*\.)?omega\.spb\.ru
+https?:\/\/([^\/]*\.)?omxmlvf\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?on-poteen-1-2\.blogspot\.com
+https?:\/\/([^\/]*\.)?onac2\.szm\.sk
+https?:\/\/([^\/]*\.)?one2you\.biz
+https?:\/\/([^\/]*\.)?one2you\.info
+https?:\/\/([^\/]*\.)?onfew\.szm\.sk
+https?:\/\/([^\/]*\.)?onlin-nurs-degre\.boom\.ru
+https?:\/\/([^\/]*\.)?online-blackjack-site\.com
+https?:\/\/([^\/]*\.)?online-casino-l\.blogspot\.com
+https?:\/\/([^\/]*\.)?online-casino-wiki\.com
+https?:\/\/([^\/]*\.)?online-casinos-city\.com
+https?:\/\/([^\/]*\.)?online-casinos-discovered\.com
+https?:\/\/([^\/]*\.)?online-degree-4you\.com
+https?:\/\/([^\/]*\.)?online-gambling-b\.blogspot\.com
+https?:\/\/([^\/]*\.)?online-games24x7\.com
+https?:\/\/([^\/]*\.)?online-medications24x7\.com
+https?:\/\/([^\/]*\.)?online-pharm\.zmail\.ru
+https?:\/\/([^\/]*\.)?online-pharmacy-24x7\.net
+https?:\/\/([^\/]*\.)?online-pharmacy-4u\.net
+https?:\/\/([^\/]*\.)?online-poker-game\.blogspot\.com
+https?:\/\/([^\/]*\.)?online-poker-online-poker\.net
+https?:\/\/([^\/]*\.)?online-poker\.black-poker\.com
+https?:\/\/([^\/]*\.)?online-poker\.dd\.vg
+https?:\/\/([^\/]*\.)?online-prozac\.boom\.ru
+https?:\/\/([^\/]*\.)?online-shop-24x7\.com
+https?:\/\/([^\/]*\.)?online-tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?online1-degree\.boom\.ru
+https?:\/\/([^\/]*\.)?online1course\.chat\.ru
+https?:\/\/([^\/]*\.)?online1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?online3course\.chat\.ru
+https?:\/\/([^\/]*\.)?online4nursing\.chat\.ru
+https?:\/\/([^\/]*\.)?onlineglass\.siteburg\.com
+https?:\/\/([^\/]*\.)?onlinepharmacy-4u\.net
+https?:\/\/([^\/]*\.)?onlinepharmacy2004\.net
+https?:\/\/([^\/]*\.)?onlinesexcity\.info
+https?:\/\/([^\/]*\.)?only-ringtone\.com
+https?:\/\/([^\/]*\.)?only4game\.com
+https?:\/\/([^\/]*\.)?onlycuties-com\.jalovica\.dtdns\.net
+https?:\/\/([^\/]*\.)?onlymovies-com-e1tez\.blogspot\.com
+https?:\/\/([^\/]*\.)?onlymovies-com-eczm1w\.blogspot\.com
+https?:\/\/([^\/]*\.)?onlyteenstgp-com-rmn\.blogspot\.com
+https?:\/\/([^\/]*\.)?onlyteenstgp-com-rrcamwws3\.blogspot\.com
+https?:\/\/([^\/]*\.)?onlyteenstgp-we\.blogspot\.com
+https?:\/\/([^\/]*\.)?onmycrew\.blogspot\.com
+https?:\/\/([^\/]*\.)?onrueetd\.forumzen\.com
+https?:\/\/([^\/]*\.)?oogqj\.szm\.sk
+https?:\/\/([^\/]*\.)?oohsexy-com-hob8e5y8r\.blogspot\.com
+https?:\/\/([^\/]*\.)?oohsexy-com-hpemrnff\.blogspot\.com
+https?:\/\/([^\/]*\.)?oohsexy\.com
+https?:\/\/([^\/]*\.)?oohsexy000\.blogspot\.com
+https?:\/\/([^\/]*\.)?ooline\.info
+https?:\/\/([^\/]*\.)?oolive\.info
+https?:\/\/([^\/]*\.)?oonk1\.szm\.sk
+https?:\/\/([^\/]*\.)?ooooi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ootop\.info
+https?:\/\/([^\/]*\.)?ooyy2\.szm\.sk
+https?:\/\/([^\/]*\.)?opastr\.com
+https?:\/\/([^\/]*\.)?oping\.info
+https?:\/\/([^\/]*\.)?opiytr\.com
+https?:\/\/([^\/]*\.)?opkr1\.szm\.sk
+https?:\/\/([^\/]*\.)?optbblx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?optfzj5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?opyfsen\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?oqaknky\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?oqfwt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?or-drondron\.xa\.pl
+https?:\/\/([^\/]*\.)?orabc\.info
+https?:\/\/([^\/]*\.)?oracelta\.lolforum\.net
+https?:\/\/([^\/]*\.)?orasta\.com
+https?:\/\/([^\/]*\.)?orbasolo\.dl\.pl
+https?:\/\/([^\/]*\.)?orcnaac\.discutfree\.com
+https?:\/\/([^\/]*\.)?orcoc\.lolbb\.com
+https?:\/\/([^\/]*\.)?orcore\.graphforum\.com
+https?:\/\/([^\/]*\.)?orddercelexa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orddercialisonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordderlevitra\.ovp\.pl
+https?:\/\/([^\/]*\.)?orddertramadolonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orddervalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?orddervaliumonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordderviagra\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordderviagraonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordderzithromax\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordeertramadol\.ovp\.pl
+https?:\/\/([^\/]*\.)?order-blue-phentermine\.coz\.in
+https?:\/\/([^\/]*\.)?order-ritalin-online\.contact\.cc
+https?:\/\/([^\/]*\.)?order-viagra\.health-livening\.com
+https?:\/\/([^\/]*\.)?orderacyclovirr\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderadipexx\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderalbenzaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderalprazolamm\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderambienn\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderamoxicillinn\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderativann\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderccialiss\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordercelexaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderciaalisonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordercialisonline\.jubiiblog\.de
+https?:\/\/([^\/]*\.)?ordercialiss\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordercializ\.blogcu\.com
+https?:\/\/([^\/]*\.)?ordercializ\.spotbb\.com
+https?:\/\/([^\/]*\.)?ordercymbaltaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderhydrocodonee\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderlevitraa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderllevitra\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordermeridiaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderphentermin\.phpbbx\.de
+https?:\/\/([^\/]*\.)?orderphenterminee\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderpropeciaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrcialisonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrlevitra\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrtramadoll\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrtramadolonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrvalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrviagraa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderrviagraonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordersoma\.blogsome\.com
+https?:\/\/([^\/]*\.)?ordersomaa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderssoma\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordertramadoll\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordertramadollonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderultramm\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordervaliumm\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderviagraa\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderviagraaonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?ordervvalium\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderxanaxx\.ovp\.pl
+https?:\/\/([^\/]*\.)?orderxenicalonline\.ir\.pl
+https?:\/\/([^\/]*\.)?orecchino\.7god\.info
+https?:\/\/([^\/]*\.)?orecchino\.freespase\.info
+https?:\/\/([^\/]*\.)?oregonmortgage-x\.com
+https?:\/\/([^\/]*\.)?orgetacel\.discutforum\.com
+https?:\/\/([^\/]*\.)?orgeter\.cultureforum\.net
+https?:\/\/([^\/]*\.)?orgs\.indianatech\.edu
+https?:\/\/([^\/]*\.)?orletovar\.zikforum\.com
+https?:\/\/([^\/]*\.)?ormme\.com
+https?:\/\/([^\/]*\.)?ornildom\.forumzen\.com
+https?:\/\/([^\/]*\.)?orrdercialisonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orrdertramadolonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?orsaverc\.forumzen\.com
+https?:\/\/([^\/]*\.)?ortar\.com
+https?:\/\/([^\/]*\.)?ortho-tri-cyclen\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ortrocrol\.heavenforum\.com
+https?:\/\/([^\/]*\.)?ortrocrol\.highforum\.net
+https?:\/\/([^\/]*\.)?orvict\.ephpbb\.com
+https?:\/\/([^\/]*\.)?oryc0\.szm\.sk
+https?:\/\/([^\/]*\.)?orzeldron\.lightbb\.com
+https?:\/\/([^\/]*\.)?osakabondage\.info
+https?:\/\/([^\/]*\.)?osfi5\.szm\.sk
+https?:\/\/([^\/]*\.)?osthtp1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?otqsc\.szm\.sk
+https?:\/\/([^\/]*\.)?oudomdar\.dl\.pl
+https?:\/\/([^\/]*\.)?oudomolo\.lolbb\.com
+https?:\/\/([^\/]*\.)?oudronc4t\.blogcu\.com
+https?:\/\/([^\/]*\.)?ouerco\.lightbb\.com
+https?:\/\/([^\/]*\.)?oufienoc\.forumzen\.com
+https?:\/\/([^\/]*\.)?ouglova\.blogspot\.com
+https?:\/\/([^\/]*\.)?ouhymtro\.forumzen\.com
+https?:\/\/([^\/]*\.)?ouor\.lightbb\.com
+https?:\/\/([^\/]*\.)?ouorrac\.bbfr\.net
+https?:\/\/([^\/]*\.)?ouracdron\.discutfree\.com
+https?:\/\/([^\/]*\.)?ourolal\.discutfree\.com
+https?:\/\/([^\/]*\.)?outrocvar\.zj\.pl
+https?:\/\/([^\/]*\.)?outward-dev\.com
+https?:\/\/([^\/]*\.)?ouvier\.zj\.pl
+https?:\/\/([^\/]*\.)?overseas-adventure-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?ovparnel\.dl\.pl
+https?:\/\/([^\/]*\.)?ovpn2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ovrie\.szm\.sk
+https?:\/\/([^\/]*\.)?ovu\.edu
+https?:\/\/([^\/]*\.)?owll1\.szm\.sk
+https?:\/\/([^\/]*\.)?oxpass-com-g5\.blogspot\.com
+https?:\/\/([^\/]*\.)?oxpass-com-gt71a0\.blogspot\.com
+https?:\/\/([^\/]*\.)?oxpass-com-hurol\.blogspot\.com
+https?:\/\/([^\/]*\.)?oyspa\.szm\.sk
+https?:\/\/([^\/]*\.)?oz6soqa\.nokedem\.com
+https?:\/\/([^\/]*\.)?ozbk9\.szm\.sk
+https?:\/\/([^\/]*\.)?ozgzm\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ozxz5\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ozyexk2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?p-free-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?p-n-lesbian-sex-video-d\.blogspot\.com
+https?:\/\/([^\/]*\.)?p-teens-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?p-vi\.com
+https?:\/\/([^\/]*\.)?p1v\.org
+https?:\/\/([^\/]*\.)?p2l\.info
+https?:\/\/([^\/]*\.)?pa19\.com
+https?:\/\/([^\/]*\.)?pacfic-poker\.mutogen\.be
+https?:\/\/([^\/]*\.)?pacficpoker\.xwiki\.com
+https?:\/\/([^\/]*\.)?pacific-poker\.black-poker\.com
+https?:\/\/([^\/]*\.)?paddedapex\.org
+https?:\/\/([^\/]*\.)?paeecpx\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pafyawv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pain-medications\.us
+https?:\/\/([^\/]*\.)?pain-relief\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?pain-relief\.2x4\.ru
+https?:\/\/([^\/]*\.)?pain-relief\.fromru\.com
+https?:\/\/([^\/]*\.)?pain-relief\.newmail\.ru
+https?:\/\/([^\/]*\.)?pain_relief\.chat\.ru
+https?:\/\/([^\/]*\.)?paisi\.com
+https?:\/\/([^\/]*\.)?paisidesign\.com
+https?:\/\/([^\/]*\.)?pam\.freehostia\.com
+https?:\/\/([^\/]*\.)?pamlicohouse\.com
+https?:\/\/([^\/]*\.)?panama2cruise\.boom\.ru
+https?:\/\/([^\/]*\.)?panama2cruise\.chat\.ru
+https?:\/\/([^\/]*\.)?panamacruise1\.boom\.ru
+https?:\/\/([^\/]*\.)?panamacruise1\.chat\.ru
+https?:\/\/([^\/]*\.)?pandamovies-com-g6lz762n76\.blogspot\.com
+https?:\/\/([^\/]*\.)?pandamovies-com-tq32\.blogspot\.com
+https?:\/\/([^\/]*\.)?pandamovies-o4me7xqq0f\.blogspot\.com
+https?:\/\/([^\/]*\.)?panshan888\.com
+https?:\/\/([^\/]*\.)?panss\.org
+https?:\/\/([^\/]*\.)?panthersjaguar\.info
+https?:\/\/([^\/]*\.)?panty-ass-com-w1\.blogspot\.com
+https?:\/\/([^\/]*\.)?panty-ass-com-w8\.blogspot\.com
+https?:\/\/([^\/]*\.)?pantybuns-com-a6ejgve\.blogspot\.com
+https?:\/\/([^\/]*\.)?pantybuns-com-axeoa77ze5\.blogspot\.com
+https?:\/\/([^\/]*\.)?pantybuns-com-tl0\.blogspot\.com
+https?:\/\/([^\/]*\.)?pantyhose-face\.pupava\.dtdns\.net
+https?:\/\/([^\/]*\.)?pantyhose-net\.com
+https?:\/\/([^\/]*\.)?paola-e-chiara\.host24h\.info
+https?:\/\/([^\/]*\.)?paper--shredder\.boom\.ru
+https?:\/\/([^\/]*\.)?paper-s\.boom\.ru
+https?:\/\/([^\/]*\.)?paper1-shredder\.boom\.ru
+https?:\/\/([^\/]*\.)?paper1shredder\.chat\.ru
+https?:\/\/([^\/]*\.)?paper5shredder\.chat\.ru
+https?:\/\/([^\/]*\.)?paperbox\.freephpwebhosting\.net
+https?:\/\/([^\/]*\.)?paperroom\.blogspot\.com
+https?:\/\/([^\/]*\.)?papr-shredder\.boom\.ru
+https?:\/\/([^\/]*\.)?paradisenudes-com-o71a\.blogspot\.com
+https?:\/\/([^\/]*\.)?paradisenudes-com-os\.blogspot\.com
+https?:\/\/([^\/]*\.)?paralegal1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?parench\.ifrance\.com
+https?:\/\/([^\/]*\.)?parigi-appartamento-vacanza\.zoom10x\.info
+https?:\/\/([^\/]*\.)?paris-hilton-huxik\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-lukuv\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-nude-tape\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-pijid\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-pojic\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-porn\.0800-porn\.com
+https?:\/\/([^\/]*\.)?paris-hilton-sex-tape-xxx\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-sex-video-gf5m5\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-sex-video-sez\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-socog\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris-hilton-xidig\.blogspot\.com
+https?:\/\/([^\/]*\.)?paris\.php5\.cz
+https?:\/\/([^\/]*\.)?parishilton-paris-hilton\.blogspot\.com
+https?:\/\/([^\/]*\.)?parishilton-paris\.blogspot\.com
+https?:\/\/([^\/]*\.)?parnvf8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?partei-deutsches-reich\.de
+https?:\/\/([^\/]*\.)?parties-supply\.jeepsyc\.be
+https?:\/\/([^\/]*\.)?party-poker\.black-poker\.com
+https?:\/\/([^\/]*\.)?pasacvi\.zikforum\.com
+https?:\/\/([^\/]*\.)?paschiel\.blogcu\.com
+https?:\/\/([^\/]*\.)?pasdronli\.winnerforum\.net
+https?:\/\/([^\/]*\.)?pashkak0marov\.blogspot\.com
+https?:\/\/([^\/]*\.)?paslibo\.myrealboard\.com
+https?:\/\/([^\/]*\.)?pasoloro\.graphforum\.com
+https?:\/\/([^\/]*\.)?pasoloro\.highforum\.net
+https?:\/\/([^\/]*\.)?pasracco\.blogcu\.com
+https?:\/\/([^\/]*\.)?pasrodron\.xa\.pl
+https?:\/\/([^\/]*\.)?passaf\.com
+https?:\/\/([^\/]*\.)?pastmagic\.blogspot\.com
+https?:\/\/([^\/]*\.)?pasviric\.td\.pl
+https?:\/\/([^\/]*\.)?patsytestis\.0moola\.com
+https?:\/\/([^\/]*\.)?pattywhack91\.ibelgique\.com
+https?:\/\/([^\/]*\.)?paulino\.greekboston\.com
+https?:\/\/([^\/]*\.)?paulino\.idilis\.ro
+https?:\/\/([^\/]*\.)?paxil-cr\.contact\.cc
+https?:\/\/([^\/]*\.)?paxil-without-prescription\.contact\.cc
+https?:\/\/([^\/]*\.)?paxil\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?paxil\.forospace\.com
+https?:\/\/([^\/]*\.)?paxilonline\.zoomshare\.com
+https?:\/\/([^\/]*\.)?payday-loan\.de\.com
+https?:\/\/([^\/]*\.)?payday-loans-4us\.com
+https?:\/\/([^\/]*\.)?payday-loans-ooo\.blogspot\.com
+https?:\/\/([^\/]*\.)?paydayloans-guide\.com
+https?:\/\/([^\/]*\.)?paydayloans-x\.com
+https?:\/\/([^\/]*\.)?pcb2002\.home4u\.china\.com
+https?:\/\/([^\/]*\.)?pcgzt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pdslnw6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?peace-weasel\.blogspot\.com
+https?:\/\/([^\/]*\.)?peacedoorball\.blogspot\.com
+https?:\/\/([^\/]*\.)?pearlibuttons\.blogspot\.com
+https?:\/\/([^\/]*\.)?pebwgu0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pecilu-free-sex-video-clip\.blogspot\.com
+https?:\/\/([^\/]*\.)?pee-4a\.com
+https?:\/\/([^\/]*\.)?peetliel\.jconserv\.net
+https?:\/\/([^\/]*\.)?pefi-albert\.blogspot\.com
+https?:\/\/([^\/]*\.)?pelnp\.szm\.sk
+https?:\/\/([^\/]*\.)?pendant\.hostcroc\.com
+https?:\/\/([^\/]*\.)?pennsylvaniamortgage-x\.com
+https?:\/\/([^\/]*\.)?people\.msoe\.edu
+https?:\/\/([^\/]*\.)?percocet-without-prescription\.contact\.cc
+https?:\/\/([^\/]*\.)?percocet\.xwiki\.com
+https?:\/\/([^\/]*\.)?perfect-boob\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?permanentmagnet\.com
+https?:\/\/([^\/]*\.)?persiankitty-com-kcfsibt01d\.blogspot\.com
+https?:\/\/([^\/]*\.)?persiankitty-com-ksa6l1a\.blogspot\.com
+https?:\/\/([^\/]*\.)?personales\.ciudad\.com\.ar
+https?:\/\/([^\/]*\.)?personalserotic\.com
+https?:\/\/([^\/]*\.)?petite-mature-blonde\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?petite-teen-ass\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?petiteteenager-com-cm8ku8w\.blogspot\.com
+https?:\/\/([^\/]*\.)?petiteteenager-com-md6\.blogspot\.com
+https?:\/\/([^\/]*\.)?petiteteenager-com-mns4n5a4\.blogspot\.com
+https?:\/\/([^\/]*\.)?petiteteenager-g687rhasjq\.blogspot\.com
+https?:\/\/([^\/]*\.)?peuct\.szm\.sk
+https?:\/\/([^\/]*\.)?pfes7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pffl4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pgbnjja\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pharm1\.info
+https?:\/\/([^\/]*\.)?pharmacies\.in\.ua
+https?:\/\/([^\/]*\.)?pharmacy-experts\.org
+https?:\/\/([^\/]*\.)?pharmacy-x\.ru\.ru
+https?:\/\/([^\/]*\.)?pharmacy\.sovuennir\.be
+https?:\/\/([^\/]*\.)?pharmacy\.t28\.net
+https?:\/\/([^\/]*\.)?pharmacy05\.com
+https?:\/\/([^\/]*\.)?pharmacybuy1\.angelcities\.com
+https?:\/\/([^\/]*\.)?pharmaduk\.xshorturl\.com
+https?:\/\/([^\/]*\.)?phendimetrazine\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?phendimetrazinenx\.u\.yuku\.com
+https?:\/\/([^\/]*\.)?phentermine--mine\.blogspot\.com
+https?:\/\/([^\/]*\.)?phentermine-911\.bee\.pl
+https?:\/\/([^\/]*\.)?phentermine-911\.coz\.in
+https?:\/\/([^\/]*\.)?phentermine-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?phentermine-choise\.ebloggy\.com
+https?:\/\/([^\/]*\.)?phentermine-forum\.tripod\.com
+https?:\/\/([^\/]*\.)?phentermine-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?phentermine-gs\.net\.tc
+https?:\/\/([^\/]*\.)?phentermine-hcl\.org
+https?:\/\/([^\/]*\.)?phentermine-online\.cheapills\.info
+https?:\/\/([^\/]*\.)?phentermine-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?phentermine-pharmacy\.fws1\.com
+https?:\/\/([^\/]*\.)?phentermine-support\.com
+https?:\/\/([^\/]*\.)?phentermine\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?phentermine\.acbox\.com
+https?:\/\/([^\/]*\.)?phentermine\.acbox\.net
+https?:\/\/([^\/]*\.)?phentermine\.arkadasi\.com
+https?:\/\/([^\/]*\.)?phentermine\.asistani\.com
+https?:\/\/([^\/]*\.)?phentermine\.bz
+https?:\/\/([^\/]*\.)?phentermine\.clubpage\.net
+https?:\/\/([^\/]*\.)?phentermine\.esguay\.com
+https?:\/\/([^\/]*\.)?phentermine\.flygande-apor\.com
+https?:\/\/([^\/]*\.)?phentermine\.goodpharm\.info
+https?:\/\/([^\/]*\.)?phentermine\.gotgeeks\.com
+https?:\/\/([^\/]*\.)?phentermine\.hallonsaft\.info
+https?:\/\/([^\/]*\.)?phentermine\.health-livening\.com
+https?:\/\/([^\/]*\.)?phentermine\.on-4\.com
+https?:\/\/([^\/]*\.)?phentermine\.ontspant\.nl
+https?:\/\/([^\/]*\.)?phentermine\.presteert\.nl
+https?:\/\/([^\/]*\.)?phentermine\.skocz\.net
+https?:\/\/([^\/]*\.)?phentermine\.su\.pl
+https?:\/\/([^\/]*\.)?phentermine\.tv
+https?:\/\/([^\/]*\.)?phentermine\.websiam\.net
+https?:\/\/([^\/]*\.)?phentermine2\.freewebsites\.com
+https?:\/\/([^\/]*\.)?phentermine7x\.forumup\.org
+https?:\/\/([^\/]*\.)?phenterminec\.phpbbx\.de
+https?:\/\/([^\/]*\.)?phentermineonline\.ds4a\.com
+https?:\/\/([^\/]*\.)?phentermineonline\.livelog\.com
+https?:\/\/([^\/]*\.)?phentermineq\.host-page\.com
+https?:\/\/([^\/]*\.)?phentermines\.int\.tf
+https?:\/\/([^\/]*\.)?phoenixbrngbrt\.blogspot\.com
+https?:\/\/([^\/]*\.)?phol8\.szm\.sk
+https?:\/\/([^\/]*\.)?phone-service\.newmail\.ru
+https?:\/\/([^\/]*\.)?phones-gsm\.haemati\.be
+https?:\/\/([^\/]*\.)?photo-of-girl-boob\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?photospacefree\.com
+https?:\/\/([^\/]*\.)?phots\.info
+https?:\/\/([^\/]*\.)?phpbbx\.de
+https?:\/\/([^\/]*\.)?phun-org-i08kd\.blogspot\.com
+https?:\/\/([^\/]*\.)?phun-org-ingg0\.blogspot\.com
+https?:\/\/([^\/]*\.)?pi-allyson\.blogspot\.com
+https?:\/\/([^\/]*\.)?pichunter-com-bkfwk\.blogspot\.com
+https?:\/\/([^\/]*\.)?pichunter-com-bzf\.blogspot\.com
+https?:\/\/([^\/]*\.)?pichunter-com-hmmcyoud8\.blogspot\.com
+https?:\/\/([^\/]*\.)?pichunter-com-kesip\.blogspot\.com
+https?:\/\/([^\/]*\.)?picpost-com-e3xqsc6a\.blogspot\.com
+https?:\/\/([^\/]*\.)?picpost-com-eu7refa3s5\.blogspot\.com
+https?:\/\/([^\/]*\.)?picture-cast-on-broken-leg\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?picture-of-gay-guys-fucking\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?picture-of-used-condom\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?picture\.8tt\.org
+https?:\/\/([^\/]*\.)?pictureheaven-com-ri7hn\.blogspot\.com
+https?:\/\/([^\/]*\.)?pictureheaven-com-rw\.blogspot\.com
+https?:\/\/([^\/]*\.)?pictures-free-org-wl0nj\.blogspot\.com
+https?:\/\/([^\/]*\.)?pictures-free-org-wmmkv2w\.blogspot\.com
+https?:\/\/([^\/]*\.)?piggy-soldier\.blogspot\.com
+https?:\/\/([^\/]*\.)?pigtime\.net\.ru
+https?:\/\/([^\/]*\.)?pigxxx-com-ctjj1\.blogspot\.com
+https?:\/\/([^\/]*\.)?pigxxx-com-ge1omxgp20\.blogspot\.com
+https?:\/\/([^\/]*\.)?pigxxx-com-geo8asd1i\.blogspot\.com
+https?:\/\/([^\/]*\.)?pigxxx-com-nevew\.blogspot\.com
+https?:\/\/([^\/]*\.)?pijjyh-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?pillalli\.info
+https?:\/\/([^\/]*\.)?pillnext\.com
+https?:\/\/([^\/]*\.)?pillow\.2x4\.ru
+https?:\/\/([^\/]*\.)?pills-catalog\.com
+https?:\/\/([^\/]*\.)?pills-pharmacy\.us
+https?:\/\/([^\/]*\.)?pills\.007webpro\.com
+https?:\/\/([^\/]*\.)?pills\.siemprelisto\.net
+https?:\/\/([^\/]*\.)?pills1\.org
+https?:\/\/([^\/]*\.)?pillsz\.com
+https?:\/\/([^\/]*\.)?pimpmyblackteen-com-t6ijmwbu\.blogspot\.com
+https?:\/\/([^\/]*\.)?pimpmyblackteen-com-t7d432c\.blogspot\.com
+https?:\/\/([^\/]*\.)?pindosam\.com
+https?:\/\/([^\/]*\.)?pine\.hostonmars\.com
+https?:\/\/([^\/]*\.)?pinkpornstars-com-da3njbu\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkpornstars-com-dnjx\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkpornstars-com-drm\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkworld-com-c84agv\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkworld-com-ci8e6\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkworld-com-ge4k4kmsd\.blogspot\.com
+https?:\/\/([^\/]*\.)?pinkworld-com-kp7s8i5\.blogspot\.com
+https?:\/\/([^\/]*\.)?pino-daniele\.19mb\.info
+https?:\/\/([^\/]*\.)?pinoyteens\.net
+https?:\/\/([^\/]*\.)?piomchel\.jconserv\.net
+https?:\/\/([^\/]*\.)?pisces\.8tt\.org
+https?:\/\/([^\/]*\.)?pitch\.101freehost\.com
+https?:\/\/([^\/]*\.)?pizda4\.com
+https?:\/\/([^\/]*\.)?pizza-hut\.hotmail\.ru
+https?:\/\/([^\/]*\.)?pjim6\.szm\.sk
+https?:\/\/([^\/]*\.)?pjju3\.szm\.sk
+https?:\/\/([^\/]*\.)?pjmykz8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pjryskur-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?pjuibhe\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pkufl\.szm\.sk
+https?:\/\/([^\/]*\.)?place\.sex-jet\.net
+https?:\/\/([^\/]*\.)?planetaacura\.info
+https?:\/\/([^\/]*\.)?planetwatt\.republika\.pl
+https?:\/\/([^\/]*\.)?plastictec\.net
+https?:\/\/([^\/]*\.)?plavix\.coz\.in
+https?:\/\/([^\/]*\.)?plavixbuy\.gameday\.de
+https?:\/\/([^\/]*\.)?plavixbuycheap\.dive\.to
+https?:\/\/([^\/]*\.)?plavixcheap\.hey\.to
+https?:\/\/([^\/]*\.)?plavixcheapgeneric\.go\.to
+https?:\/\/([^\/]*\.)?plavixgeneric\.change\.to
+https?:\/\/([^\/]*\.)?play-777\.com
+https?:\/\/([^\/]*\.)?play-online-casino\.de\.com
+https?:\/\/([^\/]*\.)?play-online-poker\.newmail\.ru
+https?:\/\/([^\/]*\.)?play-station-2-boot-disk\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?playandwinit777\.net
+https?:\/\/([^\/]*\.)?pleasebangmywife-com-i8zdgo1\.blogspot\.com
+https?:\/\/([^\/]*\.)?pleasebangmywife-com-iq\.blogspot\.com
+https?:\/\/([^\/]*\.)?pleasebangmywife-com-koguq\.blogspot\.com
+https?:\/\/([^\/]*\.)?pleasure\.hostonmars\.com
+https?:\/\/([^\/]*\.)?ploob\.blox\.pl
+https?:\/\/([^\/]*\.)?plugkblow\.pornomagnat\.net
+https?:\/\/([^\/]*\.)?plumper69-com-on3664rg\.blogspot\.com
+https?:\/\/([^\/]*\.)?plumper69-com-os4\.blogspot\.com
+https?:\/\/([^\/]*\.)?plumper69-com-sokis\.blogspot\.com
+https?:\/\/([^\/]*\.)?plxn1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pmrd2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pmyk8\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?po-alora\.blogspot\.com
+https?:\/\/([^\/]*\.)?pobpa\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?pocmlaq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?podnos\.stabilt\.se
+https?:\/\/([^\/]*\.)?poeller\.dl\.pl
+https?:\/\/([^\/]*\.)?pogeh\.szm\.sk
+https?:\/\/([^\/]*\.)?pohuym\.jo\.pl
+https?:\/\/([^\/]*\.)?pointyou\.info
+https?:\/\/([^\/]*\.)?poker-0\.com
+https?:\/\/([^\/]*\.)?poker-24x7\.com
+https?:\/\/([^\/]*\.)?poker-4all\.com
+https?:\/\/([^\/]*\.)?poker-7\.com
+https?:\/\/([^\/]*\.)?poker-boulevard\.com
+https?:\/\/([^\/]*\.)?poker-check\.com
+https?:\/\/([^\/]*\.)?poker-new\.com
+https?:\/\/([^\/]*\.)?poker-party-a\.com
+https?:\/\/([^\/]*\.)?poker-places-4u\.net
+https?:\/\/([^\/]*\.)?poker-places\.net
+https?:\/\/([^\/]*\.)?poker-pro\.us
+https?:\/\/([^\/]*\.)?poker-stadium\.com
+https?:\/\/([^\/]*\.)?poker-sys\.com
+https?:\/\/([^\/]*\.)?poker-unique\.com
+https?:\/\/([^\/]*\.)?poker-valley\.com
+https?:\/\/([^\/]*\.)?poker\.black-poker\.com
+https?:\/\/([^\/]*\.)?poker\.land\.ru
+https?:\/\/([^\/]*\.)?poker1table\.chat\.ru
+https?:\/\/([^\/]*\.)?pokera\.web\.com
+https?:\/\/([^\/]*\.)?pokermaniab\.atspace\.com
+https?:\/\/([^\/]*\.)?polex\.com\.cn
+https?:\/\/([^\/]*\.)?police-motorcycle-boot\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?police\.site\.io
+https?:\/\/([^\/]*\.)?polonka\.php5\.cz
+https?:\/\/([^\/]*\.)?polott\.org
+https?:\/\/([^\/]*\.)?polyphonic-ringtoneslsh\.blogspot\.com
+https?:\/\/([^\/]*\.)?polysorb\.myoco\.be
+https?:\/\/([^\/]*\.)?polyurethane-condom\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?pool-table\.hotmail\.ru
+https?:\/\/([^\/]*\.)?poopoovi\.forumculture\.net
+https?:\/\/([^\/]*\.)?pop\.egi\.biz
+https?:\/\/([^\/]*\.)?porn-clip-blog5jc\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-clip-boj\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-clip-om16o\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-movie-clips-blogk8p\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-movie-rj8a7\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-movie-ted\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-movie\.hostingtree\.org
+https?:\/\/([^\/]*\.)?porn-samples\.com
+https?:\/\/([^\/]*\.)?porn-star-clip-info0n0\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-star-movie-clip-newsigj\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-star-video-clip-zone44f\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-teacher\.com
+https?:\/\/([^\/]*\.)?porn-teen-pic\.com
+https?:\/\/([^\/]*\.)?porn-video-clip-bb-bb-f\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-video-clip-gallery-zonehp1\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-video-clips-news5v2\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn-video-jef\.blogspot\.com
+https?:\/\/([^\/]*\.)?porn1clip\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornaccess-com-k58\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornaccess-com-kkd1zvcobi\.blogspot\.com
+https?:\/\/([^\/]*\.)?porndirectory-com-m544ar5z47\.blogspot\.com
+https?:\/\/([^\/]*\.)?porndirectory-com-miyza\.blogspot\.com
+https?:\/\/([^\/]*\.)?porneskimo-com-hizrd2on\.blogspot\.com
+https?:\/\/([^\/]*\.)?porneskimo-com-hr1frq8hrr\.blogspot\.com
+https?:\/\/([^\/]*\.)?porneskimo-d4p5\.blogspot\.com
+https?:\/\/([^\/]*\.)?porneskimo-diheh\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornfreeusa\.info
+https?:\/\/([^\/]*\.)?pornno-com-cdtkjmj\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornno-com-cz5dknpwc\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornogames4\.com
+https?:\/\/([^\/]*\.)?pornoho-com-d7f\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornoho-com-db2ge0p\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstar-com-be1mbdy0l1\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstar-com-bsrzs22gn\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstar-com-nuvor\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstar-dz8j\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarbook-com-ag3477t\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarbook-com-agrpd\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarfinder-net-wp2lsr0\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarfinder-net-wuag8\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstargals-com-tj\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstargals-com-tk7hoxv36\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstars\.hostingtree\.org
+https?:\/\/([^\/]*\.)?pornstarvid-com-dinif\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarvid-com-h5\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornstarvid-com-h8xe\.blogspot\.com
+https?:\/\/([^\/]*\.)?pornweek-com\.isabel\.dtdns\.net
+https?:\/\/([^\/]*\.)?portal777\.com
+https?:\/\/([^\/]*\.)?portalrate\.info
+https?:\/\/([^\/]*\.)?portcityhonda\.info
+https?:\/\/([^\/]*\.)?portly\.byinter\.net
+https?:\/\/([^\/]*\.)?porzo-com-dsmefbsl\.blogspot\.com
+https?:\/\/([^\/]*\.)?porzo-com-gxo\.blogspot\.com
+https?:\/\/([^\/]*\.)?poshlo\.com
+https?:\/\/([^\/]*\.)?postdream\.org
+https?:\/\/([^\/]*\.)?potulnik\.php5\.cz
+https?:\/\/([^\/]*\.)?povicyt\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?powerlevelingweb\.com
+https?:\/\/([^\/]*\.)?pozorvostoka\.250free\.com
+https?:\/\/([^\/]*\.)?pp-shredd\.boom\.ru
+https?:\/\/([^\/]*\.)?pppsp\.szm\.sk
+https?:\/\/([^\/]*\.)?ppuhldv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pqis2\.szm\.sk
+https?:\/\/([^\/]*\.)?prakashcommunication\.com
+https?:\/\/([^\/]*\.)?prama\.info
+https?:\/\/([^\/]*\.)?prasut\.com
+https?:\/\/([^\/]*\.)?prearnha\.dl\.pl
+https?:\/\/([^\/]*\.)?prednisone\.3d-game\.com
+https?:\/\/([^\/]*\.)?prenotazione-albergo-rimini\.host24h\.info
+https?:\/\/([^\/]*\.)?prestito-taranto\.robzz\.info
+https?:\/\/([^\/]*\.)?prettyhair24-7\.blogspot\.com
+https?:\/\/([^\/]*\.)?prettyhotbabes-com-r2lu08uojn\.blogspot\.com
+https?:\/\/([^\/]*\.)?prettyhotbabes-com-rkgrt\.blogspot\.com
+https?:\/\/([^\/]*\.)?prettymob\.com
+https?:\/\/([^\/]*\.)?prevacid\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?price-top\.com
+https?:\/\/([^\/]*\.)?price100\.info
+https?:\/\/([^\/]*\.)?prilosec\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?prilosecbuycheap\.turn\.to
+https?:\/\/([^\/]*\.)?prilosecbuygeneric\.redirect\.to
+https?:\/\/([^\/]*\.)?priloseccheap\.turn\.to
+https?:\/\/([^\/]*\.)?priloseccheapgeneric\.redirect\.to
+https?:\/\/([^\/]*\.)?prilosecgeneric\.come\.to
+https?:\/\/([^\/]*\.)?primer\.fidosoft\.de
+https?:\/\/([^\/]*\.)?primojerky\.cn
+https?:\/\/([^\/]*\.)?primonona\.info
+https?:\/\/([^\/]*\.)?princesscruises\.chat\.ru
+https?:\/\/([^\/]*\.)?princesskariboo\.blogspot\.com
+https?:\/\/([^\/]*\.)?printer\.net\.cn
+https?:\/\/([^\/]*\.)?printingok\.net
+https?:\/\/([^\/]*\.)?private-porn-clip-newsmzm\.blogspot\.com
+https?:\/\/([^\/]*\.)?proactive-facial-product\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?problem-skin\.nm\.ru
+https?:\/\/([^\/]*\.)?problem_skin\.chat\.ru
+https?:\/\/([^\/]*\.)?prodotti-cosmetico\.nnme\.info
+https?:\/\/([^\/]*\.)?projectvoyeur-com-ec15a\.blogspot\.com
+https?:\/\/([^\/]*\.)?projectvoyeur-com-eq2w\.blogspot\.com
+https?:\/\/([^\/]*\.)?projectvoyeur-com-eyyd4q\.blogspot\.com
+https?:\/\/([^\/]*\.)?projectvoyeur-t3j\.blogspot\.com
+https?:\/\/([^\/]*\.)?prom\.createforum\.us
+https?:\/\/([^\/]*\.)?propecia\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?propecia\.esguay\.com
+https?:\/\/([^\/]*\.)?propecia\.skocz\.net
+https?:\/\/([^\/]*\.)?protonixbuy\.stick\.by
+https?:\/\/([^\/]*\.)?protonixbuycheap\.redirect\.to
+https?:\/\/([^\/]*\.)?protonixcheap\.connect\.to
+https?:\/\/([^\/]*\.)?protonixcheapgeneric\.soft-ware\.de
+https?:\/\/([^\/]*\.)?protonixgenericbuy\.cut\.by
+https?:\/\/([^\/]*\.)?provigilweight\.sblog\.cz
+https?:\/\/([^\/]*\.)?prozac\.rx4\.org
+https?:\/\/([^\/]*\.)?prsl4\.szm\.sk
+https?:\/\/([^\/]*\.)?prznic\.dtdns\.net
+https?:\/\/([^\/]*\.)?psfc\.mit\.edu
+https?:\/\/([^\/]*\.)?psmorrison\.blogspot\.com
+https?:\/\/([^\/]*\.)?psnuni\.com
+https?:\/\/([^\/]*\.)?psrq4\.szm\.sk
+https?:\/\/([^\/]*\.)?psychology-degre\.boom\.ru
+https?:\/\/([^\/]*\.)?psychology1degre\.chat\.ru
+https?:\/\/([^\/]*\.)?pszdc\.szm\.sk
+https?:\/\/([^\/]*\.)?ptpm9\.szm\.sk
+https?:\/\/([^\/]*\.)?ptrip\.net
+https?:\/\/([^\/]*\.)?pttqt\.szm\.sk
+https?:\/\/([^\/]*\.)?publicinvasion-com-bhtum2\.blogspot\.com
+https?:\/\/([^\/]*\.)?publicinvasion-com-bj\.blogspot\.com
+https?:\/\/([^\/]*\.)?publicinvasion-com-furok\.blogspot\.com
+https?:\/\/([^\/]*\.)?publicsaftor\.com
+https?:\/\/([^\/]*\.)?pued-com-maxu1g7\.blogspot\.com
+https?:\/\/([^\/]*\.)?pued-com-mf3\.blogspot\.com
+https?:\/\/([^\/]*\.)?pued-com-r0078gie\.blogspot\.com
+https?:\/\/([^\/]*\.)?pued-ox5y12mn7s\.blogspot\.com
+https?:\/\/([^\/]*\.)?puffybet\.sultryserver\.com
+https?:\/\/([^\/]*\.)?pulaskiterm\.info
+https?:\/\/([^\/]*\.)?pulse-squad\.com
+https?:\/\/([^\/]*\.)?pumpthatass-com-a78juz38f2\.blogspot\.com
+https?:\/\/([^\/]*\.)?pumpthatass-com-a7ouybe\.blogspot\.com
+https?:\/\/([^\/]*\.)?pumpthatass-com-xudeb\.blogspot\.com
+https?:\/\/([^\/]*\.)?punguinodoom\.110mb\.com
+https?:\/\/([^\/]*\.)?punjqm0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?punk-ass-bitch-wheatus\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?puppykibble-com-o7\.blogspot\.com
+https?:\/\/([^\/]*\.)?puppykibble-com-oh0w2te3k\.blogspot\.com
+https?:\/\/([^\/]*\.)?puppykibble-com-oqm7hu8d\.blogspot\.com
+https?:\/\/([^\/]*\.)?purextc-com-i8\.blogspot\.com
+https?:\/\/([^\/]*\.)?purextc-com-iy\.blogspot\.com
+https?:\/\/([^\/]*\.)?pussy-ass-bitch\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?pussy-org-kjsb51la\.blogspot\.com
+https?:\/\/([^\/]*\.)?pussy-org-km5\.blogspot\.com
+https?:\/\/([^\/]*\.)?putsta\.com
+https?:\/\/([^\/]*\.)?pvfws\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pvqoa\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pvsiwi7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pvudt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pvzj1\.szm\.sk
+https?:\/\/([^\/]*\.)?pwqx0\.szm\.sk
+https?:\/\/([^\/]*\.)?pymiw\.szm\.sk
+https?:\/\/([^\/]*\.)?pyr0lys1s\.blogspot\.com
+https?:\/\/([^\/]*\.)?pyrebi\.blogspot\.com
+https?:\/\/([^\/]*\.)?pyujxu0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?pzch0\.szm\.sk
+https?:\/\/([^\/]*\.)?pzek6\.szm\.sk
+https?:\/\/([^\/]*\.)?pzif1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?q-n-homemade-sex-video-z\.blogspot\.com
+https?:\/\/([^\/]*\.)?qbzmbwz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qctbue2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qdhr9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qdojv\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?qe-hentai-sex-video-sun\.blogspot\.com
+https?:\/\/([^\/]*\.)?qek-wetplace-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?qfoo7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qgre5\.szm\.sk
+https?:\/\/([^\/]*\.)?qgtdivl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qhiqu\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?qhprfm6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qhyvt\.szm\.sk
+https?:\/\/([^\/]*\.)?qietingqi\.ebloggy\.com
+https?:\/\/([^\/]*\.)?qingpao\.com
+https?:\/\/([^\/]*\.)?qinjq\.szm\.sk
+https?:\/\/([^\/]*\.)?qiqiu\.org
+https?:\/\/([^\/]*\.)?qite-alanna\.blogspot\.com
+https?:\/\/([^\/]*\.)?qjok9\.szm\.sk
+https?:\/\/([^\/]*\.)?qjt230\.com
+https?:\/\/([^\/]*\.)?qjvkvcd\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qklb4\.szm\.sk
+https?:\/\/([^\/]*\.)?qklhtf0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qknfl\.szm\.sk
+https?:\/\/([^\/]*\.)?qknpl\.info
+https?:\/\/([^\/]*\.)?qkpple2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qlpkce6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qltx2\.szm\.sk
+https?:\/\/([^\/]*\.)?qmjrpuo\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qnax1\.szm\.sk
+https?:\/\/([^\/]*\.)?qo-video-porn-gratis-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?qoclick\.com
+https?:\/\/([^\/]*\.)?qoeg6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qojodeh-bdsm-post-video-f\.blogspot\.com
+https?:\/\/([^\/]*\.)?qosmwx9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qpdoc\.com
+https?:\/\/([^\/]*\.)?qqdaj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qqer6\.szm\.sk
+https?:\/\/([^\/]*\.)?qqnbon4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qqwgp\.szm\.sk
+https?:\/\/([^\/]*\.)?qrvkof5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qsc7\.org\.ua
+https?:\/\/([^\/]*\.)?qsskk\.info
+https?:\/\/([^\/]*\.)?qtru3\.szm\.sk
+https?:\/\/([^\/]*\.)?qu-free-latina-sex-vide-wiv\.blogspot\.com
+https?:\/\/([^\/]*\.)?quails\.ipupdater\.us
+https?:\/\/([^\/]*\.)?quandugift\.com
+https?:\/\/([^\/]*\.)?queryguild\.com
+https?:\/\/([^\/]*\.)?quqob\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qutgmzbuje-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?qvewr\.szm\.sk
+https?:\/\/([^\/]*\.)?qvrzi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qvulp\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qwhhmaj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qwrn6\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?qxmk2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?qyda0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qyf99\.com
+https?:\/\/([^\/]*\.)?qypv5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qz\.informs\.com
+https?:\/\/([^\/]*\.)?qzjeqcv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?qzrhj\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?r-t-free-porn-video-clip-c\.blogspot\.com
+https?:\/\/([^\/]*\.)?racelleto\.dl\.pl
+https?:\/\/([^\/]*\.)?racer\.graphforum\.com
+https?:\/\/([^\/]*\.)?racerboc\.ephpbb\.com
+https?:\/\/([^\/]*\.)?rachel-hunter-as-stacys-mom\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?racnelelt\.fr-bb\.com
+https?:\/\/([^\/]*\.)?racoloboc\.graphforum\.com
+https?:\/\/([^\/]*\.)?racoloboc\.highforum\.net
+https?:\/\/([^\/]*\.)?racoloor\.dl\.pl
+https?:\/\/([^\/]*\.)?racrella\.dl\.pl
+https?:\/\/([^\/]*\.)?racsitli\.dl\.pl
+https?:\/\/([^\/]*\.)?ractrcna\.bb-fr\.com
+https?:\/\/([^\/]*\.)?racviget\.blogcu\.com
+https?:\/\/([^\/]*\.)?raezey\.blogspot\.com
+https?:\/\/([^\/]*\.)?raged\.info
+https?:\/\/([^\/]*\.)?rajzhze\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ramandrom\.com
+https?:\/\/([^\/]*\.)?randomlogik\.blogspot\.com
+https?:\/\/([^\/]*\.)?rappture\.blogspot\.com
+https?:\/\/([^\/]*\.)?raruzeol\.jconserv\.net
+https?:\/\/([^\/]*\.)?rate-boob-pic\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?ratonhteroad\.blogspot\.com
+https?:\/\/([^\/]*\.)?rawpussy-b0q\.blogspot\.com
+https?:\/\/([^\/]*\.)?rawpussy-com-t3l\.blogspot\.com
+https?:\/\/([^\/]*\.)?rawpussy-com-tawon6x\.blogspot\.com
+https?:\/\/([^\/]*\.)?raxm2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?razor-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?razor2scooter\.chat\.ru
+https?:\/\/([^\/]*\.)?rboub\.szm\.sk
+https?:\/\/([^\/]*\.)?rdavisinc\.com
+https?:\/\/([^\/]*\.)?re-advertising\.boom\.ru
+https?:\/\/([^\/]*\.)?re\.rutan\.org
+https?:\/\/([^\/]*\.)?readworld\.com
+https?:\/\/([^\/]*\.)?real-gay-sex-story\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?real-ringtoneserd\.blogspot\.com
+https?:\/\/([^\/]*\.)?realitsen\.info
+https?:\/\/([^\/]*\.)?realitypassplus-com-e34pddwt1\.blogspot\.com
+https?:\/\/([^\/]*\.)?realitypassplus-com-e7y\.blogspot\.com
+https?:\/\/([^\/]*\.)?realityporn\.coz\.in
+https?:\/\/([^\/]*\.)?realtimewatches\.info
+https?:\/\/([^\/]*\.)?realtors-x\.com
+https?:\/\/([^\/]*\.)?reboteen5\.blogspot\.com
+https?:\/\/([^\/]*\.)?rebuildsanmateohighschool\.org
+https?:\/\/([^\/]*\.)?recipe4you\.info
+https?:\/\/([^\/]*\.)?recupero-dati-hard-disk\.ll11\.info
+https?:\/\/([^\/]*\.)?redder\.my-wifi\.info
+https?:\/\/([^\/]*\.)?redfxo\.blogspot\.com
+https?:\/\/([^\/]*\.)?redsex4\.info
+https?:\/\/([^\/]*\.)?redtcyw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?reductildrug\.coz\.in
+https?:\/\/([^\/]*\.)?redway-org-d8u\.blogspot\.com
+https?:\/\/([^\/]*\.)?redway-org-dtxz0863\.blogspot\.com
+https?:\/\/([^\/]*\.)?redway-rla\.blogspot\.com
+https?:\/\/([^\/]*\.)?reeringtonesptl\.blogspot\.com
+https?:\/\/([^\/]*\.)?refinance-x\.com
+https?:\/\/([^\/]*\.)?reggdr\.org
+https?:\/\/([^\/]*\.)?regsh\.com
+https?:\/\/([^\/]*\.)?reiw9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rejoicing\.gigsweb\.com
+https?:\/\/([^\/]*\.)?rekara\.com
+https?:\/\/([^\/]*\.)?relagen\.orkan\.yi\.org
+https?:\/\/([^\/]*\.)?relalract\.lolforum\.net
+https?:\/\/([^\/]*\.)?relcadron\.bbgraf\.com
+https?:\/\/([^\/]*\.)?relcoli\.lightbb\.com
+https?:\/\/([^\/]*\.)?relics\.hackers-unite\.info
+https?:\/\/([^\/]*\.)?relmonric\.lolforum\.net
+https?:\/\/([^\/]*\.)?reloading-software\.lycan\.be
+https?:\/\/([^\/]*\.)?relsitelt\.darkbb\.com
+https?:\/\/([^\/]*\.)?relsitrel\.xa\.pl
+https?:\/\/([^\/]*\.)?reltaro\.lolbb\.com
+https?:\/\/([^\/]*\.)?remiza\.dtdns\.net
+https?:\/\/([^\/]*\.)?renova\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?rentbuscompany\.net
+https?:\/\/([^\/]*\.)?rentcarcenter\.com
+https?:\/\/([^\/]*\.)?rentcarok\.org
+https?:\/\/([^\/]*\.)?replacement-batteries\.loretic\.be
+https?:\/\/([^\/]*\.)?repq7\.szm\.sk
+https?:\/\/([^\/]*\.)?rerdiq4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?reshall\.iweb\.bsu\.edu
+https?:\/\/([^\/]*\.)?responderpal\.com
+https?:\/\/([^\/]*\.)?restless-leg--com\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?restless-leg-syndrome-com\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?retin-a\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?retirement1comm\.chat\.ru
+https?:\/\/([^\/]*\.)?returboc\.forumculture\.net
+https?:\/\/([^\/]*\.)?revitolantiaging\.com
+https?:\/\/([^\/]*\.)?rfjn0\.szm\.sk
+https?:\/\/([^\/]*\.)?rgvlg\.szm\.sk
+https?:\/\/([^\/]*\.)?rhdhh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rhinotickets\.com
+https?:\/\/([^\/]*\.)?rhn45\.nokedem\.com
+https?:\/\/([^\/]*\.)?rhodeislandmortgage-x\.com
+https?:\/\/([^\/]*\.)?rhooh\.flnet\.org
+https?:\/\/([^\/]*\.)?ri-hardcore-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?ricacelco\.dl\.pl
+https?:\/\/([^\/]*\.)?ricaldneu\.fr-bb\.com
+https?:\/\/([^\/]*\.)?riceltleto\.dl\.pl
+https?:\/\/([^\/]*\.)?ricetta-cucina\.host24h\.info
+https?:\/\/([^\/]*\.)?rich-r\.blogspot\.com
+https?:\/\/([^\/]*\.)?richards-realm-com-c4h\.blogspot\.com
+https?:\/\/([^\/]*\.)?richards-realm-com-cs\.blogspot\.com
+https?:\/\/([^\/]*\.)?riclarol\.dl\.pl
+https?:\/\/([^\/]*\.)?ricostruzione-unghia\.hostzz\.info
+https?:\/\/([^\/]*\.)?ricrelnel\.frbb\.net
+https?:\/\/([^\/]*\.)?rictaget\.uy\.pl
+https?:\/\/([^\/]*\.)?rictrocvar\.zikforum\.com
+https?:\/\/([^\/]*\.)?riczelur\.forumzen\.com
+https?:\/\/([^\/]*\.)?ridiaulctions\.blogspot\.com
+https?:\/\/([^\/]*\.)?right-leg-swelling\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?rigour\.info
+https?:\/\/([^\/]*\.)?rijulina\.dl\.pl
+https?:\/\/([^\/]*\.)?ring-tonecti\.blogspot\.com
+https?:\/\/([^\/]*\.)?ring2man\.chat\.ru
+https?:\/\/([^\/]*\.)?ring4man\.chat\.ru
+https?:\/\/([^\/]*\.)?ring4tel\.com
+https?:\/\/([^\/]*\.)?ringg\.info
+https?:\/\/([^\/]*\.)?ringtones-4phone\.com
+https?:\/\/([^\/]*\.)?ringtones-dir\.com
+https?:\/\/([^\/]*\.)?ringtones-dir\.net
+https?:\/\/([^\/]*\.)?ringtones-for-a-samsungtwt\.blogspot\.com
+https?:\/\/([^\/]*\.)?ringtones-rate\.com
+https?:\/\/([^\/]*\.)?ringtones\.blogharbor\.com
+https?:\/\/([^\/]*\.)?ringts\.269g\.net
+https?:\/\/([^\/]*\.)?risajno\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?risque-sexy-plus-size-lingerie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?rit\.edu
+https?:\/\/([^\/]*\.)?ritalin-without-prescription\.contact\.cc
+https?:\/\/([^\/]*\.)?ritalin\.myvnc\.com
+https?:\/\/([^\/]*\.)?river-road-motorcycle-boot\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?river\.greatfreehosting\.com
+https?:\/\/([^\/]*\.)?rivotril\.int\.tf
+https?:\/\/([^\/]*\.)?rm-ast-pants\.blogspot\.com
+https?:\/\/([^\/]*\.)?rmsq9\.szm\.sk
+https?:\/\/([^\/]*\.)?rmuuur3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rndk1\.szm\.sk
+https?:\/\/([^\/]*\.)?rnmg6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ro-westin\.blogspot\.com
+https?:\/\/([^\/]*\.)?robotqueen\.250free\.com
+https?:\/\/([^\/]*\.)?rochili\.alkablog\.com
+https?:\/\/([^\/]*\.)?rodar6or6\.dl\.pl
+https?:\/\/([^\/]*\.)?rodvww7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rogetou\.dl\.pl
+https?:\/\/([^\/]*\.)?rojeracr\.forumzen\.com
+https?:\/\/([^\/]*\.)?roketplanet\.weedns\.com
+https?:\/\/([^\/]*\.)?rokminric\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?rokzecdok\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?rolccna\.dl\.pl
+https?:\/\/([^\/]*\.)?rolcnac\.td\.pl
+https?:\/\/([^\/]*\.)?rolex\.heberg-forum\.net
+https?:\/\/([^\/]*\.)?rolexreplica\.269g\.net
+https?:\/\/([^\/]*\.)?rolica\.blogcu\.com
+https?:\/\/([^\/]*\.)?rollaolo\.blogcu\.com
+https?:\/\/([^\/]*\.)?rollatobas\.naturalforum\.net
+https?:\/\/([^\/]*\.)?rolracboc\.bb-fr\.com
+https?:\/\/([^\/]*\.)?roltrsit\.bbfr\.net
+https?:\/\/([^\/]*\.)?rom\.dl\.pl
+https?:\/\/([^\/]*\.)?romahotel\.org
+https?:\/\/([^\/]*\.)?romandie\.com
+https?:\/\/([^\/]*\.)?romanticmaui\.net
+https?:\/\/([^\/]*\.)?room-house\.jeepsyc\.be
+https?:\/\/([^\/]*\.)?root\.dns\.bz
+https?:\/\/([^\/]*\.)?roouvar\.dl\.pl
+https?:\/\/([^\/]*\.)?roricdom\.lightbb\.com
+https?:\/\/([^\/]*\.)?roseofgold52\.50webs\.com
+https?:\/\/([^\/]*\.)?rotl\.info
+https?:\/\/([^\/]*\.)?rotrocrol\.darkbb\.com
+https?:\/\/([^\/]*\.)?roundandbrown-com-bkb03g0hi\.blogspot\.com
+https?:\/\/([^\/]*\.)?roundandbrown-com-kp04\.blogspot\.com
+https?:\/\/([^\/]*\.)?roundandbrown-com-wqzj337l\.blogspot\.com
+https?:\/\/([^\/]*\.)?roundandbrown-com-wus56c\.blogspot\.com
+https?:\/\/([^\/]*\.)?routan\.org
+https?:\/\/([^\/]*\.)?roxyobsessed7\.blogspot\.com
+https?:\/\/([^\/]*\.)?rphqj\.szm\.sk
+https?:\/\/([^\/]*\.)?rqhdnj4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rqpwn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rrefr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rrgr4\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?rrlive\.info
+https?:\/\/([^\/]*\.)?rrsfmw7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rseo7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?rshu2\.szm\.sk
+https?:\/\/([^\/]*\.)?rsmy8\.szm\.sk
+https?:\/\/([^\/]*\.)?rthl0\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?rtugwoy\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ruanjian\.cwrjcn\.com
+https?:\/\/([^\/]*\.)?rucowdena\.ifrance\.com
+https?:\/\/([^\/]*\.)?rudecomputing\.com
+https?:\/\/([^\/]*\.)?rudu-adam\.blogspot\.com
+https?:\/\/([^\/]*\.)?ruimingwei\.com\.cn
+https?:\/\/([^\/]*\.)?rulurbuc\.forumzen\.com
+https?:\/\/([^\/]*\.)?runutr\.forumzen\.com
+https?:\/\/([^\/]*\.)?russiannudesgirlszxa\.blogspot\.com
+https?:\/\/([^\/]*\.)?russiapreteen\.com
+https?:\/\/([^\/]*\.)?russiavista\.sitiasp\.it
+https?:\/\/([^\/]*\.)?rwfe5\.szm\.sk
+https?:\/\/([^\/]*\.)?rxdate\.net
+https?:\/\/([^\/]*\.)?rxdfh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ryehfpz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ryhgsb\.com
+https?:\/\/([^\/]*\.)?ryryj\.szm\.sk
+https?:\/\/([^\/]*\.)?ryu-jounetsu\.blogspot\.com
+https?:\/\/([^\/]*\.)?rzwj8\.szm\.sk
+https?:\/\/([^\/]*\.)?s-r-free-porn-movie-clip-x\.blogspot\.com
+https?:\/\/([^\/]*\.)?s1xbucksamonkey\.blogspot\.com
+https?:\/\/([^\/]*\.)?s32\.bilsay\.com
+https?:\/\/([^\/]*\.)?saaaaa\.52blog\.net
+https?:\/\/([^\/]*\.)?safety-product\.hotmail\.ru
+https?:\/\/([^\/]*\.)?safety-product\.pochta\.ru
+https?:\/\/([^\/]*\.)?safety_product\.chat\.ru
+https?:\/\/([^\/]*\.)?sahezzz\.blogspot\.com
+https?:\/\/([^\/]*\.)?saibon\.com\.cn
+https?:\/\/([^\/]*\.)?sakura-watanuki\.blogspot\.com
+https?:\/\/([^\/]*\.)?salewroughtiron\.cn
+https?:\/\/([^\/]*\.)?sample-porn-clip-newst1x\.blogspot\.com
+https?:\/\/([^\/]*\.)?sample-porn-clip-zoneapa\.blogspot\.com
+https?:\/\/([^\/]*\.)?samsung-ringtonedta\.blogspot\.com
+https?:\/\/([^\/]*\.)?sand-stars\.blogspot\.com
+https?:\/\/([^\/]*\.)?sandra-teen-model-qux\.blogspot\.com
+https?:\/\/([^\/]*\.)?sangrandy\.com
+https?:\/\/([^\/]*\.)?sanhy\.com
+https?:\/\/([^\/]*\.)?sanpaulo\.flnet\.org
+https?:\/\/([^\/]*\.)?santjhon\.php5\.cz
+https?:\/\/([^\/]*\.)?sapphiceroticacom\.klose\.ipupdater\.com
+https?:\/\/([^\/]*\.)?sapphicparadise-com-r00asy\.blogspot\.com
+https?:\/\/([^\/]*\.)?sarobo\.com
+https?:\/\/([^\/]*\.)?satellite-tv\.hotmail\.ru
+https?:\/\/([^\/]*\.)?sauna-eq\.boom\.ru
+https?:\/\/([^\/]*\.)?sauna-heater\.boom\.ru
+https?:\/\/([^\/]*\.)?sauna-kit\.boom\.ru
+https?:\/\/([^\/]*\.)?sauna-room\.boom\.ru
+https?:\/\/([^\/]*\.)?saunaguide\.org
+https?:\/\/([^\/]*\.)?save-on-auto-insurance\.info
+https?:\/\/([^\/]*\.)?saved\.ddns\.info
+https?:\/\/([^\/]*\.)?sbarzn3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?scanthenet\.com
+https?:\/\/([^\/]*\.)?scat-fetish-story\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?school-driving\.info
+https?:\/\/([^\/]*\.)?school-girl-butt\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?school2home\.chat\.ru
+https?:\/\/([^\/]*\.)?sciensezero\.republika\.pl
+https?:\/\/([^\/]*\.)?scnh6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?scooter11\.chat\.ru
+https?:\/\/([^\/]*\.)?scooter2\.hotmail\.ru
+https?:\/\/([^\/]*\.)?screwedupmovies-com-a5wj\.blogspot\.com
+https?:\/\/([^\/]*\.)?screwedupmovies-com-ax\.blogspot\.com
+https?:\/\/([^\/]*\.)?scripts-cert\.mit\.edu
+https?:\/\/([^\/]*\.)?scscj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sdao7\.szm\.sk
+https?:\/\/([^\/]*\.)?sdfr0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sdfsfssss\.com
+https?:\/\/([^\/]*\.)?se4u\.net
+https?:\/\/([^\/]*\.)?seafordmed\.info
+https?:\/\/([^\/]*\.)?seainsurancegroup\.info
+https?:\/\/([^\/]*\.)?search4sex\.us
+https?:\/\/([^\/]*\.)?searchbigtits-com-apxd1hwatd\.blogspot\.com
+https?:\/\/([^\/]*\.)?searchbigtits-com-obraj\.blogspot\.com
+https?:\/\/([^\/]*\.)?searcheng\.com
+https?:\/\/([^\/]*\.)?searcheon\.com
+https?:\/\/([^\/]*\.)?searchgalleries-com-i7\.blogspot\.com
+https?:\/\/([^\/]*\.)?searchgalleries-com-ib2bi6on5\.blogspot\.com
+https?:\/\/([^\/]*\.)?searchgals-com-gu1810j\.blogspot\.com
+https?:\/\/([^\/]*\.)?searcholdies-com-msa\.blogspot\.com
+https?:\/\/([^\/]*\.)?searchsuperhit\.com
+https?:\/\/([^\/]*\.)?searchvids-com-h47g8mf\.blogspot\.com
+https?:\/\/([^\/]*\.)?seasonale\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?secure-network\.info
+https?:\/\/([^\/]*\.)?seeallhomes\.com
+https?:\/\/([^\/]*\.)?seeallnatural\.com
+https?:\/\/([^\/]*\.)?seeallsite\.com
+https?:\/\/([^\/]*\.)?seecomplete\.com
+https?:\/\/([^\/]*\.)?seehersquirt-com-k0\.blogspot\.com
+https?:\/\/([^\/]*\.)?seehersquirt-com-k3\.blogspot\.com
+https?:\/\/([^\/]*\.)?seekcounty\.com
+https?:\/\/([^\/]*\.)?seeyo\.info
+https?:\/\/([^\/]*\.)?segbqj1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sege-addison\.blogspot\.com
+https?:\/\/([^\/]*\.)?seho-aiyana\.blogspot\.com
+https?:\/\/([^\/]*\.)?sekapad\.info
+https?:\/\/([^\/]*\.)?sekbad\.info
+https?:\/\/([^\/]*\.)?selfbuying\.com
+https?:\/\/([^\/]*\.)?semarqua\.dl\.pl
+https?:\/\/([^\/]*\.)?senapier\.dl\.pl
+https?:\/\/([^\/]*\.)?send-flowers\.acb\.pl
+https?:\/\/([^\/]*\.)?sendon\.net\.cn
+https?:\/\/([^\/]*\.)?senlu\.com
+https?:\/\/([^\/]*\.)?sensorscity\.marshall\.edu
+https?:\/\/([^\/]*\.)?seo\.ohsu\.edu
+https?:\/\/([^\/]*\.)?seo88\.com
+https?:\/\/([^\/]*\.)?seomdahi\.jconserv\.net
+https?:\/\/([^\/]*\.)?seozone\.net
+https?:\/\/([^\/]*\.)?seranton\.blogspot\.com
+https?:\/\/([^\/]*\.)?sercheng\.com
+https?:\/\/([^\/]*\.)?serchlid\.com
+https?:\/\/([^\/]*\.)?serious-skin\.boom\.ru
+https?:\/\/([^\/]*\.)?serts\.blogshot\.nl
+https?:\/\/([^\/]*\.)?servemp3\.com
+https?:\/\/([^\/]*\.)?serversolutions\.us
+https?:\/\/([^\/]*\.)?servitch\.com
+https?:\/\/([^\/]*\.)?ses1\.info
+https?:\/\/([^\/]*\.)?sestrenish\.biografi\.org
+https?:\/\/([^\/]*\.)?setara\.dl\.pl
+https?:\/\/([^\/]*\.)?seventeenlive-com-bado3i\.blogspot\.com
+https?:\/\/([^\/]*\.)?seventeenlive-com-bmg\.blogspot\.com
+https?:\/\/([^\/]*\.)?seventeenlive-com-h4dw652dzl\.blogspot\.com
+https?:\/\/([^\/]*\.)?severnfollow\.info
+https?:\/\/([^\/]*\.)?sevtentoe\.blogspot\.com
+https?:\/\/([^\/]*\.)?sewingmachinesusa\.com
+https?:\/\/([^\/]*\.)?sex--x\.com
+https?:\/\/([^\/]*\.)?sex-clip-ce872\.blogspot\.com
+https?:\/\/([^\/]*\.)?sex-dating\.sexnation\.info
+https?:\/\/([^\/]*\.)?sex-movie-e8qbm\.blogspot\.com
+https?:\/\/([^\/]*\.)?sex-movie-qig\.blogspot\.com
+https?:\/\/([^\/]*\.)?sex-video-clip-haq3r\.blogspot\.com
+https?:\/\/([^\/]*\.)?sex-video-juz\.blogspot\.com
+https?:\/\/([^\/]*\.)?sex-without-condom\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?sex-woman-only-fuck\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?sex-xxx-free\.100freemb\.com
+https?:\/\/([^\/]*\.)?sex\.yeahost\.com
+https?:\/\/([^\/]*\.)?sex1movie\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexadultdating\.com
+https?:\/\/([^\/]*\.)?sexape-bpb0\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexape-com-chdaj7\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexape-com-cz4z44iud3\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexape-com-kw7623jxvd\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexape-com-qipil\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexape-mte7jm\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexdirectory-com-tbt0\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexegirls\.net
+https?:\/\/([^\/]*\.)?sexgrannies-com-d17v0sa\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexgrannies-com-dvg3lh0\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexmaxx-com-w2aoe7q\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexmaxx-com-w7\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexmaxx-com-wy23e2588\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexmaxx-kvhilzx76\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexnemo-com-joxud\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexnemo-com-r7iv5\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexnemo-com-rpj18ot\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexo-anal-teen\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?sexoasis-a00r68ac\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexoasis-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexoasis-hkz6z4fmr6\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-com-e2zci5\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-com-ew426c7qej\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-com-itvux\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-com-r6fjn1dz\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean-ibf53b\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexocean000\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexy-ass-and-leg\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?sexy-blonde-big-tit\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?sexy-busty-hot\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?sexy-knee-high-boot\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?sexy-leg-xxx\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?sexy-lesbian-having-sex\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?sexy-models-net-g13hqljr0\.blogspot\.com
+https?:\/\/([^\/]*\.)?sexy-teacher\.net
+https?:\/\/([^\/]*\.)?sexy\.dastish\.org
+https?:\/\/([^\/]*\.)?sexyst\.info
+https?:\/\/([^\/]*\.)?sfjo7\.szm\.sk
+https?:\/\/([^\/]*\.)?sftic\.szm\.sk
+https?:\/\/([^\/]*\.)?sfzone\.cn
+https?:\/\/([^\/]*\.)?sgkr3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?shaffelrecords\.com
+https?:\/\/([^\/]*\.)?shahang\.net
+https?:\/\/([^\/]*\.)?shakira-pa3t\.blogspot\.com
+https?:\/\/([^\/]*\.)?shakirafortner\.hostingweb\.us
+https?:\/\/([^\/]*\.)?shampoo\.moistri\.be
+https?:\/\/([^\/]*\.)?shavedgoat-com-hlfai1dvfb\.blogspot\.com
+https?:\/\/([^\/]*\.)?shbuscenter\.com
+https?:\/\/([^\/]*\.)?shcarcenter\.com
+https?:\/\/([^\/]*\.)?shdianjiang\.cn
+https?:\/\/([^\/]*\.)?sheji\.paim123\.com
+https?:\/\/([^\/]*\.)?shemale-action\.net
+https?:\/\/([^\/]*\.)?shemale-ebony-fuck\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?shemale-fuck-guys-com\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?shemale-no-cock\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?shemalefuckguy\.isabel\.dtdns\.net
+https?:\/\/([^\/]*\.)?shemales\.coz\.in
+https?:\/\/([^\/]*\.)?shemp-com-k1yng8\.blogspot\.com
+https?:\/\/([^\/]*\.)?shemp-com-kcutd\.blogspot\.com
+https?:\/\/([^\/]*\.)?shemp-com-zuhig\.blogspot\.com
+https?:\/\/([^\/]*\.)?shenzhenjp\.com
+https?:\/\/([^\/]*\.)?shesexy-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy-com-i1xf\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy-com-rugok\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy-com-w0dffbvzz\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy-gogub\.blogspot\.com
+https?:\/\/([^\/]*\.)?shesexy000\.blogspot\.com
+https?:\/\/([^\/]*\.)?shetelel\.jconserv\.net
+https?:\/\/([^\/]*\.)?shexpo2010\.com
+https?:\/\/([^\/]*\.)?shijiren\.com
+https?:\/\/([^\/]*\.)?shinylights\.org
+https?:\/\/([^\/]*\.)?shipeng\.net
+https?:\/\/([^\/]*\.)?shmoorge\.tripod\.com
+https?:\/\/([^\/]*\.)?shoesnike\.cn
+https?:\/\/([^\/]*\.)?shoesorder\.biz
+https?:\/\/([^\/]*\.)?shoesshop\.biz
+https?:\/\/([^\/]*\.)?shop24x7\.net
+https?:\/\/([^\/]*\.)?short-porn-clip-news8rj\.blogspot\.com
+https?:\/\/([^\/]*\.)?shoujicaixin\.com
+https?:\/\/([^\/]*\.)?shplaycenter\.cn
+https?:\/\/([^\/]*\.)?shredder-4paper\.boom\.ru
+https?:\/\/([^\/]*\.)?shredder-paper\.boom\.ru
+https?:\/\/([^\/]*\.)?shredder\.boom\.ru
+https?:\/\/([^\/]*\.)?shredder4paper\.chat\.ru
+https?:\/\/([^\/]*\.)?shrentcar\.com
+https?:\/\/([^\/]*\.)?shrudant\.jconserv\.net
+https?:\/\/([^\/]*\.)?shticketcenter\.com
+https?:\/\/([^\/]*\.)?shtiklmiaou\.fizwig\.com
+https?:\/\/([^\/]*\.)?shtranslate\.com
+https?:\/\/([^\/]*\.)?shufflequince\.org
+https?:\/\/([^\/]*\.)?siamforum\.com
+https?:\/\/([^\/]*\.)?siek2\.szm\.sk
+https?:\/\/([^\/]*\.)?sifa600\.com
+https?:\/\/([^\/]*\.)?sigla-cartoni-animati\.19mb\.info
+https?:\/\/([^\/]*\.)?sijalik\.blogspot\.com
+https?:\/\/([^\/]*\.)?sik-sapphicparadise-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?sildenafil-citrate\.perso\.tc
+https?:\/\/([^\/]*\.)?siliconpulse\.info
+https?:\/\/([^\/]*\.)?silly-n\.blogspot\.com
+https?:\/\/([^\/]*\.)?simply-gamine\.hostingweb\.us
+https?:\/\/([^\/]*\.)?simtershrapnel\.blogspot\.com
+https?:\/\/([^\/]*\.)?sinbiom\.blogspot\.com
+https?:\/\/([^\/]*\.)?sindyhalliday\.com
+https?:\/\/([^\/]*\.)?sinequanwithdrawal\.sblog\.cz
+https?:\/\/([^\/]*\.)?sineto\.net
+https?:\/\/([^\/]*\.)?sinfulcurves-com-obh\.blogspot\.com
+https?:\/\/([^\/]*\.)?singova\.org
+https?:\/\/([^\/]*\.)?siq-xxlmovies-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?sirloincentury\.org
+https?:\/\/([^\/]*\.)?sisus\.org
+https?:\/\/([^\/]*\.)?sitacsit\.goodforum\.net
+https?:\/\/([^\/]*\.)?sitacsit\.grafbb\.com
+https?:\/\/([^\/]*\.)?sitchi-or\.xa\.pl
+https?:\/\/([^\/]*\.)?sitdelcna\.lightbb\.com
+https?:\/\/([^\/]*\.)?sitdelta\.jc\.pl
+https?:\/\/([^\/]*\.)?sitdeltroc\.bbfr\.net
+https?:\/\/([^\/]*\.)?site\.voila\.fr
+https?:\/\/([^\/]*\.)?siteapts\.info
+https?:\/\/([^\/]*\.)?sitedating\.org
+https?:\/\/([^\/]*\.)?sitel\.goodforum\.net
+https?:\/\/([^\/]*\.)?sitel\.grafbb\.com
+https?:\/\/([^\/]*\.)?sitladar\.dl\.pl
+https?:\/\/([^\/]*\.)?sitorsit\.discutfree\.com
+https?:\/\/([^\/]*\.)?sittazel\.bb-fr\.com
+https?:\/\/([^\/]*\.)?sj-qh\.com
+https?:\/\/([^\/]*\.)?sjzwz\.com
+https?:\/\/([^\/]*\.)?skbrql5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?skelaxin\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?skelaxin800mg\.sblog\.cz
+https?:\/\/([^\/]*\.)?skin-care-tip\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-care\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?skin-diseas\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-disease\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-disease\.fromru\.com
+https?:\/\/([^\/]*\.)?skin-disease\.newmail\.ru
+https?:\/\/([^\/]*\.)?skin-product\.hotmail\.ru
+https?:\/\/([^\/]*\.)?skin-treat\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-treatm\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-treatment\.boom\.ru
+https?:\/\/([^\/]*\.)?skin-trt\.boom\.ru
+https?:\/\/([^\/]*\.)?skin1-disease\.boom\.ru
+https?:\/\/([^\/]*\.)?skin1disease\.chat\.ru
+https?:\/\/([^\/]*\.)?skin1tip4care\.chat\.ru
+https?:\/\/([^\/]*\.)?skin1treatment\.chat\.ru
+https?:\/\/([^\/]*\.)?skin_product\.chat\.ru
+https?:\/\/([^\/]*\.)?skincare\.ixdm\.info
+https?:\/\/([^\/]*\.)?skodasite\.info
+https?:\/\/([^\/]*\.)?skvonk\.blogspot\.com
+https?:\/\/([^\/]*\.)?skvvdm2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sleep-aids\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?sleepingsex\.coz\.in
+https?:\/\/([^\/]*\.)?slickgalleries-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?slickgalleries-com-acf4a01s86\.blogspot\.com
+https?:\/\/([^\/]*\.)?slots-wiki\.com
+https?:\/\/([^\/]*\.)?slutsvideos-com-mwnyvb2\.blogspot\.com
+https?:\/\/([^\/]*\.)?smack-dvd\.mutogen\.be
+https?:\/\/([^\/]*\.)?smackinghotlips\.blogspot\.com
+https?:\/\/([^\/]*\.)?smal\.php5\.cz
+https?:\/\/([^\/]*\.)?small-bubble-butt\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?smart\.45\.kg
+https?:\/\/([^\/]*\.)?smbay\.cn
+https?:\/\/([^\/]*\.)?smithtownelementarypta\.org
+https?:\/\/([^\/]*\.)?smkpe\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?smlwqj2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?smnvapnd-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?smolyak\.isuisse\.com
+https?:\/\/([^\/]*\.)?sms\.bjicp\.net
+https?:\/\/([^\/]*\.)?smsdown\.blogbus\.com
+https?:\/\/([^\/]*\.)?smut-house-com-c6t8hcv1be\.blogspot\.com
+https?:\/\/([^\/]*\.)?smutgremlins-com-a46sull\.blogspot\.com
+https?:\/\/([^\/]*\.)?smutgremlins-com-w6d7m6ji\.blogspot\.com
+https?:\/\/([^\/]*\.)?smutmaestro\.net
+https?:\/\/([^\/]*\.)?snafusurfer\.net
+https?:\/\/([^\/]*\.)?snakesworld-com-bye\.blogspot\.com
+https?:\/\/([^\/]*\.)?sneakercool\.com
+https?:\/\/([^\/]*\.)?sneakernice\.com
+https?:\/\/([^\/]*\.)?sneck\.info
+https?:\/\/([^\/]*\.)?snkfbl1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?snmcq\.szm\.sk
+https?:\/\/([^\/]*\.)?snorting-ritalin\.contact\.cc
+https?:\/\/([^\/]*\.)?snymk\.szm\.sk
+https?:\/\/([^\/]*\.)?so-big-tit-video-clip-kos\.blogspot\.com
+https?:\/\/([^\/]*\.)?so-home-sex-clip-god\.blogspot\.com
+https?:\/\/([^\/]*\.)?so-so-young-com-kk727o82n\.blogspot\.com
+https?:\/\/([^\/]*\.)?so1di\.info
+https?:\/\/([^\/]*\.)?soafacil\.com
+https?:\/\/([^\/]*\.)?socalmovies-com-enr61t\.blogspot\.com
+https?:\/\/([^\/]*\.)?socalmovies-com-oy08pp72i\.blogspot\.com
+https?:\/\/([^\/]*\.)?soccer-mom-sticker\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?socialsciencedeg\.chat\.ru
+https?:\/\/([^\/]*\.)?socsci\.mccneb\.edu
+https?:\/\/([^\/]*\.)?sodo0\.szm\.sk
+https?:\/\/([^\/]*\.)?sofiefie\.blogspot\.com
+https?:\/\/([^\/]*\.)?soft17-com-d1577f\.blogspot\.com
+https?:\/\/([^\/]*\.)?softcore-erotica\.net
+https?:\/\/([^\/]*\.)?software-engine\.org
+https?:\/\/([^\/]*\.)?softwarematrix\.org
+https?:\/\/([^\/]*\.)?sohardcore-com-r56bt\.blogspot\.com
+https?:\/\/([^\/]*\.)?soho0\.szm\.sk
+https?:\/\/([^\/]*\.)?solacemysoul\.blogspot\.com
+https?:\/\/([^\/]*\.)?solder\.lowestprices\.at
+https?:\/\/([^\/]*\.)?soler\.net\.cn
+https?:\/\/([^\/]*\.)?sologals-com-hs2xad\.blogspot\.com
+https?:\/\/([^\/]*\.)?sologals-grr5g3\.blogspot\.com
+https?:\/\/([^\/]*\.)?soma\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?soma\.homelinux\.com
+https?:\/\/([^\/]*\.)?soma\.int\.tf
+https?:\/\/([^\/]*\.)?soma\.php5\.cz
+https?:\/\/([^\/]*\.)?soma1\.skocz\.net
+https?:\/\/([^\/]*\.)?someshit\.ru
+https?:\/\/([^\/]*\.)?somqyxli-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?sonata\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?sonr4\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?sotremont\.ru
+https?:\/\/([^\/]*\.)?soulswallo\.blogspot\.com
+https?:\/\/([^\/]*\.)?soundandmossl\.com
+https?:\/\/([^\/]*\.)?southcarolinamortgage-x\.com
+https?:\/\/([^\/]*\.)?southdakotamortgage-x\.com
+https?:\/\/([^\/]*\.)?southtecrepair\.com
+https?:\/\/([^\/]*\.)?spacedim68\.blogspot\.com
+https?:\/\/([^\/]*\.)?spamim\.net
+https?:\/\/([^\/]*\.)?spawww\.info
+https?:\/\/([^\/]*\.)?spcw3\.szm\.sk
+https?:\/\/([^\/]*\.)?special-ringtones\.net
+https?:\/\/([^\/]*\.)?specific911\.biz
+https?:\/\/([^\/]*\.)?specific911\.org
+https?:\/\/([^\/]*\.)?speed-casino\.com
+https?:\/\/([^\/]*\.)?speens\.pass\.as
+https?:\/\/([^\/]*\.)?spermicide-trojan-condom\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?spermshack-al\.blogspot\.com
+https?:\/\/([^\/]*\.)?spermshack-com-bef\.blogspot\.com
+https?:\/\/([^\/]*\.)?spermshack-com-gee1\.blogspot\.com
+https?:\/\/([^\/]*\.)?spermshack-com-gtafrogps\.blogspot\.com
+https?:\/\/([^\/]*\.)?spermshack-g01u1\.blogspot\.com
+https?:\/\/([^\/]*\.)?spewie-com-mbntjlrkk\.blogspot\.com
+https?:\/\/([^\/]*\.)?spfwq\.zhengstar\.com
+https?:\/\/([^\/]*\.)?spice-girlpkg\.blogspot\.com
+https?:\/\/([^\/]*\.)?spirit-of-llama\.blogspot\.com
+https?:\/\/([^\/]*\.)?spirit-psyki\.ifrance\.com
+https?:\/\/([^\/]*\.)?spiserch\.com
+https?:\/\/([^\/]*\.)?splashka\.xhostar\.com
+https?:\/\/([^\/]*\.)?splendid-casino\.com
+https?:\/\/([^\/]*\.)?spoilzone\.epinoy\.com
+https?:\/\/([^\/]*\.)?spqi6\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?sprint-ringtonenot\.blogspot\.com
+https?:\/\/([^\/]*\.)?sprintringtonesxvt\.blogspot\.com
+https?:\/\/([^\/]*\.)?sprintringtoneuad\.blogspot\.com
+https?:\/\/([^\/]*\.)?spstestfree\.com\.com
+https?:\/\/([^\/]*\.)?spunkmonster\.net
+https?:\/\/([^\/]*\.)?spwnk\.szm\.sk
+https?:\/\/([^\/]*\.)?spxqly9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?spyware-adware-killer\.com
+https?:\/\/([^\/]*\.)?sqoi8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?squall\.my10gb\.com
+https?:\/\/([^\/]*\.)?sqvde\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sralua\.com
+https?:\/\/([^\/]*\.)?srarware\.com
+https?:\/\/([^\/]*\.)?srkyyca\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?srtongje\.republika\.pl
+https?:\/\/([^\/]*\.)?sruqsz3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ssdcard\.info
+https?:\/\/([^\/]*\.)?sslive\.info
+https?:\/\/([^\/]*\.)?sspwye7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sswingersss-777\.tripod\.com
+https?:\/\/([^\/]*\.)?st-pharmacy\.com
+https?:\/\/([^\/]*\.)?staa8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?staff\.jccc\.edu
+https?:\/\/([^\/]*\.)?stainlesssteelpipe\.net
+https?:\/\/([^\/]*\.)?stampa-foto-digitale\.ll11\.info
+https?:\/\/([^\/]*\.)?starcelebs-com-ewe5\.blogspot\.com
+https?:\/\/([^\/]*\.)?starcelebs-com-i3a2mxf\.blogspot\.com
+https?:\/\/([^\/]*\.)?starcelebs-wihuk\.blogspot\.com
+https?:\/\/([^\/]*\.)?starryland\.com\.cn
+https?:\/\/([^\/]*\.)?startchicks\.info
+https?:\/\/([^\/]*\.)?state-gay-marriage-legal\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?state-of-germany\.com
+https?:\/\/([^\/]*\.)?statisticpal\.com
+https?:\/\/([^\/]*\.)?stcc9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?steeen-s-bl\.blogspot\.com
+https?:\/\/([^\/]*\.)?steel-table-leg\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?stocking-fetish-video\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?stocking-movies-com-du1\.blogspot\.com
+https?:\/\/([^\/]*\.)?stocking-tease-b7gl\.blogspot\.com
+https?:\/\/([^\/]*\.)?stocking-tease-com-bm6h145g\.blogspot\.com
+https?:\/\/([^\/]*\.)?stockings\.coz\.in
+https?:\/\/([^\/]*\.)?stop-smoking\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?stpetersburg\.it
+https?:\/\/([^\/]*\.)?stphipps\.dl\.pl
+https?:\/\/([^\/]*\.)?strakac\.dtdns\.net
+https?:\/\/([^\/]*\.)?strange-bizarre-things\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?stranieriinitalia\.org
+https?:\/\/([^\/]*\.)?straponpost\.net
+https?:\/\/([^\/]*\.)?street-poker\.com
+https?:\/\/([^\/]*\.)?streetmp3\.com
+https?:\/\/([^\/]*\.)?strega\.us
+https?:\/\/([^\/]*\.)?strip-tease-video-bb-bb-z\.blogspot\.com
+https?:\/\/([^\/]*\.)?strongsong\.republika\.pl
+https?:\/\/([^\/]*\.)?structure-settlement\.hotmail\.ru
+https?:\/\/([^\/]*\.)?sts\.ucsd\.edu
+https?:\/\/([^\/]*\.)?students\.hsc\.unt\.edu
+https?:\/\/([^\/]*\.)?study-us\.cn
+https?:\/\/([^\/]*\.)?stvincent\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?stydx\.szm\.sk
+https?:\/\/([^\/]*\.)?sublimedirectory-com-otb\.blogspot\.com
+https?:\/\/([^\/]*\.)?sublimemovies-com-wdvh2wmm3\.blogspot\.com
+https?:\/\/([^\/]*\.)?sublimepie-com-e8g3dw2\.blogspot\.com
+https?:\/\/([^\/]*\.)?sudanportal\.mrcc\.aast\.edu
+https?:\/\/([^\/]*\.)?suede-cowboy-boot\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?suicidexlove\.blogspot\.com
+https?:\/\/([^\/]*\.)?sumeshi0206\.dyndns\.org
+https?:\/\/([^\/]*\.)?sunaseth\.blogspot\.com
+https?:\/\/([^\/]*\.)?sunp\.com
+https?:\/\/([^\/]*\.)?sunporno-com-avbxn\.blogspot\.com
+https?:\/\/([^\/]*\.)?sunporno-com-go5\.blogspot\.com
+https?:\/\/([^\/]*\.)?sunsetdreamscondo\.com
+https?:\/\/([^\/]*\.)?sunsky365\.net
+https?:\/\/([^\/]*\.)?superadultdirect\.info
+https?:\/\/([^\/]*\.)?supercalcinhas-com-rij\.blogspot\.com
+https?:\/\/([^\/]*\.)?superdiosas-com-tm5k7f1v3\.blogspot\.com
+https?:\/\/([^\/]*\.)?superfinancesolutions\.com
+https?:\/\/([^\/]*\.)?supergirls\.pochta\.ru
+https?:\/\/([^\/]*\.)?superha\.angelcities\.com
+https?:\/\/([^\/]*\.)?superinsuranceworld\.info
+https?:\/\/([^\/]*\.)?superinternetexplorer\.info
+https?:\/\/([^\/]*\.)?supershare\.cn
+https?:\/\/([^\/]*\.)?suphost\.info
+https?:\/\/([^\/]*\.)?supplements\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?supplements\.mylonso\.be
+https?:\/\/([^\/]*\.)?supplierlist\.com
+https?:\/\/([^\/]*\.)?surfacing\.101freehost\.com
+https?:\/\/([^\/]*\.)?surmontil\.sblog\.cz
+https?:\/\/([^\/]*\.)?suxwyj-free-porn\.blogspot\.com
+https?:\/\/([^\/]*\.)?suzoro-amateur-sex-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?suzulan\.blogspot\.com
+https?:\/\/([^\/]*\.)?svetys9i\.125mb\.com
+https?:\/\/([^\/]*\.)?svike\.info
+https?:\/\/([^\/]*\.)?swdella\.ifrance\.com
+https?:\/\/([^\/]*\.)?swechat\.republika\.pl
+https?:\/\/([^\/]*\.)?sweet-krissy\.babubi\.net
+https?:\/\/([^\/]*\.)?sweetpniangel87\.blogspot\.com
+https?:\/\/([^\/]*\.)?swingersadult\.net
+https?:\/\/([^\/]*\.)?sx\.nazari\.org
+https?:\/\/([^\/]*\.)?sx\.z0rz\.com
+https?:\/\/([^\/]*\.)?sxwliwe\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?sy-casino\.com
+https?:\/\/([^\/]*\.)?sygz\.51mp4mp3\.com
+https?:\/\/([^\/]*\.)?sylvan-queen\.iespana\.es
+https?:\/\/([^\/]*\.)?symphony\.8tt\.org
+https?:\/\/([^\/]*\.)?symptom-of-allergic-reaction-to-latex-condom\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?symy\.jp
+https?:\/\/([^\/]*\.)?synnin-viemaa\.blogspot\.com
+https?:\/\/([^\/]*\.)?sz-cj\.com
+https?:\/\/([^\/]*\.)?sz-dongtai\.com
+https?:\/\/([^\/]*\.)?sz-tianyicn\.com
+https?:\/\/([^\/]*\.)?sz4a\.cn
+https?:\/\/([^\/]*\.)?szarts\.com
+https?:\/\/([^\/]*\.)?szbeiyang\.net
+https?:\/\/([^\/]*\.)?szhangkong\.com
+https?:\/\/([^\/]*\.)?szhjc\.net
+https?:\/\/([^\/]*\.)?szhowfine\.com
+https?:\/\/([^\/]*\.)?szhx\.ebloggy\.com
+https?:\/\/([^\/]*\.)?szhxseo\.com
+https?:\/\/([^\/]*\.)?szjiuli\.com
+https?:\/\/([^\/]*\.)?szjiuli\.ebloggy\.com
+https?:\/\/([^\/]*\.)?szjpnet\.ebloggy\.com
+https?:\/\/([^\/]*\.)?szjyhk\.com
+https?:\/\/([^\/]*\.)?szlawyer\.home4u\.china\.com
+https?:\/\/([^\/]*\.)?szlichuang\.cn
+https?:\/\/([^\/]*\.)?szlszx\.com
+https?:\/\/([^\/]*\.)?sznuts\.cn
+https?:\/\/([^\/]*\.)?szpptc\.com
+https?:\/\/([^\/]*\.)?szsc-car\.com
+https?:\/\/([^\/]*\.)?szsfbq\.com
+https?:\/\/([^\/]*\.)?szyongjin\.ebloggy\.com
+https?:\/\/([^\/]*\.)?szzhuce\.home4u\.china\.com
+https?:\/\/([^\/]*\.)?t-sonnaya\.blogspot\.com
+https?:\/\/([^\/]*\.)?t-teens-for\.blogspot\.com
+https?:\/\/([^\/]*\.)?t\.tl
+https?:\/\/([^\/]*\.)?tabarlie\.forumzen\.com
+https?:\/\/([^\/]*\.)?tabgand\.info
+https?:\/\/([^\/]*\.)?tablitki\.xwiki\.com
+https?:\/\/([^\/]*\.)?taboo-porn-clip-blogeq2\.blogspot\.com
+https?:\/\/([^\/]*\.)?tackle\.247ihost\.com
+https?:\/\/([^\/]*\.)?tacomanissansubaru\.info
+https?:\/\/([^\/]*\.)?tactroc\.dl\.pl
+https?:\/\/([^\/]*\.)?tadalafil-\.ql\.st
+https?:\/\/([^\/]*\.)?tadalafil\.scanthenet\.com
+https?:\/\/([^\/]*\.)?tadalafil\.skocz\.net
+https?:\/\/([^\/]*\.)?tadalafil35\.lookscool\.com
+https?:\/\/([^\/]*\.)?taefis\.com
+https?:\/\/([^\/]*\.)?tagetboc\.darkbb\.com
+https?:\/\/([^\/]*\.)?talj5\.szm\.sk
+https?:\/\/([^\/]*\.)?tanoli\.su\.pl
+https?:\/\/([^\/]*\.)?tanorol\.dl\.pl
+https?:\/\/([^\/]*\.)?taouolo\.dl\.pl
+https?:\/\/([^\/]*\.)?tapz3\.szm\.sk
+https?:\/\/([^\/]*\.)?taracdom\.heavenforum\.com
+https?:\/\/([^\/]*\.)?tarfol\.com
+https?:\/\/([^\/]*\.)?target-oo6qbtx\.blogspot\.com
+https?:\/\/([^\/]*\.)?taria-m4j\.blogspot\.com
+https?:\/\/([^\/]*\.)?taricdam\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?tarkupu\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?taroelt\.bb-fr\.com
+https?:\/\/([^\/]*\.)?tarra-i6vqa54v\.blogspot\.com
+https?:\/\/([^\/]*\.)?tart0938\.blogspot\.com
+https?:\/\/([^\/]*\.)?taryn-hgxikm27y\.blogspot\.com
+https?:\/\/([^\/]*\.)?tarzuf\.com
+https?:\/\/([^\/]*\.)?tasculio\.forumzen\.com
+https?:\/\/([^\/]*\.)?tasha-rup0n3a\.blogspot\.com
+https?:\/\/([^\/]*\.)?tashia-w1evjakk7\.blogspot\.com
+https?:\/\/([^\/]*\.)?tasia-emtoy\.blogspot\.com
+https?:\/\/([^\/]*\.)?tasimd\.com
+https?:\/\/([^\/]*\.)?tasizuwann-tm7y\.blogspot\.com
+https?:\/\/([^\/]*\.)?tasnin\.com
+https?:\/\/([^\/]*\.)?tate-dt\.blogspot\.com
+https?:\/\/([^\/]*\.)?tateyana-c8s1ms4ai\.blogspot\.com
+https?:\/\/([^\/]*\.)?tateyona-br48\.blogspot\.com
+https?:\/\/([^\/]*\.)?tatrocbas\.dl\.pl
+https?:\/\/([^\/]*\.)?tatrocmon\.dl\.pl
+https?:\/\/([^\/]*\.)?tattoo-ojqmc35d\.blogspot\.com
+https?:\/\/([^\/]*\.)?tatum-mlzsfqw\.blogspot\.com
+https?:\/\/([^\/]*\.)?tatumn-i4anj15\.blogspot\.com
+https?:\/\/([^\/]*\.)?tatyiana-kwg0ud8fqf\.blogspot\.com
+https?:\/\/([^\/]*\.)?tauntianna-h6\.blogspot\.com
+https?:\/\/([^\/]*\.)?taurus-gx\.blogspot\.com
+https?:\/\/([^\/]*\.)?tayamarn\.blogspot\.com
+https?:\/\/([^\/]*\.)?taydem-wdm6rxd328\.blogspot\.com
+https?:\/\/([^\/]*\.)?taydra-ejk45\.blogspot\.com
+https?:\/\/([^\/]*\.)?tayla-t7b\.blogspot\.com
+https?:\/\/([^\/]*\.)?tayler-cfez\.blogspot\.com
+https?:\/\/([^\/]*\.)?taylor-bof5\.blogspot\.com
+https?:\/\/([^\/]*\.)?taylorbow-com-il3f4ae\.blogspot\.com
+https?:\/\/([^\/]*\.)?taylorbow-com-inbg2nw\.blogspot\.com
+https?:\/\/([^\/]*\.)?taynafrates\.freetzi\.com
+https?:\/\/([^\/]*\.)?taysha-avsm8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tazman-m6\.blogspot\.com
+https?:\/\/([^\/]*\.)?tbgbnt5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tbns\.net
+https?:\/\/([^\/]*\.)?tbrgxjv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tcsgn\.szm\.sk
+https?:\/\/([^\/]*\.)?tczxwwz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tczxxm6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tdzkzkt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tdzl\.sunp\.com
+https?:\/\/([^\/]*\.)?tea-imk7ry1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tea-pot\.keckins\.be
+https?:\/\/([^\/]*\.)?teacher-fucking-free\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?teacher-km\.blogspot\.com
+https?:\/\/([^\/]*\.)?teaching1degree\.chat\.ru
+https?:\/\/([^\/]*\.)?teainfo\.org
+https?:\/\/([^\/]*\.)?teamsquirt-com-kjcj3u3i\.blogspot\.com
+https?:\/\/([^\/]*\.)?tear\.hostcroc\.com
+https?:\/\/([^\/]*\.)?tech-txyvo8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tech\.china\.com
+https?:\/\/([^\/]*\.)?techinpet\.blogspot\.com
+https?:\/\/([^\/]*\.)?technical-school\.fromru\.com
+https?:\/\/([^\/]*\.)?technical-school\.hotmail\.ru
+https?:\/\/([^\/]*\.)?technical-school\.newmail\.ru
+https?:\/\/([^\/]*\.)?technical1school\.chat\.ru
+https?:\/\/([^\/]*\.)?teen-anal-cum-shot\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?teen-blonde-beauty\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?teen-blow-job-movie\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?teen-boob-fuck\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?teen-boob-porn\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?teen-buff\.net
+https?:\/\/([^\/]*\.)?teen-chick-masturbating\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?teen-facial-fuck\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?teen-feet-bew\.blogspot\.com
+https?:\/\/([^\/]*\.)?teen-internal-cum-shot\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?teen-kelly-lesbian\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?teen-movie\.freeinsite\.net
+https?:\/\/([^\/]*\.)?teen-porn-clip-newsyk6\.blogspot\.com
+https?:\/\/([^\/]*\.)?teen-sex-movie-f-d-t\.blogspot\.com
+https?:\/\/([^\/]*\.)?teen-sex-video-w8jpk\.blogspot\.com
+https?:\/\/([^\/]*\.)?teen-zips\.babubi\.net
+https?:\/\/([^\/]*\.)?teen6\.vdforum\.ru
+https?:\/\/([^\/]*\.)?teenax-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenax-com-pidoq\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenax-com-rh0ssu62yh\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenax-com-rke6\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenbe-com-bdp\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenbe-com-mb6x\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenbe-com-mh03o\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenblowjobs\.vdforum\.ru
+https?:\/\/([^\/]*\.)?teenboat-com-g6\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenboat-com-g6f103r\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenboat-com-mu1s7p\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenboat-e76l\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenboys-wel\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenel-com-hhd\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenel-com-hq0sgbm\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniefiles-com-g84lu\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniefiles-com-o43\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniefiles-com-ob782u\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniemovies-com-aptqg\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniemovies-com-as\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniemovies-com-hinof\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeniesxxx-b00\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenmodels\.hostingtree\.org
+https?:\/\/([^\/]*\.)?teenporn\.vdforum\.ru
+https?:\/\/([^\/]*\.)?teenpornrur\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenpussyfhv\.blogspot\.com
+https?:\/\/([^\/]*\.)?teens-chat\.info
+https?:\/\/([^\/]*\.)?teens-list-b-all\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenseven-com-c0jvb2z\.blogspot\.com
+https?:\/\/([^\/]*\.)?teensex-com-c4w3g\.blogspot\.com
+https?:\/\/([^\/]*\.)?teensex-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?teensex\.adultserv\.info
+https?:\/\/([^\/]*\.)?teensss-com-b8s44\.blogspot\.com
+https?:\/\/([^\/]*\.)?teensss-com-tds\.blogspot\.com
+https?:\/\/([^\/]*\.)?teensss-com-thrd\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentera-com-d5j3qqs\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentera-com-dyty5cv\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentera-com-w65\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentiger-com-e4e6i2f\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentiger-com-eo602\.blogspot\.com
+https?:\/\/([^\/]*\.)?teentiger-com-fozol\.blogspot\.com
+https?:\/\/([^\/]*\.)?teeny-boppers-club-beg\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenybopperclub-com-bgqk6ejjv\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenybopperclub-com-bukb\.blogspot\.com
+https?:\/\/([^\/]*\.)?teenybopperclub-segod\.blogspot\.com
+https?:\/\/([^\/]*\.)?tegan-d1yagb\.blogspot\.com
+https?:\/\/([^\/]*\.)?tehxm\.szm\.sk
+https?:\/\/([^\/]*\.)?tehya-csxo8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tehyana-bg3\.blogspot\.com
+https?:\/\/([^\/]*\.)?tekd8\.szm\.sk
+https?:\/\/([^\/]*\.)?tekiartur\.xhostar\.com
+https?:\/\/([^\/]*\.)?tekila-a5x7\.blogspot\.com
+https?:\/\/([^\/]*\.)?tela-ou3khz\.blogspot\.com
+https?:\/\/([^\/]*\.)?telenglish\.com\.cn
+https?:\/\/([^\/]*\.)?telephone-ip\.blogspot\.com
+https?:\/\/([^\/]*\.)?telnushka\.blogspot\.com
+https?:\/\/([^\/]*\.)?temazepam\.xwiki\.com
+https?:\/\/([^\/]*\.)?temma-k1n03ege\.blogspot\.com
+https?:\/\/([^\/]*\.)?temp-h33\.blogspot\.com
+https?:\/\/([^\/]*\.)?temptation-gujlu2\.blogspot\.com
+https?:\/\/([^\/]*\.)?ten-ra66722hs5\.blogspot\.com
+https?:\/\/([^\/]*\.)?tenea-w1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tenisha-e6f\.blogspot\.com
+https?:\/\/([^\/]*\.)?tennasa-ttk2oqe4m\.blogspot\.com
+https?:\/\/([^\/]*\.)?tennesseemortgage-x\.com
+https?:\/\/([^\/]*\.)?tennille-dm\.blogspot\.com
+https?:\/\/([^\/]*\.)?tennis-ca8swtk\.blogspot\.com
+https?:\/\/([^\/]*\.)?tenor-saxophone-fingering\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?tenuate\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?teopoo\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?teplomer\.dtdns\.net
+https?:\/\/([^\/]*\.)?tequila-be5\.blogspot\.com
+https?:\/\/([^\/]*\.)?teresanict-oorzzsxmjd\.blogspot\.com
+https?:\/\/([^\/]*\.)?teri-m84ywv38\.blogspot\.com
+https?:\/\/([^\/]*\.)?terika-i10\.blogspot\.com
+https?:\/\/([^\/]*\.)?term-paper\.fromru\.com
+https?:\/\/([^\/]*\.)?term-paper\.nm\.ru
+https?:\/\/([^\/]*\.)?term_paper\.chat\.ru
+https?:\/\/([^\/]*\.)?terminal-h0o2cfsibt\.blogspot\.com
+https?:\/\/([^\/]*\.)?terri-gqdjfrm33d\.blogspot\.com
+https?:\/\/([^\/]*\.)?terrianna-ru\.blogspot\.com
+https?:\/\/([^\/]*\.)?terrin-wmwxu3v\.blogspot\.com
+https?:\/\/([^\/]*\.)?terriona-erbvdaj\.blogspot\.com
+https?:\/\/([^\/]*\.)?terry-tqzto0ek\.blogspot\.com
+https?:\/\/([^\/]*\.)?terryikah-dhw46164c2\.blogspot\.com
+https?:\/\/([^\/]*\.)?terryiona-czcng\.blogspot\.com
+https?:\/\/([^\/]*\.)?terryn-b8p04mxhn2\.blogspot\.com
+https?:\/\/([^\/]*\.)?tess-oybaa0ng\.blogspot\.com
+https?:\/\/([^\/]*\.)?tessa-mugg\.blogspot\.com
+https?:\/\/([^\/]*\.)?test1\.com
+https?:\/\/([^\/]*\.)?test123-kpgwe3vie4\.blogspot\.com
+https?:\/\/([^\/]*\.)?test2-h6qofysx\.blogspot\.com
+https?:\/\/([^\/]*\.)?test2\.com
+https?:\/\/([^\/]*\.)?test3\.com
+https?:\/\/([^\/]*\.)?testmutherfucker\.com
+https?:\/\/([^\/]*\.)?testtest-g14\.blogspot\.com
+https?:\/\/([^\/]*\.)?tetteteent\.blogspot\.com
+https?:\/\/([^\/]*\.)?tettgwk\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?texas-hold-em-winner\.net
+https?:\/\/([^\/]*\.)?texas-hold-em\.black-poker\.com
+https?:\/\/([^\/]*\.)?texas-holdem-poker\.us\.com
+https?:\/\/([^\/]*\.)?texas-holdem-winner\.com
+https?:\/\/([^\/]*\.)?texas-holdem\.black-poker\.com
+https?:\/\/([^\/]*\.)?texas-rvmu1a0\.blogspot\.com
+https?:\/\/([^\/]*\.)?texas-va-loan\.com
+https?:\/\/([^\/]*\.)?texasdad\.com
+https?:\/\/([^\/]*\.)?texasholdem2\.com
+https?:\/\/([^\/]*\.)?texasholdemcenteral\.com
+https?:\/\/([^\/]*\.)?texasholdemsite\.net
+https?:\/\/([^\/]*\.)?texasmortgage-x\.com
+https?:\/\/([^\/]*\.)?teyana-wtpu\.blogspot\.com
+https?:\/\/([^\/]*\.)?teylore-ew24\.blogspot\.com
+https?:\/\/([^\/]*\.)?tez-teenybopperclub-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?tgao2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tgksg\.szm\.sk
+https?:\/\/([^\/]*\.)?tgp-movie-facial\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?tgpprincess\.net
+https?:\/\/([^\/]*\.)?tgpseeker\.net
+https?:\/\/([^\/]*\.)?thailand-t865\.blogspot\.com
+https?:\/\/([^\/]*\.)?thalia-d125yh\.blogspot\.com
+https?:\/\/([^\/]*\.)?thalya-cgjm\.blogspot\.com
+https?:\/\/([^\/]*\.)?thbxg\.szm\.sk
+https?:\/\/([^\/]*\.)?the-amberlady\.blogspot\.com
+https?:\/\/([^\/]*\.)?the-craftman\.blogspot\.com
+https?:\/\/([^\/]*\.)?the-female-orgasm-com-h1sx\.blogspot\.com
+https?:\/\/([^\/]*\.)?the-female-orgasm-com-h8qf5l27j\.blogspot\.com
+https?:\/\/([^\/]*\.)?the-most-biggest-boob-in-the-world\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?the-murderer\.blogspot\.com
+https?:\/\/([^\/]*\.)?the-roulette\.net
+https?:\/\/([^\/]*\.)?theaddedtouch\.net
+https?:\/\/([^\/]*\.)?theaf\.info
+https?:\/\/([^\/]*\.)?theaftor\.com
+https?:\/\/([^\/]*\.)?theag\.info
+https?:\/\/([^\/]*\.)?theap\.info
+https?:\/\/([^\/]*\.)?theas\.info
+https?:\/\/([^\/]*\.)?theat\.info
+https?:\/\/([^\/]*\.)?theaw\.info
+https?:\/\/([^\/]*\.)?thebestjaguar\.info
+https?:\/\/([^\/]*\.)?thebigswallow-com-khcs\.blogspot\.com
+https?:\/\/([^\/]*\.)?thebigswallow-com-kp3hmbl2e\.blogspot\.com
+https?:\/\/([^\/]*\.)?thebondbroker\.info
+https?:\/\/([^\/]*\.)?thecardinaleempire\.com
+https?:\/\/([^\/]*\.)?thechryslerjeep\.info
+https?:\/\/([^\/]*\.)?thedailywash\.blogspot\.com
+https?:\/\/([^\/]*\.)?thedrivingsite\.info
+https?:\/\/([^\/]*\.)?theente\.com
+https?:\/\/([^\/]*\.)?thefiatspider\.info
+https?:\/\/([^\/]*\.)?thehomeworkco\.com
+https?:\/\/([^\/]*\.)?theiconclub\.info
+https?:\/\/([^\/]*\.)?theillegalcause\.blogspot\.com
+https?:\/\/([^\/]*\.)?thejaguarracing\.cn
+https?:\/\/([^\/]*\.)?thejaguarracing\.info
+https?:\/\/([^\/]*\.)?theking-ox0p87\.blogspot\.com
+https?:\/\/([^\/]*\.)?theluckyman\.magnesia\.dtdns\.net
+https?:\/\/([^\/]*\.)?theman-mbvc\.blogspot\.com
+https?:\/\/([^\/]*\.)?themazdaspeed\.info
+https?:\/\/([^\/]*\.)?themoblogs\.com
+https?:\/\/([^\/]*\.)?theofe\.com
+https?:\/\/([^\/]*\.)?theorless\.com
+https?:\/\/([^\/]*\.)?theorrent\.com
+https?:\/\/([^\/]*\.)?thepartyplaza\.info
+https?:\/\/([^\/]*\.)?theresa-ipvfeka0y\.blogspot\.com
+https?:\/\/([^\/]*\.)?thesam118\.blogspot\.com
+https?:\/\/([^\/]*\.)?theseeall\.com
+https?:\/\/([^\/]*\.)?theslots\.biz
+https?:\/\/([^\/]*\.)?thesmart-casino\.com
+https?:\/\/([^\/]*\.)?thesportspark\.net
+https?:\/\/([^\/]*\.)?thessaloni-ka8qpmq7\.blogspot\.com
+https?:\/\/([^\/]*\.)?thestartrekuniverse\.net
+https?:\/\/([^\/]*\.)?thetexasholdpoker\.com
+https?:\/\/([^\/]*\.)?thetrafficproject\.com
+https?:\/\/([^\/]*\.)?thetruevoyeur-com-gkjz2m\.blogspot\.com
+https?:\/\/([^\/]*\.)?thetruevoyeur-com-gy0\.blogspot\.com
+https?:\/\/([^\/]*\.)?thetruevoyeur-com-iuswifnlo\.blogspot\.com
+https?:\/\/([^\/]*\.)?thewarhal\.com
+https?:\/\/([^\/]*\.)?thexe\.info
+https?:\/\/([^\/]*\.)?thexo\.info
+https?:\/\/([^\/]*\.)?thg\.org\.ua
+https?:\/\/([^\/]*\.)?thick-ass-movie\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?thick-ass-stripper\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?thick-black-ass-pic\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?thigh-boot-movie\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?thiyanna-hl74o5m\.blogspot\.com
+https?:\/\/([^\/]*\.)?thomarina-gt\.blogspot\.com
+https?:\/\/([^\/]*\.)?thomas-r6ik\.blogspot\.com
+https?:\/\/([^\/]*\.)?thomasina-wpcw\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongbattle-com-rtrllksm\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongbattle-com-rx2f2tcqrm\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongdreams-com-w0r16sf\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongdreams-com-wq50\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongdreams-com-wx67\.blogspot\.com
+https?:\/\/([^\/]*\.)?thongdreams-com-xehiw\.blogspot\.com
+https?:\/\/([^\/]*\.)?thornblack-eq3a55o4\.blogspot\.com
+https?:\/\/([^\/]*\.)?three-to8p73\.blogspot\.com
+https?:\/\/([^\/]*\.)?threesforest\.blogspot\.com
+https?:\/\/([^\/]*\.)?thugs-djaox\.blogspot\.com
+https?:\/\/([^\/]*\.)?thugz-cqi0x7wkb6\.blogspot\.com
+https?:\/\/([^\/]*\.)?thumbzilla-com-mq\.blogspot\.com
+https?:\/\/([^\/]*\.)?thumbzilla-com-mqtw65e\.blogspot\.com
+https?:\/\/([^\/]*\.)?thumper-bs3t1\.blogspot\.com
+https?:\/\/([^\/]*\.)?thunder-aq\.blogspot\.com
+https?:\/\/([^\/]*\.)?thunder\.hostonmars\.com
+https?:\/\/([^\/]*\.)?thursday-om2jka\.blogspot\.com
+https?:\/\/([^\/]*\.)?thusqus\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?thx1138-mh86v55t2\.blogspot\.com
+https?:\/\/([^\/]*\.)?tia-icc0gbqhya\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiahaat\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tiahnna-kf24x7i4n\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiaja-hr4ci\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiana-g12f0\.blogspot\.com
+https?:\/\/([^\/]*\.)?tianna-r4s2r44e50\.blogspot\.com
+https?:\/\/([^\/]*\.)?tianti\.com\.cn
+https?:\/\/([^\/]*\.)?tiava-com-i60\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiava-com-i73ph\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiava-fiduh\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiava-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiava-tqfgkv74\.blogspot\.com
+https?:\/\/([^\/]*\.)?tibisa-e5d1w5g\.blogspot\.com
+https?:\/\/([^\/]*\.)?ticket\.hostaim\.com
+https?:\/\/([^\/]*\.)?ticketcenter\.cn
+https?:\/\/([^\/]*\.)?tied-gay-bondage\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?tiepin\.my10gb\.com
+https?:\/\/([^\/]*\.)?tieteler\.jconserv\.net
+https?:\/\/([^\/]*\.)?tiffani-dvy3\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiffany-b5arc\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiffany-teen-video-ces\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiffanyteen-a75atrdr\.blogspot\.com
+https?:\/\/([^\/]*\.)?tigers-ows\.blogspot\.com
+https?:\/\/([^\/]*\.)?tigger-muhul2h8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tight-ik340a6f\.blogspot\.com
+https?:\/\/([^\/]*\.)?tight-tranny-ass\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?tightdelights-com-bayzdrm4r\.blogspot\.com
+https?:\/\/([^\/]*\.)?tightdelights-com-bproar5r\.blogspot\.com
+https?:\/\/([^\/]*\.)?tigre-k0qdp\.blogspot\.com
+https?:\/\/([^\/]*\.)?tijldebie\.net
+https?:\/\/([^\/]*\.)?tilneshia-r1\.blogspot\.com
+https?:\/\/([^\/]*\.)?timank\.com
+https?:\/\/([^\/]*\.)?timelee\.pp\.ru
+https?:\/\/([^\/]*\.)?timetopaynow\.com
+https?:\/\/([^\/]*\.)?timewill\.pp\.ru
+https?:\/\/([^\/]*\.)?timex-ironman\.leg4is\.be
+https?:\/\/([^\/]*\.)?timothy-tkd\.blogspot\.com
+https?:\/\/([^\/]*\.)?timsmovies-com-ck0iq6v\.blogspot\.com
+https?:\/\/([^\/]*\.)?timsmovies-com-cui64k6qv\.blogspot\.com
+https?:\/\/([^\/]*\.)?timyra-dy\.blogspot\.com
+https?:\/\/([^\/]*\.)?tina-ce\.blogspot\.com
+https?:\/\/([^\/]*\.)?tinman-bb4k610\.blogspot\.com
+https?:\/\/([^\/]*\.)?tintin-abz\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiny-cock-blow-job\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?tiny18-net-e5zw0x8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiny18-net-thb44\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiny18-net-tq5qwp\.blogspot\.com
+https?:\/\/([^\/]*\.)?tinyeve-net-d8ejy5\.blogspot\.com
+https?:\/\/([^\/]*\.)?tinyeve-net-dzjflb1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tinysblackadventures-com-a61px\.blogspot\.com
+https?:\/\/([^\/]*\.)?tinysblackadventures-com-a638lqrud\.blogspot\.com
+https?:\/\/([^\/]*\.)?tipw\.org\.ua
+https?:\/\/([^\/]*\.)?tise2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?titanium-ring\.boom\.ru
+https?:\/\/([^\/]*\.)?titanium-rings\.boom\.ru
+https?:\/\/([^\/]*\.)?titanium1ring\.chat\.ru
+https?:\/\/([^\/]*\.)?titanium4ring\.chat\.ru
+https?:\/\/([^\/]*\.)?titkis\.com
+https?:\/\/([^\/]*\.)?tittypalace-com-o352hny\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiye-e5rhl\.blogspot\.com
+https?:\/\/([^\/]*\.)?tiyona-t4m7cq\.blogspot\.com
+https?:\/\/([^\/]*\.)?tizanidine\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?tj-d04qczfk\.blogspot\.com
+https?:\/\/([^\/]*\.)?tjbb1\.szm\.sk
+https?:\/\/([^\/]*\.)?tjjp\.left-page\.com
+https?:\/\/([^\/]*\.)?tjjp\.zxvo\.com
+https?:\/\/([^\/]*\.)?tjzhh\.com\.cn
+https?:\/\/([^\/]*\.)?tjzrr\.com
+https?:\/\/([^\/]*\.)?tkml\.tblog\.com
+https?:\/\/([^\/]*\.)?tknani\.50webs\.com
+https?:\/\/([^\/]*\.)?tkzrb\.szm\.sk
+https?:\/\/([^\/]*\.)?tladies\.net
+https?:\/\/([^\/]*\.)?tlchjhs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tldley4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tlhd3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tljsrq\.com
+https?:\/\/([^\/]*\.)?tlkdb\.szm\.sk
+https?:\/\/([^\/]*\.)?tmhbj\.com
+https?:\/\/([^\/]*\.)?tmobilenfn\.blogspot\.com
+https?:\/\/([^\/]*\.)?tmooeen-six\.blogspot\.com
+https?:\/\/([^\/]*\.)?tneccotnec\.fr-bb\.com
+https?:\/\/([^\/]*\.)?tnt163\.com
+https?:\/\/([^\/]*\.)?toggle-c0t3\.blogspot\.com
+https?:\/\/([^\/]*\.)?tohj3\.szm\.sk
+https?:\/\/([^\/]*\.)?tohqy\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tokuctro\.forumzen\.com
+https?:\/\/([^\/]*\.)?tom-b56vx6b48\.blogspot\.com
+https?:\/\/([^\/]*\.)?tomato-a7e\.blogspot\.com
+https?:\/\/([^\/]*\.)?tomems\.125mb\.com
+https?:\/\/([^\/]*\.)?tommys-bookmarks-com-eeb0\.blogspot\.com
+https?:\/\/([^\/]*\.)?tommys-bookmarks-com-ev\.blogspot\.com
+https?:\/\/([^\/]*\.)?tomng\.info
+https?:\/\/([^\/]*\.)?tomsthumbs-com-ihj\.blogspot\.com
+https?:\/\/([^\/]*\.)?tomsthumbs-com-iqkobr\.blogspot\.com
+https?:\/\/([^\/]*\.)?ton4all\.com
+https?:\/\/([^\/]*\.)?tonea-m3t\.blogspot\.com
+https?:\/\/([^\/]*\.)?tonegativeone\.blogspot\.com
+https?:\/\/([^\/]*\.)?toniann-kr3\.blogspot\.com
+https?:\/\/([^\/]*\.)?tony-h3xs1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tonya-g0x1\.blogspot\.com
+https?:\/\/([^\/]*\.)?toons-fuck-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?toor3\.szm\.sk
+https?:\/\/([^\/]*\.)?tootsie-rjg323oj2\.blogspot\.com
+https?:\/\/([^\/]*\.)?top-hold-em\.us
+https?:\/\/([^\/]*\.)?top-holdem\.com
+https?:\/\/([^\/]*\.)?top-holdem\.us
+https?:\/\/([^\/]*\.)?top-mp3\.biz
+https?:\/\/([^\/]*\.)?top\.pcanywhere\.net
+https?:\/\/([^\/]*\.)?topacio-w3fpzg\.blogspot\.com
+https?:\/\/([^\/]*\.)?topairlines\.ifrance\.com
+https?:\/\/([^\/]*\.)?topcelebs-com-hf34tmj\.blogspot\.com
+https?:\/\/([^\/]*\.)?topdasar\.com
+https?:\/\/([^\/]*\.)?topee\.info
+https?:\/\/([^\/]*\.)?topege\.com
+https?:\/\/([^\/]*\.)?topfarmasearch\.info
+https?:\/\/([^\/]*\.)?topgun-ef7gc204\.blogspot\.com
+https?:\/\/([^\/]*\.)?topless-babes-com-mq6hbe5uvq\.blogspot\.com
+https?:\/\/([^\/]*\.)?topo20\.org
+https?:\/\/([^\/]*\.)?topography-tuowheetle\.blogspot\.com
+https?:\/\/([^\/]*\.)?topozo\.org
+https?:\/\/([^\/]*\.)?topworldauto\.info
+https?:\/\/([^\/]*\.)?torey-dr343r\.blogspot\.com
+https?:\/\/([^\/]*\.)?tori-cmg8\.blogspot\.com
+https?:\/\/([^\/]*\.)?toriana-baui\.blogspot\.com
+https?:\/\/([^\/]*\.)?tornado-axe8uch1ar\.blogspot\.com
+https?:\/\/([^\/]*\.)?toronto-ox7aprp\.blogspot\.com
+https?:\/\/([^\/]*\.)?toropiz\.125mb\.com
+https?:\/\/([^\/]*\.)?torri-mrmj\.blogspot\.com
+https?:\/\/([^\/]*\.)?tortoise-iz\.blogspot\.com
+https?:\/\/([^\/]*\.)?torucnro\.jconserv\.net
+https?:\/\/([^\/]*\.)?tosuralz\.forumzen\.com
+https?:\/\/([^\/]*\.)?tottiona-k1zx8juj\.blogspot\.com
+https?:\/\/([^\/]*\.)?touya012\.blogspot\.com
+https?:\/\/([^\/]*\.)?town-china\.cn
+https?:\/\/([^\/]*\.)?toxic-h8jasyqt1\.blogspot\.com
+https?:\/\/([^\/]*\.)?toyota-g8\.blogspot\.com
+https?:\/\/([^\/]*\.)?tpwyc\.szm\.sk
+https?:\/\/([^\/]*\.)?tqdd7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tqnkaoi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tqrkf\.szm\.sk
+https?:\/\/([^\/]*\.)?traci-r30narn\.blogspot\.com
+https?:\/\/([^\/]*\.)?tracie-wskg17md\.blogspot\.com
+https?:\/\/([^\/]*\.)?trackting\.com
+https?:\/\/([^\/]*\.)?tractor-etae7hau1y\.blogspot\.com
+https?:\/\/([^\/]*\.)?tracy-kae\.babubi\.net
+https?:\/\/([^\/]*\.)?tracy-toe7\.blogspot\.com
+https?:\/\/([^\/]*\.)?traesha-d8u3731bb6\.blogspot\.com
+https?:\/\/([^\/]*\.)?traffit\.info
+https?:\/\/([^\/]*\.)?tralina-bvqz366sv\.blogspot\.com
+https?:\/\/([^\/]*\.)?tramadol-4u\.net
+https?:\/\/([^\/]*\.)?tramadol-911\.coz\.in
+https?:\/\/([^\/]*\.)?tramadol-bznz\.blogspot\.com
+https?:\/\/([^\/]*\.)?tramadol-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?tramadol-gs\.eu\.tc
+https?:\/\/([^\/]*\.)?tramadol-gs\.net\.tc
+https?:\/\/([^\/]*\.)?tramadol-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?tramadol-wiki\.com
+https?:\/\/([^\/]*\.)?tramadol\.1\.forogratis\.es
+https?:\/\/([^\/]*\.)?tramadol\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?tramadol\.esguay\.com
+https?:\/\/([^\/]*\.)?tramadol\.fws1\.com
+https?:\/\/([^\/]*\.)?tramadol\.goodpharm\.info
+https?:\/\/([^\/]*\.)?tramadol\.knopkabablo\.info
+https?:\/\/([^\/]*\.)?tramadol\.presteert\.nl
+https?:\/\/([^\/]*\.)?tramadol\.skocz\.net
+https?:\/\/([^\/]*\.)?tramadol\.su\.pl
+https?:\/\/([^\/]*\.)?tramadol\.weboficial\.com
+https?:\/\/([^\/]*\.)?tramadol7\.php5\.cz
+https?:\/\/([^\/]*\.)?tramadolnx\.u\.yuku\.com
+https?:\/\/([^\/]*\.)?tramadolonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?tramadolonlinez\.blogsome\.com
+https?:\/\/([^\/]*\.)?tramadolq\.bloggingmylife\.com
+https?:\/\/([^\/]*\.)?tramadols\.us\.tf
+https?:\/\/([^\/]*\.)?trami-a7oq4k1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tramika-o4no\.blogspot\.com
+https?:\/\/([^\/]*\.)?tran-ma86bq3\.blogspot\.com
+https?:\/\/([^\/]*\.)?tranici\.info
+https?:\/\/([^\/]*\.)?tranlaura-ktn\.blogspot\.com
+https?:\/\/([^\/]*\.)?trannysurprise-com-ghn6k4r88\.blogspot\.com
+https?:\/\/([^\/]*\.)?trannysurprise-com-gq\.blogspot\.com
+https?:\/\/([^\/]*\.)?trannysurprise-com-i05csl\.blogspot\.com
+https?:\/\/([^\/]*\.)?transbiding\.com
+https?:\/\/([^\/]*\.)?transchinese\.com
+https?:\/\/([^\/]*\.)?transfer-h56d4zxl4\.blogspot\.com
+https?:\/\/([^\/]*\.)?translateatsh\.cn
+https?:\/\/([^\/]*\.)?translatebbs\.com
+https?:\/\/([^\/]*\.)?translateforcompany\.cn
+https?:\/\/([^\/]*\.)?traore-guh68nn\.blogspot\.com
+https?:\/\/([^\/]*\.)?trashnx\.datadiri\.cc
+https?:\/\/([^\/]*\.)?trastian-r1\.blogspot\.com
+https?:\/\/([^\/]*\.)?travel-blast\.com
+https?:\/\/([^\/]*\.)?travel-wa4g2\.blogspot\.com
+https?:\/\/([^\/]*\.)?travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?travel2nursing\.chat\.ru
+https?:\/\/([^\/]*\.)?travelmarket\.mytravelsearch\.info
+https?:\/\/([^\/]*\.)?travis-ez8v\.blogspot\.com
+https?:\/\/([^\/]*\.)?tray-t5\.blogspot\.com
+https?:\/\/([^\/]*\.)?trbodel\.frbb\.net
+https?:\/\/([^\/]*\.)?trbusget\.forumzen\.com
+https?:\/\/([^\/]*\.)?trcchi\.td\.pl
+https?:\/\/([^\/]*\.)?trcota\.bb-fr\.com
+https?:\/\/([^\/]*\.)?trdombas\.blogcu\.com
+https?:\/\/([^\/]*\.)?trerdron\.discutfree\.com
+https?:\/\/([^\/]*\.)?trerdron\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?tressa-a7w83sb\.blogspot\.com
+https?:\/\/([^\/]*\.)?tretinoingelbuy\.move\.to
+https?:\/\/([^\/]*\.)?tretinoingelbuycheap\.move\.to
+https?:\/\/([^\/]*\.)?tretinoingelbuygeneric\.drive\.to
+https?:\/\/([^\/]*\.)?tretinoingelcheap\.rulestheweb\.com
+https?:\/\/([^\/]*\.)?tretinoingelgeneric\.germany\.ms
+https?:\/\/([^\/]*\.)?trevisos\.org
+https?:\/\/([^\/]*\.)?trevor-obp5qlgdb\.blogspot\.com
+https?:\/\/([^\/]*\.)?trhlina\.republika\.pl
+https?:\/\/([^\/]*\.)?tribuna\.asp2\.cz
+https?:\/\/([^\/]*\.)?trident-m6wm\.blogspot\.com
+https?:\/\/([^\/]*\.)?trinbagoauto\.com
+https?:\/\/([^\/]*\.)?trinity-ikvstb\.blogspot\.com
+https?:\/\/([^\/]*\.)?triobuy\.vtost\.com
+https?:\/\/([^\/]*\.)?triphasil\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?tripto\.com
+https?:\/\/([^\/]*\.)?trisha-ksmv\.blogspot\.com
+https?:\/\/([^\/]*\.)?tristen-h2b1b1\.blogspot\.com
+https?:\/\/([^\/]*\.)?trivial-gk13on\.blogspot\.com
+https?:\/\/([^\/]*\.)?trixie-rkn\.blogspot\.com
+https?:\/\/([^\/]*\.)?trkucorc\.forumzen\.com
+https?:\/\/([^\/]*\.)?trlicut\.winnerforum\.net
+https?:\/\/([^\/]*\.)?trocacsit\.dl\.pl
+https?:\/\/([^\/]*\.)?troccvi\.darkbb\.com
+https?:\/\/([^\/]*\.)?trocdarc\.bb-fr\.com
+https?:\/\/([^\/]*\.)?troceltolo\.dl\.pl
+https?:\/\/([^\/]*\.)?trocoches\.info
+https?:\/\/([^\/]*\.)?trocrolac\.dl\.pl
+https?:\/\/([^\/]*\.)?troctrocro\.zj\.pl
+https?:\/\/([^\/]*\.)?trombone-wafnt\.blogspot\.com
+https?:\/\/([^\/]*\.)?trorolo\.ephpbb\.com
+https?:\/\/([^\/]*\.)?trorta\.blogcu\.com
+https?:\/\/([^\/]*\.)?trte2\.szm\.sk
+https?:\/\/([^\/]*\.)?trtrocli\.uy\.pl
+https?:\/\/([^\/]*\.)?trucks-t5rikxk1yk\.blogspot\.com
+https?:\/\/([^\/]*\.)?trumpet-d5846b6u\.blogspot\.com
+https?:\/\/([^\/]*\.)?trumst\.com
+https?:\/\/([^\/]*\.)?trzelor\.bbfr\.net
+https?:\/\/([^\/]*\.)?ts998\.com
+https?:\/\/([^\/]*\.)?tsc-clara\.hostingtree\.org
+https?:\/\/([^\/]*\.)?tsfzia5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tshirthell-com-h4dd14cx0g\.blogspot\.com
+https?:\/\/([^\/]*\.)?tshirthell-com-wbc\.blogspot\.com
+https?:\/\/([^\/]*\.)?tshirthell-com-wvayrpu2\.blogspot\.com
+https?:\/\/([^\/]*\.)?tslist-com-rwwi8zl\.blogspot\.com
+https?:\/\/([^\/]*\.)?tslist-com-ry\.blogspot\.com
+https?:\/\/([^\/]*\.)?tsoy7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tss-car\.com
+https?:\/\/([^\/]*\.)?tssuih5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tsvibak\.blogspot\.com
+https?:\/\/([^\/]*\.)?tt001\.com
+https?:\/\/([^\/]*\.)?tt002\.com
+https?:\/\/([^\/]*\.)?tt003\.com
+https?:\/\/([^\/]*\.)?tt004\.com
+https?:\/\/([^\/]*\.)?tt005\.com
+https?:\/\/([^\/]*\.)?tthumvir\.forumzen\.com
+https?:\/\/([^\/]*\.)?ttjpm\.szm\.sk
+https?:\/\/([^\/]*\.)?ttlive\.info
+https?:\/\/([^\/]*\.)?ttrgb\.szm\.sk
+https?:\/\/([^\/]*\.)?ttvpkp0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tu-wendi\.blogspot\.com
+https?:\/\/([^\/]*\.)?tubas-bc45h\.blogspot\.com
+https?:\/\/([^\/]*\.)?tuesday-anx780we1\.blogspot\.com
+https?:\/\/([^\/]*\.)?tufa\.info
+https?:\/\/([^\/]*\.)?tugjobs-com-kmr4pm\.blogspot\.com
+https?:\/\/([^\/]*\.)?tuhe-advil\.blogspot\.com
+https?:\/\/([^\/]*\.)?tulip123456\.ifrance\.com
+https?:\/\/([^\/]*\.)?turbo-o3f520u0jd\.blogspot\.com
+https?:\/\/([^\/]*\.)?turl\.jp
+https?:\/\/([^\/]*\.)?turtle-m6pr6y\.blogspot\.com
+https?:\/\/([^\/]*\.)?tuttle-i5\.blogspot\.com
+https?:\/\/([^\/]*\.)?tuttosport\.freespase\.info
+https?:\/\/([^\/]*\.)?tuubu\.szm\.sk
+https?:\/\/([^\/]*\.)?tv-bazzar\.com
+https?:\/\/([^\/]*\.)?twam0\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?tweety-k8z4spyz\.blogspot\.com
+https?:\/\/([^\/]*\.)?twelvalve\.blogspot\.com
+https?:\/\/([^\/]*\.)?twilightsex-cixeh\.blogspot\.com
+https?:\/\/([^\/]*\.)?twilightsex-com-o31qd\.blogspot\.com
+https?:\/\/([^\/]*\.)?twilightsex-com-op\.blogspot\.com
+https?:\/\/([^\/]*\.)?twins-hzhz\.blogspot\.com
+https?:\/\/([^\/]*\.)?twist-ga\.blogspot\.com
+https?:\/\/([^\/]*\.)?twister-r4\.blogspot\.com
+https?:\/\/([^\/]*\.)?two-lips-com-cfvn7fu3\.blogspot\.com
+https?:\/\/([^\/]*\.)?two-lips-com-cwk\.blogspot\.com
+https?:\/\/([^\/]*\.)?two-teen-kissing\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?two-wgn3t3\.blogspot\.com
+https?:\/\/([^\/]*\.)?twoq5\.szm\.sk
+https?:\/\/([^\/]*\.)?twxtbqn\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?txnpgc2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?txvfpo7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tyepobv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?tyj\.cwrjcn\.com
+https?:\/\/([^\/]*\.)?tyra-dna0lnjav\.blogspot\.com
+https?:\/\/([^\/]*\.)?tytiana-bjag\.blogspot\.com
+https?:\/\/([^\/]*\.)?tyvj5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uaobs\.szm\.sk
+https?:\/\/([^\/]*\.)?ub-mongolia\.mn
+https?:\/\/([^\/]*\.)?ubasak\.stabilt\.se
+https?:\/\/([^\/]*\.)?ubpmr\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ucdrun\.forumzen\.com
+https?:\/\/([^\/]*\.)?ucol2\.szm\.sk
+https?:\/\/([^\/]*\.)?udqhh\.szm\.sk
+https?:\/\/([^\/]*\.)?udtm7\.szm\.sk
+https?:\/\/([^\/]*\.)?uemhpgv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uglyjezz\.asp2\.cz
+https?:\/\/([^\/]*\.)?ugmhq\.szm\.sk
+https?:\/\/([^\/]*\.)?ukbettingweb\.com
+https?:\/\/([^\/]*\.)?ukek-hin\.isuisse\.com
+https?:\/\/([^\/]*\.)?ukrosi\.com
+https?:\/\/([^\/]*\.)?uksr9\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ulqj9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ultimateairpurifier\.com
+https?:\/\/([^\/]*\.)?ultimatesurrender-com-bkio\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultimatesurrender-com-bm8z1b\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultimatesurrender-com-c75r71j2e\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultracet\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ultradonkey-com-acp\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultradonkey-com-ag0\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultram-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultram\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?ultram\.47\.pl
+https?:\/\/([^\/]*\.)?ultram\.goodpharm\.info
+https?:\/\/([^\/]*\.)?ultram\.hav\.pl
+https?:\/\/([^\/]*\.)?ultram\.is-a-geek\.com
+https?:\/\/([^\/]*\.)?ultram\.serveftp\.com
+https?:\/\/([^\/]*\.)?ultram\.skocz\.net
+https?:\/\/([^\/]*\.)?ultrameds\.dtdns\.net
+https?:\/\/([^\/]*\.)?ultrams\.eu\.tf
+https?:\/\/([^\/]*\.)?ultrasexmovies-com-dm2dmh\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultrasexmovies-com-dz02q7\.blogspot\.com
+https?:\/\/([^\/]*\.)?ultrasexmovies-com-zujuz\.blogspot\.com
+https?:\/\/([^\/]*\.)?umax-forum\.com
+https?:\/\/([^\/]*\.)?umax-ppc\.com
+https?:\/\/([^\/]*\.)?umax-se\.com
+https?:\/\/([^\/]*\.)?umax-se\.info
+https?:\/\/([^\/]*\.)?umax-search-ppc-se-board\.com
+https?:\/\/([^\/]*\.)?umax-search-se\.com
+https?:\/\/([^\/]*\.)?umax-search\.net
+https?:\/\/([^\/]*\.)?umaxppc\.com
+https?:\/\/([^\/]*\.)?umaxse\.net
+https?:\/\/([^\/]*\.)?umaxse\.org
+https?:\/\/([^\/]*\.)?umaxsearch-search-engine\.com
+https?:\/\/([^\/]*\.)?umojucd\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?umsbm\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?un-fois\.blogspot\.com
+https?:\/\/([^\/]*\.)?un-nachrichten\.de
+https?:\/\/([^\/]*\.)?unbelievable-poker\.com
+https?:\/\/([^\/]*\.)?uncledeadly83\.blogspot\.com
+https?:\/\/([^\/]*\.)?understandish\.50webs\.org
+https?:\/\/([^\/]*\.)?unglaublichkeiten\.com
+https?:\/\/([^\/]*\.)?unicom\.027168\.com
+https?:\/\/([^\/]*\.)?uniform2nursing\.chat\.ru
+https?:\/\/([^\/]*\.)?unit01\.com
+https?:\/\/([^\/]*\.)?united-airline\.boom\.ru
+https?:\/\/([^\/]*\.)?united24\.com
+https?:\/\/([^\/]*\.)?unitedinchristchurch\.org
+https?:\/\/([^\/]*\.)?universal-hosting\.net
+https?:\/\/([^\/]*\.)?university-degre\.boom\.ru
+https?:\/\/([^\/]*\.)?university1degre\.chat\.ru
+https?:\/\/([^\/]*\.)?unixbrewers\.org
+https?:\/\/([^\/]*\.)?unka\.su\.pl
+https?:\/\/([^\/]*\.)?unseenoyster\.blogspot\.com
+https?:\/\/([^\/]*\.)?unwqs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uobasdel\.fr-bb\.com
+https?:\/\/([^\/]*\.)?uokx8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uous6\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?up-skirt-butt\.medved\.odessa\.ua
+https?:\/\/([^\/]*\.)?updatenames\.dtdns\.net
+https?:\/\/([^\/]*\.)?upskirt-ebony-teen\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?upskirt-gallery-leg\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?upskirtsexxfh\.blogspot\.com
+https?:\/\/([^\/]*\.)?upwaldru\.ifrance\.com
+https?:\/\/([^\/]*\.)?uraharaben1hime\.blogspot\.com
+https?:\/\/([^\/]*\.)?urkrdh5\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?urky5\.szm\.sk
+https?:\/\/([^\/]*\.)?us-senator-dick-durbin\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?us-viagra\.us
+https?:\/\/([^\/]*\.)?us\.kopuz\.com
+https?:\/\/([^\/]*\.)?usa-online-pharmacy\.net
+https?:\/\/([^\/]*\.)?usa568\.com
+https?:\/\/([^\/]*\.)?usaah\.com
+https?:\/\/([^\/]*\.)?usbestlawyer\.org
+https?:\/\/([^\/]*\.)?usbuorl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?usednotebooks\.ru
+https?:\/\/([^\/]*\.)?ushoh\.szm\.sk
+https?:\/\/([^\/]*\.)?uskbbb9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?usuc\.us
+https?:\/\/([^\/]*\.)?uszfp\.szm\.sk
+https?:\/\/([^\/]*\.)?utahmortgage-x\.com
+https?:\/\/([^\/]*\.)?utranslate\.org
+https?:\/\/([^\/]*\.)?utranslation\.net
+https?:\/\/([^\/]*\.)?uucwsw7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uulitr\.forumzen\.com
+https?:\/\/([^\/]*\.)?uulive\.info
+https?:\/\/([^\/]*\.)?uvfotuc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uvgpy\.szm\.sk
+https?:\/\/([^\/]*\.)?uvndhxh\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uwacadweb\.uwyo\.edu
+https?:\/\/([^\/]*\.)?uwek\.info
+https?:\/\/([^\/]*\.)?uxyei\.szm\.sk
+https?:\/\/([^\/]*\.)?uyjdrg3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?uzfde\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?uzzclm9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?v-f-sex-video-clip-g\.blogspot\.com
+https?:\/\/([^\/]*\.)?v-j-big-movie-tit-v\.blogspot\.com
+https?:\/\/([^\/]*\.)?v1h\.com
+https?:\/\/([^\/]*\.)?v5wednesday\.info
+https?:\/\/([^\/]*\.)?v7njlwgd\.nokedem\.com
+https?:\/\/([^\/]*\.)?vacanza-barcellona\.zoom10x\.info
+https?:\/\/([^\/]*\.)?vacanza-montagna\.freespase\.info
+https?:\/\/([^\/]*\.)?vacanza-neve\.zoom4x\.info
+https?:\/\/([^\/]*\.)?vacanza-toscana\.host24h\.info
+https?:\/\/([^\/]*\.)?vacuums\.be
+https?:\/\/([^\/]*\.)?vahitchc\.dl\.pl
+https?:\/\/([^\/]*\.)?valiubusines\.blogcu\.com
+https?:\/\/([^\/]*\.)?valium-911\.coz\.in
+https?:\/\/([^\/]*\.)?valium-cc\.blogspot\.com
+https?:\/\/([^\/]*\.)?valium-cheap\.18\.to
+https?:\/\/([^\/]*\.)?valium-online\.cheapills\.info
+https?:\/\/([^\/]*\.)?valium-qrxo\.blogspot\.com
+https?:\/\/([^\/]*\.)?valium\.269g\.net
+https?:\/\/([^\/]*\.)?valium\.47\.pl
+https?:\/\/([^\/]*\.)?valium\.goodpharm\.info
+https?:\/\/([^\/]*\.)?valium\.skocz\.net
+https?:\/\/([^\/]*\.)?valium\.su\.pl
+https?:\/\/([^\/]*\.)?valiumnx\.u\.yuku\.com
+https?:\/\/([^\/]*\.)?valiums\.eu\.tf
+https?:\/\/([^\/]*\.)?valleyswap\.info
+https?:\/\/([^\/]*\.)?valtrex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?vametase\.com
+https?:\/\/([^\/]*\.)?vands88\.blogspot\.com
+https?:\/\/([^\/]*\.)?vanhelsingsgirl\.datadiri\.cc
+https?:\/\/([^\/]*\.)?vaniqa\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?varac\.heavenforum\.com
+https?:\/\/([^\/]*\.)?varac\.highforum\.net
+https?:\/\/([^\/]*\.)?varelvi\.discutfree\.com
+https?:\/\/([^\/]*\.)?varnish\.8888mb\.com
+https?:\/\/([^\/]*\.)?varnotr\.naturalforum\.net
+https?:\/\/([^\/]*\.)?varoracel\.bbfr\.net
+https?:\/\/([^\/]*\.)?varracleto\.dl\.pl
+https?:\/\/([^\/]*\.)?vazicoj\.info
+https?:\/\/([^\/]*\.)?vboya\.9999mb\.com
+https?:\/\/([^\/]*\.)?vcjwc\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?vcpk9\.szm\.sk
+https?:\/\/([^\/]*\.)?vcsps\.com
+https?:\/\/([^\/]*\.)?vdpf4\.szm\.sk
+https?:\/\/([^\/]*\.)?ve-alisa\.blogspot\.com
+https?:\/\/([^\/]*\.)?vegetnuks\.blogspot\.com
+https?:\/\/([^\/]*\.)?veggis\.org\.cn
+https?:\/\/([^\/]*\.)?vehal\.com
+https?:\/\/([^\/]*\.)?vek-xxxpower-net\.blogspot\.com
+https?:\/\/([^\/]*\.)?velvetimalice\.ibelgique\.com
+https?:\/\/([^\/]*\.)?vemiles\.ifrance\.com
+https?:\/\/([^\/]*\.)?verba\.dyndns\.dk
+https?:\/\/([^\/]*\.)?verfolva\.blogspot\.com
+https?:\/\/([^\/]*\.)?veriel\.dl\.pl
+https?:\/\/([^\/]*\.)?verizonringtonersy\.blogspot\.com
+https?:\/\/([^\/]*\.)?verizonringtonesdvf\.blogspot\.com
+https?:\/\/([^\/]*\.)?vermontmortgage-x\.com
+https?:\/\/([^\/]*\.)?vertyg\.org
+https?:\/\/([^\/]*\.)?veryge\.com
+https?:\/\/([^\/]*\.)?veryprivatebanking\.info
+https?:\/\/([^\/]*\.)?vestuk\.com
+https?:\/\/([^\/]*\.)?veterinar\.spb\.ru
+https?:\/\/([^\/]*\.)?vets\.appliedphysics\.swri\.edu
+https?:\/\/([^\/]*\.)?vfrkiv6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vfrrto\.org
+https?:\/\/([^\/]*\.)?vhuekxi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vi-allo\.blogspot\.com
+https?:\/\/([^\/]*\.)?viadele\.dl\.pl
+https?:\/\/([^\/]*\.)?viagaravaegra\.com
+https?:\/\/([^\/]*\.)?viaggi-del-ventaglio\.forumhst\.info
+https?:\/\/([^\/]*\.)?viagra-4u\.us
+https?:\/\/([^\/]*\.)?viagra-online\.presteert\.nl
+https?:\/\/([^\/]*\.)?viagra-soft-tabs\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?viagra\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?viagra\.cheapills\.info
+https?:\/\/([^\/]*\.)?viagra\.edu\.tf
+https?:\/\/([^\/]*\.)?viagra\.esguay\.com
+https?:\/\/([^\/]*\.)?viagra\.inc5\.com
+https?:\/\/([^\/]*\.)?viagra\.rx4\.org
+https?:\/\/([^\/]*\.)?viagra\.skocz\.net
+https?:\/\/([^\/]*\.)?viagrai\.blogspot\.com
+https?:\/\/([^\/]*\.)?viagraorder\.mail15\.com
+https?:\/\/([^\/]*\.)?viagraq\.bloggingmylife\.com
+https?:\/\/([^\/]*\.)?viagrarx\.weboficial\.com
+https?:\/\/([^\/]*\.)?vicodin-pharm\.fws1\.com
+https?:\/\/([^\/]*\.)?vicodin\.269g\.net
+https?:\/\/([^\/]*\.)?vicodin\.conto\.pl
+https?:\/\/([^\/]*\.)?vicodin\.esguay\.com
+https?:\/\/([^\/]*\.)?vicodin\.guu\.pl
+https?:\/\/([^\/]*\.)?vicodin88\.tblog\.com
+https?:\/\/([^\/]*\.)?victoria-silvstedt\.freehostss\.info
+https?:\/\/([^\/]*\.)?videlric\.dl\.pl
+https?:\/\/([^\/]*\.)?video-comico\.host24h\.info
+https?:\/\/([^\/]*\.)?video-porn-caseros-ju\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-porn-gratis-sod\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-post-com-bejiq\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-post-com-bfoybt\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-post-com-my\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-post-com-thumbview-rehif\.blogspot\.com
+https?:\/\/([^\/]*\.)?video-spot-sexy\.19mb\.info
+https?:\/\/([^\/]*\.)?video-spot-sexy\.you-bizz\.info
+https?:\/\/([^\/]*\.)?video-whore-bb-bb-b\.blogspot\.com
+https?:\/\/([^\/]*\.)?videosection-com-h0xon\.blogspot\.com
+https?:\/\/([^\/]*\.)?videosection-com-w1w\.blogspot\.com
+https?:\/\/([^\/]*\.)?videosection-com-w62l\.blogspot\.com
+https?:\/\/([^\/]*\.)?videosharez\.com
+https?:\/\/([^\/]*\.)?vidgals-com-e13sc4yv0\.blogspot\.com
+https?:\/\/([^\/]*\.)?vidgals-com-e6ig7a\.blogspot\.com
+https?:\/\/([^\/]*\.)?vidgals-com-edvo\.blogspot\.com
+https?:\/\/([^\/]*\.)?vidronla\.blogcu\.com
+https?:\/\/([^\/]*\.)?vielsit\.su\.pl
+https?:\/\/([^\/]*\.)?vietnamparadisetravel\.com
+https?:\/\/([^\/]*\.)?viewerswives-net-c4\.blogspot\.com
+https?:\/\/([^\/]*\.)?viewerswives-net-oc\.blogspot\.com
+https?:\/\/([^\/]*\.)?viewgals-com-ah\.blogspot\.com
+https?:\/\/([^\/]*\.)?viewgals-com-il253r\.blogspot\.com
+https?:\/\/([^\/]*\.)?vigduk30\.xshorturl\.com
+https?:\/\/([^\/]*\.)?vigetleto\.heavenforum\.com
+https?:\/\/([^\/]*\.)?vihl6\.szm\.sk
+https?:\/\/([^\/]*\.)?viliolo\.winnerforum\.net
+https?:\/\/([^\/]*\.)?village\.asp2\.cz
+https?:\/\/([^\/]*\.)?villaggio-ischia\.ll11\.info
+https?:\/\/([^\/]*\.)?vinnie-1-hit\.blogspot\.com
+https?:\/\/([^\/]*\.)?vintage\.sexcluborgy\.net
+https?:\/\/([^\/]*\.)?vioxx\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?vioxx\.3d-game\.com
+https?:\/\/([^\/]*\.)?vipasrel\.cultureforum\.net
+https?:\/\/([^\/]*\.)?vipcrew-com-bj\.blogspot\.com
+https?:\/\/([^\/]*\.)?vipcrew-com-r0w\.blogspot\.com
+https?:\/\/([^\/]*\.)?vipcrew-com-rs74r7iy5\.blogspot\.com
+https?:\/\/([^\/]*\.)?viphls\.com
+https?:\/\/([^\/]*\.)?vipliz\.com
+https?:\/\/([^\/]*\.)?vipmsite\.com
+https?:\/\/([^\/]*\.)?virgin-porn\.futureblog\.org
+https?:\/\/([^\/]*\.)?virgin-sexy\.com
+https?:\/\/([^\/]*\.)?virginfucked-com-h200n1lxcg\.blogspot\.com
+https?:\/\/([^\/]*\.)?virginiamortgage-x\.com
+https?:\/\/([^\/]*\.)?viricrel\.lolbb\.com
+https?:\/\/([^\/]*\.)?virinok\.dynamicforum\.net
+https?:\/\/([^\/]*\.)?virtualeinfiniti\.cn
+https?:\/\/([^\/]*\.)?vitalitymax\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?vivino\.ephpbb\.com
+https?:\/\/([^\/]*\.)?vizelvar\.frbb\.net
+https?:\/\/([^\/]*\.)?vjkavu6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vjsgby0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vjuk7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vjwm2\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?vkblq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vksfucm\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vmdes\.com
+https?:\/\/([^\/]*\.)?vmpi4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vmvip\.com
+https?:\/\/([^\/]*\.)?vmvip\.net
+https?:\/\/([^\/]*\.)?vmvip\.org
+https?:\/\/([^\/]*\.)?vo-free-oral-movie-clip-toc\.blogspot\.com
+https?:\/\/([^\/]*\.)?voip-guide\.org
+https?:\/\/([^\/]*\.)?vol-soft17-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?voli-amsterdam\.freespase\.info
+https?:\/\/([^\/]*\.)?voli-argentina\.zoom10x\.info
+https?:\/\/([^\/]*\.)?voli-londra\.freespase\.info
+https?:\/\/([^\/]*\.)?voli-spagna\.freespase\.info
+https?:\/\/([^\/]*\.)?volume5\.8888mb\.com
+https?:\/\/([^\/]*\.)?voxn2\.szm\.sk
+https?:\/\/([^\/]*\.)?voyeur-video-amateur-free\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?voyeurzine-com-af2\.blogspot\.com
+https?:\/\/([^\/]*\.)?voyeurzine-com-dbhx1q\.blogspot\.com
+https?:\/\/([^\/]*\.)?voyiu\.szm\.sk
+https?:\/\/([^\/]*\.)?vpbu1\.szm\.sk
+https?:\/\/([^\/]*\.)?vrlw9\.szm\.sk
+https?:\/\/([^\/]*\.)?vrnjgk1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vstqfs3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vtop\.fateback\.com
+https?:\/\/([^\/]*\.)?vtop\.kilu\.de
+https?:\/\/([^\/]*\.)?vtop\.topcities\.com
+https?:\/\/([^\/]*\.)?vtrxzzwj-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?vttolldd\.org
+https?:\/\/([^\/]*\.)?vttthtgg\.org
+https?:\/\/([^\/]*\.)?vtwm7\.szm\.sk
+https?:\/\/([^\/]*\.)?vu-alias\.blogspot\.com
+https?:\/\/([^\/]*\.)?vu-aliases\.blogspot\.com
+https?:\/\/([^\/]*\.)?vu-free-big-sex-movie-fen\.blogspot\.com
+https?:\/\/([^\/]*\.)?vud-vipcrew-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?vue\.uit\.tufts\.edu
+https?:\/\/([^\/]*\.)?vulgarisprime\.50webs\.org
+https?:\/\/([^\/]*\.)?vuqi-alana\.blogspot\.com
+https?:\/\/([^\/]*\.)?vutwwd6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vuzeq-sex-video-d\.blogspot\.com
+https?:\/\/([^\/]*\.)?vvaliumonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?vvline\.info
+https?:\/\/([^\/]*\.)?vwjr2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vwzm6\.szm\.sk
+https?:\/\/([^\/]*\.)?vyqdvf1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?vyuf9\.szm\.sk
+https?:\/\/([^\/]*\.)?vzevz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?w-q-elmo-extreme-video-n\.blogspot\.com
+https?:\/\/([^\/]*\.)?w-s-free-gay-sex-video-l\.blogspot\.com
+https?:\/\/([^\/]*\.)?w2\.ftpcn\.cn
+https?:\/\/([^\/]*\.)?w528\.com
+https?:\/\/([^\/]*\.)?wacks\.info
+https?:\/\/([^\/]*\.)?wak1ngmel0dies\.blogspot\.com
+https?:\/\/([^\/]*\.)?walker-ross\.com
+https?:\/\/([^\/]*\.)?walkerproconsulting\.com
+https?:\/\/([^\/]*\.)?walt-disney-world-travel\.globaltr\.info
+https?:\/\/([^\/]*\.)?wanadoo-fr-eyn6u1yt0\.blogspot\.com
+https?:\/\/([^\/]*\.)?wanadoo-fr-gsz\.blogspot\.com
+https?:\/\/([^\/]*\.)?wanadoo-fr-i0iq\.blogspot\.com
+https?:\/\/([^\/]*\.)?wannawatch-com-k1rckf8\.blogspot\.com
+https?:\/\/([^\/]*\.)?wannawatch-com-krz7dxd5a\.blogspot\.com
+https?:\/\/([^\/]*\.)?wannawatch-com-oaeedr\.blogspot\.com
+https?:\/\/([^\/]*\.)?wapzhijia\.com
+https?:\/\/([^\/]*\.)?waserk\.com
+https?:\/\/([^\/]*\.)?washingtonmortgage-x\.com
+https?:\/\/([^\/]*\.)?watch-free-porn-clip-zone43l\.blogspot\.com
+https?:\/\/([^\/]*\.)?watch-free-porn-clip-zonekjl\.blogspot\.com
+https?:\/\/([^\/]*\.)?watch-free-porn-video-bu\.blogspot\.com
+https?:\/\/([^\/]*\.)?watchersweb-com-t61o4wrr4h\.blogspot\.com
+https?:\/\/([^\/]*\.)?watchersweb-com-tnwrlyoqk\.blogspot\.com
+https?:\/\/([^\/]*\.)?watchingthetube\.com
+https?:\/\/([^\/]*\.)?water\.toxhost\.com
+https?:\/\/([^\/]*\.)?waxen\.kwik\.to
+https?:\/\/([^\/]*\.)?wbun7\.szm\.sk
+https?:\/\/([^\/]*\.)?wc1\.worldcrossing\.com
+https?:\/\/([^\/]*\.)?we-alfred\.blogspot\.com
+https?:\/\/([^\/]*\.)?we-alondra\.blogspot\.com
+https?:\/\/([^\/]*\.)?we-lesbian-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?web\.missouri\.edu
+https?:\/\/([^\/]*\.)?web\.scc\.losrios\.edu
+https?:\/\/([^\/]*\.)?web\.skku\.edu
+https?:\/\/([^\/]*\.)?web55\.info
+https?:\/\/([^\/]*\.)?webhost11\.com
+https?:\/\/([^\/]*\.)?webhosting-x\.com
+https?:\/\/([^\/]*\.)?weblog\.xanga\.com
+https?:\/\/([^\/]*\.)?webmd-drugs\.com
+https?:\/\/([^\/]*\.)?websz\.com
+https?:\/\/([^\/]*\.)?wedding-knot\.com
+https?:\/\/([^\/]*\.)?weddingactions\.com
+https?:\/\/([^\/]*\.)?wedner\.info
+https?:\/\/([^\/]*\.)?weekly-pay\.com
+https?:\/\/([^\/]*\.)?weersa\.com
+https?:\/\/([^\/]*\.)?weight-loss\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?weixing\.hk\.cn
+https?:\/\/([^\/]*\.)?welisi\.hk
+https?:\/\/([^\/]*\.)?welivetogether-com-ek6boac\.blogspot\.com
+https?:\/\/([^\/]*\.)?welivetogether-com-oc7yzd4ev\.blogspot\.com
+https?:\/\/([^\/]*\.)?welivetogether-com-wcu8\.blogspot\.com
+https?:\/\/([^\/]*\.)?wellbutrin\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?wellbutrin\.php5\.cz
+https?:\/\/([^\/]*\.)?wenmasterworld\.com
+https?:\/\/([^\/]*\.)?werdq\.com
+https?:\/\/([^\/]*\.)?wess\.250free\.com
+https?:\/\/([^\/]*\.)?westvirginiamortgage-x\.com
+https?:\/\/([^\/]*\.)?wet-mature-slut\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?wet-pussy-cum-shot\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?wet-teen-panties-wen\.blogspot\.com
+https?:\/\/([^\/]*\.)?wetplace-com-g16jfp6\.blogspot\.com
+https?:\/\/([^\/]*\.)?wfkd3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wgxq2\.szm\.sk
+https?:\/\/([^\/]*\.)?whipped-ass-slut\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?whipsnorkel\.275mb\.com
+https?:\/\/([^\/]*\.)?white-guys-fucking-black-teen\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?whitehole\.republika\.pl
+https?:\/\/([^\/]*\.)?wholesale-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?whorevideos-com-hj8shgp\.blogspot\.com
+https?:\/\/([^\/]*\.)?whorevideos-com-wddx\.blogspot\.com
+https?:\/\/([^\/]*\.)?whorevideos-txe5g0x\.blogspot\.com
+https?:\/\/([^\/]*\.)?whpsjw1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?whss0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wierdporno-com-kur70yvrl0\.blogspot\.com
+https?:\/\/([^\/]*\.)?wifi-planet\.org
+https?:\/\/([^\/]*\.)?wiku-aikman\.blogspot\.com
+https?:\/\/([^\/]*\.)?wild-party-fuck\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?wild-poker\.com
+https?:\/\/([^\/]*\.)?willeyfordmazda\.info
+https?:\/\/([^\/]*\.)?win-for-italy\.info
+https?:\/\/([^\/]*\.)?wind\.8888mb\.com
+https?:\/\/([^\/]*\.)?winter-gossamer\.blogspot\.com
+https?:\/\/([^\/]*\.)?winter\.12gbfree\.com
+https?:\/\/([^\/]*\.)?wired-shemales\.lampa\.ipupdater\.com
+https?:\/\/([^\/]*\.)?wiremesh-guanda\.com
+https?:\/\/([^\/]*\.)?wisconsinmortgage-x\.com
+https?:\/\/([^\/]*\.)?wisdom123\.com
+https?:\/\/([^\/]*\.)?wisewomanguide\.com
+https?:\/\/([^\/]*\.)?wisnp\.szm\.sk
+https?:\/\/([^\/]*\.)?wix-timsmovies-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?wizingsh\.dl\.pl
+https?:\/\/([^\/]*\.)?wjch5\.szm\.sk
+https?:\/\/([^\/]*\.)?wjhh9\.szm\.sk
+https?:\/\/([^\/]*\.)?wjjk0\.szm\.sk
+https?:\/\/([^\/]*\.)?wjsueg-free-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?wkelleylucas\.com
+https?:\/\/([^\/]*\.)?wkfsi774k\.org
+https?:\/\/([^\/]*\.)?wljp9\.szm\.sk
+https?:\/\/([^\/]*\.)?wm-u\.com
+https?:\/\/([^\/]*\.)?wmis\.com\.cn
+https?:\/\/([^\/]*\.)?wmlpv\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wmtnd\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wnwr5\.szm\.sk
+https?:\/\/([^\/]*\.)?woilco6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wolflist-com-rkj7d3\.blogspot\.com
+https?:\/\/([^\/]*\.)?wolverine-steel-toe-work-boot\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?woman-masturbating-man\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?woman-who-can-lick-their-own-pussy\.gameover\.in\.ua
+https?:\/\/([^\/]*\.)?woman-who-fuck-donkey\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?woman-with-prosthetic-leg\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?womansmith\.com
+https?:\/\/([^\/]*\.)?women-fitness\.org
+https?:\/\/([^\/]*\.)?womens-hard-nipples\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?womens-snake-boot\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?woolygrrl\.blogspot\.com
+https?:\/\/([^\/]*\.)?worldsex-com-byzv1xjl\.blogspot\.com
+https?:\/\/([^\/]*\.)?worldsex-com-eqn4b\.blogspot\.com
+https?:\/\/([^\/]*\.)?worldtalktv\.net\.ru
+https?:\/\/([^\/]*\.)?worldufo\.net\.ru
+https?:\/\/([^\/]*\.)?worldwide-games\.net
+https?:\/\/([^\/]*\.)?worldwide-online-pharmacy\.net
+https?:\/\/([^\/]*\.)?worldwide-tramadol\.net
+https?:\/\/([^\/]*\.)?woro-adriana\.blogspot\.com
+https?:\/\/([^\/]*\.)?wot-smutgremlins-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?wow-gold\.dinmo\.cn
+https?:\/\/([^\/]*\.)?wow-powerleveling-wow\.com
+https?:\/\/([^\/]*\.)?wowgold\.org\.cn
+https?:\/\/([^\/]*\.)?wowtgp-com-ap4y\.blogspot\.com
+https?:\/\/([^\/]*\.)?wowvids-com-ooiofshz5\.blogspot\.com
+https?:\/\/([^\/]*\.)?woww0\.szm\.sk
+https?:\/\/([^\/]*\.)?wpgt1\.szm\.sk
+https?:\/\/([^\/]*\.)?wpnvjk9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wqhnog2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wqr\.cn
+https?:\/\/([^\/]*\.)?wrnf9\.szm\.sk
+https?:\/\/([^\/]*\.)?wshcroq\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wsuonline\.weber\.edu
+https?:\/\/([^\/]*\.)?wszqc\.szm\.sk
+https?:\/\/([^\/]*\.)?wtrpfpa\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wuconweb\.wustl\.edu
+https?:\/\/([^\/]*\.)?wujin\.dzsc\.com
+https?:\/\/([^\/]*\.)?wulzi\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wvuf0\.szm\.sk
+https?:\/\/([^\/]*\.)?wvwd6\.szm\.sk
+https?:\/\/([^\/]*\.)?wwfedgechristian\.com
+https?:\/\/([^\/]*\.)?wwlive\.info
+https?:\/\/([^\/]*\.)?wwtop\.info
+https?:\/\/([^\/]*\.)?www-girlygangbang-com\.magnesia\.dtdns\.net
+https?:\/\/([^\/]*\.)?www-loadmymouth-com\.klose\.ipupdater\.com
+https?:\/\/([^\/]*\.)?www-shemales-from-hell-com\.magnesia\.dtdns\.net
+https?:\/\/([^\/]*\.)?www\.aet\.cup\.edu
+https?:\/\/([^\/]*\.)?www\.ags\.uci\.edu
+https?:\/\/([^\/]*\.)?www\.chaco\.gov\.ar
+https?:\/\/([^\/]*\.)?www\.coe\.ohio-state\.edu
+https?:\/\/([^\/]*\.)?www\.csulb\.edu
+https?:\/\/([^\/]*\.)?www\.cucsur\.udg\.mx
+https?:\/\/([^\/]*\.)?www\.depts\.ttu\.edu
+https?:\/\/([^\/]*\.)?www\.elie\.com\.cn
+https?:\/\/([^\/]*\.)?www\.forourbano\.gov\.ar
+https?:\/\/([^\/]*\.)?www\.grad\.english\.ttu\.edu
+https?:\/\/([^\/]*\.)?www\.hcs\.harvard\.edu
+https?:\/\/([^\/]*\.)?www\.health-livening\.com
+https?:\/\/([^\/]*\.)?www\.imperial\.edu
+https?:\/\/([^\/]*\.)?www\.isis\.vanderbilt\.edu
+https?:\/\/([^\/]*\.)?www\.leal-alfa\.upc\.edu
+https?:\/\/([^\/]*\.)?www\.ns\.ui\.edu
+https?:\/\/([^\/]*\.)?www\.oswego\.edu
+https?:\/\/([^\/]*\.)?www\.oznet\.ksu\.edu
+https?:\/\/([^\/]*\.)?www\.polisci\.berkeley\.edu
+https?:\/\/([^\/]*\.)?www\.redwingnet\.com
+https?:\/\/([^\/]*\.)?www\.rit\.edu
+https?:\/\/([^\/]*\.)?www\.rso\.cmich\.edu
+https?:\/\/([^\/]*\.)?www\.sccs\.swarthmore\.edu
+https?:\/\/([^\/]*\.)?www\.sportsbackers\.org
+https?:\/\/([^\/]*\.)?www\.tamug\.edu
+https?:\/\/([^\/]*\.)?www\.ug\.it\.usyd\.edu\.au
+https?:\/\/([^\/]*\.)?www\.uky\.edu
+https?:\/\/([^\/]*\.)?www\.wvup\.edu
+https?:\/\/([^\/]*\.)?www1\.freehostingguru\.com
+https?:\/\/([^\/]*\.)?www2\.cs\.washington\.edu
+https?:\/\/([^\/]*\.)?www3\.ddns\.ms
+https?:\/\/([^\/]*\.)?www4\.epac\.to
+https?:\/\/([^\/]*\.)?www4\.nau\.edu
+https?:\/\/([^\/]*\.)?www4\.vjc\.edu
+https?:\/\/([^\/]*\.)?www6\.ezua\.com
+https?:\/\/([^\/]*\.)?www6\.ns1\.name
+https?:\/\/([^\/]*\.)?www69\.bestdeals\.at
+https?:\/\/([^\/]*\.)?www69\.byinter\.net
+https?:\/\/([^\/]*\.)?www69\.dynu\.com
+https?:\/\/([^\/]*\.)?www69\.findhere\.org
+https?:\/\/([^\/]*\.)?www69\.fw\.nu
+https?:\/\/([^\/]*\.)?www69\.ugly\.as
+https?:\/\/([^\/]*\.)?www7\.25u\.com
+https?:\/\/([^\/]*\.)?www7\.ygto\.com
+https?:\/\/([^\/]*\.)?www8\.ns01\.us
+https?:\/\/([^\/]*\.)?www9\.servequake\.com
+https?:\/\/([^\/]*\.)?www9\.trickip\.org
+https?:\/\/([^\/]*\.)?www99\.bounceme\.net
+https?:\/\/([^\/]*\.)?www99\.zapto\.org
+https?:\/\/([^\/]*\.)?wwweazol\.znamka\.yi\.org
+https?:\/\/([^\/]*\.)?wwwmenozac\.gumaky\.yi\.org
+https?:\/\/([^\/]*\.)?wwwpeterscumshotscom\.jalovica\.dtdns\.net
+https?:\/\/([^\/]*\.)?wwwpornweekcom\.lampa\.ipupdater\.com
+https?:\/\/([^\/]*\.)?wwwtheluckymancom\.hrable\.dtdns\.net
+https?:\/\/([^\/]*\.)?wxcl6\.szm\.sk
+https?:\/\/([^\/]*\.)?wxmbv\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?wxsbjx\.com
+https?:\/\/([^\/]*\.)?wxzgyb\.com
+https?:\/\/([^\/]*\.)?wy-ls\.com
+https?:\/\/([^\/]*\.)?wyeax\.szm\.sk
+https?:\/\/([^\/]*\.)?wyloguj\.php5\.cz
+https?:\/\/([^\/]*\.)?wyomingmortgage-x\.com
+https?:\/\/([^\/]*\.)?wywurxj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wzcub\.szm\.sk
+https?:\/\/([^\/]*\.)?wzhj\.com\.cn
+https?:\/\/([^\/]*\.)?wzhjom6\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?wzlsx\.com
+https?:\/\/([^\/]*\.)?x-cialis\.be
+https?:\/\/([^\/]*\.)?x-ho-com-m23lsy\.blogspot\.com
+https?:\/\/([^\/]*\.)?x-ho-com-mlk2tai422\.blogspot\.com
+https?:\/\/([^\/]*\.)?x-orgy-com-in7nn0o1\.blogspot\.com
+https?:\/\/([^\/]*\.)?x24\.xxuz\.com
+https?:\/\/([^\/]*\.)?x25\.2mydns\.com
+https?:\/\/([^\/]*\.)?x25\.plorp\.com
+https?:\/\/([^\/]*\.)?x4\.lov3\.net
+https?:\/\/([^\/]*\.)?x6x\.a\.la
+https?:\/\/([^\/]*\.)?x888x\.myserver\.org
+https?:\/\/([^\/]*\.)?x8x\.trickip\.net
+https?:\/\/([^\/]*\.)?xadultpersonals\.com
+https?:\/\/([^\/]*\.)?xafengyuan\.com
+https?:\/\/([^\/]*\.)?xaltc\.szm\.sk
+https?:\/\/([^\/]*\.)?xanax-911\.coz\.in
+https?:\/\/([^\/]*\.)?xanax-acpq\.blogspot\.com
+https?:\/\/([^\/]*\.)?xanax-ccc\.blogspot\.com
+https?:\/\/([^\/]*\.)?xanax-lyiy\.blogspot\.com
+https?:\/\/([^\/]*\.)?xanax-online\.cheapills\.info
+https?:\/\/([^\/]*\.)?xanax\.esguay\.com
+https?:\/\/([^\/]*\.)?xanax\.goodpharm\.info
+https?:\/\/([^\/]*\.)?xanax\.skocz\.net
+https?:\/\/([^\/]*\.)?xanax\.su\.pl
+https?:\/\/([^\/]*\.)?xanaxnx\.u\.yuku\.com
+https?:\/\/([^\/]*\.)?xawcj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xboct13\.blogspot\.com
+https?:\/\/([^\/]*\.)?xbyzkngo-teensite\.blogspot\.com
+https?:\/\/([^\/]*\.)?xcp\.51mp4mp3\.com
+https?:\/\/([^\/]*\.)?xd-fw\.com
+https?:\/\/([^\/]*\.)?xdwxs\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xdzs\.com\.cn
+https?:\/\/([^\/]*\.)?xef-publicinvasion-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?xejedot-sophie-marceau-c\.blogspot\.com
+https?:\/\/([^\/]*\.)?xelby0\.blogspot\.com
+https?:\/\/([^\/]*\.)?xenical\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?xenical\.1k\.pl
+https?:\/\/([^\/]*\.)?xenicallem\.queroumforum\.com
+https?:\/\/([^\/]*\.)?xfdr7\.szm\.sk
+https?:\/\/([^\/]*\.)?xfokcw0\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xgdlfj\.com
+https?:\/\/([^\/]*\.)?xhttp\.net
+https?:\/\/([^\/]*\.)?xian-hua\.nease\.net
+https?:\/\/([^\/]*\.)?xiangyujipiao\.com
+https?:\/\/([^\/]*\.)?xibch\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xih-snakesworld-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?xih-topless-babes-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?xihdl\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xionny\.cn
+https?:\/\/([^\/]*\.)?xitokiry\.blogspot\.com
+https?:\/\/([^\/]*\.)?xiwhr\.szm\.sk
+https?:\/\/([^\/]*\.)?xjenhx\.blogspot\.com
+https?:\/\/([^\/]*\.)?xlala\.com
+https?:\/\/([^\/]*\.)?xlale\.com
+https?:\/\/([^\/]*\.)?xlalu\.com
+https?:\/\/([^\/]*\.)?xlvc3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xlxx-com-i0xeru\.blogspot\.com
+https?:\/\/([^\/]*\.)?xlxx-fokiq\.blogspot\.com
+https?:\/\/([^\/]*\.)?xlxx-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?xmail\.net
+https?:\/\/([^\/]*\.)?xmodem-mal\.blogspot\.com
+https?:\/\/([^\/]*\.)?xnbs1\.szm\.sk
+https?:\/\/([^\/]*\.)?xnews\.soad\.umich\.edu
+https?:\/\/([^\/]*\.)?xnxx-com-e06t\.blogspot\.com
+https?:\/\/([^\/]*\.)?xnxx-crcdfs0jy6\.blogspot\.com
+https?:\/\/([^\/]*\.)?xnxxmovies-com-bv10g2\.blogspot\.com
+https?:\/\/([^\/]*\.)?xnxxmovies-com-wv\.blogspot\.com
+https?:\/\/([^\/]*\.)?xo-whatever\.blogspot\.com
+https?:\/\/([^\/]*\.)?xolz4\.szm\.sk
+https?:\/\/([^\/]*\.)?xometi\.com
+https?:\/\/([^\/]*\.)?xonlinedating\.com
+https?:\/\/([^\/]*\.)?xoomer\.alice\.it
+https?:\/\/([^\/]*\.)?xparamacy\.org
+https?:\/\/([^\/]*\.)?xpharmacy\.org
+https?:\/\/([^\/]*\.)?xqnqh\.szm\.sk
+https?:\/\/([^\/]*\.)?xr\.bz
+https?:\/\/([^\/]*\.)?xsecrets-com-kyms\.blogspot\.com
+https?:\/\/([^\/]*\.)?xsgr7\.szm\.sk
+https?:\/\/([^\/]*\.)?xshorturl\.info
+https?:\/\/([^\/]*\.)?xsyvh\.szm\.sk
+https?:\/\/([^\/]*\.)?xt168\.com
+https?:\/\/([^\/]*\.)?xudo-akira\.blogspot\.com
+https?:\/\/([^\/]*\.)?xujwy\.szm\.sk
+https?:\/\/([^\/]*\.)?xun-screwedupmovies-com\.blogspot\.com
+https?:\/\/([^\/]*\.)?xvbbols\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?xvec\.com
+https?:\/\/([^\/]*\.)?xvnj5\.szm\.sk
+https?:\/\/([^\/]*\.)?xwsdr\.szm\.sk
+https?:\/\/([^\/]*\.)?xxellaxx\.250free\.com
+https?:\/\/([^\/]*\.)?xxhk2\.szm\.sk
+https?:\/\/([^\/]*\.)?xxlmovies-com-gswie\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxlmovies-com-m7rg0g8viu\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxlmovies-mcorb4\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxufdm-free-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxx-mature-movie-gallery\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?xxx-pic-blonde\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?xxx-porn-clip-blogn0y\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxx0movie\.info
+https?:\/\/([^\/]*\.)?xxx1adult1video\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxx1clip\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxx1movie\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxx1video\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxdessert-com-rl7e3\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxfolder-com-h3126\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxkey-com-ma\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxlost\.info
+https?:\/\/([^\/]*\.)?xxxphenterm1nen0w\.tripod\.com
+https?:\/\/([^\/]*\.)?xxxpornstarclassics-com-cezx51lw8\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxpornstarclassics-com-d2ttwy\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxpower-net-aped3c1xa\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxproposal-com-b06etpw\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxvogue-hux\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxvogue-net-oe2t1p081c\.blogspot\.com
+https?:\/\/([^\/]*\.)?xxxvogue-net-qerij\.blogspot\.com
+https?:\/\/([^\/]*\.)?xyz-i2\.blogspot\.com
+https?:\/\/([^\/]*\.)?xyzzy-k7c37b5tuw\.blogspot\.com
+https?:\/\/([^\/]*\.)?xzc\.org\.ua
+https?:\/\/([^\/]*\.)?xzgang-bangorgy\.hav\.pl
+https?:\/\/([^\/]*\.)?xznylonlycra\.hav\.pl
+https?:\/\/([^\/]*\.)?xzrapeextreme\.hav\.pl
+https?:\/\/([^\/]*\.)?xzzoodogsex\.hav\.pl
+https?:\/\/([^\/]*\.)?y--e--s\.com
+https?:\/\/([^\/]*\.)?ya\.ru
+https?:\/\/([^\/]*\.)?yaahoeu\.com
+https?:\/\/([^\/]*\.)?yaco-hbkklx6ltp\.blogspot\.com
+https?:\/\/([^\/]*\.)?yahia-g3x\.blogspot\.com
+https?:\/\/([^\/]*\.)?yaho-rei6\.blogspot\.com
+https?:\/\/([^\/]*\.)?yahoochat-w11g7\.blogspot\.com
+https?:\/\/([^\/]*\.)?yale-eui5rgcu\.blogspot\.com
+https?:\/\/([^\/]*\.)?yamaha-scooter\.hotmail\.ru
+https?:\/\/([^\/]*\.)?yamaha-t46nzou\.blogspot\.com
+https?:\/\/([^\/]*\.)?yamaha2scooter\.chat\.ru
+https?:\/\/([^\/]*\.)?yamel-da\.blogspot\.com
+https?:\/\/([^\/]*\.)?yamil-c1n2ob52\.blogspot\.com
+https?:\/\/([^\/]*\.)?yamonee-bqcyojq\.blogspot\.com
+https?:\/\/([^\/]*\.)?yang-as\.blogspot\.com
+https?:\/\/([^\/]*\.)?yankees-o3\.blogspot\.com
+https?:\/\/([^\/]*\.)?yasashisa\.blogspot\.com
+https?:\/\/([^\/]*\.)?yashun-i63\.blogspot\.com
+https?:\/\/([^\/]*\.)?yasin-kfn0g\.blogspot\.com
+https?:\/\/([^\/]*\.)?yaskap\.com
+https?:\/\/([^\/]*\.)?yasmin-hovn5q\.blogspot\.com
+https?:\/\/([^\/]*\.)?yasmin\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?yazar-rnzt\.blogspot\.com
+https?:\/\/([^\/]*\.)?yblwoh-free-video\.blogspot\.com
+https?:\/\/([^\/]*\.)?ycft3\.szm\.sk
+https?:\/\/([^\/]*\.)?ycixxgt\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ycsv1\.szm\.sk
+https?:\/\/([^\/]*\.)?ydyofrj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ydyp\.left-web\.com
+https?:\/\/([^\/]*\.)?ydyp\.zxvo\.com
+https?:\/\/([^\/]*\.)?yehuo\.cn
+https?:\/\/([^\/]*\.)?yell0w-n1njaman\.blogspot\.com
+https?:\/\/([^\/]*\.)?yellow-wc4pxnc\.blogspot\.com
+https?:\/\/([^\/]*\.)?yellowstone-e4b\.blogspot\.com
+https?:\/\/([^\/]*\.)?yes-t2cfk28\.blogspot\.com
+https?:\/\/([^\/]*\.)?yesenia-dip5700iq\.blogspot\.com
+https?:\/\/([^\/]*\.)?yessenia-c0ue443\.blogspot\.com
+https?:\/\/([^\/]*\.)?yetbarek-b31fe\.blogspot\.com
+https?:\/\/([^\/]*\.)?yfojo\.szm\.sk
+https?:\/\/([^\/]*\.)?yfxy2\.szm\.sk
+https?:\/\/([^\/]*\.)?yhmh\.vip\.myrice\.com
+https?:\/\/([^\/]*\.)?yi-gan\.com
+https?:\/\/([^\/]*\.)?yicloqd\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?yiqiyibiao\.dzsc\.com
+https?:\/\/([^\/]*\.)?yisroel-a5dk2rzyvx\.blogspot\.com
+https?:\/\/([^\/]*\.)?yjyvm\.szm\.sk
+https?:\/\/([^\/]*\.)?ymaby\.info
+https?:\/\/([^\/]*\.)?yncharm\.com
+https?:\/\/([^\/]*\.)?ynij1\.szm\.sk
+https?:\/\/([^\/]*\.)?ynkbb\.szm\.sk
+https?:\/\/([^\/]*\.)?ynndy\.szm\.sk
+https?:\/\/([^\/]*\.)?ynztp\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?yoda-oz08ueg\.blogspot\.com
+https?:\/\/([^\/]*\.)?yoel-mu5ej\.blogspot\.com
+https?:\/\/([^\/]*\.)?yogee\.info
+https?:\/\/([^\/]*\.)?yojany-iu3bpg2\.blogspot\.com
+https?:\/\/([^\/]*\.)?yolanda-k1\.blogspot\.com
+https?:\/\/([^\/]*\.)?yomama-hmsa\.blogspot\.com
+https?:\/\/([^\/]*\.)?yongxun\.net
+https?:\/\/([^\/]*\.)?yosemite-gf77c0ggp\.blogspot\.com
+https?:\/\/([^\/]*\.)?yoshi-in-black\.blogspot\.com
+https?:\/\/([^\/]*\.)?yosuke-r8aua1\.blogspot\.com
+https?:\/\/([^\/]*\.)?young-anal-fuck\.travel-ag\.od\.ua
+https?:\/\/([^\/]*\.)?young-anal-sex\.travel-ag\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?young-blonde-slut\.medved\.uzhgorod\.ua
+https?:\/\/([^\/]*\.)?young-britney\.babubi\.net
+https?:\/\/([^\/]*\.)?young-cheerleader-pic\.medved\.od\.ua
+https?:\/\/([^\/]*\.)?young-chubby-pussy\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?young-ffm\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?young-lesbian-having-sex\.protime\.in\.ua
+https?:\/\/([^\/]*\.)?young-sex\.futureblog\.org
+https?:\/\/([^\/]*\.)?young-teen-girl-anal\.aroundworld\.in\.ua
+https?:\/\/([^\/]*\.)?young-tender\.info
+https?:\/\/([^\/]*\.)?young-wqn\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngerbabes-com-d1fem\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngerbabes-com-dpdc\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngerbabes-freesite\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngleafs-eh2a6kcze\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngpervs-com-wdh\.blogspot\.com
+https?:\/\/([^\/]*\.)?youngshemalesex\.com
+https?:\/\/([^\/]*\.)?your-online-health\.com
+https?:\/\/([^\/]*\.)?your-starry-sky\.blogspot\.com
+https?:\/\/([^\/]*\.)?yourbudgetcar\.info
+https?:\/\/([^\/]*\.)?yourbusinesshouston\.info
+https?:\/\/([^\/]*\.)?yourchryslersebring\.info
+https?:\/\/([^\/]*\.)?yourgunter\.com
+https?:\/\/([^\/]*\.)?yourhealthypharmacy\.com
+https?:\/\/([^\/]*\.)?yourlust-com-rttu8a0a\.blogspot\.com
+https?:\/\/([^\/]*\.)?yourmazdacar\.info
+https?:\/\/([^\/]*\.)?yourmerchandise\.org
+https?:\/\/([^\/]*\.)?yourofe\.com
+https?:\/\/([^\/]*\.)?yrada\.flnet\.org
+https?:\/\/([^\/]*\.)?yrecnfz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?yrgs2\.szm\.sk
+https?:\/\/([^\/]*\.)?yronc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ysvc0\.szm\.sk
+https?:\/\/([^\/]*\.)?ytdebao\.com
+https?:\/\/([^\/]*\.)?ytgf84j\.nokedem\.com
+https?:\/\/([^\/]*\.)?ythsq\.com
+https?:\/\/([^\/]*\.)?ytifexil\.org
+https?:\/\/([^\/]*\.)?ytlmc\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ytwoqlj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?yucaibooks\.com
+https?:\/\/([^\/]*\.)?yuebing\.com
+https?:\/\/([^\/]*\.)?yume-taira\.blogspot\.com
+https?:\/\/([^\/]*\.)?yuniel-ebyd5\.blogspot\.com
+https?:\/\/([^\/]*\.)?yunmak\.com
+https?:\/\/([^\/]*\.)?yushantang\.com
+https?:\/\/([^\/]*\.)?yvette-tshq577\.blogspot\.com
+https?:\/\/([^\/]*\.)?yvonte-dyv02l\.blogspot\.com
+https?:\/\/([^\/]*\.)?yvpwh\.szm\.sk
+https?:\/\/([^\/]*\.)?ywnid\.szm\.sk
+https?:\/\/([^\/]*\.)?ywuyuan\.com
+https?:\/\/([^\/]*\.)?ywxjm\.com
+https?:\/\/([^\/]*\.)?yycp\.com
+https?:\/\/([^\/]*\.)?yylive\.info
+https?:\/\/([^\/]*\.)?yyys\.com\.cn
+https?:\/\/([^\/]*\.)?z411\.net
+https?:\/\/([^\/]*\.)?za\.spamim\.net
+https?:\/\/([^\/]*\.)?zabavna9sy4ka\.biografi\.org
+https?:\/\/([^\/]*\.)?zaccary-ciworog\.blogspot\.com
+https?:\/\/([^\/]*\.)?zachariah-bebg88d2x\.blogspot\.com
+https?:\/\/([^\/]*\.)?zacharias-a0kmh1em7\.blogspot\.com
+https?:\/\/([^\/]*\.)?zacharygen-okno4540\.blogspot\.com
+https?:\/\/([^\/]*\.)?zacherie-m82qs0617\.blogspot\.com
+https?:\/\/([^\/]*\.)?zack-ir368\.blogspot\.com
+https?:\/\/([^\/]*\.)?zackari-kkcdz8\.blogspot\.com
+https?:\/\/([^\/]*\.)?zackarylee-h4qu\.blogspot\.com
+https?:\/\/([^\/]*\.)?zackerize-ge\.blogspot\.com
+https?:\/\/([^\/]*\.)?zahtavia-riy3\.blogspot\.com
+https?:\/\/([^\/]*\.)?zaid-wi0g\.blogspot\.com
+https?:\/\/([^\/]*\.)?zaidimar-ej\.blogspot\.com
+https?:\/\/([^\/]*\.)?zainab-t46we0w3y\.blogspot\.com
+https?:\/\/([^\/]*\.)?zakaria-c5j57crpj7\.blogspot\.com
+https?:\/\/([^\/]*\.)?zanaflex\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?zanuda-juja\.blogspot\.com
+https?:\/\/([^\/]*\.)?zap-ar2fzu\.blogspot\.com
+https?:\/\/([^\/]*\.)?zara-oze5dt\.blogspot\.com
+https?:\/\/([^\/]*\.)?zarat\.php5\.cz
+https?:\/\/([^\/]*\.)?zatowana-m5hsah3h\.blogspot\.com
+https?:\/\/([^\/]*\.)?zaxswq\.com
+https?:\/\/([^\/]*\.)?zayfa\.com
+https?:\/\/([^\/]*\.)?zazu-ikzc0402\.blogspot\.com
+https?:\/\/([^\/]*\.)?zbbi8\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?zbifhoep\.t35\.com
+https?:\/\/([^\/]*\.)?zbjyzm1\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zbrown\.org
+https?:\/\/([^\/]*\.)?zbwk\.com
+https?:\/\/([^\/]*\.)?zcld\.net
+https?:\/\/([^\/]*\.)?zdei\.nokedem\.com
+https?:\/\/([^\/]*\.)?zdpid\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?ze-sex-video-download\.blogspot\.com
+https?:\/\/([^\/]*\.)?zebbiejohnson\.blogspot\.com
+https?:\/\/([^\/]*\.)?zebra-ka8g\.blogspot\.com
+https?:\/\/([^\/]*\.)?zebutal\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?zeds\.info
+https?:\/\/([^\/]*\.)?zeku-airhead\.blogspot\.com
+https?:\/\/([^\/]*\.)?zelalal\.darkbb\.com
+https?:\/\/([^\/]*\.)?zelalli\.blogcu\.com
+https?:\/\/([^\/]*\.)?zelbasleto\.heavenforum\.com
+https?:\/\/([^\/]*\.)?zeldomric\.dl\.pl
+https?:\/\/([^\/]*\.)?zelekah-h5u4yo\.blogspot\.com
+https?:\/\/([^\/]*\.)?zella\.grafbb\.com
+https?:\/\/([^\/]*\.)?zelladar\.bb-fr\.com
+https?:\/\/([^\/]*\.)?zellapask\.lolbb\.com
+https?:\/\/([^\/]*\.)?zelpasacel\.dl\.pl
+https?:\/\/([^\/]*\.)?zelrelacel\.su\.pl
+https?:\/\/([^\/]*\.)?zelrelli\.zj\.pl
+https?:\/\/([^\/]*\.)?zelrelzel\.blogcu\.com
+https?:\/\/([^\/]*\.)?zelrictr\.lolforum\.net
+https?:\/\/([^\/]*\.)?zelvaracel\.zikforum\.com
+https?:\/\/([^\/]*\.)?zelviacel\.frbb\.net
+https?:\/\/([^\/]*\.)?zelvicat\.fr-bb\.com
+https?:\/\/([^\/]*\.)?zemiacik\.yi\.org
+https?:\/\/([^\/]*\.)?zena-grmhf3shi\.blogspot\.com
+https?:\/\/([^\/]*\.)?zenaidalee-rm0p6t8md\.blogspot\.com
+https?:\/\/([^\/]*\.)?zenda-wszf1\.blogspot\.com
+https?:\/\/([^\/]*\.)?zennie-ey5i633f\.blogspot\.com
+https?:\/\/([^\/]*\.)?zenw7\.szm\.sk
+https?:\/\/([^\/]*\.)?zephyr-tk1\.blogspot\.com
+https?:\/\/([^\/]*\.)?zepporah-dypvn5g3\.blogspot\.com
+https?:\/\/([^\/]*\.)?zerks\.info
+https?:\/\/([^\/]*\.)?zfbfbs9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zfkmaei\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zghy2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zgzr\.com
+https?:\/\/([^\/]*\.)?zhenrong\.com\.cn
+https?:\/\/([^\/]*\.)?zhihehotel\.com
+https?:\/\/([^\/]*\.)?zhiju\.home4u\.china\.com
+https?:\/\/([^\/]*\.)?zhkaw\.com
+https?:\/\/([^\/]*\.)?zhkuj\.fr33webhost\.com
+https?:\/\/([^\/]*\.)?zhopaitalii\.info
+https?:\/\/([^\/]*\.)?zhuxg\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zhw35iida\.org
+https?:\/\/([^\/]*\.)?ziahya-cbqb\.blogspot\.com
+https?:\/\/([^\/]*\.)?zimg4\.szm\.sk
+https?:\/\/([^\/]*\.)?zimmerman-a4shi\.blogspot\.com
+https?:\/\/([^\/]*\.)?zippedurl\.com
+https?:\/\/([^\/]*\.)?zisai\.com\.cn
+https?:\/\/([^\/]*\.)?ziseq-sex-movie-x\.blogspot\.com
+https?:\/\/([^\/]*\.)?zithromaxbuycheap\.drive\.to
+https?:\/\/([^\/]*\.)?zithromaxbuygeneric\.cut\.by
+https?:\/\/([^\/]*\.)?zithromaxcheap\.drive\.to
+https?:\/\/([^\/]*\.)?zithromaxgenericbuy\.drive\.to
+https?:\/\/([^\/]*\.)?zithromaxgenericcheap\.dive\.to
+https?:\/\/([^\/]*\.)?zithromaxxonline\.ovp\.pl
+https?:\/\/([^\/]*\.)?zivuc-free-sex-movie-l\.blogspot\.com
+https?:\/\/([^\/]*\.)?zjeyu\.com
+https?:\/\/([^\/]*\.)?zjpgxo4\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zjudeyah-m2r38d\.blogspot\.com
+https?:\/\/([^\/]*\.)?zjww\.com
+https?:\/\/([^\/]*\.)?zlid3\.szm\.sk
+https?:\/\/([^\/]*\.)?zljekr8\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zlocztw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zmga3\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zmodem-isjrjd\.blogspot\.com
+https?:\/\/([^\/]*\.)?zocor\.bad-food\.net
+https?:\/\/([^\/]*\.)?zocor\.barnkalas\.net
+https?:\/\/([^\/]*\.)?zocor\.blomberg\.nu
+https?:\/\/([^\/]*\.)?zocor\.bokmarke\.nu
+https?:\/\/([^\/]*\.)?zocor\.bredbandsfabriken\.nu
+https?:\/\/([^\/]*\.)?zocor\.center\.nu
+https?:\/\/([^\/]*\.)?zocor\.hellstrom\.nu
+https?:\/\/([^\/]*\.)?zocor\.hem\.nu
+https?:\/\/([^\/]*\.)?zocor\.infosajt\.net
+https?:\/\/([^\/]*\.)?zocor\.internetreklam\.nu
+https?:\/\/([^\/]*\.)?zocor\.jacobson\.nu
+https?:\/\/([^\/]*\.)?zoe-ktd\.blogspot\.com
+https?:\/\/([^\/]*\.)?zofarl\.com
+https?:\/\/([^\/]*\.)?zofia-hkn\.blogspot\.com
+https?:\/\/([^\/]*\.)?zoie-g2h02z5mta\.blogspot\.com
+https?:\/\/([^\/]*\.)?zoklaku\.forumculture\.net
+https?:\/\/([^\/]*\.)?zoklapec\.dynamicbb\.com
+https?:\/\/([^\/]*\.)?zoloft\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?zoloft\.1k\.pl
+https?:\/\/([^\/]*\.)?zoloft\.skocz\.net
+https?:\/\/([^\/]*\.)?zombie-r7ye\.blogspot\.com
+https?:\/\/([^\/]*\.)?zovirax\.esdemasiado\.com
+https?:\/\/([^\/]*\.)?zovirax\.inicioya\.com
+https?:\/\/([^\/]*\.)?zovirax\.ole\.to
+https?:\/\/([^\/]*\.)?zovirax\.redireccion\.com
+https?:\/\/([^\/]*\.)?zoya-w1tebgqbtr\.blogspot\.com
+https?:\/\/([^\/]*\.)?zpbvsng\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zpco4\.szm\.sk
+https?:\/\/([^\/]*\.)?zpykbi9\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zqit6\.szm\.sk
+https?:\/\/([^\/]*\.)?zqxss\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zsbupdo\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zswok\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zsxqgv2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ztauk\.szm\.sk
+https?:\/\/([^\/]*\.)?ztkvz\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ztlztpj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?ztnqok7\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zuleima-epbxv\.blogspot\.com
+https?:\/\/([^\/]*\.)?zulema-tsaieb\.blogspot\.com
+https?:\/\/([^\/]*\.)?zulmarie-dk8\.blogspot\.com
+https?:\/\/([^\/]*\.)?zuri-ch0\.blogspot\.com
+https?:\/\/([^\/]*\.)?zurysarai-bykp\.blogspot\.com
+https?:\/\/([^\/]*\.)?zusette-ai2\.blogspot\.com
+https?:\/\/([^\/]*\.)?zvcqr\.szm\.sk
+https?:\/\/([^\/]*\.)?zvnaw\.szm\.sk
+https?:\/\/([^\/]*\.)?zvoh2\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zvzsxqw\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zxtpets\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zya9\.info
+https?:\/\/([^\/]*\.)?zyban\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?zyban\.controlando\.com
+https?:\/\/([^\/]*\.)?zybans\.blogspot\.com
+https?:\/\/([^\/]*\.)?zyrtec\.1\.p2l\.info
+https?:\/\/([^\/]*\.)?zyrtec\.1k\.pl
+https?:\/\/([^\/]*\.)?zyrtec\.coz\.in
+https?:\/\/([^\/]*\.)?zywyn\.info
+https?:\/\/([^\/]*\.)?zzcwj\.myfreewebhost\.org
+https?:\/\/([^\/]*\.)?zzdx\.com
diff --git a/mod/dokuwiki/vendors/dokuwiki/conf/words.aspell.dist b/mod/dokuwiki/vendors/dokuwiki/conf/words.aspell.dist
new file mode 100644
index 000000000..a49138fcb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/conf/words.aspell.dist
@@ -0,0 +1,5 @@
+personal_ws-1.1 en 4 utf-8
+DokuWiki
+Wiki
+WikiWiki
+Gohr
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/_dummy
new file mode 100644
index 000000000..37ed18a63
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/_dummy
@@ -0,0 +1 @@
+data directory
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/attic/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/attic/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/attic/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/cache/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/cache/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/cache/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/index/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/index/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/index/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/locks/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/locks/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/locks/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/media/wiki/dokuwiki-128.png b/mod/dokuwiki/vendors/dokuwiki/data/media/wiki/dokuwiki-128.png
new file mode 100644
index 000000000..b2306ac95
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/media/wiki/dokuwiki-128.png
Binary files differ
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/meta/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/meta/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/meta/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/pages/playground/playground.txt b/mod/dokuwiki/vendors/dokuwiki/data/pages/playground/playground.txt
new file mode 100644
index 000000000..a2274bda4
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/pages/playground/playground.txt
@@ -0,0 +1 @@
+====== PlayGround ======
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/pages/sidebar.txt b/mod/dokuwiki/vendors/dokuwiki/data/pages/sidebar.txt
new file mode 100644
index 000000000..090a66349
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/pages/sidebar.txt
@@ -0,0 +1,2 @@
+{{indexmenu>..#1|js#thread navbar}}
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/dokuwiki.txt b/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/dokuwiki.txt
new file mode 100644
index 000000000..2cede366f
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/dokuwiki.txt
@@ -0,0 +1,66 @@
+[[http://www.dokuwiki.org/es:dokuwiki|es]] [[http://www.dokuwiki.org/ca:dokuwiki|ca]] [[http://www.dokuwiki.org/fr:dokuwiki|fr]] [[http://www.dokuwiki.org/dokuwiki|more]]
+
+====== DokuWiki ======
+
+[[doku>wiki:dokuwiki|{{wiki:dokuwiki-128.png }}]] DokuWiki is a standards compliant, simple to use [[wp>Wiki]], mainly aimed at creating documentation of any kind. It is targeted at developer teams, workgroups and small companies. It has a simple but powerful [[wiki:syntax]] which makes sure the datafiles remain readable outside the Wiki and eases the creation of structured texts. All data is stored in plain text files -- no database is required.
+
+Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki.
+
+===== Download =====
+
+DokuWiki is available at http://www.splitbrain.org/go/dokuwiki
+
+
+===== Read More =====
+
+All documentation and additional information besides the [[syntax|syntax description]] is maintained in the DokuWiki at [[doku>|www.dokuwiki.org]].
+
+**About DokuWiki**
+
+ * [[doku>features|A feature list]] :!:
+ * [[doku>users|Happy Users]]
+ * [[doku>press|Who wrote about it]]
+ * [[doku>blogroll|What Bloggers think]]
+ * [[http://www.wikimatrix.org/show/DokuWiki|Compare it with other wiki software]]
+
+**Installing DokuWiki**
+
+ * [[doku>requirements|System Requirements]]
+ * [[http://www.splitbrain.org/go/dokuwiki|Download DokuWiki]] :!:
+ * [[doku>changes|Change Log]]
+ * [[doku>Install|How to install or upgrade]] :!:
+ * [[doku>config|Configuration]]
+
+**Using DokuWiki**
+
+ * [[doku>syntax|Wiki Syntax]]
+ * [[doku>manual|The manual]] :!:
+ * [[doku>FAQ|Frequently Asked Questions (FAQ)]]
+ * [[doku>glossary|Glossary]]
+ * [[http://search.dokuwiki.org|Search for DokuWiki help and documentation]]
+
+**Customizing DokuWiki**
+
+ * [[doku>tips|Tips and Tricks]]
+ * [[doku>Template|How to create and use templates]]
+ * [[doku>plugins|Installing plugins]]
+ * [[doku>development|Development Resources]]
+
+**DokuWiki Feedback and Community**
+
+ * [[doku>newsletter|Subscribe to the newsletter]] :!:
+ * [[doku>mailinglist|Join the mailing list]]
+ * [[http://forum.dokuwiki.org|Check out the user forum]]
+ * [[doku>irc|Talk to other users in the IRC channel]]
+ * [[http://bugs.splitbrain.org/index.php?project=1|Submit bugs and feature wishes]]
+ * [[http://www.wikimatrix.org/forum/viewforum.php?id=10|Share your experiences in the WikiMatrix forum]]
+ * [[doku>thanks|Some humble thanks]]
+
+
+===== Copyright =====
+
+2004-2009 (c) Andreas Gohr <andi@splitbrain.org>((Please do not contact me for help and support -- use the [[doku>mailinglist]] or [[http://forum.dokuwiki.org|forum]] instead))
+
+The DokuWiki engine is licensed under [[http://www.gnu.org/licenses/gpl.html|GNU General Public License]] Version 2. If you use DokuWiki in your company, consider [[doku>donate|donating]] a few bucks ;-).
+
+Not sure what this means? See the [[doku>faq:license|FAQ on the Licenses]].
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/syntax.txt b/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/syntax.txt
new file mode 100644
index 000000000..7dad453db
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/pages/wiki/syntax.txt
@@ -0,0 +1,488 @@
+[[http://www.dokuwiki.org/es:syntax|es]] [[http://www.dokuwiki.org/ca:syntax|ca]] [[http://www.dokuwiki.org/fr:syntax|fr]] [[http://www.dokuwiki.org/syntax|more]]
+
+====== Formatting Syntax ======
+
+[[doku>DokuWiki]] supports some simple markup language, which tries to make the datafiles to be as readable as possible. This page contains all possible syntax you may use when editing the pages. Simply have a look at the source of this page by pressing the //Edit this page// button at the top or bottom of the page. If you want to try something, just use the [[playground:playground|playground]] page. The simpler markup is easily accessible via [[doku>toolbar|quickbuttons]], too.
+
+===== Basic Text Formatting =====
+
+DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts. Of course you can **__//''combine''//__** all these.
+
+ DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts.
+ Of course you can **__//''combine''//__** all these.
+
+You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+ You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+You can mark something as <del>deleted</del> as well.
+
+ You can mark something as <del>deleted</del> as well.
+
+**Paragraphs** are created from blank lines. If you want to **force a newline** without a paragraph, you can use two backslashes followed by a whitespace or the end of line.
+
+This is some text with some linebreaks\\ Note that the
+two backslashes are only recognized at the end of a line\\
+or followed by\\ a whitespace \\this happens without it.
+
+ This is some text with some linebreaks\\ Note that the
+ two backslashes are only recognized at the end of a line\\
+ or followed by\\ a whitespace \\this happens without it.
+
+You should use forced newlines only if really needed.
+
+===== Links =====
+
+DokuWiki supports multiple ways of creating links.
+
+==== External ====
+
+External links are recognized automagically: http://www.google.com or simply www.google.com - You can set the link text as well: [[http://www.google.com|This Link points to google]]. Email addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+ DokuWiki supports multiple ways of creating links. External links are recognized
+ automagically: http://www.google.com or simply www.google.com - You can set
+ link text as well: [[http://www.google.com|This Link points to google]]. Email
+ addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+==== Internal ====
+
+Internal links are created by using square brackets. You can either just give a [[pagename]] or use an additional [[pagename|link text]].
+
+ Internal links are created by using square brackets. You can either just give
+ a [[pagename]] or use an additional [[pagename|link text]].
+
+[[doku>pagename|Wiki pagenames]] are converted to lowercase automatically, special characters are not allowed.
+
+You can use [[some:namespaces]] by using a colon in the pagename.
+
+ You can use [[some:namespaces]] by using a colon in the pagename.
+
+For details about namespaces see [[doku>namespaces]].
+
+Linking to a specific section is possible, too. Just add the section name behind a hash character as known from HTML. This links to [[syntax#internal|this Section]].
+
+ This links to [[syntax#internal|this Section]].
+
+Notes:
+
+ * Links to [[syntax|existing pages]] are shown in a different style from [[nonexisting]] ones.
+ * DokuWiki does not use [[wp>CamelCase]] to automatically create links by default, but this behavior can be enabled in the [[doku>config]] file. Hint: If DokuWiki is a link, then it's enabled.
+ * When a section's heading is changed, its bookmark changes, too. So don't rely on section linking too much.
+
+==== Interwiki ====
+
+DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis. For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+ DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis.
+ For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+
+==== Windows Shares ====
+
+Windows shares like [[\\server\share|this]] are recognized, too. Please note that these only make sense in a homogeneous user group like a corporate [[wp>Intranet]].
+
+ Windows Shares like [[\\server\share|this]] are recognized, too.
+
+Notes:
+
+ * For security reasons direct browsing of windows shares only works in Microsoft Internet Explorer per default (and only in the "local zone").
+ * For Mozilla and Firefox it can be enabled through different workaround mentioned in the [[http://kb.mozillazine.org/Links_to_local_pages_don't_work|Mozilla Knowledge Base]].
+
+
+==== Image Links ====
+
+You can also use an image to link to another internal or external page by combining the syntax for links and [[#images_and_other_files|images]] (see below) like this:
+
+ [[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+[[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+Please note: The image formatting is the only formatting syntax accepted in link names.
+
+The whole [[#images_and_other_files|image]] and [[#links|link]] syntax is supported (including image resizing, internal and external images and URLs and interwiki links).
+
+===== Footnotes =====
+
+You can add footnotes ((This is a footnote)) by using double parentheses.
+
+ You can add footnotes ((This is a footnote)) by using double parentheses.
+
+===== Sectioning =====
+
+You can use up to five different levels of headlines to structure your content. If you have more than three headlines, a table of contents is generated automatically -- this can be disabled by including the string ''<nowiki>~~NOTOC~~</nowiki>'' in the document.
+
+==== Headline Level 3 ====
+=== Headline Level 4 ===
+== Headline Level 5 ==
+
+ ==== Headline Level 3 ====
+ === Headline Level 4 ===
+ == Headline Level 5 ==
+
+By using four or more dashes, you can make a horizontal line:
+
+----
+
+===== Images and Other Files =====
+
+You can include external and internal [[doku>images]] with curly brackets. Optionally you can specify the size of them.
+
+Real size: {{wiki:dokuwiki-128.png}}
+
+Resize to given width: {{wiki:dokuwiki-128.png?50}}
+
+Resize to given width and height((when the aspect ratio of the given width and height doesn't match that of the image, it will be cropped to the new ratio before resizing)): {{wiki:dokuwiki-128.png?200x50}}
+
+Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+ Real size: {{wiki:dokuwiki-128.png}}
+ Resize to given width: {{wiki:dokuwiki-128.png?50}}
+ Resize to given width and height: {{wiki:dokuwiki-128.png?200x50}}
+ Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+
+By using left or right whitespaces you can choose the alignment.
+
+{{ wiki:dokuwiki-128.png}}
+
+{{wiki:dokuwiki-128.png }}
+
+{{ wiki:dokuwiki-128.png }}
+
+ {{ wiki:dokuwiki-128.png}}
+ {{wiki:dokuwiki-128.png }}
+ {{ wiki:dokuwiki-128.png }}
+
+Of course, you can add a title (displayed as a tooltip by most browsers), too.
+
+{{ wiki:dokuwiki-128.png |This is the caption}}
+
+ {{ wiki:dokuwiki-128.png |This is the caption}}
+
+If you specify a filename (external or internal) that is not an image (''gif, jpeg, png''), then it will be displayed as a link instead.
+
+For linking an image to another page see [[#Image Links]] above.
+
+===== Lists =====
+
+Dokuwiki supports ordered and unordered lists. To create a list item, indent your text by two spaces and use a ''*'' for unordered lists or a ''-'' for ordered ones.
+
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+
+<code>
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+</code>
+
+Also take a look at the [[doku>faq:lists|FAQ on list items]].
+
+===== Text Conversions =====
+
+DokuWiki can convert certain pre-defined characters or strings into images or other text or HTML.
+
+The text to image conversion is mainly done for smileys. And the text to HTML conversion is used for typography replacements, but can be configured to use other HTML as well.
+
+==== Text to Image Conversions ====
+
+DokuWiki converts commonly used [[wp>emoticon]]s to their graphical equivalents. Those [[doku>Smileys]] and other images can be configured and extended. Here is an overview of Smileys included in DokuWiki:
+
+ * 8-) %% 8-) %%
+ * 8-O %% 8-O %%
+ * :-( %% :-( %%
+ * :-) %% :-) %%
+ * =) %% =) %%
+ * :-/ %% :-/ %%
+ * :-\ %% :-\ %%
+ * :-? %% :-? %%
+ * :-D %% :-D %%
+ * :-P %% :-P %%
+ * :-O %% :-O %%
+ * :-X %% :-X %%
+ * :-| %% :-| %%
+ * ;-) %% ;-) %%
+ * ^_^ %% ^_^ %%
+ * :?: %% :?: %%
+ * :!: %% :!: %%
+ * LOL %% LOL %%
+ * FIXME %% FIXME %%
+ * DELETEME %% DELETEME %%
+
+==== Text to HTML Conversions ====
+
+Typography: [[DokuWiki]] can convert simple text characters to their typographically correct entities. Here is an example of recognized characters.
+
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+
+<code>
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+</code>
+
+The same can be done to produce any kind of HTML, it just needs to be added to the [[doku>entities|pattern file]].
+
+There are three exceptions which do not come from that pattern file: multiplication entity (640x480), 'single' and "double quotes". They can be turned off through a [[doku>config:typography|config option]].
+
+===== Quoting =====
+
+Some times you want to mark some text to show it's a reply or comment. You can use the following syntax:
+
+ I think we should do it
+
+ > No we shouldn't
+
+ >> Well, I say we should
+
+ > Really?
+
+ >> Yes!
+
+ >>> Then lets do it!
+
+I think we should do it
+
+> No we shouldn't
+
+>> Well, I say we should
+
+> Really?
+
+>> Yes!
+
+>>> Then lets do it!
+
+===== Tables =====
+
+DokuWiki supports a simple syntax to create tables.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+| Row 2 Col 1 | some colspan (note the double pipe) ||
+| Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+Table rows have to start and end with a ''|'' for normal rows or a ''^'' for headers.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+ | Row 2 Col 1 | some colspan (note the double pipe) ||
+ | Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+To connect cells horizontally, just make the next cell completely empty as shown above. Be sure to have always the same amount of cell separators!
+
+Vertical tableheaders are possible, too.
+
+| ^ Heading 1 ^ Heading 2 ^
+^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+^ Heading 4 | no colspan this time | |
+^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+As you can see, it's the cell separator before a cell which decides about the formatting:
+
+ | ^ Heading 1 ^ Heading 2 ^
+ ^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+ ^ Heading 4 | no colspan this time | |
+ ^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+You can have rowspans (vertically connected cells) by adding '':::'' into the cells below the one to which they should connect.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+| Row 2 Col 1 | ::: | Row 2 Col 3 |
+| Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+Apart from the rowspan syntax those cells should not contain anything else.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+ | Row 2 Col 1 | ::: | Row 2 Col 3 |
+ | Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+You can align the table contents, too. Just add at least two whitespaces at the opposite end of your text: Add two spaces on the left to align right, two spaces on the right to align left and two spaces at least at both ends for centered text.
+
+^ Table with alignment ^^^
+| right| center |left |
+|left | right| center |
+| xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+This is how it looks in the source:
+
+ ^ Table with alignment ^^^
+ | right| center |left |
+ |left | right| center |
+ | xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+Note: Vertical alignment is not supported.
+
+===== No Formatting =====
+
+If you need to display text exactly like it is typed (without any formatting), enclose the area either with ''%%<nowiki>%%'' tags or even simpler, with double percent signs ''<nowiki>%%</nowiki>''.
+
+<nowiki>
+This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+</nowiki>
+The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+ <nowiki>
+ This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+ </nowiki>
+ The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+===== Code Blocks =====
+
+You can include code blocks into your documents by either indenting them by at least two spaces (like used for the previous examples) or by using the tags ''%%<code>%%'' or ''%%<file>%%''.
+
+ This is text is indented by two spaces.
+
+<code>
+This is preformatted code all spaces are preserved: like <-this
+</code>
+
+<file>
+This is pretty much the same, but you could use it to show that you quoted a file.
+</file>
+
+Those blocks were created by this source:
+
+ This is text is indented by two spaces.
+
+ <code>
+ This is preformatted code all spaces are preserved: like <-this
+ </code>
+
+ <file>
+ This is pretty much the same, but you could use it to show that you quoted a file.
+ </file>
+
+==== Syntax Highlighting ====
+
+[[wiki:DokuWiki]] can highlight sourcecode, which makes it easier to read. It uses the [[http://qbnz.com/highlighter/|GeSHi]] Generic Syntax Highlighter -- so any language supported by GeSHi is supported. The syntax is the same like in the code and file blocks in the previous section, but this time the name of the used language is inserted inside the tag. Eg. ''<nowiki><code java></nowiki>'' or ''<nowiki><file java></nowiki>''.
+
+<code java>
+/**
+ * The HelloWorldApp class implements an application that
+ * simply displays "Hello World!" to the standard output.
+ */
+class HelloWorldApp {
+ public static void main(String[] args) {
+ System.out.println("Hello World!"); //Display the string.
+ }
+}
+</code>
+
+The following language strings are currently recognized: //abap, actionscript-french, actionscript, actionscript3, ada, apache, applescript, asm, asp, autoit, avisynth, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, cil, cmake, cobol, cpp, cpp-qt, csharp, css, d, dcs, delphi, diff, div, dos, dot, eiffel, email, erlang, fo, fortran, freebasic, genero, glsl, gml, gnuplot, groovy, gettext, haskell, hq9plus, html, idl, ini, inno, intercal, io, java5, java, javascript, kixtart, klonec, klonecpp, latex, lisp, locobasic, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, make, matlab, mirc, modula3, mpasm, mxml, mysql, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle8, oracle11, pascal, perl, per, php-brief, php, pic16, pixelbender, plsql, povray, powershell, progress, prolog, properties, providex, python, qbasic, rails, rebol, reg, robots, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, tcl, teraterm, text, thinbasic, tsql, typoscript, vbnet, vb, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, winbatch, whois, xml, xorg_conf, xpp, z80//
+
+==== Downloadable Code Blocks ====
+
+When you use the ''%%<code>%%'' or ''%%<file>%%'' syntax as above, you might want to make the shown code available for download as well. You can to this by specifying a file name after language code like this:
+
+<code>
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+</code>
+
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+
+If you don't want any highlighting but want a downloadable file, specify a dash (''-'') as the language code: ''%%<code - myfile.foo>%%''.
+
+
+===== Embedding HTML and PHP =====
+
+You can embed raw HTML or PHP code into your documents by using the ''%%<html>%%'' or ''%%<php>%%'' tags. (Use uppercase tags if you need to enclose block level elements.)
+
+HTML example:
+
+<code>
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+</code>
+
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+
+PHP example:
+
+<code>
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(generated inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+</code>
+
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+
+**Please Note**: HTML and PHP embedding is disabled by default in the configuration. If disabled, the code is displayed instead of executed.
+
+===== RSS/ATOM Feed Aggregation =====
+[[DokuWiki]] can integrate data from external XML feeds. For parsing the XML feeds, [[http://simplepie.org/|SimplePie]] is used. All formats understood by SimplePie can be used in DokuWiki as well. You can influence the rendering by multiple additional space separated parameters:
+
+^ Parameter ^ Description ^
+| any number | will be used as maximum number items to show, defaults to 8 |
+| reverse | display the last items in the feed first |
+| author | show item authors names |
+| date | show item dates |
+| description| show the item description. If [[doku>config:htmlok|HTML]] is disabled all tags will be stripped |
+| //n//[dhm] | refresh period, where d=days, h=hours, m=minutes. (e.g. 12h = 12 hours). |
+
+The refresh period defaults to 4 hours. Any value below 10 minutes will be treated as 10 minutes. [[wiki:DokuWiki]] will generally try to supply a cached version of a page, obviously this is inappropriate when the page contains dynamic external content. The parameter tells [[wiki:DokuWiki]] to re-render the page if it is more than //refresh period// since the page was last rendered.
+
+**Example:**
+
+ {{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+{{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+
+===== Control Macros =====
+
+Some syntax influences how DokuWiki renders a page without creating any output it self. The following control macros are availble:
+
+^ Macro ^ Description |
+| %%~~NOTOC~~%% | If this macro is found on the page, no table of contents will be created |
+| %%~~NOCACHE~~%% | DokuWiki caches all output by default. Sometimes this might not be wanted (eg. when the %%<php>%% syntax above is used), adding this macro will force DokuWiki to rerender a page on every call |
+
+===== Syntax Plugins =====
+
+DokuWiki's syntax can be extended by [[doku>plugins|Plugins]]. How the installed plugins are used is described on their appropriate description pages. The following syntax plugins are available in this particular DokuWiki installation:
+
+~~INFO:syntaxplugins~~
diff --git a/mod/dokuwiki/vendors/dokuwiki/data/tmp/_dummy b/mod/dokuwiki/vendors/dokuwiki/data/tmp/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/data/tmp/_dummy
diff --git a/mod/dokuwiki/vendors/dokuwiki/doku.php b/mod/dokuwiki/vendors/dokuwiki/doku.php
new file mode 100644
index 000000000..5566577f6
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/doku.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * DokuWiki mainscript
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// xdebug_start_profiling();
+
+if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+global $ACT;
+global $conf;
+
+if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
+ $ACT = trim(strtolower($_SERVER['HTTP_X_DOKUWIKI_DO']));
+} elseif (!empty($IDX)) {
+ $ACT = 'index';
+} elseif (get_input('do')) {
+ $ACT = get_input('do');
+} else {
+ $ACT = 'show';
+}
+
+global $QUERY;
+global $ID;
+global $NS;
+global $REV;
+global $IDX;
+global $DATE;
+global $RANGE;
+global $HIGH;
+global $TEXT;
+global $PRE;
+global $SUF;
+global $SUM;
+global $REV;
+global $INFO;
+global $JSINFO;
+
+
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/common.php');
+require_once(DOKU_INC.'inc/events.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/html.php');
+require_once(DOKU_INC.'inc/auth.php');
+require_once(DOKU_INC.'inc/actions.php');
+
+//import variables
+$QUERY = trim(get_input('id'));
+$ID = getID();
+$NS = getNS($ID);
+$REV = get_input('rev');
+$IDX = get_input('idx');
+$DATE = get_input('date');
+$RANGE = get_input('lines');
+$HIGH = get_input('s');
+if(empty($HIGH)) $HIGH = getGoogleQuery();
+
+$TEXT = cleanText($_POST['wikitext']);
+$PRE = cleanText($_POST['prefix']);
+$SUF = cleanText($_POST['suffix']);
+$SUM = get_input('summary');
+
+//sanitize revision
+$REV = preg_replace('/[^0-9]/','',$REV);
+
+//make infos about the selected page available
+$INFO = pageinfo();
+
+//export minimal infos to JS, plugins can add more
+$JSINFO['id'] = $ID;
+$JSINFO['namespace'] = (string) $INFO['namespace'];
+
+
+// handle debugging
+if($conf['allowdebug'] && $ACT == 'debug'){
+ html_debug();
+ exit;
+}
+
+//send 404 for missing pages if configured or ID has special meaning to bots
+if(!$INFO['exists'] &&
+ ($conf['send404'] || preg_match('/^(robots\.txt|sitemap\.xml(\.gz)?|favicon\.ico|crossdomain\.xml)$/',$ID)) &&
+ ($ACT == 'show' || substr($ACT,0,7) == 'export_') ){
+ header('HTTP/1.0 404 Not Found');
+}
+
+//prepare breadcrumbs (initialize a static var)
+if ($conf['breadcrumbs']) breadcrumbs();
+
+// check upstream
+checkUpdateMessages();
+
+$tmp = array(); // No event data
+trigger_event('DOKUWIKI_STARTED',$tmp);
+
+//close session
+session_write_close();
+
+//do the work
+act_dispatch($ACT);
+
+$tmp = array(); // No event data
+trigger_event('DOKUWIKI_DONE', $tmp);
+
+// xdebug_dump_function_profile(1);
+?>
diff --git a/mod/dokuwiki/vendors/dokuwiki/feed.php b/mod/dokuwiki/vendors/dokuwiki/feed.php
new file mode 100644
index 000000000..e7ea5808c
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/feed.php
@@ -0,0 +1,353 @@
+<?php
+/**
+ * XML feed export
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/common.php');
+require_once(DOKU_INC.'inc/events.php');
+require_once(DOKU_INC.'inc/parserutils.php');
+require_once(DOKU_INC.'inc/feedcreator.class.php');
+require_once(DOKU_INC.'inc/auth.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/httputils.php');
+
+//close session
+session_write_close();
+
+// get params
+$opt = rss_parseOptions();
+
+// the feed is dynamic - we need a cache for each combo
+// (but most people just use the default feed so it's still effective)
+$cache = getCacheName(join('',array_values($opt)).$_SERVER['REMOTE_USER'],'.feed');
+$key = join('', array_values($opt)) . $_SERVER['REMOTE_USER'];
+$cache = new cache($key, '.feed');
+
+// prepare cache depends
+$depends['files'] = getConfigFiles('main');
+$depends['age'] = $conf['rss_update'];
+$depends['purge'] = ($_REQUEST['purge']) ? true : false;
+
+// check cacheage and deliver if nothing has changed since last
+// time or the update interval has not passed, also handles conditional requests
+header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+header('Pragma: public');
+header('Content-Type: application/xml; charset=utf-8');
+header('X-Robots-Tag: noindex');
+if($cache->useCache($depends)) {
+ http_conditionalRequest($cache->_time);
+ if($conf['allowdebug']) header("X-CacheUsed: $cache->cache");
+ print $cache->retrieveCache();
+ exit;
+} else {
+ http_conditionalRequest(time());
+ }
+
+// create new feed
+$rss = new DokuWikiFeedCreator();
+$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
+$rss->link = DOKU_URL;
+$rss->syndicationURL = DOKU_URL.'feed.php';
+$rss->cssStyleSheet = DOKU_URL.'lib/exe/css.php?s=feed';
+
+$image = new FeedImage();
+$image->title = $conf['title'];
+$image->url = DOKU_URL."lib/images/favicon.ico";
+$image->link = DOKU_URL;
+$rss->image = $image;
+
+$data = null;
+if($opt['feed_mode'] == 'list'){
+ $data = rssListNamespace($opt);
+}elseif($opt['feed_mode'] == 'search'){
+ $data = rssSearch($opt);
+}else{
+ $eventData = array(
+ 'opt' => &$opt,
+ 'data' => &$data,
+ );
+ $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
+ if ($event->advise_before(true)) {
+ $data = rssRecentChanges($opt);
+ }
+ $event->advise_after();
+}
+
+rss_buildItems($rss, $data, $opt);
+$feed = $rss->createFeed($opt['feed_type'],'utf-8');
+
+// save cachefile
+$cache->storeCache($feed);
+
+// finally deliver
+print $feed;
+
+// ---------------------------------------------------------------- //
+
+/**
+ * Get URL parameters and config options and return a initialized option array
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function rss_parseOptions(){
+ global $conf;
+
+ $opt['items'] = (int) $_REQUEST['num'];
+ $opt['feed_type'] = $_REQUEST['type'];
+ $opt['feed_mode'] = $_REQUEST['mode'];
+ $opt['show_minor'] = $_REQUEST['minor'];
+ $opt['namespace'] = $_REQUEST['ns'];
+ $opt['link_to'] = $_REQUEST['linkto'];
+ $opt['item_content'] = $_REQUEST['content'];
+ $opt['search_query'] = $_REQUEST['q'];
+
+ if(!$opt['feed_type']) $opt['feed_type'] = $conf['rss_type'];
+ if(!$opt['item_content']) $opt['item_content'] = $conf['rss_content'];
+ if(!$opt['link_to']) $opt['link_to'] = $conf['rss_linkto'];
+ if(!$opt['items']) $opt['items'] = $conf['recent'];
+ $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
+
+ switch ($opt['feed_type']){
+ case 'rss':
+ $opt['feed_type'] = 'RSS0.91';
+ $opt['mime_type'] = 'text/xml';
+ break;
+ case 'rss2':
+ $opt['feed_type'] = 'RSS2.0';
+ $opt['mime_type'] = 'text/xml';
+ break;
+ case 'atom':
+ $opt['feed_type'] = 'ATOM0.3';
+ $opt['mime_type'] = 'application/xml';
+ break;
+ case 'atom1':
+ $opt['feed_type'] = 'ATOM1.0';
+ $opt['mime_type'] = 'application/atom+xml';
+ break;
+ default:
+ $opt['feed_type'] = 'RSS1.0';
+ $opt['mime_type'] = 'application/xml';
+ }
+
+ $eventData = array(
+ 'opt' => &$opt,
+ );
+ trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
+ return $opt;
+}
+
+/**
+ * Add recent changed pages to a feed object
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param object $rss - the FeedCreator Object
+ * @param array $data - the items to add
+ * @param array $opt - the feed options
+ */
+function rss_buildItems(&$rss,&$data,$opt){
+ global $conf;
+ global $lang;
+ global $auth;
+
+ $eventData = array(
+ 'rss' => &$rss,
+ 'data' => &$data,
+ 'opt' => &$opt,
+ );
+ $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
+ if ($event->advise_before(false)){
+ foreach($data as $ditem){
+ if(!is_array($ditem)){
+ // not an array? then only a list of IDs was given
+ $ditem = array( 'id' => $ditem );
+ }
+
+ $item = new FeedItem();
+ $id = $ditem['id'];
+ $meta = p_get_metadata($id);
+
+ // add date
+ if($ditem['date']){
+ $date = $ditem['date'];
+ }elseif($meta['date']['modified']){
+ $date = $meta['date']['modified'];
+ }else{
+ $date = @filemtime(wikiFN($id));
+ }
+ if($date) $item->date = date('r',$date);
+
+ // add title
+ if($conf['useheading'] && $meta['title']){
+ $item->title = $meta['title'];
+ }else{
+ $item->title = $ditem['id'];
+ }
+ if($conf['rss_show_summary'] && !empty($ditem['sum'])){
+ $item->title .= ' - '.strip_tags($ditem['sum']);
+ }
+
+ // add item link
+ switch ($opt['link_to']){
+ case 'page':
+ $item->link = wl($id,'rev='.$date,true,'&');
+ break;
+ case 'rev':
+ $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
+ break;
+ case 'current':
+ $item->link = wl($id, '', true,'&');
+ break;
+ case 'diff':
+ default:
+ $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
+ }
+
+ // add item content
+ switch ($opt['item_content']){
+ case 'diff':
+ case 'htmldiff':
+ require_once(DOKU_INC.'inc/DifferenceEngine.php');
+ $revs = getRevisions($id, 0, 1);
+ $rev = $revs[0];
+
+ if($rev){
+ $df = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
+ explode("\n",htmlspecialchars(rawWiki($id,''))));
+ }else{
+ $df = new Diff(array(''),
+ explode("\n",htmlspecialchars(rawWiki($id,''))));
+ }
+
+ if($opt['item_content'] == 'htmldiff'){
+ $tdf = new TableDiffFormatter();
+ $content = '<table>';
+ $content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
+ $content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
+ $content .= $tdf->format($df);
+ $content .= '</table>';
+ }else{
+ $udf = new UnifiedDiffFormatter();
+ $content = "<pre>\n".$udf->format($df)."\n</pre>";
+ }
+ break;
+ case 'html':
+ $content = p_wiki_xhtml($id,$date,false);
+ // no TOC in feeds
+ $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
+
+ // make URLs work when canonical is not set, regexp instead of rerendering!
+ if(!$conf['canonical']){
+ $base = preg_quote(DOKU_REL,'/');
+ $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
+ }
+
+ break;
+ case 'abstract':
+ default:
+ $content = $meta['description']['abstract'];
+ }
+ $item->description = $content; //FIXME a plugin hook here could be senseful
+
+ // add user
+ # FIXME should the user be pulled from metadata as well?
+ $user = null;
+ $user = @$ditem['user']; // the @ spares time repeating lookup
+ $item->author = '';
+ if($user && $conf['useacl'] && $auth){
+ $userInfo = $auth->getUserData($user);
+ $item->author = $userInfo['name'];
+ if($userInfo && !$opt['guardmail']){
+ $item->authorEmail = $userInfo['mail'];
+ }else{
+ //cannot obfuscate because some RSS readers may check validity
+ $item->authorEmail = $user.'@'.$ditem['ip'];
+ }
+ }elseif($user){
+ // this happens when no ACL but some Apache auth is used
+ $item->author = $user;
+ $item->authorEmail = $user.'@'.$ditem['ip'];
+ }else{
+ $item->authorEmail = 'anonymous@'.$ditem['ip'];
+ }
+
+ // add category
+ if($meta['subject']){
+ $item->category = $meta['subject'];
+ }else{
+ $cat = getNS($id);
+ if($cat) $item->category = $cat;
+ }
+
+ // finally add the item to the feed object, after handing it to registered plugins
+ $evdata = array('item' => &$item,
+ 'opt' => &$opt,
+ 'ditem' => &$ditem,
+ 'rss' => &$rss);
+ $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
+ if ($evt->advise_before()){
+ $rss->addItem($item);
+ }
+ $evt->advise_after(); // for completeness
+ }
+ }
+ $event->advise_after();
+}
+
+
+/**
+ * Add recent changed pages to the feed object
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function rssRecentChanges($opt){
+ global $conf;
+ global $auth;
+
+ $flags = RECENTS_SKIP_DELETED;
+ if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
+
+ $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
+ return $recents;
+}
+
+/**
+ * Add all pages of a namespace to the feed object
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function rssListNamespace($opt){
+ require_once(DOKU_INC.'inc/search.php');
+ global $conf;
+
+ $ns=':'.cleanID($opt['namespace']);
+ $ns=str_replace(':','/',$ns);
+
+ $data = array();
+ sort($data);
+ search($data,$conf['datadir'],'search_list','',$ns);
+
+ return $data;
+}
+
+/**
+ * Add the result of a full text search to the feed object
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function rssSearch($opt){
+ if(!$opt['search_query']) return;
+
+ require_once(DOKU_INC.'inc/fulltext.php');
+ $data = array();
+ $data = ft_pageSearch($opt['search_query'],$poswords);
+ $data = array_keys($data);
+
+ return $data;
+}
+
+//Setup VIM: ex: et ts=4 enc=utf-8 :
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/DifferenceEngine.php b/mod/dokuwiki/vendors/dokuwiki/inc/DifferenceEngine.php
new file mode 100644
index 000000000..e28826c1f
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/DifferenceEngine.php
@@ -0,0 +1,1066 @@
+<?php
+/**
+ * A PHP diff engine for phpwiki. (Taken from phpwiki-1.3.3)
+ *
+ * Additions by Axel Boldt for MediaWiki
+ *
+ * @copyright (C) 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
+ * @license You may copy this code freely under the conditions of the GPL.
+ */
+define('USE_ASSERTS', function_exists('assert'));
+
+class _DiffOp {
+ var $type;
+ var $orig;
+ var $closing;
+
+ function reverse() {
+ trigger_error("pure virtual", E_USER_ERROR);
+ }
+
+ function norig() {
+ return $this->orig ? sizeof($this->orig) : 0;
+ }
+
+ function nclosing() {
+ return $this->closing ? sizeof($this->closing) : 0;
+ }
+}
+
+class _DiffOp_Copy extends _DiffOp {
+ var $type = 'copy';
+
+ function _DiffOp_Copy ($orig, $closing = false) {
+ if (!is_array($closing))
+ $closing = $orig;
+ $this->orig = $orig;
+ $this->closing = $closing;
+ }
+
+ function reverse() {
+ return new _DiffOp_Copy($this->closing, $this->orig);
+ }
+}
+
+class _DiffOp_Delete extends _DiffOp {
+ var $type = 'delete';
+
+ function _DiffOp_Delete ($lines) {
+ $this->orig = $lines;
+ $this->closing = false;
+ }
+
+ function reverse() {
+ return new _DiffOp_Add($this->orig);
+ }
+}
+
+class _DiffOp_Add extends _DiffOp {
+ var $type = 'add';
+
+ function _DiffOp_Add ($lines) {
+ $this->closing = $lines;
+ $this->orig = false;
+ }
+
+ function reverse() {
+ return new _DiffOp_Delete($this->closing);
+ }
+}
+
+class _DiffOp_Change extends _DiffOp {
+ var $type = 'change';
+
+ function _DiffOp_Change ($orig, $closing) {
+ $this->orig = $orig;
+ $this->closing = $closing;
+ }
+
+ function reverse() {
+ return new _DiffOp_Change($this->closing, $this->orig);
+ }
+}
+
+
+/**
+ * Class used internally by Diff to actually compute the diffs.
+ *
+ * The algorithm used here is mostly lifted from the perl module
+ * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
+ * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
+ *
+ * More ideas are taken from:
+ * http://www.ics.uci.edu/~eppstein/161/960229.html
+ *
+ * Some ideas are (and a bit of code) are from from analyze.c, from GNU
+ * diffutils-2.7, which can be found at:
+ * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
+ *
+ * closingly, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
+ * are my own.
+ *
+ * @author Geoffrey T. Dairiki
+ * @access private
+ */
+class _DiffEngine
+{
+ function diff ($from_lines, $to_lines) {
+ $n_from = sizeof($from_lines);
+ $n_to = sizeof($to_lines);
+
+ $this->xchanged = $this->ychanged = array();
+ $this->xv = $this->yv = array();
+ $this->xind = $this->yind = array();
+ unset($this->seq);
+ unset($this->in_seq);
+ unset($this->lcs);
+
+ // Skip leading common lines.
+ for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {
+ if ($from_lines[$skip] != $to_lines[$skip])
+ break;
+ $this->xchanged[$skip] = $this->ychanged[$skip] = false;
+ }
+ // Skip trailing common lines.
+ $xi = $n_from; $yi = $n_to;
+ for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {
+ if ($from_lines[$xi] != $to_lines[$yi])
+ break;
+ $this->xchanged[$xi] = $this->ychanged[$yi] = false;
+ }
+
+ // Ignore lines which do not exist in both files.
+ for ($xi = $skip; $xi < $n_from - $endskip; $xi++)
+ $xhash[$from_lines[$xi]] = 1;
+ for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
+ $line = $to_lines[$yi];
+ if ( ($this->ychanged[$yi] = empty($xhash[$line])) )
+ continue;
+ $yhash[$line] = 1;
+ $this->yv[] = $line;
+ $this->yind[] = $yi;
+ }
+ for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
+ $line = $from_lines[$xi];
+ if ( ($this->xchanged[$xi] = empty($yhash[$line])) )
+ continue;
+ $this->xv[] = $line;
+ $this->xind[] = $xi;
+ }
+
+ // Find the LCS.
+ $this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
+
+ // Merge edits when possible
+ $this->_shift_boundaries($from_lines, $this->xchanged, $this->ychanged);
+ $this->_shift_boundaries($to_lines, $this->ychanged, $this->xchanged);
+
+ // Compute the edit operations.
+ $edits = array();
+ $xi = $yi = 0;
+ while ($xi < $n_from || $yi < $n_to) {
+ USE_ASSERTS && assert($yi < $n_to || $this->xchanged[$xi]);
+ USE_ASSERTS && assert($xi < $n_from || $this->ychanged[$yi]);
+
+ // Skip matching "snake".
+ $copy = array();
+ while ( $xi < $n_from && $yi < $n_to
+ && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {
+ $copy[] = $from_lines[$xi++];
+ ++$yi;
+ }
+ if ($copy)
+ $edits[] = new _DiffOp_Copy($copy);
+
+ // Find deletes & adds.
+ $delete = array();
+ while ($xi < $n_from && $this->xchanged[$xi])
+ $delete[] = $from_lines[$xi++];
+
+ $add = array();
+ while ($yi < $n_to && $this->ychanged[$yi])
+ $add[] = $to_lines[$yi++];
+
+ if ($delete && $add)
+ $edits[] = new _DiffOp_Change($delete, $add);
+ elseif ($delete)
+ $edits[] = new _DiffOp_Delete($delete);
+ elseif ($add)
+ $edits[] = new _DiffOp_Add($add);
+ }
+ return $edits;
+ }
+
+
+ /**
+ * Divide the Largest Common Subsequence (LCS) of the sequences
+ * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
+ * sized segments.
+ *
+ * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
+ * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
+ * sub sequences. The first sub-sequence is contained in [X0, X1),
+ * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
+ * that (X0, Y0) == (XOFF, YOFF) and
+ * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
+ *
+ * This function assumes that the first lines of the specified portions
+ * of the two files do not match, and likewise that the last lines do not
+ * match. The caller must trim matching lines from the beginning and end
+ * of the portions it is going to specify.
+ */
+ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) {
+ $flip = false;
+
+ if ($xlim - $xoff > $ylim - $yoff) {
+ // Things seems faster (I'm not sure I understand why)
+ // when the shortest sequence in X.
+ $flip = true;
+ list ($xoff, $xlim, $yoff, $ylim)
+ = array( $yoff, $ylim, $xoff, $xlim);
+ }
+
+ if ($flip)
+ for ($i = $ylim - 1; $i >= $yoff; $i--)
+ $ymatches[$this->xv[$i]][] = $i;
+ else
+ for ($i = $ylim - 1; $i >= $yoff; $i--)
+ $ymatches[$this->yv[$i]][] = $i;
+
+ $this->lcs = 0;
+ $this->seq[0]= $yoff - 1;
+ $this->in_seq = array();
+ $ymids[0] = array();
+
+ $numer = $xlim - $xoff + $nchunks - 1;
+ $x = $xoff;
+ for ($chunk = 0; $chunk < $nchunks; $chunk++) {
+ if ($chunk > 0)
+ for ($i = 0; $i <= $this->lcs; $i++)
+ $ymids[$i][$chunk-1] = $this->seq[$i];
+
+ $x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
+ for ( ; $x < $x1; $x++) {
+ $line = $flip ? $this->yv[$x] : $this->xv[$x];
+ if (empty($ymatches[$line]))
+ continue;
+ $matches = $ymatches[$line];
+ reset($matches);
+ while (list ($junk, $y) = each($matches))
+ if (empty($this->in_seq[$y])) {
+ $k = $this->_lcs_pos($y);
+ USE_ASSERTS && assert($k > 0);
+ $ymids[$k] = $ymids[$k-1];
+ break;
+ }
+ while (list ($junk, $y) = each($matches)) {
+ if ($y > $this->seq[$k-1]) {
+ USE_ASSERTS && assert($y < $this->seq[$k]);
+ // Optimization: this is a common case:
+ // next match is just replacing previous match.
+ $this->in_seq[$this->seq[$k]] = false;
+ $this->seq[$k] = $y;
+ $this->in_seq[$y] = 1;
+ }
+ else if (empty($this->in_seq[$y])) {
+ $k = $this->_lcs_pos($y);
+ USE_ASSERTS && assert($k > 0);
+ $ymids[$k] = $ymids[$k-1];
+ }
+ }
+ }
+ }
+
+ $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff);
+ $ymid = $ymids[$this->lcs];
+ for ($n = 0; $n < $nchunks - 1; $n++) {
+ $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks);
+ $y1 = $ymid[$n] + 1;
+ $seps[] = $flip ? array($y1, $x1) : array($x1, $y1);
+ }
+ $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim);
+
+ return array($this->lcs, $seps);
+ }
+
+ function _lcs_pos ($ypos) {
+ $end = $this->lcs;
+ if ($end == 0 || $ypos > $this->seq[$end]) {
+ $this->seq[++$this->lcs] = $ypos;
+ $this->in_seq[$ypos] = 1;
+ return $this->lcs;
+ }
+
+ $beg = 1;
+ while ($beg < $end) {
+ $mid = (int)(($beg + $end) / 2);
+ if ( $ypos > $this->seq[$mid] )
+ $beg = $mid + 1;
+ else
+ $end = $mid;
+ }
+
+ USE_ASSERTS && assert($ypos != $this->seq[$end]);
+
+ $this->in_seq[$this->seq[$end]] = false;
+ $this->seq[$end] = $ypos;
+ $this->in_seq[$ypos] = 1;
+ return $end;
+ }
+
+ /**
+ * Find LCS of two sequences.
+ *
+ * The results are recorded in the vectors $this->{x,y}changed[], by
+ * storing a 1 in the element for each line that is an insertion
+ * or deletion (ie. is not in the LCS).
+ *
+ * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
+ *
+ * Note that XLIM, YLIM are exclusive bounds.
+ * All line numbers are origin-0 and discarded lines are not counted.
+ */
+ function _compareseq ($xoff, $xlim, $yoff, $ylim) {
+ // Slide down the bottom initial diagonal.
+ while ($xoff < $xlim && $yoff < $ylim
+ && $this->xv[$xoff] == $this->yv[$yoff]) {
+ ++$xoff;
+ ++$yoff;
+ }
+
+ // Slide up the top initial diagonal.
+ while ($xlim > $xoff && $ylim > $yoff
+ && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {
+ --$xlim;
+ --$ylim;
+ }
+
+ if ($xoff == $xlim || $yoff == $ylim)
+ $lcs = 0;
+ else {
+ // This is ad hoc but seems to work well.
+ //$nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
+ //$nchunks = max(2,min(8,(int)$nchunks));
+ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1;
+ list ($lcs, $seps)
+ = $this->_diag($xoff,$xlim,$yoff, $ylim,$nchunks);
+ }
+
+ if ($lcs == 0) {
+ // X and Y sequences have no common subsequence:
+ // mark all changed.
+ while ($yoff < $ylim)
+ $this->ychanged[$this->yind[$yoff++]] = 1;
+ while ($xoff < $xlim)
+ $this->xchanged[$this->xind[$xoff++]] = 1;
+ }
+ else {
+ // Use the partitions to split this problem into subproblems.
+ reset($seps);
+ $pt1 = $seps[0];
+ while ($pt2 = next($seps)) {
+ $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]);
+ $pt1 = $pt2;
+ }
+ }
+ }
+
+ /**
+ * Adjust inserts/deletes of identical lines to join changes
+ * as much as possible.
+ *
+ * We do something when a run of changed lines include a
+ * line at one end and has an excluded, identical line at the other.
+ * We are free to choose which identical line is included.
+ * `compareseq' usually chooses the one at the beginning,
+ * but usually it is cleaner to consider the following identical line
+ * to be the "change".
+ *
+ * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
+ */
+ function _shift_boundaries ($lines, &$changed, $other_changed) {
+ $i = 0;
+ $j = 0;
+
+ USE_ASSERTS && assert('sizeof($lines) == sizeof($changed)');
+ $len = sizeof($lines);
+ $other_len = sizeof($other_changed);
+
+ while (1) {
+ /*
+ * Scan forwards to find beginning of another run of changes.
+ * Also keep track of the corresponding point in the other file.
+ *
+ * Throughout this code, $i and $j are adjusted together so that
+ * the first $i elements of $changed and the first $j elements
+ * of $other_changed both contain the same number of zeros
+ * (unchanged lines).
+ * Furthermore, $j is always kept so that $j == $other_len or
+ * $other_changed[$j] == false.
+ */
+ while ($j < $other_len && $other_changed[$j])
+ $j++;
+
+ while ($i < $len && ! $changed[$i]) {
+ USE_ASSERTS && assert('$j < $other_len && ! $other_changed[$j]');
+ $i++; $j++;
+ while ($j < $other_len && $other_changed[$j])
+ $j++;
+ }
+
+ if ($i == $len)
+ break;
+
+ $start = $i;
+
+ // Find the end of this run of changes.
+ while (++$i < $len && $changed[$i])
+ continue;
+
+ do {
+ /*
+ * Record the length of this run of changes, so that
+ * we can later determine whether the run has grown.
+ */
+ $runlength = $i - $start;
+
+ /*
+ * Move the changed region back, so long as the
+ * previous unchanged line matches the last changed one.
+ * This merges with previous changed regions.
+ */
+ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) {
+ $changed[--$start] = 1;
+ $changed[--$i] = false;
+ while ($start > 0 && $changed[$start - 1])
+ $start--;
+ USE_ASSERTS && assert('$j > 0');
+ while ($other_changed[--$j])
+ continue;
+ USE_ASSERTS && assert('$j >= 0 && !$other_changed[$j]');
+ }
+
+ /*
+ * Set CORRESPONDING to the end of the changed run, at the last
+ * point where it corresponds to a changed run in the other file.
+ * CORRESPONDING == LEN means no such point has been found.
+ */
+ $corresponding = $j < $other_len ? $i : $len;
+
+ /*
+ * Move the changed region forward, so long as the
+ * first changed line matches the following unchanged one.
+ * This merges with following changed regions.
+ * Do this second, so that if there are no merges,
+ * the changed region is moved forward as far as possible.
+ */
+ while ($i < $len && $lines[$start] == $lines[$i]) {
+ $changed[$start++] = false;
+ $changed[$i++] = 1;
+ while ($i < $len && $changed[$i])
+ $i++;
+
+ USE_ASSERTS && assert('$j < $other_len && ! $other_changed[$j]');
+ $j++;
+ if ($j < $other_len && $other_changed[$j]) {
+ $corresponding = $i;
+ while ($j < $other_len && $other_changed[$j])
+ $j++;
+ }
+ }
+ } while ($runlength != $i - $start);
+
+ /*
+ * If possible, move the fully-merged run of changes
+ * back to a corresponding run in the other file.
+ */
+ while ($corresponding < $i) {
+ $changed[--$start] = 1;
+ $changed[--$i] = 0;
+ USE_ASSERTS && assert('$j > 0');
+ while ($other_changed[--$j])
+ continue;
+ USE_ASSERTS && assert('$j >= 0 && !$other_changed[$j]');
+ }
+ }
+ }
+}
+
+/**
+ * Class representing a 'diff' between two sequences of strings.
+ */
+class Diff
+{
+ var $edits;
+
+ /**
+ * Constructor.
+ * Computes diff between sequences of strings.
+ *
+ * @param $from_lines array An array of strings.
+ * (Typically these are lines from a file.)
+ * @param $to_lines array An array of strings.
+ */
+ function Diff($from_lines, $to_lines) {
+ $eng = new _DiffEngine;
+ $this->edits = $eng->diff($from_lines, $to_lines);
+ //$this->_check($from_lines, $to_lines);
+ }
+
+ /**
+ * Compute reversed Diff.
+ *
+ * SYNOPSIS:
+ *
+ * $diff = new Diff($lines1, $lines2);
+ * $rev = $diff->reverse();
+ * @return object A Diff object representing the inverse of the
+ * original diff.
+ */
+ function reverse () {
+ $rev = $this;
+ $rev->edits = array();
+ foreach ($this->edits as $edit) {
+ $rev->edits[] = $edit->reverse();
+ }
+ return $rev;
+ }
+
+ /**
+ * Check for empty diff.
+ *
+ * @return bool True iff two sequences were identical.
+ */
+ function isEmpty () {
+ foreach ($this->edits as $edit) {
+ if ($edit->type != 'copy')
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Compute the length of the Longest Common Subsequence (LCS).
+ *
+ * This is mostly for diagnostic purposed.
+ *
+ * @return int The length of the LCS.
+ */
+ function lcs () {
+ $lcs = 0;
+ foreach ($this->edits as $edit) {
+ if ($edit->type == 'copy')
+ $lcs += sizeof($edit->orig);
+ }
+ return $lcs;
+ }
+
+ /**
+ * Get the original set of lines.
+ *
+ * This reconstructs the $from_lines parameter passed to the
+ * constructor.
+ *
+ * @return array The original sequence of strings.
+ */
+ function orig() {
+ $lines = array();
+
+ foreach ($this->edits as $edit) {
+ if ($edit->orig)
+ array_splice($lines, sizeof($lines), 0, $edit->orig);
+ }
+ return $lines;
+ }
+
+ /**
+ * Get the closing set of lines.
+ *
+ * This reconstructs the $to_lines parameter passed to the
+ * constructor.
+ *
+ * @return array The sequence of strings.
+ */
+ function closing() {
+ $lines = array();
+
+ foreach ($this->edits as $edit) {
+ if ($edit->closing)
+ array_splice($lines, sizeof($lines), 0, $edit->closing);
+ }
+ return $lines;
+ }
+
+ /**
+ * Check a Diff for validity.
+ *
+ * This is here only for debugging purposes.
+ */
+ function _check ($from_lines, $to_lines) {
+ if (serialize($from_lines) != serialize($this->orig()))
+ trigger_error("Reconstructed original doesn't match", E_USER_ERROR);
+ if (serialize($to_lines) != serialize($this->closing()))
+ trigger_error("Reconstructed closing doesn't match", E_USER_ERROR);
+
+ $rev = $this->reverse();
+ if (serialize($to_lines) != serialize($rev->orig()))
+ trigger_error("Reversed original doesn't match", E_USER_ERROR);
+ if (serialize($from_lines) != serialize($rev->closing()))
+ trigger_error("Reversed closing doesn't match", E_USER_ERROR);
+
+
+ $prevtype = 'none';
+ foreach ($this->edits as $edit) {
+ if ( $prevtype == $edit->type )
+ trigger_error("Edit sequence is non-optimal", E_USER_ERROR);
+ $prevtype = $edit->type;
+ }
+
+ $lcs = $this->lcs();
+ trigger_error("Diff okay: LCS = $lcs", E_USER_NOTICE);
+ }
+}
+
+/**
+ * FIXME: bad name.
+ */
+class MappedDiff
+extends Diff
+{
+ /**
+ * Constructor.
+ *
+ * Computes diff between sequences of strings.
+ *
+ * This can be used to compute things like
+ * case-insensitve diffs, or diffs which ignore
+ * changes in white-space.
+ *
+ * @param $from_lines array An array of strings.
+ * (Typically these are lines from a file.)
+ *
+ * @param $to_lines array An array of strings.
+ *
+ * @param $mapped_from_lines array This array should
+ * have the same size number of elements as $from_lines.
+ * The elements in $mapped_from_lines and
+ * $mapped_to_lines are what is actually compared
+ * when computing the diff.
+ *
+ * @param $mapped_to_lines array This array should
+ * have the same number of elements as $to_lines.
+ */
+ function MappedDiff($from_lines, $to_lines,
+ $mapped_from_lines, $mapped_to_lines) {
+
+ assert(sizeof($from_lines) == sizeof($mapped_from_lines));
+ assert(sizeof($to_lines) == sizeof($mapped_to_lines));
+
+ $this->Diff($mapped_from_lines, $mapped_to_lines);
+
+ $xi = $yi = 0;
+ for ($i = 0; $i < sizeof($this->edits); $i++) {
+ $orig = &$this->edits[$i]->orig;
+ if (is_array($orig)) {
+ $orig = array_slice($from_lines, $xi, sizeof($orig));
+ $xi += sizeof($orig);
+ }
+
+ $closing = &$this->edits[$i]->closing;
+ if (is_array($closing)) {
+ $closing = array_slice($to_lines, $yi, sizeof($closing));
+ $yi += sizeof($closing);
+ }
+ }
+ }
+}
+
+/**
+ * A class to format Diffs
+ *
+ * This class formats the diff in classic diff format.
+ * It is intended that this class be customized via inheritance,
+ * to obtain fancier outputs.
+ */
+class DiffFormatter
+{
+ /**
+ * Number of leading context "lines" to preserve.
+ *
+ * This should be left at zero for this class, but subclasses
+ * may want to set this to other values.
+ */
+ var $leading_context_lines = 0;
+
+ /**
+ * Number of trailing context "lines" to preserve.
+ *
+ * This should be left at zero for this class, but subclasses
+ * may want to set this to other values.
+ */
+ var $trailing_context_lines = 0;
+
+ /**
+ * Format a diff.
+ *
+ * @param $diff object A Diff object.
+ * @return string The formatted output.
+ */
+ function format($diff) {
+
+ $xi = $yi = 1;
+ $block = false;
+ $context = array();
+
+ $nlead = $this->leading_context_lines;
+ $ntrail = $this->trailing_context_lines;
+
+ $this->_start_diff();
+
+ foreach ($diff->edits as $edit) {
+ if ($edit->type == 'copy') {
+ if (is_array($block)) {
+ if (sizeof($edit->orig) <= $nlead + $ntrail) {
+ $block[] = $edit;
+ }
+ else{
+ if ($ntrail) {
+ $context = array_slice($edit->orig, 0, $ntrail);
+ $block[] = new _DiffOp_Copy($context);
+ }
+ $this->_block($x0, $ntrail + $xi - $x0,
+ $y0, $ntrail + $yi - $y0,
+ $block);
+ $block = false;
+ }
+ }
+ $context = $edit->orig;
+ }
+ else {
+ if (! is_array($block)) {
+ $context = array_slice($context, sizeof($context) - $nlead);
+ $x0 = $xi - sizeof($context);
+ $y0 = $yi - sizeof($context);
+ $block = array();
+ if ($context)
+ $block[] = new _DiffOp_Copy($context);
+ }
+ $block[] = $edit;
+ }
+
+ if ($edit->orig)
+ $xi += sizeof($edit->orig);
+ if ($edit->closing)
+ $yi += sizeof($edit->closing);
+ }
+
+ if (is_array($block))
+ $this->_block($x0, $xi - $x0,
+ $y0, $yi - $y0,
+ $block);
+
+ return $this->_end_diff();
+ }
+
+ function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) {
+ $this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen));
+ foreach ($edits as $edit) {
+ if ($edit->type == 'copy')
+ $this->_context($edit->orig);
+ elseif ($edit->type == 'add')
+ $this->_added($edit->closing);
+ elseif ($edit->type == 'delete')
+ $this->_deleted($edit->orig);
+ elseif ($edit->type == 'change')
+ $this->_changed($edit->orig, $edit->closing);
+ else
+ trigger_error("Unknown edit type", E_USER_ERROR);
+ }
+ $this->_end_block();
+ }
+
+ function _start_diff() {
+ ob_start();
+ }
+
+ function _end_diff() {
+ $val = ob_get_contents();
+ ob_end_clean();
+ return $val;
+ }
+
+ function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+ if ($xlen > 1)
+ $xbeg .= "," . ($xbeg + $xlen - 1);
+ if ($ylen > 1)
+ $ybeg .= "," . ($ybeg + $ylen - 1);
+
+ return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;
+ }
+
+ function _start_block($header) {
+ echo $header;
+ }
+
+ function _end_block() {
+ }
+
+ function _lines($lines, $prefix = ' ') {
+ foreach ($lines as $line)
+ echo "$prefix $line\n";
+ }
+
+ function _context($lines) {
+ $this->_lines($lines);
+ }
+
+ function _added($lines) {
+ $this->_lines($lines, ">");
+ }
+ function _deleted($lines) {
+ $this->_lines($lines, "<");
+ }
+
+ function _changed($orig, $closing) {
+ $this->_deleted($orig);
+ echo "---\n";
+ $this->_added($closing);
+ }
+}
+
+
+/**
+ * Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
+ *
+ */
+
+define('NBSP', "\xC2\xA0"); // utf-8 non-breaking space.
+
+class _HWLDF_WordAccumulator {
+ function _HWLDF_WordAccumulator () {
+ $this->_lines = array();
+ $this->_line = '';
+ $this->_group = '';
+ $this->_tag = '';
+ }
+
+ function _flushGroup ($new_tag) {
+ if ($this->_group !== '') {
+ if ($this->_tag == 'mark')
+ $this->_line .= '<strong>'.$this->_group.'</strong>';
+ else
+ $this->_line .= $this->_group;
+ }
+ $this->_group = '';
+ $this->_tag = $new_tag;
+ }
+
+ function _flushLine ($new_tag) {
+ $this->_flushGroup($new_tag);
+ if ($this->_line != '')
+ $this->_lines[] = $this->_line;
+ $this->_line = '';
+ }
+
+ function addWords ($words, $tag = '') {
+ if ($tag != $this->_tag)
+ $this->_flushGroup($tag);
+
+ foreach ($words as $word) {
+ // new-line should only come as first char of word.
+ if ($word == '')
+ continue;
+ if ($word[0] == "\n") {
+ $this->_group .= NBSP;
+ $this->_flushLine($tag);
+ $word = substr($word, 1);
+ }
+ assert(!strstr($word, "\n"));
+ $this->_group .= $word;
+ }
+ }
+
+ function getLines() {
+ $this->_flushLine('~done');
+ return $this->_lines;
+ }
+}
+
+class WordLevelDiff extends MappedDiff
+{
+ function WordLevelDiff ($orig_lines, $closing_lines) {
+ list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
+ list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
+
+
+ $this->MappedDiff($orig_words, $closing_words,
+ $orig_stripped, $closing_stripped);
+ }
+
+ function _split($lines) {
+ // FIXME: fix POSIX char class.
+# if (!preg_match_all('/ ( [^\S\n]+ | [[:alnum:]]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+ if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+ implode("\n", $lines),
+ $m)) {
+ return array(array(''), array(''));
+ }
+ return array($m[0], $m[1]);
+ }
+
+ function orig () {
+ $orig = new _HWLDF_WordAccumulator;
+
+ foreach ($this->edits as $edit) {
+ if ($edit->type == 'copy')
+ $orig->addWords($edit->orig);
+ elseif ($edit->orig)
+ $orig->addWords($edit->orig, 'mark');
+ }
+ return $orig->getLines();
+ }
+
+ function closing () {
+ $closing = new _HWLDF_WordAccumulator;
+
+ foreach ($this->edits as $edit) {
+ if ($edit->type == 'copy')
+ $closing->addWords($edit->closing);
+ elseif ($edit->closing)
+ $closing->addWords($edit->closing, 'mark');
+ }
+ return $closing->getLines();
+ }
+}
+
+/**
+ * "Unified" diff formatter.
+ *
+ * This class formats the diff in classic "unified diff" format.
+ */
+class UnifiedDiffFormatter extends DiffFormatter
+{
+ function UnifiedDiffFormatter($context_lines = 4) {
+ $this->leading_context_lines = $context_lines;
+ $this->trailing_context_lines = $context_lines;
+ }
+
+ function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+ if ($xlen != 1)
+ $xbeg .= "," . $xlen;
+ if ($ylen != 1)
+ $ybeg .= "," . $ylen;
+ return "@@ -$xbeg +$ybeg @@\n";
+ }
+
+ function _added($lines) {
+ $this->_lines($lines, "+");
+ }
+ function _deleted($lines) {
+ $this->_lines($lines, "-");
+ }
+ function _changed($orig, $final) {
+ $this->_deleted($orig);
+ $this->_added($final);
+ }
+}
+
+/**
+ * Wikipedia Table style diff formatter.
+ *
+ */
+class TableDiffFormatter extends DiffFormatter
+{
+ function TableDiffFormatter() {
+ $this->leading_context_lines = 2;
+ $this->trailing_context_lines = 2;
+ }
+
+ function _pre($text){
+ $text = htmlspecialchars($text);
+ $text = str_replace(' ',' &nbsp;',$text);
+ if($text{0} == ' ') $text = '&nbsp;'.substr($text,1);
+ return $text;
+ }
+
+ function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
+ global $lang;
+ $l1 = $lang['line'].' '.$xbeg;
+ $l2 = $lang['line'].' '.$ybeg;
+ $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n" .
+ '<td class="diff-blockheader" colspan="2">'.$l2.":</td></tr>\n";
+ return $r;
+ }
+
+ function _start_block( $header ) {
+ print( $header );
+ }
+
+ function _end_block() {
+ }
+
+ function _lines( $lines, $prefix=' ', $color="white" ) {
+ }
+
+ function addedLine( $line ) {
+ $line = str_replace(' ',' &nbsp;',$line);
+ if($line{0} == ' ') $line = '&nbsp;'.substr($line,1);
+ return '<td>+</td><td class="diff-addedline">' .
+ $line.'</td>';
+ }
+
+ function deletedLine( $line ) {
+ $line = str_replace(' ',' &nbsp;',$line);
+ if($line{0} == ' ') $line = '&nbsp;'.substr($line,1);
+ return '<td>-</td><td class="diff-deletedline">' .
+ $line.'</td>';
+ }
+
+ function emptyLine() {
+ //$line = str_replace(' ','&nbsp; ',$line);
+ return '<td colspan="2">&nbsp;</td>';
+ }
+
+ function contextLine( $line ) {
+ $line = str_replace(' ',' &nbsp;',$line);
+ if($line{0} == ' ') $line = '&nbsp;'.substr($line,1);
+ return '<td> </td><td class="diff-context">'.$line.'</td>';
+ }
+
+ function _added($lines) {
+ foreach ($lines as $line) {
+ print( '<tr>' . $this->emptyLine() .
+ $this->addedLine( $line ) . "</tr>\n" );
+ }
+ }
+
+ function _deleted($lines) {
+ foreach ($lines as $line) {
+ print( '<tr>' . $this->deletedLine( $line ) .
+ $this->emptyLine() . "</tr>\n" );
+ }
+ }
+
+ function _context( $lines ) {
+ foreach ($lines as $line) {
+ print( '<tr>' . $this->contextLine( $line ) .
+ $this->contextLine( $line ) . "</tr>\n" );
+ }
+ }
+
+ function _changed( $orig, $closing ) {
+ $diff = new WordLevelDiff( $orig, $closing );
+ $del = $diff->orig();
+ $add = $diff->closing();
+
+ while ( $line = array_shift( $del ) ) {
+ $aline = array_shift( $add );
+ print( '<tr>' . $this->deletedLine( $line ) .
+ $this->addedLine( $aline ) . "</tr>\n" );
+ }
+ $this->_added( $add ); # If any leftovers
+ }
+}
+
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/EmailAddressValidator.php b/mod/dokuwiki/vendors/dokuwiki/inc/EmailAddressValidator.php
new file mode 100644
index 000000000..2ce2093e2
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/EmailAddressValidator.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * EmailAddressValidator Class
+ *
+ * @author Dave Child <dave@addedbytes.com>
+ * @link http://code.google.com/p/php-email-address-validation/
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ */
+class EmailAddressValidator {
+
+ /**
+ * Check email address validity
+ * @param strEmailAddress Email address to be checked
+ * @return True if email is valid, false if not
+ */
+ function check_email_address($strEmailAddress) {
+
+ // Control characters are not allowed
+ if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $strEmailAddress)) {
+ return false;
+ }
+
+ // Split it into sections using last instance of "@"
+ $intAtSymbol = strrpos($strEmailAddress, '@');
+ if ($intAtSymbol === false) {
+ // No "@" symbol in email.
+ return false;
+ }
+ $arrEmailAddress[0] = substr($strEmailAddress, 0, $intAtSymbol);
+ $arrEmailAddress[1] = substr($strEmailAddress, $intAtSymbol + 1);
+
+ // Count the "@" symbols. Only one is allowed, except where
+ // contained in quote marks in the local part. Quickest way to
+ // check this is to remove anything in quotes.
+ $arrTempAddress[0] = preg_replace('/"[^"]+"/'
+ ,''
+ ,$arrEmailAddress[0]);
+ $arrTempAddress[1] = $arrEmailAddress[1];
+ $strTempAddress = $arrTempAddress[0] . $arrTempAddress[1];
+ // Then check - should be no "@" symbols.
+ if (strrpos($strTempAddress, '@') !== false) {
+ // "@" symbol found
+ return false;
+ }
+
+ // Check local portion
+ if (!$this->check_local_portion($arrEmailAddress[0])) {
+ return false;
+ }
+
+ // Check domain portion
+ if (!$this->check_domain_portion($arrEmailAddress[1])) {
+ return false;
+ }
+
+ // If we're still here, all checks above passed. Email is valid.
+ return true;
+
+ }
+
+ /**
+ * Checks email section before "@" symbol for validity
+ * @param strLocalPortion Text to be checked
+ * @return True if local portion is valid, false if not
+ */
+ function check_local_portion($strLocalPortion) {
+ // Local portion can only be from 1 to 64 characters, inclusive.
+ // Please note that servers are encouraged to accept longer local
+ // parts than 64 characters.
+ if (!$this->check_text_length($strLocalPortion, 1, 64)) {
+ return false;
+ }
+ // Local portion must be:
+ // 1) a dot-atom (strings separated by periods)
+ // 2) a quoted string
+ // 3) an obsolete format string (combination of the above)
+ $arrLocalPortion = explode('.', $strLocalPortion);
+ for ($i = 0, $max = sizeof($arrLocalPortion); $i < $max; $i++) {
+ if (!preg_match('.^('
+ . '([A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]'
+ . '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]{0,63})'
+ .'|'
+ . '("[^\\\"]{0,62}")'
+ .')$.'
+ ,$arrLocalPortion[$i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Checks email section after "@" symbol for validity
+ * @param strDomainPortion Text to be checked
+ * @return True if domain portion is valid, false if not
+ */
+ function check_domain_portion($strDomainPortion) {
+ // Total domain can only be from 1 to 255 characters, inclusive
+ if (!$this->check_text_length($strDomainPortion, 1, 255)) {
+ return false;
+ }
+ // Check if domain is IP, possibly enclosed in square brackets.
+ if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
+ .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/'
+ ,$strDomainPortion) ||
+ preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
+ .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/'
+ ,$strDomainPortion)) {
+ return true;
+ } else {
+ $arrDomainPortion = explode('.', $strDomainPortion);
+ if (sizeof($arrDomainPortion) < 2) {
+ return false; // Not enough parts to domain
+ }
+ for ($i = 0, $max = sizeof($arrDomainPortion); $i < $max; $i++) {
+ // Each portion must be between 1 and 63 characters, inclusive
+ if (!$this->check_text_length($arrDomainPortion[$i], 1, 63)) {
+ return false;
+ }
+ if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|'
+ .'([A-Za-z0-9]+))$/', $arrDomainPortion[$i])) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Check given text length is between defined bounds
+ * @param strText Text to be checked
+ * @param intMinimum Minimum acceptable length
+ * @param intMaximum Maximum acceptable length
+ * @return True if string is within bounds (inclusive), false if not
+ */
+ function check_text_length($strText, $intMinimum, $intMaximum) {
+ // Minimum and maximum are both inclusive
+ $intTextLength = strlen($strText);
+ if (($intTextLength < $intMinimum) || ($intTextLength > $intMaximum)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/FeedParser.php b/mod/dokuwiki/vendors/dokuwiki/inc/FeedParser.php
new file mode 100644
index 000000000..f37888f01
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/FeedParser.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Class used to parse RSS and ATOM feeds
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+require_once(DOKU_INC.'inc/HTTPClient.php');
+require_once(DOKU_INC.'inc/SimplePie.php');
+
+
+/**
+ * We override some methods of the original SimplePie class here
+ */
+class FeedParser extends SimplePie {
+
+ /**
+ * Constructor. Set some defaults
+ */
+ function FeedParser(){
+ $this->SimplePie();
+ $this->enable_cache(false);
+ $this->set_file_class('FeedParser_File');
+ }
+
+ /**
+ * Backward compatibility for older plugins
+ */
+ function feed_url($url){
+ $this->set_feed_url($url);
+ }
+}
+
+/**
+ * Fetch an URL using our own HTTPClient
+ *
+ * Replaces SimplePie's own class
+ */
+class FeedParser_File extends SimplePie_File {
+ var $http;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $error;
+
+ /**
+ * Inititializes the HTTPClient
+ *
+ * We ignore all given parameters - they are set in DokuHTTPClient
+ */
+ function FeedParser_File($url, $timeout=10, $redirects=5,
+ $headers=null, $useragent=null, $force_fsockopen=false) {
+ $this->http = new DokuHTTPClient();
+ $this->success = $this->http->sendRequest($url);
+
+ $this->headers = $this->http->resp_headers;
+ $this->body = $this->http->resp_body;
+ $this->error = $this->http->error;
+ return $this->success;
+ }
+
+ function headers(){
+ return $this->headers;
+ }
+
+ function body(){
+ return $this->body;
+ }
+
+ function close(){
+ return true;
+ }
+
+}
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/HTTPClient.php b/mod/dokuwiki/vendors/dokuwiki/inc/HTTPClient.php
new file mode 100644
index 000000000..578d7e7cd
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/HTTPClient.php
@@ -0,0 +1,573 @@
+<?php
+/**
+ * HTTP Client
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ */
+
+
+define('HTTP_NL',"\r\n");
+
+
+/**
+ * Adds DokuWiki specific configs to the HTTP client
+ *
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ */
+class DokuHTTPClient extends HTTPClient {
+
+ /**
+ * Constructor.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function DokuHTTPClient(){
+ global $conf;
+
+ // call parent constructor
+ $this->HTTPClient();
+
+ // set some values from the config
+ $this->proxy_host = $conf['proxy']['host'];
+ $this->proxy_port = $conf['proxy']['port'];
+ $this->proxy_user = $conf['proxy']['user'];
+ $this->proxy_pass = conf_decodeString($conf['proxy']['pass']);
+ $this->proxy_ssl = $conf['proxy']['ssl'];
+ }
+
+
+ /**
+ * Wraps an event around the parent function
+ *
+ * @triggers HTTPCLIENT_REQUEST_SEND
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function sendRequest($url,$data='',$method='GET'){
+ $httpdata = array('url' => $url,
+ 'data' => $data,
+ 'method' => $method);
+ $evt = new Doku_Event('HTTPCLIENT_REQUEST_SEND',$httpdata);
+ if($evt->advise_before()){
+ $url = $httpdata['url'];
+ $data = $httpdata['data'];
+ $method = $httpdata['method'];
+ }
+ $evt->advise_after();
+ unset($evt);
+ return parent::sendRequest($url,$data,$method);
+ }
+
+}
+
+/**
+ * This class implements a basic HTTP client
+ *
+ * It supports POST and GET, Proxy usage, basic authentication,
+ * handles cookies and referers. It is based upon the httpclient
+ * function from the VideoDB project.
+ *
+ * @link http://www.splitbrain.org/go/videodb
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class HTTPClient {
+ //set these if you like
+ var $agent; // User agent
+ var $http; // HTTP version defaults to 1.0
+ var $timeout; // read timeout (seconds)
+ var $cookies;
+ var $referer;
+ var $max_redirect;
+ var $max_bodysize;
+ var $max_bodysize_abort = true; // if set, abort if the response body is bigger than max_bodysize
+ var $header_regexp; // if set this RE must match against the headers, else abort
+ var $headers;
+ var $debug;
+ var $start = 0; // for timings
+
+ // don't set these, read on error
+ var $error;
+ var $redirect_count;
+
+ // read these after a successful request
+ var $resp_status;
+ var $resp_body;
+ var $resp_headers;
+
+ // set these to do basic authentication
+ var $user;
+ var $pass;
+
+ // set these if you need to use a proxy
+ var $proxy_host;
+ var $proxy_port;
+ var $proxy_user;
+ var $proxy_pass;
+ var $proxy_ssl; //boolean set to true if your proxy needs SSL
+
+ // what we use as boundary on multipart/form-data posts
+ var $boundary = '---DokuWikiHTTPClient--4523452351';
+
+ /**
+ * Constructor.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function HTTPClient(){
+ $this->agent = 'Mozilla/4.0 (compatible; DokuWiki HTTP Client; '.PHP_OS.')';
+ $this->timeout = 15;
+ $this->cookies = array();
+ $this->referer = '';
+ $this->max_redirect = 3;
+ $this->redirect_count = 0;
+ $this->status = 0;
+ $this->headers = array();
+ $this->http = '1.0';
+ $this->debug = false;
+ $this->max_bodysize = 0;
+ $this->header_regexp= '';
+ if(extension_loaded('zlib')) $this->headers['Accept-encoding'] = 'gzip';
+ $this->headers['Accept'] = 'text/xml,application/xml,application/xhtml+xml,'.
+ 'text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
+ $this->headers['Accept-Language'] = 'en-us';
+ }
+
+
+ /**
+ * Simple function to do a GET request
+ *
+ * Returns the wanted page or false on an error;
+ *
+ * @param string $url The URL to fetch
+ * @param bool $sloppy304 Return body on 304 not modified
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function get($url,$sloppy304=false){
+ if(!$this->sendRequest($url)) return false;
+ if($this->status == 304 && $sloppy304) return $this->resp_body;
+ if($this->status < 200 || $this->status > 206) return false;
+ return $this->resp_body;
+ }
+
+ /**
+ * Simple function to do a POST request
+ *
+ * Returns the resulting page or false on an error;
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function post($url,$data){
+ if(!$this->sendRequest($url,$data,'POST')) return false;
+ if($this->status < 200 || $this->status > 206) return false;
+ return $this->resp_body;
+ }
+
+ /**
+ * Send an HTTP request
+ *
+ * This method handles the whole HTTP communication. It respects set proxy settings,
+ * builds the request headers, follows redirects and parses the response.
+ *
+ * Post data should be passed as associative array. When passed as string it will be
+ * sent as is. You will need to setup your own Content-Type header then.
+ *
+ * @param string $url - the complete URL
+ * @param mixed $data - the post data either as array or raw data
+ * @param string $method - HTTP Method usually GET or POST.
+ * @return bool - true on success
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function sendRequest($url,$data='',$method='GET'){
+ $this->start = $this->_time();
+ $this->error = '';
+ $this->status = 0;
+
+ // don't accept gzip if truncated bodies might occur
+ if($this->max_bodysize &&
+ !$this->max_bodysize_abort &&
+ $this->headers['Accept-encoding'] == 'gzip'){
+ unset($this->headers['Accept-encoding']);
+ }
+
+ // parse URL into bits
+ $uri = parse_url($url);
+ $server = $uri['host'];
+ $path = $uri['path'];
+ if(empty($path)) $path = '/';
+ if(!empty($uri['query'])) $path .= '?'.$uri['query'];
+ $port = $uri['port'];
+ if(isset($uri['user'])) $this->user = $uri['user'];
+ if(isset($uri['pass'])) $this->pass = $uri['pass'];
+
+ // proxy setup
+ if($this->proxy_host){
+ $request_url = $url;
+ $server = $this->proxy_host;
+ $port = $this->proxy_port;
+ if (empty($port)) $port = 8080;
+ }else{
+ $request_url = $path;
+ $server = $server;
+ if (empty($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80;
+ }
+
+ // add SSL stream prefix if needed - needs SSL support in PHP
+ if($port == 443 || $this->proxy_ssl) $server = 'ssl://'.$server;
+
+ // prepare headers
+ $headers = $this->headers;
+ $headers['Host'] = $uri['host'];
+ $headers['User-Agent'] = $this->agent;
+ $headers['Referer'] = $this->referer;
+ $headers['Connection'] = 'Close';
+ if($method == 'POST'){
+ if(is_array($data)){
+ if($headers['Content-Type'] == 'multipart/form-data'){
+ $headers['Content-Type'] = 'multipart/form-data; boundary='.$this->boundary;
+ $data = $this->_postMultipartEncode($data);
+ }else{
+ $headers['Content-Type'] = 'application/x-www-form-urlencoded';
+ $data = $this->_postEncode($data);
+ }
+ }
+ $headers['Content-Length'] = strlen($data);
+ $rmethod = 'POST';
+ }elseif($method == 'GET'){
+ $data = ''; //no data allowed on GET requests
+ }
+ if($this->user) {
+ $headers['Authorization'] = 'Basic '.base64_encode($this->user.':'.$this->pass);
+ }
+ if($this->proxy_user) {
+ $headers['Proxy-Authorization'] = 'Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass);
+ }
+
+ // stop time
+ $start = time();
+
+ // open socket
+ $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout);
+ if (!$socket){
+ $resp->status = '-100';
+ $this->error = "Could not connect to $server:$port\n$errstr ($errno)";
+ return false;
+ }
+ //set non blocking
+ stream_set_blocking($socket,0);
+
+ // build request
+ $request = "$method $request_url HTTP/".$this->http.HTTP_NL;
+ $request .= $this->_buildHeaders($headers);
+ $request .= $this->_getCookies();
+ $request .= HTTP_NL;
+ $request .= $data;
+
+ $this->_debug('request',$request);
+
+ // send request
+ $towrite = strlen($request);
+ $written = 0;
+ while($written < $towrite){
+ $ret = fwrite($socket, substr($request,$written));
+ if($ret === false){
+ $this->status = -100;
+ $this->error = 'Failed writing to socket';
+ return false;
+ }
+ $written += $ret;
+ }
+
+
+ // read headers from socket
+ $r_headers = '';
+ do{
+ if(time()-$start > $this->timeout){
+ $this->status = -100;
+ $this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start);
+ return false;
+ }
+ if(feof($socket)){
+ $this->error = 'Premature End of File (socket)';
+ return false;
+ }
+ $r_headers .= fgets($socket,1024);
+ }while(!preg_match('/\r?\n\r?\n$/',$r_headers));
+
+ $this->_debug('response headers',$r_headers);
+
+ // check if expected body size exceeds allowance
+ if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){
+ if($match[1] > $this->max_bodysize){
+ $this->error = 'Reported content length exceeds allowed response size';
+ if ($this->max_bodysize_abort)
+ return false;
+ }
+ }
+
+ // get Status
+ if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) {
+ $this->error = 'Server returned bad answer';
+ return false;
+ }
+ $this->status = $m[2];
+
+ // handle headers and cookies
+ $this->resp_headers = $this->_parseHeaders($r_headers);
+ if(isset($this->resp_headers['set-cookie'])){
+ foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
+ list($cookie) = explode(';',$cookie,2);
+ list($key,$val) = explode('=',$cookie,2);
+ $key = trim($key);
+ if($val == 'deleted'){
+ if(isset($this->cookies[$key])){
+ unset($this->cookies[$key]);
+ }
+ }elseif($key){
+ $this->cookies[$key] = $val;
+ }
+ }
+ }
+
+ $this->_debug('Object headers',$this->resp_headers);
+
+ // check server status code to follow redirect
+ if($this->status == 301 || $this->status == 302 ){
+ if (empty($this->resp_headers['location'])){
+ $this->error = 'Redirect but no Location Header found';
+ return false;
+ }elseif($this->redirect_count == $this->max_redirect){
+ $this->error = 'Maximum number of redirects exceeded';
+ return false;
+ }else{
+ $this->redirect_count++;
+ $this->referer = $url;
+ // handle non-RFC-compliant relative redirects
+ if (!preg_match('/^http/i', $this->resp_headers['location'])){
+ if($this->resp_headers['location'][0] != '/'){
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ dirname($uri['path']).'/'.$this->resp_headers['location'];
+ }else{
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ $this->resp_headers['location'];
+ }
+ }
+ // perform redirected request, always via GET (required by RFC)
+ return $this->sendRequest($this->resp_headers['location'],array(),'GET');
+ }
+ }
+
+ // check if headers are as expected
+ if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){
+ $this->error = 'The received headers did not match the given regexp';
+ return false;
+ }
+
+ //read body (with chunked encoding if needed)
+ $r_body = '';
+ if(preg_match('/transfer\-(en)?coding:\s*chunked\r\n/i',$r_headers)){
+ do {
+ unset($chunk_size);
+ do {
+ if(feof($socket)){
+ $this->error = 'Premature End of File (socket)';
+ return false;
+ }
+ if(time()-$start > $this->timeout){
+ $this->status = -100;
+ $this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start);
+ return false;
+ }
+ $byte = fread($socket,1);
+ $chunk_size .= $byte;
+ } while (preg_match('/[a-zA-Z0-9]/',$byte)); // read chunksize including \r
+
+ $byte = fread($socket,1); // readtrailing \n
+ $chunk_size = hexdec($chunk_size);
+ if ($chunk_size) {
+ $this_chunk = fread($socket,$chunk_size);
+ $r_body .= $this_chunk;
+ $byte = fread($socket,2); // read trailing \r\n
+ }
+
+ if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){
+ $this->error = 'Allowed response size exceeded';
+ if ($this->max_bodysize_abort)
+ return false;
+ else
+ break;
+ }
+ } while ($chunk_size);
+ }else{
+ // read entire socket
+ while (!feof($socket)) {
+ if(time()-$start > $this->timeout){
+ $this->status = -100;
+ $this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start);
+ return false;
+ }
+ $r_body .= fread($socket,4096);
+ $r_size = strlen($r_body);
+ if($this->max_bodysize && $r_size > $this->max_bodysize){
+ $this->error = 'Allowed response size exceeded';
+ if ($this->max_bodysize_abort)
+ return false;
+ else
+ break;
+ }
+ if(isset($this->resp_headers['content-length']) &&
+ !isset($this->resp_headers['transfer-encoding']) &&
+ $this->resp_headers['content-length'] == $r_size){
+ // we read the content-length, finish here
+ break;
+ }
+ }
+ }
+
+ // close socket
+ $status = socket_get_status($socket);
+ fclose($socket);
+
+ // decode gzip if needed
+ if(isset($this->resp_headers['content-encoding']) &&
+ $this->resp_headers['content-encoding'] == 'gzip' &&
+ strlen($r_body) > 10 && substr($r_body,0,3)=="\x1f\x8b\x08"){
+ $this->resp_body = @gzinflate(substr($r_body, 10));
+ }else{
+ $this->resp_body = $r_body;
+ }
+
+ $this->_debug('response body',$this->resp_body);
+ $this->redirect_count = 0;
+ return true;
+ }
+
+ /**
+ * print debug info
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _debug($info,$var=null){
+ if(!$this->debug) return;
+ print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />';
+ if(!is_null($var)){
+ ob_start();
+ print_r($var);
+ $content = htmlspecialchars(ob_get_contents());
+ ob_end_clean();
+ print '<pre>'.$content.'</pre>';
+ }
+ }
+
+ /**
+ * Return current timestamp in microsecond resolution
+ */
+ function _time(){
+ list($usec, $sec) = explode(" ", microtime());
+ return ((float)$usec + (float)$sec);
+ }
+
+ /**
+ * convert given header string to Header array
+ *
+ * All Keys are lowercased.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _parseHeaders($string){
+ $headers = array();
+ $lines = explode("\n",$string);
+ foreach($lines as $line){
+ list($key,$val) = explode(':',$line,2);
+ $key = strtolower(trim($key));
+ $val = trim($val);
+ if(empty($val)) continue;
+ if(isset($headers[$key])){
+ if(is_array($headers[$key])){
+ $headers[$key][] = $val;
+ }else{
+ $headers[$key] = array($headers[$key],$val);
+ }
+ }else{
+ $headers[$key] = $val;
+ }
+ }
+ return $headers;
+ }
+
+ /**
+ * convert given header array to header string
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _buildHeaders($headers){
+ $string = '';
+ foreach($headers as $key => $value){
+ if(empty($value)) continue;
+ $string .= $key.': '.$value.HTTP_NL;
+ }
+ return $string;
+ }
+
+ /**
+ * get cookies as http header string
+ *
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ */
+ function _getCookies(){
+ $headers = '';
+ foreach ($this->cookies as $key => $val){
+ $headers .= "$key=$val; ";
+ }
+ $headers = substr($headers, 0, -2);
+ if ($headers !== '') $headers = "Cookie: $headers".HTTP_NL;
+ return $headers;
+ }
+
+ /**
+ * Encode data for posting
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _postEncode($data){
+ foreach($data as $key => $val){
+ if($url) $url .= '&';
+ $url .= urlencode($key).'='.urlencode($val);
+ }
+ return $url;
+ }
+
+ /**
+ * Encode data for posting using multipart encoding
+ *
+ * @fixme use of urlencode might be wrong here
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _postMultipartEncode($data){
+ $boundary = '--'.$this->boundary;
+ $out = '';
+ foreach($data as $key => $val){
+ $out .= $boundary.HTTP_NL;
+ if(!is_array($val)){
+ $out .= 'Content-Disposition: form-data; name="'.urlencode($key).'"'.HTTP_NL;
+ $out .= HTTP_NL; // end of headers
+ $out .= $val;
+ $out .= HTTP_NL;
+ }else{
+ $out .= 'Content-Disposition: form-data; name="'.urlencode($key).'"';
+ if($val['filename']) $out .= '; filename="'.urlencode($val['filename']).'"';
+ $out .= HTTP_NL;
+ if($val['mimetype']) $out .= 'Content-Type: '.$val['mimetype'].HTTP_NL;
+ $out .= HTTP_NL; // end of headers
+ $out .= $val['body'];
+ $out .= HTTP_NL;
+ }
+ }
+ $out .= "$boundary--".HTTP_NL;
+ return $out;
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 enc=utf-8 :
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/IXR_Library.php b/mod/dokuwiki/vendors/dokuwiki/inc/IXR_Library.php
new file mode 100644
index 000000000..2752e31f2
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/IXR_Library.php
@@ -0,0 +1,817 @@
+<?php
+/**
+ * IXR - The Inutio XML-RPC Library - (c) Incutio Ltd 2002
+ *
+ * @version 1.61
+ * @author Simon Willison
+ * @date 11th July 2003
+ * @link http://scripts.incutio.com/xmlrpc/
+ * @link http://scripts.incutio.com/xmlrpc/manual.php
+ * @license Artistic License http://www.opensource.org/licenses/artistic-license.php
+ *
+ * Modified for DokuWiki
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+
+class IXR_Value {
+ var $data;
+ var $type;
+ function IXR_Value ($data, $type = false) {
+ $this->data = $data;
+ if (!$type) {
+ $type = $this->calculateType();
+ }
+ $this->type = $type;
+ if ($type == 'struct') {
+ /* Turn all the values in the array in to new IXR_Value objects */
+ foreach ($this->data as $key => $value) {
+ $this->data[$key] = new IXR_Value($value);
+ }
+ }
+ if ($type == 'array') {
+ for ($i = 0, $j = count($this->data); $i < $j; $i++) {
+ $this->data[$i] = new IXR_Value($this->data[$i]);
+ }
+ }
+ }
+ function calculateType() {
+ if ($this->data === true || $this->data === false) {
+ return 'boolean';
+ }
+ if (is_integer($this->data)) {
+ return 'int';
+ }
+ if (is_double($this->data)) {
+ return 'double';
+ }
+ // Deal with IXR object types base64 and date
+ if (is_object($this->data) && is_a($this->data, 'IXR_Date')) {
+ return 'date';
+ }
+ if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) {
+ return 'base64';
+ }
+ // If it is a normal PHP object convert it in to a struct
+ if (is_object($this->data)) {
+
+ $this->data = get_object_vars($this->data);
+ return 'struct';
+ }
+ if (!is_array($this->data)) {
+ return 'string';
+ }
+ /* We have an array - is it an array or a struct ? */
+ if ($this->isStruct($this->data)) {
+ return 'struct';
+ } else {
+ return 'array';
+ }
+ }
+ function getXml() {
+ /* Return XML for this value */
+ switch ($this->type) {
+ case 'boolean':
+ return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>';
+ break;
+ case 'int':
+ return '<int>'.$this->data.'</int>';
+ break;
+ case 'double':
+ return '<double>'.$this->data.'</double>';
+ break;
+ case 'string':
+ return '<string>'.htmlspecialchars($this->data).'</string>';
+ break;
+ case 'array':
+ $return = '<array><data>'."\n";
+ foreach ($this->data as $item) {
+ $return .= ' <value>'.$item->getXml()."</value>\n";
+ }
+ $return .= '</data></array>';
+ return $return;
+ break;
+ case 'struct':
+ $return = '<struct>'."\n";
+ foreach ($this->data as $name => $value) {
+ $return .= " <member><name>$name</name><value>";
+ $return .= $value->getXml()."</value></member>\n";
+ }
+ $return .= '</struct>';
+ return $return;
+ break;
+ case 'date':
+ case 'base64':
+ return $this->data->getXml();
+ break;
+ }
+ return false;
+ }
+ function isStruct($array) {
+ /* Nasty function to check if an array is a struct or not */
+ $expected = 0;
+ foreach ($array as $key => $value) {
+ if ((string)$key != (string)$expected) {
+ return true;
+ }
+ $expected++;
+ }
+ return false;
+ }
+}
+
+
+class IXR_Message {
+ var $message;
+ var $messageType; // methodCall / methodResponse / fault
+ var $faultCode;
+ var $faultString;
+ var $methodName;
+ var $params;
+ // Current variable stacks
+ var $_arraystructs = array(); // The stack used to keep track of the current array/struct
+ var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array
+ var $_currentStructName = array(); // A stack as well
+ var $_param;
+ var $_value;
+ var $_currentTag;
+ var $_currentTagContents;
+ // The XML parser
+ var $_parser;
+ function IXR_Message ($message) {
+ $this->message = $message;
+ }
+ function parse() {
+ // first remove the XML declaration
+ $this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message);
+ // workaround for a bug in PHP/libxml2, see http://bugs.php.net/bug.php?id=45996
+ $this->message = str_replace('&lt;', '&#60;', $this->message);
+ $this->message = str_replace('&gt;', '&#62;', $this->message);
+ $this->message = str_replace('&amp;', '&#38;', $this->message);
+ $this->message = str_replace('&apos;', '&#39;', $this->message);
+ $this->message = str_replace('&quot;', '&#34;', $this->message);
+ if (trim($this->message) == '') {
+ return false;
+ }
+ $this->_parser = xml_parser_create();
+ // Set XML parser to take the case of tags in to account
+ xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
+ // Set XML parser callback functions
+ xml_set_object($this->_parser, $this);
+ xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
+ xml_set_character_data_handler($this->_parser, 'cdata');
+ if (!xml_parse($this->_parser, $this->message)) {
+ /* die(sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($this->_parser)),
+ xml_get_current_line_number($this->_parser))); */
+ return false;
+ }
+ xml_parser_free($this->_parser);
+ // Grab the error messages, if any
+ if ($this->messageType == 'fault') {
+ $this->faultCode = $this->params[0]['faultCode'];
+ $this->faultString = $this->params[0]['faultString'];
+ }
+ return true;
+ }
+ function tag_open($parser, $tag, $attr) {
+ $this->currentTag = $tag;
+ $this->_currentTagContents = '';
+ switch($tag) {
+ case 'methodCall':
+ case 'methodResponse':
+ case 'fault':
+ $this->messageType = $tag;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data': // data is to all intents and puposes more interesting than array
+ $this->_arraystructstypes[] = 'array';
+ $this->_arraystructs[] = array();
+ break;
+ case 'struct':
+ $this->_arraystructstypes[] = 'struct';
+ $this->_arraystructs[] = array();
+ break;
+ }
+ }
+ function cdata($parser, $cdata) {
+ $this->_currentTagContents .= $cdata;
+ }
+ function tag_close($parser, $tag) {
+ $valueFlag = false;
+ switch($tag) {
+ case 'int':
+ case 'i4':
+ $value = (int)trim($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ case 'double':
+ $value = (double)trim($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ case 'string':
+ $value = (string)$this->_currentTagContents;
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ case 'dateTime.iso8601':
+ $value = new IXR_Date(trim($this->_currentTagContents));
+ // $value = $iso->getTimestamp();
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ case 'value':
+ // "If no type is indicated, the type is string."
+ if (trim($this->_currentTagContents) != '') {
+ $value = (string)$this->_currentTagContents;
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ }
+ break;
+ case 'boolean':
+ $value = (boolean)trim($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ case 'base64':
+ $value = base64_decode($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ $valueFlag = true;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data':
+ case 'struct':
+ $value = array_pop($this->_arraystructs);
+ array_pop($this->_arraystructstypes);
+ $valueFlag = true;
+ break;
+ case 'member':
+ array_pop($this->_currentStructName);
+ break;
+ case 'name':
+ $this->_currentStructName[] = trim($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ break;
+ case 'methodName':
+ $this->methodName = trim($this->_currentTagContents);
+ $this->_currentTagContents = '';
+ break;
+ }
+ if ($valueFlag) {
+ /*
+ if (!is_array($value) && !is_object($value)) {
+ $value = trim($value);
+ }
+ */
+ if (count($this->_arraystructs) > 0) {
+ // Add value to struct or array
+ if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
+ // Add to struct
+ $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;
+ } else {
+ // Add to array
+ $this->_arraystructs[count($this->_arraystructs)-1][] = $value;
+ }
+ } else {
+ // Just add as a paramater
+ $this->params[] = $value;
+ }
+ }
+ }
+}
+
+
+class IXR_Server {
+ var $data;
+ var $callbacks = array();
+ var $message;
+ var $capabilities;
+ function IXR_Server($callbacks = false, $data = false) {
+ $this->setCapabilities();
+ if ($callbacks) {
+ $this->callbacks = $callbacks;
+ }
+ $this->setCallbacks();
+ $this->serve($data);
+ }
+ function serve($data = false) {
+ if (!$data) {
+ global $HTTP_RAW_POST_DATA;
+ if (!$HTTP_RAW_POST_DATA) {
+ die('XML-RPC server accepts POST requests only.');
+ }
+ $data = $HTTP_RAW_POST_DATA;
+ }
+ $this->message = new IXR_Message($data);
+ if (!$this->message->parse()) {
+ $this->error(-32700, 'parse error. not well formed');
+ }
+ if ($this->message->messageType != 'methodCall') {
+ $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall');
+ }
+ $result = $this->call($this->message->methodName, $this->message->params);
+ // Is the result an error?
+ if (is_a($result, 'IXR_Error')) {
+ $this->error($result);
+ }
+ // Encode the result
+ $r = new IXR_Value($result);
+ $resultxml = $r->getXml();
+ // Create the XML
+ $xml = <<<EOD
+<methodResponse>
+ <params>
+ <param>
+ <value>
+ $resultxml
+ </value>
+ </param>
+ </params>
+</methodResponse>
+
+EOD;
+ // Send it
+ $this->output($xml);
+ }
+ function call($methodname, $args) {
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');
+ }
+ $method = $this->callbacks[$methodname];
+ // Perform the callback and send the response
+
+# Removed for DokuWiki to have a more consistent interface
+# if (count($args) == 1) {
+# // If only one paramater just send that instead of the whole array
+# $args = $args[0];
+# }
+
+
+# Adjusted for DokuWiki to use call_user_func_array
+
+ // args need to be an array
+ $args = (array) $args;
+
+ // Are we dealing with a function or a method?
+ if (substr($method, 0, 5) == 'this:') {
+ // It's a class method - check it exists
+ $method = substr($method, 5);
+ if (!method_exists($this, $method)) {
+ return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.');
+ }
+ // Call the method
+ #$result = $this->$method($args);
+ $result = call_user_func_array(array(&$this,$method),$args);
+ } elseif (substr($method, 0, 7) == 'plugin:') {
+ require_once(DOKU_INC.'inc/pluginutils.php');
+ list($pluginname, $callback) = explode(':', substr($method, 7), 2);
+ if(!plugin_isdisabled($pluginname)) {
+ $plugin = plugin_load('action', $pluginname);
+ return call_user_func_array(array($plugin, $callback), $args);
+ } else {
+ return new IXR_Error(-99999, 'server error');
+ }
+ } else {
+ // It's a function - does it exist?
+ if (!function_exists($method)) {
+ return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.');
+ }
+ // Call the function
+ #$result = $method($args);
+ $result = call_user_func_array($method,$args);
+ }
+ return $result;
+ }
+
+ function error($error, $message = false) {
+ // Accepts either an error object or an error code and message
+ if ($message && !is_object($error)) {
+ $error = new IXR_Error($error, $message);
+ }
+ $this->output($error->getXml());
+ }
+ function output($xml) {
+ $xml = '<?xml version="1.0"?>'."\n".$xml;
+ $length = strlen($xml);
+ header('Connection: close');
+ header('Content-Length: '.$length);
+ header('Content-Type: text/xml');
+ header('Date: '.date('r'));
+ echo $xml;
+ exit;
+ }
+ function hasMethod($method) {
+ return in_array($method, array_keys($this->callbacks));
+ }
+ function setCapabilities() {
+ // Initialises capabilities array
+ $this->capabilities = array(
+ 'xmlrpc' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/spec',
+ 'specVersion' => 1
+ ),
+ 'faults_interop' => array(
+ 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',
+ 'specVersion' => 20010516
+ ),
+ 'system.multicall' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
+ 'specVersion' => 1
+ ),
+ );
+ }
+ function getCapabilities() {
+ return $this->capabilities;
+ }
+ function setCallbacks() {
+ $this->callbacks['system.getCapabilities'] = 'this:getCapabilities';
+ $this->callbacks['system.listMethods'] = 'this:listMethods';
+ $this->callbacks['system.multicall'] = 'this:multiCall';
+ }
+ function listMethods() {
+ // Returns a list of methods - uses array_reverse to ensure user defined
+ // methods are listed before server defined methods
+ return array_reverse(array_keys($this->callbacks));
+ }
+ function multiCall($methodcalls) {
+ // See http://www.xmlrpc.com/discuss/msgReader$1208
+ $return = array();
+ foreach ($methodcalls as $call) {
+ $method = $call['methodName'];
+ $params = $call['params'];
+ if ($method == 'system.multicall') {
+ $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden');
+ } else {
+ $result = $this->call($method, $params);
+ }
+ if (is_a($result, 'IXR_Error')) {
+ $return[] = array(
+ 'faultCode' => $result->code,
+ 'faultString' => $result->message
+ );
+ } else {
+ $return[] = array($result);
+ }
+ }
+ return $return;
+ }
+}
+
+class IXR_Request {
+ var $method;
+ var $args;
+ var $xml;
+ function IXR_Request($method, $args) {
+ $this->method = $method;
+ $this->args = $args;
+ $this->xml = <<<EOD
+<?xml version="1.0"?>
+<methodCall>
+<methodName>{$this->method}</methodName>
+<params>
+
+EOD;
+ foreach ($this->args as $arg) {
+ $this->xml .= '<param><value>';
+ $v = new IXR_Value($arg);
+ $this->xml .= $v->getXml();
+ $this->xml .= "</value></param>\n";
+ }
+ $this->xml .= '</params></methodCall>';
+ }
+ function getLength() {
+ return strlen($this->xml);
+ }
+ function getXml() {
+ return $this->xml;
+ }
+}
+
+/**
+ * Changed for DokuWiki to use DokuHTTPClient
+ *
+ * This should be compatible to the original class, but uses DokuWiki's
+ * HTTP client library which will respect proxy settings
+ *
+ * Because the XMLRPC client is not used in DokuWiki currently this is completely
+ * untested
+ */
+class IXR_Client extends DokuHTTPClient {
+ var $posturl = '';
+ var $message = false;
+ var $xmlerror = false;
+
+ function IXR_Client($server, $path = false, $port = 80) {
+ $this->DokuHTTPClient();
+ if (!$path) {
+ // Assume we have been given a URL instead
+ $this->posturl = $server;
+ }else{
+ $this->posturl = 'http://'.$server.':'.$port.$path;
+ }
+ }
+
+ function query() {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $xml = $request->getXml();
+
+ $this->headers['Content-Type'] = 'text/xml';
+ if(!$this->sendRequest($this->posturl,$xml,'POST')){
+ $this->xmlerror = new IXR_Error(-32300, 'transport error - '.$this->error);
+ return false;
+ }
+
+ // Check HTTP Response code
+ if($this->status < 200 || $this->status > 206){
+ $this->xmlerror = new IXR_Error(-32300, 'transport error - HTTP status '.$this->status);
+ return false;
+ }
+
+ // Now parse what we've got back
+ $this->message = new IXR_Message($this->resp_body);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->xmlerror = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->xmlerror = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+ // Message must be OK
+ return true;
+ }
+ function getResponse() {
+ // methodResponses can only have one param - return that
+ return $this->message->params[0];
+ }
+ function isError() {
+ return (is_object($this->xmlerror));
+ }
+ function getErrorCode() {
+ return $this->xmlerror->code;
+ }
+ function getErrorMessage() {
+ return $this->xmlerror->message;
+ }
+}
+
+
+class IXR_Error {
+ var $code;
+ var $message;
+ function IXR_Error($code, $message) {
+ $this->code = $code;
+ $this->message = $message;
+ }
+ function getXml() {
+ $xml = <<<EOD
+<methodResponse>
+ <fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>{$this->code}</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>{$this->message}</string></value>
+ </member>
+ </struct>
+ </value>
+ </fault>
+</methodResponse>
+
+EOD;
+ return $xml;
+ }
+}
+
+
+class IXR_Date {
+ var $year;
+ var $month;
+ var $day;
+ var $hour;
+ var $minute;
+ var $second;
+ function IXR_Date($time) {
+ // $time can be a PHP timestamp or an ISO one
+ if (is_numeric($time)) {
+ $this->parseTimestamp($time);
+ } else {
+ $this->parseIso($time);
+ }
+ }
+ function parseTimestamp($timestamp) {
+ $this->year = gmdate('Y', $timestamp);
+ $this->month = gmdate('m', $timestamp);
+ $this->day = gmdate('d', $timestamp);
+ $this->hour = gmdate('H', $timestamp);
+ $this->minute = gmdate('i', $timestamp);
+ $this->second = gmdate('s', $timestamp);
+ }
+ function parseIso($iso) {
+ $this->year = substr($iso, 0, 4);
+ $this->month = substr($iso, 5, 2);
+ $this->day = substr($iso, 8, 2);
+ $this->hour = substr($iso, 11, 2);
+ $this->minute = substr($iso, 14, 2);
+ $this->second = substr($iso, 17, 2);
+ }
+ function getIso() {
+ return $this->year.'-'.$this->month.'-'.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second;
+ }
+ function getXml() {
+ return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
+ }
+ function getTimestamp() {
+ return gmmktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
+ }
+}
+
+
+class IXR_Base64 {
+ var $data;
+ function IXR_Base64($data) {
+ $this->data = $data;
+ }
+ function getXml() {
+ return '<base64>'.base64_encode($this->data).'</base64>';
+ }
+}
+
+
+class IXR_IntrospectionServer extends IXR_Server {
+ var $signatures;
+ var $help;
+ function IXR_IntrospectionServer() {
+ $this->setCallbacks();
+ $this->setCapabilities();
+ $this->capabilities['introspection'] = array(
+ 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
+ 'specVersion' => 1
+ );
+ $this->addCallback(
+ 'system.methodSignature',
+ 'this:methodSignature',
+ array('array', 'string'),
+ 'Returns an array describing the return type and required parameters of a method'
+ );
+ $this->addCallback(
+ 'system.getCapabilities',
+ 'this:getCapabilities',
+ array('struct'),
+ 'Returns a struct describing the XML-RPC specifications supported by this server'
+ );
+ $this->addCallback(
+ 'system.listMethods',
+ 'this:listMethods',
+ array('array'),
+ 'Returns an array of available methods on this server'
+ );
+ $this->addCallback(
+ 'system.methodHelp',
+ 'this:methodHelp',
+ array('string', 'string'),
+ 'Returns a documentation string for the specified method'
+ );
+ }
+ function addCallback($method, $callback, $args, $help) {
+ $this->callbacks[$method] = $callback;
+ $this->signatures[$method] = $args;
+ $this->help[$method] = $help;
+ }
+ function call($methodname, $args) {
+ // Make sure it's in an array
+ if ($args && !is_array($args)) {
+ $args = array($args);
+ }
+ // Over-rides default call method, adds signature check
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.');
+ }
+ $method = $this->callbacks[$methodname];
+ $signature = $this->signatures[$methodname];
+ $returnType = array_shift($signature);
+ // Check the number of arguments. Check only, if the minimum count of parameters is specified. More parameters are possible.
+ // This is a hack to allow optional parameters...
+ if (count($args) < count($signature)) {
+ // print 'Num of args: '.count($args).' Num in signature: '.count($signature);
+ return new IXR_Error(-32602, 'server error. wrong number of method parameters');
+ }
+ // Check the argument types
+ $ok = true;
+ $argsbackup = $args;
+ for ($i = 0, $j = count($args); $i < $j; $i++) {
+ $arg = array_shift($args);
+ $type = array_shift($signature);
+ switch ($type) {
+ case 'int':
+ case 'i4':
+ if (is_array($arg) || !is_int($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'base64':
+ case 'string':
+ if (!is_string($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'boolean':
+ if ($arg !== false && $arg !== true) {
+ $ok = false;
+ }
+ break;
+ case 'float':
+ case 'double':
+ if (!is_float($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'date':
+ case 'dateTime.iso8601':
+ if (!is_a($arg, 'IXR_Date')) {
+ $ok = false;
+ }
+ break;
+ }
+ if (!$ok) {
+ return new IXR_Error(-32602, 'server error. invalid method parameters');
+ }
+ }
+ // It passed the test - run the "real" method call
+ return parent::call($methodname, $argsbackup);
+ }
+ function methodSignature($method) {
+ if (!$this->hasMethod($method)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.');
+ }
+ // We should be returning an array of types
+ $types = $this->signatures[$method];
+ $return = array();
+ foreach ($types as $type) {
+ switch ($type) {
+ case 'string':
+ $return[] = 'string';
+ break;
+ case 'int':
+ case 'i4':
+ $return[] = 42;
+ break;
+ case 'double':
+ $return[] = 3.1415;
+ break;
+ case 'dateTime.iso8601':
+ $return[] = new IXR_Date(time());
+ break;
+ case 'boolean':
+ $return[] = true;
+ break;
+ case 'base64':
+ $return[] = new IXR_Base64('base64');
+ break;
+ case 'array':
+ $return[] = array('array');
+ break;
+ case 'struct':
+ $return[] = array('struct' => 'struct');
+ break;
+ }
+ }
+ return $return;
+ }
+ function methodHelp($method) {
+ return $this->help[$method];
+ }
+}
+
+
+class IXR_ClientMulticall extends IXR_Client {
+ var $calls = array();
+ function IXR_ClientMulticall($server, $path = false, $port = 80) {
+ parent::IXR_Client($server, $path, $port);
+ //$this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
+ }
+ function addCall() {
+ $args = func_get_args();
+ $methodName = array_shift($args);
+ $struct = array(
+ 'methodName' => $methodName,
+ 'params' => $args
+ );
+ $this->calls[] = $struct;
+ }
+ function query() {
+ // Prepare multicall, then call the parent::query() method
+ return parent::query('system.multicall', $this->calls);
+ }
+}
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/JSON.php b/mod/dokuwiki/vendors/dokuwiki/inc/JSON.php
new file mode 100644
index 000000000..ea66c9c32
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/JSON.php
@@ -0,0 +1,624 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Converts to and from JSON format.
+ *
+ * JSON (JavaScript Object Notation) is a lightweight data-interchange
+ * format. It is easy for humans to read and write. It is easy for machines
+ * to parse and generate. It is based on a subset of the JavaScript
+ * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
+ * This feature can also be found in Python. JSON is a text format that is
+ * completely language independent but uses conventions that are familiar
+ * to programmers of the C-family of languages, including C, C++, C#, Java,
+ * JavaScript, Perl, TCL, and many others. These properties make JSON an
+ * ideal data-interchange language.
+ *
+ * This package provides a simple encoder and decoder for JSON notation. It
+ * is intended for use with client-side Javascript applications that make
+ * use of HTTPRequest to perform server communication functions - data can
+ * be encoded into JSON notation for use in a client-side javascript, or
+ * decoded from incoming Javascript requests. JSON format is native to
+ * Javascript, and can be directly eval()'ed with no further parsing
+ * overhead
+ *
+ * All strings should be in ASCII or UTF-8 format!
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met: Redistributions of source code must retain the
+ * above copyright notice, this list of conditions and the following
+ * disclaimer. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * @category
+ * @package
+ * @author Michal Migurski <mike-json@teczno.com>
+ * @author Matt Knapp <mdknapp[at]gmail[dot]com>
+ * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+ * @copyright 2005 Michal Migurski
+ * @license http://www.freebsd.org/copyright/freebsd-license.html
+ * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
+ */
+
+// for DokuWiki
+if(!defined('DOKU_INC')) die('meh.');
+require_once(DOKU_INC.'inc/utf8.php');
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_SLICE', 1);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_STR', 2);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_ARR', 4);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_OBJ', 8);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_CMT', 16);
+
+/**
+ * Behavior switch for JSON::decode()
+ */
+define('JSON_LOOSE_TYPE', 10);
+
+/**
+ * Behavior switch for JSON::decode()
+ */
+define('JSON_STRICT_TYPE', 11);
+
+/**
+ * Converts to and from JSON format.
+ *
+ * @category
+ * @package
+ * @author Michal Migurski <mike-json@teczno.com>
+ * @author Matt Knapp <mdknapp[at]gmail[dot]com>
+ * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+ * @copyright 2005 Michal Migurski
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @version
+ * @link
+ * @see
+ * @since
+ * @deprecated
+ */
+class JSON
+{
+ /**
+ * constructs a new JSON instance
+ *
+ * @param int $use object behavior: when encoding or decoding,
+ * be loose or strict about object/array usage
+ *
+ * possible values:
+ * JSON_STRICT_TYPE - strict typing, default
+ * "{...}" syntax creates objects in decode.
+ * JSON_LOOSE_TYPE - loose typing
+ * "{...}" syntax creates associative arrays in decode.
+ */
+ function JSON($use=JSON_STRICT_TYPE)
+ {
+ $this->use = $use;
+ }
+
+ /**
+ * encodes an arbitrary variable into JSON format
+ *
+ * @param mixed $var any number, boolean, string, array, or object to be encoded.
+ * see argument 1 to JSON() above for array-parsing behavior.
+ * if var is a strng, note that encode() always expects it
+ * to be in ASCII or UTF-8 format!
+ *
+ * @return string JSON string representation of input var
+ * @access public
+ */
+ function encode($var)
+ {
+ switch (gettype($var)) {
+ case 'boolean':
+ return $var ? 'true' : 'false';
+
+ case 'NULL':
+ return 'null';
+
+ case 'integer':
+ return sprintf('%d', $var);
+
+ case 'double':
+ case 'float':
+ return sprintf('%f', $var);
+
+ case 'string':
+ // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+ $ascii = '';
+ $strlen_var = strlen($var);
+
+ /*
+ * Iterate over every character in the string,
+ * escaping with a slash or encoding to UTF-8 where necessary
+ */
+ for ($c = 0; $c < $strlen_var; ++$c) {
+
+ $ord_var_c = ord($var{$c});
+
+ switch ($ord_var_c) {
+ case 0x08: $ascii .= '\b'; break;
+ case 0x09: $ascii .= '\t'; break;
+ case 0x0A: $ascii .= '\n'; break;
+ case 0x0C: $ascii .= '\f'; break;
+ case 0x0D: $ascii .= '\r'; break;
+
+ case 0x22:
+ case 0x2F:
+ case 0x5C:
+ // double quote, slash, slosh
+ $ascii .= '\\'.$var{$c};
+ break;
+
+ case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+ // characters U-00000000 - U-0000007F (same as ASCII)
+ $ascii .= $var{$c};
+ break;
+
+ case (($ord_var_c & 0xE0) == 0xC0):
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c, ord($var{$c+1}));
+ $c+=1;
+ //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+ $utf16 = utf8_to_utf16be($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF0) == 0xE0):
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c+1}),
+ ord($var{$c+2}));
+ $c+=2;
+ //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+ $utf16 = utf8_to_utf16be($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF8) == 0xF0):
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c+1}),
+ ord($var{$c+2}),
+ ord($var{$c+3}));
+ $c+=3;
+ //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+ $utf16 = utf8_to_utf16be($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFC) == 0xF8):
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c+1}),
+ ord($var{$c+2}),
+ ord($var{$c+3}),
+ ord($var{$c+4}));
+ $c+=4;
+ //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+ $utf16 = utf8_to_utf16be($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFE) == 0xFC):
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c+1}),
+ ord($var{$c+2}),
+ ord($var{$c+3}),
+ ord($var{$c+4}),
+ ord($var{$c+5}));
+ $c+=5;
+ //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+ $utf16 = utf8_to_utf16be($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+ }
+ }
+
+ return '"'.$ascii.'"';
+
+ case 'array':
+ /*
+ * As per JSON spec if any array key is not an integer
+ * we must treat the the whole array as an object. We
+ * also try to catch a sparsely populated associative
+ * array with numeric keys here because some JS engines
+ * will create an array with empty indexes up to
+ * max_index which can cause memory issues and because
+ * the keys, which may be relevant, will be remapped
+ * otherwise.
+ *
+ * As per the ECMA and JSON specification an object may
+ * have any string as a property. Unfortunately due to
+ * a hole in the ECMA specification if the key is a
+ * ECMA reserved word or starts with a digit the
+ * parameter is only accessible using ECMAScript's
+ * bracket notation.
+ */
+
+ // treat as a JSON object
+ if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+ return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
+ array_keys($var),
+ array_values($var))));
+ }
+
+ // treat it like a regular array
+ return sprintf('[%s]', join(',', array_map(array($this, 'encode'), $var)));
+
+ case 'object':
+ $vars = get_object_vars($var);
+ return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
+ array_keys($vars),
+ array_values($vars))));
+
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * encodes an arbitrary variable into JSON format, alias for encode()
+ */
+ function enc($var)
+ {
+ return $this->encode($var);
+ }
+
+ /** function name_value
+ * array-walking function for use in generating JSON-formatted name-value pairs
+ *
+ * @param string $name name of key to use
+ * @param mixed $value reference to an array element to be encoded
+ *
+ * @return string JSON-formatted name-value pair, like '"name":value'
+ * @access private
+ */
+ function name_value($name, $value)
+ {
+ return (sprintf("%s:%s", $this->encode(strval($name)), $this->encode($value)));
+ }
+
+ /**
+ * reduce a string by removing leading and trailing comments and whitespace
+ *
+ * @param $str string string value to strip of comments and whitespace
+ *
+ * @return string string value stripped of comments and whitespace
+ * @access private
+ */
+ function reduce_string($str)
+ {
+ $str = preg_replace(array(
+
+ // eliminate single line comments in '// ...' form
+ '#^\s*//(.+)$#m',
+
+ // eliminate multi-line comments in '/* ... */' form, at start of string
+ '#^\s*/\*(.+)\*/#Us',
+
+ // eliminate multi-line comments in '/* ... */' form, at end of string
+ '#/\*(.+)\*/\s*$#Us'
+
+ ), '', $str);
+
+ // eliminate extraneous space
+ return trim($str);
+ }
+
+ /**
+ * decodes a JSON string into appropriate variable
+ *
+ * @param string $str JSON-formatted string
+ *
+ * @return mixed number, boolean, string, array, or object
+ * corresponding to given JSON input string.
+ * See argument 1 to JSON() above for object-output behavior.
+ * Note that decode() always returns strings
+ * in ASCII or UTF-8 format!
+ * @access public
+ */
+ function decode($str)
+ {
+ $str = $this->reduce_string($str);
+
+ switch (strtolower($str)) {
+ case 'true':
+ return true;
+
+ case 'false':
+ return false;
+
+ case 'null':
+ return null;
+
+ default:
+ if (is_numeric($str)) {
+ // Lookie-loo, it's a number
+
+ // This would work on its own, but I'm trying to be
+ // good about returning integers where appropriate:
+ // return (float)$str;
+
+ // Return float or int, as appropriate
+ return ((float)$str == (integer)$str)
+ ? (integer)$str
+ : (float)$str;
+
+ } elseif (preg_match('/^("|\').+("|\')$/s', $str, $m) && $m[1] == $m[2]) {
+ // STRINGS RETURNED IN UTF-8 FORMAT
+ $delim = substr($str, 0, 1);
+ $chrs = substr($str, 1, -1);
+ $utf8 = '';
+ $strlen_chrs = strlen($chrs);
+
+ for ($c = 0; $c < $strlen_chrs; ++$c) {
+
+ $substr_chrs_c_2 = substr($chrs, $c, 2);
+ $ord_chrs_c = ord($chrs{$c});
+
+ switch ($substr_chrs_c_2) {
+ case '\b': $utf8 .= chr(0x08); $c+=1; break;
+ case '\t': $utf8 .= chr(0x09); $c+=1; break;
+ case '\n': $utf8 .= chr(0x0A); $c+=1; break;
+ case '\f': $utf8 .= chr(0x0C); $c+=1; break;
+ case '\r': $utf8 .= chr(0x0D); $c+=1; break;
+
+ case '\\"':
+ case '\\\'':
+ case '\\\\':
+ case '\\/':
+ if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
+ ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
+ $utf8 .= $chrs{++$c};
+ }
+ break;
+
+ default:
+ if (preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6))) {
+ // single, escaped unicode character
+ $utf16 = chr(hexdec(substr($chrs, ($c+2), 2)))
+ . chr(hexdec(substr($chrs, ($c+4), 2)));
+ //$utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
+ $utf8 .= utf16be_to_utf8($utf16);
+ $c+=5;
+
+ } elseif(($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F)) {
+ $utf8 .= $chrs{$c};
+
+ } elseif(($ord_chrs_c & 0xE0) == 0xC0) {
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
+ //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 2); $c += 1;
+
+ } elseif(($ord_chrs_c & 0xF0) == 0xE0) {
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 3); $c += 2;
+
+ } elseif(($ord_chrs_c & 0xF8) == 0xF0) {
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 4); $c += 3;
+
+ } elseif(($ord_chrs_c & 0xFC) == 0xF8) {
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 5); $c += 4;
+
+ } elseif(($ord_chrs_c & 0xFE) == 0xFC) {
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 6); $c += 5;
+
+ }
+ break;
+
+ }
+
+ }
+
+ return $utf8;
+
+ } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
+ // array, or object notation
+
+ if ($str{0} == '[') {
+ $stk = array(JSON_IN_ARR);
+ $arr = array();
+ } else {
+ if ($this->use == JSON_LOOSE_TYPE) {
+ $stk = array(JSON_IN_OBJ);
+ $obj = array();
+ } else {
+ $stk = array(JSON_IN_OBJ);
+ $obj = new stdClass();
+ }
+ }
+
+ array_push($stk, array('what' => JSON_SLICE,
+ 'where' => 0,
+ 'delim' => false));
+
+ $chrs = substr($str, 1, -1);
+ $chrs = $this->reduce_string($chrs);
+
+ if ($chrs == '') {
+ if (reset($stk) == JSON_IN_ARR) {
+ return $arr;
+
+ } else {
+ return $obj;
+
+ }
+ }
+
+ //print("\nparsing {$chrs}\n");
+
+ $strlen_chrs = strlen($chrs);
+
+ for ($c = 0; $c <= $strlen_chrs; ++$c) {
+
+ $top = end($stk);
+ $substr_chrs_c_2 = substr($chrs, $c, 2);
+
+ if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == JSON_SLICE))) {
+ // found a comma that is not inside a string, array, etc.,
+ // OR we've reached the end of the character list
+ $slice = substr($chrs, $top['where'], ($c - $top['where']));
+ array_push($stk, array('what' => JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
+ //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ if (reset($stk) == JSON_IN_ARR) {
+ // we are in an array, so just push an element onto the stack
+ array_push($arr, $this->decode($slice));
+
+ } elseif (reset($stk) == JSON_IN_OBJ) {
+ // we are in an object, so figure
+ // out the property name and set an
+ // element in an associative array,
+ // for now
+ if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+ // "name":value pair
+ $key = $this->decode($parts[1]);
+ $val = $this->decode($parts[2]);
+
+ if ($this->use == JSON_LOOSE_TYPE) {
+ $obj[$key] = $val;
+ } else {
+ $obj->$key = $val;
+ }
+ } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+ // name:value pair, where name is unquoted
+ $key = $parts[1];
+ $val = $this->decode($parts[2]);
+
+ if ($this->use == JSON_LOOSE_TYPE) {
+ $obj[$key] = $val;
+ } else {
+ $obj->$key = $val;
+ }
+ }
+
+ }
+
+ } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) &&
+ in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+ // found a quote, and we are not inside a string
+ array_push($stk, array('what' => JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
+ //print("Found start of string at {$c}\n");
+
+ } elseif (($chrs{$c} == $top['delim']) &&
+ ($top['what'] == JSON_IN_STR) &&
+ (($chrs{$c - 1} != "\\") ||
+ ($chrs{$c - 1} == "\\" && $chrs{$c - 2} == "\\"))) {
+ // found a quote, we're in a string, and it's not escaped
+ array_pop($stk);
+ //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
+
+ } elseif (($chrs{$c} == '[') &&
+ in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+ // found a left-bracket, and we are in an array, object, or slice
+ array_push($stk, array('what' => JSON_IN_ARR, 'where' => $c, 'delim' => false));
+ //print("Found start of array at {$c}\n");
+
+ } elseif (($chrs{$c} == ']') && ($top['what'] == JSON_IN_ARR)) {
+ // found a right-bracket, and we're in an array
+ array_pop($stk);
+ //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ } elseif (($chrs{$c} == '{') &&
+ in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+ // found a left-brace, and we are in an array, object, or slice
+ array_push($stk, array('what' => JSON_IN_OBJ, 'where' => $c, 'delim' => false));
+ //print("Found start of object at {$c}\n");
+
+ } elseif (($chrs{$c} == '}') && ($top['what'] == JSON_IN_OBJ)) {
+ // found a right-brace, and we're in an object
+ array_pop($stk);
+ //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ } elseif (($substr_chrs_c_2 == '/*') &&
+ in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+ // found a comment start, and we are in an array, object, or slice
+ array_push($stk, array('what' => JSON_IN_CMT, 'where' => $c, 'delim' => false));
+ $c++;
+ //print("Found start of comment at {$c}\n");
+
+ } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == JSON_IN_CMT)) {
+ // found a comment end, and we're in one now
+ array_pop($stk);
+ $c++;
+
+ for ($i = $top['where']; $i <= $c; ++$i)
+ $chrs = substr_replace($chrs, ' ', $i, 1);
+
+ //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ }
+
+ }
+
+ if (reset($stk) == JSON_IN_ARR) {
+ return $arr;
+
+ } elseif (reset($stk) == JSON_IN_OBJ) {
+ return $obj;
+
+ }
+
+ }
+ }
+ }
+
+ /**
+ * decodes a JSON string into appropriate variable; alias for decode()
+ */
+ function dec($var)
+ {
+ return $this->decode($var);
+ }
+
+}
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/JpegMeta.php b/mod/dokuwiki/vendors/dokuwiki/inc/JpegMeta.php
new file mode 100644
index 000000000..cb1d7d694
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/JpegMeta.php
@@ -0,0 +1,3116 @@
+<?php
+/**
+ * JPEG metadata reader/writer
+ *
+ * @license PHP license 2.0 (http://www.php.net/license/2_02.txt)
+ * @link http://www.zonageek.com/software/php/jpeg/index.php
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Hakan Sandell <hakan.sandell@mydata.se>
+ * @todo Add support for Maker Notes, Extend for GIF and PNG metadata
+ */
+
+// This class is a modified and enhanced version of the JPEG class by
+// Sebastian Delmont. Original Copyright notice follows:
+//
+// +----------------------------------------------------------------------+
+// | PHP version 4.0 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available at through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Sebastian Delmont <sdelmont@zonageek.com> |
+// +----------------------------------------------------------------------+
+
+class JpegMeta
+{
+ var $_fileName;
+ var $_fp = null;
+ var $_type = 'unknown';
+
+ var $_markers;
+ var $_info;
+
+
+ /**
+ * Constructor
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function JpegMeta($fileName)
+ {
+
+ $this->_fileName = $fileName;
+
+ $this->_fp = null;
+ $this->_type = 'unknown';
+
+ unset($this->_info);
+ unset($this->_markers);
+ }
+
+ /**
+ * Returns all gathered info as multidim array
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function & getRawInfo()
+ {
+ $this->_parseAll();
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ return $this->_info;
+ }
+
+ /**
+ * Returns basic image info
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function & getBasicInfo()
+ {
+ $this->_parseAll();
+
+ $info = array();
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $info['Name'] = $this->_info['file']['Name'];
+ if (isset($this->_info['file']['Url'])) {
+ $info['Url'] = $this->_info['file']['Url'];
+ $info['NiceSize'] = "???KB";
+ }
+ else {
+ $info['Size'] = $this->_info['file']['Size'];
+ $info['NiceSize'] = $this->_info['file']['NiceSize'];
+ }
+
+ if (@isset($this->_info['sof']['Format'])) {
+ $info['Format'] = $this->_info['sof']['Format'] . " JPEG";
+ }
+ else {
+ $info['Format'] = $this->_info['sof']['Format'] . " JPEG";
+ }
+
+ if (@isset($this->_info['sof']['ColorChannels'])) {
+ $info['ColorMode'] = ($this->_info['sof']['ColorChannels'] > 1) ? "Color" : "B&W";
+ }
+
+ $info['Width'] = $this->getWidth();
+ $info['Height'] = $this->getHeight();
+ $info['DimStr'] = $this->getDimStr();
+
+ $dates = $this->getDates();
+
+ $info['DateTime'] = $dates['EarliestTime'];
+ $info['DateTimeStr'] = $dates['EarliestTimeStr'];
+
+ $info['HasThumbnail'] = $this->hasThumbnail();
+
+ return $info;
+ }
+
+
+ /**
+ * Convinience function to access nearly all available Data
+ * through one function
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function getField($fields)
+ {
+ if(!is_array($fields)) $fields = array($fields);
+ $info = false;
+ foreach($fields as $field){
+ if(strtolower(substr($field,0,5)) == 'iptc.'){
+ $info = $this->getIPTCField(substr($field,5));
+ }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+ $info = $this->getExifField(substr($field,5));
+ }elseif(strtolower(substr($field,0,4)) == 'xmp.'){
+ $info = $this->getXmpField(substr($field,4));
+ }elseif(strtolower(substr($field,0,5)) == 'file.'){
+ $info = $this->getFileField(substr($field,5));
+ }elseif(strtolower(substr($field,0,5)) == 'date.'){
+ $info = $this->getDateField(substr($field,5));
+ }elseif(strtolower($field) == 'simple.camera'){
+ $info = $this->getCamera();
+ }elseif(strtolower($field) == 'simple.raw'){
+ return $this->getRawInfo();
+ }elseif(strtolower($field) == 'simple.title'){
+ $info = $this->getTitle();
+ }elseif(strtolower($field) == 'simple.shutterspeed'){
+ $info = $this->getShutterSpeed();
+ }else{
+ $info = $this->getExifField($field);
+ }
+ if($info != false) break;
+ }
+
+ if($info === false) $info = $alt;
+ if(is_array($info)){
+ if(isset($info['val'])){
+ $info = $info['val'];
+ }else{
+ $info = join(', ',$info);
+ }
+ }
+ return trim($info);
+ }
+
+ /**
+ * Convinience function to set nearly all available Data
+ * through one function
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function setField($field, $value)
+ {
+ if(strtolower(substr($field,0,5)) == 'iptc.'){
+ return $this->setIPTCField(substr($field,5),$value);
+ }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+ return $this->setExifField(substr($field,5),$value);
+ }else{
+ return $this->setExifField($field,$value);
+ }
+ }
+
+ /**
+ * Convinience function to delete nearly all available Data
+ * through one function
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function deleteField($field)
+ {
+ if(strtolower(substr($field,0,5)) == 'iptc.'){
+ return $this->deleteIPTCField(substr($field,5));
+ }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+ return $this->deleteExifField(substr($field,5));
+ }else{
+ return $this->deleteExifField($field);
+ }
+ }
+
+ /**
+ * Return a date field
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function getDateField($field)
+ {
+ if (!isset($this->_info['dates'])) {
+ $this->_info['dates'] = $this->getDates();
+ }
+
+ if (isset($this->_info['dates'][$field])) {
+ return $this->_info['dates'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Return a file info field
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function getFileField($field)
+ {
+ if (!isset($this->_info['file'])) {
+ $this->_parseFileInfo();
+ }
+
+ if (isset($this->_info['file'][$field])) {
+ return $this->_info['file'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Return the camera info (Maker and Model)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @todo handle makernotes
+ */
+ function getCamera(){
+ $make = $this->getField(array('Exif.Make','Exif.TIFFMake'));
+ $model = $this->getField(array('Exif.Model','Exif.TIFFModel'));
+ $cam = trim("$make $model");
+ if(empty($cam)) return false;
+ return $cam;
+ }
+
+ /**
+ * Return shutter speed as a ratio
+ *
+ * @author Joe Lapp <joe.lapp@pobox.com>
+ */
+ function getShutterSpeed()
+ {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+ if(!isset($this->_info['exif']['ExposureTime'])){
+ return '';
+ }
+
+ $field = $this->_info['exif']['ExposureTime'];
+ if($field['den'] == 1) return $field['num'];
+ return $field['num'].'/'.$field['den'];
+ }
+
+ /**
+ * Return an EXIF field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getExifField($field)
+ {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['exif'][$field])) {
+ return $this->_info['exif'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Return an XMP field
+ *
+ * @author Hakan Sandell <hakan.sandell@mydata.se>
+ */
+ function getXmpField($field)
+ {
+ if (!isset($this->_info['xmp'])) {
+ $this->_parseMarkerXmp();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['xmp'][$field])) {
+ return $this->_info['xmp'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Return an Adobe Field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getAdobeField($field)
+ {
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['adobe'][$field])) {
+ return $this->_info['adobe'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Return an IPTC field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getIPTCField($field)
+ {
+ if (!isset($this->_info['iptc'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['iptc'][$field])) {
+ return $this->_info['iptc'][$field];
+ }
+
+ return false;
+ }
+
+ /**
+ * Set an EXIF field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ * @author Joe Lapp <joe.lapp@pobox.com>
+ */
+ function setExifField($field, $value)
+ {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['exif'] == false) {
+ $this->_info['exif'] = array();
+ }
+
+ // make sure datetimes are in correct format
+ if(strlen($field) >= 8 && strtolower(substr($field, 0, 8)) == 'datetime') {
+ if(strlen($value) < 8 || $value{4} != ':' || $value{7} != ':') {
+ $value = date('Y:m:d H:i:s', strtotime($value));
+ }
+ }
+
+ $this->_info['exif'][$field] = $value;
+
+ return true;
+ }
+
+ /**
+ * Set an Adobe Field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function setAdobeField($field, $value)
+ {
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['adobe'] == false) {
+ $this->_info['adobe'] = array();
+ }
+
+ $this->_info['adobe'][$field] = $value;
+
+ return true;
+ }
+
+ /**
+ * Calculates the multiplier needed to resize the image to the given
+ * dimensions
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function getResizeRatio($maxwidth,$maxheight=0){
+ if(!$maxheight) $maxheight = $maxwidth;
+
+ $w = $this->getField('File.Width');
+ $h = $this->getField('File.Height');
+
+ $ratio = 1;
+ if($w >= $h){
+ if($w >= $maxwidth){
+ $ratio = $maxwidth/$w;
+ }elseif($h > $maxheight){
+ $ratio = $maxheight/$h;
+ }
+ }else{
+ if($h >= $maxheight){
+ $ratio = $maxheight/$h;
+ }elseif($w > $maxwidth){
+ $ratio = $maxwidth/$w;
+ }
+ }
+ return $ratio;
+ }
+
+
+ /**
+ * Set an IPTC field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function setIPTCField($field, $value)
+ {
+ if (!isset($this->_info['iptc'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['iptc'] == false) {
+ $this->_info['iptc'] = array();
+ }
+
+ $this->_info['iptc'][$field] = $value;
+
+ return true;
+ }
+
+ /**
+ * Delete an EXIF field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function deleteExifField($field)
+ {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['exif'] != false) {
+ unset($this->_info['exif'][$field]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Delete an Adobe field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function deleteAdobeField($field)
+ {
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['adobe'] != false) {
+ unset($this->_info['adobe'][$field]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Delete an IPTC field
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function deleteIPTCField($field)
+ {
+ if (!isset($this->_info['iptc'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if ($this->_info['iptc'] != false) {
+ unset($this->_info['iptc'][$field]);
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the image's title, tries various fields
+ *
+ * @param int $max maximum number chars (keeps words)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function getTitle($max=80){
+ $cap = '';
+
+ // try various fields
+ $cap = $this->getField(array('Iptc.Headline',
+ 'Iptc.Caption',
+ 'Xmp.dc:title',
+ 'Exif.UserComment',
+ 'Exif.TIFFUserComment',
+ 'Exif.TIFFImageDescription',
+ 'File.Name'));
+ if (empty($cap)) return false;
+
+ if(!$max) return $cap;
+ // Shorten to 80 chars (keeping words)
+ $new = preg_replace('/\n.+$/','',wordwrap($cap, $max));
+ if($new != $cap) $new .= '...';
+
+ return $new;
+ }
+
+ /**
+ * Gather various date fields
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getDates()
+ {
+ $this->_parseAll();
+ if ($this->_markers == null) {
+ if (@isset($this->_info['file']['UnixTime'])) {
+ $dates['FileModified'] = $this->_info['file']['UnixTime'];
+ $dates['Time'] = $this->_info['file']['UnixTime'];
+ $dates['TimeSource'] = 'FileModified';
+ $dates['TimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+ $dates['EarliestTime'] = $this->_info['file']['UnixTime'];
+ $dates['EarliestTimeSource'] = 'FileModified';
+ $dates['EarliestTimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+ $dates['LatestTime'] = $this->_info['file']['UnixTime'];
+ $dates['LatestTimeSource'] = 'FileModified';
+ $dates['LatestTimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+ return $dates;
+ }
+ return false;
+ }
+
+ $dates = array();
+
+ $latestTime = 0;
+ $latestTimeSource = "";
+ $earliestTime = time();
+ $earliestTimeSource = "";
+
+ if (@isset($this->_info['exif']['DateTime'])) {
+ $dates['ExifDateTime'] = $this->_info['exif']['DateTime'];
+
+ $aux = $this->_info['exif']['DateTime'];
+ $aux{4} = "-";
+ $aux{7} = "-";
+ $t = strtotime($aux);
+
+ if ($t && $t > $latestTime) {
+ $latestTime = $t;
+ $latestTimeSource = "ExifDateTime";
+ }
+
+ if ($t && $t < $earliestTime) {
+ $earliestTime = $t;
+ $earliestTimeSource = "ExifDateTime";
+ }
+ }
+
+ if (@isset($this->_info['exif']['DateTimeOriginal'])) {
+ $dates['ExifDateTimeOriginal'] = $this->_info['exif']['DateTime'];
+
+ $aux = $this->_info['exif']['DateTimeOriginal'];
+ $aux{4} = "-";
+ $aux{7} = "-";
+ $t = strtotime($aux);
+
+ if ($t && $t > $latestTime) {
+ $latestTime = $t;
+ $latestTimeSource = "ExifDateTimeOriginal";
+ }
+
+ if ($t && $t < $earliestTime) {
+ $earliestTime = $t;
+ $earliestTimeSource = "ExifDateTimeOriginal";
+ }
+ }
+
+ if (@isset($this->_info['exif']['DateTimeDigitized'])) {
+ $dates['ExifDateTimeDigitized'] = $this->_info['exif']['DateTime'];
+
+ $aux = $this->_info['exif']['DateTimeDigitized'];
+ $aux{4} = "-";
+ $aux{7} = "-";
+ $t = strtotime($aux);
+
+ if ($t && $t > $latestTime) {
+ $latestTime = $t;
+ $latestTimeSource = "ExifDateTimeDigitized";
+ }
+
+ if ($t && $t < $earliestTime) {
+ $earliestTime = $t;
+ $earliestTimeSource = "ExifDateTimeDigitized";
+ }
+ }
+
+ if (@isset($this->_info['iptc']['DateCreated'])) {
+ $dates['IPTCDateCreated'] = $this->_info['iptc']['DateCreated'];
+
+ $aux = $this->_info['iptc']['DateCreated'];
+ $aux = substr($aux, 0, 4) . "-" . substr($aux, 4, 2) . "-" . substr($aux, 6, 2);
+ $t = strtotime($aux);
+
+ if ($t && $t > $latestTime) {
+ $latestTime = $t;
+ $latestTimeSource = "IPTCDateCreated";
+ }
+
+ if ($t && $t < $earliestTime) {
+ $earliestTime = $t;
+ $earliestTimeSource = "IPTCDateCreated";
+ }
+ }
+
+ if (@isset($this->_info['file']['UnixTime'])) {
+ $dates['FileModified'] = $this->_info['file']['UnixTime'];
+
+ $t = $this->_info['file']['UnixTime'];
+
+ if ($t && $t > $latestTime) {
+ $latestTime = $t;
+ $latestTimeSource = "FileModified";
+ }
+
+ if ($t && $t < $earliestTime) {
+ $earliestTime = $t;
+ $earliestTimeSource = "FileModified";
+ }
+ }
+
+ $dates['Time'] = $earliestTime;
+ $dates['TimeSource'] = $earliestTimeSource;
+ $dates['TimeStr'] = date("Y-m-d H:i:s", $earliestTime);
+ $dates['EarliestTime'] = $earliestTime;
+ $dates['EarliestTimeSource'] = $earliestTimeSource;
+ $dates['EarliestTimeStr'] = date("Y-m-d H:i:s", $earliestTime);
+ $dates['LatestTime'] = $latestTime;
+ $dates['LatestTimeSource'] = $latestTimeSource;
+ $dates['LatestTimeStr'] = date("Y-m-d H:i:s", $latestTime);
+
+ return $dates;
+ }
+
+ /**
+ * Get the image width, tries various fields
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getWidth()
+ {
+ if (!isset($this->_info['sof'])) {
+ $this->_parseMarkerSOF();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['sof']['ImageWidth'])) {
+ return $this->_info['sof']['ImageWidth'];
+ }
+
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if (isset($this->_info['exif']['PixelXDimension'])) {
+ return $this->_info['exif']['PixelXDimension'];
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the image height, tries various fields
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getHeight()
+ {
+ if (!isset($this->_info['sof'])) {
+ $this->_parseMarkerSOF();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['sof']['ImageHeight'])) {
+ return $this->_info['sof']['ImageHeight'];
+ }
+
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if (isset($this->_info['exif']['PixelYDimension'])) {
+ return $this->_info['exif']['PixelYDimension'];
+ }
+
+ return false;
+ }
+
+ /**
+ * Get an dimension string for use in img tag
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function getDimStr()
+ {
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $w = $this->getWidth();
+ $h = $this->getHeight();
+
+ return "width='" . $w . "' height='" . $h . "'";
+ }
+
+ /**
+ * Checks for an embedded thumbnail
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function hasThumbnail($which = 'any')
+ {
+ if (($which == 'any') || ($which == 'exif')) {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+ if (isset($this->_info['exif']['JFIFThumbnail'])) {
+ return 'exif';
+ }
+ }
+ }
+
+ if ($which == 'adobe') {
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['adobe']) && is_array($this->_info['adobe'])) {
+ if (isset($this->_info['adobe']['ThumbnailData'])) {
+ return 'exif';
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Send embedded thumbnail to browser
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ */
+ function sendThumbnail($which = 'any')
+ {
+ $data = null;
+
+ if (($which == 'any') || ($which == 'exif')) {
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+ if (isset($this->_info['exif']['JFIFThumbnail'])) {
+ $data =& $this->_info['exif']['JFIFThumbnail'];
+ }
+ }
+ }
+
+ if (($which == 'adobe') || ($data == null)){
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (isset($this->_info['adobe']) && is_array($this->_info['adobe'])) {
+ if (isset($this->_info['adobe']['ThumbnailData'])) {
+ $data =& $this->_info['adobe']['ThumbnailData'];
+ }
+ }
+ }
+
+ if ($data != null) {
+ header("Content-type: image/jpeg");
+ echo $data;
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Save changed Metadata
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function save($fileName = "") {
+ if ($fileName == "") {
+ $tmpName = tempnam(dirname($this->_fileName),'_metatemp_');
+ $this->_writeJPEG($tmpName);
+ if (@file_exists($tmpName)) {
+ return io_rename($tmpName, $this->_fileName);
+ }
+ } else {
+ return $this->_writeJPEG($fileName);
+ }
+ return false;
+ }
+
+ /*************************************************************/
+ /* PRIVATE FUNCTIONS (Internal Use Only!) */
+ /*************************************************************/
+
+ /*************************************************************/
+ function _dispose()
+ {
+ $this->_fileName = $fileName;
+
+ $this->_fp = null;
+ $this->_type = 'unknown';
+
+ unset($this->_markers);
+ unset($this->_info);
+ }
+
+ /*************************************************************/
+ function _readJPEG()
+ {
+ unset($this->_markers);
+ //unset($this->_info);
+ $this->_markers = array();
+ //$this->_info = array();
+
+ $this->_fp = @fopen($this->_fileName, 'rb');
+ if ($this->_fp) {
+ if (file_exists($this->_fileName)) {
+ $this->_type = 'file';
+ }
+ else {
+ $this->_type = 'url';
+ }
+ }
+ else {
+ $this->_fp = null;
+ return false; // ERROR: Can't open file
+ }
+
+ // Check for the JPEG signature
+ $c1 = ord(fgetc($this->_fp));
+ $c2 = ord(fgetc($this->_fp));
+
+ if ($c1 != 0xFF || $c2 != 0xD8) { // (0xFF + SOI)
+ $this->_markers = null;
+ return false; // ERROR: File is not a JPEG
+ }
+
+ $count = 0;
+
+ $done = false;
+ $ok = true;
+
+ while (!$done) {
+ $capture = false;
+
+ // First, skip any non 0xFF bytes
+ $discarded = 0;
+ $c = ord(fgetc($this->_fp));
+ while (!feof($this->_fp) && ($c != 0xFF)) {
+ $discarded++;
+ $c = ord(fgetc($this->_fp));
+ }
+ // Then skip all 0xFF until the marker byte
+ do {
+ $marker = ord(fgetc($this->_fp));
+ } while (!feof($this->_fp) && ($marker == 0xFF));
+
+ if (feof($this->_fp)) {
+ return false; // ERROR: Unexpected EOF
+ }
+ if ($discarded != 0) {
+ return false; // ERROR: Extraneous data
+ }
+
+ $length = ord(fgetc($this->_fp)) * 256 + ord(fgetc($this->_fp));
+ if (feof($this->_fp)) {
+ return false; // ERROR: Unexpected EOF
+ }
+ if ($length < 2) {
+ return false; // ERROR: Extraneous data
+ }
+ $length = $length - 2; // The length we got counts itself
+
+ switch ($marker) {
+ case 0xC0: // SOF0
+ case 0xC1: // SOF1
+ case 0xC2: // SOF2
+ case 0xC9: // SOF9
+ case 0xE0: // APP0: JFIF data
+ case 0xE1: // APP1: EXIF or XMP data
+ case 0xED: // APP13: IPTC / Photoshop data
+ $capture = true;
+ break;
+ case 0xDA: // SOS: Start of scan... the image itself and the last block on the file
+ $capture = false;
+ $length = -1; // This field has no length... it includes all data until EOF
+ $done = true;
+ break;
+ default:
+ $capture = true;//false;
+ break;
+ }
+
+ $this->_markers[$count] = array();
+ $this->_markers[$count]['marker'] = $marker;
+ $this->_markers[$count]['length'] = $length;
+
+ if ($capture) {
+ if ($length)
+ $this->_markers[$count]['data'] =& fread($this->_fp, $length);
+ else
+ $this->_markers[$count]['data'] = "";
+ }
+ elseif (!$done) {
+ $result = @fseek($this->_fp, $length, SEEK_CUR);
+ // fseek doesn't seem to like HTTP 'files', but fgetc has no problem
+ if (!($result === 0)) {
+ for ($i = 0; $i < $length; $i++) {
+ fgetc($this->_fp);
+ }
+ }
+ }
+ $count++;
+ }
+
+ if ($this->_fp) {
+ fclose($this->_fp);
+ $this->_fp = null;
+ }
+
+ return $ok;
+ }
+
+ /*************************************************************/
+ function _parseAll()
+ {
+ if (!isset($this->_info['file'])) {
+ $this->_parseFileInfo();
+ }
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ if (!isset($this->_info['jfif'])) {
+ $this->_parseMarkerJFIF();
+ }
+ if (!isset($this->_info['jpeg'])) {
+ $this->_parseMarkerSOF();
+ }
+ if (!isset($this->_info['exif'])) {
+ $this->_parseMarkerExif();
+ }
+ if (!isset($this->_info['xmp'])) {
+ $this->_parseMarkerXmp();
+ }
+ if (!isset($this->_info['adobe'])) {
+ $this->_parseMarkerAdobe();
+ }
+ }
+
+ /*************************************************************/
+ function _writeJPEG($outputName)
+ {
+ $this->_parseAll();
+
+ $wroteEXIF = false;
+ $wroteAdobe = false;
+
+ $this->_fp = @fopen($this->_fileName, 'r');
+ if ($this->_fp) {
+ if (file_exists($this->_fileName)) {
+ $this->_type = 'file';
+ }
+ else {
+ $this->_type = 'url';
+ }
+ }
+ else {
+ $this->_fp = null;
+ return false; // ERROR: Can't open file
+ }
+
+ $this->_fpout = fopen($outputName, 'wb');
+ if ($this->_fpout) {
+ }
+ else {
+ $this->_fpout = null;
+ fclose($this->_fp);
+ $this->_fp = null;
+ return false; // ERROR: Can't open output file
+ }
+
+ // Check for the JPEG signature
+ $c1 = ord(fgetc($this->_fp));
+ $c2 = ord(fgetc($this->_fp));
+
+ if ($c1 != 0xFF || $c2 != 0xD8) { // (0xFF + SOI)
+ return false; // ERROR: File is not a JPEG
+ }
+
+ fputs($this->_fpout, chr(0xFF), 1);
+ fputs($this->_fpout, chr(0xD8), 1); // (0xFF + SOI)
+
+ $count = 0;
+
+ $done = false;
+ $ok = true;
+
+ while (!$done) {
+ // First, skip any non 0xFF bytes
+ $discarded = 0;
+ $c = ord(fgetc($this->_fp));
+ while (!feof($this->_fp) && ($c != 0xFF)) {
+ $discarded++;
+ $c = ord(fgetc($this->_fp));
+ }
+ // Then skip all 0xFF until the marker byte
+ do {
+ $marker = ord(fgetc($this->_fp));
+ } while (!feof($this->_fp) && ($marker == 0xFF));
+
+ if (feof($this->_fp)) {
+ $ok = false;
+ break; // ERROR: Unexpected EOF
+ }
+ if ($discarded != 0) {
+ $ok = false;
+ break; // ERROR: Extraneous data
+ }
+
+ $length = ord(fgetc($this->_fp)) * 256 + ord(fgetc($this->_fp));
+ if (feof($this->_fp)) {
+ $ok = false;
+ break; // ERROR: Unexpected EOF
+ }
+ if ($length < 2) {
+ $ok = false;
+ break; // ERROR: Extraneous data
+ }
+ $length = $length - 2; // The length we got counts itself
+
+ unset($data);
+ if ($marker == 0xE1) { // APP1: EXIF data
+ $data =& $this->_createMarkerEXIF();
+ $wroteEXIF = true;
+ }
+ elseif ($marker == 0xED) { // APP13: IPTC / Photoshop data
+ $data =& $this->_createMarkerAdobe();
+ $wroteAdobe = true;
+ }
+ elseif ($marker == 0xDA) { // SOS: Start of scan... the image itself and the last block on the file
+ $done = true;
+ }
+
+ if (!$wroteEXIF && (($marker < 0xE0) || ($marker > 0xEF))) {
+ if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+ $exif =& $this->_createMarkerEXIF();
+ $this->_writeJPEGMarker(0xE1, strlen($exif), $exif, 0);
+ unset($exif);
+ }
+ $wroteEXIF = true;
+ }
+
+ if (!$wroteAdobe && (($marker < 0xE0) || ($marker > 0xEF))) {
+ if ((isset($this->_info['adobe']) && is_array($this->_info['adobe']))
+ || (isset($this->_info['iptc']) && is_array($this->_info['iptc']))) {
+ $adobe =& $this->_createMarkerAdobe();
+ $this->_writeJPEGMarker(0xED, strlen($adobe), $adobe, 0);
+ unset($adobe);
+ }
+ $wroteAdobe = true;
+ }
+
+ $origLength = $length;
+ if (isset($data)) {
+ $length = strlen($data);
+ }
+
+ if ($marker != -1) {
+ $this->_writeJPEGMarker($marker, $length, $data, $origLength);
+ }
+ }
+
+ if ($this->_fp) {
+ fclose($this->_fp);
+ $this->_fp = null;
+ }
+
+ if ($this->_fpout) {
+ fclose($this->_fpout);
+ $this->_fpout = null;
+ }
+
+ return $ok;
+ }
+
+ /*************************************************************/
+ function _writeJPEGMarker($marker, $length, &$data, $origLength)
+ {
+ if ($length <= 0) {
+ return false;
+ }
+
+ fputs($this->_fpout, chr(0xFF), 1);
+ fputs($this->_fpout, chr($marker), 1);
+ fputs($this->_fpout, chr((($length + 2) & 0x0000FF00) >> 8), 1);
+ fputs($this->_fpout, chr((($length + 2) & 0x000000FF) >> 0), 1);
+
+ if (isset($data)) {
+ // Copy the generated data
+ fputs($this->_fpout, $data, $length);
+
+ if ($origLength > 0) { // Skip the original data
+ $result = @fseek($this->_fp, $origLength, SEEK_CUR);
+ // fseek doesn't seem to like HTTP 'files', but fgetc has no problem
+ if ($result != 0) {
+ for ($i = 0; $i < $origLength; $i++) {
+ fgetc($this->_fp);
+ }
+ }
+ }
+ }
+ else {
+ if ($marker == 0xDA) { // Copy until EOF
+ while (!feof($this->_fp)) {
+ $data = fread($this->_fp, 1024 * 16);
+ fputs($this->_fpout, $data, strlen($data));
+ }
+ }
+ else { // Copy only $length bytes
+ $data = @fread($this->_fp, $length);
+ fputs($this->_fpout, $data, $length);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Gets basic info from the file - should work with non-JPEGs
+ *
+ * @author Sebastian Delmont <sdelmont@zonageek.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function _parseFileInfo()
+ {
+ if (file_exists($this->_fileName)) {
+ $this->_info['file'] = array();
+ $this->_info['file']['Name'] = basename($this->_fileName);
+ $this->_info['file']['Path'] = fullpath($this->_fileName);
+ $this->_info['file']['Size'] = filesize($this->_fileName);
+ if ($this->_info['file']['Size'] < 1024) {
+ $this->_info['file']['NiceSize'] = $this->_info['file']['Size'] . 'B';
+ }
+ elseif ($this->_info['file']['Size'] < (1024 * 1024)) {
+ $this->_info['file']['NiceSize'] = round($this->_info['file']['Size'] / 1024) . 'KB';
+ }
+ elseif ($this->_info['file']['Size'] < (1024 * 1024 * 1024)) {
+ $this->_info['file']['NiceSize'] = round($this->_info['file']['Size'] / (1024*1024)) . 'MB';
+ }
+ else {
+ $this->_info['file']['NiceSize'] = $this->_info['file']['Size'] . 'B';
+ }
+ $this->_info['file']['UnixTime'] = filemtime($this->_fileName);
+
+ // get image size directly from file
+ $size = getimagesize($this->_fileName);
+ $this->_info['file']['Width'] = $size[0];
+ $this->_info['file']['Height'] = $size[1];
+ // set mime types and formats
+ // http://www.php.net/manual/en/function.getimagesize.php
+ // http://www.php.net/manual/en/function.image-type-to-mime-type.php
+ switch ($size[2]){
+ case 1:
+ $this->_info['file']['Mime'] = 'image/gif';
+ $this->_info['file']['Format'] = 'GIF';
+ break;
+ case 2:
+ $this->_info['file']['Mime'] = 'image/jpeg';
+ $this->_info['file']['Format'] = 'JPEG';
+ break;
+ case 3:
+ $this->_info['file']['Mime'] = 'image/png';
+ $this->_info['file']['Format'] = 'PNG';
+ break;
+ case 4:
+ $this->_info['file']['Mime'] = 'application/x-shockwave-flash';
+ $this->_info['file']['Format'] = 'SWF';
+ break;
+ case 5:
+ $this->_info['file']['Mime'] = 'image/psd';
+ $this->_info['file']['Format'] = 'PSD';
+ break;
+ case 6:
+ $this->_info['file']['Mime'] = 'image/bmp';
+ $this->_info['file']['Format'] = 'BMP';
+ break;
+ case 7:
+ $this->_info['file']['Mime'] = 'image/tiff';
+ $this->_info['file']['Format'] = 'TIFF (Intel)';
+ break;
+ case 8:
+ $this->_info['file']['Mime'] = 'image/tiff';
+ $this->_info['file']['Format'] = 'TIFF (Motorola)';
+ break;
+ case 9:
+ $this->_info['file']['Mime'] = 'application/octet-stream';
+ $this->_info['file']['Format'] = 'JPC';
+ break;
+ case 10:
+ $this->_info['file']['Mime'] = 'image/jp2';
+ $this->_info['file']['Format'] = 'JP2';
+ break;
+ case 11:
+ $this->_info['file']['Mime'] = 'application/octet-stream';
+ $this->_info['file']['Format'] = 'JPX';
+ break;
+ case 12:
+ $this->_info['file']['Mime'] = 'application/octet-stream';
+ $this->_info['file']['Format'] = 'JB2';
+ break;
+ case 13:
+ $this->_info['file']['Mime'] = 'application/x-shockwave-flash';
+ $this->_info['file']['Format'] = 'SWC';
+ break;
+ case 14:
+ $this->_info['file']['Mime'] = 'image/iff';
+ $this->_info['file']['Format'] = 'IFF';
+ break;
+ case 15:
+ $this->_info['file']['Mime'] = 'image/vnd.wap.wbmp';
+ $this->_info['file']['Format'] = 'WBMP';
+ break;
+ case 16:
+ $this->_info['file']['Mime'] = 'image/xbm';
+ $this->_info['file']['Format'] = 'XBM';
+ break;
+ default:
+ $this->_info['file']['Mime'] = 'image/unknown';
+ }
+ }
+ else {
+ $this->_info['file'] = array();
+ $this->_info['file']['Name'] = basename($this->_fileName);
+ $this->_info['file']['Url'] = $this->_fileName;
+ }
+
+ return true;
+ }
+
+ /*************************************************************/
+ function _parseMarkerJFIF()
+ {
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_markers[$i]['marker'] == 0xE0) {
+ $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 4);
+ if ($signature == 'JFIF') {
+ $data =& $this->_markers[$i]['data'];
+ break;
+ }
+ }
+ }
+
+ if ($data == null) {
+ $this->_info['jfif'] = false;
+ return false;
+ }
+
+ $pos = 0;
+ $this->_info['jfif'] = array();
+
+
+ $vmaj = $this->_getByte($data, 5);
+ $vmin = $this->_getByte($data, 6);
+
+ $this->_info['jfif']['Version'] = sprintf('%d.%02d', $vmaj, $vmin);
+
+ $units = $this->_getByte($data, 7);
+ switch ($units) {
+ case 0:
+ $this->_info['jfif']['Units'] = 'pixels';
+ break;
+ case 1:
+ $this->_info['jfif']['Units'] = 'dpi';
+ break;
+ case 2:
+ $this->_info['jfif']['Units'] = 'dpcm';
+ break;
+ default:
+ $this->_info['jfif']['Units'] = 'unknown';
+ break;
+ }
+
+ $xdens = $this->_getShort($data, 8);
+ $ydens = $this->_getShort($data, 10);
+
+ $this->_info['jfif']['XDensity'] = $xdens;
+ $this->_info['jfif']['YDensity'] = $ydens;
+
+ $thumbx = $this->_getByte($data, 12);
+ $thumby = $this->_getByte($data, 13);
+
+ $this->_info['jfif']['ThumbnailWidth'] = $thumbx;
+ $this->_info['jfif']['ThumbnailHeight'] = $thumby;
+
+ return true;
+ }
+
+ /*************************************************************/
+ function _parseMarkerSOF()
+ {
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ switch ($this->_markers[$i]['marker']) {
+ case 0xC0: // SOF0
+ case 0xC1: // SOF1
+ case 0xC2: // SOF2
+ case 0xC9: // SOF9
+ $data =& $this->_markers[$i]['data'];
+ $marker = $this->_markers[$i]['marker'];
+ break;
+ }
+ }
+
+ if ($data == null) {
+ $this->_info['sof'] = false;
+ return false;
+ }
+
+ $pos = 0;
+ $this->_info['sof'] = array();
+
+
+ switch ($marker) {
+ case 0xC0: // SOF0
+ $format = 'Baseline';
+ break;
+ case 0xC1: // SOF1
+ $format = 'Progessive';
+ break;
+ case 0xC2: // SOF2
+ $format = 'Non-baseline';
+ break;
+ case 0xC9: // SOF9
+ $format = 'Arithmetic';
+ break;
+ default:
+ return false;
+ break;
+ }
+
+
+ $this->_info['sof']['Format'] = $format;
+
+ $this->_info['sof']['SamplePrecision'] = $this->_getByte($data, $pos + 0);
+ $this->_info['sof']['ImageHeight'] = $this->_getShort($data, $pos + 1);
+ $this->_info['sof']['ImageWidth'] = $this->_getShort($data, $pos + 3);
+ $this->_info['sof']['ColorChannels'] = $this->_getByte($data, $pos + 5);
+
+ return true;
+ }
+
+ /**
+ * Parses the XMP data
+ *
+ * @author Hakan Sandell <hakan.sandell@mydata.se>
+ */
+ function _parseMarkerXmp()
+ {
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_markers[$i]['marker'] == 0xE1) {
+ $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 29);
+ if ($signature == "http://ns.adobe.com/xap/1.0/\0") {
+ $data =& substr($this->_markers[$i]['data'], 29);
+ break;
+ }
+ }
+ }
+
+ if ($data == null) {
+ $this->_info['xmp'] = false;
+ return false;
+ }
+
+ $parser = xml_parser_create();
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
+ xml_parse_into_struct($parser, $data, $values, $tags);
+ xml_parser_free($parser);
+
+ $this->_info['xmp'] = array();
+ $count = count($values);
+ for ($i = 0; $i < $count; $i++) {
+ if ($values[$i][tag] == 'rdf:Description' && $values[$i][type] == 'open') {
+
+ while ($values[++$i][tag] != 'rdf:Description') {
+ $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i][tag]]);
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Parses XMP nodes by recursion
+ *
+ * @author Hakan Sandell <hakan.sandell@mydata.se>
+ */
+ function _parseXmpNode($values, &$i, &$meta)
+ {
+ if ($values[$i][type] == 'complete') {
+ // Simple Type property
+ $meta = $values[$i][value];
+ return;
+ }
+
+ $i++;
+ if ($values[$i][tag] == 'rdf:Bag' || $values[$i][tag] == 'rdf:Seq') {
+ // Array property
+ $meta = array();
+ while ($values[++$i][tag] == 'rdf:li') {
+ $this->_parseXmpNode($values, $i, $meta[]);
+ }
+ $i++; // skip closing tag
+
+ } elseif ($values[$i][tag] == 'rdf:Alt') {
+ // Language Alternative property, only the first (default) value is used
+ $i++;
+ $this->_parseXmpNode($values, $i, $meta);
+ while ($values[++$i][tag] != 'rdf:Alt');
+ $i++; // skip closing tag
+
+ } else {
+ // Structure property
+ $meta = array();
+ $startTag = $values[$i-1][tag];
+ do {
+ $this->_parseXmpNode($values, $i, $meta[$values[$i][tag]]);
+ } while ($values[++$i][tag] != $startTag);
+ }
+ }
+
+ /*************************************************************/
+ function _parseMarkerExif()
+ {
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_markers[$i]['marker'] == 0xE1) {
+ $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 6);
+ if ($signature == "Exif\0\0") {
+ $data =& $this->_markers[$i]['data'];
+ break;
+ }
+ }
+ }
+
+ if ($data == null) {
+ $this->_info['exif'] = false;
+ return false;
+ }
+ $pos = 6;
+ $this->_info['exif'] = array();
+
+ // We don't increment $pos after this because Exif uses offsets relative to this point
+
+ $byteAlign = $this->_getShort($data, $pos + 0);
+
+ if ($byteAlign == 0x4949) { // "II"
+ $isBigEndian = false;
+ }
+ elseif ($byteAlign == 0x4D4D) { // "MM"
+ $isBigEndian = true;
+ }
+ else {
+ return false; // Unexpected data
+ }
+
+ $alignCheck = $this->_getShort($data, $pos + 2, $isBigEndian);
+ if ($alignCheck != 0x002A) // That's the expected value
+ return false; // Unexpected data
+
+ if ($isBigEndian) {
+ $this->_info['exif']['ByteAlign'] = "Big Endian";
+ }
+ else {
+ $this->_info['exif']['ByteAlign'] = "Little Endian";
+ }
+
+ $offsetIFD0 = $this->_getLong($data, $pos + 4, $isBigEndian);
+ if ($offsetIFD0 < 8)
+ return false; // Unexpected data
+
+ $offsetIFD1 = $this->_readIFD($data, $pos, $offsetIFD0, $isBigEndian, 'ifd0');
+ if ($offsetIFD1 != 0)
+ $this->_readIFD($data, $pos, $offsetIFD1, $isBigEndian, 'ifd1');
+
+ return true;
+ }
+
+ /*************************************************************/
+ function _readIFD($data, $base, $offset, $isBigEndian, $mode)
+ {
+ $EXIFTags = $this->_exifTagNames($mode);
+
+ $numEntries = $this->_getShort($data, $base + $offset, $isBigEndian);
+ $offset += 2;
+
+ $exifTIFFOffset = 0;
+ $exifTIFFLength = 0;
+ $exifThumbnailOffset = 0;
+ $exifThumbnailLength = 0;
+
+ for ($i = 0; $i < $numEntries; $i++) {
+ $tag = $this->_getShort($data, $base + $offset, $isBigEndian);
+ $offset += 2;
+ $type = $this->_getShort($data, $base + $offset, $isBigEndian);
+ $offset += 2;
+ $count = $this->_getLong($data, $base + $offset, $isBigEndian);
+ $offset += 4;
+
+ if (($type < 1) || ($type > 12))
+ return false; // Unexpected Type
+
+ $typeLengths = array( -1, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 );
+
+ $dataLength = $typeLengths[$type] * $count;
+ if ($dataLength > 4) {
+ $dataOffset = $this->_getLong($data, $base + $offset, $isBigEndian);
+ $rawValue = $this->_getFixedString($data, $base + $dataOffset, $dataLength);
+ }
+ else {
+ $rawValue = $this->_getFixedString($data, $base + $offset, $dataLength);
+ }
+ $offset += 4;
+
+ switch ($type) {
+ case 1: // UBYTE
+ if ($count == 1) {
+ $value = $this->_getByte($rawValue, 0);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getByte($rawValue, $j);
+ }
+ break;
+ case 2: // ASCII
+ $value = $rawValue;
+ break;
+ case 3: // USHORT
+ if ($count == 1) {
+ $value = $this->_getShort($rawValue, 0, $isBigEndian);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getShort($rawValue, $j * 2, $isBigEndian);
+ }
+ break;
+ case 4: // ULONG
+ if ($count == 1) {
+ $value = $this->_getLong($rawValue, 0, $isBigEndian);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getLong($rawValue, $j * 4, $isBigEndian);
+ }
+ break;
+ case 5: // URATIONAL
+ if ($count == 1) {
+ $a = $this->_getLong($rawValue, 0, $isBigEndian);
+ $b = $this->_getLong($rawValue, 4, $isBigEndian);
+ $value = array();
+ $value['val'] = 0;
+ $value['num'] = $a;
+ $value['den'] = $b;
+ if (($a != 0) && ($b != 0)) {
+ $value['val'] = $a / $b;
+ }
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++) {
+ $a = $this->_getLong($rawValue, $j * 8, $isBigEndian);
+ $b = $this->_getLong($rawValue, ($j * 8) + 4, $isBigEndian);
+ $value = array();
+ $value[$j]['val'] = 0;
+ $value[$j]['num'] = $a;
+ $value[$j]['den'] = $b;
+ if (($a != 0) && ($b != 0))
+ $value[$j]['val'] = $a / $b;
+ }
+ }
+ break;
+ case 6: // SBYTE
+ if ($count == 1) {
+ $value = $this->_getByte($rawValue, 0);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getByte($rawValue, $j);
+ }
+ break;
+ case 7: // UNDEFINED
+ $value = $rawValue;
+ break;
+ case 8: // SSHORT
+ if ($count == 1) {
+ $value = $this->_getShort($rawValue, 0, $isBigEndian);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getShort($rawValue, $j * 2, $isBigEndian);
+ }
+ break;
+ case 9: // SLONG
+ if ($count == 1) {
+ $value = $this->_getLong($rawValue, 0, $isBigEndian);
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++)
+ $value[$j] = $this->_getLong($rawValue, $j * 4, $isBigEndian);
+ }
+ break;
+ case 10: // SRATIONAL
+ if ($count == 1) {
+ $a = $this->_getLong($rawValue, 0, $isBigEndian);
+ $b = $this->_getLong($rawValue, 4, $isBigEndian);
+ $value = array();
+ $value['val'] = 0;
+ $value['num'] = $a;
+ $value['den'] = $b;
+ if (($a != 0) && ($b != 0))
+ $value['val'] = $a / $b;
+ }
+ else {
+ $value = array();
+ for ($j = 0; $j < $count; $j++) {
+ $a = $this->_getLong($rawValue, $j * 8, $isBigEndian);
+ $b = $this->_getLong($rawValue, ($j * 8) + 4, $isBigEndian);
+ $value = array();
+ $value[$j]['val'] = 0;
+ $value[$j]['num'] = $a;
+ $value[$j]['den'] = $b;
+ if (($a != 0) && ($b != 0))
+ $value[$j]['val'] = $a / $b;
+ }
+ }
+ break;
+ case 11: // FLOAT
+ $value = $rawValue;
+ break;
+
+ case 12: // DFLOAT
+ $value = $rawValue;
+ break;
+ default:
+ return false; // Unexpected Type
+ }
+
+ $tagName = '';
+ if (($mode == 'ifd0') && ($tag == 0x8769)) { // ExifIFDOffset
+ $this->_readIFD($data, $base, $value, $isBigEndian, 'exif');
+ }
+ elseif (($mode == 'ifd0') && ($tag == 0x8825)) { // GPSIFDOffset
+ $this->_readIFD($data, $base, $value, $isBigEndian, 'gps');
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0111)) { // TIFFStripOffsets
+ $exifTIFFOffset = $value;
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0117)) { // TIFFStripByteCounts
+ $exifTIFFLength = $value;
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0201)) { // TIFFJFIFOffset
+ $exifThumbnailOffset = $value;
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0202)) { // TIFFJFIFLength
+ $exifThumbnailLength = $value;
+ }
+ elseif (($mode == 'exif') && ($tag == 0xA005)) { // InteropIFDOffset
+ $this->_readIFD($data, $base, $value, $isBigEndian, 'interop');
+ }
+ // elseif (($mode == 'exif') && ($tag == 0x927C)) { // MakerNote
+ // }
+ else {
+ if (isset($EXIFTags[$tag])) {
+ $tagName = $EXIFTags[$tag];
+ if (isset($this->_info['exif'][$tagName])) {
+ if (!is_array($this->_info['exif'][$tagName])) {
+ $aux = array();
+ $aux[0] = $this->_info['exif'][$tagName];
+ $this->_info['exif'][$tagName] = $aux;
+ }
+
+ $this->_info['exif'][$tagName][count($this->_info['exif'][$tagName])] = $value;
+ }
+ else {
+ $this->_info['exif'][$tagName] = $value;
+ }
+ }
+ else {
+#echo sprintf("<h1>Unknown tag %02x (t: %d l: %d) %s in %s</h1>", $tag, $type, $count, $mode, $this->_fileName);
+ // Unknown Tags will be ignored!!!
+ // That's because the tag might be a pointer (like the Exif tag)
+ // and saving it without saving the data it points to might
+ // create an invalid file.
+ }
+ }
+ }
+
+ if (($exifThumbnailOffset > 0) && ($exifThumbnailLength > 0)) {
+ $this->_info['exif']['JFIFThumbnail'] = $this->_getFixedString($data, $base + $exifThumbnailOffset, $exifThumbnailLength);
+ }
+
+ if (($exifTIFFOffset > 0) && ($exifTIFFLength > 0)) {
+ $this->_info['exif']['TIFFStrips'] = $this->_getFixedString($data, $base + $exifTIFFOffset, $exifTIFFLength);
+ }
+
+ $nextOffset = $this->_getLong($data, $base + $offset, $isBigEndian);
+ return $nextOffset;
+ }
+
+ /*************************************************************/
+ function & _createMarkerExif()
+ {
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_markers[$i]['marker'] == 0xE1) {
+ $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 6);
+ if ($signature == "Exif\0\0") {
+ $data =& $this->_markers[$i]['data'];
+ break;
+ }
+ }
+ }
+
+ if (!isset($this->_info['exif'])) {
+ return false;
+ }
+
+ $data = "Exif\0\0";
+ $pos = 6;
+ $offsetBase = 6;
+
+ if (isset($this->_info['exif']['ByteAlign']) && ($this->_info['exif']['ByteAlign'] == "Big Endian")) {
+ $isBigEndian = true;
+ $aux = "MM";
+ $pos = $this->_putString($data, $pos, $aux);
+ }
+ else {
+ $isBigEndian = false;
+ $aux = "II";
+ $pos = $this->_putString($data, $pos, $aux);
+ }
+ $pos = $this->_putShort($data, $pos, 0x002A, $isBigEndian);
+ $pos = $this->_putLong($data, $pos, 0x00000008, $isBigEndian); // IFD0 Offset is always 8
+
+ $ifd0 =& $this->_getIFDEntries($isBigEndian, 'ifd0');
+ $ifd1 =& $this->_getIFDEntries($isBigEndian, 'ifd1');
+
+ $pos = $this->_writeIFD($data, $pos, $offsetBase, $ifd0, $isBigEndian, true);
+ $pos = $this->_writeIFD($data, $pos, $offsetBase, $ifd1, $isBigEndian, false);
+
+ return $data;
+ }
+
+ /*************************************************************/
+ function _writeIFD(&$data, $pos, $offsetBase, &$entries, $isBigEndian, $hasNext)
+ {
+ $tiffData = null;
+ $tiffDataOffsetPos = -1;
+
+ $entryCount = count($entries);
+
+ $dataPos = $pos + 2 + ($entryCount * 12) + 4;
+ $pos = $this->_putShort($data, $pos, $entryCount, $isBigEndian);
+
+ for ($i = 0; $i < $entryCount; $i++) {
+ $tag = $entries[$i]['tag'];
+ $type = $entries[$i]['type'];
+
+ if ($type == -99) { // SubIFD
+ $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+ $pos = $this->_putShort($data, $pos, 0x04, $isBigEndian); // LONG
+ $pos = $this->_putLong($data, $pos, 0x01, $isBigEndian); // Count = 1
+ $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+
+ $dataPos = $this->_writeIFD($data, $dataPos, $offsetBase, $entries[$i]['value'], $isBigEndian, false);
+ }
+ elseif ($type == -98) { // TIFF Data
+ $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+ $pos = $this->_putShort($data, $pos, 0x04, $isBigEndian); // LONG
+ $pos = $this->_putLong($data, $pos, 0x01, $isBigEndian); // Count = 1
+ $tiffDataOffsetPos = $pos;
+ $pos = $this->_putLong($data, $pos, 0x00, $isBigEndian); // For Now
+ $tiffData =& $entries[$i]['value'] ;
+ }
+ else { // Regular Entry
+ $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+ $pos = $this->_putShort($data, $pos, $type, $isBigEndian);
+ $pos = $this->_putLong($data, $pos, $entries[$i]['count'], $isBigEndian);
+ if (strlen($entries[$i]['value']) > 4) {
+ $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+ $dataPos = $this->_putString($data, $dataPos, $entries[$i]['value']);
+ }
+ else {
+ $val = str_pad($entries[$i]['value'], 4, "\0");
+ $pos = $this->_putString($data, $pos, $val);
+ }
+ }
+ }
+
+ if ($tiffData != null) {
+ $this->_putLong($data, $tiffDataOffsetPos, $dataPos - $offsetBase, $isBigEndian);
+ $dataPos = $this->_putString($data, $dataPos, $tiffData);
+ }
+
+ if ($hasNext) {
+ $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+ }
+ else {
+ $pos = $this->_putLong($data, $pos, 0, $isBigEndian);
+ }
+
+ return $dataPos;
+ }
+
+ /*************************************************************/
+ function & _getIFDEntries($isBigEndian, $mode)
+ {
+ $EXIFNames = $this->_exifTagNames($mode);
+ $EXIFTags = $this->_exifNameTags($mode);
+ $EXIFTypeInfo = $this->_exifTagTypes($mode);
+
+ $ifdEntries = array();
+ $entryCount = 0;
+
+ reset($EXIFNames);
+ while (list($tag, $name) = each($EXIFNames)) {
+ $type = $EXIFTypeInfo[$tag][0];
+ $count = $EXIFTypeInfo[$tag][1];
+ $value = null;
+
+ if (($mode == 'ifd0') && ($tag == 0x8769)) { // ExifIFDOffset
+ if (isset($this->_info['exif']['EXIFVersion'])) {
+ $value =& $this->_getIFDEntries($isBigEndian, "exif");
+ $type = -99;
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'ifd0') && ($tag == 0x8825)) { // GPSIFDOffset
+ if (isset($this->_info['exif']['GPSVersionID'])) {
+ $value =& $this->_getIFDEntries($isBigEndian, "gps");
+ $type = -99;
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0111)) { // TIFFStripOffsets
+ if (isset($this->_info['exif']['TIFFStrips'])) {
+ $value =& $this->_info['exif']['TIFFStrips'];
+ $type = -98;
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0117)) { // TIFFStripByteCounts
+ if (isset($this->_info['exif']['TIFFStrips'])) {
+ $value = strlen($this->_info['exif']['TIFFStrips']);
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0201)) { // TIFFJFIFOffset
+ if (isset($this->_info['exif']['JFIFThumbnail'])) {
+ $value =& $this->_info['exif']['JFIFThumbnail'];
+ $type = -98;
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'ifd1') && ($tag == 0x0202)) { // TIFFJFIFLength
+ if (isset($this->_info['exif']['JFIFThumbnail'])) {
+ $value = strlen($this->_info['exif']['JFIFThumbnail']);
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (($mode == 'exif') && ($tag == 0xA005)) { // InteropIFDOffset
+ if (isset($this->_info['exif']['InteroperabilityIndex'])) {
+ $value =& $this->_getIFDEntries($isBigEndian, "interop");
+ $type = -99;
+ }
+ else {
+ $value = null;
+ }
+ }
+ elseif (isset($this->_info['exif'][$name])) {
+ $origValue =& $this->_info['exif'][$name];
+
+ // This makes it easier to process variable size elements
+ if (!is_array($origValue) || isset($origValue['val'])) {
+ unset($origValue); // Break the reference
+ $origValue = array($this->_info['exif'][$name]);
+ }
+ $origCount = count($origValue);
+
+ if ($origCount == 0 ) {
+ $type = -1; // To ignore this field
+ }
+
+ $value = " ";
+
+ switch ($type) {
+ case 1: // UBYTE
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+
+ $this->_putByte($value, $j, $origValue[$j]);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putByte($value, $j, 0);
+ $j++;
+ }
+ break;
+ case 2: // ASCII
+ $v = strval($origValue[0]);
+ if (($count != 0) && (strlen($v) > $count)) {
+ $v = substr($v, 0, $count);
+ }
+ elseif (($count > 0) && (strlen($v) < $count)) {
+ $v = str_pad($v, $count, "\0");
+ }
+
+ $count = strlen($v);
+
+ $this->_putString($value, 0, $v);
+ break;
+ case 3: // USHORT
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $this->_putShort($value, $j * 2, $origValue[$j], $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putShort($value, $j * 2, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 4: // ULONG
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $this->_putLong($value, $j * 4, $origValue[$j], $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putLong($value, $j * 4, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 5: // URATIONAL
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $v = $origValue[$j];
+ if (is_array($v)) {
+ $a = $v['num'];
+ $b = $v['den'];
+ }
+ else {
+ $a = 0;
+ $b = 0;
+ // TODO: Allow other types and convert them
+ }
+ $this->_putLong($value, $j * 8, $a, $isBigEndian);
+ $this->_putLong($value, ($j * 8) + 4, $b, $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putLong($value, $j * 8, 0, $isBigEndian);
+ $this->_putLong($value, ($j * 8) + 4, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 6: // SBYTE
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $this->_putByte($value, $j, $origValue[$j]);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putByte($value, $j, 0);
+ $j++;
+ }
+ break;
+ case 7: // UNDEFINED
+ $v = strval($origValue[0]);
+ if (($count != 0) && (strlen($v) > $count)) {
+ $v = substr($v, 0, $count);
+ }
+ elseif (($count > 0) && (strlen($v) < $count)) {
+ $v = str_pad($v, $count, "\0");
+ }
+
+ $count = strlen($v);
+
+ $this->_putString($value, 0, $v);
+ break;
+ case 8: // SSHORT
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $this->_putShort($value, $j * 2, $origValue[$j], $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putShort($value, $j * 2, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 9: // SLONG
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $this->_putLong($value, $j * 4, $origValue[$j], $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putLong($value, $j * 4, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 10: // SRATIONAL
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $v = $origValue[$j];
+ if (is_array($v)) {
+ $a = $v['num'];
+ $b = $v['den'];
+ }
+ else {
+ $a = 0;
+ $b = 0;
+ // TODO: Allow other types and convert them
+ }
+
+ $this->_putLong($value, $j * 8, $a, $isBigEndian);
+ $this->_putLong($value, ($j * 8) + 4, $b, $isBigEndian);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putLong($value, $j * 8, 0, $isBigEndian);
+ $this->_putLong($value, ($j * 8) + 4, 0, $isBigEndian);
+ $j++;
+ }
+ break;
+ case 11: // FLOAT
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $v = strval($origValue[$j]);
+ if (strlen($v) > 4) {
+ $v = substr($v, 0, 4);
+ }
+ elseif (strlen($v) < 4) {
+ $v = str_pad($v, 4, "\0");
+ }
+ $this->_putString($value, $j * 4, $v);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putString($value, $j * 4, "\0\0\0\0");
+ $j++;
+ }
+ break;
+ case 12: // DFLOAT
+ if ($count == 0) {
+ $count = $origCount;
+ }
+
+ $j = 0;
+ while (($j < $count) && ($j < $origCount)) {
+ $v = strval($origValue[$j]);
+ if (strlen($v) > 8) {
+ $v = substr($v, 0, 8);
+ }
+ elseif (strlen($v) < 8) {
+ $v = str_pad($v, 8, "\0");
+ }
+ $this->_putString($value, $j * 8, $v);
+ $j++;
+ }
+
+ while ($j < $count) {
+ $this->_putString($value, $j * 8, "\0\0\0\0\0\0\0\0");
+ $j++;
+ }
+ break;
+ default:
+ $value = null;
+ break;
+ }
+ }
+
+ if ($value != null) {
+ $ifdEntries[$entryCount] = array();
+ $ifdEntries[$entryCount]['tag'] = $tag;
+ $ifdEntries[$entryCount]['type'] = $type;
+ $ifdEntries[$entryCount]['count'] = $count;
+ $ifdEntries[$entryCount]['value'] = $value;
+
+ $entryCount++;
+ }
+ }
+
+ return $ifdEntries;
+ }
+
+ /*************************************************************/
+ function _parseMarkerAdobe()
+ {
+ if (!isset($this->_markers)) {
+ $this->_readJPEG();
+ }
+
+ if ($this->_markers == null) {
+ return false;
+ }
+
+ $data = null;
+ $count = count($this->_markers);
+ for ($i = 0; $i < $count; $i++) {
+ if ($this->_markers[$i]['marker'] == 0xED) {
+ $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 14);
+ if ($signature == "Photoshop 3.0\0") {
+ $data =& $this->_markers[$i]['data'];
+ break;
+ }
+ }
+ }
+
+ if ($data == null) {
+ $this->_info['adobe'] = false;
+ $this->_info['iptc'] = false;
+ return false;
+ }
+ $pos = 14;
+ $this->_info['adobe'] = array();
+ $this->_info['adobe']['raw'] = array();
+ $this->_info['iptc'] = array();
+
+ $datasize = strlen($data);
+
+ while ($pos < $datasize) {
+ $signature = $this->_getFixedString($data, $pos, 4);
+ if ($signature != '8BIM')
+ return false;
+ $pos += 4;
+
+ $type = $this->_getShort($data, $pos);
+ $pos += 2;
+
+ $strlen = $this->_getByte($data, $pos);
+ $pos += 1;
+ $header = '';
+ for ($i = 0; $i < $strlen; $i++) {
+ $header .= $data{$pos + $i};
+ }
+ $pos += $strlen + 1 - ($strlen % 2); // The string is padded to even length, counting the length byte itself
+
+ $length = $this->_getLong($data, $pos);
+ $pos += 4;
+
+ $basePos = $pos;
+
+ switch ($type) {
+ case 0x0404: // Caption (IPTC Data)
+ $pos = $this->_readIPTC($data, $pos);
+ if ($pos == false)
+ return false;
+ break;
+ case 0x040A: // CopyrightFlag
+ $this->_info['adobe']['CopyrightFlag'] = $this->_getByte($data, $pos);
+ $pos += $length;
+ break;
+ case 0x040B: // ImageURL
+ $this->_info['adobe']['ImageURL'] = $this->_getFixedString($data, $pos, $length);
+ $pos += $length;
+ break;
+ case 0x040C: // Thumbnail
+ $aux = $this->_getLong($data, $pos);
+ $pos += 4;
+ if ($aux == 1) {
+ $this->_info['adobe']['ThumbnailWidth'] = $this->_getLong($data, $pos);
+ $pos += 4;
+ $this->_info['adobe']['ThumbnailHeight'] = $this->_getLong($data, $pos);
+ $pos += 4;
+
+ $pos += 16; // Skip some data
+
+ $this->_info['adobe']['ThumbnailData'] = $this->_getFixedString($data, $pos, $length - 28);
+ $pos += $length - 28;
+ }
+ break;
+ default:
+ break;
+ }
+
+ // We save all blocks, even those we recognized
+ $label = sprintf('8BIM_0x%04x', $type);
+ $this->_info['adobe']['raw'][$label] = array();
+ $this->_info['adobe']['raw'][$label]['type'] = $type;
+ $this->_info['adobe']['raw'][$label]['header'] = $header;
+ $this->_info['adobe']['raw'][$label]['data'] =& $this->_getFixedString($data, $basePos, $length);
+
+ $pos = $basePos + $length + ($length % 2); // Even padding
+ }
+
+ }
+
+ /*************************************************************/
+ function _readIPTC(&$data, $pos = 0)
+ {
+ $totalLength = strlen($data);
+
+ $IPTCTags =& $this->_iptcTagNames();
+
+ while ($pos < ($totalLength - 5)) {
+ $signature = $this->_getShort($data, $pos);
+ if ($signature != 0x1C02)
+ return $pos;
+ $pos += 2;
+
+ $type = $this->_getByte($data, $pos);
+ $pos += 1;
+ $length = $this->_getShort($data, $pos);
+ $pos += 2;
+
+ $basePos = $pos;
+ $label = '';
+
+ if (isset($IPTCTags[$type])) {
+ $label = $IPTCTags[$type];
+ }
+ else {
+ $label = sprintf('IPTC_0x%02x', $type);
+ }
+
+ if ($label != '') {
+ if (isset($this->_info['iptc'][$label])) {
+ if (!is_array($this->_info['iptc'][$label])) {
+ $aux = array();
+ $aux[0] = $this->_info['iptc'][$label];
+ $this->_info['iptc'][$label] = $aux;
+ }
+ $this->_info['iptc'][$label][ count($this->_info['iptc'][$label]) ] = $this->_getFixedString($data, $pos, $length);
+ }
+ else {
+ $this->_info['iptc'][$label] = $this->_getFixedString($data, $pos, $length);
+ }
+ }
+
+ $pos = $basePos + $length; // No padding
+ }
+ return $pos;
+ }
+
+ /*************************************************************/
+ function & _createMarkerAdobe()
+ {
+ if (isset($this->_info['iptc'])) {
+ if (!isset($this->_info['adobe'])) {
+ $this->_info['adobe'] = array();
+ }
+ if (!isset($this->_info['adobe']['raw'])) {
+ $this->_info['adobe']['raw'] = array();
+ }
+ if (!isset($this->_info['adobe']['raw']['8BIM_0x0404'])) {
+ $this->_info['adobe']['raw']['8BIM_0x0404'] = array();
+ }
+ $this->_info['adobe']['raw']['8BIM_0x0404']['type'] = 0x0404;
+ $this->_info['adobe']['raw']['8BIM_0x0404']['header'] = "Caption";
+ $this->_info['adobe']['raw']['8BIM_0x0404']['data'] =& $this->_writeIPTC();
+ }
+
+ if (isset($this->_info['adobe']['raw']) && (count($this->_info['adobe']['raw']) > 0)) {
+ $data = "Photoshop 3.0\0";
+ $pos = 14;
+
+ reset($this->_info['adobe']['raw']);
+ while (list($key) = each($this->_info['adobe']['raw'])) {
+ $pos = $this->_write8BIM(
+ $data,
+ $pos,
+ $this->_info['adobe']['raw'][$key]['type'],
+ $this->_info['adobe']['raw'][$key]['header'],
+ $this->_info['adobe']['raw'][$key]['data'] );
+ }
+ }
+
+ return $data;
+ }
+
+ /*************************************************************/
+ function _write8BIM(&$data, $pos, $type, $header, &$value)
+ {
+ $signature = "8BIM";
+
+ $pos = $this->_putString($data, $pos, $signature);
+ $pos = $this->_putShort($data, $pos, $type);
+
+ $len = strlen($header);
+
+ $pos = $this->_putByte($data, $pos, $len);
+ $pos = $this->_putString($data, $pos, $header);
+ if (($len % 2) == 0) { // Even padding, including the length byte
+ $pos = $this->_putByte($data, $pos, 0);
+ }
+
+ $len = strlen($value);
+ $pos = $this->_putLong($data, $pos, $len);
+ $pos = $this->_putString($data, $pos, $value);
+ if (($len % 2) != 0) { // Even padding
+ $pos = $this->_putByte($data, $pos, 0);
+ }
+ return $pos;
+ }
+
+ /*************************************************************/
+ function & _writeIPTC()
+ {
+ $data = " ";
+ $pos = 0;
+
+ $IPTCNames =& $this->_iptcNameTags();
+
+ reset($this->_info['iptc']);
+
+
+ while (list($label) = each($this->_info['iptc'])) {
+ $value =& $this->_info['iptc'][$label];
+ $type = -1;
+
+ if (isset($IPTCNames[$label])) {
+ $type = $IPTCNames[$label];
+ }
+ elseif (substr($label, 0, 7) == "IPTC_0x") {
+ $type = hexdec(substr($label, 7, 2));
+ }
+
+ if ($type != -1) {
+ if (is_array($value)) {
+ for ($i = 0; $i < count($value); $i++) {
+ $pos = $this->_writeIPTCEntry($data, $pos, $type, $value[$i]);
+ }
+ }
+ else {
+ $pos = $this->_writeIPTCEntry($data, $pos, $type, $value);
+ }
+ }
+ }
+
+ return $data;
+ }
+
+ /*************************************************************/
+ function _writeIPTCEntry(&$data, $pos, $type, &$value)
+ {
+ $pos = $this->_putShort($data, $pos, 0x1C02);
+ $pos = $this->_putByte($data, $pos, $type);
+ $pos = $this->_putShort($data, $pos, strlen($value));
+ $pos = $this->_putString($data, $pos, $value);
+
+ return $pos;
+ }
+
+ /*************************************************************/
+ function _exifTagNames($mode)
+ {
+ $tags = array();
+
+ if ($mode == 'ifd0') {
+ $tags[0x010E] = 'ImageDescription';
+ $tags[0x010F] = 'Make';
+ $tags[0x0110] = 'Model';
+ $tags[0x0112] = 'Orientation';
+ $tags[0x011A] = 'XResolution';
+ $tags[0x011B] = 'YResolution';
+ $tags[0x0128] = 'ResolutionUnit';
+ $tags[0x0131] = 'Software';
+ $tags[0x0132] = 'DateTime';
+ $tags[0x013B] = 'Artist';
+ $tags[0x013E] = 'WhitePoint';
+ $tags[0x013F] = 'PrimaryChromaticities';
+ $tags[0x0211] = 'YCbCrCoefficients';
+ $tags[0x0212] = 'YCbCrSubSampling';
+ $tags[0x0213] = 'YCbCrPositioning';
+ $tags[0x0214] = 'ReferenceBlackWhite';
+ $tags[0x8298] = 'Copyright';
+ $tags[0x8769] = 'ExifIFDOffset';
+ $tags[0x8825] = 'GPSIFDOffset';
+ }
+ if ($mode == 'ifd1') {
+ $tags[0x00FE] = 'TIFFNewSubfileType';
+ $tags[0x00FF] = 'TIFFSubfileType';
+ $tags[0x0100] = 'TIFFImageWidth';
+ $tags[0x0101] = 'TIFFImageHeight';
+ $tags[0x0102] = 'TIFFBitsPerSample';
+ $tags[0x0103] = 'TIFFCompression';
+ $tags[0x0106] = 'TIFFPhotometricInterpretation';
+ $tags[0x0107] = 'TIFFThreshholding';
+ $tags[0x0108] = 'TIFFCellWidth';
+ $tags[0x0109] = 'TIFFCellLength';
+ $tags[0x010A] = 'TIFFFillOrder';
+ $tags[0x010E] = 'TIFFImageDescription';
+ $tags[0x010F] = 'TIFFMake';
+ $tags[0x0110] = 'TIFFModel';
+ $tags[0x0111] = 'TIFFStripOffsets';
+ $tags[0x0112] = 'TIFFOrientation';
+ $tags[0x0115] = 'TIFFSamplesPerPixel';
+ $tags[0x0116] = 'TIFFRowsPerStrip';
+ $tags[0x0117] = 'TIFFStripByteCounts';
+ $tags[0x0118] = 'TIFFMinSampleValue';
+ $tags[0x0119] = 'TIFFMaxSampleValue';
+ $tags[0x011A] = 'TIFFXResolution';
+ $tags[0x011B] = 'TIFFYResolution';
+ $tags[0x011C] = 'TIFFPlanarConfiguration';
+ $tags[0x0122] = 'TIFFGrayResponseUnit';
+ $tags[0x0123] = 'TIFFGrayResponseCurve';
+ $tags[0x0128] = 'TIFFResolutionUnit';
+ $tags[0x0131] = 'TIFFSoftware';
+ $tags[0x0132] = 'TIFFDateTime';
+ $tags[0x013B] = 'TIFFArtist';
+ $tags[0x013C] = 'TIFFHostComputer';
+ $tags[0x0140] = 'TIFFColorMap';
+ $tags[0x0152] = 'TIFFExtraSamples';
+ $tags[0x0201] = 'TIFFJFIFOffset';
+ $tags[0x0202] = 'TIFFJFIFLength';
+ $tags[0x0211] = 'TIFFYCbCrCoefficients';
+ $tags[0x0212] = 'TIFFYCbCrSubSampling';
+ $tags[0x0213] = 'TIFFYCbCrPositioning';
+ $tags[0x0214] = 'TIFFReferenceBlackWhite';
+ $tags[0x8298] = 'TIFFCopyright';
+ $tags[0x9286] = 'TIFFUserComment';
+ }
+ elseif ($mode == 'exif') {
+ $tags[0x829A] = 'ExposureTime';
+ $tags[0x829D] = 'FNumber';
+ $tags[0x8822] = 'ExposureProgram';
+ $tags[0x8824] = 'SpectralSensitivity';
+ $tags[0x8827] = 'ISOSpeedRatings';
+ $tags[0x8828] = 'OECF';
+ $tags[0x9000] = 'EXIFVersion';
+ $tags[0x9003] = 'DatetimeOriginal';
+ $tags[0x9004] = 'DatetimeDigitized';
+ $tags[0x9101] = 'ComponentsConfiguration';
+ $tags[0x9102] = 'CompressedBitsPerPixel';
+ $tags[0x9201] = 'ShutterSpeedValue';
+ $tags[0x9202] = 'ApertureValue';
+ $tags[0x9203] = 'BrightnessValue';
+ $tags[0x9204] = 'ExposureBiasValue';
+ $tags[0x9205] = 'MaxApertureValue';
+ $tags[0x9206] = 'SubjectDistance';
+ $tags[0x9207] = 'MeteringMode';
+ $tags[0x9208] = 'LightSource';
+ $tags[0x9209] = 'Flash';
+ $tags[0x920A] = 'FocalLength';
+ $tags[0x927C] = 'MakerNote';
+ $tags[0x9286] = 'UserComment';
+ $tags[0x9290] = 'SubSecTime';
+ $tags[0x9291] = 'SubSecTimeOriginal';
+ $tags[0x9292] = 'SubSecTimeDigitized';
+ $tags[0xA000] = 'FlashPixVersion';
+ $tags[0xA001] = 'ColorSpace';
+ $tags[0xA002] = 'PixelXDimension';
+ $tags[0xA003] = 'PixelYDimension';
+ $tags[0xA004] = 'RelatedSoundFile';
+ $tags[0xA005] = 'InteropIFDOffset';
+ $tags[0xA20B] = 'FlashEnergy';
+ $tags[0xA20C] = 'SpatialFrequencyResponse';
+ $tags[0xA20E] = 'FocalPlaneXResolution';
+ $tags[0xA20F] = 'FocalPlaneYResolution';
+ $tags[0xA210] = 'FocalPlaneResolutionUnit';
+ $tags[0xA214] = 'SubjectLocation';
+ $tags[0xA215] = 'ExposureIndex';
+ $tags[0xA217] = 'SensingMethod';
+ $tags[0xA300] = 'FileSource';
+ $tags[0xA301] = 'SceneType';
+ $tags[0xA302] = 'CFAPattern';
+ }
+ elseif ($mode == 'interop') {
+ $tags[0x0001] = 'InteroperabilityIndex';
+ $tags[0x0002] = 'InteroperabilityVersion';
+ $tags[0x1000] = 'RelatedImageFileFormat';
+ $tags[0x1001] = 'RelatedImageWidth';
+ $tags[0x1002] = 'RelatedImageLength';
+ }
+ elseif ($mode == 'gps') {
+ $tags[0x0000] = 'GPSVersionID';
+ $tags[0x0001] = 'GPSLatitudeRef';
+ $tags[0x0002] = 'GPSLatitude';
+ $tags[0x0003] = 'GPSLongitudeRef';
+ $tags[0x0004] = 'GPSLongitude';
+ $tags[0x0005] = 'GPSAltitudeRef';
+ $tags[0x0006] = 'GPSAltitude';
+ $tags[0x0007] = 'GPSTimeStamp';
+ $tags[0x0008] = 'GPSSatellites';
+ $tags[0x0009] = 'GPSStatus';
+ $tags[0x000A] = 'GPSMeasureMode';
+ $tags[0x000B] = 'GPSDOP';
+ $tags[0x000C] = 'GPSSpeedRef';
+ $tags[0x000D] = 'GPSSpeed';
+ $tags[0x000E] = 'GPSTrackRef';
+ $tags[0x000F] = 'GPSTrack';
+ $tags[0x0010] = 'GPSImgDirectionRef';
+ $tags[0x0011] = 'GPSImgDirection';
+ $tags[0x0012] = 'GPSMapDatum';
+ $tags[0x0013] = 'GPSDestLatitudeRef';
+ $tags[0x0014] = 'GPSDestLatitude';
+ $tags[0x0015] = 'GPSDestLongitudeRef';
+ $tags[0x0016] = 'GPSDestLongitude';
+ $tags[0x0017] = 'GPSDestBearingRef';
+ $tags[0x0018] = 'GPSDestBearing';
+ $tags[0x0019] = 'GPSDestDistanceRef';
+ $tags[0x001A] = 'GPSDestDistance';
+ }
+
+ return $tags;
+ }
+
+ /*************************************************************/
+ function _exifTagTypes($mode)
+ {
+ $tags = array();
+
+ if ($mode == 'ifd0') {
+ $tags[0x010E] = array(2, 0); // ImageDescription -> ASCII, Any
+ $tags[0x010F] = array(2, 0); // Make -> ASCII, Any
+ $tags[0x0110] = array(2, 0); // Model -> ASCII, Any
+ $tags[0x0112] = array(3, 1); // Orientation -> SHORT, 1
+ $tags[0x011A] = array(5, 1); // XResolution -> RATIONAL, 1
+ $tags[0x011B] = array(5, 1); // YResolution -> RATIONAL, 1
+ $tags[0x0128] = array(3, 1); // ResolutionUnit -> SHORT
+ $tags[0x0131] = array(2, 0); // Software -> ASCII, Any
+ $tags[0x0132] = array(2, 20); // DateTime -> ASCII, 20
+ $tags[0x013B] = array(2, 0); // Artist -> ASCII, Any
+ $tags[0x013E] = array(5, 2); // WhitePoint -> RATIONAL, 2
+ $tags[0x013F] = array(5, 6); // PrimaryChromaticities -> RATIONAL, 6
+ $tags[0x0211] = array(5, 3); // YCbCrCoefficients -> RATIONAL, 3
+ $tags[0x0212] = array(3, 2); // YCbCrSubSampling -> SHORT, 2
+ $tags[0x0213] = array(3, 1); // YCbCrPositioning -> SHORT, 1
+ $tags[0x0214] = array(5, 6); // ReferenceBlackWhite -> RATIONAL, 6
+ $tags[0x8298] = array(2, 0); // Copyright -> ASCII, Any
+ $tags[0x8769] = array(4, 1); // ExifIFDOffset -> LONG, 1
+ $tags[0x8825] = array(4, 1); // GPSIFDOffset -> LONG, 1
+ }
+ if ($mode == 'ifd1') {
+ $tags[0x00FE] = array(4, 1); // TIFFNewSubfileType -> LONG, 1
+ $tags[0x00FF] = array(3, 1); // TIFFSubfileType -> SHORT, 1
+ $tags[0x0100] = array(4, 1); // TIFFImageWidth -> LONG (or SHORT), 1
+ $tags[0x0101] = array(4, 1); // TIFFImageHeight -> LONG (or SHORT), 1
+ $tags[0x0102] = array(3, 3); // TIFFBitsPerSample -> SHORT, 3
+ $tags[0x0103] = array(3, 1); // TIFFCompression -> SHORT, 1
+ $tags[0x0106] = array(3, 1); // TIFFPhotometricInterpretation -> SHORT, 1
+ $tags[0x0107] = array(3, 1); // TIFFThreshholding -> SHORT, 1
+ $tags[0x0108] = array(3, 1); // TIFFCellWidth -> SHORT, 1
+ $tags[0x0109] = array(3, 1); // TIFFCellLength -> SHORT, 1
+ $tags[0x010A] = array(3, 1); // TIFFFillOrder -> SHORT, 1
+ $tags[0x010E] = array(2, 0); // TIFFImageDescription -> ASCII, Any
+ $tags[0x010F] = array(2, 0); // TIFFMake -> ASCII, Any
+ $tags[0x0110] = array(2, 0); // TIFFModel -> ASCII, Any
+ $tags[0x0111] = array(4, 0); // TIFFStripOffsets -> LONG (or SHORT), Any (one per strip)
+ $tags[0x0112] = array(3, 1); // TIFFOrientation -> SHORT, 1
+ $tags[0x0115] = array(3, 1); // TIFFSamplesPerPixel -> SHORT, 1
+ $tags[0x0116] = array(4, 1); // TIFFRowsPerStrip -> LONG (or SHORT), 1
+ $tags[0x0117] = array(4, 0); // TIFFStripByteCounts -> LONG (or SHORT), Any (one per strip)
+ $tags[0x0118] = array(3, 0); // TIFFMinSampleValue -> SHORT, Any (SamplesPerPixel)
+ $tags[0x0119] = array(3, 0); // TIFFMaxSampleValue -> SHORT, Any (SamplesPerPixel)
+ $tags[0x011A] = array(5, 1); // TIFFXResolution -> RATIONAL, 1
+ $tags[0x011B] = array(5, 1); // TIFFYResolution -> RATIONAL, 1
+ $tags[0x011C] = array(3, 1); // TIFFPlanarConfiguration -> SHORT, 1
+ $tags[0x0122] = array(3, 1); // TIFFGrayResponseUnit -> SHORT, 1
+ $tags[0x0123] = array(3, 0); // TIFFGrayResponseCurve -> SHORT, Any (2^BitsPerSample)
+ $tags[0x0128] = array(3, 1); // TIFFResolutionUnit -> SHORT, 1
+ $tags[0x0131] = array(2, 0); // TIFFSoftware -> ASCII, Any
+ $tags[0x0132] = array(2, 20); // TIFFDateTime -> ASCII, 20
+ $tags[0x013B] = array(2, 0); // TIFFArtist -> ASCII, Any
+ $tags[0x013C] = array(2, 0); // TIFFHostComputer -> ASCII, Any
+ $tags[0x0140] = array(3, 0); // TIFFColorMap -> SHORT, Any (3 * 2^BitsPerSample)
+ $tags[0x0152] = array(3, 0); // TIFFExtraSamples -> SHORT, Any (SamplesPerPixel - 3)
+ $tags[0x0201] = array(4, 1); // TIFFJFIFOffset -> LONG, 1
+ $tags[0x0202] = array(4, 1); // TIFFJFIFLength -> LONG, 1
+ $tags[0x0211] = array(5, 3); // TIFFYCbCrCoefficients -> RATIONAL, 3
+ $tags[0x0212] = array(3, 2); // TIFFYCbCrSubSampling -> SHORT, 2
+ $tags[0x0213] = array(3, 1); // TIFFYCbCrPositioning -> SHORT, 1
+ $tags[0x0214] = array(5, 6); // TIFFReferenceBlackWhite -> RATIONAL, 6
+ $tags[0x8298] = array(2, 0); // TIFFCopyright -> ASCII, Any
+ $tags[0x9286] = array(2, 0); // TIFFUserComment -> ASCII, Any
+ }
+ elseif ($mode == 'exif') {
+ $tags[0x829A] = array(5, 1); // ExposureTime -> RATIONAL, 1
+ $tags[0x829D] = array(5, 1); // FNumber -> RATIONAL, 1
+ $tags[0x8822] = array(3, 1); // ExposureProgram -> SHORT, 1
+ $tags[0x8824] = array(2, 0); // SpectralSensitivity -> ASCII, Any
+ $tags[0x8827] = array(3, 0); // ISOSpeedRatings -> SHORT, Any
+ $tags[0x8828] = array(7, 0); // OECF -> UNDEFINED, Any
+ $tags[0x9000] = array(7, 4); // EXIFVersion -> UNDEFINED, 4
+ $tags[0x9003] = array(2, 20); // DatetimeOriginal -> ASCII, 20
+ $tags[0x9004] = array(2, 20); // DatetimeDigitized -> ASCII, 20
+ $tags[0x9101] = array(7, 4); // ComponentsConfiguration -> UNDEFINED, 4
+ $tags[0x9102] = array(5, 1); // CompressedBitsPerPixel -> RATIONAL, 1
+ $tags[0x9201] = array(10, 1); // ShutterSpeedValue -> SRATIONAL, 1
+ $tags[0x9202] = array(5, 1); // ApertureValue -> RATIONAL, 1
+ $tags[0x9203] = array(10, 1); // BrightnessValue -> SRATIONAL, 1
+ $tags[0x9204] = array(10, 1); // ExposureBiasValue -> SRATIONAL, 1
+ $tags[0x9205] = array(5, 1); // MaxApertureValue -> RATIONAL, 1
+ $tags[0x9206] = array(5, 1); // SubjectDistance -> RATIONAL, 1
+ $tags[0x9207] = array(3, 1); // MeteringMode -> SHORT, 1
+ $tags[0x9208] = array(3, 1); // LightSource -> SHORT, 1
+ $tags[0x9209] = array(3, 1); // Flash -> SHORT, 1
+ $tags[0x920A] = array(5, 1); // FocalLength -> RATIONAL, 1
+ $tags[0x927C] = array(7, 0); // MakerNote -> UNDEFINED, Any
+ $tags[0x9286] = array(7, 0); // UserComment -> UNDEFINED, Any
+ $tags[0x9290] = array(2, 0); // SubSecTime -> ASCII, Any
+ $tags[0x9291] = array(2, 0); // SubSecTimeOriginal -> ASCII, Any
+ $tags[0x9292] = array(2, 0); // SubSecTimeDigitized -> ASCII, Any
+ $tags[0xA000] = array(7, 4); // FlashPixVersion -> UNDEFINED, 4
+ $tags[0xA001] = array(3, 1); // ColorSpace -> SHORT, 1
+ $tags[0xA002] = array(4, 1); // PixelXDimension -> LONG (or SHORT), 1
+ $tags[0xA003] = array(4, 1); // PixelYDimension -> LONG (or SHORT), 1
+ $tags[0xA004] = array(2, 13); // RelatedSoundFile -> ASCII, 13
+ $tags[0xA005] = array(4, 1); // InteropIFDOffset -> LONG, 1
+ $tags[0xA20B] = array(5, 1); // FlashEnergy -> RATIONAL, 1
+ $tags[0xA20C] = array(7, 0); // SpatialFrequencyResponse -> UNDEFINED, Any
+ $tags[0xA20E] = array(5, 1); // FocalPlaneXResolution -> RATIONAL, 1
+ $tags[0xA20F] = array(5, 1); // FocalPlaneYResolution -> RATIONAL, 1
+ $tags[0xA210] = array(3, 1); // FocalPlaneResolutionUnit -> SHORT, 1
+ $tags[0xA214] = array(3, 2); // SubjectLocation -> SHORT, 2
+ $tags[0xA215] = array(5, 1); // ExposureIndex -> RATIONAL, 1
+ $tags[0xA217] = array(3, 1); // SensingMethod -> SHORT, 1
+ $tags[0xA300] = array(7, 1); // FileSource -> UNDEFINED, 1
+ $tags[0xA301] = array(7, 1); // SceneType -> UNDEFINED, 1
+ $tags[0xA302] = array(7, 0); // CFAPattern -> UNDEFINED, Any
+ }
+ elseif ($mode == 'interop') {
+ $tags[0x0001] = array(2, 0); // InteroperabilityIndex -> ASCII, Any
+ $tags[0x0002] = array(7, 4); // InteroperabilityVersion -> UNKNOWN, 4
+ $tags[0x1000] = array(2, 0); // RelatedImageFileFormat -> ASCII, Any
+ $tags[0x1001] = array(4, 1); // RelatedImageWidth -> LONG (or SHORT), 1
+ $tags[0x1002] = array(4, 1); // RelatedImageLength -> LONG (or SHORT), 1
+ }
+ elseif ($mode == 'gps') {
+ $tags[0x0000] = array(1, 4); // GPSVersionID -> BYTE, 4
+ $tags[0x0001] = array(2, 2); // GPSLatitudeRef -> ASCII, 2
+ $tags[0x0002] = array(5, 3); // GPSLatitude -> RATIONAL, 3
+ $tags[0x0003] = array(2, 2); // GPSLongitudeRef -> ASCII, 2
+ $tags[0x0004] = array(5, 3); // GPSLongitude -> RATIONAL, 3
+ $tags[0x0005] = array(2, 2); // GPSAltitudeRef -> ASCII, 2
+ $tags[0x0006] = array(5, 1); // GPSAltitude -> RATIONAL, 1
+ $tags[0x0007] = array(5, 3); // GPSTimeStamp -> RATIONAL, 3
+ $tags[0x0008] = array(2, 0); // GPSSatellites -> ASCII, Any
+ $tags[0x0009] = array(2, 2); // GPSStatus -> ASCII, 2
+ $tags[0x000A] = array(2, 2); // GPSMeasureMode -> ASCII, 2
+ $tags[0x000B] = array(5, 1); // GPSDOP -> RATIONAL, 1
+ $tags[0x000C] = array(2, 2); // GPSSpeedRef -> ASCII, 2
+ $tags[0x000D] = array(5, 1); // GPSSpeed -> RATIONAL, 1
+ $tags[0x000E] = array(2, 2); // GPSTrackRef -> ASCII, 2
+ $tags[0x000F] = array(5, 1); // GPSTrack -> RATIONAL, 1
+ $tags[0x0010] = array(2, 2); // GPSImgDirectionRef -> ASCII, 2
+ $tags[0x0011] = array(5, 1); // GPSImgDirection -> RATIONAL, 1
+ $tags[0x0012] = array(2, 0); // GPSMapDatum -> ASCII, Any
+ $tags[0x0013] = array(2, 2); // GPSDestLatitudeRef -> ASCII, 2
+ $tags[0x0014] = array(5, 3); // GPSDestLatitude -> RATIONAL, 3
+ $tags[0x0015] = array(2, 2); // GPSDestLongitudeRef -> ASCII, 2
+ $tags[0x0016] = array(5, 3); // GPSDestLongitude -> RATIONAL, 3
+ $tags[0x0017] = array(2, 2); // GPSDestBearingRef -> ASCII, 2
+ $tags[0x0018] = array(5, 1); // GPSDestBearing -> RATIONAL, 1
+ $tags[0x0019] = array(2, 2); // GPSDestDistanceRef -> ASCII, 2
+ $tags[0x001A] = array(5, 1); // GPSDestDistance -> RATIONAL, 1
+ }
+
+ return $tags;
+ }
+
+ /*************************************************************/
+ function _exifNameTags($mode)
+ {
+ $tags = $this->_exifTagNames($mode);
+ return $this->_names2Tags($tags);
+ }
+
+ /*************************************************************/
+ function _iptcTagNames()
+ {
+ $tags = array();
+ $tags[0x14] = 'SuplementalCategories';
+ $tags[0x19] = 'Keywords';
+ $tags[0x78] = 'Caption';
+ $tags[0x7A] = 'CaptionWriter';
+ $tags[0x69] = 'Headline';
+ $tags[0x28] = 'SpecialInstructions';
+ $tags[0x0F] = 'Category';
+ $tags[0x50] = 'Byline';
+ $tags[0x55] = 'BylineTitle';
+ $tags[0x6E] = 'Credit';
+ $tags[0x73] = 'Source';
+ $tags[0x74] = 'CopyrightNotice';
+ $tags[0x05] = 'ObjectName';
+ $tags[0x5A] = 'City';
+ $tags[0x5C] = 'Sublocation';
+ $tags[0x5F] = 'ProvinceState';
+ $tags[0x65] = 'CountryName';
+ $tags[0x67] = 'OriginalTransmissionReference';
+ $tags[0x37] = 'DateCreated';
+ $tags[0x0A] = 'CopyrightFlag';
+
+ return $tags;
+ }
+
+ /*************************************************************/
+ function & _iptcNameTags()
+ {
+ $tags = $this->_iptcTagNames();
+ return $this->_names2Tags($tags);
+ }
+
+ /*************************************************************/
+ function _names2Tags($tags2Names)
+ {
+ $names2Tags = array();
+ reset($tags2Names);
+ while (list($tag, $name) = each($tags2Names)) {
+ $names2Tags[$name] = $tag;
+ }
+
+ return $names2Tags;
+ }
+
+ /*************************************************************/
+ function _getByte(&$data, $pos)
+ {
+ return ord($data{$pos});
+ }
+
+ /*************************************************************/
+ function _putByte(&$data, $pos, $val)
+ {
+ $val = intval($val);
+
+ $data{$pos} = chr($val);
+
+ return $pos + 1;
+ }
+
+ /*************************************************************/
+ function _getShort(&$data, $pos, $bigEndian = true)
+ {
+ if ($bigEndian) {
+ return (ord($data{$pos}) << 8)
+ + ord($data{$pos + 1});
+ }
+ else {
+ return ord($data{$pos})
+ + (ord($data{$pos + 1}) << 8);
+ }
+ }
+
+ /*************************************************************/
+ function _putShort(&$data, $pos = 0, $val, $bigEndian = true)
+ {
+ $val = intval($val);
+
+ if ($bigEndian) {
+ $data{$pos + 0} = chr(($val & 0x0000FF00) >> 8);
+ $data{$pos + 1} = chr(($val & 0x000000FF) >> 0);
+ }
+ else {
+ $data{$pos + 0} = chr(($val & 0x00FF) >> 0);
+ $data{$pos + 1} = chr(($val & 0xFF00) >> 8);
+ }
+
+ return $pos + 2;
+ }
+
+ /*************************************************************/
+ function _getLong(&$data, $pos, $bigEndian = true)
+ {
+ if ($bigEndian) {
+ return (ord($data{$pos}) << 24)
+ + (ord($data{$pos + 1}) << 16)
+ + (ord($data{$pos + 2}) << 8)
+ + ord($data{$pos + 3});
+ }
+ else {
+ return ord($data{$pos})
+ + (ord($data{$pos + 1}) << 8)
+ + (ord($data{$pos + 2}) << 16)
+ + (ord($data{$pos + 3}) << 24);
+ }
+ }
+
+ /*************************************************************/
+ function _putLong(&$data, $pos, $val, $bigEndian = true)
+ {
+ $val = intval($val);
+
+ if ($bigEndian) {
+ $data{$pos + 0} = chr(($val & 0xFF000000) >> 24);
+ $data{$pos + 1} = chr(($val & 0x00FF0000) >> 16);
+ $data{$pos + 2} = chr(($val & 0x0000FF00) >> 8);
+ $data{$pos + 3} = chr(($val & 0x000000FF) >> 0);
+ }
+ else {
+ $data{$pos + 0} = chr(($val & 0x000000FF) >> 0);
+ $data{$pos + 1} = chr(($val & 0x0000FF00) >> 8);
+ $data{$pos + 2} = chr(($val & 0x00FF0000) >> 16);
+ $data{$pos + 3} = chr(($val & 0xFF000000) >> 24);
+ }
+
+ return $pos + 4;
+ }
+
+ /*************************************************************/
+ function & _getNullString(&$data, $pos)
+ {
+ $str = '';
+ $max = strlen($data);
+
+ while ($pos < $max) {
+ if (ord($data{$pos}) == 0) {
+ return $str;
+ }
+ else {
+ $str .= $data{$pos};
+ }
+ $pos++;
+ }
+
+ return $str;
+ }
+
+ /*************************************************************/
+ function & _getFixedString(&$data, $pos, $length = -1)
+ {
+ if ($length == -1) {
+ $length = strlen($data) - $pos;
+ }
+
+ return substr($data, $pos, $length);
+ }
+
+ /*************************************************************/
+ function _putString(&$data, $pos, &$str)
+ {
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $data{$pos + $i} = $str{$i};
+ }
+
+ return $pos + $len;
+ }
+
+ /*************************************************************/
+ function _hexDump(&$data, $start = 0, $length = -1)
+ {
+ if (($length == -1) || (($length + $start) > strlen($data))) {
+ $end = strlen($data);
+ }
+ else {
+ $end = $start + $length;
+ }
+
+ $ascii = '';
+ $count = 0;
+
+ echo "<tt>\n";
+
+ while ($start < $end) {
+ if (($count % 16) == 0) {
+ echo sprintf('%04d', $count) . ': ';
+ }
+
+ $c = ord($data{$start});
+ $count++;
+ $start++;
+
+ $aux = dechex($c);
+ if (strlen($aux) == 1)
+ echo '0';
+ echo $aux . ' ';
+
+ if ($c == 60)
+ $ascii .= '&lt;';
+ elseif ($c == 62)
+ $ascii .= '&gt;';
+ elseif ($c == 32)
+ $ascii .= '&nbsp;';
+ elseif ($c > 32)
+ $ascii .= chr($c);
+ else
+ $ascii .= '.';
+
+ if (($count % 4) == 0) {
+ echo ' - ';
+ }
+
+ if (($count % 16) == 0) {
+ echo ': ' . $ascii . "<br>\n";
+ $ascii = '';
+ }
+ }
+
+ if ($ascii != '') {
+ while (($count % 16) != 0) {
+ echo '-- ';
+ $count++;
+ if (($count % 4) == 0) {
+ echo ' - ';
+ }
+ }
+ echo ': ' . $ascii . "<br>\n";
+ }
+
+ echo "</tt>\n";
+ }
+
+/*****************************************************************/
+}
+
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+
diff --git a/mod/dokuwiki/vendors/dokuwiki/inc/SimplePie.php b/mod/dokuwiki/vendors/dokuwiki/inc/SimplePie.php
new file mode 100644
index 000000000..1c97e2384
--- /dev/null
+++ b/mod/dokuwiki/vendors/dokuwiki/inc/SimplePie.php